我試圖弄清楚如何\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,}}