![重新定义 \contentsname 时的奇怪行为](https://linux22.com/image/282118/%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%20%5Ccontentsname%20%E6%97%B6%E7%9A%84%E5%A5%87%E6%80%AA%E8%A1%8C%E4%B8%BA.png)
我正在使用amsart
课程。
我知道如何改变\contentsname
我知道如何改变(默认内容)。我们可以使用\def
或\renewcommand
。
但我想知道为什么如果我在序言中使用这些命令它不起作用?
我只能使用例如\renewcommand\contentsname{List of Abstracts}
after 来更改其值\begin{document}
。
为什么??
答案1
这是标准功能。一开始,大多数固定标签都被编码到lplain.tex
LaTeX 内核的主文件或类文件(当时称为“样式文件”)中。当欧洲用户开始使用除英语以外的其他语言的 LaTeX 时,翻译这些固定词的需求就出现了。
的第一个版本babel
修补了内核或类文件中的几个命令。当 LaTeX2e 发布时,为每个固定单词定义了一个命令,因此babel
通过更改这些命令的含义可以更轻松地连接到 LaTeX。因此,对于意大利语,很容易将其定义\contentsname
为“Indice”而不是“Contents”。
该babel
包将语言的固定标签存储在命令中\captions<language>
。对于意大利语,我们有类似
\def\captionsitalian{%
\def\prefacename{Prefazione}%
\def\refname{Riferimenti bibliografici}%
\def\abstractname{Sommario}%
\def\bibname{Bibliografia}%
\def\chaptername{Capitolo}%
...
}
当babel
从一种语言切换到另一种语言时,它会执行相应的\captions<language>
命令。第一次切换发生在\begin{document}
正在执行时。当然,如果babel
没有加载,则什么也不会发生,并使用默认的英语固定标签。
针对您的问题,您有两种策略:
\documentclass{amsart}
\renewcommand{\contentsname}{List of abstracts}
\begin{document}
没有babel
。但是,如果您的摘要之一是法语的,您可能希望使用 加载法语和英语babel
。上面的重新定义不起作用,因为执行了\captionsenglish
at \begin{document}
。以下是正确的解决方法:
\documentclass{amsart}
\usepackage[T1]{fontenc} % French wants it
\usepackage[french,english]{babel} % English is the default
\addto\captionsenglish{\renewcommand{\contentsname}{List of abstracts}}
\begin{document}
这样, 的重新定义\contentsname
就附加到了 执行的命令列表中\captionsenglish
。因此,每次加载 时babel
,都必须使用 更改固定标签\addto\captions<language>
。
答案2
正如 egreg 所说,使用 babel 会导致\renewcommand{\contentsname}{New Contents Name}
无法正常工作。如果您不想使用\addto
解决方案,我发现使用钩子是一种简单的解决方法。
\documentclass{article}
\usepackage[english]{babel}
\AtBeginDocument{\renewcommand{\contentsname}{New Contents Name}}
我刚才也遇到了同样的麻烦,并凭直觉找到了这个方法。(这是我的第一个回答(:)