Hi, ich versuche eine Kopfzeile für eine Tabelle aus einer Datei einzulesen. Diese soll sich aus beliebig vielen Einträgen zusammensetzen und jeweils über (erstmal) zwei Spalten zentriert sein. Folgendes habe ich bereits versucht:

\documentclass{scrartcl}

\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}

\pgfplotstableread{%
A   B   C   D   a   b
2.3 3.1 2.9 3.3 OP1 OP2
3.2 2.7 2.6 3.4 5   2
3.4 2.8 2.9 3.1 a   b
}\loadedtable

\begin{document}

\pgfplotstabletypeset[%% So soll die Tabelle aussehen
    columns={A,B,C,D},
  every head row/.style={before row={\multicolumn{2}{c}{OP1}&\multicolumn{2}{c}{OP2}\\}},
]\loadedtable

\makeatletter
\pgfplotstablegetelem{1}{[index]4}\of{\loadedtable}%
\edef\sudo@number@OP{\pgfplotsretval}%
\pgfplotstablegetelem{0}{[index]4}\of{\loadedtable}%
\edef\sudo@table@head{\noexpand\multicolumn{2}{c}{\pgfplotsretval}}%
\pgfplotsforeachungrouped\i in {5,...,\sudo@number@OP}{%
\pgfplotstablegetelem{0}{[index]\i}\of{\loadedtable}%
    \edef\sudo@table@head{\sudo@table@head&\noexpand\multicolumn{2}{c}{\pgfplotsretval}}% Hier gibt es Fehler
}%
\edef\sudo@table@head{\sudo@table@head\\}% Hier gibt es Fehler
\edef\sudo@temp{%
  \noexpand\pgfplotstableset{%
      sudo table head/.style={every head row/.style={before row={\sudo@table@head}},}%  Hier gibt es Fehler
  }%
}%
\sudo@temp
\makeatother
%
\pgfplotstabletypeset[
    columns={A,B,C,D},
    sudo table head,
]\loadedtable

\end{document}

Es gibt aber immer Fehler da die \multicolumn-Anweisungen nicht zu früh expandiert werden dürfen. Wenn man die Zeilen mit Hier gibt es Fehler sowie den sudo table head-Stil auskommentiert läuft LaTeX erstmal durch, erstellt aber natürlich nicht die richtig formatierte Tabelle.

Ich hab auch schon mal versucht die Kopfzeile - also \multicolumn{2}{c}{OP1}&\multicolumn{2}{c}{OP2}\\ komplett in der Datei bereit zu stellen und einzulesen.

\documentclass{scrartcl}

\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}

\pgfplotstableread{%
A     B   C   D   a   b
2.3 3.1 2.9 3.3 OP1 OP2
3.2 2.7 2.6 3.4 5   2
3.4 2.8 2.9 3.1 \multicolumn{2}{c}{OP1}&\multicolumn{2}{c}{OP2}\\ b
}\loadedtable

\makeatletter
\pgfplotstablegetelem{2}{[index]4}\of{\loadedtable}%
\def\sudo@temp{%
    \noexpand\pgfplotstableset{%
            sudo table head/.style={every head row/.style={before row={\pgfplotsretval}},}%  Hier gibt es Fehler
    }%
}%
\sudo@temp
\makeatother

\begin{document}
\pgfplotstabletypeset[
    columns={A,B,C,D},
    sudo table head,
]\loadedtable
\end{document}

Es geht darum eine spezielle Vorlage zu erstellen, bei der nur noch eine externe Datei geladen werden muss und der Rest automatisch erstellt wird.

gefragt 04 Sep '13, 10:51

sudo's gravatar image

sudo
2.0k51421
Akzeptiert-Rate: 39%

bearbeitet 04 Sep '13, 18:10

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815

Bei dem Beispiel sollen nur OP1 und OP2 ausgelesen und vor die eigentliche Kopfzeile gesetzt werden. Die 5 ist dafür da, dass die For-Schleife weiß wieviele Einträge zu verarbeiten sind. Die Einträge a, b, 2 und das letzte b sind nur dafür da, die Tabelle zu füllen, damit pgfplotstable keine Warnung ausgibt. Tut mir leid, wenn das verwirrt.

Lasse ich das \noexpand weg, kommen zwar keine LaTeX-Fehler, aber ich bekomme auch nicht das gewünschte Ergebnis. Wahrscheinlich wird \pgfplotsretval schon wieder intern überschrieben. Hätte also doch ein \edef sein müssen.

(04 Sep '13, 12:06) sudo

Ich habe nun eine Lösung gefunden.

\documentclass{scrartcl}

\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}

\pgfplotstableread{%
A     B   C   D   a   
2.3 3.1 2.9 3.3 OP1 
3.2 2.7 2.6 3.4 OP2 
3.4 2.8 2.9 3.1 \noexpand\multicolumn{2}{c}{OP1}&\noexpand\multicolumn{2}{c}{OP2}\noexpand\\
}\loadedtable

\pgfplotstablegetelem{2}{[index]4}\of{\loadedtable}% oder "a" statt "[index]4"
    \pgfplotstableset{%
            sudo table head/.estyle={every head row/.style={before row={\pgfplotsretval}}}%
    }%

\begin{document}
\pgfplotstabletypeset[
    columns={A,B,C,D},
    sudo table head,
]\loadedtable
\end{document}

Zeigt genau die Tabelle die ich wollte. Der Trick ist, die \noexpands mit in die Tabelle zu schreiben. Der estyle aus Qrrbrbirlbels Antwort spart auf jeden Fall ein paar Zeilen Code und macht das ganze übersichtlicher.

Permanenter link

beantwortet 04 Sep '13, 12:39

sudo's gravatar image

sudo
2.0k51421
Akzeptiert-Rate: 39%

Wenn ich die Frage richtig verstanden habe, willst du einfach die ersten Werte aus der Spalte a und b (bzw. aus der vierten und fünften Spalte) also zweispaltiges Zelle über der ganzen Tabelle haben.

Der handler .estyle wird dabei verwendet, um die Macros \pgfplotstable@a und \pgfplotstable@b zu expandieren, bevor der Style definiert wird. Die Macros \multicolumn sowie \\ müssen dafür mit einem \noexpand geschützt werden.

Code

\documentclass{scrartcl}

\usepackage{pgfplotstable}
\pgfplotsset{compat=1.8}

\pgfplotstableread{%
A     B   C   D   a   b
2.3 3.1 2.9 3.3 OP1 OP2
3.2 2.7 2.6 3.4 5 2
3.4 2.8 2.9 3.1 a b
}\loadedtable

\makeatletter
\pgfplotstablegetelem{0}{a}\of\loadedtable% oder "[index]4" statt "a"
\let\pgfplotstable@a\pgfplotsretval
\pgfplotstablegetelem{0}{b}\of\loadedtable% oder "[index]5" statt "b"
\let\pgfplotstable@b\pgfplotsretval
\pgfplotstableset{
  sudo table head/.estyle={
    every head row/.style={
      before row={\noexpand\multicolumn{2}{c}{\pgfplotstable@a} &
                  \noexpand\multicolumn{2}{c}{\pgfplotstable@b} \noexpand\\}}}}
\makeatother

\begin{document}
\pgfplotstabletypeset[
    columns={A,B,C,D},
    sudo table head,
]\loadedtable
\end{document}

Resultat

alt text

Permanenter link

beantwortet 04 Sep '13, 11:56

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

bearbeitet 04 Sep '13, 11:57

Schon mal danke für deine Mühe. Allerdings hätte ich gern die Möglichkeit in der Tabelle zu sagen, es sind 2, 3 oder 12 Einträge (OPs) die ich so über die Tabelle schreiben möchte.

(04 Sep '13, 12:21) sudo

@sudo Es wäre vielleicht effizienter eine zweite (Meta-)Datei zu verwenden, die diese Information enthält?

Eventuell ist es auch möglich, diese Meta-Information in einer einzigen Zeile der eigentlichen Datei zu verwenden, wobei diese dann zweimal eingelesen wird:

  1. Einmal für die Meta-Information, wobei alle anderen Daten ignoriert werden.
  2. Einmal für die eigentlichen Daten, wobei die Meta-Zeile(n) ignoriert werden.

Ob das so einfach geht, müsste ich aber auch erstmal testen …

(04 Sep '13, 12:32) Qrrbrbirlbel

Ich wollte schon nur eine Datei haben. Ein oder zwei Spalten sind für die Meta-Daten, die anderen enthalten den eigentlichen Inhalt.

Mit dem getrennten einlesen hatte ich auch überlegt, bin dann aber doch bei dieser Variante hängengeblieben. Wenn du da eine schöne Sache findest, würde mich das aber durchaus interessieren.

(04 Sep '13, 12:44) sudo
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×39
×7

gestellte Frage: 04 Sep '13, 10:51

Frage wurde gesehen: 11,053 Mal

zuletzt geändert: 04 Sep '13, 18:10