\index 导致虚假空白

\index 导致虚假空白

我在使用命令时遇到问题\index,导致出现不需要的空格:

\documentclass[a4paper,11pt,oneside]{book}
\usepackage{makeidx}
\makeindex

\def \nothing #1{}

\begin{document}

\noindent The Principle of Availability\\\index{principle of availability}
What is said must be intuitively accessible to the conversational participants, 
unless something goes wrong and they cannot be counted as `normal interpreters'.

\end{document}

如果编译了此命令,则以“所说的内容”开头的行会略微缩进。如果我在命令后添加\relax, 或 ,则此缩进会消失,我猜是因为这会吞噬其后的换行符。如果根本没有索引命令(即行在 之后结束),或者如果我将其替换为虚假空格,则也会消失。%index{...}\\\nothing{...}

如果我改为\index\nothing通过\nothing定义它来插入一个空的水平盒子\def \nothing #1{\hbox{}},问题又回来了。所以我猜想\index应该插入一些内容,让 LaTeX 不再忽略换行符。

有没有办法可以防止\index造成空白?

请注意,上面的内容实际上是一些宏扩展的结果,因此“将 移至\index下一行”对我没有帮助。此外,我尝试包装\index自己的宏,在\relax后面插入 ,但这也不起作用。

答案1

latex.ltx\index则每次执行时,命令都会(正确)定义\makeindex。否则,它实际上什么也不做。

如果您对细节不感兴趣,请跳过此部分...


正确的定义是

\show\index
> index=macro:
->\@bsphack \begingroup \@sanitize \@wrindex

尽管

\show\@wrindex
> \@wrindex=macro:
#1->\protected@write \@indexfile {}{\string \indexentry {#1}{\thepage }}\endgroup \@esphack

因此,本质上\index具有以下结构:

\@bsphack
\begingroup
...
\endgroup
\@esphack

\@bsphack和都\@esphack充​​当分组伙伴,在它们所包围的内容之前和之后执行某些操作。这仅在水平模式1下发生,您的示例就是这种情况;\index{...}放置在 和 之后\\,是段落的第一个标记。\@esphack应该应用\ignorespaces,但这是仅有的如果的值\lastskip大于0pt

\show\@esphack
> \@esphack=macro:
-> \relax
   \ifhmode
     \spacefactor\@savsf
     \ifdim\@savsk>\z@
       \ignorespaces
     \fi
   \fi

由于之前没有跳过\index\lastskip=0pt因此\ignorespaces永远见不到曙光。

1阅读什么是垂直模式和水平模式?了解更多信息。


...我们回来了!

如果你必须使用\index,那么你可以用这种方式重新定义它 \makeindex

\let\oldindex\index
\renewcommand*{\index}[1]{\oldindex{#1}\ignorespaces}

这将存储\index在 中\oldindex并将其附加到\ignorespaces,同时处理紧随其后的虚假空格\\以及上面描述的附加小案例中的虚假空格。

或者,创建自己的索引命令

\newcommand*{\myindex}[1]{\index{#1}\ignorespaces}% \myindex{<entry>}

其作用与上述相同。不过,它要求您使用\myindex而不是\index

答案2

这是默认行为,请始终以这种方式使用它:

\noindent The Principle of Availability\\
    
What\index{principle of availability} is said must be intuitively ... 

相关内容