макрос только для тикз

Oct 07 2020

У меня есть макрос, \newcommandкоторый содержит полностью новую среду tikz.

Как можно сделать из этого макрос, который содержит только содержимое tikz-окружения, чтобы, если кто-то хочет иметь этот рисунок несколько раз, он рисовался бы в одном-единственном tikz-окружении?

Я знаю, что могу просто удалить объявление tikz-environment в моем макросе, но это позволит мне использовать макрос и вне tikz-environment.

Примеры:

У меня есть макрос, похожий на следующий:

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

Теперь я мог использовать макрос несколько раз друг за другом вот так:

\myTikzMacro \\
\myTikzMacro \\

Но тогда будет использоваться несколько тикз-сред. Чтобы этого избежать, я мог бы сделать этот макрос:

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

И используйте его следующим образом:

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

Но это позволило бы мне использовать макрос и вне tikzpictureсреды, чего я бы тоже хотел избежать.

Есть ли способ объявить макросы доступными / видимыми только в средах tikzpicture? (возможно, с помощью pgfkeys)

Ответы

1 campa Oct 07 2020 at 21:23

Согласно Как я могу проверить, находится ли текущий код внутри tikzpicture? tikzпредоставляет макрос

\tikzifinpicture{true branch}{false branch}

для проверки, находится ли человек в a tikzpicture; Однако комментарии в его определении, кажется, вызывают некоторые сомнения в его правильности. (Я считаю, что он может не работать во вложенных изображениях.) Предполагая, что это работает в большинстве простых случаев, вы можете определить

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

Я здесь использовал \GenericError. Если команда войдет в специальный пакет, использование \PackageErrorбудет более подходящим.