在一个 bib 文件中管理多个词汇表

在一个 bib 文件中管理多个词汇表

glossaires-extra我目前正在探索与 结合时提供的工具bib2gls。但我在某些方面遇到了困难。

我必须使用多个词汇表,因此我声明了词汇表notationsymbols。我知道可以使用适当的包选项自动定义符号,但我将其保留为我的示例作为试验。如果可能的话,我希望将所有定义放在一个文件中,我将其命名为test-entries.bib。这是我的第一个问题,例如,我无法使用命令type=notation,因为它会影响此类型的所有条目。因此,我尝试使用entry-type-aliases,但未能成功将每个条目重定向到其词汇表。警告证实了这一点:No entries defined in glossary 'notation' on line 33

第二点是我想symbolscategory然后 按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
]

第三种方法是调整用于定义.glstexbib2gls 创建的文件中的条目的辅助命令。文件@acronym中使用 定义的条目在文件中使用.bib定义。这被定义为使用,因此如果您使用了包选项(如在您的 MWE 中),那么您不必担心它(只要您不覆盖默认的)。.glstex\bibglsnewacronym\newacronymabbreviationstype

.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}}

这会将定义的条目放入词汇表@symbolsymbols(除非明确覆盖)。

使用 定义的条目@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@notationnotation=entryshort@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类型进行排序categorygroupname

正如我已经提到的,您不能按三个字段进行排序,但是如果您的group字段是全部latingreek那么对字段进行字符代码排序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}

缩写列表如下:

缩写 HTML 超文本标记语言 SHTML 服务器解析的 HTML

符号列表如下:

符号网格这是一个格子网络

符号列表如下:

命名法 fa 给定函数 fi 另一个函数 ta 时间变量 ξ 空间变量 ξi 离散空间变量

如果您想用标题细分,那么最好使用字段category而不是group字段(因为sort-field=category可以确保类别块不间断)。这可以通过替换来实现:

\printunsrtglossary[type=symbol]

和:

\printunsrtglossary*[type=symbol,style=indexgroup]
{%
  \renewcommand{\glsxtrgroupfield}{category}%
}

现在生成:

命名法 运算符 fa 给定函数 fi 另一个函数变量 ta 时间变量 ξ 空间变量 ξi 离散空间变量

您仍然可以使用\glsxtrsetgrouptitle来设置组标题:

\printunsrtglossary*[type=symbol,style=indexgroup]
{%
  \glsxtrsetgrouptitle{operator}{Operators}%
  \glsxtrsetgrouptitle{variable}{Variables}%
  \renewcommand{\glsxtrgroupfield}{category}%
}

生成结果:

命名法 运算符 fa 给定函数 fi 另一个函数 变量 ta 时间变量 ξ 空间变量 ξi 离散空间变量

相关内容