我在使用命令时遇到问题\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 ...