定义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