是否可以创建一个当应用 $\mathrm$ 时会发生变化的宏?

是否可以创建一个当应用 $\mathrm$ 时会发生变化的宏?

我想定义一个宏

\newcommand{\III}{I\hspace{-0.2em}I\hspace{-0.2em}I}

当我输入

$ \mathrm{\III} $

在数学模式下,编译器将编译

$ \mathrm{I\hspace{-0.05em}I\hspace{-0.05em}I} $

有没有什么办法可以做到这一点?

答案1

\mathnormal您可以为生效的情况设置一个间距,并为其他数学组设置较少的空间。

\documentclass{article}

\usepackage{amsmath}

\newcommand{\III}{{I\IIIspace I\IIIspace I}}
\newcommand{\IIIspace}{%
  \mspace{%
    \ifnum\mathgroup=-1
      -5mu
    \else
      -2mu
    \fi
  }%
}

\begin{document}

$\III\ne\mathrm{\III}\ne\mathbf{\III}$

\end{document}

在此处输入图片描述

一种不同的实现,在 的情况下,\mathnormal我们使用\mathit(并通过插入合适的下标来取消 ,从而抑制斜体校正\scriptspace

\documentclass{article}

\usepackage{amsmath}

\newcommand{\III}{%
  \ifnum\mathgroup=-1
    \expandafter\mathit
  \fi
  {I_{\kern-\scriptspace}\mspace{-2mu}I_{\kern-\scriptspace}\mspace{-2mu}I}%
}

\begin{document}

$\III\ne\mathrm{\III}\ne\mathbf{\III}$

$\scriptstyle\III\mathrm{\III}\mathbf{\III}$

$\scriptscriptstyle\III\mathrm{\III}\mathbf{\III}$

\end{document}

在此处输入图片描述

答案2

您可以测试寄存器的当前值\fam

\def\III{I\ikern I\ikern I}
\def\ikern{\mkern-\ifnum\fam<0 4.5mu\else 1.5mu \fi}

$\III \quad \rm \III$

\bye

答案3

回答你的标题所问的问题:

我不敢推荐这个,因为\mathrm它不接受任何争论,我怀疑会发生一些不好的事情。

下面两个例子都打印hello world

\documentclass{article}
\begin{document}
  \newif\ifMathrm
  \newcommand\mathrmNew[1]{\Mathrmtrue\mathrm{#1}\Mathrmfalse}
  \newcommand\hello{\ifMathrm world\else hello\fi}
  \[ \hello~\mathrm{\hello} \]
\end{document}

最好将\mathrmNew其设置为切换标志。这样更好,因为它不会在每次\mathrm调用时执行 if 语句。像这样:

\documentclass{article}
\begin{document}
  \newif\ifMathrm
  \newcommand{\mathrmNew}[1]{\Mathrmtrue\mathrm{#1}\Mathrmfalse}
  \newcommand{\hello}{\ifMathrm world\else hello\fi}
  \[ \hello~\mathrmNew{\hello} \]
\end{document}

相关内容