当我构建以下内容时,索引最终会包含两个项目ZZZ
,其中一个排在AAA
项目之前。如何让索引查看并操作宏的扩展值而不是未扩展的形式?
\title{Test}
\author{Me}
\documentclass[12pt]{article}
\usepackage{datatool}
\usepackage{imakeidx}
\makeindex[intoc]
\DTLgnewdb{MyDB}
\newcommand{\NameLabel}[2]{
\DTLnewrow{MyDB}
\DTLnewdbentry{MyDB}{label}{#1}
\DTLnewdbentry{MyDB}{name}{#2}
}
\newcommand{\GetName}[1]{%
\DTLforeach*[\DTLiseq{\caLabel}{#1}]{MyDB}{\caLabel=label,\caName=name}{\caName\dtlbreak}%
}
\newenvironment{MyRef}[1]{
\index{\protect\GetName{#1}} %%%% <<<< This line
\item[\GetName{#1}:]
}{
}
\begin{document}
\section{One}
\index{AAA Sorts First}
\index{ZZZ Sorts Last}
\NameLabel{TheThing}{ZZZ Sorts Last}
\begin{description}
\begin{MyRef}{TheThing} lorem ipsum \end{MyRef}
\end{description}
\printindex
\end{document}
我认为这与事物在完全展开之前进行分类有关。如果我查看test.idx
,我会看到:
\indexentry{AAA Sorts First}{1}
\indexentry{ZZZ Sorts Last}{1}
\indexentry{\GetName {TheThing}}{1}
我尝试了许多不同的排列,试图让宏扩展在值到达索引之前发生,但它们要么不起作用(构建损坏),要么没有效果。
笔记:这是真实物品的简化版本,也许可以解释一些奇怪的现象。
答案1
你的\GetName
宏不可扩展。相反,提取name
相应的一些label
第一的通过将其存储在宏中。然后您可以将其传递到其他地方\index
和/或在其他地方重复使用它。
下面的示例代码实现了这一点,这要归功于
\DTLgetvalueforkey
{<cmd>}% Macro to store the result in
{<key>}% Key (column) to extract content from
{<db>}% Database to search
{<ref key>}% Reference key (column) to search for content
{<ref val>}% Reference value to find in <ref key>
而不是通过手动处理每个元素\DTLforeach
。
\documentclass{article}
\usepackage{datatool}
\usepackage{imakeidx}
\makeindex[intoc]
\DTLgnewdb{MyDB}
\newcommand{\NameLabel}[2]{%
\DTLnewrow{MyDB}%
\DTLnewdbentry{MyDB}{label}{#1}%
\DTLnewdbentry{MyDB}{name}{#2}%
}
\newcommand{\GetName}[1]{%
\DTLgetvalueforkey{\LabelName}{name}{MyDB}{label}{#1}%
}
\newenvironment{MyRef}[1]{%
\GetName{#1}%
\item[\LabelName:]\index{\LabelName}%
}{%
}
\begin{document}
\section{One}
\index{AAA Sorts First}
\index{ZZZ Sorts Last}
\NameLabel{TheThing}{ZZZ Sorts Last}
\begin{description}
\begin{MyRef}{TheThing} lorem ipsum \end{MyRef}
\end{description}
\printindex
\end{document}