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}