词汇表 对一个词汇表进行特殊排序

词汇表 对一个词汇表进行特殊排序

在我的文档中,我使用了几个词汇表,其中一个用于命名。我对这个词汇表的排序有一些特殊的要求。实现我想要的最简单的方法是,如果我可以sort=def只提供一个词汇表的选项,但据我所知,这只能作为包选项提供。

因此我想我可能必须写自己的规则。由于我对 xindy 没有任何经验,我想知道以下规则是否是一个很好的起点。

我想要的是:

  1. X以...为前缀的术语#紧随其后X
  2. 如果术语X后面有下划线,则该术语紧跟在术语后面X和前面#X

例子

 X
#X
 X_index
#X_index
 Xindex
#Xindex

我觉得以下规则可能是合理的这里

(merge-rule "<startOfLine>\#"(.*)<endOfLine>" "\1~e")
(merge-rule "<startOfLine>(.*[^~e])<endOfLine>" "\1~b")
(merge-rule "_" "~b")

我不确定如何使用第一条规则强制匹配整行。我也不确定如何does not end with last character在第二条规则中制定位。第二条规则旨在防止\#X落后Xa

此外,我查看了samplexdy.tex词汇表包(docfolder/samples),并注意到相应的 xindy 文件看起来巨大的,因此,任何关于我在哪里插入规则或我真正需要什么的指示都将不胜感激。我该如何指示glossaries我只想将修改后的 xindy 文件用于多个词汇表中的一个词汇表?

答案1

来自glossaries版本 4.04,现在可以使用不同的排序方法,但前提是使用\makenoidxglossaries选项使用 TeX 进行排序:

\documentclass{article}

\usepackage[nopostdot,nogroupskip]{glossaries}

\newglossary{nomen}{}{}{Nomenclature}

\makenoidxglossaries

% main glossary

\newglossaryentry{goose}{name={goose},description={}}
\newglossaryentry{zebra}{name={zebra},description={}}
\newglossaryentry{duck}{name={duck},description={}}
\newglossaryentry{aardvark}{name={aardvark},description={}}

% nomenclature
\newglossaryentry{X}{type=nomen,name={X},description={}}
\newglossaryentry{hashX}{type=nomen,name={\#X},description={}}
\newglossaryentry{X-index}{type=nomen,name={X\_index},description={}}
\newglossaryentry{hashX-index}{type=nomen,name={\#X\_index},description={}}
\newglossaryentry{Xindex}{type=nomen,name={Xindex},description={}}
\newglossaryentry{hashXindex}{type=nomen,name={\#Xindex},description={}}

\begin{document}
Test document.

\glsaddall

\printnoidxglossary[sort=word]

\printnoidxglossary[type=nomen,sort=def]

\end{document}

(需要运行两次 LaTeX 才能显示词汇表。)这将产生:

生成的词汇表的图像

这里的缺点是,当使用此方法进行字母排序时,它会非常慢,按字符代码排序,并且如果排序值包含命令,则会出现问题。glossaries-extra扩展包提供了一种混合方法,允许您使用makeindex/xindy进行字母排序,并使用“noidx”方法按用途/定义排序。

\documentclass{article}

\usepackage[nogroupskip]{glossaries-extra}

\newglossary{nomen}{}{}{Nomenclature}

\makeglossaries[main]

% main glossary

\newglossaryentry{goose}{name={goose},description={}}
\newglossaryentry{zebra}{name={zebra},description={}}
\newglossaryentry{duck}{name={duck},description={}}
\newglossaryentry{aardvark}{name={aardvark},description={}}

% nomenclature
\newglossaryentry{X}{type=nomen,name={X},description={}}
\newglossaryentry{hashX}{type=nomen,name={\#X},description={}}
\newglossaryentry{X-index}{type=nomen,name={X\_index},description={}}
\newglossaryentry{hashX-index}{type=nomen,name={\#X\_index},description={}}
\newglossaryentry{Xindex}{type=nomen,name={Xindex},description={}}
\newglossaryentry{hashXindex}{type=nomen,name={\#Xindex},description={}}

\begin{document}
Test document.

\glsaddall

\printglossary

\printnoidxglossary[type=nomen,sort=def]

\end{document}

的可选参数\makeglossaries应为词汇表标签列表,用于标识需要排序的词汇表makeindex(或xindy如果xindy使用了包选项)。任何剩余的词汇表(nomen在本例中)都被视为\makenoidxglossaries已使用。结果与上一个示例相同,但构建过程需要包含makeindex/ xindy(明确包含或通过辅助脚本makeglossaries或包含makeglossaries-lite)。makeglossaries和都makeglossaries-lite可以从文件中检测到,对于此示例,.aux只有词汇表需要处理。main

还有第三种方法,即glossaries-extra使用bib2gls。这需要对文档进行一些修改,因为现在必须在一个或多个.bib文件中定义条目。

例如,文件entries.bib可能包含字母条目。如果条目有描述,则可以使用@entry

@entry{goose,
  name={goose},
  plural={geese},
  description={long-necked waterbird}
}

如果条目没有描述,您可以使用@index

@index{goose,
  name={goose},
  plural={geese}
}

如果@index字段name与标签完全匹配,则可以省略它:

@index{goose,
  plural={geese}
}

(您不能用 执行此操作@entry。)如果您使用 XeLaTeX 或 LuaLaTeX,则标签只能包含 UTF-8 字符。

因此这里是entries.bib

@index{goose,
 plural={geese}
}

@index{zebra}

@index{duck}

@index{aardvark}

其它条目可以用 定义@entry。例如:

@entry{X,
  name={X},
  description={}
}

但由于这些条目就像符号,因此您可以改用@symbol(与 一样@index,不需要字段description):

@symbol{X,
  name={X}
}

这里是symbols.bib

@symbol{X,
  name={X}
}

@symbol{hashX,
  name={\#X}
}

@symbol{X-index,
  name={X\_index}
}

@symbol{hashX-index,
  name={\#X\_index}
}

@symbol{Xindex,
  name={Xindex}
}

@symbol{hashXindex,
  name={\#Xindex}
}

文档现在如下所示:

\documentclass{article}

\usepackage[record,% use bib2gls
 nogroupskip]{glossaries-extra}

\newglossary{nomen}{}{}{Nomenclature}

\GlsXtrLoadResources[
  src={entries}, % terms defined in entries.bib
  type={main}, % put these terms in the 'main' glossary
  save-locations=false,% no location list required
  selection={all}% select all terms
]

\GlsXtrLoadResources[
  src={symbols}, % terms defined in symbols.bib
  type={nomen}, % put these terms in the 'nomen' glossary
  sort=none,% don't sort
  save-locations=false,% no location list required
  selection={all}% select all terms
]


\begin{document}
Test document.

\printunsrtglossaries

\end{document}

如果调用该文件myDoc.tex则文档构建为:

pdflatex myDoc
bib2gls myDoc
pdflatex myDoc

(如果您想要字母组,您需要bib2gls -gbib2gls --group。)

生成的文档不会显示我使用的位置save-locations=false。如果您想要位置,请忽略该选项。如果您只想选择文档中使用过的条目,请忽略selection=all

文件图像

默认行为是按文档区域设置排序。在此示例中,区域设置尚未设置,因此bib2gls将返回系统区域设置(对我来说是en-GB)。您可以指定不同的语言/区域设置,例如,sort=de-CH-1996sort=pt-BRsort=en。使用获得定义顺序sort=none。还有其他可用的排序方法。

相关内容