考虑以下 MWE:
\documentclass[border=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{
pics/aline/.style={
code= {\draw (0,0) -- (#1,0); }
},
pics/bline/.style={
code= {\draw (0,0,0) -- (#1,0,0); }
}
}
\begin{tikzpicture}
\pic at (0,0) {aline=1};
\pic at (0,1) {aline=1cm};
\pic at (0,2) {aline=1pt};
\pic at (0,-1) {bline=1};
\pic at (0,-2) {bline=1cm};
\pic at (0,-3) {bline=1pt};
\end{tikzpicture}
\end{document}
我希望两个输出看起来相同。但是,对于aline
1 似乎对应于 1cm,而对于 1bline
似乎对应于 1pt:
我猜这是由于解释造成的,但我不太明白发生了什么以及为什么。
答案1
据我所知(手册上似乎没有明确说明),任何用三个逗号分隔元素的坐标X,是, 和是传递给\pgfpointxyz
。每个都转换为点,并且然后使用 x、y 和 z 向量进行转换。
所以1cm
转换为28.46274
和然后使用 x、y 和 z 向量进行变换,如下所示。
\documentclass[tikz, border=5pt]{standalone}
\begin{document}
\begin{tikzpicture}
\draw [blue] (0,0,0) -- (1cm,0,0);
\draw [red] (0,1,0) -- (28.46274, 1,0);
\end{tikzpicture}
\end{document}
我猜这意味着在实践中只有无量纲数字才应该与xyz
坐标系一起使用。
一可以如果有人觉得大胆,可以重新定义\pgfpointxyz
以检查单位是否已给出,然后除以适当的向量。这可能会对其他代码产生意想不到的副作用。
\documentclass[tikz, border=5pt]{standalone}
\makeatletter
\def\pgfpointxyz#1#2#3{%
\pgfmathparse{#1}%
\ifpgfmathunitsdeclared\pgfmathparse{\pgfmathresult/\pgf@xx}\fi%
\let\pgftemp@x=\pgfmathresult%
\pgfmathparse{#2}%
\ifpgfmathunitsdeclared\pgfmathparse{\pgfmathresult/\pgf@yy}\fi%
\let\pgftemp@y=\pgfmathresult%
\pgfmathparse{#3}%
\ifpgfmathunitsdeclared\pgfmathparse{\pgfmathresult/\pgf@zz}\fi%
\let\pgftemp@z=\pgfmathresult%
\pgf@x=\pgftemp@x\pgf@xx%
\advance\pgf@x by \pgftemp@y\pgf@yx%
\advance\pgf@x by \pgftemp@z\pgf@zx%
\pgf@y=\pgftemp@x\pgf@xy%
\advance\pgf@y by \pgftemp@y\pgf@yy%
\advance\pgf@y by \pgftemp@z\pgf@zy}
\begin{document}
\begin{tikzpicture}
\draw [blue] (0,0,0) -- (1cm,0,0);
\draw [red] (0,1,0) -- (28.46274, 1,0);
\end{tikzpicture}
\end{document}