pgfkeys 中的对列表

pgfkeys 中的对列表

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=0right=0label={}默认值,可以被 的内容提供的任何值覆盖\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}

相关内容