我正在尝试在纯 TeX(准确地说是 pdftex)中使用双列布局,其中两列中的文本行垂直对齐。以下是我目前得到的结果(代码如下):
正常行应占用 12pt 的垂直空间,标题(A 和 B)位于列中间时应占用 36 pt,位于列顶部时应占用 24 pt。我的目标是让左侧和右侧的行具有相同的垂直位置,就像行 1a 和 7g 目前所做的那样。
我的问题:
节标题 A 由
vskip
12pt 的 a 和vbox
高度为 24pt 的 a 组成。我希望它占用的空间与三行相同。图片显示,标题占用的空间略多,将第 6f 行向下推了一点。我怎样才能让节标题 A 恰好占用三行空间?对于标题 B,原本希望
vskip
丢弃(因为分页符),只留下vbox
高度为 24pt 的。图片显示标题 B 占用了远多于 2 行的垂直空间。我该如何删除多余的空间,以便行 15o 和 21u 垂直对齐?
这是我的代码:
% !TEX TS-program = pdftex
% tiny pages for testing
\pdfpageheight 92pt\voffset -62.27pt\vsize72pt
\pdfpagewidth 120pt\hoffset -62.27pt\hsize50pt
\parindent0pt\parskip0pt\topskip0pt
% a very simple two-column layout
\newbox\leftcol
\newif\ifleftcol\leftcoltrue
\def\xout{\ifleftcol
\global\setbox\leftcol\box255
\global\leftcolfalse
\else
\shipout\vbox to 72pt{\hbox to 100pt{\box\leftcol \box255}}%
\global\leftcoltrue
\fi}
\output{\xout}
% section headings (2 lines on top of column, 3 line otherwise)
\font\bigfont=ecbx2488
\def\section#1{\vskip1\baselineskip\vbox to24pt{\vss\noindent\bigfont#1}}
% visually mark the baselines for testing
\everypar{\hbox to0pt{\vrule height.1pt depth.1pt width50pt\hss}}
\obeylines
1a
2b
\section{A}
6f
7g
8h
9i
10j
11k
12l
\section{B}
15o
16p
17q
18r
19s
20t
21u
22v
23w
24x
\bye
答案1
一般建议:
堆叠箱子时,请注意出现的\lineskip
。使用
\nointerlineskip
或\offinterlineskip
并应用 a\strut
可了解线条的高度和深度。
示例的详细信息:
1)\topskip
用于使第一行位于相同位置。TeX 计算宽度(topskip - 第一行的高度)并将此差值作为粘连点放在页面的开头。这\topskip=0pt
意味着带有“a”的行和带有“h”的行的基线与打印区域顶部的距离不同。这不是您想要的。
2)\topskip=10pt
对于 cmr10 来说已经足够了。\vsize
然后应设置为 (行数 - 1)baselineskip + topskip。这\topskip=\baselineskip
对第二页的 B 框很有用。
因此设置\topskip=12pt
并保持\vsize=72pt
。
3) 与 1) 中的过程类似,行与行之间所需的粘连是通过一行的深度和下一行的高度计算得出的,从而得出距离
\baselineskip
。此粘连称为行间粘连。如果行间粘连小于 ,\lineskiplimit
TeX 会在行与行之间设置\lineskip
粘连。大字母的框大于 ,\baselineskip
因此\lineskip
应用 。它设置为 1pt,这使得 A 和 6f 的行比右侧的行低 1pt。(使用\tracingoutput=1
和\showboxdepth=100
,\showboxbreadth=100
查看页面内容并搜索\lineskip
。)
\nointerlineskip
因此,在您的定义中使用\section
。
4) 您的规则将深度增加 0.1pt。因此,A 部分在 2b 之后将基线更改了 36pt 以上一点。不\vskip
关心前一行的深度。(最好\strut
在行中使用,这样您就知道它的深度,即所有行都具有相同的深度;可以\vskip
更改,以便恰好\baselineskip
位于框上方。)
因此,在这个例子中,不\vskip1\baselineskip
使用\vskip11.9pt
深度为零的线后的完美对齐。
这将使用您的输入修复两个页面:
\topskip12pt
\def\section#1{\vskip11.9pt\nointerlineskip
\vbox to24pt{\vss\noindent\bigfont#1}}