有时想在文档末尾放“缩略语和术语列表”或“符号表”,而且只列出正文中实际出现的项目,并自动排序。手工制作这样的表时,每增加一个术语都要重新排序和调整编号。LaTeX 为此有两类专门工具:制作术语和缩略语 glossary 的 glossaries package(以及现代后继 glossaries-extra),以及专门面向数学符号 nomenclature 的 nomencl package。二者与索引和交叉引用类似,流程都是 在正文中标记条目,用外部程序排序,再通过额外编译把结果读回正文。
术语表 — glossaries 基础
glossaries 的做法是把术语、记号或缩略语 在导言区定义一次,正文中再用短命令调用。先加载 package,然后写 \makeglossaries。这一行声明要打开 glossary 文件;忘了它就 完全不会生成术语表。注意:如果使用 hyperref,应 在 hyperref 之后加载 glossaries,这是“hyperref 最后加载”经验规则的一个例外。
术语定义用 \newglossaryentry{key}{name=..., description=...}。第一个参数 key 是引用标签,可自取字符串;第二个参数是 key=value 设置列表,主要包括 name(显示名)和 description(说明)。正文中使用该术语时写 \gls{key}:它插入 name,同时记录这个术语应进入 glossary。
\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。
\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 脚本,会读取文档设置,并在内部适当地调用 makeindex 或 xindy,生成已排序的 glossary。流程分三步:
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(符号)等类型。
@entry{set,
name = {set},
description = {a collection of distinct objects}
}
@abbreviation{svm,
short = {SVM},
long = {support vector machine}
}在文档中,不用 \input,而是用 \GlsXtrLoadResources[src={terms}] 读取 .bib(src 是不带扩展名的文件名)。术语仍用 \gls{set} 使用,但由于条目已经排好序,输出时用 \printunsrtglossary;unsrt 即 unsorted,意思是 bib2gls 已经排好序,所以原样输出。
\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 也可以替换为 xelatex 或 lualatex。
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。符号是数学内容,因此用 $...$ 包住。
\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 会被读入,符号表就会出现。
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。