我正在创建包含大量索引条目的技术文档。为了减少输入,我定义了一个索引命令,使用以下命令排版要索引的单词\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:使用\DeclareRobustCommand
Instead of\newcommand
不会改变任何东西。
注 3:我实际上正在使用 KOMA 类 documentclass,因此该scrindex
包将是一个选项,因为间距问题没有出现在那里(实际上,两个条目最终都作为一个索引条目,在文件中的\emph
和开头之间有一个空格。但是,使用该包时,我无法获得索引条目的页码超链接。{
.ind
hyperref
答案1
LaTeX 将\index
其参数作为逐字参数读取,以防止命令扩展。如果\index
在另一个宏的参数中使用,则的参数\index
已被读取,切换到的逐字读取模式为时\index
已晚。
\index
在 中调用的可以通过以与 相同的方式\ind
定义来修复,请参阅 中的定义:\ind
\index
latex.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}