Использование результатов макросов против расширения макросов в PGFplotstable

Использование результатов макросов против расширения макросов в PGFplotstable

У меня есть следующие 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}

CSV-файл rawcutoffs.csv выглядит так:

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

Когда я пытаюсь использовать парсер команд, он не передает результаты парсера в команду paramOutput — вместо этого он передает сам код в paramOutput.Мне было интересно, есть ли способ использовать результаты парсера команд в качестве аргумента paramOutput?Когда я использую команду straighttext, она выдает мне нужный результат.

решение1

Проблема в том, что вывод в \parserнужно расширить, прежде чем вы передадите его в \pgfplotstabletypeset. Чтобы обойти это, я думаю, что самый простой способ — создать строку, называемую \specsниже, которая содержит «вывод» \parser, который вы затем принудительно расширяете, используя что-то вроде

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

Ниже я построил , \specsиспользуя\xapptoetoolbox-- он используется для добавления чего-либо к \specs. Я также переместил \parserкод внутрь \paramOutputи заставил \paramOutputпринимать список спецификаций, разделенных запятыми. Это не обязательно делать таким образом, но мне это кажется более естественным, поскольку \paramOutputтеперь строит \specs. Я также использовал \ifxдля сравнения строк (of \xto nor s), которое требует дополнительного \expandafterдля принудительного \xрасширения (по какой-то причине я стараюсь избегать \ifthenelse...).

С этими изменениями ваш 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}

Это дает, по моему мнению, желаемый результат:

введите описание изображения здесь

Связанный контент