我创建了一个pgf键系统地

\如果填充%填充3/3\tikzset{FillStyle/.style={fill=lightgray}}%fill=true\其他\tikzset{FillStyle/.style={fill=none}}%填充=false(默认值)\fi(菲涅耳)

在图纸中tikz图片它工作得很好;但如果我说

\pgfkeys值{/tikz/MyCmdSettings/filled}

我总是得到默认值(“false”);我必须做什么才能获得当前值?

在此处输入图像描述

\文档类{article}\使用包{tikz}\newif\ifthefilled%已填充1/3%\tikzset{MyCmdSettings/.cd,%填充2/3==================filled/.is if=thefilled,filled/.initial=false,%默认% ===========================}\newcommand{\MyCmd}[1][]{%%%%\开始{tikzpicture}[nodes={align=left,font=\footnotesize}]\tikzset{MyCmdSettings/.cd,#1}%%\def\pkv#1{\pgfkeysvalue of{/tikz/MyCmdSettings/#1}}%%\如果填充%填充3/3\tikzset{FillStyle/.style={fill=lightgray}}%fill=true\其他\tikzset{FillStyle/.style={fill=none}}%fill=false(默认)\fi(菲涅耳)\绘制[cyan,thick,FillStyle]圆[radius=5mm]节点[以下=7mm,黑色,绘制]{填充:\pkv{filled}};%此处出现问题\结束{tikzpicture}%}%%命令结束时\开始{文档}\我的命令~~\MyCmd[filled=false]~~\MyCmd[已填充]\结束{文档}

€dit:似乎有一个坏片段,但现在应该运行了。

5
  • 1
    @cfr噢。。。也许现在?
    – 顺式
    评论 6月26日13:10
  • 快速一瞥:你的钥匙超载了。这个.是如果安装一个代码\csname填充的#1\endcsname检查后#1要么正确要么错误。但如果解析器发现某个键是代码键,则不会检查该键是否包含值。你可能想这么做filled/.append code=\pgfkeyssevalue{/tikz/MyCmdSettings/filled}{#1}。尽管如此,如果您既不提供也不提供,这将导致不一致真的也不是。也许是一种习惯.是如果处理程序更适合提供一个漂亮的界面。(\如果填为true\else false\fi将为您提供适当的“值”。) 评论 6月26日13:23
  • @Qrrbrbirlbel呃,呸。我是否正确理解了\新(newif)是不利的(除了不正确的“单词输出”)?我很想知道如何更好地或纯粹使用pgfkeys来实现这一点。你能把这个总结成MWE吗?
    – 顺式
    评论 6月26日13:34
  • 1
    所以,是的,你使用了正确的界面来“调用”你的value-key的值,但你的key在某种程度上不再是value-key。这个\新(newif).是如果如果你真的需要一个切换,那么处理程序是齐头并进的,IMO是正确的方法吗。你也可以这么做filled/.是选项,filled/true/.style={FilledStyle/.syle={filled=lightgray}},filled/false/.style={FilldStyle/。style={fill=none}}、filled/。default=true要具有相同的接口,则不需要检查任何\如果不再是。归根结底,这就是为什么你认为你需要\如果填满宏或\pkv{填充}. 评论 6月26日13:41
  • @Qrrbrbirlbel好的,看起来更优雅。。。
    – 顺式
    评论 6月26日14:33

1答案1

重置为默认值
6

PGFKeys键可以是代码键,也可以是用.初始键(设置初始值),其他一切都是一个代码键。(内部存储有/.@cmd公司后缀。)

当您或您的用户使用密钥时,即。填充=真或者只是填满,PGFKeys解析器必须找出键的实际作用及其工作方式。这个过程相当简单:它首先检查它是否是代码键,如果是,则使用给定的值(可能是默认值–其中.是如果设置为真的–或特殊的无值标记)。就这样。

只有当它不是代码键时,PGFKeys才会检查它是否是值键,以及是否存在给定的显式值,并将value-key设置为该值键(否则它只返回键的值)。


你为什么需要\如果填满?如果你只是想设置填充状态:

\文档类{article}\使用包{tikz}\提克兹特{MyCmdSettings/.cd,filled/.是选项,filled/.append code=\pgfkeysseevalue{/tikz/MyCmdSettings/filled}{#1},fill/true/.style={/tikz/FillStyle/.style={fill=浅灰色}},filled/false/.style={/tikz/FillStyle/.style={fill=none}},filled/.default=true,%filledfilled=truefilled=false}%初始化FillStyle和值\新命令{\MyCmd}[1][]{%\开始{tikzpicture}[nodes={align=left,font=\footnotesize},MyCmdSettings/.cd,#1]\绘制[cyan,thick,FillStyle]圆[radius=5mm]节点[下方=7mm,黑色,绘制]{filled:\pgfkeysvalueof{/tikz/MyCmdSettings/filled}};\结束{tikzpicture}}\开始{文档}\MyCmd~~\MyCmd[filled=false]~~\MyCmd[felled]\结束{文档}

您可以更进一步,为用户提供一个界面来更改这两种不同样式的外观(可能其中一种想要另一种颜色,也可能另一种想要图案而不是填充区域):

\文档类{article}\使用包{tikz}\提克兹特{MyCmdSettings/.cd,FillStyle/yes/.style={fill=lightgray},FillStyle/no/.style={fill=none},filled/.是选项,filled/.append code=\pgfkeysseevalue{/tikz/MyCmdSettings/filled}{#1},filled/true/.style={/tikz/FillStyle/.syle={MyCmdSettings/FillStyle/yes}},filled/false/.style={/tikz/FillStyle/.style={MyCmdSettings/FillStyle/no}},filled/.default=true,%filledfilled=truefilled=false}%初始化FillStyle和值\新命令{\MyCmd}[1][]{%\开始{tikzpicture}[节点={align=left,font=\footnotesize},MyCmdSettings/.cd,#1]\绘制[cyan,thick,FillStyle]圆[radius=5mm]节点[以下=7mm,黑色,绘制]{filled:\pgfkeysvalueof{/tikz/MyCmdSettings/filled}};\结束{tikzpicture}}\开始{文档}\我的命令~~\MyCmd[filled=false]~~\MyCmd[filled,FillStyle/yes/.style={fill=red}]\结束{文档}

当然,如果使用填充样式/\ifthefilled yes\else no\fi:

\文档类{article}\使用包{tikz}\newif\if已填充\提克兹特{MyCmdSettings/.cd,FillStyle/yes/.style={fill=lightgray},FillStyle/no/.style={fill=none},filled/.is if=thefilled,filled/.append code=\pgfkeysseevalue{/tikz/MyCmdSettings/filled}{#1},已填充/.initim=false}%初始化值\新命令{\MyCmd}[1][]{%\开始{tikzpicture}[节点={align=left,font=\footnotesize},MyCmdSettings/.cd,#1]\绘制[cyan,thick,MyCmdSettings/FillStyle/\ifthefilled yes\else no\fi]圆[radius=5mm]节点[以下=7mm,黑色,绘制]{filled:\pgfkeysvalue of{/tikz/MyCmdSettings/filled}};\结束{tikzpicture}}

所有解决方案都使用.append代码键上的处理程序填满让它也设置它的值-关键部分。这样,给定的值就会被存储起来,并可以在必要时进行检索。

如果您经常需要这样做,我们可以为这两者创建包含此内容的处理程序.是如果.是选择.

4
  • 好的,我明白了。我找到了“\如果填满“在手册中。我认为它有时会有优势(但不是层次),例如。\ifhecycled--循环\fi-是的,我会在合适的时候考虑。。。谢谢。
    – 顺式
    评论 6月26日15:50
  • 但是:我记得原因是我需要一个其他的职位\ifhefilled--循环\fi.我认为这就是原因\newif\if已填充这里是没有意义的圈子。
    – 顺式
    评论 6月26日16:08
  • @戴维·卡莱尔告诉我,我可以像这样使用钥匙\UseName{if\pgfkeysvalueof{/tikz/SpiroSettings/filled}}\node[draw]{its-filled};\fi(菲涅耳)也是。所以,非常好。再次感谢`
    – 顺式
    评论 6月26日17:49
  • @cis是的,\用户名称只是L3接口,在本例中,\csname if\pgfkeysvalueof{/tikz/MyCmdSettings/filled}\endcsname.如果你这样做,这显然会打破填充=foo但这将首先引发PGFKeys错误,因此应该足够清楚。 评论 2天前

你必须登录回答这个问题。

不是你想要的答案吗?浏览标记的其他问题.