我有一个很长的文档,其中有很多索引条目定义,如\index{Surname!Name}
,并且我决定出于一个特定目的,我希望索引格式化为好像我\index{Surname, Name}
在整个过程中都写过一样,但我并不特别想编辑每次使用\index
。 有没有这样做的策略? 如果它相关,我正在使用imakeidx
和 XeLaTeX。
我不认为 MWE 真的增加了什么,但它似乎同样是人们所期待的:
\documentclass{article}
\usepackage{imakeidx}
\usepackage[columns=1]{idxlayout}
\makeindex
\begin{document}
John\index{Smith!John} and William Smith\index{Smith!William}
were brothers. Jack Jones\index{Jones!Jack} is another person.
\printindex
\end{document}
我想要的是索引读取
琼斯,杰克,1
史密斯,约翰,1
史密斯,威廉,1
答案1
更新:请参阅答案末尾的简短版本。
也许可以使用 catcodes 或更改命令\indexentry
,另一种方法是使用l3regex
并替换,通过对命令!
进行,
小小的重新定义\index
。
\documentclass{article}
\usepackage{xparse}
\usepackage{l3regex}
\usepackage{imakeidx}
\usepackage[columns=1]{idxlayout}
\usepackage{letltxmacro}
\ExplSyntaxOn
\AtBeginDocument{%
\LetLtxMacro\idxorig\index
\RenewDocumentCommand{\index}{o+m}{%
\tl_set:Nn \l_tmpa_tl {#2} % Store the index entry
\regex_replace_once:nnN {!}{,\~} \l_tmpa_tl % replacing
\IfValueTF{#1}{%
\idxorig[#1]{\tl_use:N \l_tmpa_tl} % write the new index entry
}{
\idxorig{\tl_use:N \l_tmpa_tl}% write the new index entry
}
}
}
\ExplSyntaxOff
\makeindex
\begin{document}
John\index{Smith!John} and William Smith\index{Smith!William}
were brothers. Jack Jones\index{Jones!Jack} is another person.
\printindex
\end{document}
使用较短的版本进行更新(正如 egreg 建议的那样)
\documentclass{article}
\usepackage{imakeidx}
\usepackage[columns=1]{idxlayout}
\usepackage{letltxmacro}
\usepackage{xparse}
\ExplSyntaxOn
\AtBeginDocument{%
\LetLtxMacro\idxorig\index
\RenewDocumentCommand{\index}{o+m}{%
\tl_set:Nn \l_tmpa_tl {#2}
\tl_replace_once:Nnn \l_tmpa_tl {!}{,\ }
\IfValueTF{#1}{%
\idxorig[#1]{\tl_use:N \l_tmpa_tl}
}{
\idxorig{\tl_use:N \l_tmpa_tl}
}%
}
}
\ExplSyntaxOff
\makeindex
\begin{document}
John\index{Smith!John} and William Smith\index{Smith!William}
were brothers. Jack Jones\index{Jones!Jack} is another person.
\printindex
\end{document}