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-\i2 番目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 は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

とTiを直接入力することができ\the\numexpr10-\i\relaxます\foreachZ はそれを展開します (ただし、 で可能な計算は\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}

関連情報