我自己在做定理环境,然后希望根据定理,定义等等情况,自动加不同计数器和设置不同颜色,先来代码
\int_new:N \l__zljdlcounter_int
\int_new:N \l__zljdycounter_int
\int_new:N \l__zljxzcounter_int
\int_new:N \l__zljjlcounter_int
\int_new:N \l__zljtlcounter_int
\int_new:N \l__zljylcounter_int
\int_new:N \l__zljglcounter_int
\NewDocumentCommand{\zljdl}{s O{定理} +m}
{
\tl_clear_new:N \l_counter_tl
\tl_clear_new:N \l_color_tl
\str_case:nnTF {#2}
{
{定理}{
\tl_set:Nn \l_color_tl {red}
\tl_set:Nn \l_counter_tl {\l__zljdlcounter_int}
}
{定义}{
\tl_set:Nn \l_color_tl {blue}
\tl_set:Nn \l_counter_tl {\l__zljdycounter_int}
}
{性质}{
\tl_set:Nn \l_color_tl {green!70!black}
\tl_set:Nn \l_counter_tl {\l__zljxzcounter_int}
}
{结论}{
\tl_set:Nn \l_color_tl {cyan!70!black}
\tl_set:Nn \l_counter_tl {\l__zljjlcounter_int}
}
{推论}{
\tl_set:Nn \l_color_tl {blue!70!black}
\tl_set:Nn \l_counter_tl {\l__zljtlcounter_int}
}
{引理}{
\tl_set:Nn \l_color_tl {orange!70!black}
\tl_set:Nn \l_counter_tl {\l__zljylcounter_int}
}
{公理}{
\tl_set:Nn \l_color_tl {red!70!black}
\tl_set:Nn \l_counter_tl {\l__zljglcounter_int}
}
}
{}
{}
%开始定理主体
{\heiti\color{\tl_use:N \l_color_tl}\Large #2 }
\IfBooleanTF{#1}
{}
{
\int_add:Nn \cs_meaning:N \l_counter_tl {1}
{
\heiti
\color{\tl_use:N \l_color_tl}
\Large
\int_use:N \cs_meaning:N\l_counter_tl
}
}
\hspace*{1em}\kaishu #3
%
}
后面 IfBooleanTF{#1}这部分搞不定,可不可以int_add:N 后面那个l_counter_tl根据前面的case变化,不太会描述,请高手看看,谢谢
\IfBooleanTF{#1}
{}
{
\int_add:Nn \l_counter_tl {1}
{
\heiti
\color{\tl_use:N \l_color_tl}
\Large
\int_use:N \l_counter_tl
}
}
直接写就可以了,\int_...
会自动展开。当然也可以使用 \exp_after:wN \int_... \l_counter_tl
,不过 \exp_after:wN
是多余的。
你也可以在 \str_case:nn
中使用 \tl_set_eq:NN \l_counter_tl \..._int
。这是因为 \tl_set_eq:NN
就是 \let
。
另外 \color
中的 \tl_use:N
是不必要的,它会自动扩展。(而且 \tl_ue:N
实际上只是检查了一下命令是否存在)
(而 \color_select:n
则必须首先扩展。)
\int_add:Nn .. 1
可简写为 \int_incr:N ..
,并且速度更快。
(LaTeX3的命名规范,变量:\⟨scope⟩_⟨module⟩_⟨description⟩_⟨type⟩
,函数:\⟨module⟩_⟨description⟩:⟨arg-spec⟩
,module
和description
应该用_
分隔,module
一般是必须的。)
非常感谢,我修改了函数名称