回到这个例子,我想将“左 1”改为,\heading
同时\subheading
保持两个“左 1”、“右 1”标题垂直对齐。假设ConTeXt:统一处理边距和文本中的空白解决了,同时保持后续段落对齐。我一直在尝试垂直\heading
支柱,但无济于事,但也许行校正也可以奏效。虽然不清楚,但文档表明它将其参数“捕捉”到最近的基线。
\setuppapersize[letter]
\setupwhitespace[medium]
\setuplayout
[backspace=4.375in,
width=3.625in,
leftmargin=3.625in,
rightmargin=0in,
leftmargindistance=0.25in,
%
topspace=0.25in,
height=10.5in,
header=0.25in,
headerdistance=0.25in,
footer=0.25in,
footerdistance=0.25in,
]
\setupmarginblock
[location=left,
width=\leftmarginwidth,
]
\define[1]\heading{%
\dontleavehmode{\bfc\setupinterlinespace\strut#1}%
\blank[big,samepage]%
}
\define[1]\subheading{%
\dontleavehmode{\bfa\setupinterlinespace\strut#1}%
\blank[small,samepage]%
}
\showframe
%\showallmakeup
\starttext
\startmarginblock
\heading{Left 1}
\samplefile{ward}
\heading{Left 2}
\samplefile{knuth}
\samplefile{weisman}
\heading{Left 3}
\startitemize
\item 1
\item 2
\item 3
\stopitemize
\samplefile{ward}
\stopmarginblock
\heading{Right 1}
\samplefile{ward}
\heading{Right 2}
\samplefile{knuth}
\samplefile{weisman}
\heading{Right 3}
\startitemize
\item 1
\item 2
\item 3
\stopitemize
\samplefile{ward}
\stoptext
编辑:
我试图实现这样的目标:
或者像这样:
回想起来,我可以毫无问题地实施一种更简单的方法:
\define[1]\headinghmode{%
\bfc\setupinterlinespace\strut#1%
}
\define[1]\subheadinghmode{%
\bfa\setupinterlinespace\strut#1%
}
\define[1]\heading{%
\dontleavehmode{\headinghmode{#1}}%
\blank[big,samepage]%
}
\define[1]\subheading{%
\dontleavehmode{\subheadinghmode{#1}}%
\blank[small,samepage]%
}
用法如下:
\heading{\subheadinghmode{Interlude}}
之前我试图避免重复使用我原来的(见上文)标题定义。例如,我会在以下行的所有可能位置插入\blank[back]
或,其中代表非 TeX 文本:\blank[disable]
...
\heading{}\subheading{...}
\heading{\subheading{...}
\subheading{\heading{}...}
例如:
\heading{\blank[back]}\subheading{...}
\heading{}\blank[back]\subheading{...}
\heading{}\subheading{\blank[back]...}
\heading{}\subheading{...\blank[back]}
\heading{}\subheading{...}\blank[back]
\blank[disable]\heading{}\subheading{...}
...
\heading{}\subheading{...\blank[disable]}
\heading{\blank[back]\subheading{...}}
...
\heading{\subheading{...}\blank[disable]}
\subheading{\heading{}\blank[back]...}
...
\subheading{\heading{}...}\blank[disable]
现在这个(大部分)不起作用,可能是因为它们在 h 模式之外垂直堆叠。这很好,因为谁会想记住放置那个额外的\blank[back]
或\blank[disable]
?话虽如此,我确实测试了它们全部,因为我偶然遇到了一个可以工作的,但仅在边距块中(第一张图片):
\setuppapersize[letter]
\setupwhitespace[medium]
\setuplayout
[backspace=4.375in,
width=3.625in,
leftmargin=3.625in,
rightmargin=0in,
leftmargindistance=0.25in,
%
topspace=0.25in,
height=10.5in,
header=0.25in,
headerdistance=0.25in,
footer=0.25in,
footerdistance=0.25in,
]
\showframe
\setupmarginblock
[location=left,
width=\leftmarginwidth,
]
\define[1]\heading{%
\dontleavehmode{\bfc\setupinterlinespace\strut#1}%
\blank[big,samepage]%
}
\define[1]\subheading{%
\dontleavehmode{\bfa\setupinterlinespace\strut#1}%
\blank[small,samepage]%
}
\starttext
\startmarginblock
%\heading{Left 1}
\heading{\subheading{Left 1}}
\samplefile{ward}
\stopmarginblock
\heading{Right 1}
\samplefile{ward}
\stoptext
这没有任何意义...为什么这会起作用,并且只能在边缘块中起作用?
\heading{\subheading{...}}
无论如何,在我测试的所有可能的组合中,这是唯一可行的组合,并且在正文或边距中:
\heading{\subheading{...\blank[back]}}
我不明白,考虑到所有其他可能的组合,为什么只有这种方式有效。
我还尝试了一些更极端的方法。如果没有第二个“disable \blank
”参数,这种方法就无法工作,而且我不想深入研究 ConTeXt 来弄清楚如何实现可选参数:
\define[1]\heading{%
...
\if\relax\detokenize{#1}\relax \else \blank[big,samepage] \fi%
}
这个无法重现标题的垂直位置,但前后空白应该保持不变。有些地方出了问题:
\heading{...}
\setbox0=\vbox{\heading{...}}
\vrule height 0.7\ht0 depth 0.3\ht0 width 1pt\subheading{...}
尽管我很好奇我的两个例外是如何起作用的,但更简单的方法是最好的。
答案1
如果希望边距块中的间距与主垂直列表完全相同,则必须在边距中“模拟”一页。这是什么意思呢?边距中的内容以自然高度排版在 vbox 中。这意味着垂直粘连既不会拉伸也不会收缩,而主垂直列表则受到 的限制\vsize
。因此,要在边距中模拟主垂直列表,您必须将其内容包裹在 中\vbox to \textheight {...\strut\par\vfill}
。\strut
确保最后一行具有支柱深度,\par
切换到垂直模式,并且\vfill
如果内容短于 ,则填满框到底部\textheight
。
\setuppapersize[letter]
\setupwhitespace[medium]
\setuplayout
[backspace=4.375in,
width=3.625in,
leftmargin=3.625in,
rightmargin=0in,
leftmargindistance=0.25in,
%
topspace=0.25in,
height=10.5in,
header=0.25in,
headerdistance=0.25in,
footer=0.25in,
footerdistance=0.25in,
]
\setupmarginblock
[location=left,
width=\leftmarginwidth,
]
\define[1]\heading{%
\dontleavehmode{\bfc\setupinterlinespace\strut#1}%
\blank[big,samepage]%
}
\define[1]\subheading{%
\dontleavehmode{\bfa\setupinterlinespace\strut#1}%
\blank[small,samepage]%
}
\showframe
\starttext
\startmarginblock
\vbox to \textheight {
\heading{Left 1}
\samplefile{ward}
\heading{Left 2}
\samplefile{knuth}
\samplefile{weisman}
\heading{Left 3}
\startitemize
\item 1
\item 2
\item 3
\stopitemize
\samplefile{ward}
% fill up the box
\strut\par\vfill
}
\stopmarginblock
\heading{Right 1}
\samplefile{ward}
\heading{Right 2}
\samplefile{knuth}
\samplefile{weisman}
\heading{Right 3}
\startitemize
\item 1
\item 2
\item 3
\stopitemize
\samplefile{ward}
\stoptext