如何在双列布局中对齐线条?

如何在双列布局中对齐线条?

我正在尝试在纯 TeX(准确地说是 pdftex)中使用双列布局,其中两列中的文本行垂直对齐。以下是我目前得到的结果(代码如下):

(损坏的)两列布局示例

正常行应占用 12pt 的垂直空间,标题(A 和 B)位于列中间时应占用 36 pt,位于列顶部时应占用 24 pt。我的目标是让左侧和右侧的行具有相同的垂直位置,就像行 1a 和 7g 目前所做的那样。

我的问题:

  1. 节标题 A 由vskip12pt 的 a 和vbox高度为 24pt 的 a 组成。我希望它占用的空间与三行相同。图片显示,标题占用的空间略多,将第 6f 行向下推了一点。我怎样才能让节标题 A 恰好占用三行空间?

  2. 对于标题 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。此粘连称为行间粘连。如果行间粘连小于 ,\lineskiplimitTeX 会在行与行之间设置\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}}

相关内容