重新定义 \contentsname 时的奇怪行为

重新定义 \contentsname 时的奇怪行为

我正在使用amsart课程。

我知道如何改变\contentsname我知道如何改变(默认内容)。我们可以使用\def\renewcommand

但我想知道为什么如果我在序言中使用这些命令它不起作用?

我只能使用例如\renewcommand\contentsname{List of Abstracts}after 来更改其值\begin{document}

为什么??

答案1

这是标准功能。一开始,大多数固定标签都被编码到lplain.texLaTeX 内核的主文件或类文件(当时称为“样式文件”)中。当欧洲用户开始使用除英语以外的其他语言的 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。上面的重新定义不起作用,因为执行了\captionsenglishat \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}}

我刚才也遇到了同样的麻烦,并凭直觉找到了这个方法。(这是我的第一个回答(:)

相关内容