addtocontents 无法与其他某些软件包配合使用

addtocontents 无法与其他某些软件包配合使用

这是一个后续问题

如何在使用包(在本例中只有 mathtools)时更改 toc dept mid 文档。

一个例子:

\documentclass[a4paper,10pt,oneside]{book}

\usepackage{mathtools}

\begin{document}

 \frontmatter          

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \setcounter{tocdepth}{3}
 \tableofcontents

 \mainmatter

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \appendix

 \addtocontents{toc}{\setcounter{tocdepth}{0}}

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

\end{document}

此示例会产生错误,并且非常奇怪地在目录中放置了一个感叹号,如您在此处所见 例子

然而,当我注释掉它时,\usepackage{mathtools}它突然又可以工作了,或者用不同的包替换它,也\usepackage[T1]{fontenc}不会产生任何错误。

但这不仅限于这个特定的包,某些其他包也引入了相同的行为(我只是采用这个包来使示例保持较小)。

答案1

除了我上面的评论之外:您必须添加一个,\protect以便该行看起来像\addtocontents{toc}{\protect\setcounter{tocdepth}{0}}。有关解释,您可以参考mathtools 包的问题(或者参见下面 egreg 的详细回答)。

答案2

当你这样做

\addtocontents{toc}{<whatever>}

<whatever>当文件中发生写入时,中的标记会完全展开.aux。因此,

\addtocontents{toc}{\setcounter{tocdepth}{0}}

.aux文件将包含

\@writefile{toc}{\global \c@tocdepth 0\relax }

(没有mathtools)。另一方面,mathtools需要calc,这会改变\setcounter工作方式,并且在运行 LaTeX 时你会得到

! Undefined control sequence.
\@calc@post@scan ...st@scan \else \def \calc@next 
                                                  {\calc@error #1}\fi \fi \f...
l.31 ...dtocontents{toc}{\setcounter{tocdepth}{0}}

问题是\setcounter变成了一个脆弱的命令。简单地忽略错误本质上会产生任意的垃圾。

无论如何,你不会想要诸如

\global \c@tocdepth 0\relax 

.toc文件中,因此应该在加载时独立地\protect在前面使用。\setcountercalc

假设您定义一个计数器,用于在运行时决定要在附录中显示哪些内容级别。

\newcounter{appendixtocdepth}
\setcounter{appendixtocdepth}{0} % choose a value

...

\addtocontents{toc}{\protect\setcounter{tocdepth}{\arabic{appendixtocdepth}}}

请注意,\arabic不应保护其免受扩展,因为您希望对数字进行评估。

如果你确定要使用的级别是 0,那么只需

\addtocontents{toc}{\protect\setcounter{tocdepth}{0}}

就足够了。无论如何,将代码合并到 中会更好\appendix。在序言中

\makeatletter
\g@addto@macro\appendix{%
  \addtocontents{toc}{\protect\setcounter{tocdepth}{0}}%
}
\makeatother

所以只要这样做\appendix就足够了。

答案3

你应该保护柜台:

\documentclass[a4paper,10pt,oneside]{book}

\usepackage{mathtools}

\begin{document}

 \frontmatter          

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \setcounter{tocdepth}{3}
 \tableofcontents

 \mainmatter

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \appendix

 \addtocontents{toc}{\protect\setcounter{tocdepth}{0}}

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

 \chapter{hello}
 \section{hello}
 \subsection{hello}
 \subsubsection{hello}

\end{document}

相关内容