我正在使用 latex3 编写一组宏。我已定义命名法类,以及名词性情况其中包括在测试用例_i(i=1:N)。
现在我想创建 N测试用例名义上的。在某些情况下,参数名称在子函数之间共享(例如 mod、modd)。宏仅在用户直接输入参数时才有效,但在定义常量时,如下所示
typ .code:n = \keys_set:nn { notation / nom } { I=\bar },
typ .initial:n = \bar,
它失败了(它保存了最后一种情况的值)。
这是我的代码的一个非常简化的版本:
\documentclass{article}
% ------------------------ Load needed packages
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{bm}
% ------------------------ Macro definition
\ExplSyntaxOn
% Nominal case
\keys_define:nn { notation / nom }
{
I .tl_set:N = \l_nom_notation_I_tl,
J .tl_set:N = \l_nom_notation_J_tl,
K .tl_set:N = \l_nom_notation_K_tl,
L .tl_set:N = \l_nom_notation_L_tl,
I .initial:n = {},
J .initial:n = {},
K .initial:n = {},
L .initial:n = {},
}
\NewDocumentCommand{\nom}{ m O{} }
{
\group_begin: % Symbol % Modifiers
\nom_notation_nom:nn { #1 } { #2 }%
\group_end:%
}
\cs_new:Nn \nom_notation_nom:nn
{
\keys_set:nn { notation / nom } { #2 }
\gennom{#1}
{\l_nom_notation_L_tl}
{\l_nom_notation_I_tl}
{\l_nom_notation_J_tl}
{\l_nom_notation_K_tl}
}
% First case
\keys_define:nn { notation / caseone }
{
mod .code:n = \keys_set:nn { notation / nom } { J=#1 },
modd .code:n = \keys_set:nn { notation / nom } { K=#1 },
id .code:n = \keys_set:nn { notation / nom } { L=#1 },
typ .code:n = \keys_set:nn { notation / nom } { I=\bar },
typ .initial:n = \bar,
}
\NewDocumentCommand{\caseone}{ m O{} }
{
\group_begin:
\keys_set:nn { notation / caseone } { #2 }
\nom{#1}
\group_end:
}
% Second case
\keys_define:nn { notation / casetwo }
{
mod .code:n = \keys_set:nn { notation / nom } { J=#1 },
modd .code:n = \keys_set:nn { notation / nom } { K=#1 },
id .code:n = \keys_set:nn { notation / nom } { L=#1 },
typ .code:n = \keys_set:nn { notation / nom } { I=\acute },
typ .initial:n = \acute,
}
\NewDocumentCommand{\casetwo}{ m O{} }
{
\group_begin:
\keys_set:nn { notation / casetwo } { #2 }
\nom{#1}
\group_end:
}
\ExplSyntaxOff
% ------------------------ Main arrangement macros
\newcommand\gennom[5]{ {#5{#4{#3{#1}}}}_{#2} }
\begin{document}
\begin{align}
{ \nom{\Theta}[ I=\vec, J=\dot, K=\hat, L=L ] } \\
{ \nom{\Theta}[ I=\acute, J=\dot, K=\hat, L=L ] } \\
{ \nom{\Theta}[ I=\bar, J=\dot, K=\hat, L=L ] } \\
{ \caseone{a}[ mod=\dot, modd=\hat, id=guid ] } \\
{ \casetwo{a}[ mod=\dot, modd=\hat, id=guid ] }
\end{align}
\end{document}
打印以下输出:
输出:
这似乎是一个相当简单的错误。但我的知识缺乏,无法解决它。
提前致谢。
答案1
你对它的作用有误解.initial:n
。它只是用给定的值调用一次键,所以和在那个地方(而不是在其他地方)typ .initial:n = \bar
执行的操作是一样的。\keys_set:nn {<set>} { typ = \bar }
相反,您需要typ
在每次调用\caseone
和时在给定的键前面加上\casetwo
。
另外,请注意,有一个.meta:nn
键可以让一个键设置另一个集合/路径中的另一个键,这应该比执行 更好\keys_set:nn { <other-set> } { <key> = #1 }
。并且,如果您将值转发给单个键,则应使用<key> = {#1}
而不是<key> = #1
(如果#1
包含逗号,则不带括号的版本会导致未定义的行为)。
放在一起:
\documentclass{article}
% ------------------------ Load needed packages
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage{bm}
% ------------------------ Macro definition
\ExplSyntaxOn
% Nominal case
\keys_define:nn { notation / nom }
{
I .tl_set:N = \l_nom_notation_I_tl,
J .tl_set:N = \l_nom_notation_J_tl,
K .tl_set:N = \l_nom_notation_K_tl,
L .tl_set:N = \l_nom_notation_L_tl,
I .initial:n = {},
J .initial:n = {},
K .initial:n = {},
L .initial:n = {},
}
\NewDocumentCommand{\nom}{ m O{} }
{
\group_begin: % Symbol % Modifiers
\nom_notation_nom:nn { #1 } { #2 }%
\group_end:%
}
\cs_new:Nn \nom_notation_nom:nn
{
\keys_set:nn { notation / nom } { #2 }
\gennom{#1}
{\l_nom_notation_L_tl}
{\l_nom_notation_I_tl}
{\l_nom_notation_J_tl}
{\l_nom_notation_K_tl}
}
% First case
\keys_define:nn { notation / caseone }
{
mod .meta:nn = { notation / nom } { J={#1} },
modd .meta:nn = { notation / nom } { K={#1} },
id .meta:nn = { notation / nom } { L={#1} },
typ .meta:nn = { notation / nom } { I=\bar },
}
\NewDocumentCommand{\caseone}{ m O{} }
{
\group_begin:
\keys_set:nn { notation / caseone } { typ, #2 }
\nom{#1}
\group_end:
}
% Second case
\keys_define:nn { notation / casetwo }
{
mod .meta:nn = { notation / nom } { J={#1} },
modd .meta:nn = { notation / nom } { K={#1} },
id .meta:nn = { notation / nom } { L={#1} },
typ .meta:nn = { notation / nom } { I=\acute },
}
\NewDocumentCommand{\casetwo}{ m O{} }
{
\group_begin:
\keys_set:nn { notation / casetwo } { typ, #2 }
\nom{#1}
\group_end:
}
\ExplSyntaxOff
% ------------------------ Main arrangement macros
\newcommand\gennom[5]{ {#5{#4{#3{#1}}}}_{#2} }
\begin{document}
\begin{align}
{ \nom{\Theta}[ I=\vec, J=\dot, K=\hat, L=L ] } \\
{ \nom{\Theta}[ I=\acute, J=\dot, K=\hat, L=L ] } \\
{ \nom{\Theta}[ I=\bar, J=\dot, K=\hat, L=L ] } \\
{ \caseone{a}[ mod=\dot, modd=\hat, id=guid ] } \\
{ \casetwo{a}[ mod=\dot, modd=\hat, id=guid ] }
\end{align}
\end{document}