TeXLive 2022 与 2021 及之前版本中的 \addtocontents

TeXLive 2022 与 2021 及之前版本中的 \addtocontents

考虑以下 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 上完成。)

enter image description here

可以通过取消注释行 来修复 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/

相关内容