1
0
Fork 0
doc/devel/source/boxes.en.tm

193 lines
8.3 KiB
Plaintext
Raw Normal View History

2019-01-17 00:04:56 +08:00
<TeXmacs|1.99.8>
2011-08-28 15:59:50 +08:00
2019-01-17 00:04:56 +08:00
<style|<tuple|tmdoc|english|old-spacing>>
2011-08-28 15:59:50 +08:00
<\body>
2013-07-11 04:26:30 +08:00
<tmdoc-title|The boxes produced by the typesetter>
2011-08-28 15:59:50 +08:00
<section|Introduction>
2013-07-11 04:26:30 +08:00
The <TeXmacs> typesetter essentially translates a document represented by a
tree into a graphical box, which can either be displayed on the screen or
on a printer. Contrary to a system like <LaTeX>, the graphical box actually
contains much more information than is necessary for a graphical rendering.
Roughly speaking, this information can be subdivided into the following
categories:
2011-08-28 15:59:50 +08:00
<\itemize>
<item>Logical and physical bounding boxes.
<item>A method for graphical rendering.
<item>Miscellaneous typesetting information.
2013-07-11 04:26:30 +08:00
<item>Keeping track of the source subtree which led to the box.
2011-08-28 15:59:50 +08:00
<item>Computing the positions of cursors and selections.
<item>Event handlers for dynamic content.
</itemize>
The logical bounding box is used by the typesetter to position the box with
respect to other boxes. A certain amount of other information, such as the
slant of the box, is also stored for the typesetter. The physical bounding
box encloses the graphical representation of the box. This knowledge is
needed when partially redrawing a box in an efficient way.
In order to position the cursor or when making a selection, it is necessary
to have a correspondence between logical positions in the source tree and
2019-01-17 00:04:56 +08:00
physical positions in the typeset boxes. More precisely, boxes and their
2011-08-28 15:59:50 +08:00
subboxes are logically organized as a tree. Boxes provide routines to
translate between paths in the box tree and the source tree and to find the
path which is associated to a graphical point.
<section|The correspondence between a box and its source>
<subsection|Discussion of the problems being encountered>
In order to implement the correspondence between paths in the source tree
and the box tree, one has to face several simultaneous difficulties:
<\enumerate>
<item>Due to line breaking, footnotes and macro expansions, the
correspondence may be non straightforward.
<item>The correspondence has to be reasonably time and space efficient.
<item>Some boxes, such header and footers, or certain results of macro
2019-01-17 00:04:56 +08:00
expansions, may not be \Paccessible\Q. Although one should be able to
2011-08-28 15:59:50 +08:00
find a reasonable cursor position when clicking on them, the contents of
this box can not be edited directly.
<item>The correspondence has to be reasonably complete (see the next
section).
</enumerate>
The first difficulty forces us to store a path in the source tree along
with any box. In order to save storage, this path is stored in a reversed
manner, so that common heads can be shared. This common head sharing is
also necessary to quickly change the source locations when modifying the
source tree, for instance by inserting a new paragraph.
In order to cope with the third difficulty, the inverse path may start with
a negative number, which indicates that the box can not directly be edited
(we also say that the box is a decoration). In this case, the tail of the
inverse path corresponds to a location in the source tree, where the cursor
should be positioned when clicking on the box. The negative number
influences the way in which this is done.
<subsection|The three kinds of paths>
More precisely, we have to deal with three kinds of paths:
<\description>
2013-07-11 04:26:30 +08:00
<item*|Tree paths>These paths correspond to paths in the source tree.
Actually, the path minus its last item points to a subtree of the source
tree. The last item gives a position in this subtree: if the subtree is a
leaf, i.e. a string, it is a position in this string. Otherwise a zero
indicates a position before the subtree and a one a position after the
subtree.
<item*|Inverse paths>These are just reverted tree paths (with shared
tails), with an optional negative head. A negative head indicates that
the tree path is not accessible, i.e. the corresponding subtree does not
correspond to editable content. If the negative value is <math|-2>,
2019-01-17 00:04:56 +08:00
<math|-3> or <hgroup|<math|-4>>, then a zero or one has to be put behind
the tree path, depending on the value and the cursor position.
2013-07-11 04:26:30 +08:00
<item*|Box paths>These paths correspond to logical paths in the box tree.
Again, the path minus its last item points to a subbox of the main box,
and the last item gives a position in this subtree: if the subbox
corresponds to a text box it is a position in this text. Otherwise a zero
indicates a position before the subbox and a one a position after it. In
the case of side boxes, a two and a three may also indicate the position
2019-01-17 00:04:56 +08:00
after the left script <abbr|resp.> before the right script.
2011-08-28 15:59:50 +08:00
</description>
<subsection|The conversion routines>
In order to implement the conversion between the three kinds of paths,
every box comes with a reference inverse path <verbatim|ip> in the source
tree. Composite boxes also come with a left and a right inverse path
2019-01-17 00:04:56 +08:00
<verbatim|lip> <abbr|resp.> <verbatim|rip>, which correspond to the
left-most and right-most accessible paths in its subboxes (if there are
such subboxes).
2011-08-28 15:59:50 +08:00
The routine:
<\verbatim>
\ \ \ \ virtual path box_rep::find_tree_path (path bp)
</verbatim>
transforms a box path into a tree path. This routine (which only uses
<verbatim|ip>) is fast and has a linear time complexity as a function of
the lengths of the paths. The routine:\
<\verbatim>
\ \ \ \ virtual path box_rep::find_box_path (path p)
</verbatim>
does the inverse conversion. Unfortunately, in the worst case, it may be
necessary to search for the matching tree path in all subboxes.
Nevertheless, in the best case, a dichotomic algorithm (which uses
<verbatim|lip> and <verbatim|rip>), finds the right branch how to descend
in a logarithmic time. This algorithm also has a quadratic time complexity
as a function of the lengths of the paths, because we frequently need to
revert paths.
<section|The cursor and selections>
2019-01-17 00:04:56 +08:00
In order to fulfill the requirement of being a \Pstructured editor\Q,
2013-07-11 04:26:30 +08:00
<TeXmacs> needs to provide a (reasonably) complete correspondence between
logical tree paths and physical cursor positions. This yields an additional
2019-01-17 00:04:56 +08:00
difficulty in the case of \Penvironment changes\Q, such as a change in font
2013-07-11 04:26:30 +08:00
or color. Indeed, when you are on the border of such a change, it is not
clear <with|font-shape|italic|a priori> which environment you are in.
In <TeXmacs>, the cursor position therefore contains an <math|x> and a
<math|y> coordinate, as well as an additional infinitesimal
<math|x>-coordinate, called <math|\<delta\>>. A change in environment is
then represented by a box with an infinitesimal width. Although the
<math|\<delta\>>-position of the cursor is always zero when you select
using the mouse, it may be non zero when moving around using the cursor
keys. The linear time routine:\
2011-08-28 15:59:50 +08:00
<\verbatim>
\ \ \ \ virtual path box_rep::find_box_path (SI x, SI y, SI delta)
</verbatim>
as a function of the length of the path searches the box path which
corresponds to a cursor position. Inversely, the routine:\
<\verbatim>
\ \ \ \ virtual cursor box_rep::find_cursor (box bp)
</verbatim>
yields a graphical representation for the cursor at a certain box path. The
2013-07-11 04:26:30 +08:00
cursor is given by its <math|x>, <math|y> and <math|\<delta\>> coordinates
and a line segment relative to this origin, given by its extremities
<math|<around|(|x<rsub|1>,y<rsub|1>|)>> and
<math|<around|(|x<rsub|2>,y<rsub|2>|)>>.
2011-08-28 15:59:50 +08:00
In a similar way, the routine:\
<\verbatim>
\ \ \ \ virtual selection box_rep::find_selection (box lbp, box rbp)
</verbatim>
computes the selection between two given box paths. This selection
comprises two delimiting tree paths and a graphical representation in the
form of a list of rectangles.
2013-07-11 04:26:30 +08:00
<tmdoc-copyright|1998--2002|Joris van der Hoeven>
2011-08-28 15:59:50 +08:00
2013-07-11 04:26:30 +08:00
<tmdoc-license|Permission is granted to copy, distribute and/or modify this
document under the terms of the GNU Free Documentation License, Version 1.1
or any later version published by the Free Software Foundation; with no
Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
Texts. A copy of the license is included in the section entitled "GNU Free
Documentation License".>
2011-08-28 15:59:50 +08:00
</body>
2019-01-17 00:04:56 +08:00
<initial|<\collection>
</collection>>