定义嵌套命令的命令

定义嵌套命令的命令

我尝试定义一个命令\NewDerivative,该命令定义一个新的导数以及该特定导数的一组键和变量。

问题是,当\NewDerivative{\Ddv}{D}[style-d = normal]使用时,然后\l_tmpa_tl改变值,这会\ddv使用\l__simon_Ddv_tl而不是\l__simon_ddv_tl

如何使用\l_tmpa_tl以便\ddv使用\l__simon_ddv_tl\Ddv使用\l__simon_Ddv_tl?还是应该使用其他实现?

完成 MWE

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\cs_new:Npn \__simon_derivative_without_order:Nnnn #1 #2 #3 #4
{
    \frac
    {  \tl_use:c { l__simon_ \tl_use:N #1 _tl } {#2} #3  }
    {  \tl_use:c { l__simon_ \tl_use:N #1 _tl } {#2} #4  }
}
\cs_new:Npn \__simon_derivative_with_order:Nnnnn #1 #2 #3 #4 #5
{
    \frac
    {  \tl_use:c { l__simon_ \tl_use:N #1 _tl } {#2} ^{#3} #4  }
    {  \tl_use:c { l__simon_ \tl_use:N #1 _tl } {#2} #5 ^{#3}  }
}
\cs_new:Npn \__simon_define_keys:N #1
{
    \keys_define:nn { simon-#1-keys }
    {
        style-d .choices:nn =
            { normal, rm }
            { \tl_set_eq:cc { l__simon_#1_tl } { math ##1 } },
        style-d .default:n = {rm}
    }
}
\cs_new:Npn \__simon_define_variables:N #1
{  \tl_new:c { l__simon_ \tl_use:N #1 _tl }  }

\NewDocumentCommand{\DerivativeSet}{ m o }
{
    \IfNoValueTF{#2}
    {  \keys_set:nn { simon-#1-keys } { style-d }  }
    {  \keys_set:nn { simon-#1-keys } {#2}         }
}

\NewDocumentCommand{\NewDerivative}{ m m o }
{
    \tl_set:Nf \l_tmpa_tl { \str_range:nnn {#1} {2} {-2} }

    \__simon_define_variables:N \l_tmpa_tl
    \__simon_define_keys:N \l_tmpa_tl

    \DerivativeSet{\l_tmpa_tl}[#3]

    \NewDocumentCommand{#1}{ o m m }
    {
    \group_begin:
        \IfNoValueTF{##1}
        {  \__simon_derivative_without_order:Nnnn \l_tmpa_tl {#2} {##2} {##3}        }
        {  \__simon_derivative_with_order:Nnnnn   \l_tmpa_tl {#2} {##1} {##2} {##3}  }
    \group_end:
    }
}

\ExplSyntaxOff

\NewDerivative{\ddv}{d}[style-d = rm]
\NewDerivative{\Ddv}{D}[style-d = normal]

\begin{document}

\begin{equation}
    \ddv{f}{x} \quad \ddv[2]{f}{x} % I want a roman d
\end{equation}
\begin{equation}
    \Ddv{f}{x} \quad \Ddv[2]{f}{x} % I want an italic D
\end{equation}

\end{document}

答案1

您正在\l_tmpa_tl对命令的定义进行硬连线,因此将使用变量的当前(未确定)值。

定义变体以使用价值而是使用临时标记列表变量。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \l__simon_derivative_temp_tl

\cs_new_protected:Npn \__simon_derivative_without_order:nnnn #1 #2 #3 #4
{
    \frac
    {  \use:c { __simon_#1:n } {#2} #3 }
    {  \use:c { __simon_#1:n } {#2} #4 }
}
\cs_generate_variant:Nn \__simon_derivative_without_order:nnnn { V }

\cs_new_protected:Npn \__simon_derivative_with_order:nnnnn #1 #2 #3 #4 #5
{
    \frac
    {  \use:c { __simon_#1:n } {#2} ^{#3} #4  }
    {  \use:c { __simon_#1:n } {#2} #5 ^{#3}  }
}
\cs_generate_variant:Nn \__simon_derivative_with_order:nnnnn { V }

\cs_new_protected:Npn \__simon_define_keys:n #1
{
    \keys_define:nn { simon-#1-keys }
    {
        style-d .choices:nn =
            { normal, rm }
            { \cs_gset_eq:cc { __simon_#1:n } { math ##1 } },
        style-d .default:n = {rm}
    }
}
\cs_generate_variant:Nn \__simon_define_keys:n { V }

\NewDocumentCommand{\DerivativeSet}{ m O{style-d} }
{
   \__simon_derivative_set:nn { #1 } { #2 }
}

\cs_new_protected:Npn \__simon_derivative_set:nn #1 #2
{
   \keys_set:nn { simon-#1-keys } {#2}
}
\cs_generate_variant:Nn \__simon_derivative_set:nn { V }

\NewDocumentCommand{\NewDerivative}{ m m o }
{
    \tl_set:Nf \l__simon_derivative_temp_tl { \str_range:nnn {#1} {2} {-2} }

    \__simon_define_keys:V \l__simon_derivative_temp_tl

    \__simon_derivative_set:Vn \l__simon_derivative_temp_tl {#3}

    \simon_derivative_define:Vnn \l__simon_derivative_temp_tl {#1} {#2}
}

\cs_new_protected:Npn \simon_derivative_define:nnn #1 #2 #3
{
    \NewDocumentCommand{#2}{ o m m }
    {
    \group_begin:
        \IfNoValueTF{##1}
        {  \__simon_derivative_without_order:nnnn {#1} {#3} {##2} {##3}        }
        {  \__simon_derivative_with_order:nnnnn   {#1} {#3} {##1} {##2} {##3}  }
    \group_end:
    }
}
\cs_generate_variant:Nn \simon_derivative_define:nnn { V }

\ExplSyntaxOff

\NewDerivative{\ddv}{d}[style-d = rm]
\NewDerivative{\Ddv}{D}[style-d = normal]

\begin{document}

\begin{equation}
    \ddv{f}{x} \quad \ddv[2]{f}{x} % I want a roman d
\end{equation}
\begin{equation}
    \Ddv{f}{x} \quad \Ddv[2]{f}{x} % I want an italic D
\end{equation}

\end{document}

在此处输入图片描述

我改变了代码来\__simon_define_keys:n定义一个函数,而不是一个标记列表变量。

相关内容