我想强调 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,这样就不会产生额外的开销。此解决方案的主要特点是:
- 文本和数学使用相同的代码,
- 突出显示是在背景画布上绘制的,因此在后面文本,
- 荧光笔的样式可以通过 PGF 键进行自定义,
- 它的换行功能做得很合理。
可以将其适应于非投影仪解决方案,要么使用 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}
举个例子: