我在网上看了一些论文模板,几乎所有的论文模板都有这样一行字:
\chapter*{List of Symbols}
\addcontentsline{toc}{chapter}{List of Symbols}
例如:
https://groups.google.com/forum/#!topic/latexusersgroup/tfHpC9MvpsI https://gist.github.com/FuzzyWuzzie/4678259
但绝对没有关于如何将符号添加到此列表的说明!我如何开始向该列表添加符号?
网上有消息称,在这个页面添加新符号的方法是在这个章节下创建一个表格:
\chapter*{List of Symbols}
\addcontentsline{toc}{chapter}{List of Symbols}
\begin{tabular}{cp{0.6\textwidth}}
$x$ & position \\
$v$ & velocity \\
$a$ & acceleration \\
$t$ & time \\
$F$ & force
\end{tabular}\\
但我想在进行过程中添加符号,以便不同章节中的符号在定义时与符号列表“超链接”。
我希望使用类似的东西来实现这一点\addsymbol{\beta: name of a cat}
。
有没有办法做到这一点而不创建单独的符号表?
答案1
glossaries
软件包和扩展软件包都glossaries-extra
提供了软件包选项symbols
,它创建一个新列表,该列表标symbols
有语言敏感\glssymbolsgroupname
(“符号”) 给出的默认标题。可以使用 引用此列表type=symbols
。如果您不使用此软件包选项,则可以使用默认词汇表,但默认标题将从(“词汇表”)main
中获取。\glossaryname
表 1.1:词汇表选项:优点和缺点手册中glossaries
总结了下述各种选项之间的主要区别,以及glossaries
性能页面评估各种方法的性能(构建时间和排序)。
方法 1(无需外部工具,手动分类)
这是最简单的方法,因为它不需要对构建过程进行任何添加。至少需要 v1.08 的glossaries-extra
包裹。
优点和缺点:
- 您需要按照所需的顺序定义条目;
- 符号列表中的每个条目没有相关联的页面列表(尽管可以手动添加);
- 所有定义的条目都将包含在列表中,无论它们是否已在文档中使用;
- 必须先定义所有条目才能显示列表;
- 不需要任何外部工具。
前三点也适用于问题中使用tabular
环境的手动方法。第四点由 的默认行为自动确保glossaries-extra
,该行为禁止在环境中定义条目。(如果您有很多符号,我建议您将定义放在单独的文件中,并使用或document
将其加载到序言中。)\input
\loadglsentries
首先必须定义每个符号。如果symbols
使用包选项,则可以使用\glsxtrnewsymbol[
选项]{
标签}{
象征}
. 然后可以使用\gls{
标签}
。例如,$t$
可以使用以下标签定义符号t
:
\glsxtrnewsymbol[description={time}]{t}{\ensuremath{t}}
然后可以使用 来引用它\gls{t}
。定义此符号的另一种方法是:
\newglossaryentry{t}{name={\ensuremath{t}},sort={t},description={time}}
或者(如果symbols
词汇表已经定义):
\newglossaryentry{t}{name={\ensuremath{t}},sort={t},description={time},type={symbols}}
该\glsxtrnewsymbol
命令更紧凑,更适合符号,但symbols
需要包选项来提供它。
对于这种方法,我推荐使用sort=none
package 选项,因为它可以关闭sort
密钥的冗余构造。(如果您使用的是旧版本的,则此选项可能不可用glossaries
。)
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,sort=none]{glossaries-extra}
\glsxtrnewsymbol[description={position}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
如果该文件名为mydoc.tex
,则构建过程为:
pdflatex mydoc
pdflatex mydoc
(根据需要替换pdflatex
为xelatex
etc。)这里只需要第二个实例pdflatex
来确保目录和 PDF 书签是最新的。
这将产生符号列表:
符号列表会自动添加到目录中:
您可以使用以下命令更改标题title
:
\printunsrtglossary[type=symbols,style=long,title={List of Symbols}]
我使用了long
与你最接近的风格tabular
,但是有许多预定义样式可供选择。
确保hyperref
在之前加载。(这与最后加载的glossaries-extra
一般规则相反。)这将允许诸如的命令链接到符号列表中的相关条目。hyperref
\gls
可以包含位置,但与所有手动方法一样,这可能很麻烦且容易出错。以下示例仅包含第一个符号的位置:
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,record]{glossaries-extra}
\glsxtrnewsymbol[
description={position},
location={(see chapter~\ref{ch:sample}).}
]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long]
\chapter{Sample}\label{ch:sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
该record
选项(除其他事项外)创建了一个名为location
which \printunsrtglossary
check for 的字段。符号列表现在如下所示:
方法2(使用外部工具排序)
此方法更复杂,因为它需要在构建过程中增加一个步骤。它与上一个示例非常相似,但有一些修改:
- 添加此
nonumberlist
选项是为了隐藏符号列表每个条目后自动出现的位置列表。(如果您确实需要这些位置,请删除此选项。) - 必须将命令
\makeglossaries
添加到前导码中(在符号定义之前)。 - 该命令
\printunsrtglossary
必须替换为\printglossary
。
优点和缺点:
- 条目按字母顺序列出(根据其
sort
值); \gls
列表中的每个条目可以有一个列表,列出文档中使用该符号(带有)的位置;- 只有文档中使用过的条目(带有
\gls
)才会包含在列表中; - 条目可以在文档中定义(但必须使用
docdef=restricted
或docdef=true
包选项启用此功能,该选项具有一些潜在的问题); - 构建过程需要外部工具。
修改后的示例:
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,nonumberlist]{glossaries-extra}
\makeglossaries
\glsxtrnewsymbol[description={position}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printglossary[type=symbols,style=long,title={List of Symbols}]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
假设该文件名为mydoc.tex
,则构建过程为:
pdflatex mydoc
makeglossaries mydoc
pdflatex mydoc
makeglossaries
是一个 Perl 脚本,因此你需要安装 Perl 才能使用它。如果您没有 Perl,可以使用轻量级 Lua 替代方案makeglossaries-lite
。(由于现代 TeX 发行版附带 LuaTeX,因此您应该已经有一个可用的 Lua 解释器。)在这种情况下,构建过程是:
pdflatex mydoc
makeglossaries-lite mydoc
pdflatex mydoc
(makeglossaries-lite
实际上是作为 分发的makeglossaries-lite.lua
,但类 Unix 系统上的 TeX Live 删除了.lua
扩展名。我不使用 Windows,但我认为可以省略扩展名,因为我相信 Windows 发行版会将 Lua 脚本转换为可执行文件makeglossaries-lite.exe
。)
这将生成一个有序的符号列表,其中排序顺序是从 的第一个必需参数 获得的\glsxtrnewsymbol
,该参数也是用于标识术语的标签。如果\newglossaryentry
改用 ,则排序默认为 字段name
,这会给根据 LaTeX 命令定义的符号(例如\alpha
或 )带来问题\sum
。(这就是为什么\glsxtrnewsymbol
改用 标签。)
如果没有该nonumberlist
选项,列表将包含一个位置列表:
在这种情况下,每个位置列表都包含数字 3,即\gls
出现所有实例的页面。您可以根据需要切换到另一个计数器(例如,使用counter
包选项)。该postpunc
选项允许在描述后自动插入标点符号,但最好与选项一起使用stylemods
。例如:
\usepackage[symbols,nogroupskip,stylemods,postpunc=dot]{glossaries-extra}
sort
您可以使用的可选参数中的键来更改排序值\glsxtrnewsymbol
。例如:
\glsxtrnewsymbol[description={time},sort={time}]{t}{\ensuremath{t}}
如何实际运行makeglossaries
/makeglossaries-lite
取决于您的设置。例如:
如果你真的遇到困难,你可以使用automake
包选项:
\usepackage[symbols,nogroupskip,nonumberlist,automake]{glossaries-extra}
这没有提供的诊断工具makeglossaries
并且需要 shell 转义。
makeglossaries
和都makeglossaries-lite
调用索引应用程序。您可以直接调用它,但您需要知道所有必要的开关和文件扩展名。(软件包提供的 Perl 和 Lua 脚本会glossaries
在文件中找到必要的信息.aux
。)默认行为是使用makeindex
。您可以切换到xindy
通过添加xindy
到包选项列表:
\usepackage[symbols,nogroupskip,nonumberlist,xindy]{glossaries-extra}
(请注意,这xindy
是一个 Perl 脚本,因此您需要安装 Perl 才能使用它。)在上面的例子中,没有区别,因为将字段\glsxtrnewsymbol
设置sort
为标签,它只包含 ASCII 字符。
\newglossaryentry
如果直接使用并且字段包含命令,事情会变得更加复杂name
。例如:
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,nonumberlist]{glossaries-extra}
\makeglossaries
\newglossaryentry{alpha}{
name=\ensuremath{\alpha},
description={angular acceleration},
type=symbols
}
\newglossaryentry{delta}{
name=\ensuremath{\delta},
description={Kronecker delta},
type=symbols
}
\newglossaryentry{lambda}{
name=\ensuremath{\lambda},
description={Lagrange multiplier},
type=symbols
}
\newglossaryentry{chi}{
name=\ensuremath{\chi},
description={chromatic number},
type=symbols
}
\newglossaryentry{zeta}{
name=\ensuremath{\zeta},
description={Riemann zeta function},
type=symbols
}
\begin{document}
\tableofcontents
\printglossary[type=symbols,style=long,title={List of Symbols}]
\chapter{Sample}
Reference symbols: $\gls{delta}$, $\gls{chi}$, $\gls{alpha}$,
$\gls{zeta}$, $\gls{lambda}$.
\end{document}
在这种情况下,sort
字段是从name
字段中获取的,但两者都不makeindex
理解xindy
LaTeX 命令。在 的情况下makeindex
,它将 视为\ensuremath{\alpha}
包含 19 个字符的字符串,以 开头,\
因此结果为:
这不符合希腊字母的自然顺序(应该是 α δ ζ λ χ),并且会将希腊符号置于拉丁符号之前(因为\
排列a
在之前makeindex
)。
此示例完全失败xindy
。如果您使用makeglossaries-lite
脚本,它会失败并显示一条神秘消息。如果我仅修改文档以使其包含xindy
包选项:
\usepackage[symbols,nogroupskip,nonumberlist,xindy]{glossaries-extra}
然后makeglossaries-lite
报告:
Cannot locate xindy module for language english in codepage nil.
Cannot locate xindy module for language nil in codepage nil.
这是因为文档没有设置代码页。需要添加:
\usepackage[symbols,nogroupskip,nonumberlist,
xindy={codepage=utf8,language=english}]{glossaries-extra}
(如果省略此信息,则无需使用makeglossaries
which 来回退。)但是,即使有了这些信息,也会失败并显示相当神秘的消息:-L english -C utf8
makeglossaries-lite
xindy
ERROR: CHAR: index 0 should be less than the length of the string
切换到makeglossaries
提供更易理解的解释:
Sort key required for entries only containing command names.
Attempting to determine which entries have problem sort keys.
Parsing 'mydoc.slo'
5 problematic entries found:
Label: 'chi'. Sort value : '\\ensuremath {\\chi }'
(Try adding sort={chi} to the definition.)
Label: 'delta'. Sort value : '\\ensuremath {\\delta }'
(Try adding sort={delta} to the definition.)
Label: 'zeta'. Sort value : '\\ensuremath {\\zeta }'
(Try adding sort={zeta} to the definition.)
Label: 'alpha'. Sort value : '\\ensuremath {\\alpha }'
(Try adding sort={alpha} to the definition.)
Label: 'lambda'. Sort value : '\\ensuremath {\\lambda }'
(Try adding sort={lambda} to the definition.)
因此,xindy
您必须为仅包含字段中的命令的条目提供一个合理的sort
值(或使用\glsxtrnewsymbol
默认标签)name
。
方法 3(不需要外部工具,按文档中的用途排序)
要按照文档中第一次使用符号的顺序排列符号列表,您需要做以下更改:
- 添加
sort=use
\makeglossaries
用。。。来代替\makenoidxglossaries
\printglossary
用。。。来代替\printnoidxglossary
优点和缺点:
- 条目可以按字母顺序列出(不推荐使用此方法),或按使用顺序列出(
sort=use
,如本例所示),或按定义顺序列出(sort=def
); \gls
列表中的每个条目可以有一个列表,列出文档中使用该符号(带有)的位置;- 只有文档中使用过的条目(带有
\gls
)才会包含在列表中; - 所有条目都必须在序言中定义;
- 不需要任何外部工具。
正如您可能从第一点中了解到的那样,您也可以使用此方法替代其他两种方法。但是,按字母顺序排序时,方法 2 效率更高,并且可以支持各种语言环境(与选项一起使用时xindy
),尽管这可能不适用于符号(尤其是当它们只包含 ASCII 字符时)。对于大型列表,按字母顺序排序时,此方法可能需要很长时间。按定义排序时(sort=def
),此方法与方法 1 不同,因为它仅包含文档中已经使用过的条目(而方法 1 列出了所有已定义的条目)。
调整后的示例(第三页修改以显示效果):
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,nonumberlist,sort=use]{glossaries-extra}
\makenoidxglossaries
\glsxtrnewsymbol[description={position}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printnoidxglossary[type=symbols,style=long,title={List of Symbols}]
\chapter{Sample}
Reference symbols: $\gls{F}$, $\gls{t}$, $\gls{x}$, $\gls{v}$, $\gls{a}$.
\end{document}
构建过程回到:
pdflatex mydoc
pdflatex mydoc
符号列表现在如下所示:
再次,删除该nonumberlist
选项会使位置列表出现:
如果在排序值包含命令的情况下将此方法与默认字母排序结合使用,则会出现严重错误。使用希腊符号调整前面的示例:
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,nonumberlist]{glossaries-extra}
\makenoidxglossaries
\newglossaryentry{alpha}{
name=\ensuremath{\alpha},
description={angular acceleration},
type=symbols
}
\newglossaryentry{delta}{
name=\ensuremath{\delta},
description={Kronecker delta},
type=symbols
}
\newglossaryentry{lambda}{
name=\ensuremath{\lambda},
description={Lagrange multiplier},
type=symbols
}
\newglossaryentry{chi}{
name=\ensuremath{\chi},
description={chromatic number},
type=symbols
}
\newglossaryentry{zeta}{
name=\ensuremath{\zeta},
description={Riemann zeta function},
type=symbols
}
\begin{document}
\tableofcontents
\printnoidxglossary[type=symbols,style=long,title={List of Symbols}]
\chapter{Sample}
Reference symbols: $\gls{delta}$, $\gls{chi}$, $\gls{alpha}$,
$\gls{zeta}$, $\gls{lambda}$.
\end{document}
排序过程中,出现以下错误:
! Improper alphabetic constant.
<to be read again>
\protect
l.36 ...ymbols,style=long,title={List of Symbols}]
此方法仅适用于 ASCII 排序。使用此方法,您必须确保sort
值不包含任何命令(例如,使用\glsxtrnewsymbol
从标签获取排序值)或使用sort=def
或sort=use
。
方法 4(.bib
需要外部工具和文件)
这是一种相当新的方法。它不需要使用makeindex
或xindy
(通过makeglossaries
或makeglossaries-lite
),而是需要bib2gls
,它执行两个功能:
- 根据
.aux
文件中找到的记录选择条目(类似于bibtex
); - 按层次对条目进行排序并整理位置列表(类似于
makeindex
或xindy
)。
优点和缺点:
- 您需要在
.bib
文件中定义条目(而不是在文档中); bib2gls
允许任何位置格式或者您可以指示它省略位置列表;- 您可以指示
bib2gls
选择所有定义的条目或仅选择记录的条目(以及可选的它们的依赖项); - 能解释常见的符号命令;
- 可以按照区域设置、字符代码、字母数字混合、数字、日期、时间、定义顺序、使用顺序进行排序,或者可以随机排序或省略排序;
- 至少需要 Java 7。
现在,符号已在.bib
文件中定义。例如,而不是:
\glsxtrnewsymbol[description={angular acceleration}]{alpha}{\ensuremath{\alpha}}
该符号定义为:
@symbol{alpha,
name={\ensuremath{\alpha}},
description={angular acceleration}
}
或者,
\newglossaryentry{alpha}{
name=\ensuremath{\alpha},
description={angular acceleration},
type=symbols
}
使用
@entry{alpha,
name={\ensuremath{\alpha}},
description={angular acceleration}
}
(type
已省略字段,因为在文档中分配它更加灵活。)与一样\glsxtrnewsymbol
,@symbol
定义使用标签作为字段的后备sort
,而@entry
定义使用name
作为后备。
例如,该文件greek-symbols.bib
可能包含:
% Encoding: UTF-8
@entry{alpha,
name={\ensuremath{\alpha}},
description={angular acceleration}
}
@entry{delta,
name={\ensuremath{\delta}},
description={Kronecker delta}
}
@entry{lambda,
name={\ensuremath{\lambda}},
description={Lagrange multiplier}
}
@entry{chi,
name={\ensuremath{\chi}},
description={chromatic number}
}
@entry{zeta,
name={\ensuremath{\zeta}},
description={Riemann zeta function}
}
文档需要record
包选项。nonumberlist
我可以指示bib2gls
不保存位置列表(这样效率更高),而不是\makeglossaries
/ ,\makenoidxglossaries
您需要使用\GlsXtrLoadResources
:
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,
record % using 'bib2gls'
]{glossaries-extra}
\GlsXtrLoadResources[
src={greek-symbols},% entries in 'greek-symbols.bib'
type=symbols,% put these entries in the 'symbols' glossary
save-locations=false% don't save locations
]
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long,title={List of Symbols}]
\chapter{Sample}
Reference symbols: $\gls{delta}$, $\gls{chi}$, $\gls{alpha}$,
$\gls{zeta}$, $\gls{lambda}$.
\end{document}
这使用了\printunsrtglossary
之前的方法 1。与其他方法不同,bib2gls
它通过仅选择所需的条目,然后以适当的顺序将定义 ( \newglossaryentry
) 写入文件输入。这意味着会自动按要求的顺序列出条目(因为从的角度来看,这是定义的顺序)。\GlsXtrLoadResources
\printunsrtglossary
glossaries-extra
构建过程现在
pdflatex mydoc
bib2gls mydoc
pdflatex mydoc
得出的结果为:
(save-locations=false
如果您想要位置列表,请删除。)
由于bib2gls
可以识别类似 的命令\ensuremath{\alpha}
,因此它使用了正确的希腊字母顺序。或者,您可以指示bib2gls
按描述排序:
\GlsXtrLoadResources[
src={greek-symbols},
type=symbols,
sort-field=description,
save-locations=false
]
如果文件latin-symbols.bib
同样包含拉丁符号:
% Encoding: UTF-8
@entry{x,
name={\ensuremath{x}},
description={position}
}
@entry{v,
name={\ensuremath{v}},
description={velocity}
}
@entry{a,
name={\ensuremath{a}},
description={acceleration}
}
@entry{t,
name={\ensuremath{t}},
description={time}
}
@entry{F,
name={\ensuremath{F}},
description={force}
}
然后可以将它们组合起来:
\GlsXtrLoadResources[
src={greek-symbols,latin-symbols},% entries in 'greek-symbols.bib' and 'latin-symbols.bib'
type=symbols,
save-locations=false
]
或者在同一个词汇表中分成两个不同的组:
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,
stylemods={tree},% loads glossaries-extra-stylemods to patch styles
record % using 'bib2gls'
]{glossaries-extra}
% assign titles to group labels:
\glsxtrsetgrouptitle{latin}{Latin}
\glsxtrsetgrouptitle{greek}{Greek}
\GlsXtrLoadResources[
src={latin-symbols},
type=symbols,
group={latin},% assign group label
set-widest,% needed for 'alttree' styles
save-locations=false
]
\GlsXtrLoadResources[
src={greek-symbols},
type=symbols,
group={greek},% assign group label
set-widest,% needed for 'alttree' styles
save-locations=false
]
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=alttreegroup,title={List of Symbols}]
\chapter{Sample}
Reference Greek symbols: $\gls{delta}$, $\gls{chi}$, $\gls{alpha}$,
$\gls{zeta}$, $\gls{lambda}$.
Reference Latin symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
此group
设置需要在调用时使用--group
(或-g
)开关bib2gls
:
pdflatex mydoc
bib2gls --group mydoc
pdflatex mydoc
此设置还需要支持组标题的样式,这就是我将样式更改为的原因altlistgroup
。