答案1
你可以用稍微麻烦一点的方式来做。也许需要提出功能请求。
\jobname.nmc
如果\nmcReuse
使用命令(在序言中),包将读取一个名为的文件(\jobname
代表主 TeX 文件的名称)。您可以使用 使它自成一体filecontents
。文件中可以放入任意数量的常量。使用 选项overwrite
将保证在每次运行 LaTeX 时重写该文件,但是当您的列表最终确定时,您可以将其删除。
\begin{filecontents*}[overwrite]{\jobname.nmc}
\myvalue{0.35},\anothervalue{42}
\end{filecontents*}
\documentclass{article}
\usepackage{numerica}
\nmcReuse
\begin{document}
\nmcEvaluate{\[\sin\alpha\]}[\alpha=\myvalue]
\end{document}
在我看来,该包应该提供一种不需要外部文件来定义常量的方法。
建议采用更简单的方式,可以与现有的外部文件功能共存
\begin{filecontents*}[overwrite]{\jobname.nmc}
\comma{22}
\end{filecontents*}
\documentclass{article}
\usepackage{numerica}
\ExplSyntaxOn
\NewDocumentCommand{\nmcConstants}{m}
{
\__nmc_reuse_command:n { #1 }
}
\cs_new_protected:Nn \__nmc_reuse_command:n
{
\seq_set_split:Nnn \l_tmpa_seq {,} { #1 }
\seq_map_inline:Nn \l_tmpa_seq { \__nmc_reuse_defcmds:Nnn ##1 { _props } }
\bool_set_true:N \l__nmc_reuse_retrieved_bool
}
\ExplSyntaxOff
\nmcReuse
\nmcConstants{\myvalue{0.35},\anothervalue{42}}
\begin{document}
\nmcEvaluate{\[\sin\alpha\]}[\alpha=\myvalue]
\[\mathit{UltimateComma}=\nmcEvaluate*{\anothervalue+\comma}\]
\end{document}
答案2
为了方便起见,我模拟了 egreg 的答案,但没有 expl3,没有使用外部文件,也没有 numerica 的内部结构。我定义了一个命令\nmccsedef
,其作用类似于,\csedef
但宏可以在\eval
/ \nmcEvaluate
vv-list 中使用:
\documentclass{article}
\usepackage{numerica}
\usepackage{xfp}
\begin{filecontents*}[overwrite]{\jobname.nmc}
\end{filecontents*}
\begin{document}
\def\nmcsingleeval#1{\eval*{x}[x=#1]}
\def\nmcsingleevalbox#1{\sbox0{\nmcsingleeval{#1}}}
\def\nmcsingleevalexp#1{\expandafter\nmcsingleevalbox\expandafter{#1}}
\def\nmccsedef#1#2{\edef\nmccsdeftmp{#2}\nmcsingleevalexp\nmccsdeftmp\nmcReuse[#1]}
My de\nmccsedef{ciappi}{0.35}ar friends (\ciappi):
\eval{\[\sin\alpha\]}[\alpha=\ciappi]
\nmccsedef{ciappini}{\fpeval{0.15+0.20}}
\eval{\[\sin\alpha\]}[\alpha=\ciappini]
\end{document}