![\hfil 和 \hfill 之间的区别](https://linux22.com/image/408329/%5Chfil%20%E5%92%8C%20%5Chfill%20%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
我试图理解\hfil
和之间的区别\hfill
。我一直认为这些命令大致相同,只是\hfill
比 更“强大” \hfil
。因此,我认为我可以使用以下任一行将一行文本居中:
\hfil Horizontally centred \hfil
\hfill Horizontally centred \hfill
事实证明,只有第一个片段实际上使文本水平居中,但我不明白为什么。
\vfil
和 也存在类似的问题\vfill
。我的理解是\vfill
可以定义为\vspace{\fill}
,因此不能使用垂直居中一些文本
\vfill Vertically centered \vfill
因为\vspace
在页面顶部被忽略。出于同样的原因,
\vspace*{\fill} Vertically centred\vfill
应该可以工作,而且确实如此,尽管不是非常完美。类似地,您可以使用\hspace*{\fill}
水平居中文本。
\hfil
有人能清楚地解释和之间\hfill
以及\vfil
和之间的区别吗\vfill
?我知道这篇文章“fil” 和 “fill” 有什么区别?但这对我没有帮助。
为了了解发生了什么,我创建了以下 MWE:
\documentclass{article}
\usepackage[paperheight=40mm, paperwidth=80mm,showframe]{geometry}
\parindent=0pt
\begin{document}
\hfil Horizontally centred \hfil
\hfill Horizontally centred \hfill
\hspace*{\fill} Horizontally centred \hfill
\hfill Horizontally centred \hspace*{\fill}
\hfil Horizontally centred \hspace*{\fill}
\newpage
\vfil Vertically centred\vfil
\newpage
\vfill Vertically centred\vfill
\newpage
\vspace*{\fill} Vertically centred\vfill
\end{document}
生成四个页面:
当然,我知道我可以用以下方式居中文本
\centerline{Horizontally centred}
\begin{center}Horizontally centred\end{center}
但这不是我要问的......虽然我不确信我知道垂直居中文本的最佳方法!
答案1
第一种情况: \hfil Horizontally centred \hfil\par
(空白行添加\par
)。
当\par
被处理时,TeX 做的第一件事是\unskip
,然后它添加一个非常高的惩罚,所以下一个添加的粘连\hskip\parfillskip
不会被移除。由于 的默认值\parfillskip
是0pt plus 1fil
,所以你会得到居中。几乎,因为在“centered”后面有一个空格没有被移除。
第二种情况: \hfill text\hfill\par
(空白行添加\par
)。
这与以前一样有效,但现在\parfillskip
胶水已被杀死\hfill
。
第三种情况和第二个基本相同。
第四种情况:\hfill Horizontally centred \hspace*{\fill}
几乎使文本居中(记住“居中”后面的空格),因为\unskip
没有移除\hspace*{\fill}
(它内部以另一团胶水结束,只是为了这个),因为\parfillskip
胶水被杀死了。
第五起案件:\hfil
两侧的胶水(\parfillskip
分别为显式和提供)均被杀死\hspace*{\fill}
。
如何实现居中?
\par{\centering Horizontally centred\par}
对于垂直居中,
- 你必须消除
\topskip
胶水和基线跳过顶部和底部的胶水 \vspace*{\fill}
在顶部使用,在底部使用\vfill
(或更对称的)。\vspace*{\fill}
\documentclass{article}
\usepackage[paperheight=40mm, paperwidth=80mm,showframe]{geometry}
\setlength{\parindent}{0pt}
\begin{document}
\vspace*{-\topskip}
\vspace*{\fill}
\nointerlineskip
Vertically centred\par
\nointerlineskip
\vfill
\end{document}