我正在准备一本书,其中包含的信息分为三列。第一列(A)占据所有背面页面的整个宽度。第二列(B)和第三列(C)共享正面页面,例如:
(verso) (recto)
_______________________
| | | |
| A | B | C |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
|___________|_____|_____|
有了数据后,背面和正面的行应该垂直对齐:
_______________________
| | | |
|This text |This |This |
|will appear|text |text |
|in column |will |will |
|A. |appe-|appe-|
| |r in |r in |
| |colu-|colu-|
| |mn B.|mn C.|
|100 |200 |300 |
|___________|_____|_____|
我怎样才能以这种方式创建跨越 2 页的表格?
更新:
在修复错误之前,我需要为我的书找到解决方案。我尝试使用 linetables 和解决方案如何设置两个或多个段落使用相同量的垂直空间?确保三个段落正确对齐。这是我尝试过的:
\setuppapersize[A5][A4, landscape]
\setuparranging[2SIDE]
\newdimen\maxbufferheight
\def\placebuffertomaximumheight[#1]%
{\maxbufferheight\zeropoint
\processcommalist[#1]\domeasurebuffermaxheight
\processcommalist[#1]\doplacebuffertomaxheight}
\def\domeasurebuffermaxheight#1%
{\setbox\scratchbox\vbox{\getbuffer[#1]}%
\scratchdimen\ht\scratchbox
\ifdim\scratchdimen>\maxbufferheight
\maxbufferheight=\scratchdimen
\fi}
\def\doplacebuffertomaxheight#1%
{\ruledvbox to \maxbufferheight
{\getbuffer[#1]}%
\blank[none]}
\setuppagenumbering[alternative=doublesided]
\startsetups twopagealign:before
\page [left]
\setuplinetable [n=3]
\setuplinetable [c][1] [width=\textwidth]
\setuplinetable [c][2] [width=.5\textwidth]
\setuplinetable [c][3] [width=.5\textwidth]
\startlinetable
\stopsetups
\definestartstop [twopagealign]
[
before=\setups{twopagealign:before},
after={\stoplinetable\page},
]
\define[3]\myalign{\NC#1\NC#2\NC#3\NC\NR}
\define[3]\makeinbuffer{
\myalign{
\startbuffer[one]
#1
\stopbuffer
}{
\startbuffer[two]
#2
\stopbuffer
}{
\startbuffer[three]
#3
\stopbuffer
}
\placebuffertomaximumheight[one,two,three]
}
\starttext
\starttwopagealign
\myalign {\input knuth} {\input tufte} {\input ward}
\makeinbuffer{\input ward}{\input tufte}{\input ward}
\stoptwopagealign
\stoptext
- 解决方案来自如何设置两个或多个段落使用相同量的垂直空间?与线表兼容吗?
- 是否有一个临时的解决方案,可以使正反两页的行高相等?
答案1
因此,这是另一种生成所需布局的尝试。它基于 Aditya 的问题解决方案如何设置两个或多个段落使用相同量的垂直空间?(与我的两次数据破解相比,我更喜欢他的缓冲区方法)。
\newdimen\maxbufferheight
\newcount\nofmeasuredcolumns
\newcount\nofmeasuredrows
\newcount\ltcolumncount
\def\domeasurebuffermaxheight#1#2{%
\scratchdimen\getvalue{linetblwd-#2width}
\setbox\scratchbox\vbox
\framed
[
frame=off,
offset=0pt,
boffset=2ex, % hmm, don't know why
width=\the\scratchdimen,
align=normal,
]{\getbuffer[#1]}
\scratchdimen\ht\scratchbox
\ifdim\scratchdimen>\maxbufferheight
\maxbufferheight=\scratchdimen
\fi}
\def\doplacebuffertomaxheight#1{%
%\ruledvbox to \maxbufferheight
\vbox to \maxbufferheight
{\getbuffer[#1]}%
\blank[none]}
\def\startcolumn{%
\advance\nofmeasuredcolumns\plusone
\grabbufferdata
[measuredcolumn-\the\nofmeasuredrows-\the\nofmeasuredcolumns]
[startcolumn]
[stopcolumn]}
\def\stopcolumn{}
\def\startrow{%
\nofmeasuredcolumns\zerocount
\advance\nofmeasuredrows\plusone}
\def\stoprow{%
\maxbufferheight\zeropoint}
\def\starttwopagealign{%
\nofmeasuredrows\zerocount}
\def\stoptwopagealign{%
\page [left]
\setuplinetable [n=\the\nofmeasuredrows]
\dorecurse{\the\ltcolumncount}{%
\normalexpanded{%
\setuplinetable [c][\recurselevel]
[width=\getvalue{linetblwd-\recurselevel width}]}}
\startluacode
context.startlinetable()
for i=1, tex.count.nofmeasuredrows do
for j=1, tex.count.nofmeasuredcolumns do
context.domeasurebuffermaxheight("measuredcolumn-" .. i .. "-" .. j, j)
end
for j=1, tex.count.nofmeasuredcolumns do
context.NC()
context.doplacebuffertomaxheight("measuredcolumn-" .. i .. "-" .. j)
end
context.NC()
context.NR()
end
context.stoplinetable()
\stopluacode
\page
}
\def\setuplinetablewidth {\dodoubleempty\dosetuplinetablewidth}
\def\dosetuplinetablewidth [#1][#2]{%
\advance\ltcolumncount\plusone
\getparameters [linetblwd-#1] [#2]}
使用代码的方式如下:
\setuplinetablewidth [1] [width=\textwidth]
\setuplinetablewidth [2] [width=.5\textwidth]
\setuplinetablewidth [3] [width=.5\textwidth]
\starttext
\input knuth
\starttwopagealign
\startrow
\startcolumn
\input ward
\stopcolumn
\startcolumn
Foo
\stopcolumn
\startcolumn
Bar
\stopcolumn
\stoprow
\startrow
\startcolumn
Foo
\stopcolumn
\startcolumn
Bar
\stopcolumn
\startcolumn
\input knuth
\stopcolumn
\stoprow
\stoptwopagealign
\stoptext
结果:
屏幕截图是用\ruledvbox
而不是 制作的,以便\vbox
可视化表格单元格。
怎么运行的
基本思想是收集缓冲区中的数据,这通过命令完成
\startcolumn
。
然后计算每行的最大高度(以解决错误),这应该通过 完成linetables
。然后将其包装在行表中,并明确提供每行的计算高度。
列宽设置如下:
\setuplinetablewidth [1] [width=\textwidth]
\setuplinetablewidth [2] [width=.5\textwidth]
\setuplinetablewidth [3] [width=.5\textwidth]
要使该\page [left]
命令起作用,您需要一个最新的 ConTeXt,其中有一个错误,最近已修复。此代码相当黑客化,应仅视为临时解决方法。根据内容,您必须使用该值。在我的测试中,介于和boffset
之间的值 是好的。我不知道为什么这是必要的,以及错误的框大小从何而来。2ex
5ex
答案2
我没有真正的解决方案,但我尝试帮助您入门(感谢 Aditya 提供的 linetables 提示)。以下是代码和相应的输出:
\setuppagenumbering [alternative=doublesided]
\startsetups twopagealign:before
\page [left]
\setuplinetable [n=3]
\setuplinetable [c][1] [width=\textwidth]
\setuplinetable [c][2] [width=.5\textwidth]
\setuplinetable [c][3] [width=.5\textwidth]
\startlinetable
\stopsetups
\definestartstop [twopagealign]
[
before=\setups{twopagealign:before},
after={\stoplinetable\page},
]
\define[3]\myalign{\NC#1\NC#2\NC#3\NC\NR}
\starttext
\starttwopagealign
\myalign {\input knuth} {\input tufte} {\input ward}
\myalign {\tfd 100} {\tfd 200} {\tfd 300}
\stoptwopagealign
\stoptext
结果:
代码应该是不言自明的。它是一个行表,其中包含必要的设置(如果您在文档中使用更多行表),这些设置包含在\page
命令中。
但是,它并没有像预期的那样工作。由于行表是按页处理的,因此行的对齐方式无法跨页工作,如屏幕截图所示(100不符合200,尽管300是)。