我想在保存框中有一个列表。为什么以下方法不起作用?
\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?