在内部 foreach 循环中增加循环变量

在内部 foreach 循环中增加循环变量

我需要以下数字对: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}

相关内容