макрос только для тикз
У меня есть макрос, \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)
Ответы
Согласно Как я могу проверить, находится ли текущий код внутри 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будет более подходящим.