我的主要问题是我从 中得到“!缺少 = 插入\ifnum
。” \seq_use:Nn
。我的第二个问题是我得到了意外的终端读取。我试过注释掉括号并删除 中的\
,\exists
但都没有用。
\documentclass{article}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{xparse} % loads expl3
%See interface3.pdf
\ExplSyntaxOn
\NewDocumentCommand{\uqualg}{mm}
{
\msg_term:n{Enterring~uqualg}
% Set option defaults
\bool_if_exist:NTF \style_qual_parens
{}
{\bool_gset_false:N \style_qual_parens}
\bool_if_exist:NTF \style_qual_paren_pairs
{}
{\bool_gset_false:N \style_qual_paren_pairs}
\bool_if_exist:NTF \style_qual_subscript
{}
{\bool_gset_false:N \style_qual_subscript}
\bool_if:NTF \style_qual_subscript
{
\seq_set_split:Nnn \l_tmpa_tl {\\} {#1}
\tl_show:N \l_tmpa_tl
\bool_if:NTF \style_qual_parens
{(\exists \sb {\l_tmpa_tl})#2}
{\exists \sb {\l_tmpa_tl} #2}
}
{
\msg_term:n{No~subscript~for~#1~}
\tl_set:Nn \l_tmpa_tl {#1}
\msg_term:n{l_tmpa_tl=\l_tmpa_tl~}
\msg_term:n{test~paren~pairs~}
\bool_if:NTF \style_qual_paren_pairs
{
% Parens around each qualifier
\msg_term:n{Pair~of~parens~around~each~item~in~#1~}
\text{Pair~of~parens~around~each~item~in~#1~}
\tl_show:N \l_tmpa_tl
{
(
\msg_term:n{open~paren}
\exists
\msg_term:n{exists}
\seq_use:Nn \l_tmpa_tl
{
)
\exists
(
}
\msg_term:n{seq_use}
)
}
{#2}
\msg_term:n {seq_us~ OK}
}
{
\msg_term:n{No~multiple~parens~}
\bool_if:NTF \style_qual_parens
{
%parens around string of qualifiers
\msg_term:n{Single~pair~of~parens~for~#1~}
(
\tl_map_inline:Nn {#1}
{
\exists {##1}
}
) #2
}
{
% Bare qualifier
\msg_term:n{no~parens~for~#1~}
\tl_map_inline:Nn {#1}
{
\msg_term:n{item~##1~}
\exists ##1
}
{#2}
}
}
}
}
\ExplSyntaxOff
\begin{document}
\[ \uqualg {{X}} {P(X)} \]
\[ \uqualg{{X}{Y}} {P(X,Y)} \]
\ExplSyntaxOn
\bool_gset_false:N \style_qual_paren_pairs
\bool_gset_true:N \style_qual_parens
\ExplSyntaxOff
\[ \uqualg {{X}} {P(X)} \]
\[ \uqualg{{X}{Y}} {P(X,Y)} \]
\ExplSyntaxOn
\bool_gset_true:N \style_qual_paren_pairs
\bool_gset_false:N \style_qual_parens
\ExplSyntaxOff
\[ \uqualg {{X}} {P(X)} \]
\[ \uqualg{{X}{Y}} {P(X,Y)} \]
\end{document}
注意:expl3
文档中没有任何内容\tl_show:N
表明终端读取。
\seq_use:Nn
错误发生在第 43 行插入字符串的调用中) \exists (
。
*************************************************
* Enterring uqualg
*************************************************
*************************************************
* No subscript for {X}{Y}
*************************************************
*************************************************
* l_tmpa_tl={X}{Y}
*************************************************
*************************************************
* test paren pairs
*************************************************
*************************************************
* Pair of parens around each item in {X}{Y}
*************************************************
> \l_tmpa_tl={X}{Y}.
<recently read> }
l.112 \[ \uqualg{{X}{Y}} {P(X,Y)}
\]
?
*************************************************
* open paren
*************************************************
*************************************************
* exists
*************************************************
! Missing = inserted for \ifnum.
<to be read again>
{
l.112 \[ \uqualg{{X}{Y}} {P(X,Y)}
答案1
这样能让你满意吗?我觉得你应该清楚地解释一下你想做什么。
\documentclass{scrartcl}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \uqualg { m m } { \shmuel_uqual:nn { #1 } { #2 } }
\NewDocumentCommand \setupuqualg { m } { \keys_set:nn { shmuel / uqualg } { #1 } }
\keys_define:nn { shmuel / uqualg }
{
subscript .bool_gset:N = \g_uqual_scrpt_bool ,
singleparens .bool_gset:N = \g_uqual_snglparen_bool ,
multiparens .bool_gset:N = \g_uqual_multparen_bool ,
}
\cs_new_protected:Npn \math_sb:n #1 { \c_math_subscript_token { #1 } }
\cs_new_protected:Npn \shmuel_uqual:nn #1 #2
{
\seq_set_split:Nnn \l_tmpa_seq { } { #1 }
\bool_if:NTF \g_uqual_scrpt_bool
{
\bool_if:NT \g_uqual_snglparen_bool (
\exists \math_sb:n { \substack { \seq_use:Nn \l_tmpa_seq { \\ } } }
\bool_if:NT \g_uqual_snglparen_bool )
}
{
\bool_if:NTF \g_uqual_multparen_bool
{
( \exists \seq_use:Nn \l_tmpa_seq { ) ( \exists } )
}
{
\bool_if:NT \g_uqual_snglparen_bool (
\seq_map_inline:Nn \l_tmpa_seq { \exists ##1 }
\bool_if:NT \g_uqual_snglparen_bool )
}
}
#2
}
\ExplSyntaxOff
\begin{document}
\[ \uqualg {X} {P(X)} \]
\[ \uqualg {XY} {P(X,Y)} \]
\setupuqualg{singleparens}
\[ \uqualg {X} {P(X)} \]
\[ \uqualg {XY} {P(X,Y)} \]
\setupuqualg{multiparens}
\[ \uqualg {X} {P(X)} \]
\[ \uqualg {XY} {P(X,Y)} \]
\setupuqualg{subscript}
\[ \uqualg {X} {P(X)} \]
\[ \uqualg {XY} {P(X,Y)} \]
\setupuqualg{subscript,singleparens=false}
\[ \uqualg {X} {P(X)} \]
\[ \uqualg {XY} {P(X,Y)} \]
\end{document}
答案2
[这只是一个补充,以便我可以正确格式化。它回答了当前问题,如该问题的评论中所述,而不是 Manuel 解决的原始问题。]
_show
当介绍第一个这样的示例时,第 17 页对宏的作用的解释更为详细。
\cs_show:N <control sequence>
<control sequence>
显示终端上的定义。TeXhackers 注释:这与 TeX 原语类似
\show
,每行包含固定数量的字符。
因此,预计其行为将类似于\show
,它们都会暂停编译以便展示终端上的某些东西。