词汇表和自定义章节标题损坏

词汇表和自定义章节标题损坏

我有一个文档,我使用glossaries包来管理缩写词。有时,我会\gls{}在章节标题内使用命令,并且我已定义页眉以显示当前章节标题。但是,当章节标题包含命令时\gls{},这些页面的标题会呈现不正确,而是显示包中的某些代码glossaries

梅威瑟:

\documentclass[a4paper, 12pt]{report}
\usepackage[toc,xindy,nonumberlist,acronym,shortcuts]{glossaries}
\usepackage{fancyhdr}
\begin{document}
\pagestyle{plain}
\pagestyle{fancyplain}
\renewcommand{\sectionmark}[1]{\markboth{\thesection #1}{}}
\newacronym{ecg}{ECG}{electrocardiogram}
\chapter{test}
\gls{ecg} is ecg
\pagebreak
\section{\gls{ecg}}
waffle here
\end{document}

我应该指出,我是用 TL2011 编译这个的,但我也有朋友用 TL2013 测试它。

答案1

这俩用户手册glossaries常问问题小心不要使用\gls章节或节标题中的命令(以及标题)。但是,如果您使用扩展包额外词汇表,大多数相关问题可以通过使用类似\glsfmttext、或的命令来克服\glsfmtshort,而不是类似这样的命令:\glsfmtlong\glsfmtfull\gls

\documentclass{book}

\usepackage{hyperref}
\usepackage{glossaries-extra}

\makeglossaries

\setabbreviationstyle[acronym]{long-short}
\newglossaryentry{sample}{name={sample},description={an example}}
\newacronym{sa}{SA}{sample acronym}

\pagestyle{plain}

\begin{document}

\tableofcontents

\chapter{\glsfmttext{sample}}

\section{Full: \glsfmtfull{sa}}

\section{Short: \glsfmtshort{sa}}

\section{Long: \glsfmtlong{sa}}

\printglossaries

\end{document}

仅使用该glossaries包,您必须使用诸如 或 之类的命令\glsentrytext\glsentryshort它们\glsentrylong不包含任何格式化命令。

在章节标题中使用命令\gls存在以下问题:

1. 带有目录的文档

请考虑以下示例:

\documentclass{book}

\usepackage{glossaries}

\makeglossaries

\newglossaryentry{sample}{name={sample},description={an example}}

\pagestyle{plain}

\begin{document}

\tableofcontents

\chapter{\gls{sample}}

\printglossaries

\end{document}

这会导致目录页出现在条目的位置列表中sample。这不是大多数用户所期望的,而且对读者也没有帮助。

hyperref当添加时,情况会变得更糟:

\documentclass{book}

\usepackage[colorlinks]{hyperref}
\usepackage{glossaries}

\makeglossaries

\newglossaryentry{sample}{name={sample},description={an example}}

\pagestyle{plain}

\begin{document}

\tableofcontents

\chapter{\gls{sample}}

\printglossaries

\end{document}

目录中的行现在有一个嵌套链接。单词“sample”试图将两者链接到\chapter发生到词汇表中“sample”的定义。哪一个最终成为实际目标?如果我使用 ,当我使用 查看文档时,pdflatex链接将带我到,但当我使用 时,链接将带我到词汇表中的定义。如果我使用+ + ,则会发生相反的情况。\chapterokularevincelatexdvipsps2pdf

此示例中的 PDF 书签也失败,并hyperref发出警告:

Package hyperref Warning: Token not allowed in a PDF string (PDFDocEncoding):
(hyperref)                removing `\gls' on input line 20.

这是因为\gls标签非常强大,无法扩展为简单的字符串,因此命令\gls将被丢弃,书签中只显示标签。在这种情况下,标签与文本相同,但情况并非一定如此。

现在改变示例以便它定义首字母缩略词:

\documentclass{book}

\usepackage{glossaries}

\makeglossaries

\newacronym{sa}{SA}{sample acronym}

\pagestyle{plain}

\begin{document}

\tableofcontents

\chapter{\gls{sa}}

\printglossaries

\end{document}

此处“首次使用”出现在目录中,因此目录中的内容\gls{sa}被扩展为完整形式,但现在使用缩写形式。您可以通过添加after\chapter{\gls{sa}}来解决这个问题,但如果在目录之后但在 之前使用首字母缩略词,则可能会出现不一致的情况。例如:\glsresetall\tableofcontents\chapter{\gls{sa}}

\documentclass{book}

\usepackage{glossaries}

\makeglossaries

\newacronym{sa}{SA}{sample acronym}

\pagestyle{plain}

\begin{document}

\tableofcontents
\glsresetall

\chapter{Sample}

\gls{sa}

\chapter{\gls{sa}}

\printglossaries

\end{document}

现在目录使用完整格式,但实际章节使用缩写格式。虽然您可以使用可选参数为目录指定备用章节标题\chapter,但这种差异看起来有点奇怪,因为可选参数通常用于提供长章节标题的缩写版本。

2. 带标题的文档

你的问题就是这种情况。v4.10 中的一项更改glossaries使它在这种情况下工作得更好一些,但仍有失败的情况。

首先考虑这个例子:

\documentclass{book}

\usepackage{lipsum}% dummy text
\usepackage{glossaries}

\makeglossaries

\newacronym{sa}{SA}{sample acronym}

\renewcommand*{\chaptermark}[1]{\markboth{\chaptername\ \thechapter}{#1}}

\begin{document}

\tableofcontents
\glsresetall

\chapter{\gls{sa}}

\lipsum[1-20]

\printglossaries

\end{document}

现在,此功能适用于 v4.10,但由于首字母缩略词已被使用,因此标题使用缩写形式,因此标题与章节标题和目录中的相应行不一致。此外,此条目的位置列表现在是:1、3、5、7。第一页是目录中的引用,第 5 页和第 7 页由标题中的引用引起。虽然一位作者可能想隐藏位置列表,但另一位作者可能不想,并且可能会对位置列表为何有这么多条目感到困惑。

\MakeUppercase但是,即使使用 v4.10 ,在标题中使用时也会出现问题(默认情况下会出现):

\documentclass{book}

\usepackage{lipsum}% dummy text
\usepackage{glossaries}

\makeglossaries

\newglossaryentry{sample}{name={sample},description={an example}}

\renewcommand*{\chaptermark}[1]{%
 \markboth
  {\MakeUppercase{\chaptername\ \thechapter}}
  {\MakeUppercase{#1}}}

\begin{document}

\tableofcontents

\chapter{\gls{sample}}

\lipsum[1-20]

\printglossaries

\end{document}

对于 v4.10,这现在会导致错误:

! Package glossaries Error: Glossary entry `SAMPLE' has not been defined.

这是因为\MakeUppercase在 TeX 的原始操作中将标签转换为大写\mark。此问题并不罕见glossaries,在其他情况下也会发生。例如:

\documentclass{book}

\usepackage{lipsum}
\usepackage{hyperref}

\begin{document}
\chapter{Sample}\label{ch:sample}

\lipsum

\chapter{Following on from \ref{ch:sample}}

\lipsum

\end{document}

这会导致警告:

LaTeX Warning: Reference `CH:SAMPLE' on page 4 undefined on input line 15.

并且引用将显示为??

概括

只需glossaries(无需glossaries-extra),避免所有这些问题的唯一方法是使用可扩展命令,而不是强大的\gls。例如,\glsentrytext对于常规条目和 之一\glsentrylong\glsentryshort\glsentryfull对于首字母缩略词。例如:

\documentclass{book}

\usepackage{lipsum}% dummy text
\usepackage{glossaries}

\makeglossaries

\newglossaryentry{sample}{name={sample},description={an example}}
\newacronym{sa}{SA}{sample acronym}

\renewcommand*{\chaptermark}[1]{%
 \markboth
  {\MakeUppercase{\chaptername\ \thechapter}}
  {\MakeUppercase{#1}}}

\begin{document}

\tableofcontents

\chapter{\glsentrytext{sample}}

\lipsum[1-20]

\chapter{\glsentryfull{sa}}

\lipsum[21-40]

\printglossaries

\end{document}

这适用于 ,\MakeUppercase因为现在扩展是在 内部应用大小写更改之前执行的\mark。章节标题、页眉和目录条目之间也没有差异,如果与 一起使用hyperref,则适用于 PDF 书签,不会导致嵌套链接。

如果您只是因为输入量太大而不愿意使用这些命令,请记住您可以定义自己的快捷命令来代替它们。例如:

\newcommand*{\gtxt}{\glsentrytext}
\newcommand*{\glng}{\glsentrylong}
\newcommand*{\gsht}{\glsentryshort}

或者,如果您的编辑器提供了该功能,请设置一些映射。

相关内容