奇妙な\foreach[evaluate]の動作

奇妙な\foreach[evaluate]の動作

TikZを使用すると奇妙な動作が発生します評価する構文。

一番下の行が他の 3 行よりも短いのはなぜですか?

下の対角線が他の 3 本よりも短いのがわかりますか? これは望ましい動作ではありません。上の画像のコードは次のとおりです。

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

「start weirdness」と「end weirdness」の間の行をコメントアウトし、最後の 5 行のコメントアウトを解除すると、問題が魔法のように解決され、すべての行が同じに見えることがわかります。

これですべての線の長さが同じになりました。

もう一度言いますが、元のコードとこの投稿の先頭にある関連画像では、望ましい動作は短い行です。他の 3 つは望ましくありません。望ましい動作を実現できるよう、手伝っていただけますか?

ありがとう!

答え1

私のコメントに書いたように\x+1int

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

そうでなければ、 のような数値が得られ2.0、 は.0アンカーとして解釈されます。.0は(この場合)東のアンカーと一致し、角度は 0 です。出力には、それぞれのY型ノードの東のアンカーに接続する線が表示されます。なぜ2番目のループでは問題が発生しないのか不思議に思うかもしれません。これは、次のようにすると、

 evaluate=\x as \sx using \x

ティZ は式を解析する必要がないため、を追加しません.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}

ここに画像の説明を入力してください

\xところで、は によっても使用されるため、ループ変数として使用することは避けた方がよいでしょう。つまり、をループでcalc使用すると、他の「奇妙な」ことが見つかるかもしれません。ギャップをなくしたい場合は、 Ti でノードを描画するだけで済みます。calc\xZ.

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

ここに画像の説明を入力してください

スティーブン・B・セゲレッツは、\the\numexprこれは問題なく動作しますが、まったく必要ありませんevaluate

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

答え2

tikz確かにやり方はあると思いますが、\x+1必要な評価は終了したので、積分なので を使用しました\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}

ここに画像の説明を入力してください

関連情報