使用鍵盤,假设我有一个键,其值是一个逗号分隔的列表:
\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
答案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
上面那样的“辅助”键。