如何扩展宏并将扩展内容写入外部文件?

如何扩展宏并将扩展内容写入外部文件?

我正在尝试对我的简历进行一些单一来源的操作,并希望将给定的信息写入外部文本文件。

\documentclass{article}
\usepackage{expl3,xparse}
\ExplSyntaxOn
\keys_define:nn { resume/contact } {
  street   .tl_set:N  = \l_resume_contact_street_tl,
  street   .initial:n = {default ~ street},
  city     .tl_set:N  = \l_resume_contact_city_tl,
  city     .initial:n = {default ~ city},
  state    .tl_set:N  = \l_resume_contact_state_tl,
  state    .initial:n = {default ~ state},
  zip      .tl_set:N  = \l_resume_contact_zip_tl,
  zip      .initial:n = {default ~ zip},
  name     .tl_set:N  = \l_resume_contact_name_tl,
  name     .initial:n = {default ~ name},
  phone    .tl_set:N  = \l_resume_contact_phone_tl,
  phone    .initial:n = {default ~ phone},
}

\iow_new:N \bcv_iow
\NewDocumentCommand \ContactInformation { m }
{
  \keys_set:nn { resume / contact } { #1 }

  \iow_open:Nn \bcv_iow { \jobname.bcv.txt }
  \iow_now:Nn  \bcv_iow
  {
    ~~~~~~~ ~~~Name:~ \tl_use:N \l_resume_contact_name_tl    \\
    Street~ Address:~ \tl_use:N \l_resume_contact_street_tl  \\
    ~~~~~~~ ~~~~~~~:~ \tl_use:N \l_resume_contact_city_tl    ,~
                      \tl_use:N \l_resume_contact_state_tl   ,~
                      \tl_use:N \l_resume_contact_zip_tl     \\
    ~~~~~~~ ~~Phone:~ \tl_use:N \l_resume_contact_phone_tl   \\
  }
}
\ExplSyntaxOff

\ContactInformation{
  name   = (name),
  street = (123 Main St.),
  city   = (city),
  state  = (state),
  zip    = (zip),
  phone  = (phone),
}

\begin{document}
hello
\end{document}

生成以下内容*.bcv.txt

Name: \tl_use:N \l_resume_contact_name_tl \\Street Address: \tl_use:N \l_resume_contact_street_tl \\: \tl_use:N \l_resume_contact_city_tl , \tl_use:N \l_resume_contact_state_tl , \tl_use:N \l_resume_contact_zip_tl \\Phone: \tl_use:N \l_resume_contact_phone_tl \\

我希望得到如下结果:

          Name: (name)
Street Address: (123 Main St.), (city), (state), (zip)
         Phone: (phone)

显然,设置的宏l3keys在文件写入时没有被展开。如何达到预期的效果?

答案1

\iow_now:Nn文档中详细说明了行为expl3

此函数立即将⟨tokens⟩写入指定的⟨stream⟩

因此,您所看到的完全符合预期:您正在编写令牌本身。因此,如果您希望编写令牌的扩展,则应使用正常的expl3扩展变体:(\iow_now:Nx定义为标准)。

除了扩展之外,您还需要注意写入操作中的材料。LaTeX\\命令在排版输出中创建新行:它不会在写入文件中创建新行(至少一般情况下不会)。相反,您应该\iow_newline:对每行使用或执行单独的写入操作。(我们允许\\与一起使用\iow_wrap:Nnnn:这里的行为可能需要一些小的改进。)

由于 TeX 忽略行首的空格,因此所有操作均~无效,您需要使用\c_space_tl来进行“漂亮”的对齐。

相关内容