在 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使用\xappto电子工具箱-- 它用于将内容附加到\specs。我还将\parser代码移到了里面\paramOutput,并使其\paramOutput接受以逗号分隔的规范列表。它不需要这样做,但对我来说似乎更自然,因为\paramOutput现在构建了\specs。我还将其\ifx用于字符串比较(\x或),这需要额外的强制扩展(出于某种原因n,我倾向于避免...)。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}

这给出了我认为所需的输出:

在此处输入图片描述

相关内容