我有一个很长的 LaTeX 文件,用于生成文档的多个变体,包括或排除不同的部分集合。该文档有一个使用 生成的人员索引,\index{Doe!John}
使用 将其转换为索引makeindex
。但是,如果只有一个姓 Doe 的人,我想将其折叠为一行,就像它是使用 生成的一样\index{Doe, John}
。我无法轻松修改\index
文档中的调用,因为通常名为 Doe 的人的数量取决于要排除哪些部分。有没有办法自动完成这个?
编辑 示例代码:
\documentclass{article}
\usepackage{makeidx,comment,xspace}
\makeindex
\newcommand{\name}[2]{#1\ #2\index{#2!#1}\xspace}
% Either include or exclude this section
\includecomment{extra}
%\excludecomment{extra}
\begin{document}
\name{John}{Doe} and \name{Joe}{Bloggs}.
\begin{extra}
\name{Jane}{Doe}.
\end{extra}
\printindex
\end{document}
extra
我希望包含以下内容的索引:
Bloggs, Joe, 1
Doe,
Jane, 1
John, 1
extra
排除时,如下所示:
Bloggs, Joe, 1
Doe, John, 1
答案1
以下示例重新定义\item
了环境theindex
:如果仅\subitem
遵循一个,则该条目被合并。
使用额外的样式文件\jobname.mst
来降低编程成本。每个 前都添加一个空行\item
,因此每个\item
都应以空行结尾,这\par
在 TeX 中是这样的。Makeindex 将自动查找扩展名为 的样式文件.mst
。
\documentclass{article}
\usepackage{makeidx,comment,xspace}
\makeindex
\newcommand{\name}[2]{#1\ #2\index{#2!#1}\xspace}
\usepackage{filecontents}
\begin{filecontents*}{\jobname.mst}
item_0 "\n\n \\item "
\end{filecontents*}
\makeatletter
\g@addto@macro\theindex{%
\let\org@item\item
\let\item\name@item
}
\def\name@item#1\par{%
\name@item@analyze#1\subitem\subitem\@nil{#1}%
}
\def\name@item@analyze#1\subitem#2\subitem#3\@nil#4{%
\def\name@item@test{#2#3}%
\ifx\name@item@test\@empty
\org@item#1\par
\else
\def\name@item@test{#3}%
\ifx\name@item@test\name@item@subitem
\org@item#1\ifhmode\unskip\fi, #2\par
\else
#4\par
\fi
\fi
}
\def\name@item@subitem{\subitem}
\makeatother
% Either include or exclude this section
\includecomment{extra}
%\excludecomment{extra}
\begin{document}
\name{John}{Doe} and \name{Joe}{Bloggs}.
\name{Foo}{Bar}
\begin{extra}
\name{Jane}{Doe}.
\end{extra}
\printindex
\end{document}
文件\jobname.ist
:
\begin{theindex}
\item Bar
\subitem Foo, 1
\item Bloggs
\subitem Joe, 1
\indexspace
\item Doe
\subitem Jane, 1
\subitem John, 1
\end{theindex}