从枚举中保存框

从枚举中保存框

我对此完全感到困惑:我试图创建一个简单的命令来修改枚举中的保存框,并且我将其归结为一些奇怪的最小例子:

...
% Create our command
\newcommand{\hello}{
\savebox{\tmp}{Works!}
}
% Setup the box
\newsavebox{\tmp}
\savebox{\tmp}{Doesn't work!}

\hello

\usebox{\tmp}
% Will put: Works!

如果我从枚举内部运行命令,它不起作用:

% Create our command
\newcommand{\hello}{
\savebox{\tmp}{Works!}
}
% Setup the box
\newsavebox{\tmp}
\savebox{\tmp}{Doesn't work!}

\begin{enumerate}
\item 
Something \hello
\end{enumerate}

\usebox{\tmp}
% Will put: Doesn't work!

我完全不知道它为什么会这样。没有给出任何警告或错误,而且它在 pdfLatex 和 XeLaTex 上都是这样(我唯一可以测试的两个)。任何线索都将不胜感激!

答案1

这个问题是, 是以\savebox小组形式行使的,并且范围仅限于 之内enumerate

在这里窃取大卫的答案,在组中创建一个 \savebox,并使其在组外可用,并将其应用于 OP 的情况。本质上,用 替换原语,并使\savebox它们成为\global

\documentclass{article}
\begin{document}
% Create our command
\newcommand{\hello}{
\global\expandafter\setbox\csname tmp\endcsname\hbox{Works!}
}
% Setup the box
\newsavebox{\tmp}
\savebox{\tmp}{Doesn't work!}

\begin{enumerate}
\item 
Something \hello
\usebox{\tmp} inside group

\end{enumerate}

\usebox{\tmp} outside group
% Will put: Doesn't work!
\end{document}

在此处输入图片描述

从技术上讲,给定的保存框应始终全局或本地处理。这里有一种方法可以做到这一点,即引入全局宏

\documentclass{article}
\newcommand\gnewsavebox[1]{\global\newsavebox#1}
\newcommand\gsavebox[2]{\global\setbox#1\hbox{#2}}
\begin{document}
% Create our command
\newcommand{\hello}{\gsavebox{\tmp}{Works!}
}
% Setup the box
\gnewsavebox{\tmp}
\gsavebox{\tmp}{Doesn't work!}

\begin{enumerate}
\item 
Something \hello
\usebox{\tmp} inside group

\end{enumerate}

\usebox{\tmp} outside group
% Will put: Doesn't work!
\end{document}

相关内容