我正在尝试使用\listoftheorems
中的命令thmtools
,但该类似乎存在问题amsbook
。我收到以下错误
(./foo.loe
! Undefined control sequence.
\@dottedtocline ... \hbox {$\m@th \mkern \@dotsep
mu\hbox {.}\mkern \@dotsep...
l.1 ...\numberline {1}\MakeUppercase {t}heorem}{2}
其中“foo.tex”是以下 MWE 的名称:
\documentclass{amsbook}
\usepackage[english]{babel}
\usepackage{thmtools}
\declaretheorem{theorem}
\begin{document}
\listoftheorems
\begin{theorem}
This is my favorite theorem.
\end{theorem}
\end{document}
同样的问题很久以前就被提出过这里。
在我尝试使用的原始文件“paper.tex”中\listoftheorems[ignoreall, show={theorem,definition,corollary}]
,我没有收到上述错误,但定理列表为空,并且输出pdflatex
显示
showing theorem
showing definition
showing corollary
List of Theorems
No file paper.loe.
我还不明白是什么原因导致错误只在 MWE 中出现,并且 .loe 文件只由后者生成。
编辑:至于最后一个谜团,它似乎是由以下原因引起的\usepackage{constants}
:将其添加到上面的 MWE 会导致定理列表为空(即使在下面的 Andrew Swann 修复之后)。
答案1
你只需要定义\@dotsep
,例如通过
\providecommand{\@dotsep}{5}
\documentclass{amsbook}
\makeatletter
\providecommand{\@dotsep}{5}
\makeatother
\usepackage[english]{babel}
\usepackage{thmtools}
\declaretheorem{theorem}
\begin{document}
\listoftheorems
\begin{theorem}
This is my favorite theorem.
\end{theorem}
\end{document}
或者,如果您希望样式类似于图形列表等,那么您需要进入一些内部定义来替换\@dottedtoline
,@tocline
它具有不同数量的参数:
\documentclass{amsbook}
\usepackage[english]{babel}
\usepackage{thmtools}
\makeatletter
\renewcommand\listoftheorems[1][]{%
\bgroup
\setlisttheoremstyle{#1}%
\let\listfigurename\listtheoremname
\def\contentsline##1{%
\csname thmt@contentsline@##1\endcsname{##1}%
}%
\@for\thmt@envname:=\thmt@allenvs\do{%
\@xa\protected@edef\csname l@\thmt@envname\endcsname{%
\@nx\@tocline{1}{0pt}{1.5em}{\@nx\thmt@listnumwidth}{}% %%Changed
}%
}%
\let\thref@starttoc\@starttoc
\def\@starttoc##1{\thref@starttoc{loe}}%
\@fileswfalse
\AtEndDocument{%
\if@filesw
\@ifundefined{tf@loe}{%
\expandafter\newwrite\csname tf@loe\endcsname
\immediate\openout \csname tf@loe\endcsname \jobname.loe\relax
}{}%
\fi
}%
\listoffigures
\egroup
}
\renewcommand\thmt@mklistcmd{%
\@xa\protected@edef\csname l@\thmt@envname\endcsname{%
\@nx\@tocline{1}{0pt}{1.5em}{\@nx\thmt@listnumwidth}{}% %%Changed
}%
\ifthmt@isstarred
\@xa\def\csname ll@\thmt@envname\endcsname{%
\protect\numberline{\protect\let\protect\autodot\protect\@empty}%
%% Grouping added
{\thmt@thmname
\ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi}%
}%
\else
\@xa\def\csname ll@\thmt@envname\endcsname{%
\protect\numberline{\csname the\thmt@envname\endcsname}%
%% Grouping added
{\thmt@thmname
\ifx\@empty\thmt@shortoptarg\else\protect\thmtformatoptarg{\thmt@shortoptarg}\fi}%
}%
\fi
\@xa\gdef\csname thmt@contentsline@\thmt@envname\endcsname{%
\thmt@contentslineShow
}%
}
\makeatother
\declaretheorem{theorem}
\declaretheorem[sibling=theorem]{corollary}
\begin{document}
\listoftheorems
\begin{theorem}
This is my favorite theorem.
\end{theorem}
\begin{theorem}
Another theorem.
\end{theorem}
\begin{corollary}
Something else.
\end{corollary}
\end{document}
上述代码从中复制定义thm-listof.sty
并进行标记更改。通过etoolbox
这些命令中的第一个进行修补失败。
答案2
正如我回答LaTeX 社区,你可以简单地调用\@dottedtocline
amsbook 的\@tocline
:
\makeatletter
\def\@dottedtocline#1#2#3#4#5{\@tocline{#1}{0pt}{#2}{#3}{}{#4}{#5}}
\makeatother