# expl3
Mit dem `l3file`-Modul aus `expl3` (geladen von `xparse` im MWE) lässt sich eine Datei leicht Zeilenweise einlesen. Man sollte dabei bedenken, dass der Inhalt der Zeilen von TeX expandiert wird, also wenn z.B. irgendwo `%` steht wird der Rest der Zeile ignoriert.
\documentclass[tikz]{standalone}
\usepackage{pgfplots,xparse}
\begin{filecontents*}{\jobname.dat}
aaa
bbb
ccc
***
ddd
\end{filecontents*}
\ExplSyntaxOn
\int_new:N \l_ross_linecount_int
\ior_new:N \l_ross_infile_stream
\cs_new_protected:Npn \ross_getline:nn #1#2
{
\int_set:Nn \l_ross_linecount_int { 1 }
\ior_open:Nn \l_ross_infile_stream { #1 }
\ior_map_inline:Nn \l_ross_infile_stream
{
\int_compare:nT { \l_ross_linecount_int == #2 } { ##1 }
\int_incr:N \l_ross_linecount_int
}
\ior_close:N \l_ross_infile_stream
}
\NewDocumentCommand \RowOfFile { m m }
{
\ross_getline:nn { #1 } { #2 }
}
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=2,ymin=0,ymax=2]
\node at (axis cs:1,1) {\RowOfFile{\jobname.dat}{4}};
\end{axis}
\end{tikzpicture}
\end{document}
> ![alt text][1]
# LuaTeX
Mit dem `io`-Modul von Lua kann man auch Dateien einlesen.
\documentclass[tikz]{standalone}
\usepackage{pgfplots,luacode}
\begin{filecontents*}{\jobname.dat}
aaa
bbb
ccc
***
ddd
\end{filecontents*}
\begin{luacode*}
function getline(filename, lineno)
linecount = 0
fp = io.open(filename)
while true do
linecount = linecount + 1
line = fp:read()
if line == nil then
break
end
if lineno == linecount then
return tex.sprint(line)
end
end
end
\end{luacode*}
\DeclareRobustCommand\RowOfFile[2]{\directlua{getline("#1",#2)}}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=2,ymin=0,ymax=2]
\node at (axis cs:1,1) {\RowOfFile{\jobname.dat}{4}};
\end{axis}
\end{tikzpicture}
\end{document}
# plain TeX
Man kann eine Datei auch nur mit plain-TeX-Makros einlesen. Diese Definition von `\RowOfFile` ist auch LaTeX-kompatibel.
\input pgfplots.tex
% Allocate handles
\newwrite\outfile
\newread\infile
\newcount\lineno
% Write dummy data
\immediate\openout\outfile=\jobname.dat
\immediate\write\outfile{aaa}
\immediate\write\outfile{bbb}
\immediate\write\outfile{ccc}
\immediate\write\outfile{***}
\immediate\write\outfile{ddd}
\immediate\closeout\outfile
\def\RowOfFile#1#2{%
\lineno=0
\openin\infile=#1
\loop\ifnum\lineno<#2
\read\infile to \curline%
\advance\lineno by 1
\repeat%
\closein\infile%
\curline
}
\tikzpicture
\axis[xmin=0,xmax=2,ymin=0,ymax=2]
\node at (axis cs:1,1) {\RowOfFile{\jobname.dat}{4}};
\endaxis
\endtikzpicture
\bye
# LaTeX
Eigentlich ist das nur eine Kopie der obigen plain-TeX-Definition, wobei einige Makros durch dokumentierte LaTeX-Makros ersetzt wurden, z.B. `\def` -> `\newcommand`.
\documentclass[tikz]{standalone}
\usepackage{pgfplots,xparse}
\begin{filecontents*}{\jobname.dat}
aaa
bbb
ccc
***
ddd
\end{filecontents*}
\newread\infile
\newcounter{lineno}
\newcommand\RowOfFile[2]{%
\setcounter{lineno}{0}
\openin\infile=#1
\loop\ifnum\arabic{lineno}<#2
\read\infile to \curline%
\stepcounter{lineno}
\repeat%
\closein\infile%
\curline
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=2,ymin=0,ymax=2]
\node at (axis cs:1,1) {\RowOfFile{\jobname.dat}{4}};
\end{axis}
\end{tikzpicture}
\end{document}
# pgfplotstable
Bei der Benutzung von `pgfplotstable`ist zu Beachten, dass `table/header=false` gesetzt ist, sonst wird die erste Zeile als Spaltenname interpretiert.
\documentclass[tikz]{standalone}
\usepackage{pgfplots,pgfplotstable,xparse}
\begin{filecontents*}{\jobname.dat}
aaa
bbb
ccc
***
ddd
\end{filecontents*}
\pgfplotsset{table/header=false}
\newcommand\RowOfFile[2]{
\pgfplotstableread{#1}\loadedtable
\pgfplotstablegetelem{\numexpr#2-1\relax}{[index]0}\of\loadedtable
\pgfplotsretval
}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xmin=0,xmax=2,ymin=0,ymax=2]
\node at (axis cs:1,1) {\RowOfFile{\jobname.dat}{4}};
\end{axis}
\end{tikzpicture}
\end{document}
[1]: http://texwelt.de/wissen/upfiles/u_179.png