我正在写一本包含首字母缩略词的科学文本/书籍,其中应该有一个词汇表和一个索引。问题是:哪种 LaTeX 设置最适合这个?哪些是最好的软件包,等等。
显然,有些问题是重叠的。
- 我想要一个词汇表,在其中解释一些术语或给出一句话的解释并参考详细讨论该术语的部分。
- 对于其中一些术语,使用首字母缩略词/缩写可能很常见。例如 HTTP、TCP 或道琼斯。
- 其他术语通常会写出来,但我可能想使用缩写(在某些部分),因为它们经常出现或太长。(示例:基于分布式事件的系统:DEBS 或点对点:P2P)
- 我想要一份缩写和首字母缩略词列表。
- 我还想要一个词汇表,其中包含部分但不是全部的首字母缩略词/缩写。
- 我还想有一个索引,链接到一些索引术语出现的相关页面。索引还应该能够包含词汇表或首字母缩略词列表中未出现的术语。
在寻找实现这一目标的可能性时,我发现了几种部分解决方案,但我不确定它们如何协同工作,特别是因为有些似乎重叠。
acronym
包裹- 在缩写方面似乎相当常见且强大
- 甚至可能有点过头了。
- 不清楚如何将其用于索引/词汇表目的
glossaries
包裹- 很好地支持词汇表
- 也支持首字母缩略词。但是我如何定义不应该出现在词汇表中但有些应该出现在词汇表中的首字母缩略词
- 似乎与 hyperref 配合得很好
- 使用 makeindex
- 索引
makeindex
,\index{..}
以及\printindex
- 内置于 LaTeX
- 我可以将它与词汇表包结合起来吗?
- 其他词汇表包,如
makeglos
,,,gloss
glossary
glosstex
- 其他缩写包如
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 myDoc
myDoc.tex
arara
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-lite
automake
上面的例子产生:
描述后面显示的数字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
您需要使用包选项postdot
或nopostdot=false
添加它。
sort=none
可以省略该选项(\printunsrtglossary
始终符合定义),但此选项会阻止字段的自动分配sort
,而在本例中不需要自动分配。(对于这么小的例子来说,这并不重要。)
另一种方法是使用glossaries-extra
和bib2gls
。这需要在文件中定义条目.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}
- 对于其中一些术语,使用首字母缩略词/缩写可能很常见。例如 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}
得出的结果为:
请注意,这会在第一次使用时展开,并在后续使用时使用缩写形式。(如果需要,您可以重置它。)
对于不应扩展的缩写,有三种方法:
用以下方法定义它们
\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}
将它们定义为常规术语,但使用键
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}
使用扩展包额外词汇表,允许使用不同的缩写样式。此包提供
\newabbreviation
定义一个缩写,将条目category
(由提供的新键glossaries-extra
)设置为abbreviation
,并重新定义glossaries
要与设置为(和设置为)一起\newacronym
使用的缩写\newabbreviation
category
acronym
type
\acronymtype
。缩写样式使用以下方式设置\setabbreviationstyle[
类别]{
风格}
(不是\setacronymstyle
)。类别的默认样式abbreviation
是long-short
,类别的默认样式acronym
是short
,因此我们可以只\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}
使用
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
)和缩写列表的标题。这是因为我使用了abbreviations
package 选项。如果我改用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.sty
。glossaries-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
@dualindexabbreviation
bib2gls
entry-type-aliases
bib2gls
\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
}
]
或者,只需使用索引包之一,例如makeidx
或imakeidx
。使用 ,makeidx
您将需要在构建过程中执行运行makeindex
应用程序的额外步骤。这可以在之后完成(如果出现任何词汇表列表,makeglossaries
则应该在之后而不是之前完成)。该包通过 shell 转义运行。makeglossaries
\index
imakeidx
makeindex
例如:
\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 条目(已设置category
为common
)也将出现在索引中。或者,我可以使用:
\glssetcategoryattribute{common}{indexname}{true}
这将索引缩写列表中出现 HTTP 的页面。如果我想更改 encap(索引中页码的格式),那么我可以true
用 encap 值替换。例如:
\glssetcategoryattribute{common}{indexname}{textbf}
词汇表有多种不同的样式,例如词汇表库。