我想使用 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}