使用 \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,但宏是你的。

相关内容