我希望下面的代码能画出一条红线,但是它没有。
\tikzset{
ls/.store in = \ls,ls={draw,red},
myline/.pic = {\path[\ls] (0,0)--(1,0);}
}
\begin{tikzpicture}
\pic (0) at (0,0) {myline};
\end{tikzpicture}
但是,如果我将默认值从“{draw,red}”更改为仅“draw”,它确实会绘制一条(黑色)线。有人能告诉我为什么我不能设置更复杂的默认值吗?或者,使用关键字将参数传递给 tikzpicture 的适当方法是什么?
答案1
虽然将样式存储在这样的宏中不一定是最佳做法,但您可以使用键使其发挥作用style/.expanded
。
\documentclass[tikz]{standalone}
\tikzset{
ls/.store in = \ls,ls={draw,red},
myline/.pic = {\path[style/.expanded=\ls] (0,0)--(1,0);}
}
\begin{document}
\begin{tikzpicture}
\pic (0) at (0,0) {myline};
\end{tikzpicture}
\end{document}
可以说它更钾Zy 马上使用一种风格。
\documentclass[tikz]{standalone}
\tikzset{
ls/.style={draw,red},
myline/.pic = {\path[ls] (0,0)--(1,0);}
}
\begin{document}
\begin{tikzpicture}
\pic (0) at (0,0) {myline};
\end{tikzpicture}
\end{document}
当然你也可以直接pic actions
在这里使用。
\documentclass[tikz]{standalone}
\tikzset{
myline/.pic = {\path[pic actions] (0,0)--(1,0);}
}
\begin{document}
\begin{tikzpicture}
\pic[draw=red] (0) at (0,0) {myline};
\end{tikzpicture}
\end{document}
所有代码都给出相同的输出:
至于评论中的问题:是的。您可以在目录中使用 pgf 键来控制图片的所有方面。假设我们想画一栋房子并控制其屋顶、窗户等的颜色。预期用途是这样的
\pic[draw=red] (my house) at (0,0) {house={roof style={red,thick},
window style={top color=blue!20,bottom color=blue}}};
然后我们创建一个子目录,在其中存储所有内容。根据我的经验,\pgfkeysvalueof{/tikz/house/...}
在 pic 中为本地定义一个快捷方式也是一个好主意。
\documentclass[tikz]{standalone}
\tikzset{pics/house/.style={code={%
% shortcut
\def\pv##1{\pgfkeysvalueof{/tikz/house/##1}}
% get the options
\tikzset{/tikz/house/.cd,#1}
\path[pic actions,house/wall] (-\pv{w}/2,\pv{h}) |-
(\pv{w}/2,0) --(\pv{w}/2,\pv{h});
\path[pic actions,house/roof] (-\pv{w}/2,\pv{h})--(0,\pv{h}+\pv{r})
--(\pv{w}/2,\pv{h});
\path[pic actions,house/window]
(0,\pv{h}/2) rectangle ++ (\pv{w_window},\pv{h_window});
\path[pic actions,house/window]
(\pv{w}/4,\pv{h}/2) rectangle ++ (\pv{w_window},\pv{h_window});
}},
house/.cd,h/.initial=1,% height
r/.initial=0.5,% roof height
w/.initial=2,% width
w_window/.initial=0.2,
h_window/.initial=0.2,
roof style/.code={\tikzset{house/roof/.style={#1}}},
roof/.style={draw,red},
window style/.code={\tikzset{house/window/.style={#1}}},
window/.style={},
wall style/.code={\tikzset{house/wall/.style={#1}}},
wall/.style={thin,draw}%
}
\begin{document}
\begin{tikzpicture}
\pic (my house) at (0,0) {house={roof/.append style={shorten >=-1mm,shorten <=-1mm},
window style={top color=blue!20,bottom color=blue}}};
\pic (not my house) at (3,0) {house={roof style={draw=blue,thick},
window style={fill=cyan}}};
\pic[dashed] (not even close to my house) at (6,0) {house={
window style={xshift=-1mm,left color=yellow,right color=orange,shading angle=45},
h_window=0.4}};
\end{tikzpicture}
\end{document}