定义索引的别名

定义索引的别名

我们定义了以下命令来为发布生成索引

\newcommand{\markindex}[1]{\index{#1}#1}

然而,在文本中,根据句子的上下文,可能会使用同义词交错(例如),缩写或较短版本(例如,旅行商而不是旅行商问题):

A \markindex{graph} consists out of a set of \markindex{nodes} or \markindex{vertices} and a set of \markindex{edges}.

因此,编译器生成一个索引:

节点 1,2,7,9
顶点 1,2,5,6,7

我们正在寻找一种定义别名的方法

\indexalias{nodes}{vertices}

这样,不仅nodes包含see vertices条目,而且所有页码都分组在 的 conto 上。这样可以集中数据(否则读者在查找 时vertices可能会错过 的条目),并使其更紧凑(对同一页面的两个引用被“压缩”在一个引用中)。nodesvertices

是否有一个可以解决这个问题的软件包(或者\makeidx我们忽略了一个选项)?

答案1

我知道我迟到了,但是我最近遇到了这个问题。作为参考,这是我的代码。

\makeatletter
\def\indexDefineAlias#1#2{%  #1 = alias, #2 = original, the one to display in index
  \protected@write\@auxout{}%
         {\string\indexalias{#1}{#2}}%
}

\def\indexalias#1#2{%  #1 = alias, #2 = original, the one to display in index
  \edef\@tmp@nm{@indexali@\detokenize{#1}}%
  \expandafter\gdef\csname\@tmp@nm\endcsname{#2}%
  % add here alternative "|<attributes>" to also define aliases for:
  %\expandafter\gdef\csname\@tmp@nm|textbf\endcsname{#2|textbf}%
}
\let\@orig@index\index
\def\index#1{%
  \edef\@tmp@nm{@indexali@\detokenize{#1}}%
  \ifcsname\@tmp@nm\endcsname%
    \@orig@index{\csname\@tmp@nm\endcsname}%
  \else%
    \@orig@index{#1}%
  \fi%
}
\makeatother

用于\indexDefineAlias{alias}{original}定义别名。您需要运行两次 LaTeX 才能激活别名。然后,您可以正常使用\index{}任一术语,索引中只会显示原始术语。

此代码的缺点是,当索引条目具有属性(例如)时,别名无法被识别\index{term|textbf}。您可以手动添加带有属性的别名(\indexDefineAlias{nodes|textbf}{vertices|textbf}),或者添加您感兴趣的属性的定义,\indexalias我在注释中标记了这些属性。

如果您想要“节点,查看顶点”条目,您可以照常使用\index{nodes|see{vertices}}

技术说明:\detokenize如果索引条目有自定义宏,则很有用。即使它们很强大,我也遇到了麻烦\csname...\endcsname

答案2

下面的示例定义了\markindex以下变体:

  • \markindex{<term>}\index{<term>}<term>

  • \markindex[<term>]{<alias>}\index{<term>}<alias>,另外还添加了\index{<alias>|see{<term>}第一次使用的时间。

  • \markindex*[<term>]{<alias>}\index{<term>}<alias>\index{...|see{...}}但是不是添加。例如,如果<alias>只是 的词形变化形式,<term>或者如果<term>以大写首字母开头,则这很有用。

示例文件:

\documentclass{article}
\usepackage{makeidx}
\makeindex

\makeatletter
\newif\ifmarkindexsee
\newcommand*{\markindex}{%
  \@ifstar{%
    \markindexseefalse
    \@dblarg\@markindex
  }{%
   \markindexseetrue
    \@dblarg\@markindex
  }%
}
\def\@markindex[#1]#2{%
  \index{#1}%
  \ifmarkindexsee
    \edef\@markindex@A{\detokenize{#1}}%
    \edef\@markindex@B{\detokenize{#2}}%
    \ifx\@markindex@A\@markindex@B
    \else
      \edef\MI@see{MI@\@markindex@A ->\@markindex@B}%
      \@ifundefined{\MI@see}{%
        \index{#2|see{#1}}%
        \global\expandafter\let\csname\MI@see\endcsname\@empty
      }{}%
    \fi
  \fi
  #2%
}
\makeatother

\newcommand*{\dummypage}[1]{%
  \newpage
  \setcounter{page}{#1}%
  \section{Page #1}%
}

\begin{document}
  \dummypage{1}
  \markindex[vertices]{nodes}
  \markindex{vertices}

  \dummypage{2}
  \markindex[vertices]{nodes}
  \markindex{vertices}

  \dummypage{5}
  \markindex{vertices}

  \dummypage{6}
  \markindex{vertices}

  \dummypage{7}
  \markindex[vertices]{nodes}
  \markindex{vertices}

  \dummypage{9}
  \markindex*[vertices]{Vertices} are
  \markindex[vertices]{nodes}

  \printindex
\end{document}

指数

评论:

  • \@ifstar,一个 LaTeX 内核宏,用于检查以下星星。
  • \@dblarg\section,也是一个 LaTeX 内核宏;如果未给出可选参数,它将强制参数复制到可选参数中。例如,它用于。

相关内容