![ConTeXt :相当于 LaTeX esvect](https://linux22.com/image/339282/ConTeXt%20%EF%BC%9A%E7%9B%B8%E5%BD%93%E4%BA%8E%20LaTeX%20esvect.png)
使用 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
最后,我在 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