如何将 .append 添加到某个值,然后使用宏中的 .store 检索它

如何将 .append 添加到某个值,然后使用宏中的 .store 检索它

我正在学习pgfkeys并尝试使用它来处理键值参数。

我正在尝试使用它来设置样式。为此,我定义了一个宏\mystyle来处理它,并使用与这里解决样式的执行问题。现在,如果我想使用 向参数添加更多代码.append,宏不会反映出它的变化。

\documentclass{article}
\usepackage{tikz}

\pgfkeys{
  /test/.cd,
  my style/.store in=\mystyle,
  my style/.default={draw,color=cyan,},
  my style,
  % helpers to get execution on styles
  % https://tex.stackexchange.com/a/85647/7561
  /tikz/.cd,
  execute style/.style = {#1},
  execute macro/.style = {execute style/.expand once=#1},%
}

\newcommand{\makenode}[2][]{
\pgfkeys{/test/.cd,#1}
\begin{tikzpicture}
\node[execute macro=\mystyle]{#2};
\end{tikzpicture}
}


\pagestyle{empty}
\begin{document}

\makenode{testing}
\makenode[my style={draw,color=blue,line width=5pt,}]{testing blue}
% this should be yellow, with thin line
\makenode[my style/.append={color=yellow,line width=1pt}]{testing blue}


\end{document}

根据我对手册的理解,参数应该附加到键的值。因此,如果我在值中有<something>,并且我确实有<key>/.append={<more>},则中的值<key>应该是<something><more>。但事实并非如此。

我错过了什么?

答案1

不确定为什么要同时使用 和=。剩下的都是基于我的猜测。.append=.default=

  • 如果传递[my style=\A]给,则会应用\makenode样式列表。\A
  • 如果您传递[append my style=\B]\makenode,则样式列表\B将与 (您的默认值)一起应用draw,color=cyan
  • 如果您未向 传递任何内容\makenode,则\newcommand会插入其默认值append my style={}。这意味着仅应用 ,而不draw,color=cyan应用任何内容。

\documentclass[tikz,border=10]{standalone}
\pgfkeys{
  /test/.cd,
  my style/.style={
    /test/final style/.style={#1}
  },
  append my style/.style={
    /test/final style/.style={draw,color=cyan,#1}
  }
}
\newcommand{\makenode}[2][append my style={}]{
    \pgfkeys{/test/.cd,#1}
    \begin{tikzpicture}
        \node[/test/final style]{#2};
    \end{tikzpicture}
}
\begin{document}
    \makenode{testing}
    \makenode[my style={}]{testing plain}
    \makenode[my style={fill=blue,line width=5pt}]{testing blue}
    \makenode[append my style={fill=yellow,line width=1pt}]{testing yellow}
\end{document}

因此

  • 对于testing,它以青色绘制,这是您的默认设置;
  • 对于testing plain,所有样式均被重置;
  • 对于testing bluedraw并且color=cyan被覆盖,因此不会发生绘制;
    • (否则它应该更高,因为line width=5pt
  • 对于testing yellow,填充与绘制同时发生。

太长。短吗?

作为默认设置,根本的问题cyan是您希望以下内容做什么?

  • \makenode[blue]{testing}
  • \makenode[]{testing}

这听起来很蠢:第一个节点显示为蓝色,而第二个节点遵循默认颜色...但是等等,什么是默认现在?蓝色还是青色?

答案可能是蓝色,因为写入my style=bluemy style/.style=blue导致 PGF 忘记旧值/旧样式。保持全局的唯一方法是默认my style/.default={cyan},假设my style行动。 一个行动由 声明.code,并且均不.append适用.append style

总之,、、=.append并非.default设计用于协同工作。也许有一种巧妙的方法可以克服它。但迟早你会混淆 PGF……和你自己。

相关内容