我在使用 makeidx 对瑞典字母表中的特殊字符 å、ä 和 ö 进行排序时遇到了问题。它们应该位于最后三个位置,但它们在索引中出现在“A”之前。
如何将 makeidx 行为改变为正确的排序?
答案1
正确的方法可能是使用更现代的替代方案makeindex
,正如评论中所建议的那样。
但是,可以欺骗makeindex
它认为这些字母实际上是 127-255 范围内的字符,因为它认为这个范围比其他任何字符都大。下面的代码的作用是将 转换\index{ångström}
为\index{^^80ngstr^^82m@ångström}
,其中^^80
和^^82
(十六进制)表示字符代码为 128 和 130 的字符。 之前的部分@
将用于makeindex
排序目的。 之后的部分@
用作 TeX 代码来显示条目。
使用pdflatex file.tex
、makeindex file.idx
、进行编译pdflatex file.tex
。
\documentclass{article}
\usepackage{makeidx}
\makeindex
\usepackage{lipsum}
\usepackage[utf8]{inputenc}
%%%%% The letters z, å, ä and ö should be sorted in that order. This is
%%%%% done by turning å, ä and ö into characters 128 to 130 (80 to 82 in
%%%%% hexadecimal).
\usepackage{expl3}
\ExplSyntaxOn
\makeatletter
\tl_new:N \l_wrindex_tl
\cs_generate_variant:Nn \tl_replace_all:Nnn { Nx }
\cs_new_protected:Npn \wrindex:n #1
{
\tl_set:Nn \l_wrindex_tl {#1}
\tl_replace_all:Nxn \l_wrindex_tl { \token_to_str:N @ } { @ }
\tl_if_in:NnF \l_wrindex_tl { @ }
{ \tl_put_right:Nx \l_wrindex_tl { @ \exp_not:V \l_wrindex_tl } }
\exp_after:wN \wrindex_aux:w \l_wrindex_tl \q_stop
}
\cs_new_protected:Npn \wrindex_aux:w #1 @ #2 \q_stop
{
\tl_set:Nn \l_wrindex_tl {#1}
\tl_replace_all:Nnn \l_wrindex_tl { å } { ^^80 }
\tl_replace_all:Nnn \l_wrindex_tl { ä } { ^^81 }
\tl_replace_all:Nnn \l_wrindex_tl { ö } { ^^82 }
\wrindex_do:x { \tl_to_str:N \l_wrindex_tl @ \exp_not:n {#2} }
}
\cs_new_eq:NN \wrindex_do:n \@wrindex
\cs_generate_variant:Nn \wrindex_do:n { x }
\cs_set_eq:NN \@wrindex \wrindex:n
\makeatother
\ExplSyntaxOff
\begin{document}
\lipsum[1-2]\index{car}\index{za}
\lipsum[3-4]\index{cåb}\index{zå}
\lipsum[5-6]\index{car}\index{åa}
\lipsum[1-2]\index{cz}\index{ä}
\lipsum[3-4]\index{da}
\printindex
\end{document}
但实际上,使用xindy
,或任何人们现在使用的东西(我通常不处理索引,所以其他人的意见更有用)。
答案2
我附上一个例子Xindy
。借助imakeidx
软件包,我们可以在 shell 转义的情况下运行它,或者,我们可以在外部运行以下三行:
lualatex mal-xindy-swedish.tex
xindy -M texindy -L swedish -C utf8 -M mal-style mal-xindy-swedish.idx
lualatex mal-xindy-swedish.tex
%! lualatex mal-xindy-numbers.tex
% with shell escape on
% or
%!lualatex mal-xindy-swedish.tex
%!xindy -M texindy -L swedish -C utf8 -M mal-style -o mal-xindy-swedish.ind mal-xindy-swedish.idx
%!lualatex mal-xindy-swedish.tex
\documentclass[a4paper]{article}
%\usepackage[utf8]{inputenc}% pdflatex, but it would need additional setup to get everything working
%\usepackage{xltxtra}% xelatex
\usepackage{luatextra}% lualatex
\usepackage[hyperindex=false,colorlinks]{hyperref}
\usepackage[xindy]{imakeidx}
\indexsetup{firstpagestyle=empty}
\makeatletter\def\imki@progdefault{xindy}\makeatother
\makeindex[title=Index of Swedish words, options=-M texindy -L swedish -C utf8 -M mal-style, columns=2]
\usepackage{filecontents}
\begin{filecontents*}{mal-style.xdy}
(markup-locref :attr "default" :open "\hyperpage{" :close "}")
\end{filecontents*}
\begin{document}
My first paragraph!
\index{handlockad}
\index{massabruk}
\index{lagerstyrare}
% Terms from http://tex.stackexchange.com/questions/98944/sorting-swedish-index-with-makeidx-correctly
\index{car}\index{za}
\index{cåb}\index{zå}
\index{car}\index{åa}
\index{cz}\index{ä}
\index{da}\index{ångström}
% From English->Swedish lite dictionary
\index{överge}\index{ändå}
\index{årlig}\index{åsikt}
\index{Ö}\index{Ändå}
\index{Årlig}\index{Åsikt}
\index{skändlig}\index{Skändlig}
\index{förstuga}\index{Förstuga}
\index{förrum}\index{Förrum}
\index{äga}\index{Äga}
\index{äganderätt}\index{Äganderätt}
\index{överanstränga}\index{Överanstränga}
\printindex
\end{document}