![定义索引的别名](https://linux22.com/image/290581/%E5%AE%9A%E4%B9%89%E7%B4%A2%E5%BC%95%E7%9A%84%E5%88%AB%E5%90%8D.png)
我们定义了以下命令来为发布生成索引
\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
可能会错过 的条目),并使其更紧凑(对同一页面的两个引用被“压缩”在一个引用中)。nodes
vertices
是否有一个可以解决这个问题的软件包(或者\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 内核宏;如果未给出可选参数,它将强制参数复制到可选参数中。例如,它用于。