我想将两个值作为单个有序对传递给 pic 代码。这两个值与坐标系没有任何关系,因此无论单位向量方向如何,我都希望获得相同的值。我读到的命令tikz@scan@one@point
几乎就是我要搜索的,但它返回两个依赖于坐标系的维度。请参见以下示例:
\documentclass{standalone}
\usepackage{tikz}
\makeatletter
\tikzset{
options/.code={
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\pgfmathsetmacro{\valA}{\the\pgf@x/1cm}%
\pgfmathsetmacro{\valB}{\the\pgf@y/1cm}%
},
test/.pic={
\node {(\valA,\valB)};
\draw circle (1);
}
}
\makeatother
\begin{document}
\tikz\pic [options={(2,3)}] {test};
\tikz\pic [x=2cm, options={(2,3)}] {test};
\end{document}
我可以将这些值除以两个单位向量长度,但我宁愿避免任何舍入错误。因此,我想通过命令暂时将坐标系替换为默认坐标系\tikzset{x=1cm, y=1cm}
,但我无法在本地执行此操作,因为新单位也会传递给图片中的代码。请参见以下示例,其中右侧的圆应为椭圆:
\documentclass{standalone}
\usepackage{tikz}
\makeatletter
\tikzset{
options/.code={
\tikzset{x=1cm, y=1cm}
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\pgfmathsetmacro{\valA}{\the\pgf@x/1cm}%
\pgfmathsetmacro{\valB}{\the\pgf@y/1cm}%
},
test/.pic={
\node {(\valA,\valB)};
\draw circle (1);
}
}
\makeatother
\begin{document}
\tikz\pic [options={(2,3)}] {test};
\tikz\pic [x=2cm, options={(2,3)}] {test};
\end{document}
所以问题是:如何将两个值作为独立于坐标系的有序对传递,从而防止舍入误差和图片变形?
答案1
一个解决方案是使用code args
处理程序:
options/.code args={(#1,#2)}{\def\valA{#1}\def\valB{#2}}
有关更多详细信息,请参阅最新 PGF 版本手册中的第 82.4 节(“密钥处理程序”)以及特别是第 82.4.3 节(“定义密钥代码”)。