我正在尝试学习 TikZ,对 pstrick 有一些经验。我想在我的图形中添加一些标签,并且习惯了 pstricks 宏的便利性\uput{label separation}[relative angle](point){label}
。例如,\uput{8pt}[100](1,0){$A$}
将标签 $A$ 放在点 (1,0) 处,但在标准 100 度方向上相距 8 点。那么 TiKZ 中是否有类似的东西?特别是我想:
- 指定点和标签之间的距离或间隔,以及
- 准确指定角度,而不是局限于 0、45、90、135、180 等...
这是一个小例子。
\documentclass[12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, fit}
\usetikzlibrary{calc,intersections,through,backgrounds}
\begin{document}
\begin{tikzpicture}[x=0.06\linewidth, y=0.06\linewidth]
\coordinate [label=45:$A$] (A) at (6,6);
\coordinate [label=135:$B$] (B) at (1,4);
\coordinate [label=-45:$D$] (D) at (4,1);
\coordinate [label=-120:$C$] (C) at (0,0);
\draw [line width=0.8pt] (A) -- (B) -- (C) -- (D) -- cycle;
\path [draw, name path=A--C, line width=0.8pt] (A) -- (C);
\path [draw, name path=B--D, line width=0.8pt] (B) -- (D);
\path [name intersections={of=A--C and B--D, by=P}];
%\draw (P) node[anchor=-100]{$P$};
\end{tikzpicture}
\end{document}
我想在名为 P 的点上放置一个标签。我注释掉的那行可以很好地完成这个工作,但我发现这违反直觉,因为我的标签是 anode
而不是 a label
。另外,我该如何调整标签和点之间的间隔?
编辑: 根据下面@cfr的回答,我可以通过插入代码行来实现我需要的
\draw (P) node[shift={(80:12pt)}]{$P$};
因此,总结一下:相当于普斯特里克宏\uput{label separation}[relative angle](point/position){label}
将\draw (point/position) node[shift=(relative angle:label separation)]{label}
在蒂克兹。
答案1
您可能会发现quotes
图书馆很方便。
这是添加标签而不使用引号语法的一种方法。我实际上不会在intersections
这里费心,而只会使用短对角线的中点。
\begin{tikzpicture}[x=0.06\linewidth, y=0.06\linewidth, line width=.8pt]
\coordinate [label=45:$A$] (A) at (6,6);
\coordinate [label=135:$B$] (B) at (1,4);
\coordinate [label=-45:$D$] (D) at (4,1);
\coordinate [label=-120:$C$] (C) at (0,0);
\draw (A) -- (B) -- (C) -- (D) -- cycle (A) -- (C) (B) -- (D) node [midway, above] {$P$};
\end{tikzpicture}
使用该quotes
库使我们能够使用更简洁的语法。 结合操作edge
,我们可以使用以下代码行构造类似的图表。
\draw (0,0) coordinate ["-120:$C'$"] (C') -- +(4,1) coordinate ["-45:$D'$"] (D') -- +(6,6) coordinate ["45:$A'$"] (A') edge (C') -- +(1,4) coordinate ["135:$B'$"] (B') edge ["$P'$" right, pos=.35] (D') -- cycle;
"<specification>"
添加标签(如果是坐标或节点)或节点(如果是边)。"<specification>"'
如果使用放置,则“交换”标签或节点的位置auto
。如果是标签,"<angle>:<text>"
则可用于将标签节点放置在精确的角度。right
等above
在规范中重新定义为引用您可能选择的各种“标准”角度。标准样式可用于设置格式和放置的自定义默认值。
\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{quotes}
\begin{document}
\begin{tikzpicture}[x=0.06\linewidth, y=0.06\linewidth, line width=.8pt]
\coordinate [label=45:$A$] (A) at (6,6);
\coordinate [label=135:$B$] (B) at (1,4);
\coordinate [label=-45:$D$] (D) at (4,1);
\coordinate [label=-120:$C$] (C) at (0,0);
\draw (A) -- (B) -- (C) -- (D) -- cycle (A) -- (C) (B) -- (D) node [midway, above] {$P$};
\begin{scope}[xshift=50mm]
\draw (0,0) coordinate ["-120:$C'$"] (C') -- +(4,1) coordinate ["-45:$D'$"] (D') -- +(6,6) coordinate ["45:$A'$"] (A') edge (C') -- +(1,4) coordinate ["135:$B'$"] (B') edge ["$P'$" right, pos=.35] (D') -- cycle;
\end{scope}
\end{tikzpicture}
\end{document}
编辑
据我了解,当放置标签或图钉等时,Ti钾Z 试图比你想象的更聪明。如果你请求一个非标准角度,它会将anchor
节点的“捕捉”到最近的罗盘点,例如30
,等等90
。110
因此,要强制执行角度,你需要强制执行anchor
。
例如,
... coordinate [label={[anchor=-5]-185:$C$}, label={[anchor=15]-165:$C$}, label={-135:$C$}, label={[anchor=60]-120:$C$}] (C) ...
生产
要放置P
标签,我只需创建一个移位的edge node
。例如,
... edge node [midway, shift=(80:12pt)] {$P$} ...
生产
完整代码:
\documentclass[border=10pt,multi,tikz]{standalone}
\begin{document}
\begin{tikzpicture}[x=0.06\linewidth, y=0.06\linewidth, line width=.8pt]
\draw (0,0) coordinate [label={[anchor=-5]-185:$C$}, label={[anchor=15]-165:$C$}, label={-135:$C$}, label={[anchor=60]-120:$C$}] (C) -- +(4,1) coordinate [label=-45:$D$] (D) -- +(6,6) coordinate [label=45:$A$] (A) edge (C) -- +(1,4) coordinate [label=135:$B$] (B) edge node [midway, shift=(80:12pt)] {$P$} (D) -- cycle;
\end{tikzpicture}
\end{document}
答案2
看看以下 MWE 是否能帮助您:
\documentclass[ tikz,
border=3mm,
12pt]{standalone}
\usetikzlibrary{intersections}
\begin{document}
\begin{tikzpicture}[x=0.06\linewidth, y=0.06\linewidth,
every label/.style = {label distance=3pt, inner sep=1pt},
every path/.style = {draw, line width=0.8pt}
]
\coordinate [label=45:$A$] (A) at (6,6);
\coordinate [label=135:$B$] (B) at (1,4);
\coordinate [label=-45:$D$] (D) at (4,1);
\coordinate [label=-120:$C$] (C) at (0,0);
\path (A) -- (B) -- (C) -- (D) -- cycle;
\path [name path=A--C] (A) -- (C);
\path [name path=B--D] (B) -- (D);
\path [name intersections={of=A--C and B--D,by={[label=above:$P$]P}}];
\end{tikzpicture}
\end{document}