在解释两个负数的乘积时,我想突出显示的垂直部分,以强调要乘以的因数:
\documentclass[letterpaper]{article}
\usepackage{fullpage}
\usepackage{amsmath,amssymb,amsthm,enumitem}
\newcommand{\red}[1]{%
{\color{OrangeRed}#1}}
\begin{document}
\begin{equation*}
\left.\begin{array}{cc}
-2\cdot \red{2}=& -4 \\
-2\cdot \red{1}=& -2 \\
-2\cdot \red{0}=& 0
\end{array}\right\} \text{\small Product increases by 2 each time.}
\end{equation*}
\end{document}
得出:
因此我选择使用颜色,但我还想实现如下效果:
我对黄色红色边框不感兴趣。我所寻找的是一个箭头指向红色数字,周围有垂直边框,如图所示,并且可以添加一个节点,节点中的文本格式与“产品”一词对齐。
编辑
我可以用这种方法来实现这个目的吗:
答案1
为了完成这个任务,你可以使用tikzmark
宏。此解决方案允许获得:
代码:
\documentclass[letterpaper]{article}
\usepackage{fullpage}
\usepackage{amsmath,amssymb,amsthm,enumitem}
\usepackage{xcolor}
\newcommand{\red}[1]{%
{\color{red}#1}}
\usepackage{tikz}
% to change colors
\newcommand{\fillcol}{white}
\newcommand{\bordercol}{red}
%% code by Andrew Stacey
% https://tex.stackexchange.com/questions/51582/background-coloring-with-overlay-specification-in-algorithm2e-beamer-package#51582
\makeatletter
\tikzset{%
remember picture with id/.style={%
remember picture,
overlay,
draw=\bordercol,
save picture id=#1,
},
save picture id/.code={%
\edef\pgf@temp{#1}%
\immediate\write\pgfutil@auxout{%
\noexpand\savepointas{\pgf@temp}{\pgfpictureid}}%
},
if picture id/.code args={#1#2#3}{%
\@ifundefined{save@pt@#1}{%
\pgfkeysalso{#3}%
}{
\pgfkeysalso{#2}%
}
}
}
\def\savepointas#1#2{%
\expandafter\gdef\csname save@pt@#1\endcsname{#2}%
}
\def\tmk@labeldef#1,#2\@nil{%
\def\tmk@label{#1}%
\def\tmk@def{#2}%
}
\tikzdeclarecoordinatesystem{pic}{%
\pgfutil@in@,{#1}%
\ifpgfutil@in@%
\tmk@labeldef#1\@nil
\else
\tmk@labeldef#1,(0pt,0pt)\@nil
\fi
\@ifundefined{save@pt@\tmk@label}{%
\tikz@scan@one@point\pgfutil@firstofone\tmk@def
}{%
\pgfsys@getposition{\csname save@pt@\tmk@label\endcsname}\save@orig@pic%
\pgfsys@getposition{\pgfpictureid}\save@this@pic%
\pgf@process{\pgfpointorigin\save@this@pic}%
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgf@process{\pgfpointorigin\save@orig@pic}%
\advance\pgf@x by -\pgf@xa
\advance\pgf@y by -\pgf@ya
}%
}
\makeatother
\newcommand{\tikzmarkin}[1]{%
\tikz[remember picture with id=#1]
\draw[line width=1pt,rectangle,rounded corners,fill=\fillcol]
(pic cs:#1) ++(0.065,-0.15) rectangle (-0.05,0.32)
;}
\newcommand\tikzmarkend[2][]{%
\tikz[remember picture with id=#2] #1;}
\begin{document}
\begin{equation*}
\left.\begin{array}{cc}
-2\cdot \tikzmarkin{a}\red{2}=& -4 \\
-2\cdot \red{1}=& -2 \\
-2\cdot \red{0}\tikzmarkend{a}=& 0
\end{array}\right\} \text{\small Product increases by 2 each time.}
\end{equation*}
\end{document}
注意需要编译两次。
解释
里面tikzset
有要绘制的图片的样式的定义(remember picture with id
)然后是定义和上的写法.aux
),然后是标记的 id 和位置的https://tex.stackexchange.com/a/50054/13304。最后,您需要在文档中使用\tikzmarkin
和\tikzmarkend
定义的命令。
编辑:插入注释
为了达到这个目的,我采用了同样的技巧标记伪代码块并在其附近插入注释:在宏中插入一个锚点\tikzmarkin
,随后将其用作插入注释的参考。以前的 MWE 有什么变化?
你应该在序言中添加:
\usetikzlibrary{calc} % <= needed for some computations
\usepackage{lipsum} % <= needed to insert some text later
应\tikzmarkin
改进如下:
\newcommand{\tikzmarkin}[1]{%
\tikz[remember picture with id=#1]
\draw[line width=1pt,rectangle,rounded corners,fill=\fillcol]
(pic cs:#1) ++(0.065,-0.15) rectangle (-0.05,0.32) node [anchor=base] (#1){}
;}
其中相关的新部分就是node [anchor=base] (#1){}
。
最后,document
:
\begin{document}
\begin{equation*}
\left.\begin{array}{cc}
-2\cdot \tikzmarkin{a}\red{2}=& -4 \\
-2\cdot \red{1}=& -2 \\
-2\cdot \red{0}\tikzmarkend{a}=& 0
\end{array}\right\} \text{\small Product increases by 2 each time.}
\end{equation*}
% To insert the annotation
\begin{tikzpicture}[remember picture,overlay]
\coordinate (aa) at ($(a)+(1.825,-1.65)$); % <= adjust this parameter to move the position of the annotation
\node[align=left,right] at (aa) {\small{Annotation}};
\path[-latex,red,draw] (aa) -| ($(a)+(0.15,-1.3)$);
\end{tikzpicture}
\linebreak
\lipsum[1]
\end{document}
最后一部分是插入注释所需的部分:首先,我根据之前保存的锚点定义了插入注释的坐标(为了实现这一点,重要的是具有tikzpicture
选项remember picture,overlay
)。最后一条命令:
\path[-latex,red,draw] (aa) -| ($(a)+(0.15,-1.3)$);
绘制箭头:起点是注释的坐标,终点应根据参考锚点a
位于红色矩形的左上角来计算。
这将导致:
最后一点:我认为最好在\linebreak
后面插入一个,tikzpicture
以避免注释放置得离后续文本太近。