pgfplotstable:讀取 gnuplot 產生的表格並排版

pgfplotstable:讀取 gnuplot 產生的表格並排版

我是新來的pgfplotstable,我正在嘗試閱讀gnuplot導出的表在pgfplotstable.

gnuplot 腳本:

set samples 91
set table "file.dat"
set angles degrees
plot [0:90] sin(x),cos(x),tan(x);
unset table

gnuplot 表file.dat如下(簡潔起見,給 5 點):

# Curve 0 of 3, 91 points
# Curve title: "sin(x)"
# x y type
 0  0  i
 1  0.0174524  i
 2  0.0348995  i
 3  0.052336  i
 4  0.0697565  i
 5  0.0871557  i

# Curve 1 of 3, 91 points
# Curve title: "cos(x)"
# x y type
 0  1  i
 1  0.999848  i
 2  0.999391  i
 3  0.99863  i
 4  0.997564  i
 5  0.996195  i

# Curve 2 of 3, 91 points
# Curve title: "tan(x)"
# x y type
 0  0  i
 1  0.0174551  i
 2  0.0349208  i
 3  0.0524078  i
 4  0.0699268  i
 5  0.0874887  i

注意:與上述情況(所有資料按順序排列)相比,可以讀取下面給出的表頭和格式(所有資料按列排列)

# A B C 
  1 2 3 
  4 5 7
  8 9 10

問題

是否可以pgfplotstable透過\pgfplotstableset{}gnuplot 或任何其他解決方法讀取自訂格式的 ASCII 文件,以使其能夠很好地讀取並在 中排版pgfplotstable

答案1

最初我以為你想繪製數據,但再次閱讀你的問題,你似乎只是想將其設置為表格,使用pgfplotstable你可以做這樣的事情,儘管我不確定pgfplotstable在這種情況下是否真的有幫助,當你'已經重新安排了要讀取的數據,\pgfplotstabletypeset您可以簡單地將其寫為 a longtable,但是...

在此輸入影像描述

[更新非整數第一列]

\documentclass{article}
\usepackage{pgfplotstable,longtable,array}

\begin{document}
\makeatletter

\def\loopb#1\repeatb{\def\iterateb{#1\relax\expandafter\iterateb\fi}%
  \iterateb \let\iterateb\relax}
\let\repeatb\fi

\begingroup

\count@\z@
\catcode`\#12
\catcode`\*=6

\def\tstrelax{\relax}
\def\tsti{i}

\def\ca*1# Curve*2 of *3,*4 points*5!!{%
  \def\cnum{*2}\def\ctot{*3}\def\cpoints{*4}}

\def\cb*1# Curve title: "*2"*3!!{%
  \def\title{*2}}

\def\cc*1 *2 *3 *4!!{%
\def\x{*1}\def\y{*2}\def\ci{*3}}

\newread\myin
\openin\myin=file.dat

\@tempcnta\z@

\loop
\ifeof\myin\else
\read\myin to \tmp
\expandafter\ifx\expandafter\par\tmp
\else
  \expandafter\cb\tmp# Curve title: "\relax"!!%
  \ifx\title\tstrelax
    \expandafter\ca\tmp# Curve of \relax, points!!%
    \ifx\ctot\tstrelax
      \expandafter\cc\tmp. . . !!%
      \ifx\ci\tsti
        \expandafter\edef\csname my-\the\@tempcnta-\the\@tempcntb\endcsname{\ifnum\@tempcnta=1 \x\space\fi\y}
        \advance\@tempcntb\@ne
 \fi
    \else
      \let\total\ctot
      \let\points\cpoints
      \advance\@tempcnta\@ne
      \@tempcntb\z@
    \fi
  \else
    \expandafter\let\csname my-\the\@tempcnta-title\endcsname\title
  \fi
\fi
\repeat

{\let\\\relax

\gdef\mytable{}
\gdef\row{x}
\@tempcnta\z@
\loop
\advance\@tempcnta\@ne
\xdef\row{\row\space \csname my-\the\@tempcnta-title\endcsname}
\ifnum\@tempcnta<\total
\repeat
\xdef\mytable{\row\space\\\space}

\@tempcntb\z@
\loopb
\xdef\row{}
\@tempcnta\z@
\loop
\advance\@tempcnta\@ne
\xdef\row{\row\space \csname my-\the\@tempcnta-\the\@tempcntb\endcsname}
\ifnum\@tempcnta<\total
\repeat
\xdef\mytable{\mytable\row\space\\\space}
\advance\@tempcntb\@ne
\ifnum\@tempcntb<\points
\repeatb

\show\mytable
\xdef\tmp{\noexpand\pgfplotstabletypeset[row sep=\noexpand\\, begin table=\noexpand\begin{longtable}, 
end table=\noexpand\end{longtable}
sci,precision=5]{\mytable}}
}



\endgroup

\tmp

\end{document}

答案2

雖然不像上面那樣是一個很好的低級 TeX 答案,但令人驚訝的是之前被忽視了,今天發現使用 pgfplotstable 選項ignore chars={\i}讀取兩列的完整gnuplot表格並file.datselect equal part entry of將兩列重新排列成 3 列的相等行。但找不到 pgfplotstable 選項來自動讀取多個標題(“sin(x)”、“cos(x)”和“tan(x)”)。

在此輸入影像描述

\documentclass[12pt]{article}
\usepackage{pgfplotstable}
\pgfplotsset{compat=newest}
\usepackage{booktabs}
\usepackage{colortbl}
\usepackage{longtable}
\pgfplotstableset{begin table=\begin{longtable},end table=\end{longtable},%
every head row/.style={before row=\toprule,after row=\midrule},%
every last row/.style={after row=\bottomrule},%
every even row/.style={before row={\rowcolor[gray]{.8}}}%
}
\begin{document}
\pgfplotstabletypeset[columns={0,1,1,1},%
display columns/0/.style={select equal part entry of={0}{3},column name=$x$},%
display columns/1/.style={select equal part entry of={0}{3},column name=$sin(x)$},%
display columns/2/.style={select equal part entry of={1}{3},column name=$cos(x)$},%
display columns/3/.style={select equal part entry of={2}{3},column name=$tan(x)$},%
precision=5,ignore chars={\i}]{file.dat}
\end{document}

相關內容