makro tylko dla tikz

Oct 07 2020

Mam napisane jako makro, \newcommandktóre zawiera kompletne nowe środowisko tikz.

Jak można zrobić z tego makro, które zawiera tylko zawartość środowiska tikz, tak że jeśli chce się mieć ten rysunek wiele razy, jest on rysowany w jednym środowisku tikz?

Wiem, że mógłbym po prostu usunąć deklarację środowiska tikz w moim makrze, ale pozwoliłoby mi to używać makra również poza środowiskiem tikz.

Przykłady:

Mam makro podobne do następującego:

\newcommand{\myTikzMacro}{
  \begin{tikzpicture}
    \draw (0,0) rectangle (1,1);
    \draw (1,1) rectangle (2,0);
  \end{tikzpicture}

Teraz mógłbym używać makra wiele razy po sobie w ten sposób:

\myTikzMacro \\
\myTikzMacro \\

Ale wtedy zostanie użytych wiele środowisk tikz. Aby tego uniknąć, byłbym w stanie zrobić to makro:

\newcommand{\myTikzMacro2}{
    \draw (0,0) rectangle (1,1);
    \draw (1,1) rectangle (2,0);

I użyj go w następujący sposób:

\begin{tikzpicture}
  \myTikzMacro2
  \myTikzMacro2
\end{tikzpicture}

Ale to pozwoliłoby mi używać makra również poza tikzpictureśrodowiskiem, którego też chciałbym uniknąć.

Czy istnieje sposób na zadeklarowanie makr dostępnych / widocznych tylko w środowiskach tikzpicture? (może z pgfkeys)

Odpowiedzi

1 campa Oct 07 2020 at 21:23

Zgodnie z Jak mogę sprawdzić, czy bieżący kod znajduje się wewnątrz tikzpicture? tikzudostępnia makro

\tikzifinpicture{true branch}{false branch}

do sprawdzania, czy ktoś jest w tikzpicture; komentarze w jej definicji wydają się jednak budzić wątpliwości co do jej poprawności. (Myślę, że może się nie udać w zagnieżdżonych obrazach.) Zakładając, że działa w większości prostych przypadków, które można zdefiniować

\newcommand*{\myTikzPicture}
{\tikzifinpicture
    {%
     \draw (0,0) rectangle (1,1);
     \draw (1,1) rectangle (2,0);
    }%
    {%
     \GenericError{}{Unallowed command}
             {\string\myTikzPicture\space can be used only inside a tikz picture.}{}%
    }%
}

Użyłem tutaj \GenericError. Jeśli polecenie trafi do pakietu niestandardowego, użycie \PackageErrorbędzie bardziej odpowiednie.