将索引子项折叠到父行上

将索引子项折叠到父行上

我有一个很长的文档,其中有很多索引条目定义,如\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}

enter image description here

使用较短的版本进行更新(正如 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}

相关内容