术语表与符号表

有时想在文档末尾放“缩略语和术语列表”或“符号表”,而且只列出正文中实际出现的项目,并自动排序。手工制作这样的表时,每增加一个术语都要重新排序和调整编号。LaTeX 为此有两类专门工具:制作术语和缩略语 glossaryglossaries package(以及现代后继 glossaries-extra),以及专门面向数学符号 nomenclaturenomencl package。二者与索引和交叉引用类似,流程都是 在正文中标记条目,用外部程序排序,再通过额外编译把结果读回正文

术语表 — glossaries 基础

glossaries 的做法是把术语、记号或缩略语 在导言区定义一次,正文中再用短命令调用。先加载 package,然后写 \makeglossaries。这一行声明要打开 glossary 文件;忘了它就 完全不会生成术语表。注意:如果使用 hyperref,应 hyperref 之后加载 glossaries,这是“hyperref 最后加载”经验规则的一个例外。

术语定义用 \newglossaryentry{key}{name=..., description=...}。第一个参数 key 是引用标签,可自取字符串;第二个参数是 key=value 设置列表,主要包括 name(显示名)和 description(说明)。正文中使用该术语时写 \gls{key}:它插入 name,同时记录这个术语应进入 glossary。

latex
\usepackage{glossaries}
\makeglossaries

\newglossaryentry{set}{%
  name={set},
  description={a collection of distinct objects}%
}
\newglossaryentry{matrix}{%
  name={matrix},
  plural={matrices},% 不規則な複数形を明示 / irregular plural
  description={a rectangular array of numbers}%
}

\begin{document}
本文で \gls{set}\glspl{matrix} に言及する。
\printglossary
\end{document}

\gls 有大写和复数变体,只需改变命令开头的字母即可切换。由 name 自动生成的复数只是给末尾加 “s”,因此像 matrices 这样的不规则形式必须用 plural key 明确给出。若引用时的写法要不同于显示名,用 text;相关符号放在 symbol key 中。

命令输出用途
\gls{set}set普通小写引用
\Gls{set}Set句首大写首字母
\glspl{matrix}matrices复数形式
\Glspl{matrix}Matrices复数加首字母大写
\glsdesc{set}a collection of distinct objects插入 description 字段

缩略语 — 首次使用时展开

缩略语有专用命令 \newacronym{key}{short}{long}short 是缩写(如 SVM),long 是全称(如 support vector machine)。用 \gls{key} 调用时会自动切换:首次使用显示“全称(缩写)”,之后只显示缩写。也就是说,第一次出现缩略语时给出全称这一规范由工具自动保证。若要把缩略语收集到单独列表中,用 \usepackage[acronym]{glossaries} 加载 package。

latex
\usepackage[acronym]{glossaries}
\makeglossaries

\newacronym{svm}{SVM}{support vector machine}

\begin{document}
\gls{svm} は強力だ。% 初出: support vector machine (SVM)
その後も \gls{svm} を使う。% 2回目以降: SVM
\end{document}

首次使用标志在整个文档中逐条跟踪。如果想从某处开始再次显示全称,使用 \glsreset{key};若要一次重置所有条目,使用 \glsresetall。如果说明长到跨越多个段落,则用 \longnewglossaryentry 代替 \newglossaryentry

构建 — 需要 makeglossaries

与索引一样,glossary 不会在一次编译后出现。LaTeX 只把 \gls 等记录的术语写入辅助文件,并不排序或格式化。因此需要运行外部程序 makeglossaries。它是 Perl 脚本,会读取文档设置,并在内部适当地调用 makeindexxindy,生成已排序的 glossary。流程分三步:

terminal
pdflatex mydoc      # 用語をファイルへ書き出す / write the recorded terms
makeglossaries mydoc # 整列・整形(拡張子なし)/ sort & format (no extension)
pdflatex mydoc      # 用語集を本文へ流し込む / pull the glossary into the document

在没有 Perl 的环境(如某些 Windows 安装)中,Lua 编写的 makeglossaries-lite 可完成同样工作。如果忘记调用 makeglossaries,只运行第二次 pdflatex,glossary 会保持空白,这与索引中忘记 makeindex 完全一样。Overleaf 会在后台自动运行所需步骤,所以通常不必特别考虑这个顺序。

现代方式 — glossaries-extra 与 bib2gls

同一作者 Nicola Talbot 编写的 glossaries-extra 是扩展 glossaries 的高层 package,也是目前推荐的配置。与它配套的现代构建方式是 bib2gls。思路类似文献管理中的 biber:把术语集中写在 .bib 文件 中,bib2gls 只选择正文中实际使用的术语,排序后读入。也就是说,一个程序承担了 makeindex / xindy 的选择与排序角色。

使用时,用 record 选项加载 package:\usepackage[record]{glossaries-extra}。这是与 bib2gls 集成的关键,它会禁用 makeindex / xindy indexing,改为把记录写入 .aux 文件。.bib 文件中的每个条目使用 @entry(术语)、@abbreviation(缩略语)、@symbol(符号)等类型。

terms.bib
@entry{set,
  name = {set},
  description = {a collection of distinct objects}
}

@abbreviation{svm,
  short = {SVM},
  long = {support vector machine}
}

在文档中,不用 \input,而是用 \GlsXtrLoadResources[src={terms}] 读取 .bibsrc 是不带扩展名的文件名)。术语仍用 \gls{set} 使用,但由于条目已经排好序,输出时用 \printunsrtglossaryunsrt 即 unsorted,意思是 bib2gls 已经排好序,所以原样输出。

latex
\usepackage[record]{glossaries-extra}
\GlsXtrLoadResources[src={terms}]% terms.bib を読む / load terms.bib

\begin{document}
\gls{set}\gls{svm} を本文で使う。
\printunsrtglossary
\end{document}

构建时调用 bib2gls,而不是 makeglossaries--group 选项会按首字母分组生成小标题;pdflatex 也可以替换为 xelatexlualatex

terminal
pdflatex mydoc
bib2gls --group mydoc   # .aux を読み .glstex を書き出す / read .aux, write .glstex
pdflatex mydoc

符号表 — nomencl package

如果想在论文前面列出“本文使用的符号”,也可以用 glossaries,但只处理符号时,轻量的 nomencl package 更方便。在导言区放 \usepackage{nomencl}\makenomenclature,在符号首次出现的位置用 \nomenclature{symbol}{description} 标记,并在想输出列表的位置写 \printnomenclature。符号是数学内容,因此用 $...$ 包住。

document.tex
\documentclass{article}
\usepackage{nomencl}
\makenomenclature

\begin{document}
重力加速度を $g$ とする。%
\nomenclature{$g$}{gravitational acceleration}%
質量 $m$ の物体には $F = mg$ が働く。%
\nomenclature{$m$}{mass of the object}%
\nomenclature{$F$}{force}%

\printnomenclature
\end{document}

通常会在 \nomenclature 前一行末尾加 %,避免混入多余空格或换行;符号前后的空格会影响排序。若要精确控制顺序,可用可选参数提供排序 key:在 \nomenclature[<prefix>]{symbol}{description} 中,<prefix> 会参与排序。例如希腊字母 \sigma 因开头反斜杠可能排在前面,因此可用 \nomenclature[g-sigma]{$\sigma$}{...} 这样的 prefix 调整位置。

构建和调整 nomencl

nomencl 内部使用 makeindex。写了 \makenomenclature 后,LaTeX 会把符号信息写入 .nlo 文件。下一条命令用 nomencl 附带的 style nomencl.ist 对其排序,并生成输出 .nls。最后再编译一次,.nls 会被读入,符号表就会出现。

terminal
pdflatex mydoc
makeindex mydoc.nlo -s nomencl.ist -o mydoc.nls
pdflatex mydoc

标题默认是英文 “Nomenclature”。可以改写,例如 \renewcommand{\nomname}{List of Symbols}。若要加入目录,用 \usepackage[intoc]{nomencl} 加载 package。还有自动给各项添加注释的选项:refpage 追加 “, page n”,refeq 追加 “, see equation (n)”。若要把符号分成物理常数、变量等组,可结合 sort prefix 与重新定义的 \nomgroup,生成带标题的小组。

  • 术语和缩略语的 glossary 用 glossaries / glossaries-extra 首次展开、复数和大写都可自动处理。
  • 新项目建议 glossaries-extra + bib2gls 条目写在 .bib 中,\printunsrtglossary 只输出已使用且已排序的术语。
  • 如果只是数学符号列表,用 nomencl 它轻量:用 \nomenclature 标记,再运行一次 makeindex 即可。
  • 这些都需要额外编译。 中间插入外部程序(makeglossaries / bib2gls / makeindex),然后再运行 LaTeX。