在传递给函数之前评估原始表达式

在传递给函数之前评估原始表达式

这个问题来自前两个问题的结合A运行正常,没有任何问题。但是当我将它们组合在一起时,它失败了。

我有一个结果文件

结果/测量.txt

length1=0.111111111
length2=0.123456789
length3=0.333333333

我想在我的代码中这样调用它

\paraminput[length2]{results.txt}

它读取文件并提取结果。它工作正常,只是0.123456789太长了,我不喜欢触碰结果文件,因为它每次都要更新,而我不可能总是编辑它。

所以我需要另一个命令来执行舍入。因此定义的命令\round[2]{0.123456789}也可以正常工作。它打印了它应该打印的内容。

问题是当我把它们组合成

 \round[2]{\paraminput[length2]{results.txt}}

它不起作用并且给出错误:

缺少插入的 \endcsname。...2]{\paraminput[length2]{measurements.txt}}

...

LaTeX 错误:“kernel/file-not-found”未找到文件“results/\endcsname”。如需立即帮助,请输入 H。...2]{\paraminput[length2]{measurements.txt}}

未定义的控制序列。...2]{\paraminput[length2]{measurements.txt}}

我该如何修复这个问题?

源文件

\documentclass{article}
\usepackage{tikz}
\usepackage{xparse} % for paraminput

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand{\round}[2][2]{
    \pgfkeys{/pgf/number format/.cd,std,precision=#1}
    \pgfmathprintnumber{#2}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ExplSyntaxOn

\ior_new:N \ar_param_file

\seq_new:N \g_ar_param_seq


\cs_new:Nn \ar_read_by_line:n {%
    \seq_gput_right:Nn \g_ar_param_seq {#1}
}

\tl_new:N \g_paramfile_path_tl

\NewDocumentCommand{\parampath}{m}{%
    \tl_gset:Nn \g_paramfile_path_tl {#1}
}

\NewDocumentCommand{\paraminput}{O{default1}  m}{%
    \seq_gclear:N \g_ar_param_seq
    \ior_open:Nn \ar_param_file {\g_paramfile_path_tl #2}
    \ior_map_inline:Nn \ar_param_file {\ar_read_by_line:n{##1}}
    \ior_close:N \ar_param_file
    \seq_map_inline:Nn \g_ar_param_seq {%
        \seq_set_split:Nnn \l_tmpa_seq {=} {##1}
        \seq_if_in:NxT \l_tmpa_seq {#1} {\seq_item:Nn \l_tmpa_seq {2}\seq_map_break:}
    }
}


\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\parampath{results/}

\begin{document}
It shows fine: $\paraminput[length2]{measurements.txt}$.

It shows fine: $\round[2]{0.123456789}$.

But this one shows error: $\round[2]{\paraminput[length2]{measurements.txt}}$.
\end{document}

答案1

该操作\paraminput不可扩展,因此您无法将其传递给\round

我建议将操作分为首先从文件加载值,然后用于\getparam检索值。

\begin{filecontents*}{\jobname.txt}
length1=0.111111111
length2=0.123456789
length3=0.333333333
\end{filecontents*}

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\ior_new:N \ar_param_stream
\clist_new:N \l_ar_param_clist
\tl_new:N \l_ar_param_path_tl
\prop_new:N \l_ar_param_prop

\cs_generate_variant:Nn \prop_set_from_keyval:Nn { NV }

\NewDocumentCommand{\parampath}{m}
 {
    \tl_set:Nn \l_ar_param_path_tl {#1}
 }

\NewDocumentCommand{\paraminput}{O{default}m}
 {
    \clist_clear:N \l_ar_param_seq
    \ior_open:Nn \ar_param_stream {\l_ar_param_path_tl #2}
    \ior_map_inline:Nn \ar_param_stream { \clist_put_right:Nn \l_ar_param_clist { ##1 } }
    \ior_close:N \ar_param_stream
    \prop_set_from_keyval:NV \l_ar_param_prop \l_ar_param_clist
    \prop_clear_new:c { l_ar_param_#1_prop }
    \prop_set_eq:cN  { l_ar_param_#1_prop } \l_ar_param_prop
 }

\NewExpandableDocumentCommand{\getparam}{O{default}m}
 {
    \prop_item:cn { l_ar_param_#1_prop } { #2 }
 }
\NewExpandableDocumentCommand{\round}{O{5}m}
 {
    \fp_eval:n { round(#2,#1) }
 }

\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%\parampath{results/} % non subdirectory for me

\begin{document}

% read a file and store the values
\paraminput{\jobname.txt}

It shows fine: $\getparam{length2}$.

It shows fine: $\round[2]{0.123456789}$.

It shows fine: $\round[2]{\getparam{length2}}$

\end{document}

你可以拥有任意数量的参数文件,只需使用以下命令加载它们

\paraminput[<symbolic name>]{<filename>}

并使用

\getparam[<symbolic name>]{<parameter name>}

在此处输入图片描述

相关内容