我想改进这个程序。例如,让箭头更像半圆形,并把单词 base 和 exponent 放下来。有什么建议我可以从这个开始/最小示例开始做这些吗?
\documentclass{article}
\usepackage{amsmath} % loaded automatically by beamer
\usepackage{tikz}
\usetikzlibrary{positioning}
\tikzset{>=stealth}
\newcommand{\tikzmark}[3][]{\tikz[overlay,remember picture,baseline] \node
[anchor=base,#1](#2) {#3};}
\begin{document}
\begin{equation*}
\tikzmark[blue]{base}{$b^{\,\,\tikzmark[red]{exponent}{a}}$}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture,node distance =.2cm]
\node[blue] (basedescr) [below right=of base]{base};
\draw[,->,thick] (basedescr.west) to [in=315,out=225] (base.south);
\node[red] (exponentdescr) [above right=of exponent] {exponent};
\draw[->,thick] (exponentdescr.west) to [in=65,out=135] (exponent.north);
\end{tikzpicture}
\end{document}
答案1
在您的示例中,您正在嵌套 tikzpictures,因为您将 tikzpicture 放在另一个 tikzpicture 的节点中。这通常是不是一个好主意。然后我替换了\tikzmark
,这实际上是包中定义明确的命令tikzmark
,用稍微修改后的版本替换Torbjørn T. 的\tikznode
命令。至于弧线,可以用弧语法轻松绘制,个人比较喜欢弯曲的箭头。
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{positioning,calc,arrows.meta,bending}
\newcommand{\tikznode}[3][]{\relax
\ifmmode%
\tikz[remember picture,baseline=(#2.base),inner sep=0pt]{\node[#1] (#2) {$#3$};}
\else
\tikz[remember picture,baseline=(#2.base),inner sep=0pt]{\node[#1] (#2) {#3};}%
\fi}
\begin{document}
\begin{equation*}
\tikznode[blue]{base}{b}^{\tikznode[red]{exponent}{a}}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture,node distance =.2cm,inner sep=0pt]
\node[blue] (basedescr) [below right=of base]{base};
\draw[-{Stealth[bend]},thick] let \p1=($(basedescr.west)-(base.south)$),
\n1={ifthenelse(\x1>0,atan2(\y1,\x1),atan2(\y1,\x1)-180)},
\n2={veclen(\x1,\y1)/sqrt(2)}
in
(basedescr.west) arc(\n1-45:\n1-135:\n2) ;
\node[red] (exponentdescr) [above right=of exponent] {exponent};
\draw[-{Stealth[bend]},thick] let \p1=($(exponentdescr.west)-(exponent.north)$),
\n1={ifthenelse(\x1>0,atan2(\y1,\x1),atan2(\y1,\x1)-180)},
\n2={veclen(\x1,\y1)/sqrt(2)}
in (exponentdescr.west) arc(\n1+45:\n1+135:\n2);
\end{tikzpicture}
\end{document}
编辑:回答您的问题。
- 你有
\tikzmark[blue]{base}{$b^{\,\,\tikzmark[red]{exponent}{a}}$}
。这扩展为\tikz[...]{\node[...]{...\tikz[...]{\node[...]{...};}};}
,这是一个 Ti钾Ti 里面的 Z 图片钾Z 图,又称嵌套tikzpicture
。 - 如果您使用
below right
键,例如,您可以向其传递两个相隔 的距离and
,例如,将仅向下但向右below right=2pt and 2mm of base
移动该物体。如果您希望节点进一步向上,您可以使用负尺寸,或类似。2pt
2mm
basedescr
right=2mm of base,yshift=-6pt
这是更新后的代码。使用 LoopSpace 的 tikzmark 库,您很有可能会得到更好的答案。它有优于(尽管如此,非常好用)的新命令\tikznode
由 Torbjørn T. 指挥。。
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{positioning,calc,arrows.meta,bending}
\newcommand{\tikznode}[3][]{\relax
\ifmmode%
\tikz[remember picture,baseline=(#2.base),inner sep=0pt]{\node[#1] (#2) {$#3$};}
\else
\tikz[remember picture,baseline=(#2.base),inner sep=0pt]{\node[#1] (#2) {#3};}%
\fi}
\begin{document}
\begin{equation*}
\tikznode[blue]{base}{b}^{\tikznode[red]{exponent}{a}}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture,inner sep=0pt]
\node[blue] (basedescr) [below right=2pt and 2mm of base]{base};
\draw[-{Stealth[bend]},thick] let \p1=($(basedescr.west)-(base.south)$),
\n1={ifthenelse(\x1>0,atan2(\y1,\x1),atan2(\y1,\x1)-180)},
\n2={veclen(\x1,\y1)/sqrt(2)}
in
(basedescr.west) arc(\n1-45:\n1-135:\n2) ;
\node[red] (exponentdescr) [above right=2pt and 2mm of exponent] {exponent};
\draw[-{Stealth[bend]},thick] let \p1=($(exponentdescr.west)-(exponent.north)$),
\n1={ifthenelse(\x1>0,atan2(\y1,\x1),atan2(\y1,\x1)-180)},
\n2={veclen(\x1,\y1)/sqrt(2)}
in (exponentdescr.west) arc(\n1+45:\n1+135:\n2);
\end{tikzpicture}
\end{document}
答案2
我刚刚将 Torbjørn 的一个版本\tikznode
(它本身就是原版的一个版本\tikzmark
)添加到tikzmark
库中。在发送到 CTAN 之前需要进行一些测试,所以我借此机会对其进行了测试。目前,您可以从github有了它,marmot的解决方案就变成了:
\documentclass{article}
%\url{https://tex.stackexchange.com/q/450135/86}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{positioning,calc,arrows.meta,bending,tikzmark}
\begin{document}
\begin{equation*}
\tikzmarknode[blue]{base}{b}^{\tikzmarknode[red]{exponent}{a}}
\end{equation*}
\begin{tikzpicture}[overlay, remember picture,node distance =.2cm,inner sep=0pt]
\node[blue] (basedescr) [below right=.5cm of base]{base};
\draw[-{Stealth[bend]},thick,shorten >=2pt] let \p1=($(basedescr.west)-(base.south)$),
\n1={ifthenelse(\x1>0,atan2(\y1,\x1),atan2(\y1,\x1)-180)},
\n2={veclen(\x1,\y1)/sqrt(2)}
in
(basedescr.west) arc(\n1-45:\n1-135:\n2) ;
\node[red] (exponentdescr) [above right=.5cm of exponent] {exponent};
\draw[-{Stealth[bend]},thick,shorten >=2pt] let \p1=($(exponentdescr.west)-(exponent.north)$),
\n1={ifthenelse(\x1>0,atan2(\y1,\x1),atan2(\y1,\x1)-180)},
\n2={veclen(\x1,\y1)/sqrt(2)}
in (exponentdescr.west) arc(\n1+45:\n1+135:\n2);
\end{tikzpicture}
\end{document}
(我在项目和它们的解释之间添加了一点空间,并且缩短了箭头。)