添加到宏定义中的下标

添加到宏定义中的下标

我有以下命令

\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>}并采取适当的措施。

在此处输入图片描述

相关内容