Latex3:将空标记列表传递给另一个命令并将其检测为空标记列表

Latex3:将空标记列表传递给另一个命令并将其检测为空标记列表

我正在对一些 token 进行排序代币列表使用 latex3 的优秀功能(参见下面的命令\nom)。这些标记有时可能为空,当它们为空时,它们将触发另一个命令中的不同条件,下面称为 \amc。问题是,当接收中的参数时,\amc它们不会被检测为空。因此,条件永远不会被触发。

我已经尝试过通过\clist_if_empty:NTF \l__wdsgn_notation_subscript_clist {**HERE**} { \clist_use:Nn \l__wdsgn_notation_subscript_clist {,} }

  1. 一片空旷的田野{}
  2. 空常数\c_empty_tl,以及
  3. 无价值标记\c_novalue_tl(当前实现如下)

  1. \tl_if_empty:nTF
  2. \tl_if_blank:nTF, 和
  3. \tl_if_eq:nnTF(以下为当前实施方案)

没有成功。

在这里您可以找到最小的工作示例:

\documentclass{article}

\usepackage{amssymb, amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\keys_define:nn { notation/nom }
 {
  A .tl_set:N = \l_wdsgn_notation_A_tl,
  B .tl_set:N = \l_wdsgn_notation_B_tl,
  C .tl_set:N = \l_wdsgn_notation_C_tl, 
  A .initial:n = {},
  B .initial:n = {},
  C .initial:n = {}, 
}

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

\clist_new:N \l__wdsgn_notation_subscript_clist

\cs_new:Nn \wdsgn_notation_nom:nn
 {
  \keys_set:nn { notation/nom } { #2 }
% Gerneration of subscript list 
\clist_put_right:NV \l__wdsgn_notation_subscript_clist \l_wdsgn_notation_A_tl
\clist_put_right:NV \l__wdsgn_notation_subscript_clist \l_wdsgn_notation_B_tl
\amc{#1}
{
  \clist_if_empty:NTF \l__wdsgn_notation_subscript_clist {\c_novalue_tl} { \clist_use:Nn \l__wdsgn_notation_subscript_clist {,} }
}
{ % here we exploit the fact that \clist_use:Nn disregards empty items
 \clist_if_empty:NTF \l_wdsgn_notation_C_tl { \c_novalue_tl  } { \l_wdsgn_notation_C_tl }
}
}

\NewDocumentCommand \amc { m m m }
{
    (#1) -- 
    \tl_if_eq:nnTF {#2} {\c_novalue_tl} {empty} {not empty} -- 
    \tl_if_eq:nnTF {#3} {\c_novalue_tl} {empty} {not empty}
}

\ExplSyntaxOff

\begin{document}

\begin{align}
\nom{K}[A=A, B=B] \\
\nom{K}[A=A] \\
\nom{K}[B=B] \\
\nom{K}[C=guid]
\end{align}

\end{document}

如你看到的空的#1当或#2为空时,永远不会打印。

输出:

在此处输入图片描述

先谢谢您的帮助。

答案1

如果您使用,\tl_if_eq:nnTF {#1} { \c_novalue_tl }您正在精确比较这些标记,因此只有#1完全包含的标记\c_novalue_tl才是真实的(因此\tmp:n { \c_novalue_tl }包含\tmp:n此检查)。

你的使用\amc不会扩大论点,因此#2将是

\clist_if_empty:NTF \l__wdsgn_notation_subscript_clist {\c_novalue_tl} { \clist_use:Nn \l__wdsgn_notation_subscript_clist {,} }

\c_novalue_tl如果你没有按照正确的扩展步骤数进行扩展,那么就永远不会实现。

下面通过将第一个参数扩展为\amc完全(\clist_use:Nn将防止值扩展过于频繁)来解决这个问题,而第二个参数直接使用令牌列表的值​​。

\documentclass{article}

\usepackage{amssymb, amsmath}
\usepackage{xparse}

\ExplSyntaxOn

\keys_define:nn { notation/nom }
 {
  A .tl_set:N = \l_wdsgn_notation_A_tl,
  B .tl_set:N = \l_wdsgn_notation_B_tl,
  C .tl_set:N = \l_wdsgn_notation_C_tl,
  A .initial:n = {},
  B .initial:n = {},
  C .initial:n = {},
}

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

\clist_new:N \l__wdsgn_notation_subscript_clist

\exp_args_generate:n { neV }
\cs_new:Nn \wdsgn_notation_nom:nn
  {
    \keys_set:nn { notation/nom } { #2 }
    % Gerneration of subscript list
    \clist_put_right:NV \l__wdsgn_notation_subscript_clist \l_wdsgn_notation_A_tl
    \clist_put_right:NV \l__wdsgn_notation_subscript_clist \l_wdsgn_notation_B_tl
    \exp_args:NneV \amc{#1}
      {
        \clist_if_empty:NF \l__wdsgn_notation_subscript_clist { \clist_use:Nn \l__wdsgn_notation_subscript_clist {,} }
      }
      % here we exploit the fact that \clist_use:Nn disregards empty items
      \l_wdsgn_notation_C_tl
  }

\NewDocumentCommand \amc { m m m }
  {
    (#1) --
    \tl_if_empty:nTF {#2} {empty} {not empty} --
    \tl_if_empty:nTF {#3} {empty} {not empty}
  }

\ExplSyntaxOff

\begin{document}

\begin{align}
\nom{K}[A=A, B=B] \\
\nom{K}[A=A] \\
\nom{K}[B=B] \\
\nom{K}[C=guid]
\end{align}

\end{document}

答案2

\c_novalue_tl是一个非常具体的标记列表,不能用于测试是否为空。

\amc您应该在将参数传递给(为此,我创建了一个内部命令)之前扩展它们。

\documentclass{article}

\usepackage{amssymb, amsmath}

\ExplSyntaxOn

\keys_define:nn { notation/nom }
 {
  A .tl_set:N = \l_wdsgn_notation_A_tl,
  B .tl_set:N = \l_wdsgn_notation_B_tl,
  C .tl_set:N = \l_wdsgn_notation_C_tl, 
  A .initial:n = {},
  B .initial:n = {},
  C .initial:n = {}, 
}

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

\clist_new:N \l__wdsgn_notation_subscript_clist

\cs_new_protected:Nn \wdsgn_notation_nom:nn
 {
  \keys_set:nn { notation/nom } { #2 }
  % Gerneration of subscript list 
  \clist_put_right:NV \l__wdsgn_notation_subscript_clist \l_wdsgn_notation_A_tl
  \clist_put_right:NV \l__wdsgn_notation_subscript_clist \l_wdsgn_notation_B_tl
  \wdsgn_notation_amc:nee {#1}
   {
    \clist_if_empty:NTF \l__wdsgn_notation_subscript_clist
     {empty}
     { \clist_use:Nn \l__wdsgn_notation_subscript_clist {,} }
   }
   {
    \tl_if_empty:NTF \l_wdsgn_notation_C_tl { empty } { \l_wdsgn_notation_C_tl }
   }
 }

\cs_new:Nn \wdsgn_notation_amc:nnn
 {
    (#1) -- (#2) -- (#3)
 }
\cs_generate_variant:Nn \wdsgn_notation_amc:nnn { nee }

\ExplSyntaxOff

\begin{document}

\nom{K}[A=A, B=B]

\nom{K}[A=A]

\nom{K}[B=B]

\nom{K}[C=guid]

\end{document}

在此处输入图片描述

相关内容