\usepackage 的正确 LaTeX3 语法{} - \提供包{}

\usepackage 的正确 LaTeX3 语法{} - \提供包{}

定义MWE_1了 ,document command而 又调用了一个\cs_宏。两者都定义在文档的preamble部分中,夹在\ExplSyntaxOn \ExplSyntaxOff语句之间,相关的局部和全局变量的声明也是如此。似乎没有必要定义文档命令以在单个文档中使用它们,也没有任何理由开发\cs_考虑该范围的宏,因此我通常使用多个.sty文件。为了演示的目的,让我们将 的前言MWE_1打包在\myCommandsAndMacros.sty以 指令为首的文件中\ProvidesPackage{myCommandsAndMacros},并将MWE_2加载到 指令中\usepackage{myCommandsAndMacros}- 不确定我在过去从哪里了解到这个过程,但它确实有效。令我惊讶的是,我现在了解到(参见文档中的第二部分LaTeX3 Interfaces\ProvidesPackage是一条属于 的指令LaTeX2(尽管它可能被 使用LaTeX3),但所有修改我一直使用的语法的尝试都\ProvidesExplPackage{myCommandsAndMacros}失败并出现错误!Paragraph ended before \ProvidesExplPackage was complete

MWE_1:

\documentclass{article}
%-----------------------
\usepackage[check-declarations,log-functions,enable-debug]{expl3}
%   or: \RequirePackage[check-declarations,log-functions,enable-debug]{expl3}
\usepackage{xparse}
%-----------------------
\ExplSyntaxOn
%   Variable Declarations:
\tl_new:N \l_rn_auxOne_tl
\int_new:N \l_rn_auxOne_int
\int_new:N \g_rn_Result_int

\cs_new:Npn \rnUtils_Squared:n #1
  {
\group_begin:
      \int_set:Nn \l_rn_auxOne_int {#1}
      \int_gset:Nn \g_rn_Result_int {\int_eval:n {\l_rn_auxOne_int     *\l_rn_auxOne_int}}
\group_end:
  }  %  \rnUtils_Squared:n

\NewDocumentCommand\myDocumentCommand{O{911}O{abc}}
  {
    \int_set:Nn \l_rn_auxOne_int {#1}
    \rnUtils_Squared:n {\l_rn_auxOne_int}
    \tl_set:Nn \l_rn_auxOne_tl {#2}
    \int_use:N \g_rn_Result_int,~\tl_use:N \l_rn_auxOne_tl
  }  %  \myDocumentCommand

\ExplSyntaxOff
%-----------------------
\begin{document}
  \myDocumentCommand[2][$\alpha$]

  \myDocumentCommand
\end{document}

MWE_2:

\documentclass{article}
%-----------------------
\usepackage[check-declarations,log-functions,enable-debug]{expl3}
%   or: \RequirePackage[check-declarations,log-functions,enable-debug]{expl3}
\usepackage{xparse}
\usepackage{myCommandsAndMacros}
%-----------------------
\begin{document}
  \myDocumentCommand[2][$\alpha$]

  \myDocumentCommand
\end{document}

myCommandsAndMacros.sty

\ProvidesPackage{myCommandsAndMacros}
%\ProvidesExplPackage{myCommandsAndMacros}  ==> ERROR
% ===========================================================
\ExplSyntaxOn

%   Variable Declarations:
\tl_new:N \l_rn_auxOne_tl
\int_new:N \l_rn_auxOne_int
\int_new:N \g_rn_Result_int

\cs_new:Npn \rnUtils_Squared:n #1
  {
\group_begin:
      \int_set:Nn \l_rn_auxOne_int {#1}
      \int_gset:Nn \g_rn_Result_int {\int_eval:n {\l_rn_auxOne_int   *\l_rn_auxOne_int}}
\group_end:
  }  %  \rnUtils_Squared:n

\NewDocumentCommand\myDocumentCommand{O{911}O{abc}}
  {
    \int_set:Nn \l_rn_auxOne_int {#1}
    \rnUtils_Squared:n {\l_rn_auxOne_int}
    \tl_set:Nn \l_rn_auxOne_tl {#2}
    \int_use:N \g_rn_Result_int,~\tl_use:N \l_rn_auxOne_tl
  }  %  \myDocumentCommand

\ExplSyntaxOff

答案1

与 不同\ProvidesPackage, 后者对几个不同的数据使用一个参数,而 则\ProvidesExplPackage对每个数据都有一个单独的参数。例如

\RequirePackage{expl3}
\ProvidesExplPackage {siunitx} {2018-07-21} {3.0.0-alpha}
  {A comprehensive (SI) units package}
% Here, `expl3` syntax is active

相关内容