
我想創建一些具有參數化形狀的節點來創建一些示意性車輛,如下圖所示。該圖顯示了車輛底盤平台的分層表示。綠色元素應沿 x 軸縮放,以代表不同尺寸的汽車。藍色形狀(輪胎除外)不是問題的一部分,我將使用一些 x,y 數據繪製它們。
圖片是在 power point 中繪製的,但我很欣賞我的 Latex 文件的 tikz 解決方案。我的第一次嘗試是:
\documentclass[x11names]{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\begin{document}
% =================================================
% Start the picture
\begin{tikzpicture}
\tikzstyle{architecture}=[decoration={markings,
mark connection node=dmp,
mark=at position 0 with
{
\filldraw[color=red!25,draw=black] (-0.5,-0.45) -- (-0.5,-0.3) arc(-90:90:0.2) -- (-0.5,0.45) -- (-0.2,0.45) -- (0,0.75) -- (0.2,0.45) -- (0.5,0.45) -- (0.5,0.1) arc(90:270:0.2) -- (0.5,-0.45) -- cycle;
\node (dmp) {#1};
}
}, decorate]
\tikzstyle{segmentl}=[decoration={markings,
mark connection node=dmp,
mark=at position 0 with
{
\filldraw[color=green!25,draw=black] (-0.4,-0.4) -- (-0.4,-0.2) -- (-0.6,-0.2)-- (-0.6,0.2) -- (-0.4,0.2) -- (-0.4,0.4) -- (0.4,0.4) -- (0.4,0.2) arc(90:-90:0.2) -- (0.4,-0.4) -- cycle;
\node (dmp) {#1};
}
}, decorate]
\tikzstyle{segmentr}=[decoration={markings,
mark connection node=dmp,
mark=at position 0 with
{
\filldraw[color=green!25,draw=black] (-0.4,-0.4) -- (-0.4,-0.2) arc(270:90:0.2) -- (-0.4,0.4) -- (0.4,0.4) -- (0.4,0.2) -- (0.6,0.2)-- (0.6,-0.2) -- (0.4,-0.2) -- (0.4,-0.4) -- cycle;
\node (dmp) {#1};
}
}, decorate]
\tikzstyle{tire}=[decoration={markings,
mark connection node=dmp,
mark=at position 0 with
{
\filldraw[color=blue!25,draw=black,rounded corners=3pt] (0.2,-0.2) -- (0.2,-0.6) -- (-0.2,-0.6) -- (-0.2,0.6) -- (0.2,0.6) -- (0.2,0.2) -- cycle;
\node (dmp) {};
}
}, decorate]
\draw (0,0) node[architecture=$A$] {};
\draw (-1.5,-0.1) node[tire] {};
\draw (1.5,-0.1) node[tire] {};
\draw (0.9,-0.1) node[segmentr=$S1$] {};
\draw (-0.9,-0.1) node[segmentl=$S1$] {};
\end{tikzpicture}
% =================================================
\end{document}
但我的做法不夠彈性。我認為使用裝飾標記是錯誤的做法。我知道可以聲明新形狀(請參閱手冊中的 101.5 聲明新形狀),但我不明白。有人有主意嗎?
答案1
pic
節點不像節點那麼靈活,但它們更容易設計,特別是對於複雜的形狀。例如,我pic
為貓、外星人、大鍋和電車創建了 s。我不想創建一個 cat 節點 - catcodes 已經夠糟糕了!
這是您的樣式到 s 的簡單轉換pic
。這個範例示範了您可以使用它們執行的一些操作。您需要根據您的具體需求進行進一步實驗,以確定pic
s 是否足以滿足您的需求。
\documentclass[tikz,border=10pt,multi,x11names]{standalone}
% original MWE from Runkelhuhn's question at http://tex.stackexchange.com/q/313899/
\usetikzlibrary{fit,positioning}
\begin{document}
\tikzset{% \tikzstyle is deprecated
architecture/.pic={%
\tikzset{architect/architecture/.cd, #1, /tikz/.cd}%
\begin{scope}[local bounding box/.expanded=\archname]
\begin{scope}[inner sep=0pt, outer sep=0pt, x=\archsize, y=\archsize, pic actions]
\filldraw [fill=architecturefill] node (-dmp) [inner sep=0pt, outer sep=0pt] {\tikzpictext} (-5,-4.5) -- (-5,-3) arc(-90:90:2) -- (-5,4.5) -- (-2,4.5) -- (0,7.5) -- (2,4.5) -- (5,4.5) -- (5,1) arc(90:270:2) -- (5,-4.5) -- cycle;
\end{scope}
\end{scope}
},
segment/.pic={
\tikzset{architect/segment/.cd, #1, /tikz/.cd}%
\begin{scope}[local bounding box/.expanded=\archname]
\begin{scope}[inner sep=0pt, outer sep=0pt, x=\archsize, y=\archsize, pic actions]
\filldraw [fill=segmentfill] node (-dmp) [inner sep=0pt, outer sep=0pt] {\tikzpictext} (-4,-4) -- (-4,-2) -- (-6,-2)-- (-6,2) -- (-4,2) -- (-4,4) -- (4,4) -- (4,2) arc(90:-90:2) -- (4,-4) -- cycle;
\end{scope}
\end{scope}
},
tire/.pic={
\tikzset{architect/tire/.cd, #1, /tikz/.cd}%
\begin{scope}[local bounding box/.expanded=\archname]
\begin{scope}[inner sep=0pt, outer sep=0pt, x=\archsize, y=\archsize, pic actions]
\filldraw [fill=tirefill, rounded corners=3pt] node (-dmp) [inner sep=0pt, outer sep=0pt] {\tikzpictext} (2,-2) -- (2,-6) -- (-2,-6) -- (-2,6) -- (2,6) -- (2,2) -- cycle;
\end{scope}
\end{scope}
},
architect/.search also={/tikz},
architect/.cd,
size/.store in=\archsize,
name/.store in=\archname,
architecture fill/.code={\colorlet{architecturefill}{#1}},
segment fill/.code={\colorlet{segmentfill}{#1}},
tire fill/.code={\colorlet{tirefill}{#1}},
architecture/.search also={/tikz/architect,/tikz},
architecture/.cd,
fill/.forward to={/tikz/architect/architecture fill},
/tikz/architect/.cd,
segment/.search also={/tikz/architect,/tikz},
segment/.cd,
fill/.forward to={/tikz/architect/segment fill},
/tikz/architect/.cd,
tire/.search also={/tikz/architect,/tikz},
tire/.cd,
fill/.forward to={/tikz/architect/tire fill},
/tikz/architect/.cd,
size=1mm,
name=,
architecture fill=red!25,
segment fill=green!25,
tire fill=blue!25,
draw=black,
}
\begin{tikzpicture}
\pic [pic text=$A$] {architecture={name=a}} ;
\pic at (-1.5,-.1) {tire={name=t1}};
\pic at (1.5,-.1) {tire={name=t2}};
\pic [pic text=$S1$, xscale=-1] at (0.9,-0.1) {segment={name=sr}};
\pic [pic text=$S1$] at (-0.9,-0.1) {segment={name=sl}};
\path (a) ++(0,-20mm) pic [pic text=$B$] {architecture={name=b,fill=cyan!75!blue}} ;
\path (a) ++(0,-21mm) coordinate (p);
\path (p -| t1) pic [rotate=2.5] {tire={fill=magenta, name=t3}};
\pic [rotate=-2.5] at (p -| t2) {tire={fill=orange, name=t4}};
\pic at (sr |- p) [pic text=$S2$, xscale=-1] {segment={fill=green!50!cyan} } ;
\pic at (sl |- p) [pic text=$S2$] {segment={fill=yellow} } ;
\node (w) [below=of b.south] {Dodgy Wheels};
\draw [->] (w) edge (t3.south east) -- (t4.south west);
\end{tikzpicture}
\end{document}