可重述定理和 \listoftheorem

可重述定理和 \listoftheorem

我正在使用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命令之间的所有定理都将从定理列表中省略。

另一种选择是首先阻止重述定理将额外的\contentslines写入文件。但是,这可能更复杂,因为包用于使定理自动写入文件,并且此命令在您加载包时已经执行。应该可以本地重新定义钩子内部使用的 ,使其成为无操作。*.loethm-listof.sty\addtotheorempostheadhook*.loe\addcontentsline

相关内容