/.store in,括号中为默认值

/.store in,括号中为默认值

我希望下面的代码能画出一条红线,但是它没有。

\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}

在此处输入图片描述

相关内容