我正在实现一个乳胶包,并且在内部我定义了一个例程\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
形式以便能够本地确定粗体版本可能会很棘手,但可能可以处理像这样的简单情况,但不是今天。