無法縮短 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 的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\foreachTikZ 將對其進行擴展(但請注意,中可能的計算\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}

相關內容