定义一个二元运算符,使得 displaymath 中的下标如下所示

定义一个二元运算符,使得 displaymath 中的下标如下所示

目前我针对张量积分别使用以下命令完成张量积:

\documentclass{article}

\newcommand{\tensor}{\otimes}
\newcommand{\comptensor}{\mathbin{\hat{\otimes}}}

\newcommand{\testline}{V \tensor_k W \qquad V \tensor W \qquad V \comptensor_k W \qquad V \comptensor W}

\begin{document}
    \[
        \testline
    \]
    \[
        \textstyle \testline
    \]
\end{document}

两行看起来都像这样:

在此处输入图片描述

我想改变\tensor和的定义\comptensor,使得在textstyle中没有任何变化,但在displaystyle中我希望打印下标以下操作员而不是除了它之外的人。

答案1

使用自然的语法,这样您就可以改变主意并避免使用下划线符号。

\documentclass{article}
\usepackage{amsmath}

\makeatletter
\newcommand{\tens}{\gen@tens{\otimes}}
\newcommand{\comptens}{\gen@tens{\hat{\otimes}}}
\newcommand{\gen@tens}[1]{%
  \@ifnextchar_{\gen@@tens{#1}}{\mathbin{#1}}%
}
\def\gen@@tens#1_#2{%
  \mathpalette\gen@@@tens{{#1}{#2}}%
}
\newcommand\gen@@@tens[2]{\mathbin{\gen@@@@tens#1#2}}
\newcommand\gen@@@@tens[3]{%
  \ifx#1\displaystyle
    \mathop{#2}\limits_{#3}%
  \else
    {#2}_{#3}%
  \fi
}
\makeatother

\begin{document}

\[
A\tens B\comptens C \quad A\tens_{k}B\comptens_{k}C
\]
\begin{center}
$A\tens B\comptens C \quad A\tens_{k}B\comptens_{k}C$
\end{center}

\end{document}

在此处输入图片描述

答案2

我确实需要稍微改变一下语法,这样它就\comptensor采用一个可选参数作为其下标,而不是使用下划线符号。

不能使用\limits样式方法,因为它仅适用于\mathop类,而不适用于\mathbin。因此,我使用堆栈来获取\displaystyle下限。

\documentclass{article}
\usepackage{stackengine}
\newcommand{\tensor}{\otimes}
\newcommand{\comptensor}[1][]{
  \ifx\relax#1\relax\mathbin{\hat\otimes}\else\mathchoice
  {\mathbin{\ensurestackMath{\stackunder[1pt]{\hat{\otimes}}{\scriptstyle#1}}}}
  {\mathbin{\hat{\otimes}_{#1}}}
  {\mathbin{\hat{\otimes}_{#1}}}
  {\mathbin{\hat{\otimes}_{#1}}}
  \fi
}
\newcommand{\testline}[1][]{$#1 V \tensor W \qquad V \tensor_k W $\par
                            $#1 V \comptensor W \qquad V \comptensor[k] W$}

\begin{document}
\testline[\displaystyle]

\testline
\end{document}

在此处输入图片描述

相关内容