
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 \parser
precisa ser expandida antes de você entregá-la ao \pgfplotstabletypeset
. Para contornar isso, acho que a maneira mais fácil é construir uma string, chamada \specs
abaixo, que contenha a "saída" de \parser
, que você força a expandir usando algo como
\xdef\myplot{\noexpand\pgfplotstabletypeset[\specs]}
Abaixo eu construí \specs
usando \xappto
a partir doetoolbox- é usado para anexar coisas ao arquivo \specs
. Também movi o \parser
código para dentro \paramOutput
e \paramOutput
aceitei uma lista de especificações separadas por vírgulas. Não precisa ser feito desta forma, mas me parece mais natural, já que \paramOutput
agora é compilado \specs
. Também usei \ifx
para comparação de strings (de \x
to n
ou s
), que requer um extra \expandafter
para forçar \x
a 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: