TikZ,将两个值作为有序对传递

TikZ,将两个值作为有序对传递

我想将两个值作为单个有序对传递给 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 节(“定义密钥代码”)。

相关内容