段落开头的 \hspace

段落开头的 \hspace

\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}

在此处输入图片描述

相关内容