在数学模式下使 f 处于活动状态

在数学模式下使 f 处于活动状态

我正在尝试纠正 mathspec 中的间距问题。我希望在数学模式下在字母 f 后添加一个额外的空格,但前提是字母 f 后面没有下标。我不想每次都手动执行此操作,所以我尝试了以下代码:

\makeatletter
\mathcode`f="8000
\DeclareMathSymbol{\f}{\mathalpha}{letters}{`f}
\newcommand{\mathf}{\@ifnextchar_{\f}{\f \,}}
\begingroup
    \lccode`\~=`\f
    \lowercase{\gdef~{\ifnum\the\mathgroup=\m@ne \mathf \else \f \fi}}
\endgroup
\makeatother

但它不起作用。它无论如何都会添加空间!我该如何解决这个问题?

答案1

\ifnum被求值时,\else不会被移除,因此\mathf它会看到它,并且永远不会进一步扫描下一个_。你应该\expandafter\mathf这样做,所以被移除,直到\else匹配的被扩展。\fi\mathf

不过,我建议你使用一些更好的代码:

\documentclass{article}
\usepackage{mathspec}
\setmainfont{Hoefler Text}
\setmathfont(Digits,Latin)[Numbers=Lining]{Hoefler Text}
\setmathrm[Numbers=Lining]{Hoefler Text}

\makeatletter
\AtBeginDocument{%
  \edef\SAVEfCODE{\the\Umathcodenum`f } % just for the test
  \Umathcharnumdef\math@f\Umathcodenum`f 
  \mathcode`f=\string"8000 }
\begingroup\lccode`~=`f
\lowercase{\endgroup
  \def~{%
    \math@f
    \ifnum\mathgroup=\m@ne
      \expandafter\@firstofone
    \else
      \expandafter\@gobble
    \fi
    {\@ifnextchar_{\relax}{\,}}%
  }
}
\makeatother

\begin{document}

$f(x)f_1(x)\mathbf{f}(x)\mathbf{f}_1(x)\mathbf{f_1}(x)$

%% Just to show the difference
\Umathcodenum`f=\SAVEfCODE\relax
$f(x)f_1(x)\mathbf{f}(x)\mathbf{f}_1(x)\mathbf{f_1}(x)$

\end{document}

带有 的部分\SAVEfcode只是为了显示差异。

在此处输入图片描述

注意:在 中\ifnum\the\mathgroup\the是多余的,因为\mathgroup 一个数字。我之所以使用,\Umath...是因为它在 的上下文中更安全mathspec

相关内容