Index für Russisch erstellen und sortieren

Index für Russisch erstellen und sortieren

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 \indexfunktioniert 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:

Bildbeschreibung hier eingeben

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 \makeindexBefehl 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-write18den Schlüssel an pdfLaTeX übergeben. Alternativ können Sie texindy manuell ausführen und -M latin-alph.xdyden Schlüssel übergeben.

Die latin-alph.xdyDatei 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:

Index

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.xdydiese Beschreibungen beider Sprachen enthält.

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

Wenn Sie imakeidxden Code lieber verwenden möchten,

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

Das Ergebnis wird in der Sortierreihenfolge „Latein zuerst“ angezeigt. Ergebnis von multilingual.xdy

Übrigens könnt Ihr die Sortierreihenfolge ändern. Tauscht dazu einfach die Sprachanweisungen in aus rule-sets.

verwandte Informationen