Невозможно сократить оператор foreach

Невозможно сократить оператор foreach

Следующий код представляет собой простой двойной оператор foreach, который генерирует лестницу координат.

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

Я хотел упростить, не устанавливая макрос, а напрямую вставив индикатор диапазона 10-\iвторого foreachоператора. Однако ни одна из моих попыток не сработала и выдала множество ошибок.

Попытка 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}

Сообщение об ошибке:

! Illegal unit of measure (pt inserted).

Попытка 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}

Сообщение об ошибке:

! Missing number, treated as zero.

Попытка 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}

Сообщение об ошибке:

! Illegal unit of measure (pt inserted).

Попытка 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}

Сообщение об ошибке:

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

Неужели невозможно выполнить эту задачу таким образом?

решение1

Опция [parse=true]выполняет эту функцию.

введите описание изображения здесь

Более подробную информацию см. вРаздел 88 Повторяющиеся вещи: оператор ForeachизРуководство по PGF/TikZ.

введите описание изображения здесь

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

Мой личный комментарий: TikZ's foreachдовольно гибок; однако, TikZ/TeX - это система набора текста с ограниченными вычислениями, поэтому она далека от естественного синтаксиса по сравнению с некоторыми сильными языками программирования, такими как Python, Asymptote. Например, следующий код Asymptote очень естественен. (также обратите внимание, чтоКод асимптоты можно встроить в документ .tex)

введите описание изображения здесь

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

решение2

Также есть evaluateопция \foreach, которая имеет тот же эффект.

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

решение3

Вы можете напрямую вставить \the\numexpr10-\i\relaxи \foreachTiкZ расширит его (однако следует отметить, что возможные вычисления \numexprвесьма ограничены, в основном только +, -, *, / и скобки).

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

Связанный контент