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 \index
comando 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:
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 \makeindex
comando 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-write18
la clave a pdfLaTeX. Alternativamente, puede ejecutar texindy pasándole -M latin-alph.xdy
la clave manualmente.
Aquí latin-alph.xdy
el 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:
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.xdy
contiene una descripción de ambos idiomas.
\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]
Si prefieres usar imakeidx
el código será
\makeindex [options = -C utf8 -M multilingual.xdy]
El resultado será con orden de clasificación latino primero.
Por cierto, puedes cambiar el orden de clasificación. Simplemente intercambie las instrucciones de idioma en rule-sets
.