为什么 \hfill 在数学模式下有效,而 \vfill 无效?

为什么 \hfill 在数学模式下有效,而 \vfill 无效?

此示例写了三行,每行有四个数字,每个数字之间有等长空格隔开。

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

仅当我将\vfills 置于数学模式之外时它才会编译:

\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您的hfillarraystretch是您的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显示文本块的边界。

在此处输入图片描述

相关内容