尝试应用问题提供的解决方案如何在等式各部分之间画箭头来显示数学分配律(乘法)?我发现了一个主要问题,如下例所示:
\documentclass{article}
\usepackage{amsmath}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,shapes}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[2]{%
\begin{tikzpicture}[overlay,remember picture]
\draw[->,shorten >=5pt,shorten <=5pt,out=70,in=130,distance=0.5cm,#1] (MarkA.north) to (MarkC.north);
\draw[->,shorten >=5pt,shorten <=5pt,out=50,in=140,distance=0.3cm,#2] (MarkA.north) to (MarkB.north);
\end{tikzpicture}
}
\begin{document}
\[\tikzmark{MarkA}a(b\tikzmark{MarkB}+c\tikzmark{MarkC})=ab+ac \DrawBox{OrangeRed}{Cerulean}\]
\begin{align*}
-(2x+5)&=(-\tikzmark{MarkA}1)(2x\tikzmark{MarkB}+5\tikzmark{MarkC})\DrawBox{OrangeRed}{Cerulean}\\
&=(-1)(2x)+(-1)(5)\\
&=-2x+(-5)\\
&=-2x-5
\end{align*}
\end{document}
得出:
首先,我不喜欢箭头离开和进入节点的方式。我希望能够控制弧线的高度。其次,箭头没有正确地指向右节点上方。我理解命令没有设置为获取角色并让它像 Jakes 的回答中那样充当节点。这是一个缺点。
接下来,即使我尝试了 Jakes 方法,也只能有一个源,但可以有多个目标。如何定义多个源?我喜欢 Peter Grill 的答案,因为可以定义多个tikzmark
。这非常有用,但就外观而言,它不是最好的。我希望我选择的配色方案保持标准,但我希望能够自定义上面提到的其他参数。
因此,弧线必须具有合适的高度(也许让 TikZ 进行计算),并且可以有多个源和目标而无需定义新的\tikzmark
s。这在某种程度上是两个答案的结合。
编辑
我认为我理解了这个\tikzmark
命令,但这是我的主要问题,如果像 Jakes 的回答那样选择数学模式字符作为节点,就可以避免这个问题。
这是我看到最多问题的例子(可能只是我对 TikZ 和节点缺乏了解。)
\documentclass[letterpaper]{article}
\usepackage{amsmath,amssymb}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,shapes}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[2]{%
\begin{tikzpicture}[overlay,remember picture]
\node[xshift=0.85cm,yshift=0.65cm] (MarkExp) {\footnotesize Exponent};
\node[xshift=-0.85cm,yshift=-0.35cm] (MarkBase) {\footnotesize Base};
\draw[->,shorten >=6pt,out=180,in=90,#1] (MarkExp.west) to ([xshift=-2.5pt]MarktoExp.north);
\draw[->,out=0,in=270,#2] (MarkBase.east) to ([xshift=2.5pt,yshift=2pt]MarktoBase.south);
\end{tikzpicture}
}
\begin{document}
$\tikzmark{MarktoBase}2^3\tikzmark{MarktoExp}$\DrawBox{OrangeRed}{Cerulean}
\end{document}
我觉得上面的解决方案虽然能完成任务,但我还是强迫箭头符合我的要求。我真诚地相信有更好的方法可以实现与上述相同的输出。
答案1
这已经内置了结构,以便您提供其他选项来控制所绘制的线条。您可以调整
out=
控制箭头起始处的角度,in=
控制箭头末端的角度,distance=
控制箭头的高度,- 这两个
shorten
用于调整起点和终点与特定节点的接近程度。
可能还有其他选项,应该在 PGF 手册中与使用to
而不是--
进行线条绘制的语法相关。
笔记:
- 我还移动了 in: 的位置,
2\tikzmark{MarkB}x
以便箭头指向2x
术语的中心。
代码:
\documentclass{article}
\usepackage{amsmath}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,shapes}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[2]{%
\begin{tikzpicture}[overlay,remember picture]
\draw[->,shorten >=5pt,shorten <=5pt,out=70,in=130,distance=0.5cm,#1] (MarkA.north) to (MarkC.north);
\draw[->,shorten >=5pt,shorten <=5pt,out=50,in=140,distance=0.3cm,#2] (MarkA.north) to (MarkB.north);
\end{tikzpicture}
}
\begin{document}
\[\tikzmark{MarkA}a(b\tikzmark{MarkB}+c\tikzmark{MarkC})=ab+ac \DrawBox{OrangeRed,distance=0.75cm,in=110,shorten >=3pt}{Cerulean,out=60,in=110,distance=0.5cm}\]
\begin{align*}
-(2x+5)&=(-\tikzmark{MarkA}1)(2\tikzmark{MarkB}x+5\tikzmark{MarkC})\DrawBox{OrangeRed,distance=0.75cm}{Cerulean,out=60,in=110,distance=0.5cm}\\
&=(-1)(2x)+(-1)(5)\\
&=-2x+(-5)\\
&=-2x-5
\end{align*}
\end{document}
答案2
与的答案相同Peter Grill
,但箭头直接指向的中心tikz node
:
\documentclass{article}
\usepackage{amsmath}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\usetikzlibrary{calc,shapes}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand{\DrawBox}[2]{%
\begin{tikzpicture}[overlay,remember picture]
\draw[->,shorten >=5pt,shorten <=5pt,out=70,in=130,distance=0.5cm,#1] (MarkA.north) to (MarkC.north);
\draw[->,shorten >=5pt,shorten <=5pt,out=50,in=140,distance=0.3cm,#2] (MarkA.north) to (MarkB.north);
\end{tikzpicture}
}
\newlength{\MyL}
\newcommand{\TkM}[2]{%
\settowidth{\MyL}{#2}
#2\hspace{-\MyL}\makebox[\MyL]{\tikzmark{#1}}
}
\begin{document}
\[\TkM{MarkA}{a}(\TkM{MarkB}{b}+\TkM{MarkC}{c})=ab+ac
\DrawBox{OrangeRed,distance=0.45cm,in=130,shorten >=3pt,shorten <=3pt}{Cerulean,out=65,in=110,distance=0.3cm,shorten >=3.5pt,shorten <=3pt}\]
\begin{align*}
-(2x+5)&=(\TkM{MarkA}{-1})(\TkM{MarkB}{2x}+\TkM{MarkC}{5})
\DrawBox{OrangeRed,distance=0.6cm}{Cerulean,out=60,in=110,distance=0.4cm}\\
&=(-1)(2x)+(-1)(5)\\
&=-2x+(-5)\\
&=-2x-5
\end{align*}
\end{document}