在编译时定义的文件上编写宏

在编译时定义的文件上编写宏

这是对此的后续问题。我有一个 LaTeX3 代码,可以读取如下格式的文件:

 <numberA> "<nameA>"
 <numberB> "<nameB>"
 <numberC> "<nameC>"
 ...

并定义\nameAnumberA\nameBnumberB,等等。以下是代码:

 \documentclass{article}

 \begin{filecontents*}{myinput.txt}
    0.45 "wingTaperRatio"
    12.0 "wingSpanMT"
    10.2 "wingAreaMTSquared"
 \end{filecontents*}

 \usepackage{xparse}
 \ExplSyntaxOn
 \ior_new:N \l_ago_read_s

 \iow_new:N \l_ago_write_s % I want to write on file as well

 \tl_new:N \l_ago_read_tl
 \NewDocumentCommand{\parseInput}{ m }
   {
    \ior_open:Nn \l_ago_read_s { #1 }

    \iow_open:Nn \l_ago_write_s { mydefs.tex } % write this file!

    \group_begin: \tex_endlinechar:D \c_minus_one
    \bool_until_do:nn { \ior_if_eof_p:N \l_ago_read_s }
      {
       \ior_to:NN \l_ago_read_s \l_ago_read_tl
       \tl_if_empty:NF \l_ago_read_tl
       { \exp_after:wN \ago_process_line:w \l_ago_read_tl \q_stop }

       % \iow_now:Nx \l_ago_write_s  ???

      }
    \group_end:
    \ior_close:N \l_ago_read_s
    \iow_close:N \l_ago_write_s
   }

 \cs_new:Npn \ago_process_line:w #1 ~ " #2 " \q_stop
   {
    \cs_gset:cpn { #2 } { #1 }
   }

 \ExplSyntaxOff

 \begin{document}

 \parseInput{myinput.txt}

 \wingTaperRatio, \wingSpanMT, \wingAreaMTSquared.

 \end{document}

问题是:为了得到mydefs.tex如下的所有定义,上述代码该如何修改?

 \def\wingTaperRatio{0.45}
 \def\wingSpanMT{12.0}
 \def\wingAreaMTSquared{10.2}

答案1

只需将的定义更改\ago_process_line:w

\cs_new:Npn \ago_process_line:w #1 ~ " #2 " \q_stop
 {
  \cs_gset:cpn { #2 } { #1 }
  \iow_now:Nx \l_ago_write_s { \def \exp_not:c { #2 } \exp_not:n { { #1 } } }
 }

使用\exp_not:c控制序列名称形成并书写未扩展的名称。(感谢 Joseph Wright 的改进。)

mydefs.tex以下是我得到的内容:

\def \wingTaperRatio {0.45}
\def \wingSpanMT {12.0}
\def \wingAreaMTSquared {10.2}

相关内容