%20%E9%A1%9E%E4%BC%BC%E5%85%AC%E5%BC%8F%E7%9A%84%E9%9B%BB%E5%AD%90%E8%A1%A8%E6%A0%BC.png)
我目前正在嘗試 pgfplots 和 pgfplotstable 軟體包。當我想知道是否可以使用類似公式的電子表格時,我注意到可以創建新列(複製或轉換另一列)(這意味著新列的每個單元格的值應該是其左側單元格的值(同一行)+上面單元格的值(同一列),是的,必須進行一些初始化)。
有人知道這樣的功能嗎?如果是的話該怎麼做? (無論它只是 pgfplotstable 還是 pgfplots)
答案1
pgfplotstable
這可以使用的巨集來完成,但有一些限制\pgfplotstablecreatecol
(也create on use
可以延遲創建列數據,但從 返回後其內容將丟失\pgfplotstabletypeset
)。根據pgfplotstable
文件:
目前,您一次只能存取一列的三個值:目前行、上一行和下一行。 (尚)不支援存取任意索引。
在下面的範例中,我實作了問題中描述的公式,並在「row -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
可能看起來是不必要的,因為預設情況下,\pgfplotstabletypeset
使用 and 格式化值\pgfmathprintnumber
,同樣預設情況下,\pgfmathprintnumber
偵測輸入的小數部分是否等於零,以便在特殊情況下列印整數。例如,\pgfmathprintnumber{118.0}
預設列印 118。但是,如果沒有int()
,儲存在中的值\myValue
(以及創建的記憶體列和 in 中\myPreviousValue
)將有一個尾隨.0
;使用該int()
功能可以防止這種情況發生。
註腳
- 搜尋鈦kZ 和 PGF 手冊對於“數組訪問運算符”數學和物件導向的引擎部分。