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