Tentando fazer índice com palavras russas, 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}
Eu uso o MiKTeX (completo e atualizado), execute: latexmk.exe -pdf file.tex
Isso me dá um arquivo.pdf com palavras em russo no índice, mas elas estão classificadas de maneira errada. arquivo.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}
E vejo que o problema é que o LaTeX cria índices de acordo com estes {\cyrch}, {\cyre} etc. Pensei que usar a codificação utf8 e xindy poderia resolver todos os problemas com linguagens. Como fazer um índice russo com classificação correta: дерево, часть, электрон no meu caso?
Responder1
Devido a algumas restrições, o \index
comando não funciona muito bem com caracteres UTF-8 (algo que só poderia ser resolvido com uma versão totalmente nova, infelizmente).
Você pode superar o problema fazendo
\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}
Chamando
texindy -L russian -C utf8 <filename>.idx
produz o índice conforme esperado:
Responder2
OK, obrigado, isso funciona agora! Porém, há alguma diferença nas partes inglesa e russa do Index. Quero dizer, cada palavra russa (grupo de palavras) tem a primeira letra correspondente em negrito antes, e as palavras em inglês são impressas em uma lista comum. Todas as partes do Índice (todos os idiomas) podem ser impressas de maneira semelhante?
Consegui isso alterando o \makeindex
comando na resposta do egreg para:
\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]
Aqui para que este comando funcione você deve passar -enable-write18
a chave para o pdfLaTeX. Alternativamente, você pode executar texindy passando manualmente -M latin-alph.xdy
a chave para ele.
Aqui latin-alph.xdy
o arquivo deve ficar assim:
(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)
E o resultado é:
Responder3
OK, obrigado, isso funciona agora! Porém, há alguma diferença nas partes inglesa e russa do Index. Quero dizer, cada palavra russa (grupo de palavras) tem a primeira letra correspondente em negrito antes, e as palavras em inglês são impressas em uma lista comum. Todas as partes do Índice (todos os idiomas) podem ser impressas de maneira semelhante?
Só mais uma melhoria. Você pode usar esta solução simples.
(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"
)
)
Armazene esse código em multilingual.xdy
. E corra:
texindy -C utf8 -M multilingual.xdy -o you-paper.ind you-paper.idx
Nota: Você não deve passar o idioma para texindy
(ou seja -L russian
, .), pois multilingual.xdy
contém a descrição de ambos os idiomas.
\makeindex [options = -L russian -C utf8 -M latin-alph.xdy]
Se preferir use imakeidx
o código que será
\makeindex [options = -C utf8 -M multilingual.xdy]
O resultado será com a primeira ordem de classificação latina.
A propósito, você pode alterar a ordem de classificação. Basta trocar as instruções do idioma em rule-sets
.