将浮点 LaTeX3 变量写入辅助文件并恢复它

将浮点 LaTeX3 变量写入辅助文件并恢复它

不久前,我问过如何写整数变量放入辅助文件中并读取它:将 LaTeX3 变量写入辅助文件并恢复它

现在,我面临一个几乎相同的问题,我必须向辅助文件写入/读取一个变量,但这次它是类型浮点.看一下最小的例子:

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\fp_new:N \g_maxmaier_foo_fp
\fp_new:N \l_maxmaier_bar_fp

\NewDocumentCommand{\setbar}{m}
 {
  \fp_set:Nn \l_maxmaier_bar_fp { #1 }
 }
\NewDocumentCommand{\showfoo}{}
 {
  \fp_to_tl:N \g_maxmaier_foo_fp
 }

\AtEndDocument
 {
  \iow_now:cx { @auxout }
   {
    \token_to_str:N \ExplSyntaxOn
    ^^J
    \fp_gset:Nn \g_maxmaier_foo_fp { \fp_to_scientific:N \l_maxmaier_bar_fp }
    ^^J
    \token_to_str:N \ExplSyntaxOff
   }
 }
\ExplSyntaxOff

\begin{document}

The value of \texttt{foo} is \showfoo

\setbar{42}

\end{document}

执行 LaTeX 时出现错误。如果我们查看辅助文件,我们会发现:

\relax 
\ExplSyntaxOn
\fp_gset:Nn \s__fp \__fp_chk:w 00\s__fp_exact ;{4.2e1}
\ExplSyntaxOff

浮点数是正确的,但变量名搞错了。我本来希望辅助文件具有以下格式:

\relax 
\ExplSyntaxOn
\fp_gset:Nn \g_maxmaier_foo_fp {4.2e1}
\ExplSyntaxOff

为什么我不能像以前使用整数时那样在此处使用变量名?是否有任何建议的解决方法?

答案1

出于实现原因,表示浮点变量的宏不\protected反对x扩展。只需告诉 LaTeX 不要扩展它即可。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn
\fp_new:N \g_maxmaier_foo_fp
\fp_new:N \l_maxmaier_bar_fp

\NewDocumentCommand{\setbar}{m}
 {
  \fp_set:Nn \l_maxmaier_bar_fp { #1 }
 }
\NewDocumentCommand{\showfoo}{}
 {
  \fp_to_tl:N \g_maxmaier_foo_fp
 }

\AtEndDocument
 {
  \iow_now:cx { @auxout }
   {
    \token_to_str:N \ExplSyntaxOn
    ^^J
    \fp_gset:Nn \exp_not:N \g_maxmaier_foo_fp { \fp_to_scientific:N \l_maxmaier_bar_fp }
    ^^J
    \token_to_str:N \ExplSyntaxOff
   }
 }
\ExplSyntaxOff

\begin{document}

The value of \texttt{foo} is \showfoo

\setbar{42}

\end{document}

该文件的内容aux将是

\relax 
\ExplSyntaxOn
\fp_gset:Nn \g_maxmaier_foo_fp {4.2e1}
\ExplSyntaxOff

相关内容