![在编译时定义的文件上编写宏](https://linux22.com/image/264963/%E5%9C%A8%E7%BC%96%E8%AF%91%E6%97%B6%E5%AE%9A%E4%B9%89%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%8A%E7%BC%96%E5%86%99%E5%AE%8F.png)
这是对此的后续问题。我有一个 LaTeX3 代码,可以读取如下格式的文件:
<numberA> "<nameA>"
<numberB> "<nameB>"
<numberC> "<nameC>"
...
并定义\nameA
为numberA
,\nameB
为numberB
,等等。以下是代码:
\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}