TikZ – 07 – Repetição

Muitas vezes, ilustrações apresentam elementos repetidos. Lidar com eles sem que nossa tarefa se torne cansativa e desanimadora é o objetivo deste capítulo, para o qual preparamos a seguinte ilustração:

Fig. 7.1 – O conjunto dos inteiros congruente a 1 (módulo 3).

Essa ilustração tenta, com muito boa vontade, mostrar o conjunto (infinito) dos números inteiros que distam uns dos outros por múltiplos de 3 a partir do número 1 (ou de qualquer outro número do conjunto). Em termos puramente matemáticos, temos uma representação da classe de números inteiros congruentes a 1 com módulo 3, ou a classe de inteiros que deixam resto 1 quando divididos por 3.

Por mais interessante que seja a matemática representada na ilustração, o que propriamente nos interessa aqui são suas características repetitivas. Observe como se repetem os pequenos tracinhos, os círculos vermelhos e os números acima e abaixo. Todos esses elementos serão traçados não um a um, mas através de um subterfúgio comum a todas as linguagens de programação: os laços de repetição.

Desenho

Vamos começar desenhando o eixo. Como antes, vamos já traçar a setinha do lado direito:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
\end{tikzpicture}

Esse código gera a imagem:

Fig. 7.2 – O eixo

Os elementos que mais se repetem nessa imagem são os tracinhos que marcam a posição dos números no eixo:

Fig. 7.3 – Eixo com marcas

Como fazer isso sem ter que escrever dezenas de linhas com códigos, uma para cada tracinho? Vamos usar o laço de repetição foreach.

O laço \foreach

Laços de repetição são elementos comuns em linguagens de programação. A TikZ tem seu laço particular – chamado de foreach – que significa “para cada”.

Antes de explicar como ele funciona, vamos apresentar o código que gerou as marquinhas no eixo:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
  \foreach \x in {-5,...,7}
    \draw (\x, -0.05) -- (\x, 0.05);
\end{tikzpicture}

Com essas duas novas linhas, temos a ilustração já apresentada acima:

Fig. 7.4 – Eixo com marcas (de novo!)

Como funciona esse laço de repetição? em primeiro lugar, vamos desvendar a primeira linha:

\foreach \x in {-5,...,7}

O comando foreach significa, literalmente, “para cada”. A expressão {-5, ..., 7} é uma abreviação do conjunto {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}, ou seja, os treze números inteiros que vão de -5 a 7. Assim, a expressão pode ser traduzida como “para cada x no conjunto {-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}“. Mas o que isso quer dizer?

Isso nos diz que temos uma variável x que vai tomar sucessivamente os valores do conjunto dado e vai fazer alguma coisa com esse valor. Em nosso caso, essa variável vai levar os valores do conjunto, um de cada vez, para dentro da expressão

\draw (\x, -0.05) -- (\x, 0.05);

que, por sua vez, vai traçar as marquinhas no eixo. Como?

Em primeiro lugar, x vai valer -5, que é o primeiro elemento do conjunto. Esse valor será substituído em todos os lugares onde x aparece no comando \draw. Ou seja, com x igual a -5, esse comando será:

\draw (-5, -0.05) -- (-5, 0.05);

Com isso, teremos desenhado o primeiro tracinho sobre o eixo, aquele mais à esquerda, na posição x = -5. Logo depois, o laço foreach vai trocar o valor de x pelo próximo do conjunto, ou seja, x vai valer -4. E, novamente, vai substituir no comando \draw esse valor:

\draw (-4, -0.05) -- (-4, 0.05);

Agora, é o segundo tracinho que será marcado sobre o eixo, na posição x = -4. E assim será, sucessivamente, até que todos os elementos do conjunto sejam esgotados. Quando o último elemento do conjunto for usado, o laço acaba, e teremos a imagem do eixo com as marcações.

Não entendeu? Vamos para o segundo laço, que vai desenhar as bolinhas referentes aos números -5, -2, 1, 4 e 7, uma sequência em que o próximo número está separado do anterior por 3 unidades, ou seja, “pula” 3 de cada vez. O código é o seguinte:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
  \foreach \x in {-5,...,7}
    \draw (\x, -0.05) -- (\x, 0.05);
  \foreach \x in {-5,-2,...,7}
    \filldraw (\x, 0) circle (0.07);
\end{tikzpicture}

Agora o conjunto do qual x vai tomar seus valores será {-5, -2, 1, 4, 7}. Por quê? O que mudou? Observe que escrevemos {-5, -2, … 7}:

\foreach \x in {-5,-2,...,7}

Isso indica à TikZ que depois do -5 deve vir o -2, estabelecendo um “pulo” de 3 unidades. E isso será estendido para todos os números do conjunto, começando em -5 e “pulando” de 3 em 3.

Os círculos em si serão desenhados com a linha:

\filldraw (\x, 0) circle (0.07);

Ou seja, círculos de raio 0.07 nas posições (-5, 0), (-2, 0), (1, 0), (4, 0) e (7, 0). Isso vai gerar a seguinte figura:

Fig. 7.5 – Círculos

Mais um laço de repetição será usado para traçar as setas que apontam dos círculos até o conjunto {…, -5, 2, 1, 4, 7, …}. Vamos usar o laço seguinte:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
  \foreach \x in {-5,...,7}
    \draw (\x, -0.05) -- (\x, 0.05);
  \foreach \x in {-5,-2,...,7}
    \filldraw (\x, 0) circle (0.07);
  \foreach \x in {-5,-2,...,7}
    \draw (\x, -0.5) -- (0.9+0.1*\x,-2);
\end{tikzpicture}

Novamente, o conjunto de partida é o {-5, -2, -1, 4, 7}. E as setas serão traçadas por:

\draw (\x, -0.5) -- (0.9+0.1*\x,-2);

Mas o que significa aquela expressão 0.9+0.1*\x dentro dos parênteses? Acredite: é melhor que você, agora, altere seus valores e reexecute o programa para entender exatamente o que ela faz. Como em toda ilustração, às vezes a gente precisa testar muitas coisas, ver os erros que comentemos e ir ajustando até encontrar uma solução ideal. Essa fórmula foi encontrada assim, com alguma matemática no meio do caminho. Altere seus valores agora e veja o que acontece.

Com esse novo código, temos:

Fig. 7.6 – Setas (mas não tanto…)

As linhas do desenho estão traçadas. Vamos passar para o texto.

Texto

Vamos aproveitar o primeiro laço foreach e usar node para escrever o texto logo após as primeiras coordenadas do draw:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
  \foreach \x in {-5,...,7}
    \draw (\x, -0.05) node [above=2pt] {\x} -- (\x, 0.05);
  \foreach \x in {-5,-2,...,7}
    \filldraw (\x, 0) circle (0.07);
  \foreach \x in {-5,-2,...,7}
    \draw (\x, -0.5) -- (0.9+0.1*\x,-2);
\end{tikzpicture}

A expressão node [above=2pt] {\x} significa que vamos escrever um texto 2 pontos acima das coordenadas, e o texto será o valor de x do laço. Essa decoração deveria ficar para o fim, segundo nossa metodologia, mas isso não é uma lei do universo: às vezes, se já sabemos como a figura deve aparentar, já colocamos as decorações junto com tudo o mais.

Esse pequeno acréscimo no código gera:

Fig. 7.7 – Números

Vamos criar um quarto laço para escrever a segunda série de números, aqueles que vão ficar abaixo do eixo, destacando os pontos marcados com uma bolinha:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
  \foreach \x in {-5,...,7}
    \draw (\x, -0.05) node [above=2pt] {\x} -- (\x, 0.05);
  \foreach \x in {-5,-2,...,7}
    \filldraw (\x, 0) circle (0.07);
  \foreach \x in {-5,-2,...,7}
    \draw (\x, -0.5) -- (0.9+0.1*\x,-2);
  \foreach \x in {-5,-2,...,7}
    \draw (\x, 0) node {\x};
\end{tikzpicture}

O código acrescentado é um laço que simplesmente escreve o valor de x nas coordenadas indicadas. Poderíamos ter aproveitado um laço anterior, mas resolvemos escrever outro apenas por questões de clareza. E temos a figura:

Fig. 7.8 – Números abaixo, mas ainda desajustados

Mais adiante vamos ajustar a posição dos números. Por ora, acrescente no fim do código a seguinte linha, que desenha o conjunto abaixo das setas:

\draw (1, -2.3) node {\{\ldots, -5, -2, 1, 4, 7, \ldots\}}; 

Com essa linha (que tem um pouco de LaTeX), criamos a figura:

Fig. 7.9 – O texto do conjunto {…, -5, -2, 1, 4, 7, ….}

Bastam alguns ajustes e tudo ficará como queremos.

Decoração

Primeiro, vamos ajustar aposição e a cor dos números de baixo acrescentando [below,red] no último laço:

\foreach \x in {-5,-2,...,7}
  \draw [below, red] (\x, 0) node {\x};

Isso gera:

Fig. 7.10 – Ajuste nos números do conjunto

Agora, vamos colorir as bolinhas acrescentando [red] no segundo laço:

\foreach \x in {-5,-2,...,7}
  \filldraw [red] (\x, 0) circle (0.07);

E temos a imagem:

Fig. 7.11 – Bolinhas vermelhas

Para finalizar, vamos acrescentar [->, dotted] na setas, que são produzidas pelo terceiro laço foreach:

\foreach \x in {-5,-2,...,7}
  \draw [->, dotted](\x, -0.5) -- (0.9+0.1*\x,-2);

E, assim, temos a figura final:

Fig. 7.12 – A figura final

O código todo:

\begin{tikzpicture}
  \draw [->] (-5.5, 0) -- (7.5, 0);
  \foreach \x in {-5,...,7}
    \draw (\x, -0.05) node [above=2pt] {\x} -- (\x, 0.05);
  \foreach \x in {-5,-2,...,7}
    \filldraw [red] (\x, 0) circle (0.07);
  \foreach \x in {-5,-2,...,7}
    \draw [->, dotted](\x, -0.5) -- (0.9+0.1*\x,-2);
  \foreach \x in {-5,-2,...,7}
    \draw [below,red] (\x, -0.05) node {\x};
  \draw (1, -2.3) node {\{\ldots, -5, -2, 1, 4, 7, \ldots\}};
\end{tikzpicture}

Resumo

Desenho

  • \foreach \x in {-5,...,7} – para cada x no conjunto {-5, …, 7}, a TikZ realiza a ação da linha seguinte. Observe que não há ponto-e-vírgula nessa linha, mas apenas no fim da linha seguinte.
  • \foreach \x in {-5,-2,...,7} – para cada x no conjunto {-5, -2, …, 7}, em que os dois primeiros números indicam o “salto” a ser dado no conjunto, a TikZ realiza a ação da linha seguinte. No caso, o salto tem o valor 3.

Texto

  • \{ \ldots, -5, -2, 1, 4, 7, \ldots \} – código LaTeX que gera o conjunto indicado. A expressão \ldots cria os três pontos.

Decoração

  • [above=2pt] – ajuste fino: coloca o texto de 2 pontos acima das coordenadas.

Exercícios

  • Mude os números vermelhos para cima e os pretos para baixo, e “inverta” o desenho, colocando as setas apontando para cima, onde você vai colocar o conjunto {…, -5, -2, 1, 4, 7, …}
  • Tente alterar o desenho para que o conjunto representado seja não {…, -5, -2, 1, 4, 7, …}, mas {…, -4, -1, 2, 5, 8, …}, ou seja, o conjuntos dos números que deixam 2 quando divididos por 3.
  • Coloque o desenho na vertical, com a reta numérica à esquerda e as setas que selecionam os números apontando da esquerda para a direita, onde estará escrito o conjunto.

DESAFIO!

O desafio é fazer um desenho que represente os 3 conjuntos {…, -5, -2, 1, 4, 7, …}, {…, -4, -1, 2, 5, 8} e {…,-6, -3, 0, 3, 6, …} em que o primeiro é o dos números que deixam resto 1 quando divididos por 3; o segundo, o dos números que deixam resto 2 quando divididos por 3; e o terceiro, o dos múltiplos de 3, ou seja, que deixam resto 0 quando divididos por 3.

Mantenha o vermelho para o primeiro conjunto, use azul para o segundo e o verde para o terceiro. Faça três conjuntos de setas, da melhor maneira que você conseguir, ou tente representar os conjuntos de outra maneira.