Plain TeX 中双列输出的宽图

Plain TeX 中双列输出的宽图

figure*我尝试在 LaTeX 中得到类似于 的东西。我已定义\widetopinsert\endwiedeinsert。这可行,但第二列上的文本进入底部边距。

\catcode`@=11
\raggedbottom

\newdimen\fullhsize
\newdimen\columnsep
\columnsep 1cm
\fullhsize\hsize
\advance\hsize-\columnsep
\divide\hsize\tw@

\def\fullline{\hbox to\fullhsize}
\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
    \fullline{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
\def\makefootline{\baselineskip24\p@\lineskiplimit\z@\fullline{\the\footline}}

\newif\if@firstcolumn \@firstcolumntrue
\newbox\firstcolumn

\output={\if@firstcolumn \global\setbox\firstcolumn=\columnbox
\global\@firstcolumnfalse
\else
\doubleformat \global\@firstcolumntrue\fi
\ifnum\outputpenalty>-20000 \else\dosupereject\fi}

\def\doubleformat{\shipout\vbox{
\makeheadline
\ifvoid\widetopins\else\fullline{\box\widetopins}\fi
\fullline{\box\firstcolumn\hfil\columnbox} \makefootline}
\advancepageno}

\def\columnbox{\leftline{\pagebody}}

\newinsert\widetopins
\skip\widetopins\z@skip
\count\widetopins=1000
\dimen\widetopins=\maxdimen

\def\widetopinsert{\p@gefalse\par\begingroup\setbox\z@\vbox\bgroup\hsize\fullhsize}
\def\endwideinsert{\egroup
\insert\widetopins{\penalty100 % floating insertion
    \splittopskip\z@skip
    \splitmaxdepth\maxdimen \floatingpenalty\z@
    \ifp@ge \dimen@\dp\z@
    \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero
    \else \box\z@\nobreak\bigskip\fi}\endgroup}

\def\mypicture{\vrule height 100pt depth 40pt width300pt}

\def\text{Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.}

\text\text\text

\widetopinsert
\centerline{\mypicture}
\endwideinsert

\text\text\text\text\text

\bye

如何才能获得第二列的正确的文本高度?

纯 TeX 宽图形

答案1

正如我的评论所建议的那样,\pagebody必须进行更改。目前,两列都太长了。列的 vbox 是在其中创建的, \pagebody并且必须在该框中处理 widetopinserts。然后第一列就不再太长了。因此添加:

\def\pagebody{\vbox to\vsize{\boxmaxdepth=\maxdepth
   \ifvoid\widetopins \else\unvbox\widetopins\fi \pagecontents}}

\doubleformat当然,必须删除类似的行。

必须调整第二列的长度。最好在\output构建第一列时进行此操作。(\vsize输出第二列后重置。)

但是,如果 widetopinsert 位于右列,则无法处理它。并且我们无法将 widetopinsert 拆分到左列,因为浮点会转到下一个输出元素,而这将是右列。在这两种情况下,左列已经创建,因此要更改它 \vsplit,则需要使用完全不同的方法。请参阅 TeXbook 附录 E 中的宏,第 416-417 页。

因此,只有\@firstcolumntrue设置了 时才会创建 widetopinserts;否则材料将放在一边以备下一个物理页面使用。该框\nxtpgwtibox会保留材料。如果需要处理 widetopinserts 但左列中没有内容或右列中的内容已满,则会填充内容。 \endwideinsert页面完成后,材料将放置在 widetopinserts 中;请参阅\doubleformat

我添加了两个\pars\text并做了一些其他更改以清理代码。请注意,我尚未对此代码进行过很多测试,并且还有改进的空间。例如,代码没有检查收集的 widetopinserts 是否需要超过一页,这是不允许的,因为它们无法拆分。

完整代码如下:

\newbox\nxtpgwtibox
\newdimen\orgvsize \orgvsize=\vsize

\newdimen\fullhsize \newdimen\columnsep
\fullhsize\hsize \columnsep 1cm

\raggedbottom

\catcode`@=11
\advance\hsize-\columnsep \divide\hsize\tw@

\def\fullline{\hbox to\fullhsize}
\def\makeheadline{\vbox to\z@{\vskip-22.5\p@
    \fullline{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip}
\def\makefootline{\baselineskip24\p@\lineskiplimit\z@\fullline{\the\footline}}

\newif\if@firstcolumn \@firstcolumntrue
\newbox\firstcolumn

\output={\if@firstcolumn 
      \dimen@=\vsize \advance\dimen@ by -\ht\widetopins \advance\dimen@ by -\dp\widetopins
      \global\setbox\firstcolumn=\columnbox \global\@firstcolumnfalse
      \global\vsize=\dimen@
   \else
      \doubleformat \global\@firstcolumntrue
      \global\vsize=\orgvsize\fi
   \ifnum\outputpenalty>-20000 \else\dosupereject\fi}

\def\doubleformat{\shipout\vbox{\makeheadline
   \fullline{\box\firstcolumn\hfil\columnbox}%
   \makefootline}\advancepageno
  \ifvoid\nxtpgwtibox\else
     \insert\widetopins{\penalty100 \floatingpenalty=0
        \box\nxtpgwtibox\nobreak\bigskip}\fi}

\def\columnbox{\leftline{\pagebody}}
\def\pagebody{\vbox to\vsize{\boxmaxdepth=\maxdepth
   \ifvoid\widetopins \else\unvbox\widetopins\fi \pagecontents}}

\newinsert\widetopins
\skip\widetopins\z@skip
\count\widetopins=1000
\dimen\widetopins=\maxdimen

\def\widetopinsert{\par\begingroup\hsize=\fullhsize\setbox\z@\vbox\bgroup}
\def\endwideinsert{\egroup
   \if@firstcolumn
      \dimen@=\ht\z@ \advance\dimen@ by \dp\z@ \advance\dimen@ by 1\baselineskip
      \advance\dimen@ by \pagetotal \advance\dimen@ by -\pageshrink
   \else \dimen@=1.1\pagegoal\fi % no widetopinserts in second column
   \ifdim\dimen@>\pagegoal       % the page is full, no more widetopinserts
      \ifvoid\nxtpgwtibox \global\setbox\nxtpgwtibox=\vbox{\box\z@}%
      \else \global\setbox\nxtpgwtibox=\vbox{\box\nxtpgwtibox
         \nobreak\vskip1\baselineskip\box\z@}\fi
   \else \insert\widetopins{\penalty100 \floatingpenalty=0
      \box\z@\nobreak\bigskip}\fi\endgroup}

\catcode`@=12

\def\mypicture#1{\vrule height 1#10pt depth 4#1pt width3#1#1pt}

\def\text{Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore magn
a aliquyam erat, sed diam voluptua. At vero eos et accusam et justo
duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata
%sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,
sanctus est Lorem ipsum dolor sit amet.\par Lorem ipsum dolor sit amet,
consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut
labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos
et accusam et justo duo dolores et ea rebum. Stet clita kasd
%gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.}
gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\par}

\text\text %\text % one more \text moves the 1st widetopinsert to the next page

\widetopinsert
\centerline{\mypicture0}
\endwideinsert

\text

\widetopinsert
\centerline{\mypicture9}
\endwideinsert

\text\text\text\text\text

\bye

答案2

这不是精确的答案,只是想法。我看到您的文本分为两部分:第一部分包含 3 个\texts,第二部分包含 5 个\texts,每个部分\text\def按 排列,Lorem ipsum dolor sit amet,... Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet,... Lorem ipsum dolor sit amet.但是,第二部分被 和 包围\widetopinsert,它们各自\endwideinsert打开\vbox。也许,值得\vbox在第二部分之前以与第一部分之前相同的方式打开新内容?看起来第二部分的 vbox 的高度比第一部分的 vbox 的高度大很多。也许,尝试将类似的东西插入\showthe\vsize到两个部分中?

相关内容