对 xparse 和 LaTeX3 Booleans 感到眼花缭乱和困惑

对 xparse 和 LaTeX3 Booleans 感到眼花缭乱和困惑

我刚刚开始使用LaTeX3/expl3,尽管我对团队所做的出色工作以及它相对于“传统”(La)TeX 编程带来的巨大变化感到着迷(对我来说,这是一次非常好的体验,我会尽可能地留在它的领域内),但我仍然对某些方面感到困惑。其中之一与软件包引入的系列LaTeX3有关。\*DocumentCommandxparse

到目前为止,我一直在常规LaTeX2e设置中嵌入使用该系列的成员,只是摆弄其丰富的参数设置结构,除了由于缺乏练习而发生的一些小事故外,没有遇到任何问题。但现在我渴望LaTeX3在基于 TeX 的工作中使用它们,并且我试图将expl3代码嵌入到使用这些xparse工具创建的命令中。这就是我的麻烦开始的地方。好吧,也许这个特定的问题根本不相关,xparse而是与LaTeX3布尔值、扩展或其他任何东西有关……

玩笑够了。这是来自真实工作项目的一小段代码(绝不假装以下内容是良好LaTeX3/expl3实践):

\documentclass{memoir}

\usepackage{xparse,l3keys2e} 

\ExplSyntaxOn

\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}

\tl_const:Nn \c_prefix_tl {g_amod} 
\tl_const:Nn \c_postfix_tl {_bool} 

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

% Setting Booleans to True
\NewDocumentCommand\SetTBool { m } 
 {
    \bool_set_true:c
    { \tl_use:N \c_prefix_tl { #1 } \tl_use:N \c_postfix_tl }
 }

% Typing Boolean value
\NewDocumentCommand\ShowValBool { m } 
 { 
    \bool_if:cTF 
    { \tl_use:N \c_prefix_tl { #1 } \tl_use:N \c_postfix_tl } 
    { true } { false }
 }

\MakeBool{columns} % Create a Boolean \g_amod_columns_bool

% l3keys defining and setting
\keys_define:nn { amod }
 {
    columns .bool_set:N = \g_amod_columns_bool
 }

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

\AtBeginDocument{%
    \DocumentSetup{ columns = false }
}

\begin{document}
\ShowValBool { columns }% False from l3keys 
\par
\SetTBool { columns }% set to True 
\ShowValBool { columns }% True from above command 
\par % Yes, what comes is ugly enough, but just to check...
\bool_if:cTF% raw expl3 code to check Boolean value. Should return True  
   { g_amod_columns_bool }
   { True } { False }
\end{document}

% And, for a terrible ending...
\ExplSyntaxOff

问题是我得到的是False True False,而我期望的是False True True。这是怎么回事?我遗漏了什么或跳过了什么?

答案1

如果我按照 egreg 的建议在各个地方删除括号并在前缀的定义中添加缺失的下划线,我会得到正确的结果:

\tl_const:Nn \c_prefix_tl {g_amod_} 

我发现下划线缺失了,方法是添加

 \edef\test{\tl_use:N \c_prefix_tl #1 \tl_use:N \c_postfix_tl} 
 \show\test 

在 MakeBool 命令的主体中查看所创建的布尔值的实际名称。

相关内容