summaryrefslogtreecommitdiff
path: root/info/ltx3pub/arrocont.tex
blob: 0d14bf5c9123be410ccc4ac114919b15e8418688 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
%%% ====================================================================
%%%  @LaTeX-file{
%%%     author          = "Alan Jeffrey",
%%%     version         = "0.01",
%%%     date            = "28 July 1993",
%%%     time            = "20:56:10 BST",
%%%     filename        = "arrocont.tex",
%%%     address         = "School of Cognitive and Computing Sciences
%%%                        University of Sussex
%%%                        Brighton BN1 9QH
%%%                        UK",
%%%     telephone       = "+44 273 606755 x 3238",
%%%     FAX             = "+44 273 678188",
%%%     checksum        = "11651 283 1282 11130",
%%%     email           = "alanje@cogs.sussex.ac.uk",
%%%     codetable       = "ISO/ASCII",
%%%     keywords        = "companion font TeX",
%%%     supported       = "yes",
%%%     abstract        = "This a technical study for arrows."
%%%     docstring       = "The checksum field above contains a CRC-16
%%%                        checksum as the first value, followed by the
%%%                        equivalent of the standard UNIX wc (word
%%%                        count) utility output of lines, words, and
%%%                        characters.  This is produced by Robert
%%%                        Solovay's checksum utility.",
%%%     package         = "stands alone",
%%%     dependencies    = "msam10 ltugboat.sty",
%%%  }
%%% ====================================================================
%
% 28 Jul 1993, v0.01: Finished v0.01.
%
% Copyright 1993 Alan Jeffrey.

\documentstyle{ltugboat}

\title{Control glyphs for arrows}
\author{Alan Jeffrey}
\address{University of Sussex}
\netaddress{alanje@cogs.susx.ac.uk}

\def\rtitlex{MFG discussion document}
\def\midrtitle{{\sl Task 3:
   Technical studies\/}}
\setcounter{page}{1}

\def\T#1{$\fam0 T_{#1}$}
\def\X#1{$\fam0 X_{#1}$}
\def\psname#1{\penalty0\mbox{\normalshape $\langle$#1$\rangle$}}
\def\psnon#1{\penalty0\mbox{\it $\langle$#1\/$\rangle$}}
\def\errorglyph{{\vrule width 0.5em height 0.5em depth0em}}

\font\msamten=msam10
\def\msam#1{\leavevmode\hbox{\msamten\char"#1}}

\font\lasyten=lasy10
\def\lasy#1{\leavevmode\hbox{\lasyten\char"#1}}

\def\syntax#1{\leavevmode\hbox{\it #1}}

\begin{document}

\maketitle

\section{Introduction}

This document looks at suitable control glyphs for implementing math
arrows.  In particular, we look at ways that extensible and negated
arrows can be produced.

\section{Vertical arrows}

Vertical arrows can be accessed using the growing delimiter mechanism.
The non-negated arrows can be built with a `top', `bot' and `rep'
section, and the negated arrows can be built with a `top', `bot', `med'
and `rep' section, where the `med' section includes the negation.

\section{Horizontal arrows}

Horizontal arrows can be produced using the advanced ligature mechanism
introduced in \TeX~3.  An \syntax{arrow} is defined by:
\[
   \syntax{arrow} ::=
      \syntax{leftarrow} \: \syntax{rightarrow} \: \syntax{extarrow}^*
\]
A \syntax{leftarrow} is the leftmost part of an arrow, that is the tail
of a rightwards-pointing arrow or the head of a leftwards-pointing
arrow.  For example, the \syntax{leftarrow} of `$\mapsto$' is
\psnon{leftarrowmapsto} and the \syntax{leftarrow} of `$\leftrightarrow$' is
\psnon{leftarowhead}.  A \syntax{leftarrow} is one of:
\begin{itemize}

\item \psnon{leftarrownone} There is nothing on the left of the arrow,
   for example `$\rightarrow$' or `\msam{13}'.

\item \psnon{leftarrowhead} There is a single arrowhead on the left of
   this arrow, for example `$\leftrightarrow$' or `$\hookleftarrow$'.

\item \psnon{leftarrowdblhead} There is a double arrowhead on the left of
   this arrow, for example `$\Leftarrow$' or `$\Leftrightarrow$'.

\item \psnon{leftarrowtrplhead} There is a triple arrowhead on the left
   of this arrow, for example `\msam{57}' or `\msam{57}\kern-2pt\msam{56}'.

\item \psnon{leftarrowmapsto} There is a flat bar on the left of this
   arrow, for example `$\mapsto$'.

\item \psnon{leftarrowhook} There is a hook on the left of this arrow,
   for example `$\hookrightarrow$'.

\item \psnon{leftarrowharpoonup} There is an upwards harpoon on the left
   of this arrow, for example `$\leftharpoonup$'.

\item \psnon{leftarrowharpoondown} There is a downwards harpoon on the
   left of this arrow, for example `$\leftharpoondown$'.

\item \psnon{leftarrowharpoondblup} There is an upwards harpoon on the
   left of this double arrow, for example `\msam{0B}'.

\item \psnon{leftarrowharpoondbldown} There is a downwards harpoon on the
   left of this double arrow, for example `\msam{0A}'.

\item \psnon{leftarrowheaddbl} There are two arrowheads on the left of
   this single arrow, for example `\msam{11}'.

\item \psnon{leftarrowdblheaddbl} There are two arrowheads on the left of
   this double arrow, for example `\msam{12}'.

\item \psnon{leftarrowdblheadup} There is an arrowhead on the top left of
   this double arrow, for example `\msam{1C}'.

\item \psnon{leftarrowdblheaddown} There is an arrowhead on the bottom
   left of this double arrow, for example `\msam{1D}'.

\item \psnon{leftarrowrighthead} There is a rightwards arrowhead on the
   left of this arrow, for example `\msam{1A}'.

\item \psnon{leftarrowcurlyhead} There is an arrowhead with a curly line
   leading out of it on the left of this arrow, for example `\msam{21}'

\item \psnon{leftarrowturn} There is a turn on the left of this arrow, for
   example `\msam{23}'.

\item \psnon{leftarrowcirc} There is an open circle on the left of this
   arrow, for example `$\vcenter{\hbox{$\scriptstyle\circ$}}\!-$'.

\item \psnon{leftarrowbullet} There is a closed circle on the left of this
   arrow, for example `$\vcenter{\hbox{$\scriptstyle\bullet$}}\!-$'.

\item \psnon{leftarrowtriangle} There is an open triangle on the left of this
   arrow, for example `$\vcenter{\hbox{$\scriptstyle\triangleleft$}}\!-$'.

\end{itemize}
A \syntax{rightarrow} has the same possibilities, visually mirrored
around the vertical axis, and with `\syntax{left}' swapped with
`\syntax{right}'.  For example:
\begin{itemize}

\item[$\rightarrow$] is \psnon{leftarrownone}\psnon{rightarrowhead}.

\item[$\leftrightarrow$] is \psnon{leftarrowhead}\psnon{rightarrowhead}.

\item[$\vcenter{\hbox{$\scriptstyle\bullet$}}\!\!$\msam{22}]
   is \psnon{leftarrowbullet}\psnon{rightarrowturn}.

\end{itemize}
These arrows can be extended using \syntax{extarrow} glyphs, which say
how many extension pieces to put into the arrow.  An \syntax{extarrow} is
one of:
\begin{itemize}

\item \psnon{extarrowone} which extends the arrow.
\item \psnon{extarrowneg} which negates the arrow.
\item \psnon{extarrowoneneg} which extends the arrow and negates it.

\end{itemize}
If there is a negation, it should come in the middle of the list of
extensions, for example:
\begin{raggedright}\begin{description}

\item[$\not\Leftrightarrow$] is \psnon{leftarrowdblhead}\psnon
   {rightarrowdblhead}\psnon{extarrowneg}.

\item[$\Leftarrow\!\!\not\,\Rightarrow$]
   is \psnon{leftarrowdblhead}\psnon
   {rightarrowdblhead}\psnon{extarrowoneneg}.

\item[$\Leftarrow\!\not\Longrightarrow$]
   is \psnon{leftarrowdblhead}\psnon
   {rightarrowdblhead}\psnon{extarrowone}\psnon{extarrowneg}\psnon
   {extarrowone}.

\end{description}\end{raggedright}%
Note that not every font will be able to produce every combination of
\syntax{leftarrow} and \syntax{rightarrow}, for example some pi fonts do
not allow $\mapsto$ to be extended.  In fact, some of the combinations
make no sense, such as \psnon{leftarrowhook}\psnon{rightarrowdblhead}.
Such nonexistent arrows should be set with an eye-catching error glyph
such as `\errorglyph' and if possible should put a `Warning:' special
into the \verb|dvi| file.

We should not specify anything about the appearance of these control
glyphs, which should give font implementors enough freedom to convert
most pi fonts into this encoding.  One possible implementation of these
control glyphs is by ligaturing and kerning, for example by using the
ligatures:
\begin{eqnarray*}
   \lefteqn{\psnon{leftarrowhead} \psnon{rightarrowhead}} \\&
   \rightarrow & \psnon{leftrightarrow} \\
   \lefteqn{\psnon{leftrightarrow}\psnon{extarrowone}} \\&
   \rightarrow & \psnon{leftrightarrow}\psnon{rightarrow} \\
   \lefteqn{\psnon{leftrightarrow}\psnon{rightarrow}} \\&
   \rightarrow & \psnon{leftarrow}\psnon{rightarrow} \\
   \lefteqn{\psnon{rightarrow}\psnon{extarrowone}} \\&
   \rightarrow & \psnon{rightarrow}\psnon{rightarrow} \\
   \lefteqn{\psnon{rightarrow}\psnon{rightarrow}} \\&
   \rightarrow & \psnon{arrowext}\psnon{rightarrow}
\end{eqnarray*}
and appropriate kerns for:
\begin{center}
   \psnon{leftarrow}\psnon{rightarrow} \\
   \psnon{arrowext}\psnon{rightarrow}
\end{center}
then the `arrow-building kit' will build any length of
`$\leftrightarrow$' that is required, for example:
\begin{verbatim}
   \def\longrightarrow{\mathrel
      {\leftarrowheadchar
         \rightarrowheadchar
         \arrowextonechar}}
\end{verbatim}
Note that as long as the user does
not use the control glyphs of type mathord in their document, the
ligtable will never be used (rule 14 of Appendix G) and so input such as:
\begin{verbatim}
   {\rightarrow} \rightarrow
\end{verbatim}
will not unexpectedly ligature to something else.  There are a few
features missing from these control glyphs:
\begin{itemize}

\item The simpler arrows should be in fixed slots, so that they can be
   accessed quickly through a \verb|\mathchardef|.  We should ensure that
   this \verb|\mathchardef| is always of type mathrel, otherwise strange
   ligaturing might happen.

\item There is currently no syntax for accessing the negation glyphs on
   their own, which are necessary for building negated arrow leaders
   similar to \verb|\arrowfill|.

\end{itemize}
There are eight other `arrowlike' glyphs that are defined as
special glyphs, and do not fit into the `arrow-building kit'. These are
`\msam{08}', `\msam{09}', `\msam{1E}', `\msam{1F}', `\msam{4B}',
`\msam{4C}', `$\vec{x}$' and
`$\vcenter{\hbox{$\scriptstyle\leftrightarrow$}\kern-2ex\hbox{$-$}\kern-.5ex}$'.
These glyphs should be accessed directly.

All that these control glyphs are doing is simulating the extensible
vertical glyphs such as the growing delimiters.  If there were a
horizontal equivalent of growing delimiters then no such trickery would
be required!

\section{Diagonal arrows}

There is no easy way to build diagonal extended arrows.  All the font can
do is provide the building blocks, and leave \TeX\ macros to build the
arrows.  The font standard should specify how each of the diagonal
extended arrows is to be constructed, and any font dimensions that will
be necessary for the task.

\section{Conclusions}

Setting extensible vertical arrows with \TeX\ is simple, since the
growing delimiter mechanism already supports it.  Setting growing
horizontal arrows is trickier, and requires clever ligtable programming,
but it can still be done inside the font, and without use of \TeX\
macros.  Setting diagonal arrows can only be done by brute force and
\TeX\ programming.

\makesignature

\end{document}