%20Tabellenkalkulations%C3%A4hnliche%20Formeln.png)
Ich experimentiere derzeit mit den Paketen pgfplots und pgfplotstable. Die Möglichkeit, neue Spalten zu erstellen (durch Kopieren oder Transformieren einer anderen Spalte), ist mir aufgefallen, als ich mich fragte, ob es möglich ist, Formeln wie in Tabellenkalkulationen zu verwenden (d. h. der Wert jeder Zelle der neuen Spalte sollte der Wert der Zelle links davon (dieselbe Zeile) + der Wert der Zelle darüber (dieselbe Spalte) sein, und ja, es muss eine Initialisierung erfolgen).
Kennt jemand eine solche Funktion? Und wenn ja, wie geht das? (unabhängig davon, ob es nur pgfplotstable oder sogar pgfplots ist)
Antwort1
pgfplotstable
Dies kann mit einigen Einschränkungen mithilfe des Makros von erfolgen \pgfplotstablecreatecol
(auch mit , create on use
um die Spalte data verzögert zu erstellen, aber ihr Inhalt würde dann nach der Rückkehr von verloren gehen \pgfplotstabletypeset
). Laut der pgfplotstable
Dokumentation:
Derzeit können Sie nur auf drei Werte einer Spalte gleichzeitig zugreifen: die aktuelle Zeile, die vorherige Zeile und die nächste Zeile. Der Zugriff auf beliebige Indizes wird (noch) nicht unterstützt.
Im folgenden Beispiel habe ich die in der Frage beschriebene Formel implementiert und sie mit dem (beliebigen) Wert 100 in „Zeile -1“ initialisiert. Da die anfänglichen Tabellendaten wie folgt lauten:
x y
0 1
5 6
10 11
Die berechneten Werte sind:
1 + 100 = 101
6 + 101 = 107
11 + 107 = 118
Um auf zuvor berechnete Werte in der dynamisch erstellten Spalte zugreifen zu können, speichere ich diese global (hier: nur den zuletzt berechneten Wert, mit \xdef\myPreviousValue{...}
), da pgfplotstable
das \prevrow
Makro von anscheinend keinen Zugriff auf Werte aus der erstellten Spalte gewährt. Wenn der Zugriff aufbeliebigWenn in der zu erstellenden Spalte ein zuvor berechneter Wert gewünscht wird, könnte man beispielsweise ein pgfmath
Array 1 oder eine expl3
tl
ODER- Variable verwenden.seq
\begin{filecontents*}{data.csv}
x y
0 1
5 6
10 11
\end{filecontents*}
\documentclass{article}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\pgfplotsset{compat=1.16}
\pgfplotstableread[row sep=newline, col sep=space]{data.csv}\myTable
\newcommand*{\myPreviousValue}{100} % initialization (row -1, sort of)
% Dynamically create column z
\pgfplotstablecreatecol[
create col/assign/.code={%
\pgfmathsetmacro{\myValue}{int(\thisrow{y} + \myPreviousValue)}%
\pgfplotstableset{create col/next content/.expand once={\myValue}}%
\xdef\myPreviousValue{\myValue}%
}]
{z}\myTable
\begin{document}
\pgfplotstabletypeset[
columns/x/.style={column name={$x$}},
columns/y/.style={column name={$y$}},
columns/z/.style={column name={$z$}},
every head row/.style={before row=\toprule, after row=\midrule},
every last row/.style={after row=\bottomrule}
]{\myTable}
\end{document}
Hinweis: Das int()
in dem pgfmath
von mir verwendeten Ausdruck könnte unnötig erscheinen, da standardmäßig \pgfplotstabletypeset
Werte mit formatiert werden \pgfmathprintnumber
und, ebenfalls standardmäßig, \pgfmathprintnumber
erkennt, ob die Eingabe einen Bruchteil gleich Null hat, um das Drucken von Ganzzahlen als Sonderfall zu definieren. Beispielsweise \pgfmathprintnumber{118.0}
druckt standardmäßig 118. Ohne das würden int()
die in gespeicherten Werte \myValue
– und damit auch in der erstellten Speicherspalte und in \myPreviousValue
– jedoch ein abschließendes haben .0
; die Verwendung der int()
Funktion verhindert dies.
Fußnote
- Suche dasTikZ & PGF Handbuchfür „Array-Zugriffsoperatoren“ in derMathematische und objektorientierte EnginesTeil.