为什么在调用 \sbox{\mybox}{contents} 的小页面之外调用 \usebox{\mybox} 时没有输出?

为什么在调用 \sbox{\mybox}{contents} 的小页面之外调用 \usebox{\mybox} 时没有输出?
\documentclass{article}
\newsavebox{\mybox}
\begin{document}


\fbox{%
\begin{minipage}{5cm}
\sbox{\mybox}{from first minipage}
\usebox{\mybox}
\end{minipage}%
}

%nothing rendered
\fbox{\usebox{\mybox}}

\vspace{3cm}

\fbox{%
\begin{minipage}{5cm}
%nothing rendered
\usebox{\mybox}
\end{minipage}%
}

\end{document}

答案1

由于 TeX 的作用域规则,没有输出。可以通过一个更简单的例子来演示,使用\def而不是框。

\begin{minipage}{3cm} 
  \def\fortytwo{42}
  \fortytwo
\end{minipage}

这将在小页面中排版 42,但如果您尝试在小页面之外使用,\fortytwo您将收到错误“未定义的控制序列”。

TeX 的作用域规则类似于当地的全球的其他编程语言中的作用域是不同的。但在 TeX 中情况有所不同。试试这个:

\documentclass{article}
\begin{document}
\def\fortytwo{42}
\begin{minipage}{2cm} 
      \fortytwo
      \def\fortytwo{43}
      \fortytwo
    \end{minipage}
\fortytwo
\end{document}

当您返回到宏的外部时,您将会观察到,旧的定义被保留,因此在上面的例子中,您将在小页面内得到 43,但在小页面外得到 42!

使用盒子,我们可以证明这一点:

\documentclass{article}
\begin{document}

\newsavebox{\mybox}
\savebox{\mybox}{Outside scope}

\begin{minipage}{3cm}
  \sbox{\mybox}{from first minipage}
  \usebox\mybox
\end{minipage}

\usebox{\mybox}

\end{document}

这将from first minipage在小页面内和Outside scope小页面外进行排版。

相关内容