我正在对一些 token 进行排序代币列表使用 latex3 的优秀功能(参见下面的命令\nom
)。这些标记有时可能为空,当它们为空时,它们将触发另一个命令中的不同条件,下面称为 \amc
。问题是,当接收中的参数时,\amc
它们不会被检测为空。因此,条件永远不会被触发。
我已经尝试过通过\clist_if_empty:NTF \l__wdsgn_notation_subscript_clist {**HERE**} { \clist_use:Nn \l__wdsgn_notation_subscript_clist {,} }
- 一片空旷的田野
{}
- 空常数
\c_empty_tl
,以及 - 无价值标记
\c_novalue_tl
(当前实现如下)
和
\tl_if_empty:nTF
,\tl_if_blank:nTF
, 和\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}