使用 makeidx 正确排序瑞典索引

使用 makeidx 正确排序瑞典索引

我在使用 makeidx 对瑞典字母表中的特殊字符 å、ä 和 ö 进行排序时遇到了问题。它们应该位于最后三个位置,但它们在索引中出现在“A”之前。

如何将 makeidx 行为改变为正确的排序?

答案1

正确的方法可能是使用更现代的替代方案makeindex,正如评论中所建议的那样。

但是,可以欺骗makeindex它认为这些字母实际上是 127-255 范围内的字符,因为它认为这个范围比其他任何字符都大。下面的代码的作用是将 转换\index{ångström}\index{^^80ngstr^^82m@ångström},其中^^80^^82(十六进制)表示字符代码为 128 和 130 的字符。 之前的部分@将用于makeindex排序目的。 之后的部分@用作 TeX 代码来显示条目。

使用pdflatex file.texmakeindex 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}

姆韦

相关内容