pgfkeys
通过以下活动,我学到了很多关于这个套餐的知识我最后一个问题,我现在正在尝试做一些更冒险的事情。
假设我有一个名为的命令\blob
,其值是以下对的列表:
foo/{left=2,right=23,label=horse},%
bar/{left=25,right=29,label=sheep},%
baz/{left=31,label=zebra}
每对的第一项是一个简单的字符串,而第二项是键值列表。我\foreach
在 上运行一个命令\blob
来依次处理每一对。假设当前对是\x/\xvalue
。我想执行命令
\pgfkeys{/wickerson/.cd,left=0,right=0,label={},\xvalue}
其中left=0
和right=0
是label={}
默认值,可以被 的内容提供的任何值覆盖\xvalue
。我的目的是,例如,第一对将扩展为
\pgfkeys{/wickerson/.cd,left=0,right=0,label={},left=2,right=23,label=horse}
不幸的是,这不起作用。以下是我的输出片段:
x = bar, x值 = 左=25,右=29,标签=羊
!软件包 pgfkeys 错误:我不知道密钥 '/wickerson/left=25,right=29,label=sheep',我将忽略它。也许您拼错了。
请参阅 pgfkeys 包文档以获取解释。
出于某种原因,它被left=2,right=23,label=horse
视为单个键,而我的意思是将其视为三个键。有人能解释一下发生了什么吗?
\documentclass{article}
\usepackage{tikz}
\pgfkeys{/wickerson/.cd,
left/.code={\gdef\wickerson@left{#1}},
right/.code={\gdef\wickerson@right{#1}},
label/.code={\gdef\wickerson@label{#1}}
}
\begin{document}
\newcommand*\blob{%
foo/{left=2,right=23,label=horse},%
bar/{left=25,right=29,label=sheep},%
baz/{left=31,label=zebra}%
}
\foreach \x/\xvalue in \blob {
\typeout{x = \x, xvalue = \xvalue};
\pgfkeys{/wickerson/.cd,left=0,right=0,label={},\xvalue}
}
\end{document}
答案1
感谢 Andrew Stacey 的上述评论,我通过更改三行代码成功修复了代码。结果是:
\documentclass{article}
\usepackage{tikz}
\pgfkeys{/wickerson/.cd,
execute style/.style = {#1}, % line added
execute macro/.style = {execute style/.expand once=#1}, % line added
left/.code={\gdef\wickerson@left{#1}},
right/.code={\gdef\wickerson@right{#1}},
label/.code={\gdef\wickerson@label{#1}}
}
\begin{document}
\newcommand*\blob{%
foo/{left=2,right=23,label=horse},%
bar/{left=25,right=29,label=sheep},%
baz/{left=31,label=zebra}%
}
\foreach \x/\xvalue in \blob {
\typeout{x = \x, xvalue = \xvalue};
\pgfkeys{/wickerson/.cd,left=0,right=0,label={},execute macro=\xvalue} % line modified
}
\end{document}