Latex3 输入/输出和宏的扩展

Latex3 输入/输出和宏的扩展

我有一个格式化课程大纲的包,并且有一个读取格式化的用户文件并将其转换为一个部分的宏。

\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}
}

相关内容