我目前正在编写一个阅读器,必须写很多下标和上标,所以我写了一个函数
% 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 作为参数并使用_
如下^
所示的语法vv
(here
并且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}
这样可以避免混淆哪个参数是哪个。输出将与第一张图片相同。如果可以,请切换。