使用循环创建新命令

使用循环创建新命令

我目前正在编写一个阅读器,必须写很多下标和上标,所以我写了一个函数

    % Define the electric field vector
    \NewDocumentCommand{\vE}{O{#1} O{#2}}{
        \IfValueTF{#1}{
            \IfValueTF{#2}{
                \ensuremath{\supersubs{\vec{E}}{#1}{#2}}
            }{
                \ensuremath{\supersubs{\vec{E}}{#1}{}}
            }
        }{
            \ensuremath{\vec{E}}
        }
    }

但是我有各种需要上标和下标的符号,所以我想知道是否可以创建一个基于此模板生成函数的循环,以便我可以在文档中调用它

\vE, \vB[2], \vJ[2][3], ...

无需分别为 \vB 和 \vJ 编写函数?

答案1

您可以创建一个命令来替换E,然后#1通过循环进行迭代,但我不会这样做,我只会定义命令以将 E 作为参数并使用_如下^所示的语法vvhere并且there只是添加以显示上标语法的任意特殊处理)

在此处输入图片描述


\documentclass{article}
\def\supersubs#1#2#3{#1_{#2}^{#3}}%?

\NewDocumentCommand\defv{m}{%
    \ExpandArgs{c}\NewDocumentCommand{v#1}{O{##1} O{##2}}{%
        \IfValueTF{##1}{%
            \IfValueTF{##2}{%
                \ensuremath{\supersubs{\vec{#1}}{##1}{##2}}%
            }{%
                \ensuremath{\supersubs{\vec{#1}}{##1}{}}%
            }%
        }{%
            \ensuremath{\vec{#1}}%
        }%
      }%
    }

    \ExplSyntaxOn
    \clist_map_function:nN{E,B,J}\defv
    \ExplSyntaxOff

\NewDocumentCommand\vv{me{_^}}{\vec{#1}_{#2here}^{#3there}}
    \begin{document}

    $\vJ[1][2]$

    \bigskip
    
    $\vv J_{1}^{2}$

\end{document}

答案2

我们可以在 OpTeX 中做什么:

\fornum`A..`Z\do{\sdef{v\Uchar#1}{\vec{\Uchar#1}\vecparams}}
\def\vecparams{\isnextchar[{\vecparamsub}{}}
\def\vecparamsub[#1]{_{#1}\isnextchar[{\vecparamsup}{}}
\def\vecparamsup[#1]{^{#1}}

$\vA, \vB[1], \vC[1][2], \vZ$

\bye

答案3

我不会尝试进行批量定义,因为每个带箭头的字母都需要将上标移动不同的量,以免与箭头冲突。

使用\ensuremath只会使事情复杂化并隐藏命令的数学本质。不要使用它。

\documentclass{article}
\usepackage{amsmath}

\NewDocumentCommand{\genericvector}{mmoo}{%
  \vec{#1}%
  \IfValueT{#3}{^{\mkern#2mu#3}}%
  \IfValueT{#4}{_{#4}}%
}

\NewDocumentCommand{\vA}{}{\genericvector{A}{1}}
\NewDocumentCommand{\vE}{}{\genericvector{E}{0}}
\NewDocumentCommand{\vI}{}{\genericvector{I}{3}}
\NewDocumentCommand{\vj}{}{\genericvector{\jmath}{4}}

\begin{document}

$\vA+\vA[2]+\vA[2][3]$

$\vE+\vE[2]+\vE[2][3]$

$\vI+\vI[2]+\vI[2][3]$

$\vj+\vj[2]+\vj[2][3]$

\end{document}

在此处输入图片描述

仅供比较,如果每种情况的调整都为零,则输出结果如下。您应该同意这是不可接受的。

在此处输入图片描述

不同的输入语法:

\documentclass{article}
\usepackage{amsmath}

\NewDocumentCommand{\genericvector}{mme{^_}}{%
  \vec{#1}%
  \IfValueT{#3}{^{\mkern#2mu#3}}%
  \IfValueT{#4}{_{#4}}%
}

\NewDocumentCommand{\vA}{}{\genericvector{A}{1}}
\NewDocumentCommand{\vE}{}{\genericvector{E}{0}}
\NewDocumentCommand{\vI}{}{\genericvector{I}{3}}
\NewDocumentCommand{\vj}{}{\genericvector{\jmath}{4}}

\begin{document}

$\vA+\vA^2+\vA^2_3$

$\vE+\vE^2+\vE^2_3$

$\vI+\vI^2+\vI^2_3$

$\vj+\vj^2+\vj^2_3$

\end{document}

这样可以避免混淆哪个参数是哪个。输出将与第一张图片相同。如果可以,请切换。

相关内容