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