无法缩短 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]完成这项工作。

在此处输入图片描述

详细内容请参见第八十八条 重复的事情: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\foreachTiZ 会将其扩展(但请注意,其中可能的计算\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}

相关内容