Índice de fabricación y clasificación para ruso.

Índice de fabricación y clasificación para ruso.

Intentando hacer un índice con palabras rusas, 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}

Yo uso MiKTeX (completo y actualizado), ejecuto: latexmk.exe -pdf file.tex

Esto me da un archivo.pdf con palabras rusas en el índice, pero están ordenadas de manera incorrecta. archivo.idx es:

\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}

Y veo que el problema es que LaTeX crea índices de acuerdo con estos {\cyrch}, {\cyre} etc. Pensé que usar la codificación utf8 y xindy podría resolver todos los problemas con los idiomas. ¿Cómo hacer un índice ruso con la clasificación correcta: дерево, часть, электрон en mi caso?

Respuesta1

Debido a algunas limitaciones, el \indexcomando no funciona muy bien con caracteres UTF-8 (algo que solo podría resolverse con una versión nueva, me temo).

Puedes superar el problema haciendo

\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}

Vocación

texindy -L russian -C utf8 <filename>.idx

produce el índice como se esperaba:

ingrese la descripción de la imagen aquí

Respuesta2

OK, gracias, ¡esto funciona ahora! Pero hay algunas diferencias en las partes de Index en inglés y en ruso. Quiero decir que cada palabra rusa (grupo de palabras) tiene la primera letra correspondiente en negrita antes, y las palabras en inglés se imprimen en una lista común. ¿Se pueden imprimir todas las partes de Index (todos los idiomas) de forma similar?

Logré esto cambiando el \makeindexcomando en la respuesta de egreg a:

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

Aquí, para que este comando funcione, debe pasar -enable-write18la clave a pdfLaTeX. Alternativamente, puede ejecutar texindy pasándole -M latin-alph.xdyla clave manualmente.

Aquí latin-alph.xdyel archivo debería verse así:

(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)

Y el resultado es:

Índice

Respuesta3

OK, gracias, ¡esto funciona ahora! Pero hay algunas diferencias en las partes de Index en inglés y en ruso. Quiero decir que cada palabra rusa (grupo de palabras) tiene la primera letra correspondiente en negrita antes, y las palabras en inglés se imprimen en una lista común. ¿Se pueden imprimir todas las partes de Index (todos los idiomas) de forma similar?

Sólo una mejora más. Puedes utilizar esta sencilla solución.

(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"
    )
)

Guarde este código en multilingual.xdy. Y correr:

texindy -C utf8 -M multilingual.xdy -o you-paper.ind you-paper.idx

Nota: No debe pasar el idioma a texindy(es decir -L russian,), porque multilingual.xdycontiene una descripción de ambos idiomas.

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

Si prefieres usar imakeidxel código será

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

El resultado será con orden de clasificación latino primero. resultado de multilingüe.xdy

Por cierto, puedes cambiar el orden de clasificación. Simplemente intercambie las instrucciones de idioma en rule-sets.

información relacionada