我有以下命令
\def\pderv#1#2{{#1}_{#2}}
它应该表示偏导数。在一些文献中,我有时将其重新定义为传统的
\def\pderv#1#2{\frac{\partial #1}{\partial #2}}
在大多数情况下,这种方法效果很好。所以这\pderv{f}{x}
取决于f_x
我
\frac{\partial f}{\partial x}
的定义。
但是,有时我有一个函数f_i
。在这种情况下,我想用 或 来表示导数f_{i,x}
。\frac{\partial f_i}{\partial x}
后者可以用第二个定义来实现。但是,第一个定义显然使它{f_i}_x
。
有没有办法修改第一个定义,以便如果传递了下标表达式,例如f_i
,则输出为f_{i,x}
? 如果这是唯一的方法,我不介意修改调用命令的方式(在两个定义中)。
强制性 MWE:
\documentclass{article}
\begin{document}
\def\pderv#1#2{\frac{\partial #1}{\partial #2}}
\[
\pderv{f}{x},\quad\pderv{f_{i}}{x}
\]
\def\pderv#1#2{{#1}_{#2}}
\[
\pderv{f}{x},\quad\pderv{f_{i}}{x}
\]
\end{document}
答案1
xparse
您可以使用和一举两得expl3
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\pderv}{smm}
{
\IfBooleanTF{#1}
{% \pderv* uses the fraction mode
\frac{\partial #2}{\partial #3}
}
{% inline mode
\tohiko_pderv:nn { #2 } { #3 }
}
}
\tl_new:N \tohiko_pderv_function_tl
\tl_new:N \tohiko_pderv_variable_tl
\cs_new_protected:Nn \tohiko_pderv:nn
{
\regex_match:nnTF { _ } { #1 }
{% there is a subscript in the function name
\tl_set:Nn \tohiko_pderv_function_tl { #1 }
\tl_set:Nn \tohiko_pderv_variable_tl { #2 }
\regex_match:nnTF { _ .* \^ } { #1 }
{% there is a superscript after the subscript
\regex_replace_once:nnN
% match everything from _ to ^ and from ^ to the end
{ _ (.*) \^ (.*) \Z }
% replace with \sb{<subscript>,#2}^{<superscript>}
{ \c{sb}\cB\{\1,\u{tohiko_pderv_variable_tl}\cE\}\c{sp}\cB\{\2\cE\} }
% in
\tohiko_pderv_function_tl
% use the modified token list
\tl_use:N \tohiko_pderv_function_tl
}
{% there is no superscript after the subscript
\regex_replace_once:nnN
% match everything from _ to the end
{ _ (.*) \Z }
% replace with \sb{<subscript>,#2}
{ \c{sb}\cB\{\1,\u{tohiko_pderv_variable_tl}\cE\} }
% in
\tohiko_pderv_function_tl
% use the modified token list
\tl_use:N \tohiko_pderv_function_tl
}
}
{% no subscript
#1\sb{#2}
}
}
\ExplSyntaxOff
\begin{document}
\[
\pderv*{f}{x}\quad\pderv*{f_{i}}{x}\quad\pderv*{f_{i}^{2}}{x}\quad\pderv*{f^{2}_{i}}{x}
\]
\[
\pderv{f}{x}\quad\pderv{f_{i}}{x}\quad\pderv{f_{i}^{2}}{x}\quad\pderv{f^{2}_{i}}{x}
\]
\end{document}
如果我们使用,\pderv*{f}{x}
我们会得到分数形式。如果没有*
,则第一个参数将被扫描以查找_
。在这种情况下,从_
到参数末尾的所有内容都被替换为_{<whatever>,#2}
。但是,请注意是否_{<subscript>}
后面跟着^{<superscript>}
并采取适当的措施。