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もの\xapptoで、ツールボックス-- は に内容を追加するために使用されます。また、内部のコード\specsを移動し、 がコンマで区切られた仕様のリストを受け入れるようにしました。この方法で行う必要はありませんが、 がビルドされるようになったため、この方法の方が自然に思えます。また、 と の文字列比較 (またはと)にも を使用しましたが、これには強制的に展開するための追加の が必要です (何らかの理由で、私は ... を避ける傾向があります)。\parser\paramOutput\paramOutput\paramOutput\specs\ifx\xns\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}

これは私が望む出力だと考えるものを与えます:

ここに画像の説明を入力してください

関連情報