Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

According to Xindy revisited: Multi-lingual index creation for the UTF-8 age (TUGboat), “if one has a raw index file that was produced by [XeTeX], one can use xindy; it will ‘just work’.”

Unfortunately I can't get it to “just work”. How can I use Xindy together with XeLaTeX or LuaLaTeX?


An example LaTeX file:

\documentclass{article}
\makeindex

\begin{document}
start
\index{a}\index{b}\index{ä}\index{ü}
end
\end{document}

The LaTeX Companion (2ed) then tells me to run

texindy -L german-duden test.idx

However when I do this all umlauts are sorted under O.

share|improve this question
add comment

3 Answers

up vote 9 down vote accepted
+150

Based on Ulrike's answer, here is one way to invoke xindy to get it to sort .idx files created by Xe/LuaLaTeX. The trick is to use xindy directly (instead of texindy) and pass the -C utf8 flag.

Minimal Example

\documentclass{article}
\usepackage{luatextra}
\usepackage{makeidx}
\makeindex
\begin{document}
üäö

start 
\index{a}\index{b}\index{ä}\index{ü}
end

\printindex
\end{document}

Compilation

lualatex filename.tex
xindy -M texindy -C utf8 -L german-duden filename.idx 
lualatex filename.tex

In (pdf)latex you can use UTF-8 encoding and xindy in the following way:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{makeidx}
\makeindex

\begin{document}
start
\index{a}\index{b}\index{ä}\index{ü}
end
\printindex
\end{document}

And then simply run texindy -L ⟨language⟩ ⟨filename⟩.idx.

In LuaTeX you can also use the luainputenc package to use legacy encodings.

\documentclass{article}
\usepackage{fontspec}
\usepackage[utf8]{luainputenc}
\usepackage{makeidx}
\makeindex

\begin{document}
start 
\index{a}\index{b}\index{ä}\index{ü}
end
\printindex
\end{document}

Again, run texindy -L ⟨language⟩ ⟨filename⟩.idx.

Here the result for both examples:

result

share|improve this answer
1  
As I said, I want to compile with XeTeX or LuaTeX. Both of those provide UTF-8 by default and don't use any inputenc/fontenc ”hacks” to support the encoding. So this won't work. –  Caramdir Aug 15 '11 at 16:55
    
The problem here is, that the .idx file created by pdflatex isn't actual unicode, but contains LaTeX-encoded umlauts (etc.). In comparison the modern engines create fully unicode-encoded .idx files. xindy is supposed to support this, I just don't know how. –  Caramdir Aug 15 '11 at 16:58
1  
I does work with the luainputenc hack. Still I'd prefer a solution that uses Unicode throughout. While the solution works in this case, something like \index{α} would still cause trouble. –  Caramdir Aug 15 '11 at 17:11
    
@Caramdir: I saw it. I tried also fontspec but it doesn't work. –  Marco Daniel Aug 15 '11 at 17:12
2  
@Caramdir: It is not surprising that fontspec + luainputenc works: fontspec loads xunicode which gives most of the standard commands (\" etc) senseful definitions. But having to use luainputenc should not be necessary. After all one point of xindy is to get real utf8 support. –  Ulrike Fischer Aug 15 '11 at 19:19
show 5 more comments

here is an example with an own style file for xindy. Run it with

lualatex <file>
xindy -C utf8 -I latex -M myModuleE <file>.idx
lualatex <file>

then I get the attached output

\documentclass[]{article}
\usepackage{fontspec}
\usepackage[ngerman]{babel}
\usepackage{filecontents,multicol}
\begin{filecontents*}{myModuleE.xdy}
(define-attributes ("default"))
(define-location-class "page-numbers" ("arabic-numbers"))
(markup-index :open  "~n\begin{theindex}~n"
              :close "~n\end{theindex}~n"
              :tree)
(markup-locclass-list :open "\quad{}")
(markup-locref-list   :sep ", ")
(markup-indexentry :open "~n  \item "           :depth 0)
( define-letter-group "A--D" :prefixes ("A" "B" "C" "D") )
( define-letter-group "E--G" :after "A--D" :prefixes ("E" "F" "G") )
( define-letter-group "H--K" :after "E--G" :prefixes ("H" "I" "J" "K") )
( define-letter-group "L--N" :after "H--K" :prefixes ("L" "M" "N" ) )
( define-letter-group "O--R" :after "L--N" :prefixes ("O" "P" "Q" "R") )
( define-letter-group "S--V" :after "O--R" :prefixes ("S" "T" "U" "V") )
( define-letter-group "W--Z" :after "S--V" :prefixes ("W" "X" "Y" "Z") )
(sort-rule "a" "A")
(sort-rule "b" "B")
(sort-rule "c" "C")
(sort-rule "d" "D")
(sort-rule "e" "E")
(sort-rule "f" "F")
(sort-rule "g" "G")
(sort-rule "h" "H")
(sort-rule "i" "I")
(sort-rule "j" "J")
(sort-rule "k" "K")
(sort-rule "l" "L")
(sort-rule "m" "M")
(sort-rule "n" "N")
(sort-rule "o" "O")
(sort-rule "p" "P")
(sort-rule "q" "Q")
(sort-rule "r" "R")
(sort-rule "s" "S")
(sort-rule "t" "T")
(sort-rule "u" "U")
(sort-rule "v" "V")
(sort-rule "w" "W")
(sort-rule "x" "X")
(sort-rule "y" "Y")
(sort-rule "z" "Z")
(markup-letter-group-list :sep "~n\indexspace")
(sort-rule "Ä" "A")
(sort-rule "ä" "A")
(sort-rule "Ö" "O")
(sort-rule "ö" "O")
(sort-rule "Ü" "U")
(sort-rule "ü" "U")
(merge-rule "\\[a-zA-Z@]+ *" "" :eregexp)
(merge-rule "\\[^a-zA-Z@]" "" :eregexp)
(merge-rule "^[{}$]" "" :eregexp)
\end{filecontents*}
\makeatletter
\renewenvironment{theindex}
  {\raggedright\small\let\item\@idxitem \parskip .0pt\@plus .3\p@\relax
   \begin{multicols}{2}}{\end{multicols}}
\makeatother
\usepackage{makeidx}\makeindex
% xindy -C utf8 -I latex -M myModuleE datei.idx
\begin{document}
\printindex     \newpage  foo \index{ä}\index{ü}
\index{Aal}   \index{Berg}\index{Cäsar}
\index{Donau} \index{Emil}\index{Flora}
\index{Garten}\index{Ober}\index{Zucker}
\index{Österreich}\index{klein}\index{groß}
\end{document}

enter image description here

share|improve this answer
add comment

I don't have a working xindy. But according to this message http://sourceforge.net/mailarchive/message.php?msg_id=26841124 I think you need at least the option -C utf8 and perhaps also a new xindy style.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.