朋友们,我已经为 TeX 力中的这个干扰挣扎了一段时间:
我有一组带重音的葡萄牙语单词。在对这些单词进行排序时,我们将带重音的字母与不带重音的字母视为相同的字母。因此,列出以下单词:
abacate
ábaco
alavanca
árvore
arte
ácaro
aba
排序为
aba
abacate
ábaco
ácaro
alavanca
arte
árvore
makeindex
当使用这些单词作为索引条目时,重音字母按符号排序:
\begin{filecontents*}{mystyle.ist}
headings_flag 1
heading_prefix "\\textit{"
heading_suffix "}\\nopagebreak\n"
delim_0 " \\dotfill "
delim_1 " \\dotfill "
delim_2 " \\dotfill "
\end{filecontents*}
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{imakeidx}[2012/05/09]
\def\pfill{\unskip~\dotfill\penalty500
\strut\nobreak\dotfil~\ignorespaces}
\def\efill{\hfill\nopagebreak}
\def\dotfil{\leaders\hbox to.6em{\hss.\hss}\hfil}
\makeindex[name=words,columns=1,options=-s mystyle]
\begin{document}
Hello world.
\index[words]{abacate}
\index[words]{ábaco}
\index[words]{alavanca}
\index[words]{árvore}
\index[words]{arte}
\index[words]{ácaro}
\index[words]{aba}
\printindex[words]
\end{document}
Marco Daniel 在聊天中巧妙地建议我尝试xindy
一下makeindex
。所以
xindy -M texindy -C utf8 -L portuguese filename.idx
产生“正确”的排序(当然是葡萄牙语,我知道其他语言有不同的规则)。
不幸的是,我对索引使用了一些自定义样式(我们可以在上面看到其中一种)。令我失望的是,它的xindy
工作原理与 完全不同makeindex
,而且.ist
据我所知,我的样式不受支持。
xindy
如果我也可以移植我的.ist
风格,那么转移对我来说就很好了。
我现在使用的解决方法是在“正确”的单词之前提供一个无重音的单词:
\index[words]{abacate}
\index[words]{abaco@ábaco}
\index[words]{alavanca}
\index[words]{arvore@árvore}
\index[words]{arte}
\index[words]{acaro@ácaro}
\index[words]{aba}
这个有效。:)
是否可以为 提供排序规则makeindex
,或者提供类似的.ist
样式xindy
?我对当前的解决方法很满意,但从索引条目中删除每个重音符号非常麻烦。如果可能的话,我宁愿坚持使用makeindex
。:)
答案1
这是简单的解决方案。好吧,毕竟不是那么简单。:)
一个小问题,我将在下一个版本中解决imakeidx
:出于某种原因(我现在不记得了),我们决定还是program=xindy
调用它texindy
。但不幸的是,似乎调用
xindy -M mystyle -C utf8 -L portuguese words.idx
和
texindy -M mystyle -C utf8 -L portuguese words.idx
是不是等效,因为后者会引发难以理解的错误(可能是texindy
脚本中的错误)。
因此,以下文档将需要手动运行xindy
(但您有 Arara,所以这不是问题),直到小问题得到纠正。
请注意,xindy
为字母组提供了两个命令,应该在序言中重新定义这些命令以执行所需的操作。
\begin{filecontents*}{mystyle.xdy}
(markup-locclass-list :open "\dotfill " :sep "\dotfill ")
\end{filecontents*}
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{imakeidx}[2012/05/09]
\newcommand*{\lettergroupDefault}[1]{}
\newcommand*\lettergroup[1]{%
\par\textit{#1}\par
\nopagebreak
}
\def\pfill{\unskip~\dotfill\penalty500
\strut\nobreak\dotfil~\ignorespaces}
\def\efill{\hfill\nopagebreak}
\def\dotfil{\leaders\hbox to.6em{\hss.\hss}\hfil}
\makeindex[name=words,columns=1,program=xindy,options=-M texindy -M mystyle -C utf8 -L portuguese]
\begin{document}
Hello world.
\index[words]{abacate}
\index[words]{ábaco}
\index[words]{alavanca}
\index[words]{árvore}
\index[words]{arte}
\index[words]{ácaro}
\index[words]{aba}
\printindex[words]
\end{document}
答案2
答案3
这里有一个仅使用样式文件的解决方案。
该样式仅由两行组成:
(markup-locclass-list :open " \dotfill\ " )
(markup-letter-group :open-head "\textit{" :close-head "}" )
这里有一个完整的 MWE,需要进行 shell 转义。
\RequirePackage{filecontents}
\begin{filecontents*}{mystyle.xdy}
;;; xindy style file
;;;dotted line between name and page number
(markup-locclass-list :open " \dotfill\ " )
(markup-letter-group :open-head "\textit{" :close-head "}" )
\end{filecontents*}
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{imakeidx}[2012/05/09]
\def\pfill{\unskip~\dotfill\penalty500
\strut\nobreak\dotfil~\ignorespaces}
\def\efill{\hfill\nopagebreak}
\def\dotfil{\leaders\hbox to.6em{\hss.\hss}\hfil}
\makeindex[program=texindy,options=-M mystyle.xdy,name=words,columns=1]
\begin{document}
Hello world.
\index[words]{abacate}
\index[words]{ábaco}
\index[words]{alavanca}
\index[words]{árvore}
\index[words]{arte}
\index[words]{ácaro}
\index[words]{aba}
\printindex[words]
\end{document}
答案4
我需要更多一点的空间,但是像这样:
\newcommand\lettergroup[1]{%
\par\textit{#1}\par
\nopagebreak}
\newcommand\lettergroupDefault[1]{\lettergroup{#1}}
以及一个新模块(mystyle.xdy
):
(markup-locclass-list :open "\dotfil ")
然后texindy
通过调用
texindy -M mystyle.xdy ....
这似乎和你的 MWE 作用相同,texindy
只是