为什么我不能 vsplit parbox?(以及 fbox 对齐和 unvbox 语法)

为什么我不能 vsplit parbox?(以及 fbox 对齐和 unvbox 语法)

我试图用这个答案中的代码进行实验:可破坏的垂直盒子,我得到了一些意想不到的东西;考虑一下这个 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}

如果我想将\vsplitparbox 放置在 vbox 中(\shouldUseParbox处于活动状态,如在 MWE 中),那么我会得到这个(lua-visual-debug)输出(单击获取完整分辨率):

测试A.png

...这完全出乎意料:第一页上什么都没有 - 我无法真正判断这些框是否被分割,即使框架框表明是这种情况;无论如何,这些框都不会与其余文本交错。

现在,如果\shouldUseParbox处于非活动状态 - 这意味着内容直接位于具有 rightskip 的 vbox 中(如上面发布的答案所示),则一切都按预期工作(单击以获取完整分辨率):

测试B.png

我的问题是:

  1. 为什么我不能对 parbox 进行 vsplit(在 vbox 中)?我只知道这\parbox是一个 LaTeX 命令,而\vsplit其余的是 TeX 核心...如果需要分割\parbox材料,该怎么办?
  2. 您可以看到我必须“取消缩进”(使用\hskip-1\parindent),以便\fbox输出处于相同的位置,就像不使用 fbox 时一样 - 为什么会这样?
  3. 为什么我可以使用类似 - 的语法\fbox{\copy\myboxtemp},但不能使用\fbox{\unvbox\myboxtemp}?? (我以为 的效果与and\unvbox相同,但显然不是?)\box\copy

答案1

\vsplit在框中的垂直列表中的合法断点处分割 vbox。垂直列表中\mybox仅包含一行段落中的一个不可分割的项目,hbox该段落的第一行包含您的 parbox。

所有的 latex 框命令都以 开头,\leavevmode因此它们以正常缩进、在中心环境中居中等方式开始一个段落。如果将 tex 原始框放到垂直列表中,则会直接放置它而无需任何段落定位。

\unvbox取消装箱,将其内容放在当前垂直列表中(如果当前列表是水平的,则会产生错误)\box ,并将\copy框本身放在当前水平或垂直列表中。

相关内容