Usando novos comandos dentro do loop tikzpicture foreach

Usando novos comandos dentro do loop tikzpicture foreach

Estou tentando aninhar comandos em minhas páginas TikZ para poder tornar coisas cada vez mais complicadas com pequenos pedaços de código em cada nível. O código que tenho até agora é

\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}

Eu uso sharelatex e quando tento compilar recebo 4 erros. Na linha depois \end{tikzpicture}, tenho o erro

O parágrafo terminou antes de \pgffor@nextser concluído.

Na linha de \end{document}, recebo os três erros

Faltando \endgroupinserido.

Faltando }inserido.

Erro LaTeX: \begin{tikzpicture}na linha de entrada 12 terminada por \end{document}.

Quando substituo o código tikzpictureexpandindo a \boxesAtHeightmacro, recebo os mesmos erros.

Quando expando ainda mais a \drawSquaremacro, obtenho a seguinte saída

saída bem-sucedida após expandir cada macro

Para ser claro, a primeira expansão resultou no código

\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}

E a segunda expansão resultou no código

\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}

Alguém pode me explicar por que estou recebendo erros? Eu sei que a \drawSquaremacro funciona fora dos loops.

Responder1

Você precisa agrupar o corpo do loop 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}

resultado

informação relacionada