Criação e classificação de índice para russo

Criação e classificação de índice para russo

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

insira a descrição da imagem aqui

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 \makeindexcomando 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-write18a chave para o pdfLaTeX. Alternativamente, você pode executar texindy passando manualmente -M latin-alph.xdya chave para ele.

Aqui latin-alph.xdyo 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 é:

Índice

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.xdycontém a descrição de ambos os idiomas.

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

Se preferir use imakeidxo código que será

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

O resultado será com a primeira ordem de classificação latina. resultado de multilíngue.xdy

A propósito, você pode alterar a ordem de classificação. Basta trocar as instruções do idioma em rule-sets.

informação relacionada