\newenvironment 中的 lrbox

\newenvironment 中的 lrbox

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*构造这篇文章

相关内容