考虑以下 MWE,特别是与目录有关的行:
\documentclass[12pt]{report}
\begin{document}
\tableofcontents
\addtocontents{toc}{\protect\contentsline{chapter}{SomethingA}{SomethingB}}
% uncommenting the following makes the output of TeXLive 2022
% match the output of previous versions:
% \addtocontents{toc}{{}}
% The following is there just to create some content for the ToC.
%
\chapter{INTRODUCTION}
Here is some text.
\section{A new look}
And here are more words.
\chapter{HERE WE GO}
Here is some text.
\section{A second look}
And here are more words.
\end{document}
以下是输出。请注意,它取决于 TeXLive 的版本。(所有编译均在 OverLeaf 上完成。)
可以通过取消注释行 来修复 TeXLive 2022 的输出\addtocontents{toc}{{}}
,如下所示。该行似乎对 TeXLive 2021(及之前的版本)的输出没有任何影响。
问题
为什么会发生这种情况?没错,事实证明这很容易修复,但这种行为令人不安地难以预测。TeXLive 2022 在处理方式上引入的任何变化还会造成什么混乱\addtocontents
?
答案1
自 2020 年 10 月起,LaTeX 内核定义了\contentsline
四个参数。这是在LaTeX 新闻第 32 期:
添加了第四个空参数
\contentsline
LaTeX 将 带有三个参数的命令
\addcontentsline
写入和类似文件。\contentsline
.toc
超链接重新定义\addcontentsline
为写入第四个参数。此更改通过写入额外的空括号组来统一参数的数量。 (github 问题 370)
Github 问题(由 Ulrike Fischer 撰写)更清楚地描述了这一变化的原因:
这会改变 addcontentsline 以便它总是写入 4 个参数,以提高与 hyperref 的兼容性。
虽然在 2020 年 10 月,编写语句的代码添加了额外的参数\contentline
,但第四个参数实际上不是\contentsline
其本身的一部分/由其解析,因此仍然可以完全省略。当它作为空括号组包含时,{}
它会被丢弃,这是代码中任何地方的空括号组的正常行为。此行为在2021 年 11 月发布:
拿起所有论点
\contentsline
\contentsline
文件中的命令总是.toc
后跟四个参数,最后一个参数为空,除非使用超链接包。\contentsline
命令本身只使用前三个参数,并且依赖于第四个参数为空(因此不会造成任何损害)。但这种假设并不总是正确的:例如,如果您最初决定加载超链接但后来你从序言中删除了这个加载。所以现在所有四个参数都被拾取了,第四个参数被保存起来,以便它可以用来超链接。 (github 问题 633)
因此,从此版本开始,第四个参数是强制性的。
这意味着在当前版本的 LaTeX 中您的手动目录输入应该如下:
\addtocontents{toc}{\protect\contentsline{chapter}{SomethingA}{SomethingB}{}}
有关其他更改,请参阅 LaTeX 新闻概述https://www.latex-project.org/news/latex2e-news/。