使用 kpfonts 时,i 和 j 的矢量版本与物理包配合不佳

使用 kpfonts 时,i 和 j 的矢量版本与物理包配合不佳

当尝试使用物理包速记排版单位向量时,\vu使用 kpfonts 时会出现以下问题,而使用现代计算机时不会出现这些问题。

  1. \vu{i}并且\vu{j}不要使用无点版本的 i 和 j。
  2. 当明确说明\vu{\imath}和时\vu{\jmath},产生的输出并不像其他字符一样以粗体显示。
  3. 当使用 解决该问题时\hat{\textbf{\j}},输出(仅针对 j)仍然有一个点。

答案1

如果我尝试

\documentclass{article}
%\usepackage{kpfonts}
\usepackage{physics}

\begin{document}

$\vu{i}+\vu{j}$

\end{document}

(请注意,kpfonts已注释掉),我得到了

在此处输入图片描述

这些点在那里,这并不奇怪,因为包确实

% Unit vector [star for Greek and italic Roman]
\DeclareDocumentCommand\vectorunit{ s m }{%
  \IfBooleanTF{#1}
    {\boldsymbol{\hat{#2}}}
    {\mathbf{\hat{#2}}}%
}
% Shorthand for \vectorunit
\DeclareDocumentCommand\vu{}{\vectorunit}

(已重新格式化,以便更加清晰)。

这是一个解决方法(不仅适用于kpfonts):

\documentclass{article}
\usepackage{kpfonts}
\usepackage{physics}

\makeatletter
\ifkp@sfmath
  \DeclareSymbolFont{boldletters}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
  \SetSymbolFont{boldletters}{bold}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
\else
  \DeclareSymbolFont{boldletters}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
  \SetSymbolFont{boldletters}{bold}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
\fi
\SetSymbolFont{boldletters}{rm}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
\SetSymbolFont{boldletters}{boldrm}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
\SetSymbolFont{boldletters}{sf}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
\SetSymbolFont{boldletters}{boldsf}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
\DeclareSymbolFontAlphabet{\mathbf}{boldletters}
\makeatother
\DeclareMathSymbol{\bi}{\mathord}{boldletters}{"10}
\DeclareMathSymbol{\bj}{\mathord}{boldletters}{"11}

\begin{document}

$\vu{\bi}+\vu{\bj}$

\textbf{i j \^{\i} \^{\j}}

i j

\end{document}

在此处输入图片描述

一种“自我修复”方法,因此您可以输入\vu{i}\vu{j}

\documentclass{article}
\usepackage{kpfonts}
\usepackage{physics}

\makeatletter
\ifkp@sfmath
  \DeclareSymbolFont{boldletters}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
  \SetSymbolFont{boldletters}{bold}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
\else
  \DeclareSymbolFont{boldletters}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
  \SetSymbolFont{boldletters}{bold}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
\fi
\SetSymbolFont{boldletters}{rm}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
\SetSymbolFont{boldletters}{boldrm}{OT1}{jkp\kp@famillem\kp@fligm\kp@stylem}{b}{n}
\SetSymbolFont{boldletters}{sf}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
\SetSymbolFont{boldletters}{boldsf}{OT1}{jkpss\kp@fligm\kp@stylem}{b}{n}
\DeclareSymbolFontAlphabet{\mathbf}{boldletters}
\makeatother
\DeclareMathSymbol{\bi}{\mathord}{boldletters}{"10}
\DeclareMathSymbol{\bj}{\mathord}{boldletters}{"11}

\ExplSyntaxOn
\RenewDocumentCommand\vectorunit{ s m }
 {
  \IfBooleanTF{#1}
    {\boldsymbol{\hat{#2}}}
    {\mathbf{\hat{\fixphysics_replace:n{#2}}}}
 }
\cs_new:Nn \fixphysics_replace:n
 {
  \str_case:nnF { #1 }
   {
    { i } { \bi }
    { j } { \bj }
   }
   { #1 }
 }
\ExplSyntaxOff

\begin{document}

$\vu{i}+\vu{j}$

\textbf{i j \^{\i} \^{\j}}

i j

\end{document}

答案2

虽然\j确实有一个点,但它是否在字符边界之外,因此所要做的就是明确地剪切到字体边界框。

\usepackage{kpfonts}
\usepackage{amsthm, amsmath, amssymb}
\usepackage{mathrsfs}
\usepackage{trimclip}
\usepackage{physics}

% HACK: \imath and \jmath don't go bold in the \vu environment, so use text mode instead
\newcommand{\ihat}{\, \hat{\textbf{\i}}}
% HACK: \j still has a dot, but it's defined outside of the bounding box for the character. Explicitly clip so it doesn't display.
\newcommand{\jhat}{\, \hat{\textbf{\clipbox{0pt 0pt 0pt 0pt}{\j}}}} 

相关内容