我正在尝试对我的简历进行一些单一来源的操作,并希望将给定的信息写入外部文本文件。
\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
来进行“漂亮”的对齐。