为什么 \hfills 之间的 \vrule 不居中?

为什么 \hfills 之间的 \vrule 不居中?

我有两个框,它们占据了页面的大部分宽度,\vrule中间有一个,\hfill在规则的两边各有一个,这样两个框就被推到页面的两边,规则就直接落在它们之间。然而,规则实际上总是落在它应该落在哪里的右边一点点。

\hfill我通过将each替换为 解决了该问题\hspace*{\fill}。下面用 MWE 说明了差异。为什么我需要这样做?

\documentclass{article}

\setlength{\fboxsep}{0pt}

\begin{document}

\fbox{\parbox[t]{0.3\textwidth}{this is parbox \#1}}
\hfill\vrule\hfill
\fbox{\parbox[t]{0.6\textwidth}{this is parbox \#2 (using \textbackslash{}hfill)}}

\vspace{10pt}

\fbox{\parbox[t]{0.3\textwidth}{this is parbox \#1}}
\hspace*{\fill}\vrule\hspace*{\fill}
\fbox{\parbox[t]{0.6\textwidth}{this is parbox \#2 (using \textbackslash{}hspace*)}}

\end{document}

结果: 居中规则技术比较

答案1

在这种情况下,两个命令应该是等效的。您的示例中的差异来自在可拉伸粘连之前和之后插入的额外空格。在版本中,\hspace我们有:

\fbox{...}     % <-- The line end here inserts an extra space token
\hspace*{\fill}\vrule\hspace*{\fill}    % <-- Same here
\fbox{...}

然而,在这个版本中情况有所不同\hfill

\fbox{...}            % <-- Here get a space token ...
\hfill\vrule\hfill    % <-- ... but here we don't!
\fbox{...}  

由于行以控制字结尾,因此 TeX 的输入处理器会吞噬以下行尾字符,并且不会插入空格标记。如果您用一对括号结束行,您可以看到以下版本的区别\hspace

\fbox{...}
\hfill\vrule\hfill{}
\fbox{...}

给出

在此处输入图片描述

删除所有相关行末尾的所有空格%具有相同的效果。

答案2

你输入的两个内容,如果不换行的话,看起来像

\fbox{...} \hfill\vrule\hfill \fbox{...}

\fbox{...} \hspace*{\fill}\vrule\hspace*{\fill} \fbox{...}

因为行尾会被翻译成空格。但是,第一行后面的空格\hfill会被忽略,因为它跟在控制序列名称后面。在第二个示例中,两个空格都不会被忽略(它们跟在后面},因此它们相互平衡。

\hfill在使用或不添加空格时务必小心\hspace:如果一行中只有一个空格,那没什么大不了的,但是如果有两个或更多空格,那就麻烦了,正如您所发现的。

正确的输入应该是

\fbox{\parbox[t]{0.3\textwidth}{this is parbox \#1}}% <--- No end-of-line
\hfill\vrule\hfill
\fbox{\parbox[t]{0.6\textwidth}{this is parbox \#2 (using \textbackslash{}hfill)}}

\vspace{10pt}

\fbox{\parbox[t]{0.3\textwidth}{this is parbox \#1}}% <--- No end-of-line
\hspace*{\fill}\vrule\hspace*{\fill}% <--- No end-of-line
\fbox{\parbox[t]{0.6\textwidth}{this is parbox \#2 (using \textbackslash{}hspace*)}}

在最后几行中这并不重要,因为它们后面跟着一个空行,所以行尾引入的额外空格无论如何都会被删除。

当然,为此定义宏更好:

\newcommand{\cgboxes}[2]{%
  \fbox{\parbox[t]{0.3\textwidth}{#1}%
  \hfill\vrule\hfill
  \fbox{\parbox[t]{0.6\textwidth}{#2}%
  \par
}

然后你可以输入

\cgboxes{
  this is parbox \#1
}{
  this is parbox \#2 (using \textbackslash{}hspace*
}

或者按照你的喜好使用不同的缩进样式:

\cgboxes
 {this is parbox \#1}
 {this is parbox \#2 (using \textbackslash{}hspace*}

(也可能有其他变化)。

相关内容