![我不能将列表放在 \lrbox 里面吗?](https://linux22.com/image/244874/%E6%88%91%E4%B8%8D%E8%83%BD%E5%B0%86%E5%88%97%E8%A1%A8%E6%94%BE%E5%9C%A8%20%5Clrbox%20%E9%87%8C%E9%9D%A2%E5%90%97%EF%BC%9F.png)
我想在保存框中有一个列表。为什么以下方法不起作用?
\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
使用命令来允许换行。\setbox
vbox
\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?