我有一个格式化课程大纲的包,并且有一个读取格式化的用户文件并将其转换为一个部分的宏。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\tl_new:N \l_my_macro_tl
\tl_set:Nn \l_my_macro_tl {fish}
\NewDocumentEnvironment {mySection} {m}
{\noindent\textbf{\textsl{\large #1}}\hrulefill \par\smallskip}
{\par\medskip}
\NewDocumentCommand \makeOutlineSection{m}
{
\tl_clear:N \l_tmpa_tl
\ior_new:N \l_user_content_ior
\ior_open:Nn \l_user_content_ior {#1} % read from #1
\ior_to:NN \l_user_content_ior \l_tmpa_tl % put first line in tmpa
\begin{mySection}{\l_tmpa_tl} % first line is section title
\ior_to:NN \l_user_content_ior \l_tmpb_tl % rest of file in tmpb
\l_tmpb_tl % print tmpb
\end{mySection}
\ior_close:N \l_user_content_ior
}
\ExplSyntaxOff
\begin{document}
\makeOutlineSection{myfile.tex}
\end{document}
在此示例中,myfile.tex 具有以下格式:
{My~Test~Section}
{
\ExplSyntaxOn
\l_my_macro_tl
\ExplSyntaxOff
}
如果myfile.tex
包含来自序言中加载的包的环境(例如 longtable),则一切都按计划进行。但是,很难决定是什么\l_my_macro_tl
。似乎要么是\ExplSyntaxOn
无法识别,要么是扩展宏存在问题。有人能解释为什么会发生这种情况并可能提出修复建议吗?
答案1
在查找宏(或)参数时,一旦字符被标记化,您就无法更改 catcode \read
。因此,您需要\ExplSyntaxOn
从包含的文件中取出并将它们放在
\ior_to:NN \l_user_content_ior \l_tmpb_tl
这意味着该文件有当然要有 L3 语法。最简单的方法是,如果您有两个不同的命令(或一个命令和一个星号形式)来加载 l2 和 l3。
另一方面,如果您使用\input
而不是输入文件\read
,它将像主输入文件一样逐个字符地读取,然后您可以在任何时候切换 catcodes,以便\ExplSyntaxOn
在文件中使用。
答案2
混合编程级命令和用户级命令肯定会带来麻烦,当然建议不要这样做。
绝不使用编程级命令,除了定义用户级命令或编写其他宏时。
根据您的情况,您可以定义一个访问所需令牌列表的宏:
\ExplSyntaxOn
\NewDocumentCommand{\gettl}{ m }
{
\tl_use:c { l_my_ #1 _tl }
}
\ExplSyntaxOff
并在输入文件中使用
{My~Test~Section}
{
\gettl{macro}
}