是否有类似 \NewDocumentCommand 的范围?

是否有类似 \NewDocumentCommand 的范围?

沿着我关于 xparse 和 expl3 的(困惑的)帖子,但这次希望没有拼写错误或缺少字符,我设计了一个小程序包,仅用于检查l3keys基于 - 的选项定义和设置。我的问题(到目前为止)不是选项的传递,而是命令的意外行为(对我来说)。

我有一个包含以下内容的文件tmpkgl3.sty

\ProvidesPackage{tmpkgl3}[2013/08/20 LaTeX2e/LaTeX3 wannabe package]

\RequirePackage{xparse,l3keys2e} 

\ExplSyntaxOn

% Some of the variants are already declared in LaTeX3
\cs_generate_variant:Nn \bool_new:N {c}
\cs_generate_variant:Nn \bool_if:NTF {cTF}
\cs_generate_variant:Nn \bool_set_true:N {c}

% I have in mind egreg's remarks in my linked post regarding not using this as I do.
\tl_const:Nn \c_prefix_tl {g_amod_} 
\tl_const:Nn \c_postfix_tl {_bool} 

\NewDocumentCommand\MakeBool { m }
 { 
   \bool_new:c 
   { \tl_use:N \c_prefix_tl #1 \tl_use:N \c_postfix_tl }
 }

\NewDocumentCommand\SetTBool { m } 
 {
   \bool_set_true:c
   { \tl_use:N \c_prefix_tl #1 \tl_use:N \c_postfix_tl }
 }

\NewDocumentCommand\WelcherWegBool { m m m } 
 { 
    \bool_if:cTF 
    { \tl_use:N \c_prefix_tl #1 \tl_use:N \c_postfix_tl } 
    { #2 } { #3 }
 }

\MakeBool{esp}

\keys_define:nn { amod }
{
    lang .choice_code:n =
        { \SetTBool { \tl_use:N \l_keys_choice_tl } 
           \WelcherWegBool { esp } { True } { False } \par
        },
    lang .generate_choices:n = { esp },
}

\DeclareDocumentCommand\DocumentSetup { +m }
 { \keys_set:nn { amod } { #1 } }

%\ProcessKeysOptions { amod }

\ExplSyntaxOff 

然后,我在 .tex 文件中有了以下内容l3tryout.tex

\documentclass{memoir}

\usepackage{tmpkgl3}

%\ExplSyntaxOn

%\ProvideDocumentCommand\WelcherWegBool { m m m } 
% { 
%    \bool_if:cTF 
%    { \tl_use:N \c_prefix_tl  #1  \tl_use:N \c_postfix_tl } 
%    { #2 } { #3 }
% }

\AtBeginDocument{%
    \DocumentSetup{ lang = esp } 
}

\begin{document}
\WelcherWegBool { esp } { T } { F }
\end{document}

%\ExplSyntaxOff

使用上述文件,我得到的是True F,而我应该得到的是True T(由于\par选项定义中的,因此在两个不同的段落中)。尽管如此,如果我取消注释文件中的注释行l3tryout.tex,我会得到正确的结果。就好像命令\WelcherWegBool在包中运行良好,但在 tex 文件中却不是这样。这可能与关闭开关有关吗ExplSyntax

答案1

在 的范围内\ExplSyntaxOn{esp}{ esp }作为函数的参数是等效的。它们不在普通文档中,因为普通文档中不会忽略空格。

如果你真的想允许

\WelcherWegBool { esp } { T }{ F }

在文档中,那么您必须\tl_trim_spaces:n { #1 }在定义中使用:

\documentclass{memoir}
\usepackage{xparse,l3keys2e} 

\ExplSyntaxOn

% Some of the variants are already declared in LaTeX3
\cs_generate_variant:Nn \bool_new:N {c}
\cs_generate_variant:Nn \bool_if:NTF {cTF}
\cs_generate_variant:Nn \bool_set_true:N {c}

% I have in mind egreg's remarks in my linked post regarding not using this as I do.
\tl_const:Nn \c_prefix_tl {g_amod_} 
\tl_const:Nn \c_postfix_tl {_bool} 

\NewDocumentCommand\MakeBool { m }
 { 
   \bool_new:c 
   { \tl_use:N \c_prefix_tl \tl_trim_spaces:n{ #1 } \tl_use:N \c_postfix_tl }
 }

\NewDocumentCommand\SetTBool { m } 
 {
   \bool_set_true:c
   { \tl_use:N \c_prefix_tl \tl_trim_spaces:n { #1 } \tl_use:N \c_postfix_tl }
 }

\NewDocumentCommand\WelcherWegBool { m m m } 
 { 
    \bool_if:cTF 
    { \tl_use:N \c_prefix_tl  \tl_trim_spaces:n { #1 }  \tl_use:N \c_postfix_tl } 
    { #2 } { #3 }
 }

\MakeBool{esp}

\keys_define:nn { amod }
{
    lang .choice_code:n =
        { \SetTBool { \tl_use:N \l_keys_choice_tl } 
           \WelcherWegBool { esp } { True } { False } \par
        },
    lang .generate_choices:n = { esp },
}

\DeclareDocumentCommand\DocumentSetup { +m }
 { \keys_set:nn { amod }{#1} }

%\ProcessKeysOptions { amod }

\ExplSyntaxOff 

\AtBeginDocument{%
    \DocumentSetup{ lang = esp } 
}

\begin{document}
\WelcherWegBool { esp } { T }{ F }
\end{document}

当然,空间将不是将被忽略TF尽管它们可以通过 TeX 的排版规则删除)。

相关内容