当我使用它\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}