Составление и сортировка индекса для русского языка

Составление и сортировка индекса для русского языка

Попытка создать индекс с русскими словами, 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]

Результат будет отсортирован по принципу «сначала латинские символы». результат multilingual.xdy

Кстати, вы можете изменить порядок сортировки. Просто поменяйте языковые инструкции в rule-sets.

Связанный контент