![为什么 \hfill 在数学模式下有效,而 \vfill 无效?](https://linux22.com/image/467120/%E4%B8%BA%E4%BB%80%E4%B9%88%20%5Chfill%20%E5%9C%A8%E6%95%B0%E5%AD%A6%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%9C%89%E6%95%88%EF%BC%8C%E8%80%8C%20%5Cvfill%20%E6%97%A0%E6%95%88%EF%BC%9F.png)
此示例写了三行,每行有四个数字,每个数字之间有等长空格隔开。
\documentclass{article}
\begin{document}
\noindent
\thispagestyle{empty}%
1\hfill2\hfill3\hfill4\\5\hfill6\hfill7\hfill8\\9\hfill10\hfill11\hfill12
\end{document}
1 (SPACE) 2 (SPACE) 3 (SPACE) 4
5 (SPACE) 6 (SPACE) 7 (SPACE) 8
9 (SPACE) 10 (SPACE) 11 (SPACE) 12
这行代码在数学模式下运行正常。
\documentclass{article}
\begin{document}
\noindent
\thispagestyle{empty}%
$1\hfill2\hfill3\hfill4\\5\hfill6\hfill7\hfill8\\9\hfill10\hfill11\hfill12$
\end{document}
1 (SPACE) 2 (SPACE) 3 (SPACE) 4
5 (SPACE) 6 (SPACE) 7 (SPACE) 8
9 (SPACE) 10 (SPACE) 11 (SPACE) 12
现在我想让三行文字在页面上分布均匀,并且行间距相等。但是当我将换行符更改为时,\vfill
出现错误:
\documentclass{article}
\begin{document}
\noindent
\thispagestyle{empty}%
$1\hfill2\hfill3\hfill4\vfill5\hfill6\hfill7\hfill8\vfill9\hfill10\hfill11\hfill12$
\end{document}
! Missing $ inserted.
<inserted text>
$
l.5 $1\hfill2\hfill3\hfill4\vfill
5\hfill6\hfill7\hfill8\vfill9\hfill10\hfill...
仅当我将\vfill
s 置于数学模式之外时它才会编译:
\documentclass{article}
\begin{document}
\noindent
\thispagestyle{empty}%
$1\hfill2\hfill3\hfill4$\vfill$5\hfill6\hfill7\hfill8$\vfill$9\hfill10\hfill11\hfill12$
\end{document}
1 (SPACE) 2 (SPACE) 3 (SPACE) 4
(SPACE)
5 (SPACE) 6 (SPACE) 7 (SPACE) 8
(SPACE)
9 (SPACE) 10 (SPACE) 11 (SPACE) 12
使用amsmath
's\text
强制文本模式没有帮助。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\noindent
\thispagestyle{empty}%
$1\hfill2\hfill3\hfill4\text{\vfill}5\hfill6\hfill7\hfill8\text{\vfill}9\hfill10\hfill11\hfill12$
\end{document}
为什么\hfill
在数学模式下可以正常工作,但\vfill
在数学模式下却不行?有没有解决方法使其在数学模式下可用?手动输入时,每次需要时我都可以打开和关闭数学模式\vfill
,但使用时sagetex
输出使用打印$\sagestr{some_custom_functions(some_variable)}$
,这意味着函数输出的所有内容都必须在数学模式下可用。
答案1
$
是内联数学,这就是为什么vfill
不起作用。
但你也可以使用数组来做类似的事情。以下是 MWE:
\documentclass{article}
\begin{document}
\[\arraycolsep=10pt\def\arraystretch{3}
\begin{array}{ccc}
1 & 2 & 3 \\
4 & 5 & 6 \\
7 & 8 & 9
\end{array}
\]
\end{document}
是arraycolsep
您的hfill
,arraystretch
是您的vfill
。您可以根据需要调整这些值。
[30pt]
您还可以通过在数组中的换行符后添加类似的内容来为一行添加额外的垂直空间:
\documentclass{article}
\begin{document}
\[\arraycolsep=10pt\def\arraystretch{3}
\begin{array}{ccc}
1 & 2 & 3 \\[30pt]
4 & 5 & 6 \\
7 & 8 & 9
\end{array}
\]
\end{document}
答案2
如果处于水平模式,则基元会插入到它之前,这会导致数学模式出错。TeX 建议通过插入来关闭数学模式,并且\vfill
“需要再次读取”,正如我们在错误消息中看到的那样。\par
$
\vfill
您可以在参数\vfill
中插入您的\vadjust
内容。此原语等待段落完成,然后在创建的段落的行之间插入来自其参数的垂直材料。您的示例可能如下所示:
\noindent
$1\hfill2\hfill3\hfill4\vadjust{\vfill}\break
5\hfill6\hfill7\hfill8\vadjust{\vfill}\break
9\hfill10\hfill11\hfill12$
答案3
\vfill
您会发现,在数学模式下是非法的。但您可以改用\vspace{\fill}
。
\documentclass{article}
\usepackage[a6paper,showframe]{geometry}% for a smaller picture
\begin{document}
\thispagestyle{empty}
\noindent
$1\hfill2\hfill3\hfill4\vspace{\fill}\\
5\hfill6\hfill7\hfill8\vspace{\fill}\\
9\hfill10\hfill11\hfill12$
\end{document}
我a5paper
只是为了得到一张较小的图片并showframe
显示文本块的边界。