我想保存方程的一部分,该部分将在多列对齐环境中出现在单个列中。只要我在同一列内使用 \usebox,它就会起作用,否则它会显示为空白。这是一个 MWE:
\documentclass{article}
\usepackage{amsmath}
\newcommand{\foobar}[1]{\texttt{\expandafter\string\csname #1\endcsname}}
\newcommand{\macro}[1]{\texttt{\expandafter\string\csname #1\endcsname}}
\newsavebox{\foo}
\begin{document}
\macro{savebox} inside \texttt{align*}, \macro{usebox} in differen column
\begin{align*}
\savebox{\foo}{bar} \mathrm{foo} &= \usebox{\foo}
\end{align*}
\macro{savebox} inside \texttt{align*}, \macro{usebox} in same column
\begin{align*}
\savebox{\foo}{bar} \mathrm{foo} = \usebox{\foo}
\end{align*}
\macro{savebox} outside \texttt{align*}
\savebox{\foo}{bar}
\begin{align*}
\mathrm{foo} &= \usebox{\foo}
\end{align*}
\end{document}
答案1
对于所有像 tex 中的结构一样的对齐,&
分离的单元格形成一个组,因此就像您已经完成一样,{ \savebox{\foo}{bar} }
这也会丢失设置。AMS 对齐还有一个额外的复杂性,即它们每次都会被评估两次。
所以答案就是不要这样做,但是如果你给出更多关于实际用例的指示,那么就更容易说出该怎么做。
答案2
如果你使用普通的 TeX 基本构造来构造盒子,那么就不会出现问题\global
:
\newbox\foo
\begin{align*}
\global\setbox\foo=\hbox{bar} \mathrm{foo} &= \box\foo
\end{align*}
答案3
您可以“轻松”地实现命令\gsbox
和(与和\gsavebox
相同的语法)以及环境以便对盒子箱执行全局分配。\sbox
\savebox
glrbox
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\DeclareRobustCommand\gsavebox[1]{%
\@ifnextchar(%)
{\@gsavepicbox#1}{\@ifnextchar[{\@gsavebox#1}{\gsbox#1}}}%
\long\def\gsbox#1#2{\global\setbox#1\hbox{%
\color@setgroup#2\color@endgroup}}
\def\@gsavebox#1[#2]{%
\@ifnextchar [{\@igsavebox#1[#2]}{\@igsavebox#1[#2][c]}}
\long\def\@igsavebox#1[#2][#3]#4{%
\gsbox#1{\@imakebox[#2][#3]{#4}}}
\def\@gsavepicbox#1(#2,#3){%
\@ifnextchar[%]
{\@igsavepicbox#1(#2,#3)}{\@igsavepicbox#1(#2,#3)[]}}
\long\def\@igsavepicbox#1(#2,#3)[#4]#5{%
\gsbox#1{\@imakepicbox(#2,#3)[#4]{#5}}}
\def\glrbox#1{%
\edef\reserved@a{%
\endgroup
\global\setbox#1\hbox{%
\begingroup\aftergroup}%
\def\noexpand\@currenvir{\@currenvir}%
\def\noexpand\@currenvline{\on@line}}%
\reserved@a
\@endpefalse
\color@setgroup
\ignorespaces}
\let\endglrbox\endlrbox
\makeatother
\newcommand{\foobar}[1]{\texttt{\expandafter\string\csname #1\endcsname}}
\newcommand{\macro}[1]{\texttt{\expandafter\string\csname #1\endcsname}}
\newsavebox{\foo}
\begin{document}
\macro{gsavebox} inside \texttt{align*}, \macro{usebox} in different column
\begin{align*}
\gsavebox{\foo}{bar} \mathrm{foo} &= \usebox{\foo}
\end{align*}
\end{document}