Comportamiento extraño de \foreach

Comportamiento extraño de \foreach

Tengo un comportamiento extraño cuando uso TikZ.evaluarsintaxis.

¿Por qué el resultado final es más corto que los otros tres?

¿Ves cómo la línea diagonal inferior es más corta que las otras tres? Este no es el comportamiento deseado. El código para la imagen de arriba está aquí:

\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}

Si comentas las líneas entre "iniciar la rareza" y "finalizar la rareza" y descomentas las últimas cinco líneas, verás que el problema se soluciona mágicamente: todas las líneas tienen el mismo aspecto.

Ahora todas las líneas tienen la misma longitud.

Nuevamente, en el código original (y la imagen asociada en la parte superior de esta publicación) el comportamiento deseado es la línea más corta. Los otros tres son indeseables. ¿Puedes ayudarme a conseguir el comportamiento deseado?

¡Gracias!

Respuesta1

Como está escrito en mi comentario, debes terminar \x+1enint

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

ya que de lo contrario obtendrás números como 2.0, donde .0se interpreta como un ancla. .0coincide (en este caso) con el ancla este, es decir, en el ángulo 0. Su salida muestra líneas que se conectan al ancla este de los respectivos Ynodos de tipo. Quizás se pregunte por qué el problema no ocurre en el segundo ciclo. Esto es porque cuando dices

 evaluate=\x as \sx using \x

TikZ no necesita analizar la expresión y no agrega .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}

ingrese la descripción de la imagen aquí

Por cierto, evitaría usarla \xcomo variable de bucle ya que también la usa calc, es decir, puede encontrar otras "rarezas" si la usa calccon \xbucles. Y si quieres que los espacios desaparezcan, puedes dibujar los nodos con Ti.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}

ingrese la descripción de la imagen aquí

Steven B. Segelets sugiere utilizar\the\numexpr. Esto funciona bien, pero no es necesario evaluateen absoluto.

\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}

Respuesta2

Estoy seguro de que hay una tikzforma de hacerlo, pero concluí la \x+1evaluación necesaria, así que como es integral, utilicé \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}

ingrese la descripción de la imagen aquí

información relacionada