我可以打字
\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 团队格外小心,提供了一个高度复杂的双列算法来满足所有这些要求,尽管方法仍然不够完美。