Я пытаюсь использовать символ из отдельного шрифта для математического оператора «звездочка» (∗) по центру. В рассматриваемом шрифте есть только повышенный (во многих шрифтах) глиф «звездочка» (*), который я пытаюсь использовать для варианта по центру, опуская его.
В математическом режиме оператор может использоваться как , так *
и \ast
, которые определены абсолютно одинаково в строках 150 и 297 в fontmath.ltx
.
\ast
можно переопределить с помощью \renewcommand
, но, *
похоже, это другой зверь. Можно ли изменить его на макрос или каким-либо другим способом изменить базовую линию глифа?
\documentclass{minimal}
\DeclareSymbolFont{mymathoperators}{OT1}{phv}{m}{n}
\DeclareMathSymbol{\protoast}{\mathbin}{mymathoperators}{"2A}
\DeclareMathSymbol{*}{\mathbin}{mymathoperators}{"2A}
\renewcommand*{\ast}{\mathbin{\raisebox{-0.7ex}{\ensuremath{\protoast}}}}
\begin{document}
\( good \ast , bad * . \)
\end{document}
решение1
С использованием@egreg's\DeclareMathActive
:
\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\DeclareSymbolFont{mymathoperators}{OT1}{phv}{m}{n}
\DeclareMathSymbol{\protoast}{\mathbin}{mymathoperators}{"2A}
\DeclareMathSymbol{*}{\mathbin}{mymathoperators}{"2A}
\renewcommand*{\ast}{\mathbin{\raisebox{-0.7ex}{\ensuremath{\protoast}}}}
\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{*}{\ast}
\begin{document}
\(good \ast , bad * . \)
\end{document}