\halign 与 \hfil 有何不同?

\halign 与 \hfil 有何不同?

假设我们有三个水平对齐的文本块。为什么示例 1不同于示例 2后者应该做哪些改变才能使其看起来像前者?

笔记:我添加规则只是为了直观地指示文本块的位置。

示例 1

\def\text{%
  Inde igitur, inquit,
  ordiendum est. Tibi
  hoc incredibile, quod
  beatissimum.
}
\long\def\vtopragged#1#2{\vrule\kern-.4pt\vtop{\prevdepth=2pt\hsize=#1 \raggedright #2}\vrule\kern-.4pt}
\begingroup
\parindent=0pt
\tabskip=0pt
\topskip=0pt
\hrule
\kern-.4pt
\halign to\hsize{%
  \vtopragged{.2\hsize}{#}\tabskip=0pt plus 1fill &
  \vtopragged{.2\hsize}{#}\tabskip=0pt plus 1fill &
  \vtopragged{.2\hsize}{#}\tabskip=0pt \cr
  \text&
  \text&
  \text\cr
}
\hrule
\kern-.4pt
\endgroup
\bye

示例 2

\def\text{%
  Inde igitur, inquit,
  ordiendum est. Tibi
  hoc incredibile, quod
  beatissimum.
}
\long\def\parbox#1{%
  \vtop{
    \hsize0.2\hsize
    \parindent0pt
    \raggedright
    #1\par
  }%
}
\topskip=0pt
\hrule
\noindent
\vrule height 10pt
\parbox{\text}\hfil
\vrule
\parbox{\text}\hfil
\vrule
\parbox{\text}
\vrule
\hrule
\bye

答案1

除了缺少规则之外,不同之处在于\halign不关心\parfillskip,因为它会以垂直模式生成一个框。您\hfil在第二个示例中使用 ,它无法消除\parfillskip。如果您使用 ,事情就会顺利进行\hfill

\def\text{%
  Inde igitur, inquit,
  ordiendum est. Tibi
  hoc incredibile, quod
  beatissimum.
}
\long\def\vtopragged#1#2{\vrule\kern-.4pt\vtop{\prevdepth=2pt\hsize=#1 \raggedright #2}\vrule\kern-.4pt}

\begingroup
\parindent=0pt
\tabskip=0pt
\topskip=0pt
\hrule
\kern-.4pt
\halign to\hsize{%
  \vtopragged{.2\hsize}{#}\tabskip=0pt plus 1fill &
  \vtopragged{.2\hsize}{#}\tabskip=0pt plus 1fill &
  \vtopragged{.2\hsize}{#}\tabskip=0pt \cr
  \text&
  \text&
  \text\cr
}
\hrule
\kern-.4pt
\endgroup
\bigskip

\long\def\parbox#1{%
  \vtop{
    \hsize0.2\hsize
    \parindent0pt
    \raggedright
    #1\par
  }%
}
\topskip=0pt
\hrule
\noindent
\vrule
\parbox{\text}\vrule\hfill\vrule
\parbox{\text}\vrule\hfill\vrule
\parbox{\text}\vrule
\hrule
\bye

在此处输入图片描述

请注意,在中使用fill单位\tabskip没有影响,因为fil就足够了(\halign to \hsize类似于);比较在第一个示例和第二个示例中使用\hbox to \hsize时的输出,其中的效果显而易见。fil\hfil\parfillskip

在此处输入图片描述

相关内容