沿文本设置多条垂直线 – 通过使用 \leaders?

沿文本设置多条垂直线 – 通过使用 \leaders?

我想在连续段落/垂直框的左侧绘制单独的垂直规则,覆盖垂直跳跃。在我的例子中,对于每个段落/垂直框,可以有不同的垂直规则。每个段落本身都很短,不易破碎,这就是为什么我称它们为垂直框。段落的规则应该直接在前一个段落之后开始,并覆盖两个段落之间的垂直跳跃。主要问题是如何用垂直规则正确地覆盖这个跳跃。

也有人问过类似的问题:

  1. 一个解决方案针对源代码列表(遵循新行),另一个解决方案使用该包framed如何沿段落左侧制作连续(但可破坏)的垂直线?

  2. 使用包mdframed(基于framed):左侧垂直规则应用于具有自动分页符的 flalign 环境

  3. 避免编写新的输出例程似乎是不可能的:我可以编写一个宏来在任意段落中放置垂直、可破坏的规则而无需输出例程吗?

1. 和 2. 的常见方法是用自己的代码“手动”进行分页,而不是完全由 TeX 自动完成。也就是说,创建一个包含所有行或段落的垂直列表,然后使用\vsplit此列表将其切成小块以填充页面。另一个常见特点是,这至少需要 50 行 TeX 代码,而且并不容易……

我找到了 box leaders,它似乎\leaders可以完成这项工作。我想知道我的尝试是否能奏效。

尝试 1:告诉 TeX 不要在段落后插入任何粘连,而是插入标准量的粘连。(可以通过设置更改量\currentvskip。)

尝试2:询问 TeX 两个段落之间插入了多少空格(在分页期间或之后),然后用规则覆盖这个垂直跳跃。

由于看起来很复杂,所以没有尝试:扩展该framed包以适用于多条规则......

这些尝试并不完全有效。例如,垂直规则在一页上不连续,并且 的使用存在问题\lastskip。以下文档展示了我的尝试。有没有办法修复其中一个问题?

\documentclass[12pt,english]{article}
\usepackage{babel}
\usepackage{blindtext}

\def\rules{\vrule width2pt \kern8pt \vrule \kern10pt}
\def\ruless{\vrule width2pt \kern8pt \vrule \kern8pt \vrule \kern10pt}

\newbox\vrules \setbox\vrules=\vbox{\hbox{\vrule width0pt height1pt \rules}}
\newbox\vruless \setbox\vruless=\vbox{\hbox{\vrule width0pt height1pt \ruless}}
\newbox\vl

\def\line#1{\setbox\vl=\vbox{\hbox{\rules \strut #1\unskip}}%
\leaders\copy\vrules\vskip\currentvskip \unvbox\vl}
\def\linee#1{\setbox\vl=\vbox{\hbox{\ruless \strut #1\unskip}}%
\leaders\copy\vruless\vskip\currentvskip \unvbox\vl}

\def\minibox{\begin{minipage}{5cm}\blindtext\end{minipage}}

\begin{document}
\parindent0pt \lineskip20pt \xdef\currentvskip{\lineskip}
\section*{Attempt 1}
\line{\minibox\bigskip}
{\edef\currentvskip{\bigskipamount}%
\linee{The vertical rules on the left should continue above (problem with bigskip)!}
}
\linee{One more line...}
\line{The vertical rules on the left should not continue below because of the page break.}
\line{\minibox}

\section*{Attempt 2}
\vbox{\hbox{\rules \minibox \bigskip}}%
\leaders\copy\vruless\vskip\lastskip%
\vbox{\hbox{\ruless \strut The vertical rules on the left should continue above!}}
\leaders\copy\vruless\vskip\lastskip%
\vbox{\hbox{\ruless \strut One more line...}}
\leaders\copy\vrules\vskip\lastskip%
\vbox{\hbox{\rules \strut The vertical rules on the left should not continue below because of the page break.}}
\leaders\copy\vrules\lastskip%
\vbox{\hbox{\rules \minibox}}
\end{document}

答案1

如果您首先根据主垂直列表构建段落,则可以删除框间跳过并将其替换为领导者:

在此处输入图片描述

\documentclass{article}


\textwidth.7\textwidth
\textheight.7\textheight

\parskip\baselineskip

\def\a{One two three four. }
\def\b{\refstepcounter{enumi} \Roman{enumi} \a\a\a}
\def\c{\b\a\a\b}

\makeatletter

\def\zboxes{\setbox\z@\vbox\bgroup\bgroup}
\def\endzboxes{\endgraf\egroup\egroup
\unvbox\z@}

\long\def\zbox#1#2{%
\par
\noindent\hbox{\vrule\@width#1\kern#1\relax
\parbox[t]{\dimexpr\textwidth-(#1)*2\relax}{#2}}%  2 times 2pt is 4pt not 22pt
\ruleskip{#1}}

\def\ruleskip#1{{%
\par
\setbox0\lastbox
\count@\z@
\skip@\z@skip
\loop
\@tempswafalse
\ifnum\lastnodetype=13 
\advance\count@\lastpenalty
\unpenalty
\@tempswatrue
\fi
\ifnum\lastnodetype=11
\advance\skip@\lastskip
\unskip
\@tempswatrue
\fi
\if@tempswa
\repeat%
\unskip\unskip\unskip
\penalty\z@
\leaders\vrule\@width#1\vskip\skip@
\nobreak
\nointerlineskip
\box\z@}}




\makeatother

\begin{document}

\begin{zboxes}
\zbox{1pt}{\c}

\zbox{3pt}{Hello. \c}

\bigskip

\zbox{5pt}{\c\c\b\c}

\bigskip

\zbox{3pt}{Red \b\c}

\zbox{4pt}{Yellow \a\c}

\zbox{2pt}{Goodbye. \b\c}

\end{zboxes}

\end{document}

相关内容