我正在努力寻找最小值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}