
У меня есть довольно большое количество файлов данных, которые мне нужно считать с помощью \pgfplotstablesort
, и в каждом случае считанные данные должны быть назначены макросу для последующего использования в графике. Имена файлов следуют предсказуемому шаблону, поэтому я хотел бы создать макрос, который считывает данные и назначает их макросу, имя которого связано с именем файла. До сих пор я работал с этим:
\def\readdata#1#2#3#4{
\def\filenamepattern##1{#1}
\pgfplotstablesort{\csname #4himu\endcsname}{\filenamepattern{#3}}
\pgfplotstablesort{\csname #4lomu\endcsname}{\filenamepattern{#2}}
% other stuff
}
\readdata{testfile#1.dat}{10}{50}{testdata}
Это, конечно, не компилируется, потому что \pgfplotstablesort
не может обработать \csname
в первом аргументе. PDFLaTeX выдает кучу ошибок, начиная с Missing \begin{document}
, и никогда не завершается. Я знаю, что это корень проблемы, потому что если я вручную введу это имя макроса,
\def\readdata#1#2#3#4{
\def\filenamepattern##1{#1}
\pgfplotstablesort{\testdatahimu}{\filenamepattern{#3}}
\pgfplotstablesort{\testdatalomu}{\filenamepattern{#2}}
% other stuff
}
работает отлично.
Итак, теперь я пробую \expandafter
, думая, что это приведет \csname...\endcsname
к расширению до \pgfplotstablesort
:
\def\readdata#1#2#3#4{
\def\filenamepattern##1{#1}
\expandafter\pgfplotstablesort{\csname #4himu\endcsname}{\filenamepattern{#3}}
\expandafter\pgfplotstablesort{\csname #4lomu\endcsname}{\filenamepattern{#2}}
% other stuff
}
но это ничего не меняет. Думаю, это как-то связано с определением \pgfplotstablesort
, возможно, с тем, как оно может принимать необязательный аргумент, но я теряюсь, пытаясь это понять.
Может ли кто-нибудь показать мне, есть ли способ заставить то, что я пытаюсь сделать, работать, и желательно объяснить, почему то, что \expandafter
я пытался сделать, не дало результата? Я хотел бы использовать это как возможность лучше понять макрорасширение, в дополнение к тому, чтобы иметь возможность загружать мои файлы данных для построения графиков.
Полная МВЭ:
\documentclass{article}
\usepackage{filecontents,pgfplots,pgfplotstable}
\begin{filecontents*}{testfile10.dat}
pT Y mu2 lomean lostddev loerrbound nlomean nlostddev nloerrbound
0.35 2.2 10 2.8920929e+00 0 1.7555822e-04 1.1823986e+00 1.6578794e-01 6.7619291e-02
\end{filecontents*}
\begin{filecontents*}{testfile50.dat}
pT Y mu2 lomean lostddev loerrbound nlomean nlostddev nloerrbound
0.35 2.2 10 2.8920929e+00 0 1.7555822e-04 1.1823986e+00 1.6578794e-01 6.7619291e-02
\end{filecontents*}
\def\readdata#1#2#3#4{
\def\filenamepattern##1{#1}
\pgfplotstablesort{\csname #4himu\endcsname}{\filenamepattern{#3}}
\pgfplotstablesort{\csname #4lomu\endcsname}{\filenamepattern{#2}}
% other stuff
}
\readdata{testfile#1.dat}{10}{50}{testdata}
\begin{document}
\begin{tikzpicture}
\begin{axis}[ymode=log]
\addplot table[x=pT,y=lomean] {\testdatahimu};
\addplot table[x=pT,y=lomean] {\testdatalomu};
\end{axis}
\end{tikzpicture}
\end{document}
решение1
я думаю что
\newcommand\readdata[4]{%
\def\filenamepattern##1{#1}%
\expandafter\pgfplotstablesort\csname #4himu\endcsname{\filenamepattern{#3}}%
\expandafter\pgfplotstablesort\csname #4lomu\endcsname{\filenamepattern{#2}}%
% other stuff
}
\readdata{testfile#1.dat}{10}{50}{testdata}
будет выполнено, так как \pgfplotstablesort
будет представлено имя макроса.
Почему у вас не получилось \expandafter
? Потому что вы пытались расширить скобку. Если скобка необходима (я так не думаю), используйте
\expandafter\pgfplotstablesort\expandafter{\csname #4himu\endcsname}{\filenamepattern{#3}}%
Я не уверен насчет роли \filenamepattern
, но макрос ваш.