尝试用俄语单词制作索引,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]
顺便说一句,您可以更改排序顺序。只需在 中交换语言指令即可rule-sets
。