*Fleurons* are small decorative pieces that were often used in
the past for filling big blank spaces in books. They are seldom used
nowdays. As besides they will not appear more than a few times in any
book (mainly at the end of chapters), the easiest thing to do if one
insists in using them (for instance for simulating an old edition of
some past work) is to arrange its presence manually in the source
document in the way one would do for any other figure or piece of text.
I subscribe to this, which is without doubt the way to proceed if
the original document will allways be typesett in the same way. But if
it were an extensive work and one foresees different layouts for its
appearence as different *products*, then one would have one more source
of worries after every run of the work through *Context*, as you can bet
that sooner than later one page will have been included somewhere whose
only content will be the damned *fleuron*, something that obviously
should not happen.
This is the problem that I tackled, because I did not find any
previous reference or solution to it. My reasoning, my explanations and
the working code are all contained in the rest of this message.
It
is conceived as being composed of two parts, but it can also be saved
and dealt as one piece. If one saves it as two independent files (as
should be done if one intends to use it for any other thing that running
the tests samples) the content of the first file will be the one
delimited as *Fleuron.tex* and that of the second (*Fleuron_test.tex*)
would be the rest of the message. The line of this second file
% \input {Fleuron}
should be uncommented if one intends
to run it as such. The one file version runs as it is.
The script
creates the new command *\Fleuron{\<motive name>}*, which is the
one to include at the place intended in the source document for the
*fleuron* to appear (of course after having incorporated the contents of
*Fleuron.tex* in its preamble with *\input{Fleuron}*). The argument
*<motive name>* allows the selection of a specific motive among
the several of them that could be available; the user can create and
organize all this according to his wishes. For instance
*\Fleuron{\MotiveFive}* would use the example labelled *\MotiveFive* in
the group of examples provided. The comments in *Fleuron.tex* explain
how to handle all this.
Enjoy and critizice
Francisco
%%%%%%%%%%%%%%%%%%%%%%%
%
%
Fleuron.tex
% Script that explains and implements in *ConTeXt* Mk-IV
the kind of small ornaments
% traditionally used by printers for
filling big blank spaces in books and printed works.
%*Fleuron*: subst. masc. 2b) Élément décoratif de fantaisie ornant
le titre ou les blancs des principales divisions d'un ouvrage [livre]
(Trésor de la langue française informatisé).
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creation of the ornament as an entity (in the form of a box)
%
Typesetting true *fleurons* requires the use of *TeX*'s special *box
registers* as arguments;
% here box register number *0* has been
arbitrarily selected for the proceedings.
% The essential steps in the construction are:
% - (typo)graphical
composition of the motive (as for instance *\midaligned{Finis}* in the
first example)
% or designation of the source file of an
image,
% - enclosure of it in a vertical box (*\vbox{\midaligned{Finis}}*)
and
% - finally association of the boxed motive with boxregister
*0* (*\setbox0= ...*), all of which happens
% in reverse
order, from right to left, in the code.
% Here are several examples of this:
%\setbox0=\vbox{\midaligned{Finis}}
%\setbox0=\vbox{\midaligned{Finis\\coronat\\opus}}
%\setbox0=\vbox{\midaligned{*****}
\Inter \midaligned{***} \Inter \midaligned{*}}
% In order to get in *TeX* something remotely similar to a normal
variable,
% called *Motivo*, the following machinery has to be
implemented
\def\Motivo{\copy0} % get a copy of register's
*0* content
% the graphic parts of several (typographical) test motives follow:
\def\MotOne{{\midaligned{\em
Finis}}}
\def\MotTwo{{\midaligned{\em Finis\\\em coronat\\\em
opus}}}
\def\MotThree{{\midaligned{*****} \Inter \midaligned{***}
\Inter \midaligned{*}}}
\def\MotFour{{\midaligned{___________}}}
\def\MotFive{{\bf
\midaligned{\hl[1]} \Inter \midaligned{\hl[5]} \Inter
\midaligned{\hl[1]}}}
%%%%%%%%%%%%%%%%%%%%%%%%%
%
% THINGS
THAT DO NOT WORK
%
%\setbox0=\vbox{\midaligned{\switchtobodyfont[20pt]*}}
% executing these corrupt the whole script
%\setbox0=\vbox{\switchtobodyfont[20pt] \midaligned{*****\\***\\*}}
%\def\Grande{\midaligned{\switchtobodyfont[50pt]*}}
% in any form it is tried
%\setbox0=\vbox{\Grande}
%
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
%
% USING FIGURES AS MOTIVES
%
%
Most *fleurons* will be based on figures (usually images of schematic
line drawings)
% rather than on elements of the alphabetical
character set.
% So it is important to insure that also this alternative works as it
should.
% *Contextref* says that just giving the name of the figure's
file is enough,
%\useexternalfigure [cow] [cow.pdf] [scale=300]
%
but this usually does not work, so better give the whole path to the
figure in your machine
\useexternalfigure [cow]
[L:/ConTeXt/context/tex/texmf-context/tex/context/sample/cow.pdf]
[hfactor=20]
%\setbox0=\vbox{\externalfigure [cow] }
\def\MotCow{{\externalfigure
[cow] }}
%
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This is the algorithmically
interesting part of the whole business. It rests upon one instruction,
%
*pagespace*, which gets and handles some of *TeX*'s internal magnitudes
of the page.
% Its code was devised, implemented and very well explained by D.
Salomon
% in *Output Routines: Examples and Techniques.
% Part I:
Introduction and Examples.* Tugboat 11 nº 1: 71.), from where the
following extract originates:
%
% "As an example, the two variables [*pagetotal*, *t*, and
*pagegoal*, *g*] will be used
% to determine how much space is left
on the current page.
% If *t* is zero, the space left on the page is
the entire page (*\vsize*).
% Otherwise, it is the difference *g − t*. Macro *\pagespace* calculates
that difference".
% The interpretations and comments that follow
are on the contrary mine;
% so be careful: they can be wrong!
%
Determination of the space available in *TeX*'s *current page*
\newdimen\Spaceleft % the result will be stored under this
name
% computation of the datum
\def\pagespace{%
\ifdim\pagetotal=0pt % if the page is empty (i.e. if it is a new
page)
\Spaceleft=\vsize % the available space is the
full design page
\else % otherwise
\Spaceleft=\pagegoal
% the required amount is the design maximum size
\advance\Spaceleft -\pagetotal % less the already used space
\fi}
% We also need for our purposes certain numerical
information about the ornament,
% mainly its height; so let's get it algorithmically
%\def\Talla{100pt}
\newdimen\Orn
% the height of the ornament in points
\newdimen\Talla
% the space requested from the page (with some *air*
around)
\newdimen\Respiro % the blank space between text and
*fleuron*
% let us construct the selected *fleuron*
\def\Instance#1{%
% we get the (typo)graphical content as argument,
\setbox0=\vbox{#1} % put it in a box and assign the box to
register *0*
\Orn=\ht0 % after which we can get the required values
through this register
\Talla=\ht0 % (getting as an
aside a little sample of the daunting *texan* arithmetic)
%\advance \Talla by 0.5\Talla % compute half the height of the
ornament
\advance \Talla by \Talla % twice the height of the ornament
%
\Respiro=0.5\ht0 % half the height of the ornament
}
%
and the operative command can be finally issued
\def\Fleuron#1{%
\Instance{#1} % assemble the object
\pagespace % get from *TeX* the relevant magnitudes about
the *current page*
% (transitory debug information
%
Available: \the\Spaceleft\par % this shows the information on the
document itself
% Required: \the\Talla\par
% Ornament: \the\Orn\par
%
Disponible: \show\Spaceleft\par % and this shows it in the terminal
%
Requerido: \show\Talla\par
% Ornamento: \show\Orn\par % )
\ifdim\Spaceleft>4\Orn % if there are lots of space available
% \Respiro=\ht0 % insert a bigger separation
\Respiro=\Orn % insert a bigger separation
\else
\Respiro=0.5\Orn % insert a smaller separation
\fi
\ifdim\Spaceleft<\vsize % only when the page has already some
previous content
\ifdim\Spaceleft>\Talla % but keeps also enough space
for the ornament,
\vskip\Respiro % add a
reasonable separation from the text
% \vskip 0.5\Orn
% (as could be half the size of the ornament)
\midaligned{\Motivo} % and typeset the ornament centered
\fi
\fi
}
\def\Inter{\vskip 0.1pt} % small
downward displacement
%%%%%%%%%%%%%%%%%%%%%
%
%End of
*Fleuron.tex*
%
%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%
%
%
*Fleuron_test.tex*
% Test script for the *Fleuron* instruction
%\input
{Fleuron} % incorporate the contents of *Fleuron.tex*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% some layout provisions for the test document
\setuplayout[lines=10]
% size of the output page in lines
\preloadtypescripts
\usetypescript[latinmodern]
\setupbodyfont[9pt]
%\tracingpages=1
% show some internal typrographical magnitudes in the *.log* file
%%%%%%%%%%%%%%%%%%%%%
%
% Typesetting and display
%
\starttext
Test
script for the \em Fleuron \em complement.\par
%\placefigure
[none] {}{\externalfigure[cow]} % testing if figure reproduction
works by itself
\dorecurse{2}{Line \recurselevel\par} % fill the page with
some lines and show the *fleuron*
%\dorecurse{6}{Line
\recurselevel\par} % (more lines could exclude the *fleuron*)
%
*\MotOne*, *\MotTwo*, *\MotThree*, *\MotFour*, *\MotFive*
% y *\MotCow* are available as example arguments
\Fleuron{\MotTwo}
% passed argument allows selection among available motives
\stoptext