我的文档中各个元素之间出现了很多多余的空格。问题出现在一个多次出现的宏周围。在宏的每一行后面,我都放置了%
's,但是,仍然会出现多余的空格。
- 我可以使用什么方法来追踪导致这些空白的原因?
- 是否可能存在诸如
ifstrequal
(来自etoolbox
)、宏内部引用的宏、数学模式-文本模式切换、词汇表条目、\pageref
以及其他交叉引用和标记命令。或代码前的缩进空格等项目会导致这些问题?
答案1
TeX 的扫描仪和解析器紧密相关。如果我们假设所有字符都有其通常的 catcode,则请注意:
- 行尾被视为空格。
- 多个连续的空格合并为一个。
- 多个连续的空白行被解释为段落结束(如
\par
)。 - 如果数字后面的空格被读作数字,则将被解释为数字的结尾,因此在输出时将被忽略。这很少影响正常的 LaTeX 代码,因为在 LaTeX 中
\setcounter
,应该使用\addtocounter
、 、\value
、\roman
、\Roman
、\arabic
和来处理计数器及其值。\Alph
\the
- 宏后面的空格将被解释为宏的结束(例如:和之间没有空格
\normalsize \normalfont
则与 相同)。\normalsize\normalfont
\normalsize
\normalfont
- 宏后面紧跟的非字母也被解释为宏的结束,但会被解释(例如:
\normalsize9
会被解释为\normalsize
和9
,\textbf9
被解释为\textbf
带有参数9
,因此会导致粗体 9,和\textbf98
会被解释为\textbf
带有参数9
后跟8
和,会导致粗体 9 后跟非粗体 8)。 - 除了类和包的代码内部以及
\makeatletter
和\makeatother
字符之间@
(如果是非字母)的情况外。 - 参数括号不是字母!。
- 宏参数的右括号和左括号之间的空格将被忽略(例如
\stackrel{a} {b}
与 相同\stackrel{a}{b}
)。 - 组括号之间的空格不会被忽略(在水平模式下)。
- 可选参数后的空格(例如 之后
\section[foo]
)或宏的可选星号(例如 之后\section*
)将被忽略。 - LaTeX 定义了一些语句来尝试总结指令前后的空格(例如
\index{foo}
)。但这并不总是有效。 - LaTeX 定义了一些环境,忽略环境后面的空格。这通常适用于那些切换到垂直模式的环境(即,特别是不适用于
tabular
和minipage
将用于在水平模式下设置垂直材料的环境),例如verbatim
。
例如,这意味着使用这样的宏:
\newcommand*{\Beispiel}[1]{
{ \sffamily{ \bfseries
#1}
}
}
在参数之前会设置三个有效空格,在参数之后会设置两个有效空格。
为了更好地说明,这里再次使用了相同的定义,但我用 替换了有效空格,\
并用 替换了行尾,行尾也是有效空格¶
:
\newcommand*{\Beispiel}[1]{¶
{\ \sffamily{\ \bfseries
#1}¶
}¶
}
要删除这些空格,只需省略其中一些并注释掉其他空格:
\newcommand*{\Beispiel}[1]{%
{\sffamily{\bfseries
#1}%
}%
}
差不多就是这样。最后要提到的是,整个块(例如或tabular
)向右的水平移动有时只是由正常段落缩进引起的。如果该块位于段落开头或独立段落,则总是这种情况。在这种情况下,一个简单的解决方案可能是将 放在段落开头(例如 之前)。\parbox
minipage
\noindent
\begin{tabular}