背景
尝试确定是否必须在双列页面上插入分栏符。页面上有多个部分。我想在页面的最后一部分之前插入分栏符,但前提是在第一列内,并且第二列有足够的空间(即不强制分页)。
问题
下面的代码说明了这个问题:
\starttext
\startcolumns[n=2, balance=no]
\startsection[title=Section1]
\input knuth
\stopsection
\startsection[title=Section2]
\input zapf
\stopsection
\column
\startsection[title=Section3]
\input knuth
\stopsection
\stopcolumns
\stoptext
不应应用分页\column
符,因为第 3 节位于第二列,这会导致不必要的分页符。需要澄清的是,确定是否分页的条件应该与文本本身无关。例如,类似这样的内容:
\setuphead[chapter][
before={\startcolumns[n=2, balance=no,]},
after={\stopcolumns},
]
% If the section is the last section in the chapter
% *and* the section is not in the last column *and*
% inserting a column break does not cause pagination...
\setuphead[section][
before={%
\if_last_section{%
\if_not_last_column{%
\if_fits_in_last_column_without_pagination{\columnbreak}
}
}
},
]
\starttext
\startchapter
\startsection[title=Section1]
\input knuth
\stopsection
\startsection[title=Section2]
\input zapf
\stopsection
\startsection[title=Section3]
\input knuth
\stopsection
\stopchapter
\stoptext
问题
如果某个部分位于第一列,则如何强制 ConTeXt 插入分栏符,但如果该部分位于第二列,则不插入分栏符?
有关的
对于 LaTeX 来说非常相似的问题:
使用 LaTeX,以下代码(文档类的一部分)帮助动态确定是否应存在分栏符:
\def\columnbreakunlesslast{%
\docolaction{\typeout{in first column}\inlastfalse}%
{\typeout{in middle column}\inlasttrue}%
{\typeout{in last column}\inlasttrue}%
\unless \ifinlast \columnbreak \fi
}
这样,在编写文档时就不需要手动插入分栏符了。
答案1
我会尽量讲得简单。你有两个选择,第一个是:
\columnbreak
第二种选择是使用 涂抹一些胶水\vfil
,这完全取决于可拉伸或可收缩的程度,如果需要更多的胶水,请在盒子上涂抹\vfill
或。使用或制作一个垂直盒子。建议使用后者,因为使用或可以拉伸和收缩,然后再拉伸和收缩一些。我说过 ConTeXt 比 LaTeX 可以拉伸更多吗?\vfilll
\vtop
\vbox
\columnbreak
\vfill
因此在 ConTeXt 中代码如下所示:
\vfil
\vbox{%
\input tufte
}
\vfil
\vbox{%
\input knuth\columnbreak % or \vfill
}
例如,考虑一下这个。
\starttext
\setuppagenumbering[state=stop]
\startcolumns[n=3, balance=no]
\section[1]
\input knuth
\section[2]
\input zapf
\section[3]
\vfil
\vbox{%
\input knuth
}
\stopcolumns
\stoptext
或者更好的是,这个。
\def\doed\par{%
\vfil
\vbox{%
\input tufte
}}
\starttext
\hyphenation{wh-e-at}
\hyphenation{me-r-ge}
\hyphenation{st-r-ong-ly}
\setuppagenumbering[state=stop]
\startcolumns[n=3, balance=no]
\section[1]
\input knuth
\section[2]
\input zapf
\section[3]
\doed %The first break is applied.
\input zapf
\section[4]
\doed %The second one follows.
\input zapf
\input knuth
\stopcolumns
\stoptext
或者在第一列之后分列
\def\doed\par{%
\vfil
\vbox{%
\input tufte
}}
\starttext
\hyphenation{wh-e-at}
\hyphenation{me-r-ge}
\hyphenation{st-r-ong-ly}
\setuppagenumbering[state=stop]
\startcolumns[n=3, balance=no]
\section[1]
\input knuth
\section[2]
\doed
\dorecurse{3}{\input zapf}
\section[3]
\doed
\input zapf
\input zapf
\section[4]
\doed
\input zapf
\input zapf
\section[5]
\doed
\input knuth
\stopcolumns
\stoptext
这是与LaTeX\columnbreak
完成相同操作的结果\columnbreakunlesslast
\starttext
\setuppagenumbering[state=stop]
\startcolumns[n=3, balance=no]
\section[1]
\input knuth
\columnbreak
\section[2]
\dorecurse{2}{\input zapf}
\section[3]
\input tufte
\stopcolumns
\stoptext