许多技术文档使用一般人群不熟悉的术语或缩写。为了让这些文档更加易懂,通常会添加一个术语表。

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}
}

当定义术语时,必须记住它们将由 makeindexxindy 排序。尽管 xindy 对 LaTeX 更为友好,但它通过省略 LaTeX 宏(例如 \"{\i})来处理,从而错误地将上面的例子排序为 navemakeindex 也不会处理得更好,因为它不理解 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
    
  • altlistgrouplistgroup (根据术语的首字母进行分组)

    M
    My First Term 
       Has some long description 7, 9
    My Second Term 
       Has some long description 7, 9
    
  • altlisthypergrouplisthypergroup (在每个术语表顶部添加一个超链接的“索引”以跳转到一个组)

    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
    

构建文档

要将术语表添加到最终文档中,需要执行以下步骤:

  1. 构建你的 LaTeX 文档 — 这也会生成 makeglossaries 所需的 aux 文件。

  2. 调用 makeglossaries — 这是一个脚本,它会选择正确的字符编码和语言设置,并在文档文件中指定时运行 xindymakeindex

  3. 再次构建你的 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


Last modified: Tuesday, 22 April 2025, 11:35 AM