正确理解 \keys_define: nn

正确理解 \keys_define: nn

键在以下测试宏中设置。键的初始值在此处指定:.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您可以(并且应该)使用~代表“真实空间”的。

相关内容