我刚刚开始使用LaTeX3/expl3
,尽管我对团队所做的出色工作以及它相对于“传统”(La)TeX 编程带来的巨大变化感到着迷(对我来说,这是一次非常好的体验,我会尽可能地留在它的领域内),但我仍然对某些方面感到困惑。其中之一与软件包引入的系列LaTeX3
有关。\*DocumentCommand
xparse
到目前为止,我一直在常规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 命令的主体中查看所创建的布尔值的实际名称。