使用 xindy 词汇表对希腊字母进行奇怪的排序

使用 xindy 词汇表对希腊字母进行奇怪的排序

当使用 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}

得出的结果为:

以希腊字母开头的词汇表图像

相关内容