我用它来分隔彩色文本。但是在以下情况下,\begin{@empty}\color{red} . . . \end{@empty}
它会在后面插入一个额外的空白行:\end{@empty}
\documentclass{article}
\usepackage{xcolor}
\begin{document}
\begin{@empty}\color{red}%
Paragraph starts abcd abcd abcd abcd abcd abcd abcd abcd
\[
a = 1
\]%
\end{@empty}%
New paragraph ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl
\end{document}
如果你注释掉\color{red}
,这个空白行就消失了!我想知道如何在使用时避免出现这个空行\color{red}
。
%
顺便说一句,即使没有 ,也需要像 一样\end{@empty}%
来防止出现空行,这有点烦人\color{red}
。
最终,我希望有一个绝对没有影响除了限制范围之外\color{red}
。
我使用最新 texlive 发行版中的 lualatex 和 pdflatex。
编辑:我没有说清楚我的目标是定义一个环境,该环境会为封闭的文本着色,并且不会产生其他影响。在尝试编写这样的环境的过程中,我遇到了上述问题。我的最终目标是使用最少的标记快速系统地在彩色文本和无色文本之间切换。Davidmonochrome
下面提到的选项可以工作,但我仍然不知道如何避免多余的空白行。(除了我可以删除数学后的空行并用它\hspace*{\parindent}
来表示段落的开头。)luacolor
解决方案是理想的,但我不知道如何确保我的发布者使用 luatex。。。。(我提到 pdflatex 和 lualatex 只是为了暗示问题发生在两个编译器上。)
答案1
TeX 中的组不是无操作的,它们有效果,所以如果您希望对间距没有可观察到的影响(这实际上出奇地困难),您需要补偿组,而不是什么都不做。
即使是一个简单的组,你也可以看到类似的效果{}
。
a b
和
a b
产生与多个空格组合相同的输出,但是
a {} b
留出双倍空间,你需要
a {}b
或(更接近您使用的形式)
a {}%
b
或者(更接近我下面建议的形式)
a {\aftergroup\ignorespaces}
b
在 a 和 b 之间留一个空格。
\ignorespaces
LaTeX 有一个标准命令,可以在环境创建的组之后使用,\ignorespacesafterend
因此这会产生正确的间距,而不需要%
\documentclass{article}
\usepackage{xcolor}
\newenvironment{zz}{}{\ignorespacesafterend}
\begin{document}
\begin{zz}%\color{red}%
Paragraph starts abcd abcd abcd abcd abcd abcd abcd abcd
\[
a = 1
\]
\end{zz}
New paragraph ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl
\end{document}
但是如果你添加颜色
请注意,额外的行实际上是第一段的额外(白色)行,它不是垂直空间,并且不会在分页符处被删除。
事实上,很难避免颜色命令影响间距,这就是为什么软件包中color
有一个monochrome
选项允许您禁用所有颜色命令而不是将其注释掉,这至少使得文档的彩色和黑色版本之间的间距保持一致。
问题在于该\color
命令插入(再次通过\aftergroup
)一种颜色特殊字符来恢复颜色,但是这种特殊字符(或 pdf 文字原语)的存在会干扰显示结束数学逻辑,以决定显示后段落是否继续。
您可以(至少在这里)禁用自动颜色恢复并在更安全的地方手动添加它。
\documentclass{article}
\usepackage{xcolor}
\newenvironment{zz}{}{\ignorespacesafterend}
\makeatletter
\def\restorecolor{\reset@color}
\def\norestorecolor\reset@color{}
\makeatother
\begin{document}
\begin{zz}\aftergroup\norestorecolor\color{red}%
Paragraph starts abcd abcd abcd abcd abcd abcd abcd abcd
\[
a = 1
\restorecolor
\]
\end{zz}
New paragraph ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl
\end{document}
答案2
David 已经解释了发生了什么。但是正如您提到的 lualatex:您可以使用 来避免此问题luacolor
,它使用属性而不是特殊值,因此不会干扰数学间距:
\documentclass{article}
\usepackage{xcolor,luacolor}
\begin{document}
\begin{@empty}\color{red}%
Paragraph starts abcd abcd abcd abcd abcd abcd abcd abcd
\[
a = 1
\]%
\end{@empty}%
New paragraph ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl
\end{document}
答案3
\documentclass{article}
\usepackage{xcolor}
\newenvironment{Color}[1][red]{\color{#1}}{\ignorespacesafterend}
\begin{document}
\begin{Color}
Paragraph starts: abcd abcd abcd abcd abcd abcd abcd abcd abcd abcd
\[
a = 1
\]
\end{Color}
New line---not new paragraph---starts: ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl
\begin{Color}[blue]
Paragraph starts: abcd abcd abcd abcd abcd abcd ab
\end{Color}
New line---not new paragraph---starts: ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl ijkl
\end{document}