我想定义一个宏
\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}