背景
创建具有不同宽度列的自定义多列布局。
问题
这个问题在之前的回答:
设置
page=yes
会导致一个不良副作用:书中各章节之间交织着空白页。可以使用 Ghostscript 进行后期处理来消除这些空白页...
换句话说,如果没有该page=yes
选项,ConTeXt 就无法按预期格式化文本。如果选择该page=yes
选项,ConTeXt 会按预期格式化文本,但会在主要部分之间导出不想要的空白页。
代码
说明问题的最小工作示例:
\definepapersize[BookPaperSize][width=24in, height=12in,]
\setuppapersize[BookPaperSize]
\definelayout[BookTextLayout][
topspace=.5in,
backspace=.5in,
header=\zeropoint,
footer=\zeropoint,
grid=yes,
]
\setuplayout[BookTextLayout]
\definecolumnset[BookColumns][n=4,distance=.25in]
\setupcolumnset[BookColumns:1][width=11.75in]
\setupcolumnset[BookColumns:2][width=3.46in]
\setupcolumnset[BookColumns:3][width=3.46in]
\setupcolumnset[BookColumns:4][width=3.46in]
\setuphead[section][
page=yes,
beforesection={\startcolumnset[BookColumns]},
aftersection={\stopcolumnset},
]
\setuphead[subsection][
after={\column},
]
\setuphead[subsubsection][
after={\blank[small]},
]
\starttext
\startsection[title={Section Title}]
\startsubsection[title={Subtitle}]
\dorecurse{2}{\input knuth}
\dorecurse{2}{%
\startsubsubsection[title={Subsubtitle}]
\dorecurse{1}{\input ward}
\dorecurse{2}{\input lorem}
\dorecurse{1}{\input bryson}
\stopsubsubsection
}
\stopsubsection
\stopsection
\stoptext
实际产量
每个部分之前的页面都是空白的:
无页输出
删除该选项后page=yes
,输出会出现问题:
该\column
命令似乎不再考虑列宽,并且文本聚集在第一列的底部。
预期输出
期望的输出在主要部分之间不会有空白页:
解决方法
这生成的 PDF包含多个页面。使用Ghostscript用于删除所有其他页面(例如,使用gs -sPageList=even
),从而产生所需的结果:
然而,额外的空白页会导致连锁问题:额外的图像处理步骤、PDF 页面需要重新排序以及由于需要两次传递而增加的编译时间。
问题
需要进行哪些更改才能从文档中消除空白页?
想法
添加和删除page=yes
可以解决空白页的问题;但是,第一页的列集会挤到左边。我尝试使用以下方法解决该问题:\definecolumnset
page=yes
setuphead
\definecounter[BookPageNumber][
way=bychapter,
prefix=no,
]
\definecolumnset[BookColumns][n=4,distance=.25in,page={\doifelse{\rawcountervalue[BookPageNumber]}{1}{}{yes}}]
\setupcolumnset[BookColumns:1][width=11.75in]
\setupcolumnset[BookColumns:2][width=3.46in]
\setupcolumnset[BookColumns:3][width=3.46in]
\setupcolumnset[BookColumns:4][width=3.46in]
\setuphead[section][
before={%
\doif{\rawcountervalue[BookPageNumber]}{1}{\page}
\incrementcounter[BookPageNumber]
},
beforesection={\startcolumnset[BookColumns]},
aftersection={\stopcolumnset},
]
但这并没有产生期望的输出。
答案1
列集是基于跨页的,也就是说,n=4
您实际上有八列,即左页四列,右页四列。文档总是以您未设置的右页打开,这就是添加\page[yes]
有帮助的原因,因为它会将内容推到已设置的左页。
因此,只需在右页添加第 5-8 列即可解决问题。
\definepapersize[BookPaperSize][width=24in, height=12in,]
\setuppapersize[BookPaperSize]
\definelayout[BookTextLayout][
topspace=.5in,
backspace=.5in,
header=\zeropoint,
footer=\zeropoint,
grid=yes,
]
\setuplayout[BookTextLayout]
\definecolumnset[BookColumns][n=4,distance=.25in]
\setupcolumnset[BookColumns:1][width=11.75in]
\setupcolumnset[BookColumns:2][width=3.46in]
\setupcolumnset[BookColumns:3][width=3.46in]
\setupcolumnset[BookColumns:4][width=3.46in]
\setupcolumnset[BookColumns:5][width=11.75in]
\setupcolumnset[BookColumns:6][width=3.46in]
\setupcolumnset[BookColumns:7][width=3.46in]
\setupcolumnset[BookColumns:8][width=3.46in]
\setuphead[section][
%page=yes,
beforesection={\startcolumnset[BookColumns]},
aftersection={\stopcolumnset},
]
\setuphead[subsection][
after={\column},
]
\setuphead[subsubsection][
after={\blank[small]},
]
\starttext
\startsection[title={Section Title}]
\startsubsection[title={Subtitle}]
\dorecurse{2}{\input knuth}
\dorecurse{2}{%
\startsubsubsection[title={Subsubtitle}]
\dorecurse{1}{\input ward}
\dorecurse{2}{\input lorem}
\dorecurse{1}{\input bryson}
\stopsubsubsection
}
\stopsubsection
\stopsection
\stoptext