如何有效地使用.bib 文件的论文符号列表?

如何有效地使用.bib 文件的论文符号列表?

实际上,这个问题已经在这里被问过了: 如何有效地使用符号列表进行论文?

并且有一个很好的答案,其中包含 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.bibinterpret-preamble.bibinterpret-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

(根据需要,pdflatexxelatex“等”替换。)

这将创建一个词汇表,其开头如下:

词汇表开头的图片

这将 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 后面:

从 X 到 lambda 的词汇表图像

有多种方法可以将数据拆分成单独的词汇表。第一种方法可以防止创建默认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}

在本例中,我使用了abbreviationsandsymbols包选项来创建标记为abbreviations和 的词汇表symbols。基础包提供的包选项glossaries在仅由 提供的选项之前处理glossaries-extra,因此\printunsrtglossaries现在将按以下顺序列出词汇表:(main默认)、symbolsabbreviations。您可以使用每个单独的词汇表来更改顺序\printunsrtglossary。例如:

\printunsrtglossary[type=abbreviations]
\printunsrtglossary % default main glossary
\printunsrtglossary[type=symbols]

此方法的优点是可以对符号列表 ( sort=letter-case) 使用不同的排序方法。第一个资源命令没有使用 选项设置词汇表type,因此使用默认类型。这是普通条目的默认设置,但文件中用main定义的条目在文件中使用 定义,因此它们最终会出现在词汇表中,因为已使用包选项。@abbreviation.bib\newabbreviation.glstexabbreviationsabbreviations

通过将条目拆分到多个资源命令中,可以将词汇表列表按块进行子排序。例如:

\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 

相关内容