Latex3:处理具有共享名称子参数的子函数

Latex3:处理具有共享名称子参数的子函数

我正在使用 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}

在此处输入图片描述

相关内容