我不能将列表放在 \lrbox 里面吗?

我不能将列表放在 \lrbox 里面吗?

我想在保存框中有一个列表。为什么以下方法不起作用?

\documentclass{article}
\usepackage{setspace}

\newsavebox{\mybox}

\newenvironment{myenv}{%
  \begin{lrbox}{\mybox}%
  \begin{list}{}{}%
}{%
  \end{list}%
  \end{lrbox}%
  \usebox{\mybox}%
}%

\begin{document}
\begin{myenv}
\item First item.
\item Second item.
\end{myenv}
\end{document} 

我必须使用吗\minipage

答案1

环境lrbox使用简单的hbox来保存内容。因此您没有换行符。除了使用 lrbox(内部是),您还可以结合savebox使用命令来允许换行。\setboxvbox

\newenvironment{myenv}{%
 \setbox\mybox=\vbox\bgroup%
  \begin{list}{}{}%
}{%
  \end{list}%
  \egroup
  \usebox{\mybox}%
}%

这是一个完整的例子:

\documentclass{article}
\usepackage{setspace}

\newsavebox{\mybox}

\newenvironment{myenv}{%
 \setbox\mybox=\vbox\bgroup%
  \begin{list}{}{}%
}{%
  \end{list}%
  \egroup
  \usebox{\mybox}%
}%

\begin{document}
\begin{myenv}
\item First item.
\item Second item.
\end{myenv}
\end{document}

答案2

是的,你必须使用minipage。事实上,lrbox它只是 的环境形式,\sbox它是 的伴侣,\mbox它也不接受列表:你不能直接在 中排版段落\mbox。但是

\begin{lrbox}{\mybox}
\begin{minipage}{5cm}
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{minipage}
\end{lrbox}

是正确的代码。在\mbox\sbox或中lrbox,TeX 不会分割行。

答案3

environ包裹允许在宏中“存储”内容\BODY。也许你会对这个实现感兴趣:

在此处输入图片描述

\documentclass{article}
\usepackage{environ}% http://ctan.org/pkg/environ
\newsavebox{\mybox}
\NewEnviron{myenv}{%
  \let\olditem\item%
  \renewcommand{\item}[1][]{\olditem[##1]\strut}%
  \begin{lrbox}{\mybox}%
  \noindent\begin{minipage}{\linewidth}
  \begin{list}{}{}%
    \BODY%
  \end{list}%
  \end{minipage}
  \end{lrbox}%
  \usebox{\mybox}%
}

\begin{document}
Some text.\strut

\begin{myenv}
\item First item.
\item Second item.
\end{myenv}

Some text.
\end{document}​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

与大多数的框实现一样minipage,您可能需要尝试使用 的基线跳过度量\prevdepth。上述对 的重新定义\item(添加\strut)是一种快速修复。有关更多信息,请参阅如何在使用 minipages (或 \parboxes) 时保持恒定的 baselineskip?

相关内容