macro uniquement pour tikz

Oct 07 2020

J'ai une macro écrite \newcommandqui contient un nouvel environnement tikz complet.

Comment peut-on en faire une macro qui ne contient que le contenu de l'environnement tikz, de sorte que si l'on veut avoir ce dessin plusieurs fois, il soit dessiné dans un seul environnement tikz?

Je sais que je pourrais simplement supprimer la déclaration de l'environnement tikz dans ma macro, mais cela me permettrait également d'utiliser la macro en dehors d'un environnement tikz.

Exemples:

J'ai une macro similaire à la suivante:

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

Maintenant, je pourrais utiliser la macro plusieurs fois l'une après l'autre comme ceci:

\myTikzMacro \\
\myTikzMacro \\

Mais alors plusieurs environnements tikz seraient utilisés. Pour éviter cela, je pourrais faire cette macro:

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

Et utilisez-le comme suit:

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

Mais cela me permettrait également d'utiliser la macro en dehors d'un tikzpictureenvironnement que je voudrais éviter aussi.

Existe-t-il un moyen de déclarer les macros uniquement disponibles / visibles dans les environnements tikzpicture? (peut-être avec pgfkeys)

Réponses

1 campa Oct 07 2020 at 21:23

Selon Comment puis-je vérifier si le code actuel est à l'intérieur d'un tikzpicture? tikzfournit la macro

\tikzifinpicture{true branch}{false branch}

pour tester si on est dans un tikzpicture; les commentaires dans sa définition semblent cependant jeter des doutes sur son exactitude. (Je pense que cela pourrait échouer dans les images imbriquées.) En supposant que cela fonctionne dans la plupart des cas simples, vous pouvez définir

\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.}{}%
    }%
}

J'ai utilisé ici \GenericError. Si la commande va dans un package personnalisé, l'utilisation \PackageErrorsera plus appropriée.