Попытка создать индекс с русскими словами, 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
Хорошо, спасибо, теперь это работает! Но есть некоторые различия в английской и русской частях индекса. Я имею в виду, что каждое русское слово (группа слов) имеет соответствующую первую букву, выделенную жирным шрифтом, а английские слова печатаются в общем списке. Можно ли все части индекса (все языки) печатать одинаково?
Мне удалось это сделать, изменив \makeindex
команду в ответе egreg на:
\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
Хорошо, спасибо, теперь это работает! Но есть некоторые различия в английской и русской частях индекса. Я имею в виду, что каждое русское слово (группа слов) имеет соответствующую первую букву, выделенную жирным шрифтом, а английские слова печатаются в общем списке. Можно ли все части индекса (все языки) печатать одинаково?
Еще одно улучшение. Вы можете использовать это простое решение.
(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
.