在数学模式下通过宏排版下标

在数学模式下通过宏排版下标

我正在探索宏并expl3实现简单的功能。在这里,我尝试实现导数运算符,其上标按顺序排列,下标按元素排列(如果是向量值函数)。我在 4 个用例中包含了我获得的输出和预期输出。案例 1 和 2 按预期工作,但对于案例 3 和 4,_直接输出而不是预期的下标。希望有人能指点我哪里做错了。

\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{xifthen}
\usepackage{xparse}
\usepackage{xstring}
\usepackage{amsmath}

\ExplSyntaxOn
\NewDocumentCommand \deriv { o }{
    \int_case:nn { \str_count:N {#1} }
        {
            {0} {\mathrm{D}}
            {1} {\mathrm{D}^{#1}}
            {2} {
                \ifthenelse{\equal{\str_item:Nn { #1 }{1}}{,}}{
                    \mathrm{D}_{\str_item:Nn {#1}{-1}}
                }{
                    \mathrm{D}^{\str_item:Nn {#1}{1}}_{\str_item:Nn {#1}{-1}}
                }
            }
        }
}
\ExplSyntaxOff

\begin{document}

\begin{enumerate}
    \item Out: $\deriv[] f$; Intended: $\mathrm{D} f$
    \item Out: $\deriv[n] f$; Intended: $\mathrm{D}^n f$
    \item Out: $\deriv[,j] f$; Intended: $\mathrm{D}_j f$
    \item Out: $\deriv[nj] f$; Intended: $\mathrm{D}^n_j f$
\end{enumerate}

\end{document}

实际产出与预期产出

答案1

您需要用\sb\c_math_subscript_token来代替,因为_被解释为 范围内的字母\ExplSyntaxOn

\documentclass[12pt]{article}
\usepackage{amsmath}

\ExplSyntaxOn

\NewDocumentCommand \deriv { O{} }
  {
    \int_case:nn { \str_count:N {#1} }
      {
       {0} {\mathrm{D}}
       {1} {\mathrm{D}^{#1}}
       {2} {
             \str_if_eq:eeTF { \str_item:Nn { #1 }{1} } {,}
               {
                 \mathrm{D}\sb{\str_item:Nn {#1}{2}}
               }
               {
                 \mathrm{D}^{\str_item:Nn {#1}{1}}\sb{\str_item:Nn {#1}{2}}
               }
           }
     }
  }
\ExplSyntaxOff

\begin{document}

\begin{enumerate}
    \item Out: $\deriv f$; Intended: $\mathrm{D} f$
    \item Out: $\deriv[] f$; Intended: $\mathrm{D} f$
    \item Out: $\deriv[n] f$; Intended: $\mathrm{D}^n f$
    \item Out: $\deriv[,j] f$; Intended: $\mathrm{D}_j f$
    \item Out: $\deriv[nj] f$; Intended: $\mathrm{D}^n_j f$
\end{enumerate}

\end{document}

无需使用。仅当您的 LaTeX 不早于 2020-10-01 时才\ifthenelse需要。\usepackage{xparse}

我将参数说明符从 更改为oO{}因此如果缺失,则与使用 相同[]

在此处输入图片描述

相关内容