使用 {} 时,索引的新命令会插入不需要的空格

使用 {} 时,索引的新命令会插入不需要的空格

我正在创建包含大量索引条目的技术文档。为了减少输入,我定义了一个索引命令,使用以下命令排版要索引的单词\emph{}

\newcommand{\ind}[1]{\index{#1@\emph{#1}}}

事实证明,与自己.ind输入命令相比,使用此命令时文件会获得不同的条目\index{}:使用该命令创建的条目会在命令\ind{}之前插入两个空格。因此,如果我同时使用该命令和命令(例如,使用以下命令定义区域时),索引将包含同一单词的两个条目{\emph\ind{}\index{}

\index{someword@\emph{someword}\(}

为该词建立一个区域。

以下是 MWE:

\documentclass[a4paper]{article}

\usepackage{makeidx}
\makeindex

\newcommand{\ind}[1]{\index{#1@\emph{#1}}}

\begin{document}
Testing our self-defined command\ind{italictext}. This is the
normal way\index{italictext@\emph{italictext}}.

\printindex
\end{document}

对应文件的内容.ind为:

\begin{theindex}

  \item \emph  {italictext}, 1
  \item \emph{italictext}, 1

\end{theindex}

注 1:我的实际用例不是使用\emph{},而是使用\lstinline{}listings 包中的 ,但这个简化的示例已经显示了问题。我在使用该imakeidx包时观察到了相同的行为。

注意 2:使用\DeclareRobustCommandInstead of\newcommand不会改变任何东西。

注 3:我实际上正在使用 KOMA 类 documentclass,因此该scrindex包将是一个选项,因为间距问题没有出现在那里(实际上,两个条目最终都作为一个索引条目,在文件中的\emph和开头之间有一个空格。但是,使用该包时,我无法获得索引条目的页码超链接。{.indhyperref

答案1

LaTeX 将\index其参数作为逐字参数读取,以防止命令扩展。如果\index在另一个宏的参数中使用,则的参数\index已被读取,切换到的逐字读取模式为时\index已晚。

\index在 中调用的可以通过以与 相同的方式\ind定义来修复,请参阅 中的定义:\ind\indexlatex.ltx

\def\index{%
  \@bsphack % space handling around `\index`
  \begingroup % localize category code changes
  \@sanitize % change category codes to verbatim
  \@wrindex % reads argument, writes the index entry and ends the group
}

new 示例\ind

\documentclass[a4paper]{article}

\usepackage{makeidx}
\makeindex

\makeatletter
\newcommand*{\ind}{%
  \@bsphack
  \begingroup
  \@sanitize
  \@ind
}
\newcommand*{\@ind}[1]{%
  \@wrindex{#1@\string\emph{#1}}%
}
\makeatletter

\begin{document}
Testing our self-defined command\ind{italictext}. This is the
normal way\index{italictext@\emph{italictext}}.

\printindex
\end{document}

现在,两个索引条目(.idx文件)相等:

\indexentry{italictext@\emph{italictext}}{1}
\indexentry{italictext@\emph{italictext}}{1}

答案2

您可以\string\emph在 内部使用\ind,防止 等 的过早扩展\emph以及插入杂散空格字符。

\documentclass[a4paper]{article}

\usepackage{makeidx}
\makeindex

\newcommand{\ind}[1]{\index{#1@\string\emph{#1}}}
\begin{document}
Testing our self-defined command\ind{italictext}. This is the
normal way\index{italictext@\emph{italictext}}.

\printindex
\end{document}

相关内容