![pgfplots를 사용하여 foreach 변수를 추가 플롯의 매개변수로 사용하려고 할 때 "정의되지 않은 제어 시퀀스"가 나타나는 이유는 무엇입니까?](https://rvso.com/image/254718/pgfplots%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20foreach%20%EB%B3%80%EC%88%98%EB%A5%BC%20%EC%B6%94%EA%B0%80%20%ED%94%8C%EB%A1%AF%EC%9D%98%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%A0%A4%EA%B3%A0%20%ED%95%A0%20%EB%95%8C%20%22%EC%A0%95%EC%9D%98%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EC%A0%9C%EC%96%B4%20%EC%8B%9C%ED%80%80%EC%8A%A4%22%EA%B0%80%20%EB%82%98%ED%83%80%EB%82%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
오류 막대가 있는 플롯이 여러 개 있으므로 전체 플롯을 더 읽기 쉽게 만들기 위해 오류 막대를 약간 이동하고 싶습니다. 그러나 a 변수를 \foreach
이동량으로 사용하여 이 작업을 수행하려고 하면 "정의되지 않은 제어 시퀀스" 오류가 발생합니다.
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}
\begin{axis}
\foreach \x/\y in {a/-1cm, b/0cm, c/1cm} {
\addplot+ [
%every error bar/.append style={xshift=\y},
%every node/.style={xshift=\y},
error bars/y dir=both,
error bars/y explicit,
] coordinates {
(0, 0) +- (0, 1)
(1, 0) +- (0, 1)
(2, 0) +- (0, 1)
};
}
\end{axis}
\end{tikzpicture}
\end{document}
(두 주석 중 하나의 주석을 제거하면 문서가 컴파일되지 않습니다.)
여기서 무슨 문제가 있습니까?
편집하다: 에 다른 변수를 추가했습니다 \foreach
. 실제 사용 사례에서는 데이터를 플롯할 파일 이름이나 곡선에 사용할 레이블이 포함됩니다.
답변1
문제는 매크로 확장 문제입니다. \y
변수는 나중에 평가되지만 "나중에" 루프가 완료되어 \y
정의되지 않습니다.
이미 언급했듯이 \pgfplotsinvokeforeach
루프 인수는 하나만 있습니다( \pgfplotsforeachungrouped
두 개의 인수를 지원하지만 여기서는 도움이 되지 않습니다).
다음은 한 가지 접근 방식입니다.언제나루프가 아무리 복잡하더라도 작동합니다.
\begin{tikzpicture}
\begin{axis}
\foreach \x/\y in {a/-1cm, b/0cm, c/1cm} {
\edef\temp{
\noexpand\addplot+ [
every error bar/.append style={xshift=\y},
every node/.style={xshift=\y},
error bars/y dir=both,
error bars/y explicit,
]
coordinates {
(0, 0) +- (0, 1)
(1, 0) +- (0, 1)
(2, 0) +- (0, 1)
};
}
\temp
}
\end{axis}
\end{tikzpicture}
\edef
전체 루프 본체를 덮는 인공물을 소개했습니다 . 이는 "확장된 정의"를 의미합니다. 중괄호 안의 모든 항목이 완전히 확장된 결과로 \edef
정의됩니다 . 이는 현재 루프 값으로 \temp
확장됩니다 . \y
불행하게도 확장도 시도할 것입니다 \addplot
. 이는 불가능합니다. 이러한 확장을 피하기 위해 저는 TeX 프리미티브 \noexpand
를 \addplot
.
마지막으로 \temp
루프 본문을 포함합니다.없이\y
또는 에 대한 모든 참조 \x
. \temp
루프 본문에 작성하여 간단히 실행할 수 있습니다 . 그게 효과가 있습니다.
궁금해서: 좌표 목록을 외부에 남겨둘 수 있습니다 \edef
.
\begin{tikzpicture}
\begin{axis}
\foreach \x/\y in {a/-1cm, b/0cm, c/1cm} {
\edef\temp{
\noexpand\addplot+ [
every error bar/.append style={xshift=\y},
every node/.style={xshift=\y},
error bars/y dir=both,
error bars/y explicit,
]
}
\temp
coordinates {
(0, 0) +- (0, 1)
(1, 0) +- (0, 1)
(2, 0) +- (0, 1)
};
}
\end{axis}
\end{tikzpicture}
이것은 TeX가 확장을 통해 작동하기 때문에 작동합니다. "실행"하자마자 TeX \temp
는 "내부"에 있다는 사실에 대해 더 이상 아무것도 모르고 \temp
단순히 미리 읽을 것입니다.
보다http://pgfplots.sourceforge.net/TeX-programming-notes.pdf자세한 내용은