Aditya Mahajan
On Wed, 11 Jul 2007, Jesse Alama wrote:
Hi Aditya,
Aditya Mahajan
writes: On Thu, 28 Jun 2007, Jesse Alama wrote:
I'm preparing a geometry course using ConTeXt and am impressed with the system so far. One thing I need is to do is typeset various geometrical symbols. It looks like ConTeXt already has the \overleftarrow and \overrightarrow commands, but one thing I'd like to have is \overleftrightarrow, for typesetting the symbol customarily used to denote the line determined by two points. It seems, though, that this isn't available in ConTeXt, or, at least, it is not available by default. I tried looking on the contextgarden and google, but didn't come across anything. Is the \overleftrightarrow command already available?
Actually just adding overleftrightarrow is easy, but better will be an interface to easily define such commands. So ....
If not, what can I do so that I can use it?
ConTeXt uses overleftarrow and overrightarrow as defined in plain tex. This does not work in subscripts.
$\overleftarrow{A}$ $\overleftarrow{ABC}$ $a_{\overleftarrow{A}}$ $b_{\overleftarrow{ABC}}$
Here is a solution. First we patch math-ext so that arrowfills take a style.
Cut Here ------------------%< ----------------------------
\unprotect
\def\mtharrowfill#1#2#3#4#5#6#7#8% AM: Added #8 (for displaystyle) {$\mathsurround 0pt \thickmuskip0mu\medmuskip\thickmuskip\thinmuskip\thickmuskip \relax#8#5% \mkern-#1mu \cleaders\hbox{$#8\mkern -#2mu#6\mkern -#3mu$}\hfill \mkern-#4mu#7$}
%D Now we need to make sure that the extensible arrows do not get %D affected. So...
\def\domthxarr#1#2#3#4#5% hm, looks like we do a double mathrel {\begingroup \def\mtharrfactor{1}% \def\mtharrextra {0}% \processaction[#1] % will be sped up [ \v!none=>\def\mtharrfactor{0}, \v!small=>\def\mtharrextra{10}, \v!medium=>\def\mtharrextra{15}, \v!big=>\def\mtharrextra{20}, \v!normal=>, \v!default=>, \v!unknown=>\doifnumberelse{#1}{\def\mtharrextra{#1}}\donothing]% \mathsurround\zeropoint \muskip0=\thirdoffourarguments #2mu \muskip2=\fourthoffourarguments #2mu \muskip4=\firstoffourarguments #2mu \muskip6=\secondoffourarguments #2mu \muskip0=\mtharrfactor\muskip0 \advance\muskip0 \mtharrextra mu \muskip2=\mtharrfactor\muskip2 \advance\muskip2 \mtharrextra mu \setbox0\hbox{$\scriptstyle \mkern\muskip4\relax \mkern\muskip0\relax #5\relax \mkern\muskip2\relax \mkern\muskip6\relax $}% \setbox4\hbox{#3\displaystyle}% AM: Added displaystyle \dimen0\wd0 \ifdim\wd4>\dimen0 \dimen0\wd4 \fi \setbox2\hbox{$\scriptstyle \mkern\muskip4\relax \mkern\muskip0\relax #4\relax \mkern\muskip2\relax \mkern\muskip6\relax $}% \ifdim\wd2>\dimen0 \dimen0\wd2 \fi \setbox4\hbox to \dimen0{#3\displaystyle}% AM: added dislaystyle \mathrel{\mathop{\hbox to \dimen0{\hss\copy4\hss}}\limits^{\box0}_{\box2}} \endgroup}
\let\domthxarrsingle\domthxarr
%D Now, for defining overarrows.
\def\definemathoverarrow {\dotripleargument\dodefinemathoverarrow}
\def\dodefinemathoverarrow[#1][#2][#3]% {\ifthirdargument \setvalue{#1}{\dohandlemathoverarrow[#2][#3]}% \else \setvalue{#1}{\dohandlemathoverarrow[\zeropoint][#2]}% \fi}
\def\dohandlemathoverarrow[#1][#2]% {\mathpalette{\dodohanglemathoverarrow{#1}{#2}}}
% Note: math-pln has \kern-\onepoint, amsmath does not. I keep the % kern amount as an option. This is useful with overharpoons.
\def\dodohanglemathoverarrow#1#2#3#4% {\vbox{\ialign{##\crcr #2#3\crcr \noalign{\kern#1\nointerlineskip} $\m@th\hfil#3#4\hfil$\crcr}}}
\protect
\definemathoverarrow [overleftarrow] [\leftarrowfill] \definemathoverarrow [overrightarrow] [\rightarrowfill] \definemathoverarrow [overleftrightarrow] [\leftrightarrowfill]
------------------------------%<----------------------------------------- To Here
$\overleftarrow{A}$ $\overleftarrow{ABC}$ $a_{\overleftarrow{A}}$ $b_{\overleftarrow{ABC}}$
$\overleftrightarrow{A}$ $\overleftrightarrow{ABC}$
$a_{\overleftrightarrow{A}}$ $b_{\overleftrightarrow{ABC}}$
As an added bonus:
\definemathoverarrow [overtwoheadrightarrow] [\twoheadrightarrowfill] \definemathoverarrow [overtwoheadleftarrow] [\twoheadleftarrowfill] \definemathoverarrow [overrightharpoondown] [1pt] [\rightharpoondownfill] \definemathoverarrow [overrightharpoonup] [\rightharpoonupfill] \definemathoverarrow [overleftharpoondown] [1pt] [\leftharpoondownfill] \definemathoverarrow [overleftharpoonup] [\leftharpoonupfill]
$\overtwoheadrightarrow {XYZ}$ $\overtwoheadleftarrow {XYZ}$ $\overrightharpoondown {XYZ}$ $\overrightharpoonup {XYZ}$ $\overleftharpoondown {XYZ}$ $\overleftharpoonup {XYZ}$
There are also underarrows, which will not be too hard to do. I will patch math-ext with both overarrows and underarrows. I think that there needs to be some "italic correction" for the arrow. It is centered on the math box, but the math box is tilted to the right. Any way to determine the "correct" horizontal skip that should be added.
Have your changes been integrated into the ConTeXt code base yet? If not, how can I use your code? Is it enough to just include the relevant parts in my project's environment file?
Hi Jesse,
They have not been integrated into context yet. While changing one of the core macros, one needs to test that it does not break existing documents. I have been busy for the last two weeks and have not been able to do that.
In order to use these macro right now, cut between the two lines above (you will need to remove the quotes, or cut from the previous message) and put them in your environment file. Then you can use \overrightarrow in your documents.
I will send an updated math-ext in about a week.
Your suggestion worked out just fine -- thanks! Jesse -- Jesse Alama (alama@stanford.edu) *60: Something remains to be proved in this case