我正在尝试弄清楚如何在环境\tcbhighmath
中的集合中只使用一个方程式放置一个风格化的框align*
。例如:
\begin{align*}
x &= 2 + y \\
y &= 1 + z \\
z &= 3 + x
\end{align*}
我只想要一个围绕最后一个等式的框:z = 3 + x。
答案1
您不能直接将一个框跨越两align
列,但是这里有一个解决方法可以获得所需的结果。
align
使用两次传递来排版方程式:第一次传递测量所有组件的高度/宽度,第二次传递实际上对它们进行排版。我们定义了一个新命令\mathbox{...&...}
来收集方程式的左半部分和右半部分。在测量传递(\ifmeasuring@
为真)中,我们通常设置列文本以获得正确的宽度。
第二步设置一个零宽度\tcbhighmath
框,其中包含列文本,另外向左移动左列文本宽度与框样式的几个参数(内边距、规则宽度等)之和,以使等号与框外的等号对齐。结果基本上是一个空的右列,左列中的框与两列重叠。
最小示例代码:
\documentclass{article}
\usepackage{mathtools}
\usepackage[theorems]{tcolorbox}
\makeatletter
\def\mathbox#1{\mathbox@#1\@end}
\def\mathbox@#1\@end{%
\ifmeasuring@
#1%
\else
\begingroup
\setbox0=\hbox{$\displaystyle#1$}%
\dimen0=\dimexpr\wd0+\kvtcb@left@rule+\kvtcb@leftupper
+\kvtcb@boxsep+\kvtcb@bbleft\relax
\hskip-\dimen0\relax
\mathrlap{\tcbhighmath{\displaystyle#1 #2}}%
\hskip\dimen0\relax
\endgroup
\fi
&
\ifmeasuring@
#2%
\fi
}
\makeatother
\begin{document}
\begin{align*}
x &= 2 + y \\
y &= 1 + z \\
z &= 3 + x
\end{align*}
\begin{align*}
x &= 2 + y \\
y &= 1 + z \\
\mathbox{z &= 3 + x}
\end{align*}
\end{document}
输出
答案2
\documentclass{article}
\usepackage{mathtools}
\usepackage[theorems]{tcolorbox}
\tcbset{
highlight math/.append style={
grow to left by =4.25mm,}
}
\let\boxed=\tcbhighmath
\begin{document}
\begin{align*}
x &= 2 + y \\
y &= 1 + z \\
\Aboxed{z &= 3 + x}
\end{align*}
\end{document}
一些解释
该mathtools
包提供了\Aboxed
可以像这样使用的命令:
\usepackage{mathtools}
...
\begin{align*}
x &= 2 + y \\
y &= 1 + z \\
\Aboxed{z &= 3 + x}
\end{align*}
产生这样的事物:
根据mathtools
手册:internally \Aboxed does use \boxed
。
为了让\Aboxed
命令使用该\tcbhighmath
框,我们重新定义该\boxed
命令\let\boxed\tcbhightmath
并得到:
正如所见,我们需要调整框的位置,因此我们 在样式grow to left by = <some distance>
中添加选项highlight math
:\tcbset{highlight math/.append style={grow to left by =4.25mm,}}