我尝试定义一个命令\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
定义一个函数,而不是一个标记列表变量。