我正在探索宏并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}
我将参数说明符从 更改为o
,O{}
因此如果缺失,则与使用 相同[]
。