없는 사람들을 위해\regex_replace_all:nnN

없는 사람들을 위해\regex_replace_all:nnN

읽고 플롯하고 싶은 테이블이 몇 개 있는데, 각 테이블에는 고유한 스타일이 있습니다. 편의상 동일한 태그를 사용하는 것이 좋습니다. 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에 오신 것을 환영합니다! 항상 가능한 한 가지:

  1. 원하는 방식으로 토큰 목록을 구성하는 매크로 작성(여기서는 일련의 \addplot명령을 적절한 옵션과 연결합니다)

  2. \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} }

관련 정보