背景

背景

背景

尝试确定是否必须在双列页面上插入分栏符。页面上有多个部分。我想在页面的最后一部分之前插入分栏符,但前提是在第一列内,并且第二列有足够的空间(即不强制分页)。

问题

下面的代码说明了这个问题:

\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 

在此处输入图片描述

相关内容