今天,我在自定义命令中使用带有一个可选参数的颜色时遇到了一个奇怪的问题。当我使用带有可选参数的命令时,下一段会出现缩进,而不使用参数时则不会出现缩进。
梅威瑟:
\documentclass{minimal}
\usepackage{color}
\newcommand{\heading}[1][]{%
{\color{blue}B\\}%
% {B\\}%
}%
\begin{document}
\heading[ABCD]
Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend.
\heading
Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend. Hello Darkness my old friend.
\end{document}
当使用第 5 行({\color{blue}B\\}
)时,生成的文档如下所示:
根据我的研究,无论使用color
还是,都会发生这种xcolor
情况。现在我想知道为什么会发生这种情况(这是一个错误吗?)以及如何修复此行为。
答案1
您看到的行为可以缩小到
B\\ Hello
B\\\write-1{} Hello
两条线之间的区别在于\write-1{}
。可以进一步剖析
B\nobreak\hfil\break
\space Hello
B\nobreak\hfil\break
\write-1{}\space Hello
上述代码将生成两个非常相似的水平列表(TeX 尚未将其拆分成行以组成段落的一段文本)。当 TeX 将第一个水平列表拆分成行时, 将用空白\nobreak\hfil
填充行的其余部分,并将 强制在该位置换行。然后将丢弃 ,因为它发生在行的开头,并将排版与左边距齐平。B
\break
\space
Hello
第二个水平列表的不同之处在于它包含一个\write
,它会在该点添加一个“whatsit”节点,该节点出现在行首,因为它被 打破了\break
。\space
后面的 不会被丢弃,因为它出现在行的中间。
在您的情况下,“whatsit”不是\write
,而是\special
,它被插入那里是因为当前颜色的范围结束了,并且color
包使用它\special
来恢复到以前的颜色。
为了解决这个问题,您可以添加\ignorespaces
到宏中,这样空格就会被忽略:
\newcommand{\heading}[1][]{%
{\color{blue}B\\}%
\ignorespaces
}%
或者你可以使用\textcolor{blue}{B}
,这样就不会将内容插入到下一行的开头,而是会将其插入到下一行之后,B
这样就不会干扰你的水平列表。或者更好的是,同时使用两者:
\newcommand{\heading}[1][]{%
\textcolor{blue}{B}\\%
\ignorespaces
}%