当尝试使用物理包速记排版单位向量时,\vu
使用 kpfonts 时会出现以下问题,而使用现代计算机时不会出现这些问题。
\vu{i}
并且\vu{j}
不要使用无点版本的 i 和 j。- 当明确说明
\vu{\imath}
和时\vu{\jmath}
,产生的输出并不像其他字符一样以粗体显示。 - 当使用 解决该问题时
\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}}}}