我正在学习使用 TikZ 在 LaTeX 中绘制东西。TikZ 似乎到处都使用元组来指定坐标。例如,
\begin{tikzpicture}
\node[isosceles triangle, isosceles triangle apex angle=70,
draw=black,fill=white, inner sep=0pt,anchor=lower
side,rotate=90,draw=black,
fill=white, minimum height=2 cm] (a) at (0,0) {};
\end{tikzpicture}
创建一个小的等腰三角形。注意 的用法(0,0)
。让我们用下面的宏来封装上述的三角形的制作过程。
\newcommand\Tri[3]{
\node[isosceles triangle, isosceles triangle apex angle=70,
draw=black,fill=white, inner sep=0pt,anchor=lower
side,rotate=90,draw=black,
fill=white, minimum height={#2} cm] (#1) at #3 {};}
假设我想定义一个函数,它接受一个大小和起始坐标,并绘制一个三角形的“三角形”,例如
\begin{tikzpicture}
\Tri{a}{1}{(-1,0)}
\Tri{b}{1}{(1,0)}
\Tri{c}{1}{(0,1.41)}
\end{tikzpicture}
简单的方法是制作一个宏\TriTri
,这样就\TriTri{a}{n}{x}{y}
可以创建一个三角形的三角形,底部三角形固定在(x,y)
。
\newcommand\TriTri[4]{
\Tri{#1}{#2}{(#3,#4)}
\Tri{#1}{#2}{(#3+2*#2,#4)}
\Tri{#1}{#2}{(#3+#2,{sqrt(2*#2*#2)})}} %% note #3+#2 = (x1 + x2)/2
%% the sqrt bit is sqrt(size^2 + size^2)
}
我已经让它工作了!但我想做的是,不是单独输入x
和y
,而是将它们作为坐标对输入。我想将坐标引用为\first,\second
。这样\first(x,y) = x
。期望的效果是
$$\first(1,2)$$
相当于
$$1$$
答案1
您可以使用该xparse
包:
\documentclass{article}
\usepackage{tikz,xparse}
\usetikzlibrary{shapes.geometric}
\NewDocumentCommand{\Tri}{m m r()}
{%
\node[isosceles triangle, isosceles triangle apex angle=70,
draw=black,fill=white, inner sep=0pt,anchor=lower
side,rotate=90,draw=black,
fill=white, minimum height=#2cm] (#1) at (#3) {};
}
\NewDocumentCommand\TriTri{mmr(,u)}
{%
\Tri{#1}{#2}(#3,#4)
\Tri{#1}{#2}(#3+2*#2,#4)
\Tri{#1}{#2}(#3+#2,{sqrt(2*#2*#2)}) %% note #3+#2 = (x1 + x2)/2
%% the sqrt bit is sqrt(size^2 + size^2)
}
\begin{document}
\begin{tikzpicture}
\TriTri{a}{3}(2,2)
\end{tikzpicture}
\end{document}
该\Tri
命令接受三个参数;第一个和第二个参数用大括号括起来,第三个参数用圆括号括起来,因此
\Tri{a}{3}(0,0)
在定义主体中,您将使用(#3)
而不是#3
,因为括号已被去掉。
在这种情况下,\TriTri
我们必须分离两个坐标,因此我们定义四个参数;第一个和第二个参数用括号括起来;第三个参数是从到(
逗号的内容,最后一个参数是到的所有内容)
。
\TriTri
因此,我根据的要求对您的代码进行了相应的修改\Tri
。