\end
命令会发出命令吗\vfill
?我注意到在纯 TeX 中,有一个\bye
会发出命令,但经过一些实验后,我认为\end
也会发出命令\vfill
,这相当令人困惑。
例子:
Case 1:
Hello World\vfil
Hello World\end
Case 2:
Hello World\vfill
Hello World\end
比较上述两种情况,我们注意到,情况 1 正常放置了两行文本,而情况 2 中 TeX 将第二行文本放在中间。现在,如果\end
没有附带\vfill
,第一种情况也会将第二行文本放在中间。这就是我感到困惑的地方。
答案1
以下是大卫·卡莱尔的回答用 Don knuth 的话来说(TeXbook,第 264 页)
当 TeX 看到 \end 命令时,只有当主垂直列表已完全输出并且 \deadcycles=0 时,它才会终止作业。否则它会插入相当于
\line{} \vfill \penalty-'10000000000
进入主垂直列表,并准备再次读取“\end”标记。这具有重复调用输出例程的效果,直到所有内容都已输出。特别是,双列格式的最后一列不会丢失。
答案2
你tex.web
会发现
@<Declare act...@>=
function its_all_over:boolean; {do this when \.{\\end} or \.{\\dump} occurs}
label exit;
begin if privileged then
begin if (page_head=page_tail)and(head=tail)and(dead_cycles=0) then
begin its_all_over:=true; return;
end;
back_input; {we will try to end again after ejecting residual material}
tail_append(new_null_box);
width(tail):=hsize;
tail_append(new_glue(fill_glue));
tail_append(new_penalty(-@'10000000000));@/
build_page; {append \.{\\hbox to \\hsize\{\}\\vfill\\penalty-'10000000000}}
end;
its_all_over:=false;
exit:end;
在哪里
tail_append(new_glue(fill_glue));
暗示如您所怀疑的那样,填充胶水是由原始添加的。