TikZ 中的图片与宏

TikZ 中的图片与宏

考虑 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}

两者都给出相同的输出

在此处输入图片描述

观察

两者都给出相同的输出。我更喜欢后者,因为它更“TiZ-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

相关内容