在段落和子段落级别使用颜色包时,我遇到了一些奇怪的行为。请参阅下面的代码片段:
\usepackage[usenames,dvips]{color}
\section{A}
{\color{Green} \itshape Hello.}
\subsection{B}
{\color{Green} \itshape Hello.}
\subsubsection{C}
{\color{Green} \itshape Hello.}
\paragraph{D}
{\color{Green} \itshape Hello.}
\subparagraph{E}
{\color{Green} \itshape Hello.}
颜色切换位于标题后面的组中,但在段落和子段落级别的标题中被错误使用。也就是说,D 和 E 以及“Hello”文本显示为绿色(但 A、B 和 C 不是)。
请注意,\itshape
开关没有相同的行为,所以我怀疑这是颜色包内部的错误/功能。有人能解释一下吗?我遗漏了什么吗?
我正在使用标准 Ubuntu 10.04 Lucid 包中的 TeX Live 2009 版本。
编辑:只是为了清楚起见。我知道,一般来说,我可以使用非 switch 等效的 \textcolor 来解决这个问题(但 David Carlisle 建议的任何替代方案仍然有用)。我实际上是在“style”\newcommand 定义中使用它,所以我需要 switch 变体来为多个段落着色。(有很多设计层面当然,我可以通过一些方法避免这个问题,比如不使用带有颜色的样式;问题不在于此!)
我想我主要感兴趣的是这种类型的“功能”是否相对常见,是否仅限于使用颜色等细节(以及一般的隐藏原因),这样我就可以做出明智的决定,何时使用哪种 LaTeX 构造,以及哪些可能会给我带来比它们价值更多的麻烦。
答案1
显然,这是一个功能,而不是一个错误:-)
您可以使用
\leavevmode{\color{Green} \itshape Hello.\par}
在垂直模式下进行颜色切换比较棘手(在 LaTeX 中,标题后面是比较棘手的位置之一)。\textcolor
插入\leavevmode
自身可以避免这些问题,但对于一般的\color
切换来说,它造成的问题比解决的问题还多。因此,另一种方法是使用
\textcolor{Green}{\itshape Hello.}
如果这两种方式都不方便,你就需要一个命令来延迟颜色切换,直到安全为止:
\documentclass{article}
\usepackage[usenames,dvipsnames]{color}
\DeclareRobustCommand\zcolor{\ifvmode
\expandafter\def\expandafter\tmp\expandafter{\the\everypar}%
\ifx\tmp\empty
\else
\expandafter\expandafter\expandafter \leavevmode
\fi
\fi
\color
}
\begin{document}
\section{A}
{\zcolor{Green} \itshape Hello.}
\subsection{B}
{\zcolor{Green} \itshape Hello.}
\subsubsection{C}
{\zcolor{Green} \itshape Hello.}
\paragraph{D}
{\zcolor{Green} \itshape Hello.}
\subparagraph{E}
{\zcolor{Green} \itshape Hello.}
\end{document}
针对一些评论:
LaTeX(或者如果你愿意,我)尝试使颜色以与字体变化相同的方式起作用,但它完全实现了字体是水平列表中每个字符的属性,但颜色变化不是字符的属性,颜色变化由列表中的 whatsit 节点标记。如 grfguide 中所述,这可以通过多种方式影响间距。但特别是
\parbox[t]{\color{red} abc}
将与垂直列表中的第一个节点对齐,该节点是第一行上方的颜色节点,而
\parbox[t]{\mbox{}\color{red} abc}
现在颜色节点位于第一行而不是在垂直列表中,因此顶部对齐与第一行文本的基线对齐,就像没有颜色一样。
间距受到影响的另一个地方(这会影响章节标题)是 LaTeX 经常使用\addvspace
或类似的宏来尝试检查是否有任何垂直空间刚刚添加到列表中,并在这种情况下调整要添加的空间(因此两个相邻的显示或两个相邻的标题只能获得两个垂直空间中较大的一个,而不是两个的总和)但 whatsit 节点是不可移除的节点类型,因此一旦它被添加到垂直列表中,列表就不可能在该点之后解构,并且任何已经添加的垂直空间或惩罚都无法从 TeX 内部检测到。因此展示 \color...
展示通常会出现异常的额外间距,而如果没有颜色,则不会出现这种间距,因为第二个显示器看不到第一个显示器。