自动压缩索引中的子条目

自动压缩索引中的子条目

我有一个很长的 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}

结果

相关内容