在numerica vv-list中使用宏

在numerica vv-list中使用宏

我想在\nmcEvaluate“numerica”包的命令的变量=值列表中使用宏。但是该命令按标记解析列表而不展开。我无法事先展开整个列表,因为数学命令不能展开。示例:

\documentclass{article}
\usepackage{numerica}
\begin{document}
     \nmcEvaluate{\[\sin\alpha\]}[\alpha=0.35]
     
     \def\myvalue{0.35}
     \nmcEvaluate{\[\sin\alpha\]}[\alpha=\myvalue]
\end{document}

乳胶输出

答案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/ \nmcEvaluatevv-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}

乳胶输出

相关内容