amsbook + thmtools 问题

amsbook + thmtools 问题

我正在尝试使用\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 社区,你可以简单地调用\@dottedtoclineamsbook 的\@tocline

\makeatletter
\def\@dottedtocline#1#2#3#4#5{\@tocline{#1}{0pt}{#2}{#3}{}{#4}{#5}}
\makeatother

相关内容