将用户输入传递给包命令的正确方法是什么?

将用户输入传递给包命令的正确方法是什么?

我想知道是否有人可以告诉我将参数从文档传递到底层包的正确方法。用户将通过如下文档进行交互:

\documentclass{article}
\usepackage{CourseOutline}
\begin{document}

\myAssessments[ maybe stuff ][ maybe stuff ]{ stuff }
\makeoutline

\end{document}

样式文件中定义了以下三个命令:

  1. 用户输入命令

     \NewDocumentCommand \myAssessments {O{I} O{cc} +m} 
    
  2. 格式化命令

    \NewDocumentCommand \myItemList {O{I} O{cc} +m}
    
  3. 将所有用户输入放在适当的位置并生成课程大纲的命令。

    \makeoutline
    

\myItemList命令被多次调用以放置表格/项目化环境,用户不应该直接对其进行干扰。我的问题是:在调用时\makeoutline存储信息\myAssessments并将其输入的适当方法是什么?\myItemList

我正在尝试看看是否可以用 latex3 语法(我对此非常熟悉)来做到这一点,我的第一个想法是定义

\NewDocumentCommand \myAssessments {O{I} O{cc} +m}{
\tl_set:Nn \g_myA_tl {#1}
\tl_set:Nn \g_myB_tl {#2}
\tl_set:Nn \g_myC_tl {#3}
}

然后打电话,

\myItemList[tl_use:N \g_myA_tl][\tl_use:N \g_B_tl]{\tl_use:N \g_C_tl}

但现在我把“包语法”和“文档语法”混在一起了。我可以让它与 latex2e 控制序列一起工作,但应该怎么做,或者甚至应该只用 latex3 来完成。我甚至不确定“纯 latex3 是什么意思”。我想我的困惑在于文档和包之间接口的正确方法。帮忙?

答案1

正如您正确指出的那样,如果您需要做的只是存储用户输入,那么令牌列表变量就是通常的方法,除非有一些“结构”需要考虑。因此,我将定义

\NewDocumentCommand \myAssessments { O { I } O { cc } +m }
  {
    \tl_gset:Nn \g_myA_tl {#1}
    \tl_gset:Nn \g_myB_tl {#2}
    \tl_gset:Nn \g_myC_tl {#3}
  }

使用全局分配,因为这些值是全局唯一的。

什么时候使用值,您有几个选项。如所述,\myItemList不是用户函数,因此您不应使用创建它xparse。相反,您可以直接在变量名称中硬编码以供使用或者将值传递给内部宏。因此要么

\cs_new_protected_nopar:Npn \my_item_list:
  {
    % Do stuff with \g_myA_tl, etc.
  }
...
\my_item_list:

或者

\cs_new_protected:Npn \my_item_list:nnn #1#2#3
  {
    % Do stuff with #1, #2, #3, etc.
  }
\cs_generate_variant:Nn \my_item_list:nnn { VVV }
...
\my_item_list:VVV \g_myA_tl \g_myB_tl \g_myC_tl

相关内容