我想在连续段落/垂直框的左侧绘制单独的垂直规则,覆盖垂直跳跃。在我的例子中,对于每个段落/垂直框,可以有不同的垂直规则。每个段落本身都很短,不易破碎,这就是为什么我称它们为垂直框。段落的规则应该直接在前一个段落之后开始,并覆盖两个段落之间的垂直跳跃。主要问题是如何用垂直规则正确地覆盖这个跳跃。
也有人问过类似的问题:
一个解决方案针对源代码列表(遵循新行),另一个解决方案使用该包
framed
:如何沿段落左侧制作连续(但可破坏)的垂直线?使用包
mdframed
(基于framed
):左侧垂直规则应用于具有自动分页符的 flalign 环境避免编写新的输出例程似乎是不可能的:我可以编写一个宏来在任意段落中放置垂直、可破坏的规则而无需输出例程吗?
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}