Latex3:正确实现生成其他宏的宏

Latex3:正确实现生成其他宏的宏

我正在实现一个乳胶包,并且在内部我定义了一个例程\genMacroVect它会生成一系列命令,这些命令会从名为向量同时继承了名称

一切正常,但我注意到,在某些情况下,由于缺少括号,LaTeX 编译器会抛出错误{ }。我怀疑有一些\扩张(latex2e) 某处缺失,但我还没搞清楚如何使用 latex3 synthaxis 来定义它。如果有人能花几分钟看一看,我将不胜感激。

这里我提供该程序的简化版本:

\documentclass{article} 
\RequirePackage[spanish,english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsmath} 
\usepackage{bm}


% ----------- General command
\ExplSyntaxOn
\keys_define:nn { nom } {
    A .tl_set:N = \l__amtyp_nom_A_tl,
    B .tl_set:N = \l__amtyp_nom_B_tl,
    A .initial:n = {},
    B .initial:n = {},
}

\NewDocumentCommand{ \nom }{ m O{} } {
    \group_begin:         
    \amtyp_nom:nn { #1 } { #2 }
    \group_end:
}

\cs_new:Nn \amtyp_nom:nn {
    \keys_set:nn { nom } { #2 } 
    #1 \c_math_subscript_token  {\mathtt{\l__amtyp_nom_A_tl \l__amtyp_nom_B_tl } }
}

% ------ Case vector
\keys_define:nn { vect } {
    of .meta:nn = { nom } { B={#1} },
    wrt .meta:nn = { nom } { A={#1} },
}

\NewDocumentCommand{\vect}{ m O{} } {
    \group_begin:
    \keys_set:nn { vect } { #2 }
    { \nom{#1} }
    \group_end:
}

% ------ Macro generating macros
\NewDocumentCommand{\genMacroVect}{ mm }{   
    \NewDocumentCommand{#1}{ O{} }{
        \group_begin:
        \keys_set:nn { vect } { ##1 }
        { \vect{#2} }
        \group_end:
}}

% ---- Macros generated using previous definition
\genMacroVect{\vel}{ {v} }
\genMacroVect{\aoa}{ {\alpha} }
\NewDocumentCommand{\vela}{ }{ \vel \c_math_subscript_token a }

\ExplSyntaxOff

\begin{document}    

\begin{align}
\nom{a}[A=A, B=B] \\
\vect{r}[of=A, wrt=B] \\
\vel[of=A, wrt=B] \\
\vela \\
\bm{{\vel}} \\   % <--------- It compiles
\bm{\vel}        % <--------- Faulty case
\end{align}

\end{document}

提前致谢! :)

答案1

您的定义中没有任何内容导致问题,您可以将测试示例简化为

\documentclass{article}

\usepackage{bm}

\NewDocumentCommand\zzvel{O{}}{\alpha}

\begin{document}

$\alpha+\zzvel+\bm{\alpha}+\bm{\zzvel}$

\end{document}

警告:上述文档将无限循环,需要终止 latex 进程

这根本就\bm无法解释几十年后才编写的命令形式。

正如bm软件包文档中指出的那样,括号中的参数会导致它回到更安全(但速度更慢并且可能具有更差的间距)的\boldsymbol机制。

\bm充分解开所有\NewDocumentCommand形式以便能够本地确定粗体版本可能会很棘手,但可能可以处理像这样的简单情况,但不是今天。

相关内容