Использование newcommands внутри цикла foreach tikzpicture

Использование newcommands внутри цикла foreach tikzpicture

Я пытаюсь вкладывать команды в свои страницы TikZ, чтобы я мог делать все более сложные вещи с небольшими фрагментами кода на каждом уровне. Код, который у меня есть на данный момент, это

\documentclass{article}
\usepackage{tkz-graph}

\newcommand{\drawSquare}[3]{%
  \draw[thick,#3] (#1-0.5,#2-0.5) rectangle (#1+0.5,#2+0.5);}
\newcommand{\boxesAtHeight}[3]{%
  \foreach \i in {1,...,#1}
    \drawSquare{\i}{#2}{#3}}

\begin{document}

\begin{tikzpicture}
  \boxesAtHeight{4}{0}{black}
  \boxesAtHeight{2}{1}{black}
  \boxesAtHeight{1}{2}{black}
\end{tikzpicture}

\end{document}

Я использую sharelatex, и когда я пытаюсь скомпилировать, я получаю 4 ошибки. На строке после \end{tikzpicture}у меня есть ошибка

Абзац закончился до того, как \pgffor@nextбыл завершён.

В строке \end{document}я получаю три ошибки

Отсутствует \endgroupвставленный текст.

Отсутствует }вставленный текст.

Ошибка LaTeX: \begin{tikzpicture}строка ввода 12 заканчивается на \end{document}.

Когда я заменяю код внутри макроса , tikzpictureрасширяя его \boxesAtHeight, я получаю те же ошибки.

При дальнейшем расширении макроса \drawSquareя получаю следующий вывод

успешный вывод после раскрытия каждого макроса

Для ясности, первое расширение привело к коду

\begin{tikzpicture}
  \foreach \i in {1,...,4}
    \drawSquare{\i}{0}{black}
  \foreach \i in {1,...,2}
    \drawSquare{\i}{1}{black}
  \foreach \i in {1,...,1}
    \drawSquare{\i}{2}{black}
\end{tikzpicture}

И второе расширение привело к коду

\begin{tikzpicture}
  \foreach \i in {1,...,4}
    \draw[thick,black] (\i-0.5,0-0.5) rectangle (\i+0.5,0+0.5);
  \foreach \i in {1,...,2}
    \draw[thick,black] (\i-0.5,1-0.5) rectangle (\i+0.5,1+0.5);
  \foreach \i in {1,...,1}
    \draw[thick,black] (\i-0.5,2-0.5) rectangle (\i+0.5,2+0.5);
\end{tikzpicture}

Кто-нибудь может мне объяснить, почему у меня возникают ошибки? Я знаю, что \drawSquareмакрос работает вне циклов.

решение1

Вам необходимо сгруппировать тело цикла for:

\documentclass{article}
\usepackage{tkz-graph}

\newcommand{\drawSquare}[3]{%
  \draw[thick,#3] (#1-0.5,#2-0.5) rectangle (#1+0.5,#2+0.5);}
\newcommand{\boxesAtHeight}[3]{%
  \foreach \i in {1,...,#1}
    {\drawSquare{\i}{#2}{#3}}}%<== put the \drawSquare{\i}{#2}{#3} in {}

\begin{document}

\begin{tikzpicture}
  \boxesAtHeight{4}{0}{black}
  \boxesAtHeight{2}{1}{black}
  \boxesAtHeight{1}{2}{black}
\end{tikzpicture}

\end{document}

результат

Связанный контент