这个问题来自前两个问题的结合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>}