Verwenden von Makroergebnissen im Vergleich zur Makroerweiterung in PGFplotstable

Verwenden von Makroergebnissen im Vergleich zur Makroerweiterung in PGFplotstable

Ich habe folgendes 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}

Die CSV-Datei rawcutoffs.csv sieht folgendermaßen aus:

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

Wenn ich versuche, den Befehlsparser zu verwenden, speist er die Ergebnisse des Parsers nicht in den Befehl „paramOutput“ ein, sondern den Code selbst in „paramOutput“.Ich war neugierig, ob es eine Möglichkeit gibt, die Ergebnisse des Befehlsparsers als Argument für paramOutput zu verwenden?Wenn ich den Befehl „straighttext“ verwende, erhalte ich die gewünschte Ausgabe.

Antwort1

Das Problem besteht darin, dass die Ausgabe nach \parsererweitert werden muss, bevor Sie sie an weitergeben \pgfplotstabletypeset. Um dies zu umgehen, ist es meiner Meinung nach am einfachsten, einen String zu erstellen, \specsder unten aufgerufen wird und die „Ausgabe“ von enthält \parser. Diesen String müssen Sie dann mit etwas wie z. B. erweitern.

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

\specsNachfolgend habe ich \xapptoaus demAbonnieren-- es wird verwendet, um Dinge anzuhängen . Ich habe den Code \specsauch nach innen verschoben und dafür gesorgt, dass eine durch Kommas getrennte Liste von Spezifikationen akzeptiert wird. Es muss nicht so gemacht werden, aber es erscheint mir natürlicher, da jetzt Builds erstellt werden . Ich habe es auch für den String-Vergleich (von zu oder ) verwendet , was ein zusätzliches erfordert, um die Erweiterung zu erzwingen (aus irgendeinem Grund vermeide ich es normalerweise ...).\parser\paramOutput\paramOutput\paramOutput\specs\ifx\xns\expandafter\x\ifthenelse

Mit diesen Änderungen wird Ihr 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}

Dies führt meiner Meinung nach zum gewünschten Ergebnis:

Bildbeschreibung hier eingeben

verwandte Informationen