![段落开头的 \hspace](https://linux22.com/image/356643/%E6%AE%B5%E8%90%BD%E5%BC%80%E5%A4%B4%E7%9A%84%20%5Chspace.png)
\hspace
在许多情况下,在新行的开头忽略 是有道理的(这已经讨论过很多次了)。但是为什么\hspace
不在段落的开头忽略 呢?这是故意的吗?这样做的理由是什么?如果\hspace
是宏的一部分,我希望\hspace
无论它是出现在段落内换行符的开头还是段落的开头,都忽略 。如何才能做到这一点?
这是一个简单的例子
\documentclass{article}
\begin{document}
foo bar\\ baz
\hspace{2em} hspace indents at beginning of paragraph.\\
\hspace{2em} Otherwise it does not indent at beginning of line
Why?
\end{document}
答案1
\hspace
本质上扩展为\hskip
产生了 TeX 所称的“胶水”。胶水属于可丢弃项目。这些是 TeX 在换行符处丢弃的内容。由于\\
本质上是\unskip\nobreak\hfil\break
,TeX 会丢弃以下\hskip
。
为了防止丢弃胶水,您可以使用\hspace*
。但这不是您想要的。
您想要一种方法来忽略行首的空格。一种可能的方法是创建一个新的间距宏,该宏仅在水平模式下插入空格。
\newcommand*\smarthspace[1]{%
\ifhmode
\hspace{#1}%
\fi
}
这里有两个需要注意的地方:正常的段落缩进仍然会发生,使用\noindent
来抑制缩进会导致 TeX 切换到水平模式,因此会插入空格。对此我没有好的解决方案。
\documentclass{article}
\newcommand*\smarthspace[1]{%
\ifhmode
\hspace{#1}%
\fi
}
\begin{document}
foo bar\\ baz
\smarthspace{2em} smarthspace does not add a space at beginning of paragraph\\
\smarthspace{2em} nor at the beginning of a line.\smarthspace{2em} It will in
the middle.
\end{document}