![在对齐环境中突出显示方程式](https://linux22.com/image/235554/%E5%9C%A8%E5%AF%B9%E9%BD%90%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%AA%81%E5%87%BA%E6%98%BE%E7%A4%BA%E6%96%B9%E7%A8%8B%E5%BC%8F.png)
我想定义一个命令,用红色框包围一个方程式并用黄色突出显示。我的基本操作已经很好了。我无法弄清楚的是:
- 如何保持等号上的等式对齐。
能够在突出显示框的调用内包含对齐字符。也就是说,我更希望能够这样说:
\highlightbox{g &= f}
而不是我下面所做的事情。
以下是我目前所掌握的信息:
\documentclass[11pt]{article}
\usepackage{color}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\newcommand{\highlightbox}[1]{%
\setlength{\fboxrule}{6pt}\fcolorbox{red}{yellow}{#1}\quad%
}
\begin{document}
\begin{align*}
\highlightbox{a} &\highlightbox{= b} \\
c & = d \\
e & = f \\
\highlightbox{g} &\highlightbox{= f} \\
\end{align*}
\end{document}
答案1
这mathtools
包提供了一个Aboxed
命令,允许人们在对齐中创建一个框。通过稍微重新定义它,你可以得到想要的效果:
\documentclass[11pt]{article}
\usepackage{color}
\usepackage{mathtools}
\usepackage{amssymb}
\usepackage{amsfonts}
\makeatletter
\def\@Aboxed#1\ENDDNE{%
\settowidth\@tempdima{$\displaystyle#1{}$}%
\addtolength\@tempdima{\fboxsep}%
\addtolength\@tempdima{\fboxrule}%
\global\@tempdima=\@tempdima
\kern\@tempdima
&
\kern-\@tempdima
\fcolorbox{red}{yellow}{$\displaystyle #1#2$}
}
\makeatother
\begin{document}
\begin{align*}
\Aboxed{a &= b} & c &= d \\
c & = d & \Aboxed{i &= k} \\
e & = f & g &= h
\end{align*}
\end{document}
Aboxed
我基本上复制了from的定义mathtools.dtx
,并将定义的最后一行从\boxed
to改为\fcolorbox{...
。
(我不确定是否应该将以下内容添加为新答案或编辑。如果我应该将其作为新答案,请告知。)
当我查看我之前写的一些讲义时,我发现我的序言中有一个用于此目的的命令,我意识到我已经从 LaTeXcommunity.org 复制了它,但从未使用过它。所以这是另一个解决方案,基于daleif 在 LaTeX 社区发表的这篇文章:
\documentclass{article}
\usepackage{calc}
\usepackage{amsmath}
\usepackage{xcolor}
\newlength\dlf
\newcommand\alignedbox[2]{
% #1 = before alignment
% #2 = after alignment
&
\begingroup
\settowidth\dlf{$\displaystyle #1$}
\addtolength\dlf{\fboxsep+\fboxrule}
\hspace{-\dlf}
\fcolorbox{red}{yellow}{$\displaystyle #1 #2$}
\endgroup
}
\begin{document}
\begin{align*}
\alignedbox{a}{=b} & c &= d \\
c & = d & \alignedbox{i}{=k} \\
e & = f & g &= h
\end{align*}
\end{document}
得出:
这不存在覆盖现有命令的问题,但需要包calc
。
答案2
这是一个相当丑陋的 hack:我使用tikz
包在 align 中围绕等式的左侧和右侧创建一个节点,使用remember picture
选项来记住节点的大小和位置。然后我使用选项用另一张 tikz 图片绘制了方框overlay
。
问题是tikz
会画出方框超过等式中的文本,所以我不得不使用记住的节点位置来重新创建节点。一定有更好的方法可以做到这一点。
\documentclass[11pt]{article}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzstyle{nd} = [anchor=base, inner sep=0pt]
\tikzstyle{ndpic} = [remember picture, baseline, every node/.style={nd}]
\begin{document}
\begin{align*}
\tikz[ndpic]{\node(left) {$a$};} &= \tikz[ndpic]{\node (right) {$b$};} \\
c & = d \\
e & = f \\
\tikz[ndpic]{\node(left1) {$\displaystyle \lim_{x\to 0}\frac{\sin x}{x}$};} &= \tikz[ndpic]{\node (right1)
{$\displaystyle \int_{-\pi}^\pi \frac{\sqrt{x^2 - 1}}{2x}\;dx$};} \\
\end{align*}
\begin{tikzpicture}[overlay, remember picture]
\draw[very thick, red, fill=yellow] ($ (left.south west)+(-.1,-.1) $)
rectangle ($ (right.north east)+(.1,.1) $);
\node[nd] at (left.base) {$a$};
\node[nd] at (right.base) {$b$};
\node[nd] at ($ (right.base)!.5!(left.base) $) {$=$};
\end{tikzpicture}
\begin{tikzpicture}[overlay, remember picture]
\draw[very thick, red, fill=yellow] ($ (left1.south west)+(-.1,-.2) $)
rectangle ($ (right1.north east)+(.1,.1) $);
\node[nd] at (left1.base) {$\displaystyle \lim_{x\to 0}\frac{\sin x}{x}$};
\node[nd] at (right1.base) {$\displaystyle \int_{-\pi}^\pi \frac{\sqrt{x^2 - 1}}{2x}\;dx$};
\node[nd] at ($ (right1.base west)!.5!(left1.base east) $) {$=$};
\end{tikzpicture}
\end{document}