循环遍历 csv 列表的 pgfkey 键的值的最佳方法是什么?

循环遍历 csv 列表的 pgfkey 键的值的最佳方法是什么?

使用鍵盤,假设我有一个键,其值是一个逗号分隔的列表:

\pgfkeys{/a list/.initial = {1,2,3}}

问题使用\foreach(从前列腺素)?

我发现唯一有效的方法是强制提取和扩展键值,例如:

\edef\alist{\pgfkeysvalueof{/a list}}
\foreach \a in \alist {A = \a\newline}% works!

这可以工作,但不太方便,因为没有必要将键的值提取到临时变量中才能使用它。我最初的想法/希望是

\foreach \a in \pgfkeysvalueof{/a list} {a = \a\newline}

可以工作,但是会出现错误 ( ! Argument of \pgfkeysvalueof has an extra }.)

是否有“官方认可的” pgf 方法用于循环遍历逗号分隔的列表,该列表是 pgf 键的值?当我找到.list处理程序时,我最初很兴奋。它确实.list提供了一种做我想做的事情的方法,但就我而言,我不明白如何使用它!

附加问题给出一个例子来说明.list处理程序的作用。

以下是完整的 MWE:

\documentclass{article}
\usepackage{pgfkeys,pgffor}

\pgfkeys{/a list/.initial = {1,2,3}}

\begin{document}

    \edef\alist{\pgfkeysvalueof{/a list}}
    \foreach \a in \alist {A = \a\newline}% ugly, but works!

    %\foreach \a in \pgfkeysvalueof{/a list} {a = \a}% does not work

\end{document}

答案1

以下是两种解决方案:

\documentclass{article}
\usepackage{pgfkeys}
\usepackage{pgffor}
\pgfkeys{
  /list1/.initial = {1,2,3},
  %
  /list2/.store in=\mylisttwo,
  /list2={1,2,3},
}

\begin{document}

\pgfkeys{body loop/.code={A = #1\par},body loop/.list/.expanded=\pgfkeysvalueof{/list1}}

\pgfkeys{/list1={a,b,c}}
\pgfkeys{body loop/.code={A = #1\par},body loop/.list/.expanded=\pgfkeysvalueof{/list1}}

\foreach \b in \mylisttwo {B = \b\par}
\pgfkeys{/list2={a,b,c}}
\foreach \b in \mylisttwo {B = \b\par}

\end{document}

为了简化使用,我定义了一个通用样式apply to key

\documentclass{article}
\usepackage{pgfkeys}
\usepackage{pgffor}
\pgfkeys{
  apply to key/.style n args={2}{@body loop/.code={#1},@body loop/.list/.expanded=\pgfkeysvalueof{#2}},
  /list1/.initial = {1,2,3},
}
\begin{document}
\pgfkeys{apply to key={AA = #1\par}{/list1}}
\pgfkeys{/list1={a,b,c}}
\pgfkeys{apply to key={AA = #1\par}{/list1}}
\end{document}

答案2

不确定您的应用程序是否允许listofitems替代解决方案。

\documentclass{article}
\usepackage{listofitems}
\begin{document}
\setsepchar{,}

\readlist*\alist{1,2,3}

\foreachitem\a\in\alist{A = \a\newline}
\end{document}

在此处输入图片描述

答案3

下面是一个pgf与我所寻找的类似的 -style 答案,但它将\foreach循环放在 pgfkeys 定义内部,而不是将循环放在密钥结构之外:

\documentclass{article}
\usepackage{pgfkeys,pgffor}

\pgfkeys{/mykeys/.is family,/mykeys}
\newcommand\MyKey[1]{\pgfkeys{/mykeys, #1}}
\MyKey{list/.style={llist/.code={\foreach \a in {#1}{A=\a\newline}}}}
\parindent=0pt

\begin{document}

  \MyKey{list={1,2,3}}
  \MyKey{llist}

  \MyKey{list={a,b,c}}
  \MyKey{llist}

\end{document}

我更喜欢一种解决方案,它允许我循环遍历 pgfkeys 定义之外的键值,并且不需要像llist上面那样的“辅助”键。

相关内容