如何有效地使用符号列表进行论文?

如何有效地使用符号列表进行论文?

我在网上看了一些论文模板,几乎所有的论文模板都有这样一行字:

\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包裹。

优点和缺点:

  1. 您需要按照所需的顺序定义条目;
  2. 符号列表中的每个条目没有相关联的页面列表(尽管可以手动添加);
  3. 所有定义的条目都将包含在列表中,无论它们是否已在文档中使用;
  4. 必须先定义所有条目才能显示列表;
  5. 不需要任何外部工具。

前三点也适用于问题中使用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=nonepackage 选项,因为它可以关闭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

(根据需要替换pdflatexxelatexetc。)这里只需要第二个实例pdflatex来确保目录和 PDF 书签是最新的。

这将产生符号列表:

符号列表图像

符号列表会自动添加到目录中:

目录图像

您可以使用以下命令更改标题title

\printunsrtglossary[type=symbols,style=long,title={List of Symbols}]

我使用了long与你最​​接近的风格tabular,但是有许多预定义样式可供选择

确保hyperref在之前加载。(这与最后加载的glossaries-extra一般规则相反。)这将允许诸如的命令链接到符号列表中的相关条目。hyperref\gls

第 3 页图片

可以包含位置,但与所有手动方法一样,这可能很麻烦且容易出错。以下示例仅包含第一个符号的位置:

\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选项(除其他事项外)创建了一个名为locationwhich \printunsrtglossarycheck for 的字段。符号列表现在如下所示:

符号 x 位置(见第 1 章)。 v 速度 a 加速度 t 时间 F 力

方法2(使用外部工具排序)

此方法更复杂,因为它需要在构建过程中增加一个步骤。它与上一个示例非常相似,但有一些修改:

  • 添加此nonumberlist选项是为了隐藏符号列表每个条目后自动出现的位置列表。(如果您确实需要这些位置,请删除此选项。)
  • 必须将命令\makeglossaries添加到前导码中(在符号定义之前)。
  • 该命令\printunsrtglossary必须替换为\printglossary

优点和缺点:

  1. 条目按字母顺序列出(根据其sort值);
  2. \gls列表中的每个条目可以有一个列表,列出文档中使用该符号(带有)的位置;
  3. 只有文档中使用过的条目(带有\gls)才会包含在列表中;
  4. 条目可以在文档中定义(但必须使用docdef=restricteddocdef=true包选项启用此功能,该选项具有一些潜在的问题)
  5. 构建过程需要外部工具。

修改后的示例:

\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理解xindyLaTeX 命令。在 的情况下makeindex,它将 视为\ensuremath{\alpha}包含 19 个字符的字符串,以 开头,\因此结果为:

符号列表 α 角加速度 χ 色数 δ 克罗内克 delta λ 拉格朗日乘数 ζ 黎曼 zeta 函数

这不符合希腊字母的自然顺序(应该是 α δ ζ λ χ),并且会将希腊符号置于拉丁符号之前(因为\排列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}

(如果省略此信息,则无需使用makeglossarieswhich 来回退。)但是,即使有了这些信息,也会失败并显示相当神秘的消息:-L english -C utf8makeglossaries-litexindy

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

优点和缺点:

  1. 条目可以按字母顺序列出(不推荐使用此方法),或按使用顺序列出(sort=use,如本例所示),或按定义顺序列出(sort=def);
  2. \gls列表中的每个条目可以有一个列表,列出文档中使用该符号(带有)的位置;
  3. 只有文档中使用过的条目(带有\gls)才会包含在列表中;
  4. 所有条目都必须在序言中定义;
  5. 不需要任何外部工具。

正如您可能从第一点中了解到的那样,您也可以使用此方法替代其他两种方法。但是,按字母顺序排序时,方法 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=defsort=use

方法 4(.bib需要外部工具和文件)

这是一种相当新的方法。它不需要使用makeindexxindy(通过makeglossariesmakeglossaries-lite),而是需要bib2gls,它执行两个功能:

  1. 根据.aux文件中找到的记录选择条目(类似于bib­tex);
  2. 按层次对条目进行排序并整理位置列表(类似于makein­dexxindy)。

优点和缺点:

  1. 您需要在.bib文件中定义条目(而不是在文档中);
  2. bib2gls允许任何位置格式或者您可以指示它省略位置列表;
  3. 您可以指示bib2gls选择所有定义的条目或仅选择记录的条目(以及可选的它们的依赖项);
  4. 能解释常见的符号命令;
  5. 可以按照区域设置、字符代码、字母数字混合、数字、日期、时间、定义顺序、使用顺序进行排序,或者可以随机排序或省略排序;
  6. 至少需要 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\printunsrtglossaryglossaries-extra

构建过程现在

pdflatex mydoc
bib2gls mydoc
pdflatex mydoc

得出的结果为:

符号列表 α 角加速度 δ 克罗内克 delta ζ 黎曼 zeta 函数 λ 拉格朗日乘数 χ 色数

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

符号列表 拉丁语 a 加速度 F 力 t 时间 v 速度 x 位置 希腊语 α 角加速度 δ 克罗内克 delta ζ 黎曼 zeta 函数 λ 拉格朗日乘数 χ 色数

相关内容