背景

背景

背景

创建具有不同宽度列的自定义多列布局。

问题

这个问题在之前的回答

设置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可以解决空白页的问题;但是,第一页的列集会挤到左边。我尝试使用以下方法解决该问题:\definecolumnsetpage=yessetuphead

\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

在此处输入图片描述

相关内容