ConTeXt:统一行高

ConTeXt:统一行高

回到这个例子,我想将“左 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

在此处输入图片描述

相关内容