읽고 플롯하고 싶은 테이블이 몇 개 있는데, 각 테이블에는 고유한 스타일이 있습니다. 편의상 동일한 태그를 사용하는 것이 좋습니다. MWE는 다음과 같습니다.
\documentclass{minimal}
\usepackage{pgfplotstable}
\begin{filecontents}{tabA.dat}
x y
0 0
1 1
2 2
3 3
\end{filecontents}
\begin{filecontents}{tabB.dat}
x y
0 1
1 2
2 3
3 4
\end{filecontents}
\pgfplotsset{compat=newest,
tabA/.style={color=red,mark=*},
tabB/.style={color=black,mark=o},
}
\pgfplotstableread{tabA.dat}\tabA
\pgfplotstableread{tabB.dat}\tabB
\begin{document}
\begin{tikzpicture}
\begin{axis}[legend,legend pos=south east]
\addplot[tabA] table[x=x,y=y] {\tabA};\label{pgf:tabA}\addlegendentry{tabA}
\addplot[tabB] table[x=x,y=y] {\tabB};\label{pgf:tabB}\addlegendentry{tabB}
\end{axis}
\end{tikzpicture}
\end{document}
\pgfplotsforeachinvoke
또는 를 사용하여 동일한 결과를 얻을 수 있습니까 \foreach
? 같은 것
\begin{tikzpicture}
\begin{axis}[legend,legend pos=south east]
\pgfplotsinvokeforeach{tabA,tabB}{%
% The following doesn't work, of course
\addplot[#1] table[x=x,y=y] {\#1}; % <- Magic goes here
}
\end{axis}
\end{tikzpicture}
물론 이 간단한 경우에는 간단하게 사용할 수 있습니다.
\addplot[#1] table[x=x,y=y] {#1.dat};
하지만 때로는 파일 이름이 패턴을 따르지 않거나 테이블을 수정하거나 여러 번 재사용하기 위해 테이블을 읽고 저장하고 싶을 때도 있습니다.
답변1
TeX.SE에 오신 것을 환영합니다! 항상 가능한 한 가지:
원하는 방식으로 토큰 목록을 구성하는 매크로 작성(여기서는 일련의
\addplot
명령을 적절한 옵션과 연결합니다)\foreachTable
그런 다음 와 같은 것을 출력하는 두 번째 매크로(내 코드에서는 의 두 번째 인수로 구성됨)를 사용\begin{axis}[...]#1\end{axis}
하고#1
모든 명령을 포함하는 이전에 조립된 토큰 목록으로 대체됩니다\addplot
.
이 기술항상 작동(두 번째 매크로가 확장되면 TeX 입력 스트림은 모든 코드를 수동으로 입력한 것과 정확히 동일한 상태가 됩니다.) 따라서 이를 사용하여 프로그래밍 방식으로 표, 그림 등 원하는 것을 생성할 수 있습니다.
전체 코드:
\begin{filecontents}{tabA.dat}
x y
0 0
1 1
2 2
3 3
\end{filecontents}
\begin{filecontents}{tabB.dat}
x y
0 1
1 2
2 3
3 4
\end{filecontents}
\documentclass[tikz, border=2mm]{standalone}
\usepackage{xparse}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}
\ExplSyntaxOn
\seq_new:N \l__millo_plot_cmds_tl
\cs_new_protected:Npn \millo_foreach_table_do_axis:nNn #1#2#3
{
\tl_clear:N \l__millo_plot_cmds_tl
\clist_map_inline:nn {#1}
{
\tl_set:Nn \l_tmpa_tl {#3}
\regex_replace_all:nnN { \c{myTable} } { \c{##1} } \l_tmpa_tl
\tl_put_right:NV \l__millo_plot_cmds_tl \l_tmpa_tl
}
\exp_args:No #2 \l__millo_plot_cmds_tl
}
\NewDocumentCommand \foreachTable { m m m }
{
\cs_set_protected:Npn \__millo_axis_func:n ##1 {#2}
\millo_foreach_table_do_axis:nNn {#1} \__millo_axis_func:n {#3}
}
\ExplSyntaxOff
\pgfplotsset{
tabA/.style={color=red,mark=*},
tabB/.style={color=black,mark=o},
}
\pgfplotstableread{tabA.dat}\tabA
\pgfplotstableread{tabB.dat}\tabB
\begin{document}
\begin{tikzpicture}
\foreachTable{tabA, tabB}
{
\begin{axis}[legend, legend pos=south east]
#1
\end{axis}
}
{ \addplot[#1] table[x=x,y=y] {\myTable}; \addlegendentry{#1} }
\end{tikzpicture}
\end{document}
통화 설명:
\foreachTable{tabA, tabB}
{
\begin{axis}[legend, legend pos=south east]
#1
\end{axis}
}
{ \addplot[#1] table[x=x,y=y] {\myTable}; \addlegendentry{#1} }
첫 번째 인수는 항목 목록입니다(각 항목은 하나의 \addplot
명령으로 연결됩니다).
#1
두 번째 인수는 내부가 자동 생성된 명령으로 대체된 후에 삽입될 것입니다 \addplot
.
세 번째 인수는 자동으로 생성된 각 플롯의 코드를 지정하며 몇 가지 편리한 대체 항목이 있습니다.
#1
항목 이름으로 대체됩니다(여기서는tabA
)tabB
.\myTable
\tabA
항목 이름(여기서는 첫 번째 항목의 경우,\tabB
두 번째 항목의 경우) 에서 작성된 제어 시퀀스 토큰으로 대체됩니다 .
더 많은 플롯을 수동으로 추가하려면(여기서는 자동 생성된 플롯 이전과 이후에 하나씩) 예를 들어 다음을 수행할 수 있습니다.
\foreachTable{tabA, tabB}
{
\begin{axis}[legend, legend pos=south east]
\addplot {sin(deg(\x))}; \addlegendentry{$\sin$}
#1
\addplot {sqrt(\x)}; \addlegendentry{$x\mapsto \sqrt{x}$}
\end{axis}
}
{ \addplot[#1] table[x=x,y=y] {\myTable}; \addlegendentry{#1} }
없는 사람들을 위해\regex_replace_all:nnN
l3kernel
귀하의 나이가 너무 많아서 을(를) 가질 수 없는 경우 \regex_replace_all:nnN
다음을 수행할 수 있습니다.
\cs_generate_variant:Nn \tl_replace_all:Nnn { Nno }
앞에 추가\cs_new_protected:Npn \millo_foreach_table_do_axis:nNn #1#2#3
;라인을 교체하다
\regex_replace_all:nnN { \c{myTable} } { \c{##1} } \l_tmpa_tl
~와 함께
\exp_args:NNno \tl_replace_all:Nno \l_tmpa_tl { \myTable } { \use:c {##1} }
그러면 작동해야합니다조건에\myTable
중괄호 안에는 사용하지 않습니다 . 예를 들어
\foreachTable{tabA, tabB}
{
...
}
{ \addplot[#1] table[x=x,y=y] \myTable; \addlegendentry{#1} }
대신에:
\foreachTable{tabA, tabB}
{
...
}
{ \addplot[#1] table[x=x,y=y] {\myTable}; \addlegendentry{#1} }