如何使用 pgfkeys 提交一组 tikz 命令?

如何使用 pgfkeys 提交一组 tikz 命令?

我想使用 pgfkeys 接口将一系列 tikz 键发送到 tikz 路径。我使用以下代码成功了,但是有没有更简单的方法可以做到这一点?我可以用类似的东西做同样的事情吗\draw[\prop] ...?实际上我想避免范围环境。

\documentclass[a4paper]{article}

\usepackage{tikz}

\pgfkeys{
    /test/pgfkeys/.cd,
    nom/.store in = \nom,
    prenom/.store in = \prenom,
    prop/.store in = \prop
    %prop/.code = \tikzset{#1}
}

\newcommand{\qui}[1][]{
    \pgfkeys{/test/pgfkeys/.cd,#1}
    I am \prenom{} \nom{} !

    \begin{tikzpicture}
        \begin{scope}
            \tikzset{\prop}
            \draw (0,0) -- (1,0);
        \end{scope}
    \end{tikzpicture}
}

\begin{document}
\qui[prenom = toto, nom = titi, prop = {very thick, color = red!80, -stealth}]
\end{document}

编辑 :

使用 Andrew Stacey 答案的新代码。此代码现在有效:

\documentclass[a4paper]{article}

\usepackage{tikz}

\pgfkeys{
    /tikz/.cd,
    execute style/.style = {#1},
    execute macro/.style = {execute style/.expand once=#1},
    /test/pgf/.cd,
    nom/.store in = \nom,
    prenom/.store in = \prenom,
    prop/.store in = \prop
}

\newcommand{\qui}[1][]{
    \pgfkeys{/test/pgf/.cd,#1}
    I am \prenom{} \nom{} !

    \begin{tikzpicture}
        \draw[execute macro = \prop] (0,0) -- (1,0);
    \end{tikzpicture}
}

\begin{document}
\qui[prenom = toto, nom = titi, prop = {very thick, color = red!80, -stealth}]
\end{document}

输出如下:

在此处输入图片描述

答案1

我最近在代码中找到了这个问题的答案,但我找不到与之相关的答案(通常我会在代码中保存 URL,但有时会忘记,而且我的搜索也没有找到它)。问题是\prop直到键列表被拆分后才会展开。解决方案是将其重新输入到 pgfkey 机器中,以便它再次经历拆分过程。

\documentclass{article}
%\url{http://tex.stackexchange.com/q/85637/86}
\usepackage{tikz}

\tikzset{
  execute style/.style={#1},
  execute macro/.style={execute style/.expand once=#1},
}

\begin{document}
\begin{tikzpicture}
\foreach \x/\y/\properties in {
  1/0/{color=blue,double=red},
  0/0/,
  0/1/{dotted,green}
} {
  \draw [execute macro=\properties] (\x,\y) -- ++(1,0);
}
\end{tikzpicture}
\end{document}

这实际上与 Jake 的评论具有相同的效果,\expandafter但是更加灵活,因为它可以在键列表的任何位置使用。

以下是使用此方法的问题代码:

\documentclass[a4paper]{article}
%\url{http://tex.stackexchange.com/q/85637/86}
\usepackage{tikz}

\tikzset{
    execute style/.style = {#1},
    execute macro/.style = {execute style/.expand once=#1},
    /test/pgf/.cd,
    nom/.store in = \nom,
    prenom/.store in = \prenom,
    prop/.store in = \prop
}

\newcommand{\qui}[1][]{
    \tikzset{/test/pgf/.cd,#1}
    I am \prenom{} \nom{} !

    \begin{tikzpicture}
        \draw[execute macro=\prop] (0,0) -- (1,0);
    \end{tikzpicture}
}

\begin{document}
\qui[prenom = toto, nom = titi, prop = {very thick, color = red!80,
-stealth}]
\end{document}

(我改为\pgfkeys\tikzset因为\draw假设一切都在/tikz路径中,所以从那里开始似乎更容易。)

重点是,当宏\prop以某种方式使用时,它不是“裸”使用的,而是键的参数execute macro。这是表示“扩展此宏一次,然后将其重新插入流”的键(实际上,execute macro是执行扩展和execute style重新插入)。

答案2

而 Andrew Stacey 回答了有关扩展的问题,我想提供一个实际使用 TikZ 样式的选项!

不需要环境scope

代码

\documentclass[a4paper]{article}

\usepackage{tikz}

\pgfkeys{
    /test/pgfkeys/.cd,
    nom/.store in = \nom,
    prenom/.store in = \prenom,
    prop/.style = {prop style/.estyle={#1}},
}

\newcommand{\qui}[1][]{
    \pgfkeys{/test/pgfkeys/.cd,#1}
    I am \prenom{} \nom{} !

    \begin{tikzpicture}
         \draw[/test/pgfkeys/prop style] (0,0) -- (1,0);
    \end{tikzpicture}
}

\begin{document}
\qui[prenom = toto, nom = titi, prop = {very thick, color = red!80, -stealth}]
\end{document}

答案3

另一个“灵活”的解决方案是使用循环包裹。

\documentclass{article}
\usepackage{tikz}
\usepackage{loops}

\begin{document}
\begin{tikzpicture}
\foreachfox [arg=#1/#2/#3]{
  1/0/{color=blue,double=red},
  0/0/,
  0/1/{dotted,green}
}{
  \draw[#3] (#1,#2) -- ++(1,0);
}
\end{tikzpicture}
\end{document}

相关内容