首字母缩略词、缩写、词汇表和索引的最佳解决方案

首字母缩略词、缩写、词汇表和索引的最佳解决方案

我正在写一本包含首字母缩略词的科学文本/书籍,其中应该有一个词汇表和一个索引。问题是:哪种 LaTeX 设置最适合这个?哪些是最好的软件包,等等。

显然,有些问题是重叠的。

  • 我想要一个词汇表,在其中解释一些术语或给出一句话的解释并参考详细讨论该术语的部分。
  • 对于其中一些术语,使用首字母缩略词/缩写可能很常见。例如 HTTP、TCP 或道琼斯。
  • 其他术语通常会写出来,但我可能想使用缩写(在某些部分),因为它们经常出现或太长。(示例:基于分布式事件的系统:DEBS 或点对点:P2P)
  • 我想要一份缩写和首字母缩略词列表。
  • 我还想要一个词汇表,其中包含部分但不是全部的首字母缩略词/缩写。
  • 我还想有一个索引,链接到一些索引术语出现的相关页面。索引还应该能够包含词汇表或首字母缩略词列表中未出现的术语。

在寻找实现这一目标的可能性时,我发现了几种部分解决方案,但我不确定它们如何协同工作,特别是因为有些似乎重叠。

  • acronym包裹
    • 在缩写方面似乎相当常见且强大
    • 甚至可能有点过头了。
    • 不清楚如何将其用于索引/词汇表目的
  • glossaries包裹
    • 很好地支持词汇表
    • 也支持首字母缩略词。但是我如何定义不应该出现在词汇表中但有些应该出现在词汇表中的首字母缩略词
    • 似乎与 hyperref 配合得很好
    • 使用 makeindex
  • 索引makeindex\index{..}以及\printindex
    • 内置于 LaTeX
    • 我可以将它与词汇表包结合起来吗?
  • 其他词汇表包,如makeglos,,,glossglossaryglosstex
  • 其他缩写包如nomencl
  • 其他索引包如makeidx

因此有很多解决方案,但哪一个是最好的?

答案1

  • 我想要一个词汇表,在其中解释一些术语或给出一句话的解释并参考详细讨论该术语的部分。

使用该glossaries包,首先使用 定义每个术语(如果您不想在某些情况下出现令人不快的意外,则在序言中定义)\newglossaryentry。例如:

\newglossaryentry{duck}{name=duck,
  description={a waterbird with webbed feet}}

\newglossaryentry{parrot}{name=parrot,
  description={mainly tropical bird with bright plumage}}

{ }(如果值包含逗号,或等号,请确保使用括号括起来=。)

第一个参数是标签(避免使用特殊字符),以便您可以在文档文本中引用该术语。例如:

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

在您希望显示所有词汇表、缩写列表等的位置使用\printglossaries。这些内容按定义每种词汇表的顺序显示(默认顺序main通常为第一个),但如果您想更改顺序或将一些词汇表放在前面,将一些词汇表放在后面,则需要使用\printglossary并在可选参数中指定类型。

完整的最小示例:

% arara: pdflatex
% arara: makeglossaries
% arara: pdflatex
\documentclass{article}

\usepackage{glossaries}

\makeglossaries

\newglossaryentry{duck}{name=duck,%
  description={a waterbird with webbed feet}}

\newglossaryentry{parrot}{name=parrot,%
  description={mainly tropical bird with bright plumage}}


\begin{document}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

\printglossaries

\end{document}

开头的评论是arara指令。如果您不使用arara,则可以删除这些行。如果您使用,则可以使用文件中的文档位置arara来构建完整文档。如果您不使用,则可以使用 构建文档arara myDocmyDoc.texarara

pdflatex myDoc
makeglossaries myDoc
pdflatex myDoc

makeglossaries应用程序实际上是一个 Perl 脚本,因此如果要使用它,您需要安装 Perl。如果您没有安装 Perl,您可以改用 Lua 替代方案:

makeglossaries-lite myDoc

(的优点makeglossaries是它有一些诊断工具来检查常见问题。)这个 Lua 脚本实际上是与文件名一起分发的,makeglossaries-lite.lua但是 TeX 分发版通常会安排它,以便您不使用.lua扩展名。

makeglossaries有关将或makeglossaries-lite集成到文档构建流程的帮助,请参阅将 makeglossaries 或 makeglossaries-lite 或 bib2gls 纳入文档构建中

如果您仍然遇到问题,另一种可能性是使用automake包选项:

\usepackage[automake]{glossaries}

对于上述示例,这只需要两次 LaTeX 调用。请注意,如果已禁用 shell 转义,则无法使用此功能。(对于大型文档,在词汇表需要更新时仅调用makeglossaries或比在每次运行 LaTeX 时尝试重建词汇表更有效。)makeglossaries-liteautomake

上面的例子产生:

一只鸭子和一只鹦鹉。很多鸭子。词汇表 鸭子 脚上有蹼的水鸟。1 鹦鹉 主要栖息在热带,羽毛鲜艳。1

描述后面显示的数字1是该术语被引用的页码。您可以使用counter包选项更改计数器。例如,要切换到计数器section

\usepackage[counter=section]{glossaries}

或者您可以使用包选项完全省略数字列表nonumberlist

如果你真的陷入困境,并且愿意省略位置编号并手动进行排序,那么你可以使用\printunsrtglossary(或\printunsrtglossaries)提供的glossaries-extra

\documentclass{article}

\usepackage[sort=none]{glossaries-extra}

\newglossaryentry{duck}{name=duck,%
  description={a waterbird with webbed feet}}

\newglossaryentry{parrot}{name=parrot,%
  description={mainly tropical bird with bright plumage}}

\begin{document}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

\printunsrtglossaries

\end{document}

在这种情况下,必须在序言中定义条目(或使用包选项docdefs=restricted它们可以在文档中的任何位置定义它们被引用且位于词汇表之前)。此方法不执行任何索引,只是按照定义顺序迭代所有已定义的条目(因此必须先定义它们)。没有检查来确定这些条目是否已在文档中使用。

一只鸭子和一只鹦鹉。很多鸭子。词汇表鸭子一种有蹼足的水鸟鹦鹉主要栖息在热带,羽毛鲜艳

注意,本例中句子终止点并未自动插入到描述之后。glossaries-extra您需要使用包选项postdotnopostdot=false添加它。

sort=none可以省略该选项(\printunsrtglossary始终符合定义),但此选项会阻止字段的自动分配sort,而在本例中不需要自动分配。(对于这么小的例子来说,这并不重要。)

另一种方法是使用glossaries-extrabib2gls。这需要在文件中定义条目.bib,这意味着如果您在文档中经常使用大量术语,那么您可以使用.bib类似贾布雷夫来组织你的定义。(bib2gls和 JabRef 都需要 Java。)

例如,该文件entries.bib可能包含:

% Encoding: UTF-8
@entry{duck,
  name = {duck},
  description = {a waterbird with webbed feet}
}

@entry{parrot,
  name = {parrot},
  description = {mainly tropical bird with bright plumage}
}

(我可以entries.bib从我之前的myDoc.tex文件中创建这个文件,使用convertgls2bib myDoc.tex entries.bib它来搜索类似的命令\newglossaryentry并将它们转换为所需的.bib格式。)

我现在需要编辑myDoc.tex成:

\documentclass{article}

\usepackage[record]{glossaries-extra}

\GlsXtrLoadResources[src={entries}]

\begin{document}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

\printunsrtglossaries

\end{document}

构建过程现在是:

pdflatex myDoc
bib2gls myDoc
pdflatex myDoc

如果需要字母组,那么您需要--group(或-g):

bib2gls --group myDoc

以及支持群组的词汇表样式。例如:

\documentclass{article}

\usepackage[record,style=indexgroup]{glossaries-extra}

\GlsXtrLoadResources[src={entries}]

\begin{document}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

\printunsrtglossaries

\end{document}

一只鸭子和一只鹦鹉。很多鸭子。词汇表 D 鸭子 有蹼足的水鸟 1 P 鹦鹉 主要栖息在热带,羽毛鲜艳 1

  • 对于其中一些术语,使用首字母缩略词/缩写可能很常见。例如 HTTP、TCP 或道琼斯。
  • 其他术语通常会写出来,但我可能想使用缩写(在某些部分),因为它们经常出现或太长。(示例:基于分布式事件的系统:DEBS 或点对点:P2P)
  • 我想要一份缩写和首字母缩略词列表。

缩写和首字母缩略词可以用 定义\newacronym。这在内部使用\newglossaryentry并分配长格式和短格式。第一个参数是可选的,可用于为 的第二个参数提供附加字段\newglossaryentry。仅使用基础glossaries包,您可以使用设置样式\setacronymstyle,但这需要在定义术语之前完成。如果您想要单独的首字母缩略词/缩写列表,则可以使用acronym包选项。例如:

\documentclass{article}

\usepackage[acronym]{glossaries}

\makeglossaries

\newglossaryentry{duck}{name=duck,
  description={a waterbird with webbed feet}}

\newglossaryentry{parrot}{name=parrot,
  description={mainly tropical bird with bright plumage}}

\setacronymstyle{long-short}

\newacronym{debs}{DEBS}{Distributed Event-Based System}
\newacronym{p2p}{P2P}{Peer-to-Peer}

\begin{document}
\section{Sample}

First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
\gls{p2p}.

\section{Another Sample}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

\printglossaries

\end{document}

得出的结果为:

文件图像

请注意,这会在第一次使用时展开,并在后续使用时使用缩写形式。(如果需要,您可以重置它。)

对于不应扩展的缩写,有三种方法:

  1. 用以下方法定义它们\newacronym然后取消设置它们(假装它们已经被使用过):

    \documentclass{article}
    
    \usepackage[acronym]{glossaries}
    
    \makeglossaries
    
    \newglossaryentry{duck}{name=duck,
      description={a waterbird with webbed feet}}
    
    \newglossaryentry{parrot}{name=parrot,
      description={mainly tropical bird with bright plumage}}
    
    \setacronymstyle{long-short}
    
    \newacronym{debs}{DEBS}{Distributed Event-Based System}
    \newacronym{p2p}{P2P}{Peer-to-Peer}
    
    \newacronym{http}{HTTP}{Hypertext Transfer Protocol}
    \glsunset{http}
    
    \begin{document}
    \section{Sample}
    
    First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
    \gls{p2p}.
    
    No expansion: \gls{http}.
    
    \section{Another Sample}
    
    A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.
    
    \printglossaries
    
    \end{document}
    
  2. 将它们定义为常规术语,但使用键type将它们放入缩写/首字母缩略词列表中:

    \documentclass{article}
    
    \usepackage[acronym]{glossaries}
    
    \makeglossaries
    
    \newglossaryentry{duck}{name=duck,
      description={a waterbird with webbed feet}}
    
    \newglossaryentry{parrot}{name=parrot,
      description={mainly tropical bird with bright plumage}}
    
    \setacronymstyle{long-short}
    
    \newacronym{debs}{DEBS}{Distributed Event-Based System}
    \newacronym{p2p}{P2P}{Peer-to-Peer}
    
    \newglossaryentry{http}{name=HTTP,
     type=\acronymtype,
     description={Hypertext Transfer Protocol}}
    
    \begin{document}
    \section{Sample}
    
    First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
    \gls{p2p}.
    
    No expansion: \gls{http}.
    
    \section{Another Sample}
    
    A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.
    
    \printglossaries
    
    \end{document}
    
  3. 使用扩展包额外词汇表,允许使用不同的缩写样式。此包提供\newabbreviation定义一个缩写,将条目category(由提供的新键glossaries-extra)设置为abbreviation,并重新定义glossaries要与设置为(和设置为)一起\newacronym使用的缩写\newabbreviationcategoryacronymtype\acronymtype。缩写样式使用以下方式设置\setabbreviationstyle[类别]{风格}(不是\setacronymstyle)。类别的默认样式abbreviationlong-short,类别的默认样式acronymshort,因此我们可以只\newabbreviation对第一次使用时需要扩展的缩写使用,而\newacronym对第一次使用时不需要扩展的缩写使用。

    \documentclass{article}
    
    \usepackage[abbreviations]{glossaries-extra}
    
    \makeglossaries
    
    \newglossaryentry{duck}{name=duck,
      description={a waterbird with webbed feet}}
    
    \newglossaryentry{parrot}{name=parrot,
      description={mainly tropical bird with bright plumage}}
    
    \newabbreviation{debs}{DEBS}{Distributed Event-Based System}
    \newabbreviation{p2p}{P2P}{Peer-to-Peer}
    
    \newacronym{http}{HTTP}{Hypertext Transfer Protocol}
    
    \begin{document}
    \section{Sample}
    
    First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
    \gls{p2p}.
    
    No expansion: \gls{http}.
    
    \section{Another Sample}
    
    A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.
    
    \printglossaries
    
    \end{document}
    
  4. 使用bib2gls,早先entries.bib提供的术语(鸭子和鹦鹉)和缩写可以存储在另一个.bib名为 的文件中abbrvs.bib

    % Encoding: UTF-8
    @abbreviation{debs,
      short = {DEBS},
      long = {Distributed Event-Based System}
    }
    
    @abbreviation{p2p,
      short = {P2P},
      long = {Peer-to-Peer}
    }
    

    以及常见的缩写common.bib

    % Encoding: UTF-8 
    @acronym{http,
      short = {HTTP},
      long = {Hypertext Transfer Protocol}
    }
    

    (或者可以将它们合并到同一个文件中)。该文档现在是:

    \documentclass{article}
    
    \usepackage[record,abbreviations]{glossaries-extra}
    
    \GlsXtrLoadResources[src={entries}]
    
    \GlsXtrLoadResources[src={abbrvs,common}]
    
    \begin{document}
    \section{Sample}
    
    First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
    \gls{p2p}.
    
    No expansion: \gls{http}.
    
    \section{Another Sample}
    
    A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.
    
    \printunsrtglossaries
    
    \end{document}
    

前两个示例均产生:

文件图像

第三和第四个示例产生:

文件图像

这里唯一的区别是缺少描述后点(可以用 来添加postdot)和缩写列表的标题。这是因为我使用了abbreviationspackage 选项。如果我改用acronym(或acronyms),我必须添加以下行

\renewcommand{\glsxtrabbrvtype}{\acronymtype}

确保使用定义的缩写\newabbreviation放在acronym词汇表中(否则它们最终会出现在main词汇表中)。

或者,glossaries-extra使用 而不是\newacronym,您可以提供自己的类别并使用\newabbreviation,这可确保它与其他缩写放在同一个词汇表中。例如:

\setabbreviationstyle[common]{short}

设置类别的缩写样式common

\newabbreviation[category=common]{http}{HTTP}{Hypertext Transfer Protocol}

或者

@abbreviation{http,
  short = {HTTP},
  long = {Hypertext Transfer Protocol},
  category={common}
}

定义缩写。或者,您可以指示bib2gls将字段设置category为相应文件的基本名称.bib。例如,如果一般缩写现在在abbreviation.bib,而常用缩写在,common.bib那么您可以使用:

    \GlsXtrLoadResources[src={abbreviation,common},
     category={same as base}]
  • 我还想要一个词汇表,其中包含部分但不是全部的首字母缩略词/缩写。

您可以使用该type键将术语放入特定词汇表中。您还可以创建一个“忽略”词汇表,在其中可以放入任何您想要引用但不想列出的条目。例如,要创建一个标记为“忽略”的忽略词汇表:

\newignoredglossary{ignored}

现在您可以定义要放入其中的术语。例如:

\newacronym[type=ignored]{p2p}{P2P}{Peer-to-Peer}

或者glossaries-extra

\newabbreviation[type=ignored]{p2p}{P2P}{Peer-to-Peer}

或者使用bib2gls,最简单的方法是将忽略的缩写移动到另一个文件,例如,ignored.bib使用:

\GlsXtrLoadResources[src={entries}]% main terms
\GlsXtrLoadResources[src={abbrvs,common}]% abbrvs.bib and common.bib
\GlsXtrLoadResources[src={ignored},% ignored.bib
   type={ignored},% put them in the `ignored` glossary
   sort={none},% don't bother sorting
   save-locations=false% don't bother saving the locations
]

(如果您想将它们保存在同一个abbrvs.bib文件中,您可以在选择中应用模式匹配,但这更为复杂。)

  • 我还想有一个索引,链接到一些索引术语出现的相关页面。索引还应该能够包含词汇表或首字母缩略词列表中未出现的术语。

您可以使用index包选项

\usepackage[index]{glossaries}

这将创建一个新的词汇表,标签为index,还将定义命令\newterm,这是 的快捷方式,用于\newglossaryentry定义没有描述的术语并将type=index其添加到index词汇表中。例如:

\newterm{hippo}
\newterm[plural=geese]{goose}

如果术语包含任何特殊字符,则需要使用name可选参数中的键并从强制参数中删除特殊字符。例如:

\newterm[name={ch\^ateau},plural={ch\^ateaux}]{chateau}

bib2gls可以使用:

@index{hippo}
@index{goose,plural={geese}}
@index{chateau,name={ch\^ateau},plural={ch\^ateaux}}

(使用 XeLaTeX 或 LuaLaTeX 您可以在标签中使用 UTF-8 字符,但inputenc不能。)

显示索引的最佳样式是bookindex,由 提供glossary-bookindex.styglossaries-extra这不显示描述,因此即使使用前面的@entry示例,它仍然只会显示名称和位置列表。

bib2gls具有特殊的双重条目,本质上定义了两个链接的条目。如果文本中引用了一个条目,则会自动选择另一个条目。假设我有一个名为的文件,terms.bib其中包含:

@index{hippo}
@index{goose,plural={geese}}
@index{chateau,name={ch\^ateau},plural={ch\^ateaux}}
@dualindexentry{duck,
 name = {duck},
 description = {a waterbird with webbed feet}
}
@dualindexentry{parrot,
 name = {parrot},
 description = {mainly tropical bird with bright plumage}
}
@dualindexabbreviation{debs,
  short = {DEBS},
  long = {Distributed Event-Based System}
}
@dualindexabbreviation{p2p,
 short = {P2P},
 long = {Peer-to-Peer}
}
@dualindexabbreviation{http,
 short = {HTTP},
 long = {Hypertext Transfer Protocol},
 category={common}
}

那么该文件可以改为:

\documentclass{article}

\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
 index,% create 'index' glossary
 abbreviations,% create 'abbreviations' glossary
 postdot,% insert dot after descriptions
 nostyles,%don't load predefined styles
 stylemods={tree,bookindex},% load the 'tree' and 'bookindex' style packages
 style={tree}% set the default style to 'tree'
]{glossaries-extra}

\setabbreviationstyle[common]{short} % set abbreviation style before \GlsXtrLoadResources

\GlsXtrLoadResources[
 src={terms},% data in terms.bib
 label-prefix={idx.},% prefix for primary entry labels
 dual-prefix={},% prefix for dual entry labels
 type=index,% put primary entries in 'index' glossary
 combine-dual-locations={primary}% merge locations and assign to primary list
]

% provide commands that work like \gls etc for the @index entries
% (that don't have a dual counterpart)
\glsxtrnewglslike{idx.}{\idx}{\idxpl}{\Idx}{\Idxpl}

\begin{document}
\section{Sample}

First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
\gls{p2p}.

No expansion: \gls{http}.

\section{Another Sample}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.
\Idx{hippo}, \idxpl{goose} and a \idx{chateau}.

\printunsrtglossary % main glossary
\printunsrtglossary[type=abbreviations]% list of abbreviations
\printunsrtglossary[type=index,style=bookindex] % index

\end{document}

得出的结果为:

包含主要词汇表、缩写列表和索引的文档图像

必须编辑文件来用 和 替换 并不是特别方便,因此允许.bib使用进行别名,这使得将给定的条目类型视为实际上用别名类型定义的一样:@entry@dualindexentry@abbreviation@dualindexabbreviationbib2glsentry-type-aliasesbib2gls

\GlsXtrLoadResources[
 src={entries,abbrvs,generalterms},% data in entries.bib, abbrvs.bib and generalterms.bib
 label-prefix={idx.},% prefix for primary entry labels
 dual-prefix={},% prefix for dual entry labels
 type=index,% put primary entries in 'index' glossary
 combine-dual-locations={primary},% merge locations and assign to primary list
 entry-type-aliases={
   entry=dualindexentry, % make @entry behave like @dualindexentry
   abbreviation=dualindexabbreviation % make @abbreviation behave like @dualindexabbreviation
 }
]

或者,只需使用索引包之一,例如makeidximakeidx。使用 ,makeidx您将需要在构建过程中执行运行makeindex应用程序的额外步骤。这可以在之后完成(如果出现任何词汇表列表,makeglossaries则应该在之后而不是之前完成)。该包通过 shell 转义运行。makeglossaries\indeximakeidxmakeindex

例如:

\documentclass{report}

\usepackage{imakeidx}
\usepackage[abbreviations]{glossaries-extra}

\makeglossaries
\makeindex

\newglossaryentry{duck}{name=duck,
  description={a waterbird with webbed feet}}

\newglossaryentry{parrot}{name=parrot,
  description={mainly tropical bird with bright plumage}}

\newabbreviation{debs}{DEBS}{Distributed Event-Based System}
\newabbreviation{p2p}{P2P}{Peer-to-Peer}

\setabbreviationstyle[common]{short}
\newabbreviation[category=common]{http}{HTTP}{Hypertext Transfer Protocol}

\begin{document}
\chapter{Sample}

First use \gls{debs} and \gls{p2p}. Next use: \gls{debs} and
\gls{p2p}.

No expansion: \gls{http}.

\chapter{Another Sample}

A \gls{duck} and a \gls{parrot}. Lots of \glspl{duck}.

Index aardvark\index{aardvark}.

\printglossaries
\printindex

\end{document}

glossaries-extra包提供了一种方法自动索引条目,以便它们同时出现在词汇表和索引中。例如,如果我添加

\glssetcategoryattribute{common}{dualindex}{true}

到序言中,那么第 1 页引用的 HTTP 条目(已设置categorycommon)也将出现在索引中。或者,我可以使用:

\glssetcategoryattribute{common}{indexname}{true}

这将索引缩写列表中出现 HTTP 的页面。如果我想更改 encap(索引中页码的格式),那么我可以true用 encap 值替换。例如:

\glssetcategoryattribute{common}{indexname}{textbf}

词汇表有多种不同的样式,例如词汇表库

相关内容