解决多余空格问题

解决多余空格问题

我的文档中各个元素之间出现了很多多余的空格。问题出现在一个多次出现的宏周围。在宏的每一行后面,我都放置了%'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会被解释为\normalsize9\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 定义了一些环境,忽略环境后面的空格。这通常适用于那些切换到垂直模式的环境(即,特别是不适用于tabularminipage将用于在水平模式下设置垂直材料的环境),例如verbatim

例如,这意味着使用这样的宏:

\newcommand*{\Beispiel}[1]{
  { \sffamily{ \bfseries
      #1}
  }
}

在参数之前会设置三个有效空格,在参数之后会设置两个有效空格。

为了更好地说明,这里再次使用了相同的定义,但我用 替换了有效空格,\并用 替换了行尾,行尾也是有效空格

\newcommand*{\Beispiel}[1]{¶
  {\ \sffamily{\ \bfseries
      #1}¶
}

要删除这些空格,只需省略其中一些并注释掉其他空格:

\newcommand*{\Beispiel}[1]{%
  {\sffamily{\bfseries
      #1}%
  }%
}

差不多就是这样。最后要提到的是,整个块(例如或tabular)向右的水平移动有时只是由正常段落缩进引起的。如果该块位于段落开头或独立段落,则总是这种情况。在这种情况下,一个简单的解决方案可能是将 放在段落开头(例如 之前)。\parboxminipage\noindent\begin{tabular}

相关内容