我试图用这个答案中的代码进行实验:可破坏的垂直盒子,我得到了一些意想不到的东西;考虑一下这个 MWE:
\documentclass{article}
\usepackage{lipsum}
\usepackage{xcolor}
% \usepackage{lua-visual-debug}
\pagecolor{yellow!10}
\begin{document}
\lipsum[1]
\def\shouldUseParbox{1} % comment to undefine
\newbox\mybox
\ifx\shouldUseParbox\undefined%
%
\setbox\mybox=\vbox{%
\rightskip=35mm%
\lipsum[2-4]
}
%
\else% \shouldUseParbox defined:
%
\setbox\mybox=\vbox{%
\parbox[t]{0.7\textwidth}{%
\lipsum[2-4]
}%
}
%
\fi
First bit here:
\setlength{\fboxsep}{0pt}
% \copy\mybox
\hskip-1\parindent %\fbox will indent;
\fbox{\copy\mybox} %ok
\newbox\myboxtemp
\setbox\myboxtemp=\vsplit\mybox to 0.3\textheight
Split bit here:
% \copy\myboxtemp % ok
% \unvbox\myboxtemp % ok; same out as \copy in this case
\hskip-1\parindent %\fbox will indent;
\fbox{\copy\myboxtemp}
remains here:
\hskip-1\parindent %\fbox will indent;
\fbox{\copy\mybox}
% \setbox\myboxtemp=\unvbox\myboxtemp % "! A <box> was supposed to be here." ??
% \fbox{\unvbox\myboxtemp} % "! Missing } inserted." ??
\end{document}
如果我想将\vsplit
parbox 放置在 vbox 中(\shouldUseParbox
处于活动状态,如在 MWE 中),那么我会得到这个(lua-visual-debug
)输出(单击获取完整分辨率):
...这完全出乎意料:第一页上什么都没有 - 我无法真正判断这些框是否被分割,即使框架框表明是这种情况;无论如何,这些框都不会与其余文本交错。
现在,如果\shouldUseParbox
处于非活动状态 - 这意味着内容直接位于具有 rightskip 的 vbox 中(如上面发布的答案所示),则一切都按预期工作(单击以获取完整分辨率):
我的问题是:
- 为什么我不能对 parbox 进行 vsplit(在 vbox 中)?我只知道这
\parbox
是一个 LaTeX 命令,而\vsplit
其余的是 TeX 核心...如果需要分割\parbox
材料,该怎么办? - 您可以看到我必须“取消缩进”(使用
\hskip-1\parindent
),以便\fbox
输出处于相同的位置,就像不使用 fbox 时一样 - 为什么会这样? - 为什么我可以使用类似 - 的语法
\fbox{\copy\myboxtemp}
,但不能使用\fbox{\unvbox\myboxtemp}
?? (我以为 的效果与and\unvbox
相同,但显然不是?)\box
\copy
答案1
\vsplit
在框中的垂直列表中的合法断点处分割 vbox。垂直列表中\mybox
仅包含一行段落中的一个不可分割的项目,hbox
该段落的第一行包含您的 parbox。
所有的 latex 框命令都以 开头,\leavevmode
因此它们以正常缩进、在中心环境中居中等方式开始一个段落。如果将 tex 原始框放到垂直列表中,则会直接放置它而无需任何段落定位。
\unvbox
取消装箱,将其内容放在当前垂直列表中(如果当前列表是水平的,则会产生错误)\box
,并将\copy
框本身放在当前水平或垂直列表中。