動的に命名されたマクロで \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私が試してもうまくいかなかった理由を説明してくれる人はいますか? これを機会に、マクロの展開をより深く理解し、さらにプロット用にデータ ファイルを実際にロードできるようにしたいと思います。


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}

答え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が、マクロはあなたのものです。

関連情報