通过 pgfkey 传递列表

通过 pgfkey 传递列表

我正在声明一个新形状 [看起来像集成电路]。我想要为这个形状提供的选项之一应该是任意长度的正整数列表 [用于配置有关 IC 端口的某些内容]。例如,创建此形状的节点的调用应如下所示:

\node (X) [TheShape,LeftPorts={2,4,3}] {};

...或者至少这是我所希望的。上面的方法不起作用,因为逗号将被解释为新<key>=<value>对的开头。

我稍后会多次迭代此LeftPorts列表以\foreach执行数学运算(例如求和)和绘图。因此,下一个明显的替代方案是:

\node (X) [TheShape,LeftPorts/.list={2,4,3}] {};

似乎不起作用(?)。因为它将.code在一次运行中处理整个列表;并且没有任何地方让我设置循环的初始条件。(例如将总和计数器重置为 0)

问题是:如何通过 pgfkeys 传递这样的整数列表,以便以后可以\foreach自由多次处理。


给出一些代码来处理并展示另一种尝试\noexpand

\documentclass{article}
\usepackage{tikz}

\tikzset{
    Total/.initial=2,
    List/.initial=2,
    LeftPorts/.initial=2,
    LeftPorts/.code={
        \tikzset{List=#1}
        % calculate total
        \foreach \x in #1 { % <- not working.
            \tikzset{Total=\x}
        }
    },
}

\newcommand{\listVals}{
    \begin{itemize}
        \item LeftPorts: \pgfkeysvalueof{/tikz/LeftPorts}
        \item List: \pgfkeysvalueof{/tikz/List}
        \item Total: \pgfkeysvalueof{/tikz/Total}
    \end{itemize}
}

\begin{document}
    \tikzset{LeftPorts=\noexpand{4,5,6}}
    \listVals
\end{document}

预期结果:

  • 左端口:2
  • 列表:4,5,6
  • 总计:6

实际结果:

  • 左端口:2
  • 列表:4,5,6
  • 总计:2

注意:如果您能演示如何使用它\foreach来计算总和或乘积,我们将不胜感激。

答案1

编辑:带有一些分解的新版本......

您的初始语法很好。别忘了:aforeach是一个组,因此宏的新定义是该组的本地定义。

也许下面的例子可以帮助到你(诀窍是\xdef\macro{\macro}):

\documentclass{article}
\usepackage{tikz}
\tikzset{
    List/.initial={2},
    UseList/.code n args={3}{% macro, init, operator
      \edef\mylist{\pgfkeysvalueof{/tikz/List}}
      \gdef#1{#2} % set initial value
      \foreach \x in \mylist {
        \pgfmathtruncatemacro#1{#1#3\x}
        \xdef#1{#1} % global definition
      }
    },
    Sum/.style={UseList={#1}{0}{+}},
    Product/.style={UseList={#1}{1}{*}},
}
\newcommand\showList{List: \pgfkeysvalueof{/tikz/List}}
\begin{document}
% default list
\showList\par
\typeout{a}
\tikzset{Sum=\sum,Product=\product}
Sum: \sum{}  Product: \product{}\par
% set a new list
\tikzset{List={1,2,4}}
\showList\par
\tikzset{Sum=\sum,Product=\product}
Sum: \sum{}  Product: \product{}\par
% append new values
\tikzset{List/.append={,3,5}}
\showList\par
\tikzset{Sum=\sum,Product=\product}
Sum: \sum{}  Product: \product{}\par
\end{document}

其结果:

列表:2
总计:2 乘积:2
列表:1,2,4
总计:7 乘积:8
列表:1,2,4,3,5
总计:15 乘积:120

相关内容