Использование \pgfplotstablesort с динамически именованным макросом

Использование \pgfplotstablesort с динамически именованным макросом

У меня есть довольно большое количество файлов данных, которые мне нужно считать с помощью \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, но макрос ваш.

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