可扩展 \vec 替代 \overrightarrow

可扩展 \vec 替代 \overrightarrow

我不想改成\overrightarrow{},它使用通常的可扩展箭头并将其放在参数上方,而是想获得一个可扩展的\vec{}符号。我的目的是获得一个新的命令\vect{},例如,它与 完全相同,\overrightarrow{}但头部是符号\vec(可扩展部分是用适当的“ \relbars”完成的,我不知道)。

就我而言,我正在使用kpfonts包。

\documentclass{scrartcl}
\usepackage{kpfonts}
\newcommand*{\vv}[1]{\vec{\mkern0mu#1}}
\begin{document}
\[
    \vec u,\ \vv u,\ \vv{OA},\ \vv{BC},\ \overrightarrow{AB}
\]
\end{document}

我定义了该\vv{}命令,因为通常\vec会给你一个未对齐的箭头。

在此处输入图片描述

编辑: 正如@GonzaloMedina 指出的那样,确实存在该esvect包。但是,在我看来,它没有提供任何符合 样式的箭头kpfonts

答案1

这里我介绍了\xshlongvec,它接受一个可选参数和一个强制参数。强制参数是 所要放置 的文本\vec。可选参数是一个数字,表示应用于 vec 箭头的向右字距(以点为单位),因为正如 OP 指出的那样, 的字距调整\vec并不是最好的。

在这个 MWE 中,我使用了kpfontsOP 提到的。我首先给出未改变的,\vec然后是两个实例\xshlongvec。我注意到的一个缺陷是箭头的左端不像 那样倾斜\vec,而是由于由 创建的而呈方形\rule

感谢 Phillipe 指出原始答案中的缺陷,现已修复。

    \documentclass[12pt]{scrartcl}
    \usepackage{kpfonts}
    \usepackage{stackengine}
    \usepackage{calc}
    \newlength\shlength
    \newcommand\xshlongvec[2][0]{\setlength\shlength{#1pt}%
      \stackengine{-5.6pt}{$#2$}{\smash{$\kern\shlength%
        \stackengine{7.55pt}{$\mathchar"017E$}%
          {\rule{\widthof{$#2$}}{.57pt}\kern.4pt}{O}{r}{F}{F}{L}\kern-\shlength$}}%
          {O}{c}{F}{T}{S}}
    \begin{document}
    \centering
    \[ \vec{A} \quad \xshlongvec[1]{ABC} \quad \xshlongvec[1]{xyz} \xshlongvec{\Omega M} \]
    \end{document}

输出的屏幕截图包括 A、ABC、xyz 和 ΩM


通过使用该包,下面的已编辑解决方案可以适用于各种数学风格scalerel

\documentclass[12pt]{scrartcl}
\usepackage{kpfonts}
\usepackage{stackengine,scalerel}
\usepackage{calc}
\newlength\shlength
\newcommand\xshlongvec[2][0]{\ThisStyle{\setlength\shlength{#1\LMpt}%
  \stackengine{-5.6\LMpt}{$\SavedStyle#2$}{\smash{$\kern\shlength%
    \stackengine{\dimexpr 1.3pt+6.25\LMpt}{$\SavedStyle\mathchar"017E$}%
      {\rule{\widthof{$\SavedStyle#2$}}{\dimexpr.1pt+.5\LMpt}\kern.4\LMpt}{O}{r}{F}{F}{L}\kern-\shlength$}}%
      {O}{c}{F}{T}{S}}}
\begin{document}
\centering
\[ \vec{A} \quad \xshlongvec[1]{ABC} \quad \xshlongvec[1]{xyz} \quad \xshlongvec{\Omega M} \]
\[ \scriptstyle \vec{A} \quad \xshlongvec[1]{ABC} \quad \xshlongvec[1]{xyz} \quad \xshlongvec{\Omega M}\]
\[ \scriptscriptstyle \vec{A} \quad \xshlongvec[1]{ABC} \quad \xshlongvec[1]{xyz} \quad \xshlongvec{\Omega M} \]
\end{document}

在此处输入图片描述

答案2

命令\vec使用\mathchar"017E作为箭头,而\overrightarrow使用\mathchar"3221。在我看来,两者看起来都是彼此的缩放版本。所以我们可以用 的\overrightarrow箭头尖端进行复制\vec。我提出了两个版本,一个是 LaTeX 版本,另一个是遵循路线的版本amsmath。对于amsmath版本,我给出了另一个变体,水平缩放减号以使其更薄。

\documentclass{article}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{kpfonts}
\newcommand*{\vv}[1]{\vec{\mkern0mu#1}}


\makeatletter
\newcommand{\vect}[1]{%
  \vbox{\m@th \ialign {##\crcr
  \vectfill\crcr\noalign{\kern-\p@ \nointerlineskip}
  $\hfil\displaystyle{#1}\hfil$\crcr}}}
\def\vectfill{%
  $\m@th\smash-\mkern-7mu%
  \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
  \mkern-7mu\raisebox{-3.81pt}[\p@][\p@]{$\mathord\mathchar"017E$}$}

\newcommand{\amsvect}{%
  \mathpalette {\overarrow@\vectfill@}}
\def\vectfill@{\arrowfill@\relbar\relbar{\raisebox{-3.81pt}[\p@][\p@]{$\mathord\mathchar"017E$}}}

\newcommand{\amsvectb}{%
  \mathpalette {\overarrow@\vectfillb@}}
\newcommand{\vecbar}{%
  \scalebox{0.8}{$\relbar$}}
\def\vectfillb@{\arrowfill@\vecbar\vecbar{\raisebox{-4.35pt}[\p@][\p@]{$\mathord\mathchar"017E$}}}
\makeatother

\begin{document}
\begin{align}
  \mathchar"017E, \mathchar"3221\\
  \vec u,\ \vv u,\ \vv{OA},\ \vv{BC},\ \overrightarrow{AB} \\
  \vect{u}, \vect{OA}, \vect{BC}, \vect{AB}\\
  \amsvect{u}, \amsvect{OA}, \amsvect{BC}, \amsvect{AB}\\
  \amsvectb{u}, \amsvectb{OA}, \amsvectb{BC}, \amsvectb{AB}
\end{align}
\end{document}

示例输出

请注意,这种使用减号和短箭头构建可扩展重音符号的方法显示了典型的 LaTeX 弱点,即这些重音符号在某些分辨率下呈现得很奇怪。raise 参数-3.81pt是我发现的缓解此问题的最佳近似值。您可能需要对其进行调整以获得更好的结果。此外,第三个带有缩放减号的变体还有另一个参数(0.8缩放因子),可能需要进行微调。

\overarrow@箭头和字母之间的垂直间距由from的使用决定amsmath,因此您获得的空间与 相同\overrightarrow。如果我们想让它稍微低一点,我们可以制作一个新版本的并在和\overarrow@中使用它:\amsvect\amsvectb

\makeatletter
\def\my@overarrow@#1#2#3{\vbox{\ialign{##\crcr #1#2\crcr \noalign{\kern-\p@\nointerlineskip}$\m@th \hfil #2#3\hfil $\crcr}}}

\newcommand{\amsvect}{%
  \mathpalette {\my@overarrow@\vectfill@}}
\def\vectfill@{\arrowfill@\relbar\relbar{\raisebox{-3.81pt}[\p@][\p@]{$\mathord\mathchar"017E$}}}

\newcommand{\amsvectb}{%
  \mathpalette {\my@overarrow@\vectfillb@}}
\newcommand{\vecbar}{%
  \scalebox{0.8}{$\relbar$}}
\def\vectfillb@{\arrowfill@\vecbar\vecbar{\raisebox{-4.35pt}[\p@][\p@]{$\mathord\mathchar"017E$}}}
\makeatother

这里的神奇数字是\kern-\p@中的\my@overarrow,它将箭头向内推一点。同样,这可以进行微调。请注意,这是 中已经使用的值\vect

答案3

我非常喜欢esvect软件包。如果你读过文档(https://www.ctan.org/pkg/esvect),它会告诉您可以选择所需的箭头类型。默认选项是

\usepackage[d]{esvect}

尽管你不需要在序言中添加“d”。

如果选择选项“h”,则箭头看起来更像中使用的箭头\vec

相关内容