我想使用siunitx
包来合并来自外部文件的数据/不确定性对(使用如图所示的精度和舍入选项)。
def
如果使用硬编码数字初始化或从表中读取( ),则变量的内容(均使用定义)似乎有所不同pgfplotstable
;因为后者破坏了代码(参见最后一行注释)。
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\sisetup{drop-zero-decimal,round-mode=uncertainty,round-precision=1,uncertainty-mode=separate}
\begin{document}
\pgfplotstableread{
x dx
10.1 0.02
21.2 4.1
32.3 0.6
}\loadedtable
%\pgfplotstabletypeset[columns={x,dx}]\loadedtable
\vspace{1cm}
\def\varTableA{\pgfplotstablegetelem{0}{x}\of{\loadedtable}\pgfplotsretval}
\def\varTableB{\pgfplotstablegetelem{0}{dx}\of{\loadedtable}\pgfplotsretval}
\def\varA{10.1}
\def\varB{0.02}
% What I would like to do, using values obtained from a table (external file) instead of hard coded values.
\num{10.1 +- 0.02} \\ % Gives the desired output
\num{\varA +- \varB} % Gives the desired output
% One verifies that the variables contain the correct value -> all good
\varA \qquad \varTableA \\ % Gives 10.1 and 10.1
\varB \qquad \varTableB \\ % Gives 0.02 and 0.02
% Using `parse-numbers=false` is not an option
%\num{\varTableA +- \varTableB} % Doesn't work
\end{document}
答案1
(La)TeX 不是一种编程语言,
\def\macro{\pgfplotstablegetelem{0}{x}\of{\loadedtable}}
% or even
\def\macro{\pgfplotstablegetelem{0}{x}\of{\loadedtable}\pgfplotsretval}
不同于
double variable = myTable.getRow(0).getColumn("x").getValue();
您通常不能将宏\def
或\edef
某些东西排版到页面上,然后假设所述宏只是该输出的文本。
线路
\pgfplotstablegetelem{0}{x}\of{\loadedtable}\pgfplotsretval
做两件不同的事情:
只是
\pgfplotstablegetelem{0}{x}\of{\loadedtable}
定义为行和列
\pgfplotsretval
的内容(此处)。0
x
10.1
然后你打电话
\pgfplotsretval
并将其内容扩展。
如果它只是普通文本附近的某个地方,它会将其输出到页面上。
如果用作
\num{\pgfplotsretval}
该
siunitx
程序包会以某种方式对其进行处理,并可能在页面上打印一些完全不同的东西(这里添加了一个零:)10.10
。
\num
的宏仅siunitx
需要参数中的数字(除非parse-numbers = false
)。但是,你喂养整个\pgfplotstablegetelem
扩张。出于多种原因,这不仅仅是一个原始数字。
您需要\pgfplotstablegetelem
在任何宏之外执行siunitx
,然后\pgfplotsretval
直接在 a 中使用\num
(这里不可能,因为您需要其中两个)或
\edef\varTableA{\pgfplotsretval}
或者\let\varTableA\pgfplotsretval
。
\pgfplotstableelem
如果您更频繁地需要此功能,我建议使用像下面代码中那样的宏。
笔记:这pgfplotstable
手动的状态关于\pgfplotstablegetelem
:
如果可能的话,请避免在循环内使用此命令。它相当慢。
在这个小例子中这不是一个问题,但根据您的实际使用情况,可能有更好的方法来读取和排版表格的内容。
代码
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{siunitx}
\sisetup{
drop-zero-decimal,
round-mode = uncertainty,
round-precision = 1,
uncertainty-mode = separate
}
\pgfplotstableread{
x dx
10.1 0.02
21.2 4.1
32.3 0.6
}\loadedtable
\def\pgfplotstableelem#1\to#2{%
\pgfplotstablegetelem#1\let#2\pgfplotsretval}
\begin{document}
%\pgfplotstabletypeset[columns={x,dx}]\loadedtable
%\vspace{1cm}
\pgfplotstableelem{0}{x}\of{\loadedtable}\to{\varTableA}
\pgfplotstableelem{0}{dx}\of{\loadedtable}\to{\varTableB}
\def\varA{10.1}
\def\varB{0.02}
% What I would like to do, using values obtained from a table (external file) instead of hard coded values.
\num{10.1 +- 0.02} \\ % Gives the desired output
\num{\varA +- \varB} % Gives the desired output
% One verifies that the variables contain the correct value -> all good
\varA \qquad \varTableA \\ % Gives 10.1 and 10.1
\varB \qquad \varTableB \\ % Gives 0.02 and 0.02
% Using `parse-numbers=false` is not an option
\num{\varTableA +- \varTableB} % ← !
\end{document}