沿着我关于 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}
当然,空间将不是将被忽略T
(F
尽管它们可以通过 TeX 的排版规则删除)。