我正在尝试编写一个命令,该命令可以\fbox
在类似align
环境中有效地执行。以下代码有效:
\usepackage{etextools}
\makeatletter
\newcommand*{\alignedfbox}[1]{\@aligedfbox{#1}{}#1&\@endalignedfbox}
\def\@aligedfbox#1#2#3\@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\@@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}
\alignedfbox
align
\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\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}