使用 siunitx 和 \pgfplotstablegetelem

使用 siunitx 和 \pgfplotstablegetelem

我想使用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

做两件不同的事情:

  1. 只是

    \pgfplotstablegetelem{0}{x}\of{\loadedtable}
    

    定义为行和列\pgfplotsretval的内容(此处)。0x10.1

  2. 然后你打电话

    \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}

相关内容