
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 \parser
es 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 \specs
a 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 \specs
usando \xappto
desde elcaja de herramientas- se usa para agregar cosas a \specs
. También moví el \parser
código adentro \paramOutput
y \paramOutput
acepté una lista de especificaciones separadas por comas. No es necesario hacerlo de esta manera, pero me parece más natural ya que \paramOutput
ahora se compila \specs
. También lo he usado \ifx
para la comparación de cadenas (de \x
to n
o s
), que requiere un extra \expandafter
para forzar \x
la 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: