%20%EA%B3%B5%EC%8B%9D%EA%B3%BC%20%EA%B0%99%EC%9D%80%20%EC%8A%A4%ED%94%84%EB%A0%88%EB%93%9C%EC%8B%9C%ED%8A%B8.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
또는 변수를 사용할 수 있습니다.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()
표현식의 은 기본적으로 정수 인쇄를 특수하게 처리하기 위해 입력에 0과 같은 소수 부분이 있는지를 pgfmath
기본적으로 감지 하고 다시 기본적으로 \pgfplotstabletypeset
값의 형식을 지정하기 때문에 불필요한 것처럼 보일 수 있습니다. 예를 들어 기본적으로 118을 인쇄합니다. 그러나 가 없으면 —및 생성된 메모리 내 열과 — 에 저장된 값에는 ; 기능 을 사용하면 이를 방지할 수 있습니다.\pgfmathprintnumber
\pgfmathprintnumber
\pgfmathprintnumber{118.0}
int()
\myValue
\myPreviousValue
.0
int()
각주
- 검색티케이Z & PGF 매뉴얼"배열 액세스 연산자"에 대한수학 및 객체 지향 엔진부분.