Não é possível encurtar a instrução foreach

Não é possível encurtar a instrução foreach

O código a seguir é uma instrução double foreach simples que gera uma escada de coordenadas.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \pgfmathsetmacro{\r}{10-\i}
    \foreach \j in {0,...,\r} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

Eu queria simplificar, não definindo uma macro e colocando diretamente 10-\io indicador de intervalo da segunda foreachinstrução. No entanto, nenhuma das minhas tentativas funcionou e gerou vários erros.

Tentativa 1:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,10-\i} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

Mensagem de erro:

! Illegal unit of measure (pt inserted).

Tentativa 2:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,(10-\i)} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

Mensagem de erro:

! Missing number, treated as zero.

Tentativa 3:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,{10-\i}} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

Mensagem de erro:

! Illegal unit of measure (pt inserted).

Tentativa 4:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,\pgfmathparse{10-\i}\pgfmathresult} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

Mensagem de erro:

! Incomplete \iffalse; all text was ignored after line 11.

É impossível realizar esta tarefa desta forma?

Responder1

A opção [parse=true]faz esse trabalho.

insira a descrição da imagem aqui

Veja mais detalhes emSeção 88 Repetindo coisas: a declaração ForeachdeManual de instruções PGF/TikZ.

insira a descrição da imagem aqui

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \i[parse=true] in {0,...,10}
\foreach \j in {0,...,10-\i} 
\path (\i,\j) node{$(\i,\j)$};
\end{tikzpicture}
\end{document}

Meu comentário pessoal: o TikZ foreaché bastante flexível; entretanto, TikZ/TeX é um sistema de composição com computação limitada, portanto está longe da sintaxe natural em comparação com algumas linguagens de programação fortes, como Python, Asymptote. Por exemplo, o seguinte código Assíntota é muito natural. (observe também que oO código assíntota pode ser incorporado ao documento .tex)

insira a descrição da imagem aqui

// Asymptote has a handy "for" loop
// Run on http://asymptote.ualberta.ca/
size(12cm);
for (int i=0; i<10; ++i)
for (int j=0; j<10-i; ++j)
label("$($"+string(i)+","+string(j)+"$)$",(i,j),blue); 

Responder2

Existe também a evaluateopção para \foreachque tenha o mesmo efeito.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i[evaluate=\i as \r using 10-\i] in {0,...,10} {
    \foreach \j in {0,...,\r} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

Responder3

Você pode colocar diretamente \the\numexpr10-\i\relaxo \foreache TikZ irá expandi-lo (observe, entretanto, que os cálculos possíveis \numexprsão muito limitados, basicamente apenas +, -, *, / e parênteses).

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\begin{document}

\begin{tikzpicture}
\foreach \i in {0,...,10} {
    \foreach \j in {0,...,\the\numexpr10-\i\relax} {
        \node at (\i,\j) {$(\i,\j)$};
    }
}
\end{tikzpicture}
\end{document}

informação relacionada