Uso de resultados macro versus expansión macro en PGFplotstable

Uso de resultados macro versus expansión macro en PGFplotstable

Tengo el siguiente 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}

El archivo CSV rawcutoffs.csv tiene este aspecto:

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

Cuando intento utilizar el analizador de comandos, no introduce los resultados del analizador en el comando paramOutput; en cambio, introduce el código en sí en paramOutput.Tenía curiosidad por saber si hay alguna forma de hacer que los resultados del analizador de comandos se utilicen como argumento de paramOutput.Cuando uso el comando texto recto, me da el resultado que quiero.

Respuesta1

El problema es que \parseres necesario expandir la salida antes de entregársela a \pgfplotstabletypeset. Para solucionar esto, creo que la forma más sencilla es crear una cadena, llamada \specsa continuación, que contenga la "salida" de \parser, que luego se fuerza a expandir usando algo como

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

A continuación he construido \specsusando \xapptodesde elcaja de herramientas- se usa para agregar cosas a \specs. También moví el \parsercódigo adentro \paramOutputy \paramOutputacepté una lista de especificaciones separadas por comas. No es necesario hacerlo de esta manera, pero me parece más natural ya que \paramOutputahora se compila \specs. También lo he usado \ifxpara la comparación de cadenas (de \xto no s), que requiere un extra \expandafterpara forzar \xla expansión (por alguna razón tiendo a evitar \ifthenelse...).

Con estos cambios tu MWE pasa a ser:

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

Esto da lo que creo que es el resultado deseado:

ingrese la descripción de la imagen aquí

información relacionada