foo 的参数有一个额外的}。

foo 的参数有一个额外的}。

我正在尝试编写一个命令,该命令可以\fbox在类似align环境中有效地执行。以下代码有效:

\usepackage{etextools}
\makeatletter
\newcommand*{\alignedfbox}[1]{\@aligedfbox{#1}{}#1&\@endalignedfbox}
\def\@aligedfbox#1#2#3&#4\@endalignedfbox{%
  \ifempty{#4}{%
    \vrule
    \edef\temp{\expandafter\unexpanded\expandafter{\@@aligedfbox{#2#3}#1&\@@endalignedfbox}}%
    \temp
  }{%
    \edef\temp{\expandafter\unexpanded\expandafter{\@aligedfbox{#1}{#2#3}#4\@endalignedfbox}}%
    \temp
  }%
}
\def\@@aligedfbox#1#2&#3\@@endalignedfbox{%
  \underline{\overline{{}#2\vphantom{#1}}}
  \ifempty{#3}{%
    \vrule
  }{%
    &
    \edef\temp{\expandafter\unexpanded\expandafter{\@@aligedfbox{#1}#3\@@endalignedfbox}}%
    \temp
  }%
}

进而

\begin{align*}
  \alignedfbox{1 & = 2}
\end{align*}

但是,这个\edef\temp{\expandafter\unexpanded\expandafter{...}}\temp序列非常丑陋,我不确定为什么我需要它。(但如果我用 替换它...,它会失败并出现此帖子标题中提到的错误,即我对\@alignedfbox/ 的参数有一个额外的 }。令人惊讶的是,当我从\@@alignedfbox调用时不会发生此错误。)我认为它与此有关,并且朋友在执行之前将环境中的所有内容收集到一个宏中,并且与/有关,以及 TeX 在仅扩展上下文中的行为与在其他上下文中的行为有何不同,但我不确定。\@aligedfbox{#1}{}#1&\@endalignedfbox}\alignedfboxalign\protect\protected

在这种情况下,什么是的替代品\edef\temp{\expandafter\unexpanded\expandafter{...}}\temp,又如何解释为什么...它本身不起作用?

答案1

正如已经建议的那样,你不应该重新发明轮子......

\documentclass{article}
\usepackage{mathtools}
\begin{document}

\begin{align*}
  \Aboxed{1 &= 2 }\\
  1 &\ne 2
\end{align*}

\end{document}

在此处输入图片描述

答案2

这似乎更好(将在下一个数学工具中修复)

\documentclass{article}
\usepackage{mathtools}
\makeatletter
\def\@Aboxed#1&#2\ENDDNE{%
 \settowidth\@tempdima{$\displaystyle#1$}% <-
 \addtolength\@tempdima{\fboxsep}%
 \addtolength\@tempdima{\fboxrule}%
 \global\@tempdima=\@tempdima
 \kern\@tempdima
 &
 \kern-\@tempdima
\boxed{#1#2}
}
\makeatother
\begin{document}

\begin{align*}
  \Aboxed{1 &= 2 }\\
  1 &\ne 2
\end{align*}
\end{document}

相关内容