间距取决于可选的下标和上标

间距取决于可选的下标和上标

我对 LaTeX 完全陌生(使用了 2 天),所以如果这个问题已经被问到,我很抱歉,但我花了 6 个小时寻找解决方案,但无济于事。(我偶然发现了一个包 xpeek,它可能能够做我想做的事情(也可能不能),但文档太复杂了,我无法从中获得任何东西。)

我正在使用安斯马斯包来编写一些公式。我想引入一个用于格式化矩阵变量的新命令。我的第一次尝试是:

\newcommand{\mtrx}[1]{\boldsymbol{#1}}

看起来不错,除了当我使用下标时。在这种情况下,我的下标太远了,看起来不太好看。例如,$\mtrx{P}_{\mu\nu}$因为 P 是斜体,所以 P 和下标之间的空间大得令人不安。使用$\mtrx{P\!}_{\mu\nu}$看起来不错,但当我使用上标时也会遇到麻烦:在 中$\mtrx{P\!}_{\mu\nu}^{*}$,* 太近了,而$\mtrx{P}_{\mu\nu}^{*}$P 和 之间的空间\mu太大。

因此,我希望的行为是以某种方式编写宏\mtrx,使其查看宏后的标记。如果存在下标,它会在\!后插入#1。如果存在下标和上标,它会\;在上标中插入 。如果没有下标,则不会发生任何变化。

我尝试了一下

\makeatletter
  \newcommand{\mtrx}[1]{%
    \@ifnextchar_{\boldsymbol{#1}\!}{\boldsymbol{#1}}}
\makeatother

但无法检测是否还存在上标 - 或者根本无法读取宏后的第一个字符。我想,这应该可以用和来实现\@car\@cdr但我对如何使用它们一无所知。

任何帮助都值得感激。感谢您的时间。

[编辑]

好吧,我终于找到了解决办法。我偶然发现了一个版本,\@ifnextchar如果匹配,它会删除该字符这里。我不知道它是如何工作的,但它确实有效。

通过使用它来删除_^字符,我能够调用一些其他宏并将其变成A_{B}类似的东西\@mtrx@sub{A}{B}

以防万一,有人正在寻找类似的问题,这是我的解决方案。

  1. \removeifnextchar取自上面的链接,其作用类似于\@ifnextchar,只是它会删除匹配的字符。
  2. \mtrx仅将其参数格式化为粗体并调用\@mtrx@chk检查下标和上标
  3. \@mtrx@chk\removeifnextchar分别使用和 调用\@mtrxsub或来查看下一个字符,或者在下一个字符既不是也不是 的\@mtrx@sup情况下返回其参数。_^
  4. \@mtrx@sub\@mtrx@sup分别采用 2 个参数,以下标或上标的方式附加它们,然后\@mtrx@chk使用这个新参数再次调用以评估下一个下标或上标。

也许这不是最好的解决方案,但我很高兴我终于找到了它。无论如何,为了从中学习,请随时发表评论和/或改进。

\makeatletter
  \newcommand{\removeifnextchar}[3]{%
    \begingroup
    \ltx@LocToksA{\endgroup#2}%
    \ltx@LocToksB{\endgroup#3}%
    \ltx@ifnextchar{#1}{%
      \def\next{\the\ltx@LocToksA}%
      \afterassignment\next
      \let\scratch= %
    }{%
      \the\ltx@LocToksB
    }%
  }

  \newcommand{\mtrx}[1]{    
    \ensuremath
    \@mtrx@chk{\boldsymbol{#1}}    
  }
  \def\@mtrx@chk#1{%
    \removeifnextchar{_} %
    {\@mtrx@sub{#1}}
    { \removeifnextchar{^} %
      {\@mtrx@sup{#1}}
      {#1}
    }
  }
  \def\@mtrx@sub#1#2{%
    \@mtrx@chk{#1_{\!#2}}
  }
  \def\@mtrx@sup#1#2{%
    \@mtrx@chk{#1^{\:#2}}
  }
\makeatother

答案1

\boldsymbol在内部将字符装箱并将其设置在新的数学列表中。这样可以防止应用字体指定的下标校正。如果您使用包中的替代机制,则会bmP当前数学列表中将字符设置为粗体字母,然后 TeX 将根据所用字体的字体参数中设置的量来校正下标位置:

在此处输入图片描述

\documentclass{article}

\usepackage{bm}
\usepackage{amsmath}

\newcommand{\mtrx}[1]{\bm{#1}}


\begin{document}


$\mtrx{P}_{\mu\nu}$


\end{document}

答案2

像这样:

\documentclass{article}
\usepackage{amsmath}

\newtoks\ilktoks
\makeatletter
\def\mtrx #1{\ilktoks{\mtrx@a{#1}}\@ifnextchar_{\mtrx@A}%
                                 {\@ifnextchar^{\mtrx@B}{\mtrx@end}}}

\def\mtrx@A _#1{\ilktoks\expandafter {\the\ilktoks_{#1}}%
                 \@ifnextchar^{\mtrx@AB}{\mtrx@endsub}}

\def\mtrx@B ^#1{\ilktoks\expandafter {\the\ilktoks^{\mtrx@sup #1}}%
                \@ifnextchar_{\mtrx@BA}{\mtrx@endsup}}

\def\mtrx@AB ^#1{\ilktoks\expandafter{\the\ilktoks^{\;#1}}\mtrx@endsubsup }

\def\mtrx@BA _#1{\ilktoks\expandafter{\the\ilktoks_{#1}}\mtrx@endsubsup }

\def\mtrx@end    {\def\mtrx@a ##1{\boldsymbol{##1}}\the\ilktoks }

\def\mtrx@endsub {\def\mtrx@a ##1{{\boldsymbol{##1}\!}}\the\ilktoks }

\def\mtrx@endsup {\def\mtrx@a ##1{{\boldsymbol{##1}}}\def\mtrx@sup {}%
                  \the\ilktoks }

\def\mtrx@endsubsup {\def\mtrx@a ##1{{\boldsymbol{##1}\!}}%
                     \def\mtrx@sup {\;}\the\ilktoks }
\makeatother

\begin{document}\thispagestyle{empty}

\ttfamily
$\mtrx {P}Q$ (with \string\mtrx)

$\boldsymbol{P}Q$ (without)

$\mtrx {P}_{\mu\nu}Q$ (with \string\mtrx)

${\boldsymbol{P}}_{\mu\nu}Q$ (without)

$\mtrx {P}^{*}Q$ (with \string\mtrx)

${\boldsymbol{P}}^{*}Q$ (without)

$\mtrx {P}_{\mu\nu}^{*}Q$ (with \string\mtrx; sub first)

${\boldsymbol{P}}_{\mu\nu}^{*}Q$ (without)


$\mtrx {P}^{*}_{\mu\nu}Q$ (with \string\mtrx; sup first)

${\boldsymbol{P}}^{*}_{\mu\nu}Q$ (without)

\end{document}

麥克

相关内容