LaTeX
许多技术文档使用一般人群不熟悉的术语或缩写。为了让这些文档更加易懂,通常会添加一个术语表。
glossaries
包可用于创建术语表。它支持多个术语表、缩写和符号。此包替代了 glossary
包,并且可以用来代替 nomencl
包。[1] 需要更简单解决方案的用户,可以考虑通过使用 description
环境,或 tabu
包提供的 longtabu
环境来手动编码条目。
快速入门
在文档的前言中添加以下内容来启用术语表功能:
\usepackage{glossaries}
\makeglossaries
然后在前言中(推荐)或在文档的首次使用之前定义任意数量的 \newglossaryentry
和 \newacronym
术语和缩写条目。最后,在文档中适当的位置添加 \printglossaries
命令来显示术语表列表。接着,使用 \gls{mylabel}
宏(以及类似宏)在文中插入预定义的术语,并同时构建相关的术语表。文件处理时,必须调用 makeglossaries document_name_without_extension
,然后至少执行一次 latex 或 pdflatex。
使用 glossaries 包
要使用 glossaries
包,必须显式加载它:
\usepackage{glossaries}
如果希望在索引阶段使用 xindy
(更高级的索引工具[2]),而不是默认的 makeindex
,需要指定 xindy
选项:
\usepackage[xindy]{glossaries}
如果希望术语表出现在目录中,需要指定 toc
选项:
\usepackage[toc]{glossaries}
请参见此页面底部的自定义名称部分。
最后,在文档的前言中加入以下命令以生成术语表:
\makeglossaries
在生成的术语表中,除非在文档中使用了相关条目,否则该条目将不会包含在打印出的术语表中。这使得你可以创建一个通用术语表,并只需在所有文档中使用 \include
引用它。
定义术语条目
要使用术语表中的条目,首先需要定义它。根据你定义的内容和如何使用,定义条目的方式有所不同。
请注意,只有在文档中使用了定义的条目时,它才会包含在打印的术语表中。这使得你能够创建一个通用术语表,只需在所有文档中引用它。
定义术语
要在术语表中定义一个术语,使用 \newglossaryentry
宏:
\newglossaryentry{<label>}{<settings>}
<label>
是用于标识术语表条目的唯一标签,<settings>
是由逗号分隔的键值对,用于定义条目。
例如,要定义一个计算机条目:
\newglossaryentry{computer}
{
name=computer,
description={is a programmable machine that receives input,
stores and manipulates data, and provides
output in a useful format}
}
上面的例子定义了一个具有相同标签和条目名称的条目。并非总是如此,接下来的条目将显示:
\newglossaryentry{naiive}
{
name=na\"{\i}ve,
description={is a French loanword (adjective, form of naïf)
indicating having or showing a lack of experience,
understanding or sophistication}
}
当定义术语时,必须记住它们将由 makeindex
或 xindy
排序。尽管 xindy
对 LaTeX 更为友好,但它通过省略 LaTeX 宏(例如 \"{\i}
)来处理,从而错误地将上面的例子排序为 nave
。makeindex
也不会处理得更好,因为它不理解 TeX 宏,它会按照定义的方式解释单词,将其放入符号类中,位于以 naa
开头的单词之前。因此,需要扩展我们的例子并指定如何排序该单词:
\newglossaryentry{naiive}
{
name=na\"{\i}ve,
description={is a French loanword (adjective, form of naïf)
indicating having or showing a lack of experience,
understanding or sophistication},
sort=naiive
}
您还可以为复数形式指定条目,如果复数形式不是通过添加“s”来形成的(我们将在下一节学习如何使用它们):
\newglossaryentry{Linux}
{
name=Linux,
description={is a generic term referring to the family of Unix-like
computer operating systems that use the Linux kernel},
plural=Linuces
}
或者,对于缩写词:
\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}
这样可以避免错误的复数形式“Frame per Seconds”。
到目前为止,术语表条目是通过键值对列表定义的。有时,描述比单一段落更复杂。例如,您可能希望包含多个段落、项目列表、图表、表格等。对于这样的术语条目,可以使用 longnewglossaryentry
命令,在其中描述部分紧随键值对列表之后。计算机条目的定义如下:
\longnewglossaryentry{computer}
{
name=computer
}
{is a programmable machine that receives input,
stores and manipulates data, and provides
output in a useful format}
定义符号
定义的条目也可以是符号:
\newglossaryentry{pi}
{
name={\ensuremath{\pi}},
description={ratio of circumference of circle to its
diameter},
sort=pi
}
您还可以定义一个名称和符号:
\newglossaryentry{real number}
{
name={real number},
description={include both rational numbers, such as $42$ and
$\frac{-23}{129}$, and irrational numbers,
such as $\pi$ and the square root of two; or,
a real number can be given by an infinite decimal
representation, such as $2.4871773339\ldots$ where
the digits continue in some way; or, the real
numbers may be thought of as points on an infinitely
long number line},
symbol={\ensuremath{\mathbb{R}}}
}
请注意,并非所有术语样式都会显示定义的符号。
定义缩写词
要定义一个新的缩写词,使用 \newacronym
宏:
\newacronym{<label>}{<abbrv>}{<full>}
其中 <label>
是标识缩写词的唯一标签,<abbrv>
是缩写形式,<full>
是扩展的文本。例如:
\newacronym{lvm}{LVM}{Logical Volume Manager}
如果使用 acronym
包选项,则可以将定义的缩写词放入单独的列表中:
\usepackage[acronym]{glossaries}
使用定义的术语 当你定义了一个术语后,可以在文档中使用它。有许多不同的命令用于引用术语表中的条目。
一般引用
一般引用使用 \gls
命令。例如,如果你已经定义了术语条目,如上所示,你可以这样使用:
\Gls{naiive} people don't know about
alternative \gls{computer} operating systems:
\glspl{Linux}, BSDs and GNU/Hurd.
输出将会是:
Naïve people don't know about alternative computer operating systems: Linuces, BSDs and GNU/Hurd.
上述例子中使用的命令描述:
\gls{}
此命令打印与 <label>
相关联的术语。如果在加载 glossaries
包之前加载了 hyperref
包,它还会将该术语超链接到术语表中的条目。
\glspl{}
此命令打印定义术语的复数形式,除了这一点,它与 \gls
命令的行为相同。
\Gls{}
此命令打印术语的单数形式,并将第一个字母转换为大写。
\Glspl{}
此命令打印术语的复数形式,并将第一个字母转换为大写。
\glslink{}{}
此命令像通常一样创建链接,但打印备用文本。它还可以接受多个选项,用于更改其默认行为(请参见文档)。
\glssymbol{}
此命令打印在 \newglossaryentry{<label>}{symbol={Output of glssymbol}, ...}
中定义的内容。
\glsdesc{}
此命令打印在 \newglossaryentry{<label>}{description={Output of glsdesc}, ...}
中定义的内容。
引用缩写词
缩写词与普通术语的行为略有不同。首次使用时,\gls
命令将显示 "<full> (<abbrv>)
"。在随后的使用中,只会显示缩写。如果没有发生这种情况,则需要设置 \setacronymstyle{long-short}
。
重置缩写词的首次使用:
使用以下命令来重置某个缩写词的首次使用:
\glsreset{<label>}
或者,如果你想重置所有缩写词的使用状态:
\glsresetall
取消缩写词首次使用的状态,使其仅显示缩写:
使用以下命令取消首次使用状态,使其仅显示缩写:
\glsunset{<label>}
或者,对于所有缩写词:
\glsunsetall
仅打印缩写词的长版本:
如果你只想打印缩写词的长版本,而不显示缩写(例如 <full>
),使用:
\acrlong{<label>}
仅打印缩写词的完整版本:
如果你想打印缩写词的长版本和缩写(例如 <full> (<abbrv>)
),使用:
\acrfull{<label>}
仅打印缩写词:
如果你只想打印缩写(例如 <abbrv>
),使用:
\acrshort{<label>}
显示术语表
要显示已排序的术语列表,你需要在文档中添加:
\printglossaries
这会将术语表和缩写词列表显示在你想要的位置。
打印所有条目
如果需要打印所有条目,可以在 \printglossaries
之前插入命令:
\glsaddall
你也可以使用以下命令来抑制术语表中的位置列表:
\usepackage[nonumberlist]{glossaries}
分开显示术语表和缩写词列表
\printglossaries
会按定义的顺序显示所有术语表。如果没有定义自定义术语表,默认的术语表和缩写词列表将被显示。
术语表和缩写词列表可以分别显示在不同的位置:
\usepackage[acronyms]{glossaries}
\printglossary[type=\acronymtype] % 只打印缩写词列表
% 在术语表和缩写词列表之间可以插入一些文本。
\printglossary % 如果没有提供选项,则打印默认的术语表
双重条目与缩写词的术语表引用 有时,将同一术语同时作为缩写词和术语表条目使用是很有用的。为了将这两者关联起来,可以通过在缩写词中引用术语表条目的方式来定义它们,如下所示:
\newglossaryentry{gls-OWD} {
name={One-Way Delay},
description={The time a packet uses through a network from one host to another},
}
\newacronym[see={[Glossary:]{gls-OWD}}]{OWD}{OWD}{One-Way Delay\glsadd{gls-OWD}}
使用 \gls{OWD}
引用缩写词,使用 \gls{gls-OWD}
引用术语表。
为了更方便地使用,我们可以使用以下命令(改编自官方文档中的示例):
语法:
\newdualentry[glossary options][acronym options]{label}{abbrv}{long}{description}
\usepackage{xparse}
\DeclareDocumentCommand{\newdualentry}{ O{} O{} m m m m } {
\newglossaryentry{gls-#3}{name={#5},text={#5\glsadd{#3}},
description={#6},#1
}
\makeglossaries
\newacronym[see={[Glossary:]{gls-#3}},#2]{#3}{#4}{#5\glsadd{gls-#3}}
}
然后,定义新的(双重)条目以供术语表和缩写列表使用,如下所示:
\newdualentry{OWD} % label
{OWD} % abbreviation
{One-Way Delay} % long form
{The time a packet uses through a network from one host to another} % description
自定义名称
可以使用自定义名称替换术语表部分的名称,或将其翻译为另一种语言。通过为 \printglossary
添加 title
选项来指定术语表的标题。通过添加 toctitle
选项来指定目录中使用的标题(如果未使用,将使用默认标题)。
\printglossary[title=List of Terms,toctitle=Terms and abbreviations]
移除点
若要去掉每个描述末尾的句点,使用以下代码:
\usepackage[nopostdot]{glossaries}
更改术语表条目展示样式
有许多预设的样式可以使用,并且可以通过以下命令轻松更改:
% 必须在 \printglossaries 之前执行
\setglossarystyle{<newstyle>}
常用的样式包括:
-
list
My Term Has some long description 7, 9
-
altlist (在术语后插入换行并缩进描述)
My Term Has some long description 7, 9
-
altlistgroup 或 listgroup (根据术语的首字母进行分组)
M My First Term Has some long description 7, 9 My Second Term Has some long description 7, 9
-
altlisthypergroup 或 listhypergroup (在每个术语表顶部添加一个超链接的“索引”以跳转到一个组)
A|B|C|D|F|G|I|M|O|R|S|C|D|G|M|P A A First term Has some long description 7, 9 B Barely missed first Has some long description 7, 9
构建文档
要将术语表添加到最终文档中,需要执行以下步骤:
-
构建你的 LaTeX 文档 — 这也会生成 makeglossaries 所需的 aux 文件。
-
调用
makeglossaries
— 这是一个脚本,它会选择正确的字符编码和语言设置,并在文档文件中指定时运行xindy
或makeindex
。 -
再次构建你的 LaTeX 文档 — 以生成包含术语表条目的文档。
因此:
latex doc
makeglossaries doc
latex doc
其中 latex 是你通常使用的构建命令,可能是 pdflatex、lualatex,而 doc 是你的 LaTeX 主文件名,不包括文件扩展名。选项 -d out 可以用来指定 aux 和其他中间文件的位置。如果你的条目是相互链接的(条目本身使用 \gls 调用链接到其他条目),你需要运行步骤 1 和 2 两次,即按以下顺序:1, 2, 1, 2, 3。
任何问题将报告在 doc.log 和 doc.glg 文件中。
在 Windows 上使用 Texmaker 编译词汇表
在 TeX Live 和自 2015 年 6 月以来的 MikTeX 中,xindy 已经包含在内。
唯一的问题是 MikTeX 安装目录的路径包含空格。可以通过以下编辑解决此问题:MikTeX 和 xindy 问题。
安装 xindy 后,需要重新启动 Texmaker,以更新 PATH 引用到 xindy 和 Perl 二进制文件。
然后,在 Texmaker 中,转到 User -> User Commands -> Edit User Commands。 选择命令 1:
菜单项 = makeglossaries
命令 = makeglossaries %
现在按 Alt+Shift+F1,然后 -> F1。
注意:对于使用 Texmaker 的 "use build directory" 选项:makeglossaries 需要找到 aux 文件。幸运的是,虽然 Texmaker 在这方面没有帮助,makeglossaries 的 -d 选项提供了处理子目录的功能。因此,在这种情况下,命令应该是:
命令 = makeglossaries -d build %。
文档序言
在序言中应该包括以下内容(请注意,hyperref 应在 glossaries 之前加载):
\usepackage[nomain,acronym,xindy,toc]{glossaries} % nomain, 如果你在文件中定义了词汇表,并使用了 \include{INP-00-glossary}
\makeglossaries
\usepackage[xindy]{imakeidx}
\makeindex
词汇表定义
将所有词汇表/缩写词写入一个文件:例如 INP-00-glossary.tex
\newacronym{ddye}{D$_{\text{dye}}$}{donor dye, ex. Alexa 488}
\newacronym[description={\glslink{r0}{F\"{o}rster distance}}]{R0}{$R_{0}$}{F\"{o}rster distance}
\newglossaryentry{r0}{name=\glslink{R0}{\ensuremath{R_{0}}},text=F\"{o}rster distance,description={F\"{o}rster distance, where 50\% ...}, sort=R}
\newglossaryentry{kdeac}{name=\glslink{R0}{\ensuremath{k_{DEAC}}},text=$k_{DEAC}$, description={is the rate of deactivation from ... and emission)}, sort=k}
包含词汇表定义并打印词汇表
在序言中包含词汇表定义(在 "\begin{document}" 之前):
\loadglsentries[main]{INP-00-glossary}
% 或使用 \input:
%\input{INP-00-glossary}
打印词汇表
在文档末尾打印词汇表:
\appendix
\bibliographystyle{plainnat}
\bibliography{bibtex}
\printindex
\printglossaries
\end{document}
参考文献
[1] Nomencl package documentation
[2] Differences between “xindy” and “makeindex”
[3] Glossaries package user documentation
[4] Glossaries package documentation
[5] Glossaries user manual
[6] Glossaries documentation
[7] Using LaTeX to Write a PhD Thesis
[8] Glossaries FAQ by Nicola L.C. Talbot