이상한 \foreach[evaluate] 동작

이상한 \foreach[evaluate] 동작

TikZ를 사용할 때 이상한 동작이 발생합니다평가하다통사론.

결론이 다른 세 가지보다 짧은 이유는 무엇입니까?

아래쪽 대각선이 다른 세 개보다 짧은 것이 보이시나요? 이는 원하는 동작이 아닙니다. 위 이미지의 코드는 다음과 같습니다.

\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 wonderness"와 "end wonderness" 사이의 줄을 주석 처리하고 마지막 다섯 줄의 주석 처리를 해제하면 문제가 마법처럼 해결된 것을 볼 수 있습니다. 모든 줄이 동일하게 보입니다.

이제 모든 선의 길이가 같습니다.

다시 말하지만, 원본 코드와 이 게시물 상단의 관련 그림에서 원하는 동작은 더 짧은 선입니다. 나머지 3개는 바람직하지 않습니다. 내가 원하는 행동을 하도록 도와줄 수 있나요?

감사해요!

답변1

\x+1내 의견에 쓰여진대로 포장 해야합니다.int

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

그렇지 않으면 다음과 같은 숫자를 얻게 됩니다 2.0. 여기서는 .0앵커로 해석됩니다. .0(이 경우) 동쪽 앵커와 일치합니다(즉, 각도 0). 출력에는 각 Y유형 노드의 동쪽 앵커에 연결되는 선이 표시됩니다. 두 번째 루프에서는 왜 문제가 발생하지 않는지 궁금할 수 있습니다. 왜냐하면 당신이 말할 때

 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\x케이지.

\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는 다음을 사용할 것을 제안합니다.\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}

여기에 이미지 설명을 입력하세요

관련 정보