考虑 Ti 中的这段代码钾Z - PGF 手册,使用宏
% Main code from
% The TikZ - PGF manual
% Author: Till Tantau et al
% Version 3.1.3, released May 9, 2019
% Page 40
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
\def\rectanglepath{-- ++(1cm,0cm) -- ++(0cm,1cm) -- ++(-1cm,0cm) -- cycle}
\draw (0,0) \rectanglepath;
\draw (1.5,0) \rectanglepath;
\end{tikzpicture}
\end{document}
这是我写的,它使用了pic
\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
[rectanglepath/.pic={\draw (0,0)--++(1cm,0cm)--++(0cm,1cm)--++(-1cm,0cm)--cycle;}]
\pic at (0,0) {rectanglepath};
\pic at (1.5,0) {rectanglepath};
\end{tikzpicture}
\end{document}
两者都给出相同的输出
观察
两者都给出相同的输出。我更喜欢后者,因为它更“Ti钾Z-ish”。但是,我们总是可以将代码从更改pic
为宏,反之亦然,如上所述(我错了吗?是否存在我们无法转换的情况?),或者使用两个不同的代码绘制相同的图形(这和这例如)。
另外,我看不出宏在任何方面比 更好pic
。偶数参数:我们还可以pic
使用 以任意模式拥有最多 9 个参数/.style args
。
在 PGF 手册中,我有时会看到pic
使用,但有时会使用宏(甚至在标题页中也使用!)。从这些示例中,我无法弄清楚在什么情况下应该使用宏,在什么情况下应该使用pic
。
问题
现在可能已经很清楚了。
如果我必须在 Ti 中多次绘制相同的“子”图钾Z 图片,我应该使用
pic
还是宏?为什么?是否有我必须使用这个而不使用另一个?
提前致谢。
编辑
至于@marmot 的好代码,我已经自己编写了一些使用宏的代码(针对它)
\documentclass{article}
\usepackage{tikz}
\begin{document}
\subsection*{Macros can have more complicated constructions}
\begin{tikzpicture}%[rectanglepath/.pic={\draw (-0.5,-0.5) rectangle ++(1,1);
%\draw[red] (-0.5,0.5) -- (0.5,-0.5);}]
\newcommand\rectanglepath[2][]{\scope[shift={(#2)},#1]\draw (-0.5,-0.5) rectangle ++(1,1);
\draw[red] (-0.5,0.5) -- (0.5,-0.5);\endscope}
%\path (0,0) pic{rectanglepath} (2,0) pic[dashed]{rectanglepath};
\rectanglepath{0,0}
\rectanglepath[dashed]{2,0}
\end{tikzpicture}
\subsection*{Macros can have names}
\begin{tikzpicture}%[rectanglepath/.pic={\draw (-0.5,-0.5) rectangle ++(1,1);
%\draw[red] (-0.5,0.5) coordinate(-tl) -- (0.5,-0.5) coordinate(-br) ;}]
\newcommand\rectanglepath[3][]{\scope[shift={(#2)},#1]\draw (-0.5,-0.5) rectangle ++(1,1);
\draw[red] (-0.5,0.5) coordinate (#3-tl)
-- (0.5,-0.5) coordinate (#3-br);\endscope}
%\path (0,0) pic (A) {rectanglepath} (2,0) pic[dashed] (B) {rectanglepath};
\rectanglepath{0,0}{A}
\rectanglepath[dashed]{2,0}{B}
\draw (A-tl) to[out=30,in=150] (B-tl) (A-br) to[out=-30,in=-150] (B-br);
\end{tikzpicture}
\subsection*{Transformations are much more intuitive on macros}
\begin{tikzpicture}[rectanglepath/.pic={\draw (-0.5,-0.5) rectangle ++(1,1);}]
\newcommand\rectanglepath[2][]
{\scope[shift={(#2)},#1]\draw (-0.5,-0.5) rectangle ++(1,1);\endscope}
%\path (0,0) pic[rotate=45]{rectanglepath} (2,0) pic[dashed,rotate=-30]{rectanglepath}
%(4,0) pic[thick,xscale=0.5]{rectanglepath};
\rectanglepath[rotate=45]{0,0}
\rectanglepath[rotate=-30,dashed]{2,0}
\rectanglepath[thick,xscale=0.5]{4,0}
\end{tikzpicture}
\end{document}
答案1
以下三四个例子说明,在宏观方法中,实现这些事情要困难得多。前三个例子在修订后的问题中已转化为宏。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\subsection*{Pics can have more complicated constructions}
\tikzset{rectanglepath/.pic={\draw (-0.5,-0.5) rectangle ++(1,1);
\draw[red] (-0.5,0.5) coordinate(-tl) -- (0.5,-0.5) coordinate(-br) ;}}
\begin{tikzpicture}
\path (0,0) pic{rectanglepath} (2,0) pic[dashed]{rectanglepath};
\end{tikzpicture}
\subsection*{Pics can have names}
\begin{tikzpicture}
\path (0,0) pic (A) {rectanglepath} (2,0) pic[dashed] (B) {rectanglepath};
\draw (A-tl) to[out=30,in=150] (B-tl) (A-br) to[out=-30,in=-150] (B-br);
\end{tikzpicture}
\subsection*{Transformations are much more intuitive on pics}
\begin{tikzpicture}
\path (0,0) pic[rotate=45]{rectanglepath} (2,0) pic[dashed,rotate=-30]{rectanglepath}
(4,0) pic[thick,xscale=0.5]{rectanglepath};
\end{tikzpicture}
\subsection*{You can insert pics in paths}
\begin{tikzpicture}[xboard/.style={insert path={
(0,0) grid (#1,#1)
foreach \X in {1,...,#1}
{(\X-0.5,\X-0.5) pic{rectanglepath} (\X-0.5,#1-\X+0.5) pic[rotate=90]{rectanglepath}}}}]
\draw[xboard=1,xshift=2cm,xboard=3,xshift=4cm,xboard=5];
\end{tikzpicture}
\end{document}
我个人的看法是:pic
至少在上述情况下,s 会获胜。恕我直言,修订后的问题中的翻译宏证实了这一点。
请注意,“幕后”图片在某种程度上是宏。因此,您始终能够使用宏重现图片的结果。但是,工作量会更大。是的,如果您愿意做一些不必要的额外工作,您可以使用宏代替图片。所以,是的,选择取决于当天的心情。
我还要强调的是,有些情况下图片的效果会更差。这种情况的一个例子可能是生命之轮。
顺便说一句,在我看来,有时还有一个比sinsert path
更可取的选项。pic