我现在希望定义如下的引理环境 1.引理的编号只有1个阿拉伯数字; 2.引理的编号随着定理、章节编号的增加自动清零; 3.当两个定理之间的引理只有1个的时候不编号,2个及以上的编号。 具体例子可以按如下情形 ``` 定理…… 引理 定理…… 引理1 引理2 定理 引理1 引理2 引理3 …… ``` 我现在的情况是可以使用amsmath宏包的\numberwithin实现2的功能,但是同时1就不能实现。 所以应该怎样设置计数器实现这样的需求?

2 回答2

0
前面两个都比较常规, 第三个, 常规判断肯定不行, 要定义新的环境.
0
需要编译两次。很难简短解释。 ```tex \documentclass{article} \usepackage{amsthm} \usepackage{etoolbox} % 定义 theorem 环境 \newtheorem{theorem}{Theorem} \counterwithin*{theorem}{section} \makeatletter % 定义供用户使用的 lemma 环境 \newenvironment{lemma}[1][]{% \stepcounter{lemma}% % 把命令名储存在 \@tempa 中 % - 为保证命名唯一,此处使用 lem@sec@thm % - 使用 而非 ,是为了应对有附录的情况 \edef\@tempa{lem@sec\thesection @thm\the\c@theorem}% % 如果这是 theorem 后的第二个 lemma 环境,那么向 aux 文件写入信息, % 相当于写入了 \global\let\lem@sec@thm=\@empty \ifnum\the\c@lemma=2\relax \immediate\write\@auxout {\string\global\string\cslet{\@tempa}\string\@empty}% \fi % 如果 \lem@sec@thm == \@empty,那么有至少两个引理,使用编号的引理环境; % 否则使用不编号的 \expandafter\ifx\csname \@tempa\endcsname\@empty \def\@lem@envname{lemma@numbered}% \else \def\@lem@envname{lemma@unnumbered}% \fi \csname\@lem@envname\endcsname[#1] }{% \csname end\@lem@envname\endcsname } % 定义计数器 lemma,记录每个 themrem 后 lemma 环境的数量 \newcounter{lemma}[theorem] % 定义内部引理环境 \newtheorem{lemma@numbered}{Lemma} % 编号的 \newtheorem*{lemma@unnumbered}{Lemma} % 不编号的 \counterwithin*{lemma@numbered}{theorem} % 测试用命令 \def\test@unnumbered{ \begin{theorem} content \end{theorem} \begin{lemma} content \end{lemma} } \def\test@numbered{ \begin{theorem} content \end{theorem} \begin{lemma} content \end{lemma} \begin{lemma} content \end{lemma} } \def\testA{\section{title} \test@unnumbered \test@numbered} \def\testB{\section{title} \test@numbered \test@unnumbered} \makeatother \begin{document} \testA \testB \appendix \testA \testB \end{document} ``` ![](https://pics.latexstudio.net/data/images/202001/948ecc045299ecf.png)
  • 回复 undefined :修改了代码实现,修复 aux 中命令名不唯一的 bug,增加注释。 – 论坛 github.com/CTeX 2020-01-10 05:47 回复
  • 回复 undefined :「单用amsmath 宏包这个定理格式都差不多调好」amsmath 宏包没有修改和提供任何和定理环境有关的样式或功能,你可能哪里理解错了。 – 论坛 github.com/CTeX 2020-01-10 04:57 回复
  • 回复 undefined :哦哦,这样谢谢。主要是这个ctex类下,单用amsmath 宏包这个定理格式都差不多调好,但是用了amsthm感觉就得重头再来。我再网上找找看amsthm怎么把格式定义的和 – 187****7292 2020-01-09 16:51 回复
  • 回复 undefined :你说的是哪个 lemma?我的回答中,只有 "\newtheorem*{@lemma*}{Lemma}" 这一行,即加星号的 \newtheorem* – 论坛 github.com/CTeX 2020-01-09 00:02 回复
  • 回复 undefined :对了,您说的lemma的定义依赖amsthm包。能把全文的lemma改成mylemmahappyhhh吧。我试了一下仿佛没出问题,这个lemma应该就是个计数器? – 187****7292 2020-01-08 17:15 回复
  • 回复 undefined :谢谢您提供的知识更新。 – 187****7292 2020-01-08 16:33 回复
  • 回复 undefined : 刘海洋的书是 2013 年出版的,在书出版(实际是定稿)之后,xecjk 和 amsthm 的代码都有改动,现在已经不冲突了。可能的 xecjk 的相关改动是 https – 论坛 github.com/CTeX 2020-01-08 04:58 回复
  • 回复 undefined :如果这个lemma 的定义可以直接搬到amsmath就好了。 – 187****7292 2020-01-07 21:16 回复
  • 回复 undefined :刘海洋的书,P108 2.2.4定理类环境:在使用xelatex时,amsthm 必须在fontspec宏包之前载入,而由于ctex文档类中的xeCJK宏包会自动调用fon – 187****7292 2020-01-07 21:15 回复
  • 回复 undefined :1. 就我目前的了解,amsthm 和 ctex 应该无冲突 2. 整个实现中,只有 @lemma* 环境的定义依赖 amsthm 宏包。所有定理包应该都有定义无编号定理的 – 论坛 github.com/CTeX 2020-01-06 02:49 回复
  • 回复 undefined :你从哪看到的amsthm和ctex宏集冲突? – sikouhjw 2020-01-05 18:25 回复
  • 您用的这个宏定义方式是(部分)依赖amsthm宏包吗?据说这个宏包和ctex宏集有冲突,我担心没办法转到中文环境中使用。 – 187****7292 2020-01-05 17:56 回复

你的回答

请登录后回答

你的回答将会帮助更多人,请务必认真回答问题。