下列的这个答案,我写了一个命令,允许我写入\cont*{(D_\mu\phi)}
以获得的效果(D_\mu\phi)^\dagger(D^\mu\phi)
。
\def\replace#1#2#3{%
\def\tmp##1#2{##1#3\tmp}%
\tmp#1\stopreplace#2\stopreplace}
\def\stopreplace#1\stopreplace{}
\makeatletter
\newcommand{\cont}{\@ifstar\@@cont\@cont}
\newcommand{\contsubst}[1]{\replace{#1}{_\mu}{^\mu}}
\def\@cont#1{{#1}\contsubst{#1}}
\def\@@cont#1{{#1}^\dagger\contsubst{#1}}
\makeatother
问题是,如果在花括号内,这显然不起作用\mu
,例如F_{\mu\nu}
。
我尝试过\contsubst
这样定义
\edef\LB{\string{}
\newcommand{\contsubst}[1]{\replace{\replace{#1}{_\mu}{^\mu}}{_\LB\mu}{^\LB\mu}}
但那不起作用。
编辑:
以下是该命令应执行的操作的一些示例:
\cont{A_\mu} -> A_\mu A^\mu
\cont{F_{\mu\nu}} -> F_{\mu\nu} F^{\mu\nu}
\cont*{\phi} -> \phi^\dagger \phi
\cont*{(D_\mu\phi_1)} -> (D_\mu\phi_1)^\dagger (D^\mu\phi_1) % subscript 1 stays a subscript
\cont*{\Phi_{\mu\nu}} -> \Phi_{\mu\nu}^\dagger \Phi^{\mu\nu}
答案1
我认为你不应该强调\mu
:总和指标可以是任何东西。
只需排版两次参数,但将第一个更改_
为^
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cont}{sm}
{
\tl_set:Nn \l_suthree_cont_tl { #2 }
\regex_replace_once:nnN { \_ } { \cU\^ } \l_suthree_cont_tl
#2 \IfBooleanT{#1}{\sp{\dagger}} \tl_use:N \l_suthree_cont_tl
}
\tl_new:N \l_suthree_cont_tl
\ExplSyntaxOff
\begin{document}
$\cont{A_\mu}$ $A_\mu A^\mu$
$\cont{F_{\mu\nu}}$ $F_{\mu\nu} F^{\mu\nu}$
$\cont*{\phi}$ $\phi^\dagger \phi$
$\cont*{(D_\mu\phi_1)}$ $(D_\mu\phi_1)^\dagger (D^\mu\phi_1)$
$\cont*{\Phi_{\mu\nu}}$ $\Phi_{\mu\nu}^\dagger \Phi^{\mu\nu}$
\end{document}
不过,我不会继续这个想法。由于您使用的东西既不是下标也不是上标,而是两者兼而有之,所以我会使用不同的字符来表示它。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\cont}{sm}
{
\tl_set:Nn \l_suthree_cont_sub_tl { #2 }
\tl_set_eq:NN \l_suthree_cont_sup_tl \l_suthree_cont_sub_tl
\regex_replace_once:nnN { \? } { \cD\_ } \l_suthree_cont_sub_tl
\regex_replace_once:nnN { \? } { \cU\^ } \l_suthree_cont_sup_tl
\tl_use:N \l_suthree_cont_sub_tl
\IfBooleanT{#1}{\sp{\dagger}}
\tl_use:N \l_suthree_cont_sup_tl
}
\tl_new:N \l_suthree_cont_sub_tl
\tl_new:N \l_suthree_cont_sup_tl
\ExplSyntaxOff
\begin{document}
$\cont{A?\mu}$ $A_\mu A^\mu$
$\cont{F?{\mu\nu}}$ $F_{\mu\nu} F^{\mu\nu}$
$\cont*{\phi}$ $\phi^\dagger \phi$
$\cont*{\phi_1}$ $\phi_1^\dagger \phi_1$
$\cont*{(D?\mu\phi_1)}$ $(D_\mu\phi_1)^\dagger (D^\mu\phi_1)$
$\cont*{\Phi?{\mu\nu}}$ $\Phi_{\mu\nu}^\dagger \Phi^{\mu\nu}$
\end{document}
答案2
一种选择是使用etoolbox
并修补强制参数,替换_
为^
:
\documentclass{article}
\usepackage{xparse,etoolbox}
\NewDocumentCommand{\cont}{s m}{%
\def\mArg{#2}
\patchcmd{\mArg}{_}{^}{}{}% \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
#2
\IfBooleanT{#1}{^\dagger}
\mArg
}
\begin{document}
$\cont{A_\mu}$ % A_\mu A^\mu
$\cont{F_{\mu\nu}}$ % F_{\mu\nu} F^{\mu\nu}
$\cont*{\phi}$ % \phi^\dagger \phi
$\cont*{(D_\mu\phi_1)}$ % (D_\mu\phi_1)^\dagger (D^\mu\phi_1) % subscript 1 stays a subscript
$\cont*{\Phi_{\mu\nu}}$ % \Phi_{\mu\nu}^\dagger \Phi^{\mu\nu}
\end{document}
答案3
xparse
这是使用+ 的解决方案l3regex
。
\ExplSyntaxOn
\NewDocumentCommand{\cont}{sm}
{
\tl_set:Nn \l_tmpa_tl {#2}
\regex_replace_all:nnN {\cD_(\cB.?\c{[mn]u})} {\cU^\1} \l_tmpa_tl
{#2} \IfBooleanT{#1}{^\dagger} \tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff