我想改进我的 tikz 节点处理。我经常使用这个:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\draw [thick,-latex] (1,0)+(0,-1.5mm)--+(0,1.5mm)+(0,0)--+(5mm,0) node[below]{$y_1$};
\draw [thick,-latex] (0,0)+(-1.5mm,0)--+(1.5mm,0)+(0,0)--+(0,5mm) node[right]{$y_1$};
\end{tikzpicture}
\end{document}
结果
我不想每次都完整地绘制这个箭头,而是定义一个 tikz 节点并按如下方式使用它:
\node[coordinate_arrow] at (1,0){$y_1$};
% rotated arrow with non rotated label
\node[coordinate_arrow, rotate=90] at (0,0){$y_1$};
我的第一个方法是:
\tikzset{
coordinate_arrow/.style={
execute at begin node={
\begin{tikzpicture}
\draw[thick] (0,-1.5mm)--(0,1.5mm);
\draw[thick, -latex] (0,0)--(5mm,0);
\end{tikzpicture}
},
}
}
但这里对齐不适合(必须是交叉点或箭头根)并且标签不在同一个位置。
怎样做才正确?
按照你的建议,我使用以下方法实现tikzset
\tikzset{
pics/coordinate_arrow/.style = {
code={
\pgfgettransformentries{\tmpa}{\tmpb}{\tmpc}{\tmpd}{\tmp}{\tmp}%
\pgfmathsetmacro{\myrot}{atan2(\tmpd,\tmpc)}
\draw[thick, -latex] (0,-1.5mm)--(0,1.5mm)
(0,0)--(5mm,0)node[anchor=\myrot]{#1};
}
}
}
现在可以这样使用它:
\begin{tikzpicture}
\draw (0,0) pic[rotate=90]{coordinate_arrow={$y_1$}};
\draw (0,1) pic[rotate=45]{coordinate_arrow={$y_2$}};
\draw (1,1) pic[rotate=270]{coordinate_arrow={$y_3$}};
\draw (1,0) pic{coordinate_arrow={$y_4$}};
\end{tikzpicture}
非常感谢!
答案1
我建议不要使用您的方法,因为它会嵌套tikzpicture
环境。相反,请使用pic
。
\documentclass[tikz,border=3mm]{standalone}
\begin{document}
\begin{tikzpicture}[pics/marrow/.style={code={
\pgfgettransformentries{\tmpa}{\tmpb}{\tmpc}{\tmpd}{\tmp}{\tmp}%
\pgfmathsetmacro{\myrot}{atan2(\tmpd,\tmpc)}
\draw[thick, -latex] (0,-1.5mm)--(0,1.5mm)
(0,0)--(5mm,0)node[anchor=\myrot]{#1};}}]
%
\path (0,0) pic[rotate=90]{marrow={$y_1$}} (1,0) pic{marrow={$y_1$}};
\end{tikzpicture}
\end{document}