`\Aboxed` 如何工作?

`\Aboxed` 如何工作?

根据家庭作业的要求,我被要求用红色框围住我的答案,因此我导入mathtoolsxcolor尝试:

\color{red}\Aboxed{\color{black}#1}

方程式是哪里#1,但它不起作用。所以我决定观察一下的实现mathtools,我发现它的定义\Aboxed{}是:

\newcommand\Aboxed[1]{\let\bgroup{\romannumeral-`}\@Aboxed#1&&\ENDDNE}

\def\@Aboxed#1&#2&#3\ENDDNE{%
  \ifnum0=`{}\fi \setbox \z@
    \hbox{$\displaystyle#1{}\m@th$\kern\fboxsep \kern\fboxrule }%
    \edef\@tempa {\kern  \wd\z@ &\kern -\the\wd\z@ \fboxsep
        \the\fboxsep \fboxrule \the\fboxrule }\@tempa \boxed {#1#2}%
} 

我认为我理解了\setbox的一部分\@tempa
我画了一张小图来说明我认为那里发生了什么,\setbox创建一个宽度为 的框,该框位于等式左侧,可通过 访问\wd\z@。然后\@tempa将该字距调整放在左侧,之后是对齐符号,但我不知道右侧的负字距调整。
tikz 的 kern 示例
但是我找不到有关\let\bgroup{\romannumeral-`}、命令\ENDDNE或 if 语句的任何信息\ifnum0=`{}\fi。我​​问了很多问题,但如果有人能向我解释这一点或给我一个好的起点,我将不胜感激。

答案1

首先,如果您想要彩色版本\Aboxed,这里有一个快速解决方法:

\documentclass{article}

\usepackage{mathtools}
\usepackage{xcolor}

\makeatletter
\newcommand*\Acolorboxed[2][red]{%
   \let\bgroup{\romannumeral-`}%
   \@Acolorboxed{#1}#2&&\ENDDNE
}
\def\@Acolorboxed#1#2&#3&#4\ENDDNE{%
  \ifnum0=`{}\fi
  \setbox\z@\hbox{$\displaystyle#2{}\m@th$\kern\fboxsep \kern\fboxrule}%
  \edef\@tempa{\kern\wd\z@ & \kern-\the\wd\z@ \fboxsep\the\fboxsep \fboxrule\the\fboxrule}%
  \@tempa
  \fcolorbox{#1}{white}{\m@th$\displaystyle#2#3$}%
} 
\makeatother

\begin{document}

\begin{align*}
\Aboxed{a&=b} \\
\Acolorboxed{a&=b} \\
\Acolorboxed[green]{a&=b}
\end{align*}

\end{document}

在此处输入图片描述

解释\Aboxed

这比较棘手:让我首先通过删除两个括号技巧来“简化”定义(请参阅下文),即让我们假设定义只是

\newcommand\Aboxed[1]{\@Aboxed#1&&\ENDDNE}
\def\@Aboxed#1&#2&#3\ENDDNE{%
  \setbox0=\hbox{$\displaystyle#1{}\m@th$\kern\fboxsep \kern\fboxrule}%
  \edef\@tempa{\kern\wd0 & \kern-\the\wd0 \fboxsep=\the\fboxsep \fboxrule=\the\fboxrule}%
  \@tempa
  \boxed {#1#2}%
}

定义

\def\@Aboxed#1&#2&#3\ENDDNE{...}

意味着\@Aboxed期望分隔参数。第一个之前的所有内容&都是第一个参数;第一个和第二个之间的所有内容&都是第二个参数;第二个&和之间的所有内容\ENDDNE都是第三个参数。宏\ENDDNE只是一些虚拟分隔符。但是,这两个&和这个\ENDDNE 必须在那里:TeX 会一直扫描文件,直到找到它们,如果它们不在那里,你就会遇到麻烦,这就是为什么\Aboxed把它放在那里。你可以定义

\def\Aboxed#1&#2&#3\MaryPoppins{...}

这不会改变任何事情,当然前提是你相应地使用了

\newcommand\Aboxed[1]{\@Aboxed#1&&\MaryPoppins}

事实上\Aboxed &它的参数之后是一个安全措施,我推测这在第一个版本中是不存在的mathtools(见! \@Aboxed 的参数有一个额外的 })。它允许您(滥用)使用它并\Aboxed{a}在不引发错误的情况下写入 no &(尽管您应该简单地使用\boxed它)。

让我们举个例子:TeX 扩展宏,当它发现

\Aboxed{E&=mc^2}

这扩展为

% remember:
% \def\@Aboxed#1&#2&#3\ENDDNE
\@Aboxed E&=mc^2&&\ENDDNE

因此这里E是第一个参数,=mc^2是第二个参数,而杂散&是第三个参数。根据这个定义,\@Aboxed现在变成

\setbox0=\hbox{$\displaystyle E{}\m@th$\kern\fboxsep \kern\fboxrule}%
\edef\@tempa{\kern\wd0 & \kern-\the\wd0 \fboxsep=\the\fboxsep \fboxrule=\the\fboxrule}%
\@tempa
\boxed {E=mc^2}%

然后,盒子寄存器\box0包含E加上的宽度\fbox和分离。现在的想法是

  1. 插入宽度等于的不可见水平空间\box0
  2. 转到下一栏,
  3. 返回的宽度\box0
  4. 打印\boxed方程式。

为什么\edef?单元格的作用类似于组,并且\box0设置在单元格中。如果我们写

kern\wd0 & \kern-\wd0 \boxed {E=mc^2}

那么负数\kern就是错误的。确保\edef扩展\the,以便我们得到正确的值。(问题:为什么不使用\global\setbox\@ne?)

支撑技巧,即两位\let\bgroup{\romannumeral-`}\ifnum0=`{}\fi,相当棘手。您可以阅读一些内容,例如大括号技巧展示:}、\egroup、\iffalse{\fi} 等。。我对括号技巧的掌握有限,但我认为这归结为 TeX 在扫描时不会增加/减少主计数器`{`}我猜想它们的存在是出于某种安全原因,但老实说,我的测试没有显示没有它们的任何差异。希望比我更了解 TeX 的人能阐明这一点。

答案2

\colorboxed我建议根据来自的\fcolorbox命令定义一个命令,该命令xcolor具有两个强制参数(线条颜色和框的内容)和一个用于背景颜色的可选参数(默认为白色),并使用来修补该\Aboxed命令xpatch

\documentclass{article}
\usepackage[svgnames]{xcolor}
\usepackage{mathtools}
\usepackage{xpatch}
\makeatletter
    \newcommand{\colorboxed}[3][white]{\fcolorbox{#2}{#1}{\m@th$\displaystyle#3$}}
    \xpatchcmd{\@Aboxed}{\boxed}{\colorboxed[LavenderBlush!40]{IndianRed}}{}{}
\makeatother 

\begin{document}

\begin{align}
x & = \frac{-b\pm\sqrt{b^2-4ac}}{2a}\\
\Aboxed{x & = \frac{-b'\pm\sqrt{b'^2-ac}}{a}}
\end{align}

\end{document} 

在此处输入图片描述

相关内容