Usando resultados macro versus expansão macro em PGFplotstable

Usando resultados macro versus expansão macro em PGFplotstable

Tenho o seguinte 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}

O arquivo CSV rawcutoffs.csv se parece com:

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

Quando tento usar o analisador de comando, ele não alimenta os resultados do analisador no comando paramOutput - em vez disso, ele alimenta o próprio código no paramOutput.Fiquei curioso para saber se existe uma maneira de fazer com que os resultados do analisador de comando sejam usados ​​​​como argumento de paramOutput.Quando uso o comando texto simples, ele me dá a saída que desejo.

Responder1

O problema é que a saída \parserprecisa ser expandida antes de você entregá-la ao \pgfplotstabletypeset. Para contornar isso, acho que a maneira mais fácil é construir uma string, chamada \specsabaixo, que contenha a "saída" de \parser, que você força a expandir usando algo como

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

Abaixo eu construí \specsusando \xapptoa partir doetoolbox- é usado para anexar coisas ao arquivo \specs. Também movi o \parsercódigo para dentro \paramOutpute \paramOutputaceitei uma lista de especificações separadas por vírgulas. Não precisa ser feito desta forma, mas me parece mais natural, já que \paramOutputagora é compilado \specs. Também usei \ifxpara comparação de strings (de \xto nou s), que requer um extra \expandafterpara forçar \xa expansão (por algum motivo, costumo evitar \ifthenelse...).

Com essas mudanças seu MWE se torna:

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

Isso fornece o que considero ser a saída desejada:

insira a descrição da imagem aqui

informação relacionada