我自己在做定理环境,然后希望根据定理,定义等等情况,自动加不同计数器和设置不同颜色,先来代码
\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一般是必须的。)
非常感谢,我修改了函数名称