PGFplotstable에서 매크로 결과와 매크로 확장 사용

PGFplotstable에서 매크로 결과와 매크로 확장 사용

다음과 같은 MWE가 있습니다.

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{ifthen}

\newcommand*{\rightOutput}{%
    \pgfplotstableread[col sep = comma]{rawcutoffs.csv}\rawdata

    \pgfplotstabletypeset[%
        columns/LetterGrade/.style={string type,column type = l},
        columns/Average/.style={column type = r},
    ]{\rawdata}
}

\def\paramOutput#1{%
    \pgfplotstableread[col sep = comma]{rawcutoffs.csv}\rawdata

    \pgfplotstabletypeset[%
    #1
    ]{\rawdata}
}

\newcommand*{\parser}[1]{%
    \foreach \x/\y in {#1} {%
        \ifthenelse{\equal{n}{\x}}{columns/\y/.style={column type = r},}{columns/\y/.style={string type,column type = l},}%
    }%
}

\def\straighttext{%
    columns/LetterGrade/.style={string type,column type = l},
    columns/Average/.style={column type = r},
}

\begin{document}
%This macro is ultimately what I desire, and it works
\rightOutput

%This macro works, but it is not what I desire
\expandafter\paramOutput\expandafter{\straighttext}

%This macro doesn't work at all - WHY?
%\expandafter\paramOutput\expandafter{\parser{s/LetterGrade,n/Average}}
\end{document}

CSV 파일 rawcutoffs.csv는 다음과 같습니다.

LetterGrade,Average
A,90
B,80
C,70

명령 구문 분석기를 사용하려고 하면 구문 분석기의 결과가 paramOutput 명령에 공급되지 않고 대신 코드 자체가 paramOutput에 공급됩니다.paramOutput의 인수로 사용할 명령 구문 분석기의 결과를 얻을 수 있는 방법이 있는지 궁금합니다.Straighttext 명령을 사용하면 원하는 결과가 나옵니다.

답변1

문제는 에 출력을 \parser제공하기 전에 출력을 확장해야 한다는 것입니다 \pgfplotstabletypeset. 이 문제를 해결하기 위해 가장 쉬운 방법은 \specs의 "출력"을 포함하는 문자열을 작성하는 것입니다 \parser. 그런 다음 다음과 같은 것을 사용하여 강제로 확장합니다.

 \xdef\myplot{\noexpand\pgfplotstabletypeset[\specs]}

아래에서는 다음을 \specs사용하여 구축했습니다.\xapptoetoolbox-- 에 내용을 추가하는 데 사용됩니다 \specs. 또한 \parser코드를 내부로 옮기고 쉼표로 구분된 사양 목록을 허용하도록 \paramOutput만들었습니다 . \paramOutput이런 식으로 할 필요는 없지만 \paramOutput지금은 빌드 이후로 나에게 더 자연스러워 보입니다 \specs. 또한 \ifx문자열 비교(to \x또는 n) 에도 사용했는데 , 이는 강제로 확장하기 위해 s추가 항목이 필요합니다 (어떤 이유에서인지 나는 피하는 경향이 있습니다 ...).\expandafter\x\ifthenelse

이러한 변경으로 인해 MWE는 다음과 같이 됩니다.

\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{pgffor}
\usepackage{etoolbox}

\newcommand*{\rightOutput}{%
    \pgfplotstableread[col sep = comma]{rawcutoffs.csv}\rawdata%
    %
    \pgfplotstabletypeset[%
        columns/LetterGrade/.style={string type,column type = l},
        columns/Average/.style={column type = r},
    ]{\rawdata}
}

\def\paramOutput#1{%
    \pgfplotstableread[col sep = comma]{rawcutoffs.csv}\rawdata%
    \def\specs{}%
    \foreach \x/\y in {#1} {
      \expandafter\ifx\x n\xappto\specs{columns/\y/.style={column type = r},}%
      \else\xappto\specs{columns/\y/.style={string type,column type = l},}%
      \fi
    }%
    \xdef\myplot{\noexpand\pgfplotstabletypeset[\specs]}%
    \myplot{\rawdata}%
}

\begin{document}
    %This macro is ultimately what I desire, and it works
    \rightOutput

    %This macro now works!
    \paramOutput{s/LetterGrade,n/Average}
\end{document}

이것은 내가 원하는 결과를 제공합니다.

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

관련 정보