
Tengo una cantidad moderadamente grande de archivos de datos que necesito leer \pgfplotstablesort
y, 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 \pgfplotstablesort
no puede manejar \csname
el 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...\endcsname
que 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 \expandafter
intenté 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 \pgfplotstablesort
se 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.