
次のコードは、座標の階段を生成する単純な二重 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
2 番目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
ます\foreach
け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}