我有两个框,它们占据了页面的大部分宽度,\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*}
(也可能有其他变化)。