如何做出类似期刊的拟浮动体密排板式

2020-04-12 19:09发布

我怕用纯文字讲不清楚,所以就用下述javascript伪代码的方式给出我想实现的算法。 还是先用文字描述一下吧。我现在想实现类似期刊的密排板式,就是根据每篇文章排到最后一页的内容消耗的版心高度百分比...

我怕用纯文字讲不清楚,所以就用下述javascript伪代码的方式给出我想实现的算法。 还是先用文字描述一下吧。我现在想实现类似期刊的密排板式,就是根据每篇文章排到最后一页的内容消耗的版心高度百分比 $h$ ,来判断当前页和下一页的排版行为。 具体而言如下: 如果 $h > 0.5$ 则该尾页内容允许排在当前页;-------(1) 否则,需要判断前文是否有适当的空位可容纳该尾页内容, --若有,则将该尾页内容前移至可容纳页;-------(2) --若无,则将该尾页内容底部对齐,并**本页**顶部继续排版下一篇文章-------(3) 其中情形(3)的效果图如下 ![](https://pics.latexstudio.net/data/images/202004/3f65b5fd12367d6.png) 如果上述文字描述得不够清楚,可以参考一下下面算法的伪代码 ```javascript var 剩余空间队列 = [] // 一个保存每篇文章剩余空间的数据结构 const TEXT_HEIGHT = 15 // 该数值是模拟,届时在程序中直接由\textheight给定 const 文章库 = [file('article1.tex'), file('article2.tex'), ...] // 届时在程序中对应\input{article1.tex}... function 找可容纳页(已用空间占比) { for (剩余空间对象 in 剩余空间队列) { let 其他文章剩余空间 = 1 - 剩余空间对象.height if 其他文章剩余空间 - 0.1 < 已用空间占比 < 其他文章剩余空间: return 剩余空间对象.page } // for return 0 } // 找可容纳页 for (文章 in 文章库) { let 排好的文章 = 从当前页面顶部开始排版(文章) let 尾页内容 = 最后一页的内容(排好的文章) let 已用空间占比 = 尾页内容.已用高度 / TEXT_HEIGHT if (已用空间占比 > 0.9) newpage() // \newpage命令 else if (已用空间占比 > 0.5) { let height = 剩余纵向空间(尾页内容) // 百分比 剩余空间队列.push({ 'height': height, 'filename': 文章.文件名, 'page': 尾页内容.page }) newpage() } // else if else { // 已用空间占比 < 0.5 let page = 找可容纳页(已用空间占比) if (page > 0) { 将内容移至指定文章页底部(尾页内容, page) /* 忽略可能带来的额外的纵向间距,这个移动只能向前移,势必会改动已排好的页面, * 但tex编译器不会回溯修改已排好的页面,所以此处允许参考交叉引用或参考文献 * 的方式设计算法,生成临时文件,并进行2-4次编译。即将 * last_page_content的内容先写入临时文件,在下一次编译的时候才写入指定页page */ newpage() } // if else 将内容移至本页底部(尾页内容) // 忽略可能带来的额外的纵向间距 } // else } // for ``` 鉴于网站的贴代码功能还没成熟,开头的空格缩进会被吃掉,所以我又贴了一份代码去[http://paste.ubuntu.com](http://paste.ubuntu.com) 。链接自2020年4月12日起一年内有效。 [javascript版本](https://paste.ubuntu.com/p/pq4FNCd7j3/ "javascript版本") [python版本](https://paste.ubuntu.com/p/tjsktSZYXp/ "python版本")