glossaires-extra
我目前正在探索与 结合时提供的工具bib2gls
。但我在某些方面遇到了困难。
我必须使用多个词汇表,因此我声明了词汇表notation
和symbols
。我知道可以使用适当的包选项自动定义符号,但我将其保留为我的示例作为试验。如果可能的话,我希望将所有定义放在一个文件中,我将其命名为test-entries.bib
。这是我的第一个问题,例如,我无法使用命令type=notation
,因为它会影响此类型的所有条目。因此,我尝试使用entry-type-aliases
,但未能成功将每个条目重定向到其词汇表。警告证实了这一点:No entries defined in glossary 'notation' on line 33
。
第二点是我想symbols
按category
然后 按group
然后 按 对类型进行排序name
,但我真的不知道该怎么做,特别是当它与其他条目位于同一个文件中时。
test-entries.bib
这是MWE。:
@acronym{html,
short= {HTML},
long= {hypertext markup language},
category={inline},
}
@acronym{shtml,
short= {SHTML},
long= {server-parsed HTML},
category={footer},
}
@notation{mesh,
name={tesh},
description={this is a lattice network},
sort={m},
}
@symbol{f, %
name={\ensuremath{ f }}, %
description={a given function}, %
unit= {$\varnothing$}, %
category= {operator},
group={latin}
}
@symbol{xi, %
name={\ensuremath{ \xi }}, %
description={a space variable}, %
unit= {m}, %
category= {variable},
group={greek}
}
@symbol{fi, %
name={\ensuremath{ f_i }}, %
description={another function}, %
unit= {$\varnothing$}, %
category= {operator},
group={latin}
}
@symbol{xii, %
name={\ensuremath{ \xi_i }}, %
description={a discretized space variable}, %
unit= {m}, %
category= {variable},
group={greek}
}
@symbol{t, %
name={\ensuremath{ t }}, %
description={a time variable}, %
unit= {s}, %
category= {variable},
group={latin}
}
然后是 main.tex:
\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath,amsfonts,amssymb}
\usepackage[nomain, abbreviations, record, automake]{glossaries-extra}
%Newglossaries
\newglossary[ntg]{notation}{not}{ntn}{Notation}
\newglossary[slg]{symbols}{sym}{sbl}{Nomenclature}
% new keys must be defined before \GlsXtrLoadResources
\glsaddstoragekey{unit}{}{\glsentryunit}
% name the group greek letter
\glsxtrsetgrouptitle{greek}{Greek Symbols}
\GlsXtrLoadResources[
src={../test-entries}, % entries in symbols.bib
entry-type-aliases={symbol=symbols},
entry-type-aliases={notation=notation},
sort-field={group},% sort @symbol entries by name field
symbol-sort-fallback=name,% sort @symbol entries by name field
identical-sort-action=description,% sort by description if sort value identical
selection=all,
% type=symbols,% put these entries in the symbols glossary
save-locations=false,% location list not needed
]
\begin{document}
\printunsrtglossary[type=\glsxtrabbrvtype]
\printunsrtglossary[type=notation]
\printunsrtglossary[type=symbols]
\end{document}
答案1
大多数资源选项都不是累积的。也就是说,如果多次使用,最后一个选项通常会覆盖同名的前一个选项。这意味着:
entry-type-aliases={symbol=symbols},
entry-type-aliases={notation=notation},
相当于:
entry-type-aliases={notation=notation},
您需要在一个设置中拥有所有别名。例如:
entry-type-aliases={symbol=symbols,notation=notation},
但是,这两个别名都不起作用。第一个别名 ( symbol=symbols
) 的@symbol
行为就像它是 一样@symbols
,但 bib 条目类型不存在(而@symbol
存在)。第二个别名 ( notation=notation
) 的@notation
行为就像它是 一样@notation
,这是一个冗余指令,但 bib 条目类型也不存在。
您的 bib 文件中唯一未知的条目类型是,@notation
因此它是唯一需要别名的条目类型。我建议您将其别名为@entry
:
entry-type-aliases=
{
notation=entry,% make @notation behave like @entry
},
当您有一个包含多个词汇表中的条目的单个 bib 文件时,有多种方法可以分配类型。
第一种方法是确保原始条目类型与所需的词汇表类型匹配。这意味着词汇表标记为acronym
(to match @acronym
)、symbol
(to match @symbol
) 和notation
(to match @notation
)。这可以通过以下方式完成:
\usepackage[nomain, record, automake]{glossaries-extra}
\newglossary*{acronym}{Abbreviations}
\newglossary*{notation}{Notation}
\newglossary*{symbol}{Nomenclature}
并使用资源选项:
type={same as original entry},
type
中的选项也\printunsrtglossary
需要进行调整以匹配:
\printunsrtglossary[type=acronym]
\printunsrtglossary[type=notation]
\printunsrtglossary[type=symbol]
第二种方法是过滤条目,\GlsXtrLoadResources
每个词汇表类型都有一个条目,然后设置type
。例如:
\GlsXtrLoadResources[
src={test-entries}, % entries in test-entries.bib
type=\glsxtrabbrvtype,
match={entrytype=acronym},% only consider @acronym for selection
%... other options
]
\GlsXtrLoadResources[
src={test-entries}, % entries in test-entries.bib
entry-type-aliases=
{
notation=entry,% make @notation behave like @entry
},
type=notation,
match={entrytype=entry},% only consider @entry for selection
%... other options
]
\GlsXtrLoadResources[
src={test-entries}, % entries in test-entries.bib
type=symbols,
match={entrytype=symbol},% only consider @symbol for selection
%... other options
]
第三种方法是调整用于定义.glstex
bib2gls 创建的文件中的条目的辅助命令。文件@acronym
中使用 定义的条目在文件中使用.bib
定义。这被定义为使用,因此如果您使用了包选项(如在您的 MWE 中),那么您不必担心它(只要您不覆盖默认的)。.glstex
\bibglsnewacronym
\newacronym
abbreviations
type
.bib
使用 文件中定义的条目在使用 文件@symbol
中定义。此命令的定义在文件中如下:.glstex
\bibglsnewsymbol
.glstex
\providecommand{\bibglsnewsymbol}[4]{%
\longnewglossaryentry*{#1}{name={#3},sort={#1},category={symbol},#2}{#4}}
因此,您可以先定义此命令,\GlsXtrLoadResources
以便它明确设置type
的第二个参数\longnewglossaryentry*
。例如:
\newcommand{\bibglsnewsymbol}[4]{%
\longnewglossaryentry*{#1}{name={#3},sort={#1},category={symbol},type={symbols},#2}{#4}}
这会将定义的条目放入词汇表@symbol
中symbols
(除非明确覆盖)。
使用 定义的条目@notation
被别名为,@entry
因此它们在.glstex
文件中使用定义\bibglsnewentry
。此命令在文件中提供为.glstex
:
\providecommand{\bibglsnewentry}[4]{%
\longnewglossaryentry*{#1}{name={#3},#2}{#4}%
}
再次,您可以先定义此命令,\GlsXtrLoadResources
以便明确设置词汇表类型:
\newcommand{\bibglsnewentry}[4]{%
\longnewglossaryentry*{#1}{name={#3},type={notation},#2}{#4}%
}
这种方法意味着您不需要更改词汇表定义(\newglossary
),并且不需要使用选项列表type
中的选项\GlsXtrLoadResources
。
关于排序,您可以有一个提供排序值的主字段(sort-field
),并且您可以有一个排序值相同的后备字段(identical-sort-action
),但如果第一个后备字段也相同,您就不能有第二个后备字段。
您已将排序字段更改为group
:
sort-field={group}
并group
为文件中的部分(但不是全部)条目提供了一个字段.bib
。它存在于所有@symbol
条目中,这意味着任何@symbol
条目都不会缺少排序值,因此选项:
symbol-sort-fallback=name
是多余的,因为永远不需要回退到另一个字段。
的变化sort-field
意味着没有条目根据字段排序sort
(因为默认sort-field=sort
已切换为sort-field=group
)。这意味着sort
您的条目中设置的字段:
@notation{mesh,
name={tesh},
description={this is a lattice network},
sort={m},
}
什么都不做。(顺便问一下,你的意思是“mesh”而不是“tesh”吗?)用于排序的字段现在是,group
但该字段尚未设置,并且没有后备字段可以代替它。(@notation
别名为@entry
,因此symbol-sort-fallback
不适用。)
我建议采用不同的方法。您可以从其他条目中过滤掉符号,并应用不同的排序和分组方式。第一个资源集只能处理使用默认的正常字母排序的条目sort-field=sort
,其中缺少的sort
字段将回退到使用(带有别名)name
定义的条目的字段和使用定义的条目的字段:@entry
@notation
notation=entry
short
@acronym
\GlsXtrLoadResources[
src={test-entries}, % entries in test-entries.bib
entry-type-aliases=
{
notation=entry,% make @notation behave like @entry
},
type={same as original entry},
selection=all,
match={entrytype=(acronym|entry)},% only select @acronym and @entry
save-locations=false,% location list not needed
]
这将过滤掉条目,以便仅使用以下方式选择@acronym
和@entry
条目:
match={entrytype=(acronym|entry)},% only select @acronym and @entry
在此示例中,另一种方法是使用以下方法进行过滤@symbol
:
not-match={entrytype=symbol},% don't select @symbol
这比较简单。然后第二个资源集可以使用:
match={entrytype=symbol},% only select @symbol
仅选择@symbol
并过滤掉所有其他条目。
您已使用以下方式分配群组标题:
\glsxtrsetgrouptitle{greek}{Greek Symbols}
但您实际上并没有使用显示组标题的词汇表样式。即使您确实使用了组样式,如果您不能确保排序会导致条目根据组被阻止,结果也会很奇怪。该group
字段通常由 sort 方法分配以确保这一点,但如果您明确设置该group
字段,则无法保证您不会分散组。
我想按然后按 然后 按 对
symbols
类型进行排序category
group
name
正如我已经提到的,您不能按三个字段进行排序,但是如果您的group
字段是全部latin
,greek
那么对字段进行字符代码排序name
将自动分隔拉丁字符和希腊字符,所以我不认为您实际上需要group
在文件中设置字段.bib
(特别是如果您没有使用组词汇表样式)。
假设文件test-entries.bib
现在是:
@acronym{html,
short= {HTML},
long= {hypertext markup language},
category={inline}
}
@acronym{shtml,
short= {SHTML},
long= {server-parsed HTML},
category={footer}
}
@notation{mesh,
name={mesh},
description={this is a lattice network}
}
@symbol{f, %
name={\ensuremath{ f }}, %
description={a given function}, %
unit= {$\varnothing$}, %
category= {operator}
}
@symbol{xi, %
name={\ensuremath{ \xi }}, %
description={a space variable}, %
unit= {m}, %
category= {variable}
}
@symbol{fi, %
name={\ensuremath{ f_i }}, %
description={another function}, %
unit= {$\varnothing$}, %
category= {operator}
}
@symbol{xii, %
name={\ensuremath{ \xi_i }}, %
description={a discretized space variable}, %
unit= {m}, %
category= {variable}
}
@symbol{t, %
name={\ensuremath{ t }}, %
description={a time variable}, %
unit= {s}, %
category= {variable}
}
然后完整的 MWE(使用分配的第一种方法type
)是:
\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{amsmath,amsfonts,amssymb}
\usepackage[nomain, record, automake]{glossaries-extra}
\newglossary*{acronym}{Abbreviations}
\newglossary*{notation}{Notation}
\newglossary*{symbol}{Nomenclature}
% new keys must be defined before \GlsXtrLoadResources
\glsaddstoragekey{unit}{}{\glsentryunit}
\GlsXtrLoadResources[
src={test-entries}, % entries in test-entries.bib
entry-type-aliases=
{
notation=entry,% make @notation behave like @entry
},
type={same as original entry},
selection=all,
not-match={entrytype=symbol},% don't select @symbol
save-locations=false,% location list not needed
]
\GlsXtrLoadResources[
src={test-entries}, % entries in test-entries.bib
type={same as original entry},
sort-field=category,
identical-sort-action=name,% sort by name if category is identical
selection=all,
save-locations=false,% location list not needed
match={entrytype=symbol},% only select @symbol
sort={letter-nocase}
]
\begin{document}
\printunsrtglossary[type=acronym]
\printunsrtglossary[type=notation]
\printunsrtglossary[type=symbol]
\end{document}
缩写列表如下:
符号列表如下:
符号列表如下:
如果您想用标题细分,那么最好使用字段category
而不是group
字段(因为sort-field=category
可以确保类别块不间断)。这可以通过替换来实现:
\printunsrtglossary[type=symbol]
和:
\printunsrtglossary*[type=symbol,style=indexgroup]
{%
\renewcommand{\glsxtrgroupfield}{category}%
}
现在生成:
您仍然可以使用\glsxtrsetgrouptitle
来设置组标题:
\printunsrtglossary*[type=symbol,style=indexgroup]
{%
\glsxtrsetgrouptitle{operator}{Operators}%
\glsxtrsetgrouptitle{variable}{Variables}%
\renewcommand{\glsxtrgroupfield}{category}%
}
生成结果: