关于 \DeclareMathActive 和无支撑上标/下标的问题

关于 \DeclareMathActive 和无支撑上标/下标的问题

我发现星号kpfonts在上标/下标中使用时太小,因此,以下答案这里这里,我使用@egreg 的聪明才智在数学模式中\DeclareMathActive重新定义为:*\textstyle\ast

\documentclass{article}
\usepackage{kpfonts,etoolbox}

\makeatletter
\newcommand{\DeclareMathActive}[2]{%
  % #1 is the character, #2 is the definition
  \expandafter\edef\csname keep@#1@code\endcsname{\mathchar\the\mathcode`#1 }
  \begingroup\lccode`~=`#1\relax
  \lowercase{\endgroup\def~}{#2}%
  \AtBeginDocument{\mathcode`#1="8000 }%
}

\newcommand{\std}[1]{\csname keep@#1@code\endcsname}
\patchcmd{\newmcodes@}{\mathcode`\-\relax}{\std@minuscode\relax}{}{\ddt}
\AtBeginDocument{\edef\std@minuscode{\the\mathcode`-}}
\makeatother

\DeclareMathActive{*}{{\textstyle\ast}}

\begin{document}
$f_*\mathscr{F} \quad f^*\mathscr{F} \quad R^*$

$A*B$
\end{document}

这个方法效果很好,但是为了R^*不用括号*(如R^{*}),我必须在 周围添加括号\textstyle\ast。这样就可以删除\mathbin等表达式中的空格A*B

是否有任何技巧\DeclareMathActive可以同时允许*上标/下标中的无支撑和正确的间距A*B? 一个想法是扩展DeclareMathActive以接受如下参数\mathchoice

\DeclareMathActiveChoice{<char>}{<display code>}{<text code>}{<script code>}{<scriptscript code>}

然后就可以使用\DeclareMathActiveChoice{*}{\ast}{\ast}{{\textstyle\ast}}{\ast}

但是我不知道如何实现这样的扩展。


仅供参考,以下是我为什么要这么做。比较

ast 尺寸

为了进行专业排版比较,以下是 Hartshorne 的代数几何

哈茨霍恩

答案1

您可以像宏一样创建^ 和获取参数,这意味着将不再起作用,虽然需要 ,但这并不是很大的损失。_x^\frac{1}{2}x^{\frac{1}{2}}

在此处输入图片描述

\documentclass{article}
\usepackage{kpfonts,etoolbox}

\makeatletter
\newcommand{\DeclareMathActive}[2]{%
  % #1 is the character, #2 is the definition
  \expandafter\edef\csname keep@#1@code\endcsname{\mathchar\the\mathcode`#1 }
  \begingroup\lccode`~=`#1\relax
  \lowercase{\endgroup\def~}{#2}%
  \AtBeginDocument{\mathcode`#1="8000 }%
}

\newcommand{\std}[1]{\csname keep@#1@code\endcsname}
\patchcmd{\newmcodes@}{\mathcode`\-\relax}{\std@minuscode\relax}{}{\ddt}
\AtBeginDocument{\edef\std@minuscode{\the\mathcode`-}}
\@makeother\^
\@makeother\_
\makeatother

\DeclareMathActive{*}{\mathbin{\textstyle\ast}}
\DeclareMathActive{^}{\foosup}
\DeclareMathActive{_}{\foosub}
\def\foosup#1{\sp{#1}}
\def\foosub#1{\sb{#1}}

\begin{document}
$f_*\mathscr{F} \quad f^*\mathscr{F} \quad R^*$

$A*B$
\end{document}

相关内容