
У меня есть следующие 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
etoolbox-- он используется для добавления чего-либо к \specs
. Я также переместил \parser
код внутрь \paramOutput
и заставил \paramOutput
принимать список спецификаций, разделенных запятыми. Это не обязательно делать таким образом, но мне это кажется более естественным, поскольку \paramOutput
теперь строит \specs
. Я также использовал \ifx
для сравнения строк (of \x
to n
or 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}
Это дает, по моему мнению, желаемый результат: