俄语索引的制作和排序

俄语索引的制作和排序

尝试用俄语单词制作索引,MWE:

\documentclass{book}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\usepackage[xindy]{imakeidx}
\makeindex

\begin{document}

\chapter{Первая}

\index{notepad}
\index{apple}
\index{часть}
\index{дерево}
\index{электрон}

\printindex

\end{document}

我使用 MiKTeX(完整版和更新版),运行:latexmk.exe -pdf file.tex

这给了我索引中包含俄语单词的 file.pdf,但它们的排序方式是错误的。file.idx 是:

\indexentry{notepad}{1}
\indexentry{apple}{1}
\indexentry{\IeC {\cyrch }\IeC {\cyra }\IeC {\cyrs }\IeC {\cyrt }\IeC {\cyrsftsn }}{1}
\indexentry{\IeC {\cyrd }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyre }\IeC {\cyrv }\IeC {\cyro }}{1}
\indexentry{\IeC {\cyrerev }\IeC {\cyrl }\IeC {\cyre }\IeC {\cyrk }\IeC {\cyrt }\IeC {\cyrr }\IeC {\cyro }\IeC {\cyrn }}{1}

我发现问题在于 LaTeX 根据这些 {\cyrch}、{\cyre} 等创建索引。我以为使用 utf8 编码和 xindy 可以解决所有语言问题。如何创建俄语索引并正确排序:在我的情况下是 дерево、часть、электрон?

答案1

由于一些限制,该\index命令不能很好地处理 UTF-8 字符(恐怕只有使用全新版本才能解决这个问题。)

您可以通过以下方式解决问题:

\documentclass{book}
\usepackage[T1, T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english, russian]{babel}
\usepackage[xindy]{imakeidx}
\makeindex

\makeatletter
\newcommand{\rindex}[2][\imki@jobname]{%
  \index[#1]{\detokenize{#2}}%
}
\makeatother

\begin{document}

\chapter{Первая}

\rindex{notepad}
\rindex{apple}
\rindex{часть}
\rindex{дерево}
\rindex{электрон}

\printindex

\end{document}

呼唤

texindy -L russian -C utf8 <filename>.idx

按预期生成索引:

在此处输入图片描述

答案2

好的,谢谢,现在可以使用了!但是,Index 的英语和俄语部分有一些不同。我的意思是每个俄语单词(词组)之前都有相应的粗体首字母,而英语单词则打印在公共列表中。Index 的所有部分(所有语言)都可以以类似的方式打印吗?

我通过将 egreg 的答案中的命令更改\makeindex为:

\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]

为了让此命令有效,您应该将-enable-write18密钥传递给 pdfLaTeX。或者,您可以手动运行 texindy 并将-M latin-alph.xdy密钥传递给它。

这里的latin-alph.xdy文件看起来应该像这样:

(define-letter-groups
  ("a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m"
   "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"))

(require
  "rules/latin-tolower.xdy")

(use-rule-set
  :run 0
  :rule-set ("latin-tolower"))

(markup-letter-group
  :open-head "~n~n  \textbf {\Large "
  :close-head "}~n  \nopagebreak"
  :capitalize)

结果是:

指数

答案3

好的,谢谢,现在可以使用了!但是,Index 的英语和俄语部分有一些不同。我的意思是每个俄语单词(词组)之前都有相应的粗体首字母,而英语单词则打印在公共列表中。Index 的所有部分(所有语言)都可以以类似的方式打印吗?

只需再改进一次。您可以使用这个简单的解决方案。

(require "lang/english/utf8.xdy")
(require "lang/russian/utf8.xdy")

(define-sort-rule-orientations (forward backward forward forward))
(use-rule-set   
    :run 0
    :rule-set (
        "en-alphabetize" 
        "ru-alphabetize" 
        "en-ignore-special" 
        "ru-ignore-special"
    )
)   
(use-rule-set 
    :run 1
    :rule-set (
        "en-resolve-diacritics"  
        "ru-resolve-diacritics" 
        "en-ignore-special" 
        "ru-ignore-special"
    )
)
(use-rule-set 
    :run 2
    :rule-set (
        "en-resolve-case" 
        "ru-resolve-case" 
        "en-ignore-special"
        "ru-ignore-special"
    )
)
(use-rule-set 
    :run 3
    :rule-set (
        "en-resolve-special"
        "ru-resolve-special"
    )
)

将此代码存储到multilingual.xdy。然后运行:

texindy -C utf8 -M multilingual.xdy -o you-paper.ind you-paper.idx

注意:您不应该将语言传递给texindy(即-L russian),因为multilingual.xdy包含两种语言的描述。

\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]

如果你喜欢使用imakeidx代码

\makeindex [options = -C utf8 -M multilingual.xdy]

结果将按照拉丁语优先的顺序排列。 multilingual.xdy 的结果

顺便说一句,您可以更改排序顺序。只需在 中交换语言指令即可rule-sets

相关内容