在 \index{...} 中使用计数器

在 \index{...} 中使用计数器

当尝试在文档中使用计数器值时,\index会发生奇怪的行为。似乎该值将在文档末尾进行评估,此时计数器已经更改。因此,计数器的所有出现都具有相同的值。

\documentclass{article}

\usepackage{makeidx}
\makeindex

\begin{document}

\section{First Section}
\index{first \arabic{section}}

\section{Second Section}
\index{second \arabic{section}}

\section{Third Section}
\index{third \arabic{section}}

\printindex

\end{document}

得出以下索引:

错误索引

但我希望:

所需索引

答案1

\index逐字逐句地读取其参数,因此宏不会被展开。因此,您将在生成的索引文件中看到索引设置时的\arabic{section}计数器数量。section

一种方法是使用宏\Index,在传递给逐字读取之前先读取其参数。这样宏就会被扩展。在宏前面\index使用可以关闭不必要的扩展。\string

\documentclass{article}

\usepackage{makeidx}
\makeindex

\newcommand*{\Index}[1]{\index{#1}}

\begin{document}

\section{First Section}
\Index{first \arabic{section}}

\section{Second Section}
\Index{second \arabic{section}}

\section{Third Section}
\Index{third \arabic{section}}

\printindex

\end{document}

结果:

  • test.idx
\indexentry{first 1}{1}
\indexentry{second 2}{1}
\indexentry{third 3}{1}
  • test.ind
\begin{theindex}

  \item first 1, 1

  \indexspace

  \item second 2, 1

  \indexspace

  \item third 3, 1

\end{theindex}
  • 指数:

结果

答案2

的参数\index按字面意思读出,因为通常情况下这是必需的。您不希望这样,因此最简单的方法是将其放入\index任何命令中。\mbox将执行:

\documentclass{article}

\usepackage{makeidx}
\makeindex

\begin{document}

\section{First Section}

\mbox{\index{first \arabic{section}}}

\section{Second Section}
\mbox{\index{second \arabic{section}}}

\section{Third Section}
\mbox{\index{third \arabic{section}}}

\printindex

\end{document}

答案3

另一种方法是使用\label/\ref

\documentclass{article}

\usepackage{makeidx}
\makeindex

\begin{document}

\section{First Section}\label{sec:one}
\index{first \ref{sec:one}}

\section{Second Section}\label{sec:two}
\index{second \ref{sec:two}}

\section{Third Section}\label{sec:three}
\index{third \ref{sec:three}}

\printindex

\end{document}

相关内容