我有一个 tex 主体,看起来像
本周我们库存增加了5600支疫苗,比上周增加了8.5%。
现在,这些数字5600和8.5%基于每周自动更新的表格每周更新。
该表是在 tableau 中生成的,并连接到 SQL server ,因此同一张表每周都会自动更新。我想自动反映行中的变化。我可以将表格作为参考或其他东西,但希望测试提取数据并自行更新。目前,我回到表格并根据文本中的表格手动更新每个数据。
有没有办法在 latex 中做到这一点?表格可以是 csv。表格会自行更新,但文本不会。
请帮忙
答案1
这利用了 TeX 长度以机器单位的整数形式存储的事实,并且我可以将这些长度分配到计数寄存器中,反之亦然。
MWE 中的乘数 1000 使我从整数除法中得到 3 个有效数字。这三位数字以百分比形式表示为xx.x%
。
我用来readarray
从文件中获取数据,并将listofitems
其解析为数组。
\documentclass{article}
\usepackage{readarray}
\begin{filecontents*}[overwrite]{mydata.txt}
458
589
743
799
853
942
925
1000
2345
\end{filecontents*}
\newcount\currcount
\newcount\lastcount
\newlength\currlen
\def\fmtvalue#1#2\relax{\ifx\relax#2\relax.#1\%\else#1\fmtvalue#2\relax\fi}
\def\weeklyincrease[#1]{\csname weeklyincrease[#1]\endcsname}
\begin{document}
\readarraysepchar{,}
\readdef{mydata.txt}\datadef
\ignoreemptyitems
\readlist\datarray{\datadef}
\noindent\makebox[1in][r]{Vaxx inventory}\makebox[1in][r]{Increase}\par\noindent
\foreachitem\z\in\datarray[]{%
\noindent\makebox[1in][r]{\z}%
\ifnum\zcnt=1\makebox[1in][r]{---~~~}\relax\else
\lastcount=0\datarray[\zcnt-1]\relax
\currcount=0\z\relax
\currlen=1000\currcount\relax
\divide\currlen by \lastcount\relax
\currcount=\currlen\relax
\advance\currcount by -1000\relax
\expandafter\edef\csname weeklyincrease[\zcnt]\endcsname{%
\expandafter\fmtvalue\the\currcount\relax}%
\makebox[1in][r]{\weeklyincrease[\zcnt]}%
\fi
\par\noindent
}
In week 5, the vax inventory was \datarray[5], with a weekly
increase of \weeklyincrease[5].
For week 7, the comparable numbers were \datarray[7] and
\weeklyincrease[7]
\end{document}
如果您不想要表格输出,只需注释掉\makebox
宏。
对于那些坚持正确舍入而不是截断的人来说,必须获得一个额外的有效数字(因此是 10000 乘数),然后评估它以确定是否要增加先验:
\documentclass{article}
\usepackage{readarray}
\begin{filecontents*}[overwrite]{mydata.txt}
458
589
743
799
853
942
925
1000
2345
\end{filecontents*}
\newcount\currcount
\newcount\lastcount
\newlength\currlen
\def\fmtvalue#1#2#3\relax{\ifx\relax#3\relax.%
\ifnum#2>4\relax\the\numexpr#1+1\relax\else#1\fi\%\else
#1\fmtvalue#2#3\relax\fi}
\def\weeklyincrease[#1]{\csname weeklyincrease[#1]\endcsname}
\begin{document}
\readarraysepchar{,}
\readdef{mydata.txt}\datadef
\ignoreemptyitems
\readlist\datarray{\datadef}
\noindent\makebox[1in][r]{Vaxx inventory}\makebox[1in][r]{Increase}\par\noindent
\foreachitem\z\in\datarray[]{%
\noindent\makebox[1in][r]{\z}%
\ifnum\zcnt=1\makebox[1in][r]{---~~~}\relax\else
\lastcount=0\datarray[\zcnt-1]\relax
\currcount=0\z\relax
\currlen=10000\currcount\relax
\divide\currlen by \lastcount\relax
\currcount=\currlen\relax
\advance\currcount by -10000\relax
\expandafter\edef\csname weeklyincrease[\zcnt]\endcsname{%
\expandafter\fmtvalue\the\currcount\relax}%
\makebox[1in][r]{\weeklyincrease[\zcnt]}%
\fi
\par\noindent
}
In week 5, the vax inventory was \datarray[5], with a weekly
increase of \weeklyincrease[5].
For week 7, the comparable numbers were \datarray[7] and
\weeklyincrease[7]
\end{document}