Bei der Verwendung von TikZ tritt ein seltsames Verhalten auf.auswertenSyntax.
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.
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+1
inint
\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 .0
als Anker interpretiert wird. .0
ist (in diesem Fall) mit dem Ostanker zusammenfallend, also im Winkel 0. Ihre Ausgabe zeigt Linien, die mit dem Ostanker der jeweiligen Y
Knoten 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}
Übrigens würde ich die Verwendung von \x
als Schleifenvariable vermeiden, da es auch von verwendet wird calc
, d. h. Sie könnten andere "Merkwürdigkeiten" feststellen, wenn Sie es calc
mit \x
Schleifen 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}
Steven B. Segelets empfiehlt die Verwendung\the\numexpr
. Das funktioniert gut, aber dann brauchen Sie evaluate
es ü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 tikz
Möglichkeit gibt, dies zu tun, aber ich bin zu dem Schluss gekommen, dass die \x+1
erforderliche 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}