lrbox
如果放在 中,则无法工作\newenvironment
。我将举例说明。如果我写:
\documentclass{article}
\newsavebox{\mybox}
\begin{lrbox}{\mybox}
\begin{minipage}[t]{\textwidth}
\hfill
\begin{minipage}[t]{0.7\textwidth}
\noindent
\textbf{ABSTRACT} \\
Test Test Test Test Test Test Test Test Test Test Test Test Test
\\
\\
\end{minipage}
\end{minipage}
\end{lrbox}
\begin{document}
\usebox{\mybox}
\end{document}
然后我得到了我想要的结果。但是如果我尝试创建一个必须像上面的代码一样运行的新环境,我会得到一个空白页。具体来说,如果我写:
\documentclass{article}
\newsavebox{\mybox}
\newenvironment{myenv}
{
\begin{lrbox}{\mybox}
\begin{minipage}[t]{\textwidth}
\hfill
\begin{minipage}[t]{0.7\textwidth}
\noindent
\textbf{ABSTRACT} \\
}{
\\
\\
\end{minipage}
\end{minipage}
\end{lrbox}
}
\begin{myenv}
Test Test Test Test Test Test Test Test Test Test Test Test Test Test
\end{myenv}
\begin{document}
\usebox{\mybox}
\end{document}
我得到了一张空白页。有人能解释一下为什么吗?
答案1
环境会创建一个组,因此本地设置\mybox
会被丢弃。lrbox 命令有一些代码可以“取消”乳胶环境中的一级分组,以便其正常使用会留下之后定义的框,\end{lrbox}
但这只会取消一级。我认为 @tohez 的答案在这里是安全的,或者另一种方法,同样滥用 LaTeX 语法,即欺骗 lrbox 进行全局分配
将您的呼叫更改为
\begin{lrbox}{0\null\global\setbox\mybox}
可以工作(它对框 0 进行本地分配,然后将环境主体全局分配给你的框)
答案2
如果您替换\begin{lrbox}
->\lrbox
和\end{lrbox}
-> \endlrbox
,它可以完美运行。
调用 似乎存在一些问题\begin{mybox}...\end{mybox}
,因为每一\begin{ENV}...\end{ENV}
对 都将内容封装到一对额外的 中\begingroup...\endgroup
,它们是使盒子分配本地化的 TeX 原语。
在解决方案中,\begingroup
从\begin{mybox}
被 撤消\lrbox
,但不会被 撤消,\begin{lrbox}
因为在这种情况下只有\begingroup
从被撤消。(对于和\begin{lrbox}
也同样适用。)\end{lrbox}
\endgroup
备注:您可以\ENV...\endENV
为任何环境编写,但它会改变它们的行为,并且结果可能无法预测。
(感谢@Stephan 和@Martin 的评论。)
\documentclass{article}
\newsavebox{\mybox}
\newenvironment{myenv}
{
\lrbox\mybox
\begin{minipage}[t]{\textwidth}
\hfill
\begin{minipage}[t]{0.7\textwidth}
\noindent
\textbf{ABSTRACT}
}{
\end{minipage}
\end{minipage}
\endlrbox
}
\begin{myenv}
Test Test Test Test Test Test Test Test Test Test Test Test Test Test
\end{myenv}
\begin{document}
\usebox{\mybox}
\end{document}
答案3
该框由 本地分配lrbox
。因此,环境的结尾将撤消分配。
尝试lrbox*
构造这篇文章。