当使用 TeXing 对附加的 MWExindy
进行排序时,希腊文条目排在拉丁字母“R”和“S”之间,而当不使用时,它们排在拉丁字母之后xindy
。如何通过
- 或者按照拉丁字母排序(例如
makeindex
) - 或者按照拉丁字母之前进行排序?
% ----- minimal example -----
\documentclass{scrartcl}
\usepackage{luatex85} % <-- only needed for LuaLaTeX
\usepackage{longtable}
\usepackage[
automake,
nomain,
nonumberlist,
symbols,
% comment next `key-value` and Greek Letters are sorted
% after the Latin Letters
xindy={
codepage=utf8,
},
]{glossaries-extra}
\makeglossaries
\renewcommand*{\glspostdescription}{}
\newglossarystyle{symbver}{
% change length of `\glsdescwidth'
\setlength{\glsdescwidth}{8cm}
% put the glossary in a longtable environment:
\renewenvironment{theglossary}
{\begin{longtable}[l]{lp{\glsdescwidth}r}}
{\end{longtable}}
% No heading between groups:
\renewcommand*{\glsgroupheading}[1]{}
% Set the table’s header:
\renewcommand*{\glossaryheader}{}
\renewcommand*{\glsresetentrylist}{}
% Main (level 0) entries displayed in a row optionally numbered:
\renewcommand*{\glossentry}[2]{%
\tabularnewline % start with empty row
\rlap{%
\glsentryitem{##1}% Entry number if required
\glstarget{##1}{\glossentryname{##1}}% Name
}
\tabularnewline % end of row
}
% Similarly for sub-entries (no sub-entry numbers):
\renewcommand*{\subglossentry}[3]{%
% ignoring first argument (sub-level)
\glstarget{##2}{\glossentryname{##2}}% Name
& \glossentrydesc{##2}% Description
& \glossentrysymbol{##2}% Unit
\tabularnewline % end of row
}
% Nothing between groups:
\renewcommand*{\glsgroupskip}{}
}
\newglossaryentry{subscripts}{
type=symbols,
name={\textbf{Subscripts}},
description={\nopostdesc},
sort=d,
}
\newglossaryentry{symb:sub:alpha}{
type=symbols,
name=$\alpha$,
description={entry},
symbol={},
sort=α:entry,
parent=subscripts,
}
\newglossaryentry{symb:sub:omega}{
type=symbols,
name=$\omega$,
description={exit},
symbol={},
sort=ω:exit,
parent=subscripts,
}
\newglossaryentry{symb:sub:relative}{
type=symbols,
name=rel,
description={relative},
symbol={},
sort=r:relative,
parent=subscripts,
}
\newglossaryentry{symb:sub:saturation}{
type=symbols,
name=sat,
description={saturation},
symbol={},
sort=s:saturation,
parent=subscripts,
}
\begin{document}
\glsaddall[types={symbols}]
\printsymbols[
style=symbver,
]
\end{document}
% ---------------------------
答案1
xindy
这似乎是子条目排序方式的问题。它不是特定于glossaries
包的。
分析
下面是一个更简单的例子:
\documentclass{article}
\usepackage{fontspec}
\usepackage{makeidx}
\setmainfont{Liberation Serif}
\makeindex
\newcommand*{\lettergroupDefault}[1]{\lettergroup{#1}}
\begin{document}
α\index{α}
ω\index{ω}
r\index{r}
s\index{s}
\printindex
\end{document}
假设这个文档的名字是test.tex
:
lualatex test
texindy -L english -C utf8 -o test.ind test.idx
lualatex test
生成:
这是因为xindy
已被指示按照英文字母(一种拉丁字母)进行排序,所以非拉丁字符被放入“默认”组中,因为该english
模块对它们没有规则。
如果你要这样做:
lualatex test
texindy -L greek -C utf8 -o test.ind test.idx
lualatex test
那么索引如下所示:
现在xindy
已被指示按照希腊字母进行排序,因为希腊字母没有拉丁字符的规则,所以它们被放在“默认”组中。
假设现在你尝试:
lualatex test
texindy -L russian -C utf8 -o test.ind test.idx
lualatex test
那么所有拉丁字符和希腊字符都会归入“默认”组:
这是因为xindy
现在已经按照西里尔字母进行教学,并且没有拉丁字母或希腊字母的规则。
回到glossaries
,这里是重写的索引示例:
\documentclass{article}
\usepackage{fontspec}
\usepackage[xindy]{glossaries}
\setmainfont{Liberation Serif}
\makeglossaries
\newglossaryentry{α}{name={α},description={alpha}}
\newglossaryentry{ω}{name={ω},description={omega}}
\newglossaryentry{r}{name={r},description={r}}
\newglossaryentry{s}{name={s},description={s}}
\begin{document}
\gls{α}
\gls{ω}
\gls{r}
\gls{s}
\printglossary[style=indexgroup]
\end{document}
现在:
lualatex test
makeglossaries test
lualatex test
生成:
因为它使用的是英文排序规则。
到目前为止,这还不错,但子条目似乎表现不同。对上述示例进行轻微调整即可说明这一点:
\documentclass{article}
\usepackage{fontspec}
\usepackage[xindy]{glossaries}
\setmainfont{Liberation Serif}
\makeglossaries
\newglossaryentry{d}{name={d},description={parent}}
\newglossaryentry{α}{name={α},description={alpha},parent=d}
\newglossaryentry{ω}{name={ω},description={omega},parent=d}
\newglossaryentry{r}{name={r},description={r},parent=d}
\newglossaryentry{s}{name={s},description={s},parent=d}
\begin{document}
\gls{α}
\gls{ω}
\gls{r}
\gls{s}
\printglossary[style=indexgroup]
\end{document}
这会导致您注意到奇怪的顺序。我不知道为什么它会将条目放在r
子条目中的希腊字母之前,但如果我将语言切换回希腊语,它的行为就会符合预期:
\documentclass{article}
\usepackage{fontspec}
\usepackage[xindy={language=greek,glsnumbers=false}]{glossaries}
\setmainfont{Liberation Serif}
\makeglossaries
\newglossaryentry{d}{name={d},description={parent}}
\newglossaryentry{α}{name={α},description={alpha},parent=d}
\newglossaryentry{ω}{name={ω},description={omega},parent=d}
\newglossaryentry{r}{name={r},description={r},parent=d}
\newglossaryentry{s}{name={s},description={s},parent=d}
\begin{document}
\gls{α}
\gls{ω}
\gls{r}
\gls{s}
\printglossary[style=indexgroup]
\end{document}
得出的结果为:
因此,出于某种原因,该english
xindy
模块似乎对子条目的排序方式略有不同。同样,这并不是特定的,glossaries
因为它可以通过以下方式演示\index
:
\documentclass{article}
\usepackage{fontspec}
\usepackage{makeidx}
\setmainfont{Liberation Serif}
\makeindex
\newcommand*{\lettergroupDefault}[1]{\lettergroup{#1}}
\begin{document}
α\index{d!α}
ω\index{d!ω}
r\index{d!r}
s\index{d!s}
\printindex
\end{document}
生成结果:
即使我为希腊字符定义了一个字母组,问题仍然存在:
% arara: lualatex
% arara: xindy: {language: english, codepage: utf8, modules: [basename, texindy]}
% arara: lualatex
\documentclass{article}
\usepackage{filecontents}
\usepackage{fontspec}
\usepackage{makeidx}
\setmainfont{Liberation Serif}
\makeindex
\newcommand*{\lettergroupDefault}[1]{\lettergroup{#1}}
\begin{filecontents*}{\jobname.xdy}
(define-letter-group "Greek"
:prefixes ("α" "ω")
:after "Z")
\end{filecontents*}
\begin{document}
1\index{d!1}
+\index{d!+}
α\index{d!α}
a\index{d!a}
z\index{d!z}
ω\index{d!ω}
r\index{d!r}
s\index{d!s}
1\index{1}
+\index{+}
a\index{a}
r\index{r}
s\index{s}
z\index{z}
α\index{α}
ω\index{ω}
\printindex
\end{document}
得出的结果为:
主(顶级)条目已正确排序,但子条目尚未正确排序。
推荐
我认为最简单的解决方案是在排序键中使用数字代替希腊字母(1
例如α
等),或者使用正确排序的前缀(例如+
)。例如:
% arara: lualatex
% arara: xindy: {language: english, codepage: utf8, modules: [texindy]}
% arara: lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{makeidx}
\setmainfont{Liberation Serif}
\makeindex
\newcommand*{\lettergroupDefault}[1]{\lettergroup{#1}}
\begin{document}
α\index{d!+α@α}
a\index{d!a}
z\index{d!z}
ω\index{d!+ω@ω}
r\index{d!r}
s\index{d!s}
\printindex
\end{document}
将其翻译回glossaries
:
% arara: lualatex
% arara: makeglossaries
% arara: lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage[xindy]{glossaries}
\setmainfont{Liberation Serif}
\makeglossaries
\newglossaryentry{d}{name={d},description={parent}}
\newglossaryentry{α}{name={α},sort={+α},description={alpha},parent=d}
\newglossaryentry{ω}{name={ω},sort={+ω},description={omega},parent=d}
\newglossaryentry{r}{name={r},description={r},parent=d}
\newglossaryentry{s}{name={s},description={s},parent=d}
\begin{document}
\gls{α}
\gls{ω}
\gls{r}
\gls{s}
\printglossary[style=indexgroup]
\end{document}
得出的结果为: