\index{\protect\foo{#1}} 排序错误

\index{\protect\foo{#1}} 排序错误

当我构建以下内容时,索引最终会包含两个项目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}

相关内容