我想定义一个命令,将一个符号序列放在x
另一个符号序列的第个符号之上。
没有分隔符似乎更好,但为了提高可用性,可能需要分隔符。我不确定。
这意味着,在下面的例子中,\putAbove
应该重新定义命令以产生后面显示的输出becomes
。
这些问题似乎与例如这,但我无法在这里使用它。
\documentclass{article}
\usepackage{amsmath}
\newcommand{\putAbove}[3]{\backslash putAbove\{#1\}\{#2\}\{#3\}}
\begin{document}
$\putAbove{q_0}{1}{||\phi}$ becomes $\overset{q_0}||\phi$
$\putAbove{q}{1}{||\phi}$ becomes $\overset{q}||\phi$
$\putAbove{q}{3}{|||}$ becomes $||\overset{q}|$
\end{document}
答案1
\documentclass{article}
\usepackage{amsmath}
\newcommand{\putAbove}[3]{\xputAbove{#1}{#2}#3}
\newcommand\xputAbove[2]{\ifnum#2=1 \expandafter\xxputAbove\else\expandafter\xxxputAbove\fi{#1}{#2}}
\newcommand\xxputAbove[3]{\overset{#1}{#3}}
\newcommand\xxxputAbove[3]{#3\xputAbove{#1}{\numexpr(#2)-1\relax}}
\begin{document}
$\putAbove{q_0}{1}{||\phi}$ becomes $\overset{q_0}||\phi$
$\putAbove{q}{1}{||\phi}$ becomes $\overset{q}||\phi$
$\putAbove{q}{3}{|||}$ becomes $||\overset{q}|$
\end{document}
这里的实现只是基于以下观察的一次迭代:
\putAbove{q}{1}{abc}
是
\putAbove{q}{1}a bc
即
\overset{q}{a} bc
和
\putAbove{q}{n}abcde
是
a\putAbove{q}{n-1}bcde
答案2
一个expl3
实现。使用它可以获取从一个地方到另一个地方(包括)的\tl_range_braced:nnn { <tokens> } { x } { y }
项目。请注意,第二个和第三个参数允许使用算术。类似地,返回第 - 个项目。x
y
\tl_item:nn { <tokens> } { x }
x
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\putAbove}{mmm}
{% #1 = symbol to put above, #2 = position, #3 = symbols
\tl_range_braced:nnn { #3 } { 1 } { #2 - 1 }
\overset{ #1 } { \tl_item:nn { #3 } { #2 } }
\tl_range_braced:nnn { #3 } { #2 + 1 } { \tl_count:n { #3 } }
}
\ExplSyntaxOff
\begin{document}
$\putAbove{q_0}{1}{||\phi}$ becomes $\overset{q_0}||\phi$
\medskip
$\putAbove{q}{1}{||\phi}$ becomes $\overset{q}||\phi$
\medskip
$\putAbove{q}{3}{|||}$ becomes $||\overset{q}|$
\end{document}