foreach의 이상한 동작

foreach의 이상한 동작

나는 완전히 멍청했다.

다음 코드를 고려해보세요.

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a / \b in {
(20:1) / (90:1)
,(-20:1) / (-90:2)
}
{
\node at \a {$\a$};
\node at \b {$\b$};
%\draw \a to \b;
}
\end{tikzpicture}

\end{document}

"있는 그대로" 실행하면 좌표 태그를 올바른 위치에 배치하여 예상대로 작동합니다.

하지만, \draw 줄의 주석 처리를 제거하면 \draw가 좌표를 이해하지 못하는 것처럼 "패키지 tikz 오류: (, +, 좌표, 그림 또는 노드가 필요합니다.")라는 오류가 발생합니다.

나는 중괄호로 좌표를 둘러싸는 등 다양한 간격을 시도했지만 소용이 없었습니다.

답변1

Ulrich는 이미 좋은 수정 사항을 제공했습니다.이는 직선 연결에 작동합니다. 문제는 무엇이 잘못되었는지입니다. 문제는 파서가 명시적(또는 옵션 등)을 보고 싶어 하지만 a 이후 (로 시작하는 항목으로 확장되는 매크로는 보고 싶어하지 않는다는 것입니다 . 따라서 이 문제를 해결하는 한 가지 방법은 먼저 매크로를 확장한 다음 명령을 "활성화"하는 것입니다.(to\draw

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a / \b in {
(20:1) / (90:1)
,(-20:1) / (-90:2)
}
{
\node at \a {$\a$};
\node at \b {$\b$};
\edef\temp{\noexpand\draw \a to \b;}
\temp
}
\end{tikzpicture}

\end{document}

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

물론 다양한 변형이 가능합니다.

 \edef\temp{ to \b}
 \draw \a \temp;

아니면 더 많은 Ti케이Zy 버전

 \draw [insert path/.expanded={\a to \b}];

또는 Ti를 줄 수도 있습니다.케이Z는 명시적인 괄호입니다.

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a/\b in {
20:1/90:1,%
-20:1/-90:2%
}
{
\node at (\a) {$(\a)$};
\node at (\b) {$(\b)$};
\draw (\a) to (\b);
}
\end{tikzpicture}

\end{document}

어쨌든 노드에 이름을 지정하면 연결이 훨씬 더 좋아지므로 문제가 발생하지 않습니다.

\documentclass{standalone}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}

\foreach \a / \b in {
(20:1) / (90:1)
,(-20:1) / (-90:2)
}
{
\node (a) at \a {$\a$};
\node (b) at \b {$\b$};
\draw (a) to (b);
}
\end{tikzpicture}

\end{document}

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

답변2

\draw \a -- \b;대신에 글을 쓰면 \draw \a to \b;모든 일이 잘 풀리는 것 같습니다.

\draw \a \expandafter t\expandafter o\b;대신에 글을 쓰면 \draw \a to \b;모든 일이 잘 풀리는 것 같아요.

의 피연산자 의 구성을 평가하기 전에 확장되지 않는 to것과 같은 확장 가능한 토큰 이후에 나타납니다 .\bto

-연산자를 만나기 전에 최상위 수준 확장 \SecondArgumentsFirstTokenTopLevelExpanded에 사용할 수 있는 매크로를 제공할 수 있습니다 .\bto

\documentclass{standalone}

\newcommand\exchange[2]{#2#1}%
\newcommand\SecondArgumentsFirstTokenTopLevelExpanded[2]{%
  \expandafter\exchange\expandafter{#2}{#1}%
}%

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\foreach \a / \b in {(20:1)/(90:1),(-20:1)/(-90:2)}{
  \node at \a {$\a$};
  \node at \b {$\b$};
  \draw \a \SecondArgumentsFirstTokenTopLevelExpanded{to}{\b};
}
\end{tikzpicture}

\end{document}

관련 정보