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

相關內容