我的问题可能很愚蠢,但请考虑一下我对 Tikz 还很陌生。
我正在尝试使用以下代码绘制类似于艾菲尔的塔
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{shapes.misc}
\begin{document}
\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\def\towerwd{5} % tower width
\def\towerht{10} % tower height
\def\towerar{4*\towerwd/10} % tower arc radius
\def\tower#1{% #1=position
\draw[thick]
%... tower arc
{#1++(-\towerar,0)}
arc(180:0:\towerar)--
(\towerwd/2,0) to[out=120,in=270]
(0,\towerht) to[out=270,in=60]
(-\towerwd/2,0)--
cycle
;
}
\tower{(0,0)} % this works!
\tower{(0,20)} % this is messy!
\end{tikzpicture}
\end{document}
当我这样做时它工作正常\tower{(0,0)}
,但当我使用任何其他坐标时变得混乱。我在这里做错了什么?
答案1
++
由于没有添加这些坐标,所以会变得混乱,您可能会使用calc
它如果没有(IMHO)更优雅的方式:pic
年代。
s 做什么pic
?顾名思义,pic 是一张像塔一样的小图片。spic
可以放置和变换。我所做的就是将您的\tower
代码移动到 a 的定义中,pic
方法是
\tikzset{pics/.cd,
tower/.style={code={
\draw[thick]
(-\towerar,0)
arc(180:0:\towerar)--
(\towerwd/2,0) to[out=120,in=270]
(0,\towerht) to[out=270,in=60]
(-\towerwd/2,0)--
cycle
;
}}}
这里,.cd
切换到pics
pgfkeystikz
目录的子目录。剩下的只是教 Ti钾Z 塔代码。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\tikzset{pics/.cd,
tower/.style={code={
\draw[thick]
(-\towerar,0)
arc(180:0:\towerar)--
(\towerwd/2,0) to[out=120,in=270]
(0,\towerht) to[out=270,in=60]
(-\towerwd/2,0)--
cycle
;
}}}
\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\def\towerwd{5} % tower width
\def\towerht{10} % tower height
\def\towerar{4*\towerwd/10} % tower arc radius
\path (0,0) pic{tower} (0,20) pic{tower};
\end{tikzpicture}
\end{document}
但这个例子根本不能解释为什么人们对 pics 如此感兴趣。相反,你可能想添加参数,而不是使用有些笨拙的\def\towerwd{5}
等等语句。你可能想从“外部”更改参数。所有这些都可以用pic
s 来完成。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\tikzset{pics/.cd,
tower/.style args={#1 wide and #2 high}{code={
\draw[thick]
(-4*#1/10,0)
arc(180:0:4*#1/10)--
(#1/2,0) to[out=120,in=270]
(0,#2) to[out=270,in=60]
(-#1/2,0)--
cycle
;
}}}
\begin{tikzpicture}[{x=(1mm,0)},{y=(0,1mm)}]
\path (0,0) pic{tower=5 wide and 15 high}
node[below]{Paris} (20,2) pic[rotate=-30,blue]{tower=5 wide and 10 high}
node[below]{Pisa};
\end{tikzpicture}
\end{document}