从 tikz 图片内部更改全局 tikz 样式

从 tikz 图片内部更改全局 tikz 样式

好的,伙计们。我有一个奇怪的想法,想向你们确认一下是否有办法实现。我无法从 pgfmanual 中获得任何见解,也找不到类似的问题。

我想使用 tikz 图片来创建动态 tikz 图片。它可以用作“保存框”,但可以“实时”计算,如果我可以这样说的话。让我给你展示我的代码:

\documentclass{standalone}

\usepackage{tikz}

\tikzset{
    pics/meta/.style 2 args={
        code={
            \tikzset{
                #1/.pic={
                    \node[fill=#2]{};
                }
            }
            \pic{#1};
        }
    }
}

\begin{document}
\begin{tikzpicture}
    \pic[]at(0,0){meta={r}{red}};
    \pic[]at(1,0){meta={g}{green}};

    \pic[]at(2,0){r};
    \pic[]at(3,0){g};
\end{tikzpicture}
\end{document}

此代码“几乎”可以正常工作。元数据内部的图片绘制正确,但外部图片却出现错误,例如“我不知道密钥 /tikz/pic/r”。

我认为这是一个范围问题,因为“r”键在离开“meta”定义后会消失。因此我的问题是:有没有办法从本地组内部向全局范围添加键?对于常规 LaTeX,我们有像 和 这样的\gdef\xdef

编辑:

通过使用常规宏而不是 tikz 图片来创建动态样式,可以很容易地解决这个问题。无论如何,让我们将其视为一个挑战(如果是的话)。

答案1

是的,可以。@percusse 的回答您可以使 pgf 密钥全球化。

\documentclass{standalone}

\usepackage{tikz}

\tikzset{
    pics/meta/.style 2 args={
        code={\begingroup\globaldefs=1\relax
            \tikzset{
                #1/.pic={
                    \node[fill=#2]{};
                }
            }
            \endgroup
            \pic{#1};
        }
    }
}

\begin{document}
\begin{tikzpicture}
    \pic[]at(0,0){meta={r}{red}};
    \pic[]at(1,0){meta={g}{green}};

    \pic[]at(2,0){r};
    \pic[]at(3,0){g};
\end{tikzpicture}
\end{document}

相关内容