\end 命令是否发出 \vfill

\end 命令是否发出 \vfill

\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));

暗示如您所怀疑的那样,填充胶水是由原始添加的。

相关内容