ConTeXt :相当于 LaTeX esvect

ConTeXt :相当于 LaTeX esvect

使用 LaTeX 时,我使用了 esvect 包,它具有以下有趣的功能:

  • 长度恰到好处的矢量箭头
  • 很多箭头版本
  • 特别注意带下标的向量

我在 ConTeXt 中找不到任何等效项。我发现这次谈话,但结果并不适合我,尤其是下标的情况。我尝试直接使用 esvect 的代码,但它似乎使用了 LaTeX 编程实用程序(因此它不是纯 TeX,并且不能在 ConTeXt 中按原样使用)。我尝试过改编它(该包大约有 20 行代码,所以我认为这是可行的),但由于我根本不是 TeX 程序员,所以我很快就放弃了。

有没有一位 Plain TeX 程序员能够完成这么小的翻译?或者有其他令人满意的替代方案?

编辑

我知道我问得不好:我的目的是将 esvect 包的功能与 ConTeXt 结合使用。我要求提供 Plain TeX 版本,因为我(错误地,正如 Henri Menke 在评论中解释的那样)认为它可以与 ConTeXt 一起使用,并且可能更容易制作或接触到更多的程序员。Henri Menke 提供了一个完美工作的 Plain TeX 版本,但由于它不能与 ConTeXt 一起使用,所以它不是我最终想要的。是否可以有这个包的 ConTeXt 版本?由于我既不是 TeX 程序员也不是 metapost 用户,所以我不知道处理它的最佳方法是什么……
提前致谢。

第二次编辑

由于@Aditya 要求我更清楚地解释我的问题,我与 Palatino 字体进行了比较(因为这是我使用的字体),比较了使用 esvect 可以实现的功能以及使用 LaTeX 和 ConTeXt 可以实现的功能。下面是代码,然后是快照,然后是详细信息:

%% LaTeX code
\documentclass[11pt]{article}
\usepackage[sc]{mathpazo}
\linespread{1.05}
\usepackage{multicol}
\usepackage{amsmath}
\usepackage[g]{esvect}
\begin{document}
\begin{multicols}{2}
  esvect package
  \begin{equation*}
    \vv{F}_{\text{spring}\to M} = -k(x-\ell_{0})\vv*{u}{x}
  \end{equation*}
  \begin{equation*}
    \text{correct } \vv{AB}, \vv{\imath}
  \end{equation*}
  \begin{equation*}
    \vv*{u}{x} \text{ more adapted than } \vv{u}_{x}
  \end{equation*}
  \begin{equation*}
    \vv{v} = -\vv{grad}\phi
  \end{equation*}

  out of the box
  \begin{equation*}
    \vec{F}_{\text{spring}\to M} = -k(x-\ell_{0})\vec{u}_{x}
  \end{equation*}
  \begin{equation*}
    \text{awful }\vec{AB}, \text{ correct } \vec{\imath}
  \end{equation*}
  \begin{equation*}
    \vv*{u}{x} \text{ better arrow, worse spacing than } \vec{u}_{x}
  \end{equation*}
  \begin{equation*}
    \vec{v} = -\vec{grad}\phi
  \end{equation*}
\end{multicols}
\end{document}

% ConTeXt code
\usemodule[simplefonts]
\definefontfeature[default][default][onum=yes]
\setupbodyfont[11pt,palatino]

\starttext
\startformula
  \vec{F}_{\text{spring}\to M} = -k(x-\ell_{0})\vec{u}_{x}
\stopformula
\startformula
  \text{correct } \vec{AB}, \vec{\imath}
\stopformula
\startformula
  \text{neither } \vec{u}_{x} \text{ nor } \vec{u_{x}}
\stopformula
\startformula
  \vec{v} = -\vec{grad}\phi
\stopformula
\stoptext

以下是使用 LaTeX 的结果: 在此处输入图片描述

下面是使用 ConTeXT 的结果 在此处输入图片描述

最后,我在 esvect 中寻求的东西可以总结如下:

  • 在单字母向量上,箭头两侧都稍长一些,我发现它的可读性更强
  • 在带有下标的矢量上,它仍然会使箭头稍长,但也会校正间距,以便下标已经在箭头尖端下方(我认为校正可以更强一些,但我不认为这个细节程度现在很重要)
  • 在多字母向量上,它表现得自然\overrightarrow,就像 ConTeXt 开箱即用
  • 有些特殊情况,比如毕业生,ìmath并不完美,但我认为可以接受
  • 我更喜欢 esvect 的箭头外观,但 palatino 的对我来说也不错

也许我可以使用 TikZ 来创建我的矢量命令,但即使我有使用 TikZ 的经验,我也从未做过这种编程(我只画了预定义的图)。

答案1

我设法将其转换esvect为 Plain TeX。但是,我无法让它在 ConTeXt 中工作。

\catcode`@=11

% load fonts
\font\tenvec=vect10 at 10pt
\font\sevenvec=vect7 at 7pt
\font\fivevec=vect5 at 5pt

%% define new family
\newfam\vecfam
\textfont\vecfam=\tenvec
\scriptfont\vecfam=\sevenvec
\scriptscriptfont\vecfam=\fivevec

%% convert count register to hex
\def\thehex#1{\ifcase#1 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or 9\or
  A\or B\or C\or D\or E\or F\fi}

%% define symbols
\mathchardef\fldr="3\thehex\vecfam 12 % adjust here to select another arrow
\mathchardef\montraita="3\thehex\vecfam 20
\mathchardef\montraitd="3\thehex\vecfam 23

%% copied from esvect.sty (with little adjustments)
\def\relbareda{\mathrel{\mathpalette\mathsm@sh\montraita}}
\def\relbaredd{\mathrel{\mathpalette\mathsm@sh\montraitd}}
\def\vv{\futurelet\ifstar\dovv}
\def\dovv{\ifx*\ifstar\expandafter\vvstar\else\expandafter\ESV@vecteur\fi}
\def\vvstar*#1#2{\ESV@vecteur{#1}_{\mkern-1mu\relax#2}}
\def\ESV@vecteur{\mathpalette{\overvect@\vectfill@}}
\def\vectfill@{\traitfill@\relbaredd\relbareda\fldr}
\def\traitfill@#1#2#3#4{%
  $\m@th\mkern2mu\relax#4#1\mkern-1.5mu%on met \relbaredd au d\'ebut
   \cleaders\hbox{$#4\mkern0mu#2\mkern0mu$}\hfill%remplit avec relbareda
   \mkern-1.5mu#3$%
}
\def\overvect@#1#2#3{\vbox{\ialign{##\crcr%
 \noalign{\kern-.7pt\nointerlineskip}#1#2\crcr%
 \noalign{\kern-.3pt\nointerlineskip}$\m@th\hfil#2#3\hfil$\crcr}}}

%% We'd need these from plain.tex if we would run in ConTeXt
%\def\m@th{\mathsurround\zeropoint}
%\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th #1{#2}$}\finsm@sh}
%\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@}

\catcode`@=12

%% Test:

Some examples from the manual:

$\vv{E}$, $\vv{AB}$, $\vv{\imath}$ and $\vv{u}$

$\vv*{e}{r}$ and $\vv*{L}{\Delta}$

$\vv{E}_{\vv{u}_{\vv{u}}}$

\bye

在此处输入图片描述

答案2

我最终使用 TiKZ 制作了矢量箭头,并得到了适合我的结果。这并不完美,但涵盖了我的大多数使用情况 - 现在我已经理解了原理,我可以在需要时添加特定的新情况。主要问题是上标的管理,正如@Aditya 指出的那样:它既不自然(使用不同的命令并不简单)也不完美(我没有测试很多字母,结果似乎取决于\vv使用基本命令时的直接环境)。

但是,我想知道使用 metapost 而不是 TikZ 是否会更像 ConTeXt,并将这些矢量箭头定义为正确的数学堆叠器/重音。我的方法感觉有点像修补匠的东西,更符合 Plain TeX 哲学而不是 ConTeXt 的哲学(据我所知)。我更愿意接受更符合 ConTeXt 用法的答案,而不是我自己的 TikZ 东西 - 而且我可能会在此过程中学到更多!

\usemodule[simplefonts]
\definefontfeature[default][default][onum=yes]
\setupbodyfont[11pt,palatino,ss]
\usemodule[tikz]
\usetikzlibrary[arrows.meta]
\usetikzlibrary[calc]
\setuppapersize[A5][A5]

% Other stuff
\def\doDdiff[#1][#2]{  % différentielles et dérivées secondes - macro interne
  \ifsecondargument {\frac{{\rm d^2} #1}{{\rm d} {#2}^2}}
  \else {\rm d^2} \fi
}
\def\ddiff{\dodoubleempty\doDdiff} 

% Vectors
\def\doVV[#1][#2]{  
  \ifsecondargument {\vvtwo{#1}{#2}} \else {\vvone{#1}} \fi
}
\def\vv{\dodoubleempty\doVV} 

\def\vvone#1{
    \tikz[baseline=(char.base),
      -> /.tip = {Straight Barb[length=0.2em,width=0.5ex,slant=0.3]}]{
      \def\vup{0.3ex}
      \node[inner sep=0pt] (char) {$#1$};
      \draw[->] ($(char.north west)+(0,\vup)$) -- ($(char.north
      east)+(0.1em,\vup)$);
    }
}
\def\vvtwo#1#2{
  \tikz[baseline=(char.base),
    -> /.tip = {Straight Barb[length=0.2em,width=0.5ex,slant=0.3]}]{
    \def\vup{0.3ex}
    \node[inner sep=0pt, text opacity=0] (char) {$#1$};
    \node[inner sep=0pt, anchor=base west] (full) at (char.base west) {$#1_{#2}$};
    \draw[->] ($(char.north west)+(0,\vup)$) -- ($(char.north
    east)+(0.1em,\vup)$);
  }
}
\def\vsuper[#1][#2]{
  \tikz[baseline=(char.base),
    -> /.tip = {Straight Barb[length=0.2em,width=0.5ex,slant=0.3]}]{
    \def\vup{0.3ex}
    \node[inner sep=0pt, text opacity=0] (char) {$#1$};
    \node[inner sep=0pt, anchor=base west] (full) at (char.base west) {$#1^{#2}$};
    \draw[->] ($(char.north west)+(0,\vup)$) -- ($(char.north
    east)+(-0.em,\vup)$);
  }
}

\starttext

\startcolumns[2,rule=on]
  My version
  \startformula
    \vv[F]_{\text{spring}\to M} = -k(x-\ell_{0})\vv[u][x]
  \stopformula
  \startformula
    m \ddiff[{\vv[r]}][t] = \vv[F] + m\vv[g] + \vv[R]
  \stopformula
  \startformula
    \vv[AB], \vv[\imath]
  \stopformula
  \startformula
    \vv[u][x], \vv[u][y], \vv[u][z], \vv[u][X], \vv[u][Y], \vv[u][Z], \vv[u][X_{1}],
    \vv[u][x_{1}]
  \stopformula
  \startformula
    \vv[L][\Delta], \vv[J][\Delta], \vv[J][xx], \vv[u][x]
  \stopformula
  \startformula
    \vsuper[v][2] \text{ means } \vv[v]\cdot\vv[v]
  \stopformula
  \startformula
    \vv[v]',\vv[v']\text{ no } , \vv[v]' \text{ strangely works}
  \stopformula
  \startformula
    \vsuper[v][\prime],\vsuper[v][\prime 2] \text{ ok}
  \stopformula
  \column

  Out of the box vec
  \startformula
    \vec{F}_{\text{spring}\to M} = -k(x-\ell_{0})\vec{u}_{x}
  \stopformula
  \startformula
    m \ddiff[\vec{r}][t] = \vec{F} + m\vec{g} + \vec{R}
  \stopformula
  \startformula
    \vec{AB}, \vec{\imath}
  \stopformula
  \startformula
    \vec{u}_{x}, \vec{u}_{y}, \vec{u}_{z}, \vec{u}_{X}, \vec{u}_{Y}, \vec{u}_{Z},     \vec{u}_{X_{1}},  \vec{u}_{x_{1}}
  \stopformula
  \startformula
    \vec{L}_{\Delta}, \vec{J}_{\Delta}, \vec{J}_{xx}, \vec{u}_{x}
  \stopformula
  \startformula
    \vec{v}^{2}  \text{ means } \vec{v}\cdot\vec{v}
  \stopformula
  \startformula
    \vec{v}'
  \stopformula
\stopcolumns
\stoptext

在此处输入图片描述

相关内容