键在以下测试宏中设置。键的初始值在此处指定:.initial:n=...
如果连续多次调用Mcro,那么就不会像想象的那样使用初始值,而是使用前一次宏调用的最后设置的值。
如何做到这一点,通过进一步调用不使用键的宏来设置定义的初始值?
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\TestMacro}{O{}m}
{% #1 = option list, #2 = Text
\group_begin:
\keys_set:nn { thomas/TestMacro } { #1 }
\bool_if:NTF \l__ts_TestMacro_bold_bool
{
\ts_Test_A:nn { #2 }
}
{
\ts_Test_B:nn { #2 }
}
\group_end:
}
\keys_define:nn { thomas/TestMacro }
{
bold .bool_set:N = \l__ts_TestMacro_bold_bool,
bold .initial:n = false,
bold .default:n = true,
sep .dim_set:N = \l__ts_TestMacro_sep_int,
sep .initial:n = 10pt,
var .tl_set:N = \l__ts_TestMacro_var_tl,
var .initial:n = x,
}
\cs_new_protected:Nn \ts_Test_B:nn
{
TestB: \ #1 \ - \ with\ hspace \hspace*{\l__ts_TestMacro_sep_int} \l__ts_TestMacro_var_tl
}
\cs_new_protected:Nn \ts_Test_A:nn
{
TestA: {\ \bfseries #1 \ - \ with\ hspace } \hspace*{\l__ts_TestMacro_sep_int} \l__ts_TestMacro_var_tl
}
\ExplSyntaxOff
\parindent0pt
\begin{document}
\TestMacro[bold,sep=1cm]{With bfseries }
\TestMacro{This should not be in bfseries}
\TestMacro[var=z]{This too}
\TestMacro[bold=false]{This is not in bfseries, but here should follows a x not }
\end{document}
答案1
你定义了\ts_Test_A:nn
两个\ts_Test_B:nn
参数,但只传递了一个,所以 TeX 使用了\group_end:
第二个参数,这个参数被占用了,从来没有用过。事实上你会发现
(\end occurred inside a group at level 4)
### semi simple group (level 4) entered at line 54 (\begingroup)
### semi simple group (level 3) entered at line 52 (\begingroup)
### semi simple group (level 2) entered at line 50 (\begingroup)
### semi simple group (level 1) entered at line 48 (\begingroup)
### bottom level
在日志文件中。你应该这样做
\cs_new_protected:Nn \ts_Test_B:n
{
TestB: ~ #1 ~ - ~ with ~ hspace \hspace*{\l__ts_TestMacro_sep_int} \l__ts_TestMacro_var_tl
}
\cs_new_protected:Nn \ts_Test_A:n
{
TestA: {~ \bfseries #1 ~ - ~ with\ hspace } \hspace*{\l__ts_TestMacro_sep_int} \l__ts_TestMacro_var_tl
}
并修复主宏中的调用。
顺便说一句,\l__ts_TestMacro_sep_int
应该是\l__ts_TestMacro_sep_dim
。使用“控制空间”与标准空间不同。在的范围内,\ExplSyntaxOn
您可以(并且应该)使用~
代表“真实空间”的。