多栏排版如何实现

多栏排版如何实现

我可以打字

\documentclass[twocolumn]{scrartcl}

让文档排版为两列。但这在内部是如何工作的?我读到TeXbook,但没有找到关于此内容的任何一段。(也许我看得不够仔细。)

答案1

该例程由 Knuth 在附录 E:示例格式,第 417 页中描述。宏用于附录 I(索引)的双列格式化。

这个算法并不难理解。所有内容都放在一个宽度等于列宽的高框中,然后拆分。对于已满的页面,这个简单的算法效果很好。唯一的复杂之处在于当内容不足时,需要平衡页面中的列。这里 Knuth 使用循环来实现它。

\begindoublecolumns宏的运行方式是首先保存当前\box255\partialpage

然后它将输出例程更改为 \doublecolumnout,更改\hsize\colwidth,并更改\vsize\bigcolheight。最后一个比原来的大一倍多一点\vsize

这允许累积非常高的列。\doublecolumnout 调用时,\vsplit 用于提取正确高度的列。

\enddoublecolumns 发生时,输出例程 \balancecolumns 使用来 \loop 尝试将当前内容分成\box255 两列等高的内容。

然后 \pagesofar 将这些盒子并排打包并将结果(连同 \partialpage,如果有)贡献到当前垂直列表,然后恢复正常处理。

Knuth 写道,

如果索引包含插入内容(例如脚注),则需要采用更困难的方法;幸运的是,它没有。

不幸的是,大多数都包含浮动图形和表格!LaTeX 团队格外小心,提供了一个高度复杂的双列算法来满足所有这些要求,尽管方法仍然不够完美。

答案2

ConTeXt 支持两种类型的多列输出:简单多列(类似于 LaTeX 的双列)和列集(对跨度图形等的控制更强)。源代码简单多列给出了很多实现细节和历史;源代码列集对于实施情况有一些意见。

相关内容