Foreach-Anweisung kann nicht gekürzt werden

Foreach-Anweisung kann nicht gekürzt werden

Der folgende Code ist eine einfache doppelte foreach-Anweisung, die eine Koordinatentreppe generiert.

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

Ich wollte es vereinfachen, indem ich kein Makro einrichtete und den Bereichsindikator der 10-\izweiten Anweisung direkt einfügte. Keiner meiner Versuche funktionierte jedoch und führte zu einer Reihe von Fehlern.foreach

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

Fehlermeldung:

! Illegal unit of measure (pt inserted).

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

Fehlermeldung:

! Missing number, treated as zero.

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

Fehlermeldung:

! Illegal unit of measure (pt inserted).

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

Fehlermeldung:

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

Ist es unmöglich, diese Aufgabe auf diese Weise zu erledigen?

Antwort1

Die Option [parse=true]erledigt diese Aufgabe.

Bildbeschreibung hier eingeben

Weitere Einzelheiten finden Sie in§ 88 InsO Dinge wiederholen: Die Foreach-AnweisungvonPGF/TikZ-Handbuch.

Bildbeschreibung hier eingeben

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

Mein persönlicher Kommentar: TikZ foreachist ziemlich flexibel; allerdings ist TikZ/TeX ein Satzsystem mit begrenzten Rechenkapazitäten, daher ist es weit von der natürlichen Syntax entfernt im Vergleich zu einigen starken Programmiersprachen wie Python, Asymptote. Beispielsweise ist der folgende Asymptote-Code sehr natürlich. (Beachten Sie auch, dass dieAsymptotencode kann in .tex-Dokumente eingebettet werden)

Bildbeschreibung hier eingeben

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

Antwort2

Es besteht auch die evaluateOption für \foreach, die den gleichen Effekt hat.

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

Antwort3

Sie können direkt \the\numexpr10-\i\relaxin die \foreachund TikZ wird es erweitern (beachten Sie jedoch, dass die möglichen Berechnungen \numexprsehr begrenzt sind, im Wesentlichen nur +, -, *, / und Klammern).

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

verwandte Informationen