PSTricks\Rnode
可以轻松地为由 (La)TeX 排版的复杂方程式添加注释:
\Rnodes
只需在方程式的现有元素周围添加,数学排版就会保留。如何在 TikZ 中以同样简单的方式实现这一点?
产生上述示例的 LaTeX 代码:
\documentclass[12pt]{standalone}
\usepackage{pst-node}
\begin{document}
\raisebox{0ex}[4ex][5ex]{
$\rule{0ex}{5ex}
R^{\alpha \beta} -
{1 \over 2}R g^{\alpha \beta} +
g^{\alpha \beta} \Lambda
=
\frac{8 \pi G}{c^4 \mu_0}
\left(
F^{\alpha}{}^{\Rnode{a}{\scriptstyle\psi}} % <---- 1st \Rnode
F_{\Rnode{b}{\scriptstyle\psi}}{}^{\beta} + % <---- 2nd \Rnode
{1 \over 4} g^{\alpha \beta} F_{\psi\tau}
F^{\psi\tau}\right)
\ncbar[linecolor=blue,angle=-90,nodesep=1pt,arm=2ex]{<->}{a}{b}$ }
\end{document}
答案1
实际上,使用 TikZ 来实现相对容易:
将节点放置在
\tikz[baseline, rememeber picture]
\node[anchor=base, inner sep=+0pt, outer sep=+0pt] (<name>) {<text>};
baseline
和的组合anchor=base
放在<text>
已经建立的基线和 上inner sep=+0pt
,确保outer sep=+0pt
节点(和图片)具有与实际包围 的框相同的大小<text>
。
然后你可以在 TikZ 路径中使用这些<name>
s(应该是overlay
ed):
\tikz[remember picture, overlay]
\draw (<name 1>) -- (<name 2>);
如果您经常简单地连接两个节点并且始终定义最后一个节点,那么您可以使用宏让您的生活更轻松\Tnode
,\TnodeC
其中后者类似于第一个,但也会绘制一条到第一个定义的最后一个节点的路径。
如果您不想连接最后两个节点,您可以在边的可选参数后给出坐标/节点名称。
概述:
\Tnode[<optional node options>]{<node name>}{<node math>}
和
\TnodeC[<optional node options>]{<node name>}{<node math>}
[<optional edge options>]{<alternative target node for the edge>}
当然,您也可以使用to path={<anything>}
内部<optional edge options>
来覆盖任何内容(您不需要使用\tikztarget
或\tikzstart
)。
对于不相关的边,您当然可以使用\path
前面描述的分离边。
还有\TnodeC
一个带星号的版本,其中考虑了路径的垂直尺寸。(在您的情况下,这会拉伸,这就是我结合\left( … \right)
使用的原因,但您也可以只使用。)\vphantom
\TnodeC*
\bigl( … \bigr)
还可以实现将节点名称括在(
and中的语法,)
但这会使代码稍微大一些。
对于各种实现方法,\ncbar
请参阅TikZ 是否有与 PSTricks \ncbar 命令等效的命令?。我已经使用了我的paths.ortho
库及其du
路径运算符/样式,但您可以随意用您想要的任何解决方案替换它。(udlr/distance
是在节点的边界和路径的水平(中间)部分之间测量的。)
代码
\documentclass{article}
\usepackage{tikz} \usetikzlibrary{paths.ortho}
\makeatletter
\def\tnode@#1#2#3{%
\node[inner sep=+0pt, outer sep=+0pt, anchor=base, name=#2, #1]{\m@th$#3$};}
\newcommand*{\Tnode}[3][]{%
\tikz[baseline,remember picture]{\tnode@{#1}{#2}{#3}}\xdef\@tnodeclastnode{#2}}
\def\TnodeC{%
\pgfutil@ifnextchar*%
{\let\if@tnodec@overlay\iftrue\expandafter\TnodeC@\pgfutil@gobble}
{\let\if@tnodec@overlay\iffalse\TnodeC@}}
\newcommand*{\TnodeC@}[3][]{%
\pgfutil@ifnextchar[{\TnodeC@opt@{#1}{#2}{#3}}{\TnodeC@opt@{#1}{#2}{#3}[]}}
\def\TnodeC@opt@#1#2#3[#4]{%
\pgfutil@ifnextchar\bgroup{\@@TnodeC{#1}{#2}{#3}{#4}}
{\@@TnodeC{#1}{#2}{#3}{#4}{\@tnodeclastnode}}}
\def\@@TnodeC#1#2#3#4#5{%
\tikz[baseline, remember picture]{
\tnode@{#1}{#2}{#3}%
\path[overlay] (#2) edge[TnodeC edge/.try,#4] coordinate (@tnodec@aux) (#5);
\if@tnodec@overlay
\path (#2 |- @tnodec@aux) -- (#2);
\fi}}
\makeatother
\tikzset{TnodeC edge/.style={
du, udlr/distance=2ex, shorten >=+4\pgflinewidth, shorten <=+4\pgflinewidth}}
\begin{document}
Gummies cheesecake gingerbread. Jelly-o applicake cupcake. Marshmallow gingerbread jelly
beans soufflé gingerbread. Sesame snaps apple pie chocolate bar chocolate gummies
jujubes.
\[\textstyle
R^{\alpha\beta} - \frac{1}{2} R g^{\alpha\beta} + g^{\alpha\beta} \Lambda =
\frac{8 \pi G}{c^4 \mu_0}
\left(
F^{\alpha\Tnode {a}{\scriptstyle\psi}}
F_{ \TnodeC {b}{\scriptstyle\psi}[blue,stealth-stealth]}
{}^{\beta} + \frac{1}{4} g^{\alpha \beta} F_{\psi\tau} F^{\psi\tau}
\right)
\vphantom{
F^{\Tnode {@a}{\scriptstyle\psi}}
F_{\TnodeC*{@b}{\scriptstyle\psi}}
}
\]
Caramels halvah apple pie cookie pastry wafer lollipop croissant jujubes. Tart cupcake
pastry. Gingerbread candy sesame snaps pastry oat cake jelly beans. Soufflé chocolate
gummi bears.
\[
\Tnode {aa}{\psi} \quad\TnodeC*{bb}{\pi} [out=30, in=150, looseness=10, <->]
\]
\end{document}