我对 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}
。
以防万一,有人正在寻找类似的问题,这是我的解决方案。
\removeifnextchar
取自上面的链接,其作用类似于\@ifnextchar
,只是它会删除匹配的字符。\mtrx
仅将其参数格式化为粗体并调用\@mtrx@chk
检查下标和上标\@mtrx@chk
\removeifnextchar
分别使用和 调用\@mtrxsub
或来查看下一个字符,或者在下一个字符既不是也不是 的\@mtrx@sup
情况下返回其参数。_
^
\@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
在内部将字符装箱并将其设置在新的数学列表中。这样可以防止应用字体指定的下标校正。如果您使用包中的替代机制,则会bm
在P
当前数学列表中将字符设置为粗体字母,然后 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}