实际上,这个问题已经在这里被问过了: 如何有效地使用符号列表进行论文?
并且有一个很好的答案,其中包含 4 种方法。
然而...
非常感谢您的帖子,非常有趣!我正在尝试在 Overleaf.com 上实现方法 4,但遇到了一些问题……有谁能帮我吗?
我按照上面的例子创建了一个文件“greek-symbols.bib”,正如上面所述。然后我创建了一个“symbols.tex”文件:
\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
]
在 main.tex 中,我调用此文件、设置并构建文档(例如):
\input{head/settings.tex} % place your packages, etc... in this file!
\input{symbols.tex}
\begin{document}
\tableofcontents
\listoftables
% Symbols
\printunsrtglossary[type=symbols,style=long,title={List of Symbols}]
\chapter{Mathematics}
Some symbols
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$, $\gls{F}$.
\end{document}
但问题是我收到以下错误:
包 gloassaries-extra 警告:输入第 13 行没有文件“output.glstex”。
如果我看第 13 行,它对应于命令的结束
\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
]
这是怎么回事?为什么严格按照示例操作却不起作用?
如果有人能帮助我,我将非常感激。
谨致问候,Elfo
答案1
.bib
我将使用随附的一些示例文件进行演示bib2gls
。
mathgreek.bib
定义一些示例符号,这些符号都是数学希腊字符。LaTeX 内核不提供与拉丁字符相同的希腊字符的命令。这可以追溯到资源有限的时代,例如,omicron 可以简单地用 生成$o$
。不幸的是,从排序的角度来看,这会导致 omicron 被放置在 N 和 P 之间,而不是 Xi 和 Pi 之间。
使用的解释器bib2gls
识别缺失的命令\omicron
等,因此可以正确地将它们与其他数学希腊命令排序。但是,LaTeX 也必须识别它们。glossaries-extra-bib2gls
包(自动加载\usepackage[record]{glossaries-extra}
)现在提供这些缺失的命令。mathgreek.bib
示例文件允许使用不提供它们的旧版本,并使用@preamble
提供的定义\omicron
:
@preamble{"\providecommand{\omicron}{o}"}
条目使用 定义@symbol
。该identifier
字段是默认无法识别的自定义字段 bib2gls
,但可以根据每个文档提供或别名该字段。这只会使文件.bib
在多个文档中更广泛地发挥作用。前几个条目是:
@symbol{alpha,
name={\ensuremath{\alpha}},
description={alpha},
identifier={mathgreek}
}
@symbol{beta,
name={\ensuremath{\beta}},
description={beta},
identifier={mathgreek}
}
其余条目遵循相同的格式。
mathsobjects.bib
相当复杂。它首先提供一些语义命令来格式化符号:
@preamble{"\providecommand{\setfmt}[1]{\mathcal{#1}}
\providecommand{\setcontentsfmt}[1]{\{#1\}}
\providecommand{\setmembershipfmt}[2]{\setcontentsfmt{#1: #2}}
\providecommand{\setmembershiponeargfmt}[1]{\setmembershipfmt#1}
\providecommand{\setcardfmt}[1]{\lvert#1\rvert}
\providecommand{\numspacefmt}[1]{\mathbb{#1}}
\providecommand{\transposefmt}[1]{#1^T}
\providecommand{\invfmt}[1]{#1^{-1}}
\providecommand{\vecfmt}[1]{\boldsymbol{#1}}
\providecommand{\mtxfmt}[1]{\boldsymbol{#1}}"}
因此,例如,\setfmt
将其参数格式化为书法字体以表示一组。前三个条目定义为:
@symbol{set,
name={\ensuremath{\setfmt{S}}},
description={\sortart{a}{set}},
format={setfmt},
identifier={set}
}
@symbol{setcontents,
name={\ensuremath{\setcontentsfmt{\ldots}}},
description={set contents},
format={setcontentsfmt},
identifier={set}
}
@symbol{setmembership,
name={\ensuremath{\setmembershipfmt{\vecfmt{x}}{\ldots}}},
description={set membership},
format={setmembershiponeargfmt},
identifier={set}
}
其他条目的定义方式类似。再次identifier
使用自定义字段,bib2gls
默认情况下将忽略该字段。还有另一个自定义字段,称为format
,用于存储控制序列的名称,该控制序列采用单个参数来应用适当的格式。默认情况下,这也将被忽略。
baseunits.bib
使用自定义条目类型 ( @unit
),因此bib2gls
将忽略此文件中的所有条目,除非设置了别名。这意味着使用同一.bib
文件的不同文档可以使用最合适的条目类型。例如,如果需要将文档@unit
视为@symbol
,则该文档需要设置别名:
entry-type-aliases={unit=symbol}
或者应该@unit
被视为@entry
:
entry-type-aliases={unit=entry}
前几个条目定义为:
@unit{ampere,
unitname={ampere},
unitsymbol={\si{\ampere}},
measurement={electric current},
identifier={baseunit}
}
@unit{kilogram,
unitname={kilogram},
unitsymbol={\si{\kilogram}},
measurement={mass},
identifier={baseunit}
}
@unit{metre,
unitname={metre},
unitsymbol={\si{\metre}},
measurement={length},
identifier={baseunit}
}
其他条目都遵循相同的格式。在这种情况下,所有字段都是bib2gls
默认忽略的自定义字段,因此需要为它们指定别名。这再次允许在使用同一.bib
文件的多个文档之间实现更大的灵活性。
makruplanguages.bib
@entry
有普通条目 ( ) 和缩写 ( )的混合@abbreviation
。这提供了一个用于标记缩写首字母的自定义命令。默认情况下,这只是执行其参数:
@preamble{"\providecommand{\abbrvtag}[1]{#1}"}
该.bib
文件还为方便起见定义了一个 bib 变量:
@string{markuplang="\abbrvtag{m}arkup \abbrvtag{l}anguage"}
此变量仅供在.bib
文件中使用。字符串连接是在文件#
中执行的.bib
。例如:
long = {e\abbrvtag{x}tensible } # markuplang
相当于:
long = {e\abbrvtag{x}tensible \abbrvtag{m}arkup \abbrvtag{l}anguage}
前几项是:
@entry{TeX,
name={{}\TeX},
description={a format for describing complex type and page layout
often used for mathematics, technical, and academic publications},
identifier={markuplanguage}
}
@entry{LaTeX,
name={{}\LaTeX},
description={a format of \glstext{TeX} designed to separate
content from style},
identifier={markuplanguage}
}
@entry{markdown,
name={markdown},
description={a lightweight markup language with plain text
formatting syntax},
identifier={markuplanguage}
}
@abbreviation{xml,
short={XML},
long={e\abbrvtag{x}tensible }#markuplang,
description={a markup language that defines a set of rules for
encoding documents},
identifier={markuplanguage}
}
@abbreviation{html,
short={HTML},
long={\abbrvtag{h}yper\abbrvtag{t}ext }#markuplang,
description={the standard markup language for creating web pages},
identifier={markuplanguage}
}
和{}
前面的空组是为了防止应用任何自动首字母大写命令,因为它不适合这些命令。\TeX
\LaTeX
一些示例.bib
文件使用自定义命令,例如\sortart
。有三个不同的.bib
文件提供这些命令:no-interpret-preamble.bib
,interpret-preamble.bib
和interpret-preamble2.bib
。现在,我只想使用no-interpret-preamble.bib
包含以下内容的内容:
@preamble{"\providecommand{\sortname}[2]{#1 #2}
\providecommand{\sortvonname}[3]{#1 #2 #3}
\providecommand{\sortart}[2]{#1 #2}
\providecommand{\sortmediacreator}[2]{#1 #2}"}
第一个示例文档只有一个列表可供使用。该mathsobjects.bib
文件包含由 提供的命令amssymb
,而该baseunits.bib
文件包含由 提供的命令siunitx
,因此需要加载这些包:
\documentclass{report}
\usepackage{amssymb}
\usepackage{siunitx}
\usepackage[record]{glossaries-extra}
% always set the abbreviation style before \GlsXtrLoadResources
\setabbreviationstyle{long-short-desc}
\GlsXtrLoadResources[
src={no-interpret-preamble,mathgreek,mathsobjects,baseunits,markuplanguages},% bib files
sort={en-GB},% sort according to this locale
entry-type-aliases={unit=entry},% make @unit behave like @entry
field-aliases={
unitname=name,
unitsymbol=symbol,
measurement=description
},
selection=all% select all entries in the .bib files
]
\begin{document}
\printunsrtglossaries
\end{document}
如果调用该文件test.tex
则文档构建为:
pdflatex test
bib2gls test
pdflatex test
(根据需要,pdflatex
用xelatex
“等”替换。)
这将创建一个词汇表,其开头如下:
这将 beta (β) 置于“安培”和“坎德拉”之间。排序值由条目类型决定。例如,如果条目定义为 ,@entry
则排序值从字段中获取name
;如果条目定义为 ,@abbreviation
则排序值从字段中获取short
;如果条目定义为 ,@symbol
则排序值从标签中获取。因此,β 实际上是按其标签排序的beta
。
@symbol
您可以使用选项更改用于获取条目默认排序值的字段symbol-sort-fallback
。例如,要改用该name
字段:
symbol-sort-fallback=name
(对于缩写,可以使用abbreviation-sort-fallback
。)下面是上述 MWE 的修改版本,它根据字段对符号进行排序name
:
\documentclass{report}
\usepackage{amssymb}
\usepackage{siunitx}
\usepackage[record]{glossaries-extra}
% always set the abbreviation style before \GlsXtrLoadResources
\setabbreviationstyle{long-short-desc}
\GlsXtrLoadResources[
src={no-interpret-preamble,mathgreek,mathsobjects,baseunits,markuplanguages},% bib files
sort={en-GB},% sort according to this locale
entry-type-aliases={unit=entry},% make @unit behave like @entry
field-aliases={
unitname=name,
unitsymbol=symbol,
measurement=description
},
symbol-sort-fallback=name,
selection=all% select all entries in the .bib files
]
\begin{document}
\printunsrtglossaries
\end{document}
词汇表的开头现在看起来像:
希腊字母现在位于 Z 后面:
有多种方法可以将数据拆分成单独的词汇表。第一种方法可以防止创建默认main
词汇表(使用nomain
包选项),并定义三个词汇表,其标签与条目类型相对应(不带首字母@
)。这意味着可以使用以下方式轻松分配类型:
type={same as entry}
以下是更新后的 MWE:
\documentclass{report}
\usepackage{amssymb}
\usepackage{siunitx}
\usepackage[record,nomain]{glossaries-extra}
\newglossary*{entry}{Glossary}
\newglossary*{abbreviation}{Abbreviations}
\newglossary*{symbol}{Symbols}
% always set the abbreviation style before \GlsXtrLoadResources
\setabbreviationstyle{long-short-desc}
\GlsXtrLoadResources[
src={no-interpret-preamble,mathgreek,mathsobjects,baseunits,markuplanguages},% bib files
sort={en-GB},% sort according to this locale
entry-type-aliases={unit=entry},% make @unit behave like @entry
field-aliases={
unitname=name,
unitsymbol=symbol,
measurement=description
},
symbol-sort-fallback=name,
type={same as entry},
selection=all% select all entries in the .bib files
]
\begin{document}
\printunsrtglossaries
\end{document}
该文件现在有三个列表。第一个是entry
词汇表:
第二个是abbreviation
词汇表:
第三个是symbol
词汇表,其开头为:
希腊字符再次出现在 Z 之后。
\makeglossaries
与方法(使用makeindex
或)不同xindy
,此方法只有两个关联的词汇表文件:.glstex
由 输入的\GlsXtrLoadResources
和.glg
抄本文件(包含来自 的消息bib2gls
)。使用makeindex
/xindy
时,包含三个词汇表列表的文档将有 10 个相应的词汇表文件(每个词汇表 3 个加上样式文件)。
使用 时bib2gls
,决定相关词汇表文件数量的不是词汇表数量,而是\GlsXtrLoadResources
命令数量。以下是上述方法的替代方法,它使用两个资源命令:
\documentclass{report}
\usepackage{amssymb}
\usepackage{siunitx}
\usepackage[record,abbreviations,symbols]{glossaries-extra}
% always set the abbreviation style before \GlsXtrLoadResources
\setabbreviationstyle{long-short-desc}
\GlsXtrLoadResources[
src={no-interpret-preamble,markuplanguages},% bib files
sort={en-GB},% sort according to this locale
selection=all% select all entries in the .bib files
]
\GlsXtrLoadResources[
src={mathgreek,mathsobjects,baseunits},% bib files
sort={letter-case},% sort according Unicode value
entry-type-aliases={unit=entry},% make @unit behave like @entry
field-aliases={
unitname=name,
unitsymbol=symbol,
measurement=description
},
symbol-sort-fallback=name,
type=symbols,
selection=all% select all entries in the .bib files
]
\begin{document}
\printunsrtglossaries
\end{document}
在本例中,我使用了abbreviations
andsymbols
包选项来创建标记为abbreviations
和 的词汇表symbols
。基础包提供的包选项glossaries
在仅由 提供的选项之前处理glossaries-extra
,因此\printunsrtglossaries
现在将按以下顺序列出词汇表:(main
默认)、symbols
、abbreviations
。您可以使用每个单独的词汇表来更改顺序\printunsrtglossary
。例如:
\printunsrtglossary[type=abbreviations]
\printunsrtglossary % default main glossary
\printunsrtglossary[type=symbols]
此方法的优点是可以对符号列表 ( sort=letter-case
) 使用不同的排序方法。第一个资源命令没有使用 选项设置词汇表type
,因此使用默认类型。这是普通条目的默认设置,但文件中用main
定义的条目在文件中使用 定义,因此它们最终会出现在词汇表中,因为已使用包选项。@abbreviation
.bib
\newabbreviation
.glstex
abbreviations
abbreviations
通过将条目拆分到多个资源命令中,可以将词汇表列表按块进行子排序。例如:
\documentclass{report}
\usepackage{amssymb}
\usepackage{siunitx}
\usepackage[record,abbreviations,symbols]{glossaries-extra}
% always set the abbreviation style before \GlsXtrLoadResources
\setabbreviationstyle{long-short-desc}
\GlsXtrLoadResources[
src={no-interpret-preamble,markuplanguages},% bib files
sort={en-GB},% sort according to this locale
selection=all% select all entries in the .bib files
]
\GlsXtrLoadResources[
src={baseunits},% bib file
sort={letter-case},% sort according Unicode value
entry-type-aliases={unit=entry},% make @unit behave like @entry
field-aliases={
unitname=name,
unitsymbol=symbol,
measurement=description
},
symbol-sort-fallback=name,
type=symbols,
selection=all% select all entries in the .bib files
]
\GlsXtrLoadResources[
src={mathsobjects},% bib file
sort={letter-case},% sort according Unicode value
symbol-sort-fallback=name,
type=symbols,
selection=all% select all entries in the .bib files
]
\GlsXtrLoadResources[
src={mathgreek},% bib file
sort={letter-case},% sort according Unicode value
symbol-sort-fallback=name,
type=symbols,
selection=all% select all entries in the .bib files
]
\begin{document}
\printunsrtglossaries
\end{document}
符号列表现在以单位开头:
在这种情况下,我已经使用了sort=letter-case
所有子块,但可以对每个块使用不同的排序方法。
假设我现在想要切换到显示字母组标题的词汇表样式,例如以下treegroup
样式:
\usepackage[record,abbreviations,symbols,stylemods={tree},style=treegroup]{glossaries-extra}
现在bib2gls
需要使用--group
(或-g
)开关运行:
bib2gls --group test
如果对 MWE 进行上述更改,则会导致如下错误:
! Package inputenc Error: Unicode character