我有一个文档,我使用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
链接将带我到,但当我使用 时,链接将带我到词汇表中的定义。如果我使用+ + ,则会发生相反的情况。\chapter
okular
evince
latex
dvips
ps2pdf
此示例中的 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}
或者,如果您的编辑器提供了该功能,请设置一些映射。