我正在使用theorem
环境来排列方程。我为每个方程分配一个不同的标签。一些方程,例如\label{equation-a}
和 \label{equation-b}
,位于相同的定理环境中:
\begin{theorem}[Algebra-Basic] For any natural numbers a, b and c
\begin{IEEEeqnarray}{c}
a + b = b + a \label{equation-a}\\
a + (b + c) = (a + b) + c\label{equation-b}
\end{IEEEeqnarray}
\end{theorem}
我想将equation-a
和添加equation-b
到索引中。但是它们应该折叠在同一条目下,因为\nameref{...}
两者都会扩展为同一个字符串。问题是扩展不会发生前生成索引,结果索引列表中出现了重复项。是否可以\nameref{}
在生成索引之前让 latex 进行扩展?
答案1
我发现这两个片段可以在文档的序言中定义,以便\nameref{}
在生成索引之前强制扩展。
我还没有完全理解这些代码片段背后的细节,但似乎当标签添加到 latex 中时,其详细信息(页码、标题、超链接等)会保存为一个由五个组件组成的元组。名称是这个元组中的第三个,是使用 TEX 的一些原语提取的。\nameref{}
和之间的关键区别\getnamereftex{}
在于,可以在生成索引之前展开,而\nameref{}
不能。
\makeatletter
\newcommand{\getnamereftext}[1]{%
\@ifundefined{r@#1}{}{%
\unexpanded\expandafter\expandafter\expandafter{%
\expandafter\expandafter\expandafter\@thirdoffive\csname r@#1\endcsname
}%
}%
}
以上片段摘自:如何使用 \nameref 和 xstring 包来检查字符串长度
\getnamereftext
现在,为了在索引生成之前强制扩展,定义了下一个命令。
\newcommand{\indexref}[2]{%
\sbox0{{\nameref{#2}}}%
\expandafter\index{#1!{\getnamereftext{#2}}}}
然后,要将条目添加到索引中,用户使用命令\indexref
,例如\nameref{Definition}{Code}
。此解决方案可以正确处理通过扩展为相同文本的多个标签\nameref{}
。因此,Latex 不会根据标签的名称对索引进行排序,而是根据标签的内容进行排序。此外,如果页面上的多个标签扩展为相同的文本,则只会将一个条目添加到索引中。