Versuch, einen Index mit russischen Wörtern zu erstellen, 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}
Ich verwende MiKTeX (vollständig und aktualisiert), führe aus: latexmk.exe -pdf file.tex
Dadurch erhalte ich eine PDF-Datei mit russischen Wörtern im Index, die jedoch falsch sortiert sind. Die Datei „file.idx“ lautet:
\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}
Und ich sehe, dass das Problem darin besteht, dass LaTeX einen Index gemäß diesen {\cyrch}, {\cyre} usw. erstellt. Ich dachte, die Verwendung der UTF-8-Kodierung und Xindy könnte alle Probleme mit Sprachen lösen. Wie erstelle ich in meinem Fall einen russischen Index mit der richtigen Sortierung: дерево, часть, электрон?
Antwort1
Aufgrund einiger Einschränkungen \index
funktioniert der Befehl nicht besonders gut mit UTF-8-Zeichen (was, fürchte ich, nur mit einer brandneuen Version gelöst werden kann).
Sie können das Problem lösen, indem Sie
\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}
Berufung
texindy -L russian -C utf8 <filename>.idx
erzeugt den Index wie erwartet:
Antwort2
OK, danke, das funktioniert jetzt! Aber es gibt einige Unterschiede zwischen den englischen und russischen Teilen des Index. Ich meine, jedes russische Wort (jede Wortgruppe) hat den entsprechenden Anfangsbuchstaben in Fettschrift, und englische Wörter werden in einer gemeinsamen Liste gedruckt. Können alle Teile des Index (alle Sprachen) auf ähnliche Weise gedruckt werden?
Dies ist mir gelungen, indem ich den \makeindex
Befehl in der Antwort von egreg wie folgt geändert habe:
\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]
Damit dieser Befehl funktioniert, müssen Sie -enable-write18
den Schlüssel an pdfLaTeX übergeben. Alternativ können Sie texindy manuell ausführen und -M latin-alph.xdy
den Schlüssel übergeben.
Die latin-alph.xdy
Datei sollte folgendermaßen aussehen:
(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)
Und das Ergebnis ist:
Antwort3
OK, danke, das funktioniert jetzt! Aber es gibt einige Unterschiede zwischen den englischen und russischen Teilen des Index. Ich meine, jedes russische Wort (jede Wortgruppe) hat den entsprechenden Anfangsbuchstaben in Fettschrift, und englische Wörter werden in einer gemeinsamen Liste gedruckt. Können alle Teile des Index (alle Sprachen) auf ähnliche Weise gedruckt werden?
Nur noch eine Verbesserung. Sie können diese einfache Lösung verwenden.
(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"
)
)
Speichern Sie diesen Code in multilingual.xdy
. Und führen Sie aus:
texindy -C utf8 -M multilingual.xdy -o you-paper.ind you-paper.idx
Hinweis: Sie sollten keine Sprache übergeben texindy
(z -L russian
. B. .), da multilingual.xdy
diese Beschreibungen beider Sprachen enthält.
\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]
Wenn Sie imakeidx
den Code lieber verwenden möchten,
\makeindex [options = -C utf8 -M multilingual.xdy]
Das Ergebnis wird in der Sortierreihenfolge „Latein zuerst“ angezeigt.
Übrigens könnt Ihr die Sortierreihenfolge ändern. Tauscht dazu einfach die Sprachanweisungen in aus rule-sets
.