在数学环境中工作的 colorbox 版本

在数学环境中工作的 colorbox 版本

我想强调 amsmath 环境的特定部分。这是一个最小的工作示例:

\documentclass{article}
\usepackage{amsmath,color}
\newcommand{\abs}[1]{\lvert#1\rvert}
\newcommand{\Abs}[1]{\left\lvert#1\right\rvert}

%\newcommand{\highlight}[1]{\colorbox{yellow}{#1}}
\newcommand{\highlight}[1]{\boxed{#1}}

\begin{document}
\begin{alignat*}{2}
&\lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x} = \ell \\
\iff& \forall \epsilon > 0, \, \exists \delta > 0 \text{ s.t. if }
0 < \abs{\Delta x - 0} < \delta,
\text{ then } \Abs{\frac{\Delta y}{\Delta x} - \ell} < \epsilon \\
\iff& \forall \epsilon > 0, \, \exists \delta > 0 \text{ s.t. if }
0 < \highlight{\abs{x - x_0}} < \delta, \text{ then }
\highlight{\Abs{\frac{f(x) - f(x_0)}{x-x_0} - \ell}} < \epsilon
\end{alignat*}

\end{document}

\highlight如果我更改了注释掉的命令版本,编译器就会开始抱怨Missing $ inserted

答案1

这里的问题是\colorbox将其参数恢复回文本模式。而且,由于您在文本模式下使用与数学相关的宏(例如\left\right和),TeX 会抱怨缺少。因此,您需要使用\frac以下命令明确说明您处于数学模式:\ell$

\newcommand{\highlight}[1]{\colorbox{yellow}{$\displaystyle #1$}}

我添加了\displaystyle以确保您的分数和分隔符像往常一样扩展。如果此行为不受欢迎,您可以修改或删除它。

关于这个话题,amsmath提供\dfrac,是 的缩写\displaystyle\frac。这种显示/文本样式分数的明确使用可以很好地强制执行某人的意图,并且可以消除使用\displaystyle.

在此处输入图片描述


可以改进\highlight宏以检测正在使用的数学模式的类型。这可以通过使用\mathchoice提供 4 种不同样式的排版选择来实现:

\mathchoice{<displaystyle>}{<textstyle>}{<scriptstyle>}{<scriptscriptstyle>}

在更新版本中,\highlight数学模式在使用之前会被检测\colorbox,并在其中进行相应切换。此外,为了通用化,我添加了一个可选参数,\highlight允许您切换颜色(默认为yellow),如 MWE 中所示:

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\usepackage{xcolor}% http://ctan.org/pkg/xcolor
\newcommand{\abs}[1]{\lvert#1\rvert}
\newcommand{\Abs}[1]{\left\lvert#1\right\rvert}

% \highlight[<colour>]{<stuff>}
\newcommand{\highlight}[2][yellow]{\mathchoice%
  {\colorbox{#1}{$\displaystyle#2$}}%
  {\colorbox{#1}{$\textstyle#2$}}%
  {\colorbox{#1}{$\scriptstyle#2$}}%
  {\colorbox{#1}{$\scriptscriptstyle#2$}}}%

\begin{document}
\begin{alignat*}{2}
  & \lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x} = \ell \\
  \iff & \forall \epsilon > 0, \, \exists \delta > 0 \text{ s.t. if }
    0 < \abs{\Delta x - 0} < \delta,
    \text{ then } \Abs{\frac{\Delta y}{\Delta x} - \ell} < \epsilon \\
\iff & \forall \epsilon > 0, \, \exists \delta > 0 \text{ s.t. if }
    0 < \highlight{\abs{x - x_0}} < \delta, \text{ then }
    \highlight[green]{\Abs{\frac{f(x) - f(x_0)}{x-x_0} - \ell}} < \epsilon
\end{alignat*}    
\end{document}

答案2

另一种方法是使用\ensuremath

\newcommand{\highlight}[1]{\colorbox{yellow}{\ensuremath{#1}}}

这也达到了预期的效果。

答案3

我有一些用于突出显示文本的代码,专门用于 beamer 类。它使用 TikZ,但我还是会在演示文稿中加载 TikZ,这样就不会产生额外的开销。此解决方案的主要特点是:

  1. 文本和数学使用相同的代码,
  2. 突出显示是在背景画布上绘制的,因此在后面文本,
  3. 荧光笔的样式可以通过 PGF 键进行自定义,
  4. 它的换行功能做得很合理。

可以将其适应于非投影仪解决方案,要么使用 Martin Scharer 的代码在页面背景上绘图,要么适应投影仪的标题使用(滥用)将代码放置在文本后面。

代码如下:

\documentclass{beamer}
\usepackage{amsmath}
\usepackage{tikz}

\makeatletter
%
% Highlighter code
%

\newbox\high@box
\let\high@contents=\@empty
\defbeamertemplate{background canvas}{highlighter}{%
  \ifbeamercolorempty[bg]{background canvas}{}{\color{bg}\vrule width\paperwidth height\paperheight}%
  \begingroup
  \setbox\high@box=\hbox{\begin{tikzpicture}[remember picture,overlay]
    \node[minimum width=\textwidth, minimum height=\textheight, anchor=south east] (page) at (-\beamer@rightmargin,\footheight) {};
    \high@contents
  \end{tikzpicture}}%
  \wd\high@box=0pt\ht\high@box=0pt\dp\high@box=0pt%
    \vbox{\hbox{\box\high@box}}%
  \global\let\high@contents=\@empty
  \endgroup}

\newcommand{\addtobg}[1]{%
  \g@addto@macro\high@contents{#1}%
}

\newcounter{highlight}
\newcommand{\hlstart}{\tikz[remember picture,overlay,baseline=-0.7ex] \coordinate (hlstart\the\value{highlight});\hl@start}
\newcommand{\hlend}{\tikz[remember picture,overlay,baseline=-0.7ex] \coordinate (hlend\the\value{highlight});\hl@end\stepcounter{highlight}}

\newcommand{\hl@start}[1][]{%
  \edef\@temp{%
    \noexpand\addtobg{{\noexpand\tikzset{#1}\noexpand\hl@draw{\the\value{highlight}}}}%
  }%
  \@temp
}

\newcommand{\hl@end}{}

\newcommand{\hl@draw}[1]{%
  \pgfkeysgetvalue{/tikz/highlighter width}{\hl@width}%
  \pgfmathsetlengthmacro{\hl@width}{\hl@width - 1pt}%
  \path (hlstart#1);
  \pgfgetlastxy{\hl@sx}{\hl@sy}%
  \path (hlend#1);
  \pgfgetlastxy{\hl@ex}{\hl@ey}%
  \ifdim\hl@sy=\hl@ey\relax
  \draw[highlight] (hlstart#1) -- (hlend#1);
  \else
  \draw[highlight] (hlstart#1) -- (hlstart#1 -| page.east);
  \pgfmathsetlengthmacro{\hl@sy}{\hl@sy -\hl@width}%
  \pgfmathsetlengthmacro{\hl@ey}{\hl@ey +\hl@width}%
  \loop\ifdim\hl@sy>\hl@ey\relax
  \draw[highlight] (0,\hl@sy -| page.west) -- (0,\hl@sy -| page.east);
  \pgfmathsetlengthmacro{\hl@sy}{\hl@sy -\hl@width}%
  \repeat
  \draw[highlight] (hlend#1 -| page.west) -- (hlend#1);
  \fi
}

\tikzset{%
  highlight/.style={
    color=\pgfkeysvalueof{/tikz/highlighter colour},
    line width=\pgfkeysvalueof{/tikz/highlighter width},
    line cap=\pgfkeysvalueof{/tikz/highlighter cap},
  },
  highlighter colour/.initial=yellow,
  highlighter width/.initial=12pt,
  highlighter cap/.initial=butt,
}

\setbeamercolor{highlighted text}{bg=yellow}

\newcommand<>{\highlight}[2][]{%
  \only#3{\hlstart[#1]}#2\only#3{\hlend}}

\makeatother
\setbeamertemplate{background canvas}[highlighter]
\newcommand{\abs}[1]{\lvert#1\rvert}
\newcommand{\Abs}[1]{\left\lvert#1\right\rvert}

\begin{document}
\begin{frame}
\small
\begin{alignat*}{2}
&\lim_{\Delta x \to 0} \frac{\Delta y}{\Delta x} = \ell \\
\iff& \forall \epsilon > 0, \, \exists \delta > 0 \text{ s.t. if }
0 < \abs{\Delta x - 0} < \delta,
\text{ then } \Abs{\frac{\Delta y}{\Delta x} - \ell} < \epsilon \\
\iff& \forall \epsilon > 0, \, \exists \delta > 0 \text{ s.t. if }
0 < \highlight{\abs{x - x_0}} < \delta, \text{ then }
\highlight[highlighter colour=green,highlighter width=1cm]{\Abs{\frac{f(x) - f(x_0)}{x-x_0} - \ell}} < \epsilon
\end{alignat*}
\end{frame}
\end{document}

举个例子:

突出显示的文本

相关内容