%20%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%95%B0%E5%BC%8F.png)
現在、pgfplots および pgfplotstable パッケージを試しています。スプレッドシートのような数式を使用できるかどうか疑問に思っていたところ、新しい列を作成できる (別の列をコピーまたは変換する) 可能性があることに気付きました (つまり、新しい列の各セルの値は、その左側のセル (同じ行) の値 + 上のセル (同じ列) の値になる必要があり、初期化が必要です)。
誰かそのような機能を知っていますか? もし知っているなら、これをどうやって行うのですか? (pgfplotstable だけか、pgfplots だけかに関係なく)
答え1
pgfplotstable
これは、のマクロを使用していくつかの制限付きで実行できます\pgfplotstablecreatecol
( を使用create on use
すると列データを遅延作成することもできますが、 から戻った後にその内容は失われます)。ドキュメント\pgfplotstabletypeset
によると、次のようになります。pgfplotstable
現在、一度にアクセスできるのは、1 つの列の 3 つの値(現在の行、前の行、次の行)のみです。任意のインデックスへのアクセスは (まだ) サポートされていません。
以下の例では、質問に記載されている数式を実装し、「行 -1」に(任意の)値 100 で初期化しました。初期のテーブル データは次のとおりです。
x y
0 1
5 6
10 11
計算された値は次のとおりです。
1 + 100 = 101
6 + 101 = 107
11 + 107 = 118
動的に作成される列の以前に計算された値にアクセスするために、それらをグローバルに保存します(ここでは、 マクロは作成される列の値にアクセスできないように見えるため、 マクロを使用して最後に計算された値のみ)\xdef\myPreviousValue{...}
。にアクセスすると、pgfplotstable
\prevrow
どれでも作成する列に以前に計算された値が必要な場合は、たとえばpgfmath
配列1またはexpl3
tl
or変数を使用できます。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}
注:使用した式int()
の は、デフォルトで がを使用して値をフォーマットし、またデフォルトでが入力の小数部がゼロであるかどうかを検出して整数の印刷を特別にするため、pgfmath
不要であるように見えるかもしれません。たとえば、はデフォルトで 118 を印刷します。ただし、 がないと、に格納されている値、したがって作成されたメモリ内列と に格納されている値には末尾に が付きます。関数を使用すると、これを防ぐことができます。\pgfplotstabletypeset
\pgfmathprintnumber
\pgfmathprintnumber
\pgfmathprintnumber{118.0}
int()
\myValue
\myPreviousValue
.0
int()
脚注
- 検索ティけZ & PGF マニュアル「配列アクセス演算子」については、数学およびオブジェクト指向エンジン一部。