使用字符串作为坐标失败

使用字符串作为坐标失败

当我使用它\pgfresult来获取 a 中的节点标签时\foreach,我没有遇到任何问题。

但是,我似乎无法正确使用语法来用相同的方法创建坐标。

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}

\begin{document}


\begin{tikzpicture}
        \def\pinlabel{{"SCL","SDA"}}
        \foreach \x in {0,1}{
        \node at (\x,0){\pgfmathparse{\pinlabel[\x]}\pgfmathresult};  %<==== works!

        %\node at (\x,0){\pgfmathparse{\pinlabel[\x]}\pgfmathresult} coordinate ({\pgfmathparse{\pinlabel[\x]}\pgfmathresult});  %<====== doesnt't work

    }
\end{tikzpicture}
\end{document}

注释行失败,显示:不完整\iffalse;第 15 行后的所有文本都被忽略。

我之前曾尝试过进行解析,并且仅使用\pgfmathresult单独功能,但是也失败了。

答案1

这是一个扩展问题。用不精确和通俗的话来说:如果解析器看到结束括号前的所有“垃圾”,它不知道如何处理它。但也没有理由在括号中进行扩展。一种方法,当然不是唯一的,是

\documentclass{article}
\usepackage{tikz}

\begin{document}


\begin{tikzpicture}
        \def\pinlabel{{"SCL","SDA"}}
        \foreach \X in {0,1}{  
        \path   \pgfextra{\pgfmathparse{\pinlabel[\X]}
            \xdef\tmp{\pgfmathresult}}
        node at (\X,0) {\tmp} coordinate (\tmp);  
    }
    \draw[blue] (SCL) -- ++(1,1); %test
\end{tikzpicture}
\end{document}

如果您在构建路径时不一定非要计算 pinlabel,那么您可以简单地使用 预先执行它\pgfmathsetmacro

\documentclass{article}
\usepackage{tikz}

\begin{document}


\begin{tikzpicture}
  \def\pinlabel{{"SCL","SDA"}}
  \foreach \X in {0,1}{  
    \pgfmathsetmacro\tmp{\pinlabel[\X]}
    \node at (\X,0) {\tmp} coordinate (\tmp);  
  }
  \draw[blue] (SCL) -- ++(1,1); %test
\end{tikzpicture}
\end{document}

或者甚至更有效,因为标签在一次循环迭代期间不会改变,直接将其作为语句的一部分进行评估\foreach

\documentclass{article}
\usepackage{tikz}

\begin{document}


\begin{tikzpicture}
  \def\pinlabel{{"SCL","SDA"}}
  \foreach \X [evaluate=\X as \tmp using {\pinlabel[\X]}] in {0,1}{  
    \node at (\X,0) {\tmp} coordinate (\tmp);  
  }
  \draw[blue] (SCL) -- ++(1,1); %test
\end{tikzpicture}
\end{document}

答案2

Ti 中的阵列管理在我看来,Z 非常笨拙。

expl3这是一个不需要杂耍的实现方式\pgfmathparse

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\setarray}{mm}
 {% #1 = array name, #2 = items
  \seq_new:c { l_seidman_array_#1_seq }
  \seq_set_from_clist:cn { l_seidman_array_#1_seq } { #2 }
 }
\NewExpandableDocumentCommand{\getitem}{mm}
 {% #1 = array name, #2 = index
  \seq_item:cn { l_seidman_array_#1_seq } { #2 + 1 }
 }
\ExplSyntaxOff

\setarray{pinlabel}{SCL,SDA} % can also be set locally

\begin{document}

\begin{tikzpicture}
\foreach \x in {0,1}{
  \node at (\x,0) {\getitem{pinlabel}{\x}};
  \node at (\x,1) {\getitem{pinlabel}{\x}}
        coordinate (\getitem{pinlabel}{\x});
}
\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容