
以下程式碼是一個簡單的雙 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
和\foreach
TikZ 將對其進行擴展(但請注意,中可能的計算\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}