使用 siunitx 包中的 \num 命令和 arrayjob 包中的数组时出错

使用 siunitx 包中的 \num 命令和 arrayjob 包中的数组时出错

我想使用 siunitx 包中的命令 \num 和存储在 arrayjob 包的数组数据结构中的一些数值数据,但是我收到了一条错误消息,我理解但无法解决。

这是一个例子

\documentclass{article}
   \usepackage[T1]{fontenc}
   \usepackage{siunitx,arrayjobx,amsmath}
   \begin{document}
     \newarray\somevalues
     \readarray{somevalues}{1&2&3.5&4&5}
     \begin{align*}
         v_1    &= \somevalues(1)\\
         v_2    &= \somevalues(2)\\
         v_3    &= \somevalues(3)\\
         v_4    &= \somevalues(4)\\
         v_5    &= \somevalues(5)   
     \end{align*}

    \begin{align*}
        v_1 &= \num{\somevalues(1)}\\
        v_2 &= \num{\somevalues(2)}\\
        v_3 &= \num{\somevalues(3)}\\
        v_4 &= \num{\somevalues(4)}\\
        v_5 &= \num{\somevalues(5)} 
    \end{align*}

答案1

这根本无法正常工作arrayjobx,因为\num想要查看一个明确的数字(完全展开后),而不是一组打印该数字的指令。

\newarray以下是和\readarray的重新实现expl3

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{siunitx,amsmath}

\ExplSyntaxOn
\NewDocumentCommand{\newarray}{m}
 {
  \seq_new:c { l_hafid_array_ \cs_to_str:N #1 _seq }
  \cs_new:Npn #1 (##1)
   {
    \seq_item:cn { l_hafid_array_ \cs_to_str:N #1 _seq } { ##1 }
   }
 }
\NewDocumentCommand{\readarray}{mm}
 {
  \seq_set_split:cnn { l_hafid_array_#1_seq } { & } { #2 }
 }
\cs_generate_variant:Nn \seq_set_split:Nnn { c }
\ExplSyntaxOff

\begin{document}

\newarray\somevalues
\readarray{somevalues}{1&2&3.5&4&5}

\begin{align*}
v_1 &= \somevalues(1)\\
v_2 &= \somevalues(2)\\
v_3 &= \somevalues(3)\\
v_4 &= \somevalues(4)\\
v_5 &= \somevalues(5)
\end{align*}

\begin{align*}
v_1 &= \num{\somevalues(1)}\\
v_2 &= \num{\somevalues(2)}\\
v_3 &= \num{\somevalues(3)}\\
v_4 &= \num{\somevalues(4)}\\
v_5 &= \num{\somevalues(5)} 
\end{align*}

\end{document}

在此处输入图片描述

答案2

你可以使用另一个包,比如,好的,让我想想,嗯,例如啊,是的新工具

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{siunitx}
\usepackage{xinttools}
\begin{document}
\xintAssignArray {1}{2}{3.5}{4}{5e100}{3.141592653}{2.718281828}\to\somevalues

\begin{align*}
     v_1    &= \somevalues{1}\\
     v_2    &= \somevalues{2}\\
     v_3    &= \somevalues{3}\\
     v_4    &= \somevalues{4}\\
     v_5    &= \somevalues{5}\\
     v_6    &= \somevalues{6}\\
     v_7    &= \somevalues{7}\\
     v_{1+3} &= \somevalues{1+3}\\
     v_{3+2} &= \somevalues{3+2} 
\end{align*}

\begin{align*}
    v_1 &= \num{\somevalues{1}}\\
    v_2 &= \num{\somevalues{2}}\\
    v_3 &= \num{\somevalues{3}}\\
    v_4 &= \num{\somevalues{4}}\\
    v_5 &= \num{\somevalues{5}}\\
     v_6    &= \num{\somevalues{6}}\\
     v_7    &= \num{\somevalues{7}}\\
     v_{1+3} &= \num{\somevalues{1+3}}\\
     v_{3+2} &= \num{\somevalues{3+2}}
\end{align*}
\end{document}

在此处输入图片描述

答案3

您可以使用该\check...机制将恢复的数据保存在宏中,然后使用它:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{siunitx,arrayjobx,amsmath}
\begin{document}
  \newarray\somevalues
  \readarray{somevalues}{1&2&3.5&4&5}
  \makeatletter
  \newcommand\ArrayNum[1]{%
    \ArrayNumAux#1\stop
  }
  \def\ArrayNumAux#1#2\stop{%
    \csname check\expandafter\@gobble\string#1\endcsname #2%
    \num{\cachedata}%
  }
  \makeatother
  \begin{align*}
      v_1    &= \somevalues(1)\\
      v_2    &= \somevalues(2)\\
      v_3    &= \somevalues(3)\\
      v_4    &= \somevalues(4)\\
      v_5    &= \somevalues(5)   
  \end{align*}
 \begin{align*}
     v_1 &= \ArrayNum{\somevalues(1)}\\
     v_2 &= \ArrayNum{\somevalues(2)}\\
     v_3 &= \ArrayNum{\somevalues(3)}\\
     v_4 &= \ArrayNum{\somevalues(4)}\\
     v_5 &= \ArrayNum{\somevalues(5)} 
 \end{align*}
\end{document}

相关内容