将宏应用于字符串的第 x 个符号

将宏应用于字符串的第 x 个符号

我想定义一个命令,将一个符号序列放在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 }项目。请注意,第二个和第三个参数允许使用算术。类似地,返回第 - 个项目。xy\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}

在此处输入图片描述

相关内容