我怕用纯文字讲不清楚,所以就用下述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版本")
一周热门 更多>