应用 foreach 循环时出现问题

应用 foreach 循环时出现问题

我正在努力寻找最小值XTi 集合中的坐标Z 坐标。

考虑以下代码

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\newdimen\x
\newdimen\xmin
\xmin=10000pt
\newdimen\y
\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (1) {182};
\node[below=of 1] (2) {183731468};
\node[below=of 2] (3) {74632};
\path (1.west); \pgfgetlastxy{\x}{\y}
\ifdim\x<\xmin \xmin=\x \fi
\fill[red] (\xmin,\y) circle (1pt);
\path (2.west); \pgfgetlastxy{\x}{\y}
\ifdim\x<\xmin \xmin=\x \fi
\fill[red] (\xmin,\y) circle (1pt);
\path (3.west); \pgfgetlastxy{\x}{\y}
\ifdim\x<\xmin \xmin=\x \fi
\fill[red] (\xmin,\y) circle (1pt);
\end{tikzpicture}
\end{document}

和此代码

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\newdimen\x
\newdimen\xmin
\xmin=10000pt
\newdimen\y
\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (1) {182};
\node[below=of 1] (2) {183731468};
\node[below=of 2] (3) {74632};
\foreach \i in {1,2,3} {
    \path (\i.west); \pgfgetlastxy{\x}{\y}
    \ifdim\x<\xmin \xmin=\x \fi
    \fill[red] (\xmin,\y) circle (1pt);
}
\end{tikzpicture}
\end{document}

这些是第一个代码(左)和第二个代码(右)的并排输出:

在此处输入图片描述在此处输入图片描述

看看底部的点。第一个代码给出了预期的输出,但第二个没有。

为什么?如何修改\foreach第二个代码中的循环,以便它给出与第一个相同的输出?

答案1

\foreach变体中,设置维度时您处于组中,因此“外部”值不会改变。因此,您需要将维度设为全局(或偷运出团体)。在这里我只需在\global之前添加 即可使其成为全局的\xmin=\x

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\newdimen\x
\newdimen\xmin
\xmin=10000pt
\newdimen\y
\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (1) {182};
\node[below=of 1] (2) {183731468};
\node[below=of 2] (3) {74632};
\foreach \i in {1,2,3} {
    \path (\i.west); \pgfgetlastxy{\x}{\y}
    \ifdim\x<\xmin \global\xmin=\x \fi
    \fill[red] (\xmin,\y) circle (1pt);
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

附录:当然,有些循环不引入组。其中最简单的可以说是内置的\loop

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\newdimen\x
\newdimen\xmin
\xmin=10000pt
\newdimen\y
\newcounter{loopi}
\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\node (1) {182};
\node[below=of 1] (2) {183731468};
\node[below=of 2] (3) {74632};
\setcounter{loopi}{0}
\loop
\stepcounter{loopi}
    \path (\number\value{loopi}.west); \pgfgetlastxy{\x}{\y}
    \ifdim\x<\xmin \xmin=\x \fi
    \fill[red] (\xmin,\y) circle (1pt);
\ifnum\number\value{loopi}<3\repeat
\end{tikzpicture}
\end{document}

答案2

您可以使用不进行分组的其他循环。\i您只需使用即可#1

\documentclass[border=4]{standalone}
\usepackage{xparse}
\usepackage{tikz}

\usetikzlibrary{positioning}

\ExplSyntaxOn
\NewDocumentCommand{\nforeach}{mmm}
 {
  \cs_set:Nn \joulev_nforeach:n { #3 }
  \int_step_function:nnN { #1 } { #2 } \joulev_nforeach:n
 }
\ExplSyntaxOff

\newdimen\x
\newdimen\xmin
\newdimen\y

\begin{document}
\begin{tikzpicture}[every node/.style={draw}]
\xmin=10000pt
\node (1) {182};
\node[below=of 1] (2) {183731468};
\node[below=of 2] (3) {74632};
\nforeach{1}{3}{
  \path (#1.west); \pgfgetlastxy{\x}{\y}
  \ifdim\x<\xmin \xmin=\x \fi
  \fill[red] (\xmin,\y) circle (1pt);
}
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容