我需要以下数字对:12 13 14 23 24 34
我的第一次尝试是使用两个嵌套的 foreach 循环:
\foreach \x in {1,...,4} {
\foreach \y in {\x+1,...,4} { % This would be very easy in LuaTeX
\node at (\x,\y) {(\x,\y)};
}
}
但是 TikZ 或 LaTeX不会+
将 中的 解释\x+1
为算术运算,而是将其解释为字符串。因此1+2
不会将其解释为3
,而是将其解释为字符串1+2
。
我确信一定有办法生成上述数字对序列,但我不知道怎么做。我也想改用 LuaTeX 或 LuaLaTeX,因为这种循环在通用编程语言中非常容易处理。
答案1
你是对的,在循环开始之前没有对表达式进行求值,这有点遗憾。
三种方法:
使用count=\xi
表达式使外循环计数器可访问。在这种情况下,外循环只需从 2 运行到 4,而计数器将从 1 运行到 3,这恰好是内循环的起点。此解决方案仅适用于这种特殊情况,但是,只要您需要将内循环增大一个不同的值,您就必须求助于其他方法。
或者,您可以在外循环开始时使用解析表达式\pgfmathtruncatemacro
,这会将结果保存为整数,或者使用语法evaluate=\x as \result using <expression>
。
注意,外层循环实际上只需要从 1 运行到 3。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \x [count=\xi] in {2,...,4} {
\foreach \y in {\x,...,4} {
\node at (\xi,\y) {(\xi,\y)};
}
}
\end{tikzpicture}
\begin{tikzpicture}
\foreach \x in {1,...,3} {
\pgfmathtruncatemacro\ystart{\x+1}
\foreach \y in {\ystart,...,4} {
\node at (\x,\y) {(\x,\y)};
}
}
\end{tikzpicture}
\begin{tikzpicture}
\foreach \x [evaluate=\x as \ystart using int(\x+1)] in {1,...,3} {
\foreach \y in {\ystart,...,4} {
\node at (\x,\y) {(\x,\y)};
}
}
\end{tikzpicture}
\end{document}