Usando \pgfplotstablesort con una macro con nombre dinámico

Usando \pgfplotstablesort con una macro con nombre dinámico

Tengo una cantidad moderadamente grande de archivos de datos que necesito leer \pgfplotstablesorty, en cada caso, los datos leídos deben asignarse a una macro para su uso posterior en un gráfico. Los nombres de los archivos siguen un patrón predecible, por lo que me gustaría crear una macro que lea los datos y los asigne a una macro cuyo nombre esté relacionado con el nombre del archivo. Hasta ahora he estado trabajando con esto:

\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}

Esto no se compila, por supuesto, porque \pgfplotstablesortno puede manejar \csnameel primer argumento. PDFLaTeX escupe muchos errores, comenzando con Missing \begin{document}y nunca termina. Sé que esa es la raíz del problema porque si pongo el nombre de esa macro manualmente,

\def\readdata#1#2#3#4{
 \def\filenamepattern##1{#1}
 \pgfplotstablesort{\testdatahimu}{\filenamepattern{#3}}
 \pgfplotstablesort{\testdatalomu}{\filenamepattern{#2}}
 % other stuff
}

funciona bien.

Así que ahora pruebo un \expandafter, pensando que hará \csname...\endcsnameque se expanda antes \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
}

pero eso no supone ningún cambio. Supongo que esto tiene algo que ver con la definición de \pgfplotstablesort, tal vez con cómo puede tomar un argumento opcional, pero me pierdo tratando de resolverlo.

¿Alguien puede mostrarme si hay alguna manera de hacer que lo que estoy tratando de hacer funcione y, preferiblemente, explicarme por qué lo \expandafterintenté no lo logró? Me gustaría aprovechar esto como una oportunidad para comprender mejor la expansión macro, además de poder cargar mis archivos de datos para trazar.


MWE completo:

\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}

Respuesta1

Supongo

\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}

servirá, ya que \pgfplotstablesortse le presentará un nombre de macro.

¿Por qué no funcionó \expandafter? Porque intentaste expandir un aparato ortopédico. Si es necesario un aparato ortopédico (no lo creo), use

\expandafter\pgfplotstablesort\expandafter{\csname #4himu\endcsname}{\filenamepattern{#3}}%

No estoy seguro de la función de \filenamepattern, pero la macro es tuya.

información relacionada