No se puede acortar la declaración para cada

No se puede acortar la declaración para cada

El siguiente código es una declaración doble foreach simple que genera una escalera 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}

Quería simplificar al no configurar una macro y colocar directamente 10-\iel foreachindicador de rango de la segunda declaración. Sin embargo, ninguno de mis intentos funcionó y arrojó una variedad de errores.

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

Mensaje de error:

! Illegal unit of measure (pt inserted).

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

Mensaje de error:

! Missing number, treated as zero.

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

Mensaje de error:

! Illegal unit of measure (pt inserted).

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

Mensaje de error:

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

¿Es imposible realizar esta tarea de esta manera?

Respuesta1

La opción [parse=true]hace este trabajo.

ingrese la descripción de la imagen aquí

Ver más detalles enSección 88 Repetir cosas: la declaración ForeachdeManual de PGF/TikZ.

ingrese la descripción de la imagen aquí

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

Mi comentario personal: TikZ foreaches bastante flexible; sin embargo, TikZ/TeX es un sistema de composición tipográfica con cálculo limitado, por lo que está lejos de tener una sintaxis natural en comparación con algunos lenguajes de programación potentes, como Python y Asymptote. Por ejemplo, el siguiente código asíntota es muy natural. (también tenga en cuenta que elEl código asíntota se puede incrustar en un documento .tex)

ingrese la descripción de la imagen aquí

// 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); 

Respuesta2

También existe la evaluateopción de \foreachque tenga el mismo efecto.

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

Respuesta3

Puedes poner directamente \the\numexpr10-\i\relaxel \foreachy TikZ lo expandirá (tenga en cuenta sin embargo que los cálculos posibles \numexprson muy limitados, básicamente solo +, -, *, / y paréntesis).

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

información relacionada