Tengo un comportamiento extraño cuando uso TikZ.evaluarsintaxis.
¿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.
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+1
enint
\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 .0
se interpreta como un ancla. .0
coincide (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 Y
nodos 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}
Por cierto, evitaría usarla \x
como variable de bucle ya que también la usa calc
, es decir, puede encontrar otras "rarezas" si la usa calc
con \x
bucles. 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}
Steven B. Segelets sugiere utilizar\the\numexpr
. Esto funciona bien, pero no es necesario evaluate
en 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 tikz
forma de hacerlo, pero concluí la \x+1
evaluació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}