我正在使用restatable
来自thm-restate
包的环境thmtools
。
我还使用\listoftheorems
命令来给我一个定理列表。
然而,即使我使用了带星号的版本,我的可重述定理在定理列表中也出现了两次。我的感觉是它应该只在定理列表中出现一次。
以下是一个 mwe:
\documentclass{article}
\usepackage{thmtools}
\usepackage{thm-restate}
\declaretheorem[name=Theorem,numberwithin=section]{thm}
\begin{document}
\listoftheorems[ignoreall,show={thm}]
\section{First}
\begin{restatable}[Goldbach's conjecture]{thm}{goldbach}
\label{thm:goldbach}
Every even integer greater than 2 can be expressed as the sum of two primes.
\end{restatable}
\begin{thm}
Some other theorem
\end{thm}
Lets look at the first one again
\goldbach*
\end{document}
我尝试过使用ignoreall
密钥和仅显示thm
环境,但我猜可重置的也是如此thm
,所以这不起作用。
任何想法都值得赞赏,谢谢!
答案1
该解决方案需要对thmtools
文件进行一些定制。
将文件复制thm-listof.sty
到与文档相同的目录中并对其进行修改;无论如何,我这样做是为了重新格式化定理列表。如果您尝试覆盖序言中的格式,由于软件包使用了,因此它不起作用\AtBeginDocument
。
在此文件中,找到开始的块\addtotheorempostheadhook{%
并将其修改为:
\newif\ifdontputthminlist
\dontputthminlistfalse
\addtotheorempostheadhook{%
\ifdontputthminlist\else
\thmtlo@chaptervspacehack
\addcontentsline{loe}{\thmt@envname}{%
\csname ll@\thmt@envname\endcsname
}%
\fi
}
然后,当你重新表述你的定理时,\oldtheorem*
只需将其写成如下形式:
\dontputthminlisttrue
\oldtheorem*
\dontputthminlistfalse
如果出于其他原因您不想让某个随机定理出现在列表中,那么这种方法可能也会派上用场。如果您愿意,可以采用这种方法,但通过修改 中的代码来自动翻转标志thm-restate.sty
,但我还没有尝试过,因为这已经足够了。
答案2
有两种选择:第一种更简单的选择是将额外的代码写入文件*.loe
(定理列表的存储位置),以防止打印多余的行。这可以简单地这样实现:
\addtocontents{loe}{\protect\iffalse}
\goldbach*
\addtocontents{loe}{\protect\fi}
两个\addtocontents
命令之间的所有定理都将从定理列表中省略。
另一种选择是首先阻止重述定理将额外的\contentsline
s写入文件。但是,这可能更复杂,因为包用于使定理自动写入文件,并且此命令在您加载包时已经执行。应该可以本地重新定义钩子内部使用的 ,使其成为无操作。*.loe
thm-listof.sty
\addtotheorempostheadhook
*.loe
\addcontentsline