\savebox 忘记了其在对齐列中的内容

\savebox 忘记了其在对齐列中的内容

我想保存方程的一部分,该部分将在多列对齐环境中出现在单个列中。只要我在同一列内使用 \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\saveboxglrbox

\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}

在此处输入图片描述

相关内容