Seltsames \foreach[evaluate]-Verhalten

Seltsames \foreach[evaluate]-Verhalten

Bei der Verwendung von TikZ tritt ein seltsames Verhalten auf.auswertenSyntax.

Warum ist die unterste Zeile kürzer als die anderen drei?

Sehen Sie, dass die untere Diagonale kürzer ist als die anderen drei? Das ist nicht das gewünschte Verhalten. Der Code für das obige Bild ist hier:

\documentclass{memoir}
\usepackage{tikz}
\begin{document}

\[
\begin{tikzpicture}
    \foreach \x in {0,...,4} 
        {\node (X\x) at (0,\x) {$\bullet$};
        }
    \foreach \x in {0,...,4} 
        {\node (Y\x) at (3,\x) {$\bullet$};
        }
% start weirdness
    \draw (X0) -- (Y1);
    \foreach \x [evaluate=\x as \sx using \x+1] in {1,...,3}
    {
        \draw (X\x) -- (Y\sx);
    }
% end weirdness. 
% Comment out the above weirdness and uncomment out the following:
%   \draw (X0) -- (Y0);
%   \foreach \x [evaluate=\x as \sx using \x] in {1,...,3}
%   {
%      \draw (X\x) -- (Y\sx);
%   }
\end{tikzpicture}
\]

\end{document}

Wenn Sie die Zeilen zwischen „start weirdness“ und „end weirdness“ auskommentieren und die letzten fünf Zeilen auskommentieren, werden Sie sehen, dass das Problem wie durch Zauberhand behoben ist: Alle Zeilen sehen gleich aus.

Jetzt sind alle Zeilen gleich lang.

Auch im Originalcode – und im zugehörigen Bild oben in diesem Beitrag – ist das gewünschte Verhalten die kürzere Zeile. Die anderen drei sind unerwünscht. Können Sie mir helfen, das gewünschte Verhalten zu erreichen?

Danke!

Antwort1

Wie in meinem Kommentar geschrieben, müssen Sie einwickeln \x+1inint

\foreach \x [evaluate=\x as \sx using {int(\x+1)}] in {1,...,3}
    {
        \draw (X\x) -- (Y\sx);
    }

da Sie sonst Zahlen wie erhalten 2.0, wobei .0als Anker interpretiert wird. .0ist (in diesem Fall) mit dem Ostanker zusammenfallend, also im Winkel 0. Ihre Ausgabe zeigt Linien, die mit dem Ostanker der jeweiligen YKnoten vom Typ verbunden sind. Sie fragen sich vielleicht, warum das Problem in der zweiten Schleife nicht auftritt. Das liegt daran, dass wenn Sie sagen

 evaluate=\x as \sx using \x

TikZ muss den Ausdruck nicht analysieren und fügt nicht hinzu .0.

\documentclass{memoir}
\usepackage{tikz}
\begin{document}

\[
\begin{tikzpicture}
    \foreach \x in {0,...,4} 
        {\node (X\x) at (0,\x) {$\bullet$};
        }
    \foreach \x in {0,...,4} 
        {\node (Y\x) at (3,\x) {$\bullet$};
        }
% start weirdness
    \draw (X0) -- (Y1);
    \foreach \x [evaluate=\x as \sx using {int(\x+1)}] in {1,...,3}
    {
        \draw (X\x) -- (Y\sx);
    }
\end{tikzpicture}   
\quad\mbox{vs.}\quad
\begin{tikzpicture}
% end weirdness. 
% Comment out the above weirdness and uncomment out the following:
    \foreach \x in {0,...,4} 
        {\node (X\x) at (0,\x) {$\bullet$};
        }
    \foreach \x in {0,...,4} 
        {\node (Y\x) at (3,\x) {$\bullet$};
        }
  \draw (X0) -- (Y0);
  \foreach \x [evaluate=\x as \sx using \x] in {1,...,3}
  {
     \draw (X\x) -- (Y\sx);
  }
\end{tikzpicture}
\]

\end{document}

Bildbeschreibung hier eingeben

Übrigens würde ich die Verwendung von \xals Schleifenvariable vermeiden, da es auch von verwendet wird calc, d. h. Sie könnten andere "Merkwürdigkeiten" feststellen, wenn Sie es calcmit \xSchleifen verwenden. Und wenn Sie möchten, dass die Lücken verschwinden, können Sie die Knoten einfach mit Ti zeichnen.kZ.

\documentclass{memoir}
\usepackage{tikz}
\begin{document}

\[
\begin{tikzpicture}[bullet/.style={circle,fill,inner sep=2pt}]
    \path foreach \Y in {0,...,4} 
        {(0,\Y) node[bullet] (X\Y){}
         (3,\Y) node[bullet] (Y\Y) {}
        };
    \foreach \X [evaluate=\X as \Y using {int(\X+1)}] in {0,...,3}
    {
        \draw (X\X) -- (Y\Y);
    }
\end{tikzpicture}   
\]
\end{document}

Bildbeschreibung hier eingeben

Steven B. Segelets empfiehlt die Verwendung\the\numexpr. Das funktioniert gut, aber dann brauchen Sie evaluatees überhaupt nicht.

\documentclass{memoir}
\usepackage{tikz}
\begin{document}

\[
\begin{tikzpicture}[bullet/.style={circle,fill,inner sep=2pt}]
    \path foreach \Y in {0,...,4} 
        {(0,\Y) node[bullet] (X\Y){}
         (3,\Y) node[bullet] (Y\Y) {}
        };
    \foreach \X  in {0,...,3}
    {
        \draw (X\X) -- (Y\the\numexpr\X+1);
    }
\end{tikzpicture}   
\]
\end{document}

Antwort2

Ich bin sicher, dass es eine tikzMöglichkeit gibt, dies zu tun, aber ich bin zu dem Schluss gekommen, dass die \x+1erforderliche Auswertung erforderlich ist. Da es sich also um ein integrales Element handelt, habe ich verwendet \numexpr.

\documentclass{memoir}
\usepackage{tikz}
\begin{document}

\[
\begin{tikzpicture}
    \foreach \x in {0,...,4} 
        {\node (X\x) at (0,\x) {$\bullet$};
        }
    \foreach \x in {0,...,4} 
        {\node (Y\x) at (3,\x) {$\bullet$};
        }
% start weirdness
    \draw (X0) -- (Y1);
    \foreach \x [evaluate=\x as \sx using \the\numexpr\x+1\relax] in {1,...,3}
    {
        \draw (X\x) -- (Y\sx);
    }
% end weirdness. 
% Comment out the above weirdness and uncomment out the following:
%   \draw (X0) -- (Y0);
%   \foreach \x [evaluate=\x as \sx using \x] in {1,...,3}
%   {
%      \draw (X\x) -- (Y\sx);
%   }
\end{tikzpicture}
\]

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen