Verwenden von \pgfplotstablesort mit einem dynamisch benannten Makro

Verwenden von \pgfplotstablesort mit einem dynamisch benannten Makro

Ich habe eine relativ große Anzahl von Datendateien, die ich einlesen muss \pgfplotstablesort, und in jedem Fall sollten die eingelesenen Daten einem Makro zugewiesen werden, um sie später in einem Diagramm verwenden zu können. Die Dateinamen folgen einem vorhersehbaren Muster, daher möchte ich ein Makro erstellen, das die Daten liest und sie einem Makro zuweist, dessen Name mit dem Dateinamen zusammenhängt. Bisher habe ich mit Folgendem gearbeitet:

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

Dies wird natürlich nicht kompiliert, da \pgfplotstablesortes das im ersten Argument nicht verarbeiten kann \csname. PDFLaTeX spuckt viele Fehler aus, beginnend mit Missing \begin{document}, und wird nie beendet. Ich weiß, dass das die Ursache des Problems ist, denn wenn ich diesen Makronamen manuell eingebe,

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

es funktioniert gut.

Also versuche ich es jetzt mit \expandafter, weil ich denke, dass es dazu führen wird, \csname...\endcsnamedass vorher erweitert wird \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
}

aber das ändert nichts. Ich vermute, das hat etwas mit der Definition von zu tun \pgfplotstablesort, vielleicht damit, wie es ein optionales Argument annehmen kann, aber ich komme nicht dahinter, wie ich es herausfinden kann.

Kann mir jemand zeigen, ob es eine Möglichkeit gibt, das, was ich versuche, zum Laufen zu bringen, und am besten erklären, warum mein \expandafterVersuch nicht funktioniert hat? Ich möchte dies als Gelegenheit nutzen, die Makroerweiterung besser zu verstehen und meine Datendateien tatsächlich zum Plotten laden zu können.


Komplettes MWE:

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

Antwort1

Ich vermute, dass

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

reicht aus, da \pgfplotstablesortein Makroname angezeigt wird.

Warum hat es bei Ihnen nicht \expandafterfunktioniert? Weil Sie versucht haben, eine Klammer zu erweitern. Wenn eine Klammer erforderlich ist (ich glaube nicht), verwenden Sie

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

Ich bin mir über die Rolle von nicht sicher \filenamepattern, aber das Makro gehört Ihnen.

verwandte Informationen