下面的代码是一个简单的双 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]
完成这项工作。
详细内容请参见第八十八条 重复的事情: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}
我个人的看法:TikZforeach
非常灵活;但是 TikZ/TeX 是一种计算有限的排版系统,因此与一些强大的编程语言(如 Python、Asymptote)相比,它的语法远非自然。例如,下面的 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
Ti钾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}