-25/Nov/97 LilyPond 0.1.36 1
+25/Nov/97 LilyPond 0.1.37 1
Make incompatible mudela version non-fatal.
+=item B<--postscript, -p>,
+
+Try to use PostScript where possible.
+
=back
=head1 FEATURES
\usepackage{a4wide}
\title{Mudela and LilyPond crash course}
\author{Han-Wen Nienhuys}
+\date{October 20, 1997}
\def\file#1{{\texttt{#1}}}
\begin{document}
+FIXME rewrite starting here.
+
\begin[verbatim]{mudela}
\score {
\melodic { % {...} is a voice
\usepackage{a4wide}
\title{GNU LilyPond input format 0.1}
\author{Han-Wen Nienhuys}
+\date{October 8, 1997}
\begin{document}
\maketitle
-2/Dec/97 LilyPond 0.1.36 1
+2/Dec/97 LilyPond 0.1.37 1
-2/Dec/97 LilyPond 0.1.36 2
+2/Dec/97 LilyPond 0.1.37 2
-2/Dec/97 LilyPond 0.1.36 3
+2/Dec/97 LilyPond 0.1.37 3
-2/Dec/97 LilyPond 0.1.36 4
+2/Dec/97 LilyPond 0.1.37 4
-2/Dec/97 LilyPond 0.1.36 5
+2/Dec/97 LilyPond 0.1.37 5
-2/Dec/97 LilyPond 0.1.36 6
+2/Dec/97 LilyPond 0.1.37 6
-pl 36.jcn2
- - mf numerals beautify: 2, 5, 7
+pl 37
+ - --postscript
+ - don't crash non-fitting grouping (thx, John)
+ - attach unended spanners to a column (thanks John)
+ - bf: unended tie
+ - bf: tie direction
+ - bf: unended slur
-pl 36.jcn1
- - mf numerals:
- * small numerals wider and fatter
- * bf: no thinner lines than blot_diameter
- * several bf's: dims and parameterisations
+pl 36.jcn2
+ - feta: small numerals
+
+********
+dec 9
pl 36
- bf: notehead collisions
grep for TODO and ugh/ugr
0.2:
+ * unended beam: [c4
+
+ * output naming:
+ - default to basename[-serialnumber].{midi,tex}
+
* handle ^C for tmp/file creation.
* PS for beams.
+ * dots & rest collisions.
+
* add a screenshot to the website. :)
* fix stdin input
TOPLEVEL_MAJOR_VERSION = 0
TOPLEVEL_MINOR_VERSION = 1
-TOPLEVEL_PATCH_LEVEL = 36
-TOPLEVEL_MY_PATCH_LEVEL = jcn2
+TOPLEVEL_PATCH_LEVEL = 37
+TOPLEVEL_MY_PATCH_LEVEL =
# use the above to send patches, always empty for released version:
# please don't move these comments up; the patch should fail if
print BANNER $ban;
close BANNER;
my_system("BANNEROPT=\"-B /tmp/lilybanner.html\" $depth/bin/out/make-docxx");
+ unlink "/tmp/lilybanner.html";
}
sub do_tar
print STDERR "This is " . $id_str . "\n";
}
+sub clean_tmp
+{
+ @a = </tmp/gs*>;
+ unlink @a;
+}
+
sub main
{
identify;
edit_index;
docxx_update;
do_tar;
+ clean_tmp;
}
main;
% Creator: mf-to-table.py version 0.4
-% Automatically generated on Fri Dec 12 01:52:34 1997
+% Automatically generated on Fri Dec 12 11:29:20 1997
% Do not edit
% input from out/feta16.log
% name=\symboltables {
% Creator: mf-to-table.py version 0.4
-% Automatically generated on Fri Dec 12 01:52:57 1997
+% Automatically generated on Fri Dec 12 11:29:22 1997
% Do not edit
% input from out/feta20.log
% name=\symboltables {
\meter 4/4;
\textstyle "finger";
c4^"1" d^"2" e^"3" f^"4" g^"5"
- < bes4^"1" e_"2" c_"4" >
- a'^"0"
+
+ % Music for the Martians?
+ < bes4^"6" e_"7" c_"8" >
+ a'^"0"_"9"
% ugh, \flageolet is like open, but maybe a perfect circle
a^\open
MAJOR_VERSION = 0
MINOR_VERSION = 1
-PATCH_LEVEL = 36
+PATCH_LEVEL = 37
MY_PATCH_LEVEL =
#include "grouping.hh"
#include "text-spanner.hh"
#include "text-def.hh"
+#include "p-col.hh"
Beam_engraver::Beam_engraver()
{
span_reqs_drul_[LEFT] = span_reqs_drul_[RIGHT] =0;
beam_p_ =0;
current_grouping_p_ =0;
+ plet_spanner_p_ =0;
}
bool
beam_p_ = new Beam;
if (span_reqs_drul_[LEFT]->nplet)
{
- Text_spanner* t = new Text_spanner();
+ plet_spanner_p_ = new Text_spanner();
Text_def *defp = new Text_def;
- t->set_support (beam_p_);
+ plet_spanner_p_->set_support (beam_p_);
+
+ // ugh
+ plet_spanner_p_->set_bounds (LEFT, get_staff_info ().command_pcol_l ());
+
defp->align_i_ = 0;
defp->text_str_ = span_reqs_drul_[LEFT]->nplet;
defp->style_str_="italic";
- t->spec_p_ = defp;
- announce_element (Score_elem_info (t,0));
- typeset_element (t);
+ plet_spanner_p_->spec_p_ = defp;
+ announce_element (Score_elem_info(plet_spanner_p_,0));
}
announce_element (Score_elem_info (beam_p_, span_reqs_drul_[LEFT]));
}
void
Beam_engraver::do_pre_move_processing()
{
- if (beam_p_ && span_reqs_drul_[RIGHT]) {
- Rhythmic_grouping const * rg_C = get_staff_info().rhythmic_C_;
- rg_C->extend (current_grouping_p_->interval());
- beam_p_->set_grouping (*rg_C, *current_grouping_p_);
- typeset_element (beam_p_);
- beam_p_ = 0;
-
- delete current_grouping_p_;
- current_grouping_p_ = 0;
-
- span_reqs_drul_[RIGHT] =
- span_reqs_drul_[LEFT] = 0;
- }
+ if (beam_p_ && span_reqs_drul_[RIGHT])
+ {
+ Rhythmic_grouping const * rg_C = get_staff_info().rhythmic_C_;
+ rg_C->extend (current_grouping_p_->interval());
+ beam_p_->set_grouping (*rg_C, *current_grouping_p_);
+ typeset_element (beam_p_);
+ beam_p_ = 0;
+
+ delete current_grouping_p_;
+ current_grouping_p_ = 0;
+
+ span_reqs_drul_[RIGHT] =
+ span_reqs_drul_[LEFT] = 0;
+ if (plet_spanner_p_)
+ {
+ typeset_element (plet_spanner_p_);
+ plet_spanner_p_ =0;
+ }
+ }
}
void
/*
TODO: do something sensible if it doesn't fit in the beam.
*/
- current_grouping_p_->add_child (get_staff_info().time_C_->whole_in_measure_,
- rhythmic_req->duration ());
- s->flag_i_ = rhythmic_req->duration_.durlog_i_;
- beam_p_->add (s);
-}
+ Moment start = get_staff_info().time_C_->whole_in_measure_;
+ if (!current_grouping_p_->child_fit_b (start))
+ {
+ String s (_("please fix me: Stem at ")
+ + String(now_moment ()) + _(" does not fit in beam"));
+ if (i.req_l_)
+ i.req_l_->warning(s);
+ else
+ warning (s);
+ }
+ else
+ {
+ current_grouping_p_->add_child (start, rhythmic_req->duration ());
+ s->flag_i_ = rhythmic_req->duration_.durlog_i_;
+ beam_p_->add (s);
+ }
+}
IMPLEMENT_IS_TYPE_B1(Beam_engraver, Engraver);
ADD_THIS_TRANSLATOR(Beam_engraver);
Directional_spanner::do_pre_processing()
{
if (!dir_)
- set_default_dir();
+ set_default_dir();
}
Directional_spanner::Directional_spanner()
if (cresc_p_)
{
typeset_element (cresc_p_ );
+
+ cresc_req_l_->warning (_("unended crescendo"));
cresc_p_ =0;
}
if (to_end_cresc_p_)
{
typeset_element (to_end_cresc_p_);
- cresc_req_l_->warning (_("unended crescendo"));
to_end_cresc_p_ =0;
}
if (dynamic_p_)
Rhythmic_grouping::add_child (Moment start, Moment len)
{
Moment stop = start+len;
-
assert (child_fit_b (start));
children.push (new Rhythmic_grouping (MInterval (start, stop)));
}
{
Drul_array<Beam_req *> span_reqs_drul_;
Beam *beam_p_;
+ Text_spanner *plet_spanner_p_;
Rhythmic_grouping *current_grouping_p_;
public:
struct Text_item ;
struct Text_engraver;
struct Text_req;
+struct Text_spanner;
struct Tie;
struct Tie_engraver;
struct Tie_req;
extern bool only_midi;
extern int exit_status_i_;
extern bool experimental_features_global_b;
+extern bool postscript_global_b;
extern String default_out_fn;
Array<Slur *> slur_l_stack_;
Array<Slur*> end_slur_l_arr_;
Direction dir_;
- /* *************** */
+
protected:
- virtual ~Slur_engraver();
+
virtual bool do_try_request (Request*);
virtual void do_process_requests();
virtual void acknowledge_element (Score_elem_info);
virtual void do_pre_move_processing();
virtual void do_post_move_processing();
+ virtual void do_removal_processing ();
public:
TRANSLATOR_CLONE(Slur_engraver);
Slur_engraver();
*/
class Slur : public Bow {
public:
- Link_array<Note_column> encompass_arr_;
- void add (Note_column*);
+ Link_array<Note_column> encompass_arr_;
+ void add (Note_column*);
protected:
- virtual void set_default_dir();
- virtual void do_post_processing();
- virtual void do_substitute_dependency (Score_elem*, Score_elem*);
- virtual void do_pre_processing();
- SCORE_ELEM_CLONE(Slur);
- DECLARE_MY_RUNTIME_TYPEINFO;
+ virtual void set_default_dir();
+ virtual void do_post_processing();
+ virtual void do_add_processing ();
+ virtual void do_pre_processing ();
+ virtual void do_substitute_dependency (Score_elem*, Score_elem*);
+
+ SCORE_ELEM_CLONE(Slur);
+ DECLARE_MY_RUNTIME_TYPEINFO;
};
#endif // SLUR_HH
Atom
Lookup::hairpin (Real &wid, bool decresc) const
{
- bool embedded_b = experimental_features_global_b;
+ bool embedded_b = postscript_global_b;
String embed;
Atom ret;
if (embedded_b)
}
else
{
+ if (wid > 32 * 6 PT)
+ {
+ warning (_("Crescendo too long (") + print_dimen (wid)
+ +_( ") shrinking (ugh)"));
+ wid = 32*6 PT;
+ }
int idx = int (rint (wid / 6 PT));
if (!idx) idx ++;
wid = idx*6 PT;
Array<String> a;
a.push (idx);
ret.tex_ = substitute_args (ret.tex_, a);
-
}
ret.dim_.x() = Interval (0,wid);
Sources* source_l_g = 0;
bool only_midi = false;
bool experimental_features_global_b = false;
+bool postscript_global_b = false;
int exit_status_i_;
void destill_inname (String &name_str_r);
{1, "init", 'i'},
{1, "include", 'I'},
{0, "midi", 'M'},
+ {0, "postscript", 'p'},
{0, "ignore-version", 'V'},
{0,0,0}
};
" -t, --test switch on experimental features\n"
" -M, --midi produce midi output only\n"
" -V, --ignore-version ignore mudela version\n"
+ " -p, --postscript try to use PostScript\n"
"\n"
"GNU LilyPond was compiled with the following settings:\n")
#ifdef NDEBUG
case 'V':
version_ignore_b = true;
break;
+ case 'p':
+ postscript_global_b = true;
+ break;
case 'd':
set_debug (true);
break;
if (experimental_features_global_b)
tex_out << "\\turnOnExperimentalFeatures%\n";
+ if (postscript_global_b)
+ tex_out << "\\turnOnPostScript%\n";
super_elem_l_->output_all ();
tex_out << "\n\\EndLilyPondOutput";
outputter_l_ = 0;
Score_elem::calcalute_dependencies (int final, int busy,
Score_elem_method_pointer funcptr)
{
- if (status_i_ >= final)
+ if (status_i_ >= final)
return;
- assert (status_i_!= busy);
- status_i_= busy;
+ assert (status_i_!= busy);
+ status_i_= busy;
for (int i=0; i < dependency_size(); i++)
dependency (i)->calcalute_dependencies (final, busy, funcptr);
void
Score_elem::do_brew_molecule ()
{
- if (transparent_b_)
+ if (transparent_b_)
return ;
- Molecule *output= brew_molecule_p ();
- pscore_l_->outputter_l_->output_molecule (output, absolute_offset ());
+ Molecule *output= brew_molecule_p ();
+ pscore_l_->outputter_l_->output_molecule (output, absolute_offset ());
}
/*
else
{
new_arr.push (it_l->broken_to_drul_[LEFT]);
- old_arr.push (0);
- old_arr.push (0);
- new_arr.push (it_l->broken_to_drul_[RIGHT]);
+ old_arr.push (0);
+ old_arr.push (0);
+ new_arr.push (it_l->broken_to_drul_[RIGHT]);
}
}
{
Score_elem * elem_p = elem_p_arr_[i];
if (elem_p->spanner())
- pscore_p_->typeset_unbroken_spanner (elem_p->spanner());
+ {
+ Spanner *s = elem_p->spanner ();
+ pscore_p_->typeset_unbroken_spanner (s);
+
+ /*
+ do something sensible if spanner not
+ spanned on 2 items.
+ */
+ Direction d = LEFT;
+ do {
+ if (!s->spanned_drul_[d])
+ s->set_bounds(d, command_column_l_);
+ } while ((d *= -1) != LEFT);
+
+ }
else
{
Item *item_p = elem_p->item();
/*
- slur-reg.cc -- implement Slur_engraver
+ slur-grav.cc -- implement Slur_engraver
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
}
}
+void
+Slur_engraver::do_removal_processing ()
+{
+ for (int i = 0; i < slur_l_stack_.size(); i++)
+ {
+ typeset_element (slur_l_stack_[i]);
+ }
+ slur_l_stack_.clear ();
+ for (int i=0; i < requests_arr_.size(); i++)
+ {
+ requests_arr_[i]->warning (_("unterminated slur"));
+ }
+}
+
/*
abracadabra
*/
{
new_slur_req_l_arr_.clear();
}
-Slur_engraver::~Slur_engraver()
-{
- for (int i=0; i < requests_arr_.size(); i++)
- {
- requests_arr_[i]->warning (_("unterminated slur"));
- }
-}
IMPLEMENT_IS_TYPE_B1(Slur_engraver,Engraver);
ADD_THIS_TRANSLATOR(Slur_engraver);
}
void
-Slur::do_pre_processing()
+Slur::do_add_processing()
{
set_bounds(LEFT, encompass_arr_[0]);
- set_bounds(RIGHT, encompass_arr_.top());
+ if (encompass_arr_.size () > 1)
+ set_bounds(RIGHT, encompass_arr_.top());
}
+void
+Slur::do_pre_processing ()
+{
+ // don't set directions
+}
void
Slur::do_substitute_dependency (Score_elem*o, Score_elem*n)
{
assert (!head_l_drul_[d]);
head_l_drul_[d] = head_l;
+ set_bounds (d, head_l);
add_dependency (head_l);
}
same_pitch_b_ =false;
}
+
+/*
+ ugh: direction of the Tie is more complicated. See [Ross] p136 and further
+ */
void
Tie::set_default_dir()
{
- int m= (head_l_drul_[LEFT]->position_i_ + head_l_drul_[RIGHT]->position_i_) /2;
- dir_ = (m < 5)? DOWN : UP; // UGH
+ int m= (head_l_drul_[LEFT]->position_i_
+ + head_l_drul_[RIGHT]->position_i_) /2;
+ dir_ = (m < 0)? DOWN : UP;
}
void
if (!(head_l_drul_[LEFT] && head_l_drul_[RIGHT]))
warning (_("Lonely tie.. "));
- set_bounds(LEFT,head_l_drul_[LEFT]);
- set_bounds(RIGHT,head_l_drul_[RIGHT]);
+ Direction d = LEFT;
+ Drul_array<Note_head *> new_head_drul = head_l_drul_;
+ do {
+ if (!head_l_drul_[d])
+ new_head_drul[d] = head_l_drul_[(Direction)-d];
+ } while ((d *= -1) != LEFT);
+ head_l_drul_ = new_head_drul;
}
void
Begin3
Titel: LilyPond
-Versie: 0.1.36
-Inschrijf datum: 06DEC97
+Versie: 0.1.37
+Inschrijf datum: 12DEC97
Beschrijving: LilyPond is de muziek typesetter van het GNU Project.
Het programma genereert muziek in zichtbare of
hoorbare vorm uit uit een muzikale definitie file:
jan@digicash.com (Jan Nieuwenhuizen)
Onderhouden door: hanwen@stack.nl (Han-Wen Nienhuys)
Voornaamste plek: sunsite.unc.edu /pub/Linux/apps
- 395k lilypond-0.1.36.tar.gz
+ 395k lilypond-0.1.37.tar.gz
Oorspronkelijke plek: pcnov095.win.tue.nl /pub/lilypond/
- 395k lilypond-0.1.36.tar.gz
+ 395k lilypond-0.1.37.tar.gz
Copi"eer politie: GPL
End
Begin3
Title: LilyPond
-Version: 0.1.36
-Entered-date: 06DEC97
+Version: 0.1.37
+Entered-date: 12DEC97
Description: LilyPond is the GNU Project music typesetter. The program
generates visual or auditive output from a music
definition file: it can typeset formatted sheet music
jan@digicash.com (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 460k lilypond-0.1.36.tar.gz
+ 460k lilypond-0.1.37.tar.gz
Original-site: pcnov095.win.tue.nl /pub/lilypond/development/
- 460k lilypond-0.1.36.tar.gz
+ 460k lilypond-0.1.37.tar.gz
Copying-policy: GPL
End
Name: lilypond
-Version: 0.1.36
+Version: 0.1.37
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: alpha.gnu.org:/gnu/lilypond/development/lilypond-0.1.36.tar.gz
+Source0: alpha.gnu.org:/gnu/lilypond/development/lilypond-0.1.37.tar.gz
Summary: A program for typesetting music.
URL: http://www.stack.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
make prefix="$RPM_BUILD_ROOT/usr" install
%files
%doc Documentation/out/AUTHORS.text Documentation/out/CodingStyle.text Documentation/out/INSTALL.text Documentation/out/MANIFESTO.text Documentation/out/convert-mudela.text Documentation/out/faq.text Documentation/out/gnu-music.text Documentation/out/index.text Documentation/out/internals.text Documentation/out/language.text Documentation/out/lilypond.text Documentation/out/links.text Documentation/out/literature.text Documentation/out/mi2mu.text Documentation/out/mudela-book.text Documentation/out/mutopia.text Documentation/out/other-packages.text BUGS TODO NEWS DEDICATION ANNOUNCE README
-%doc input/beams.ly input/cadenza.ly input/collisions.ly input/coriolan-alto.ly input/font.ly input/font20.ly input/gallina.ly input/gallina.tex input/gourlay.ly input/header.ly input/keys.ly input/kortjakje.ly input/multi.ly input/pedal.ly input/rhythm.ly input/scales.ly input/scripts.ly input/scsii-menuetto.ly input/scsii-menuetto.tex input/sleur.ly input/slurs.ly input/standchen-16.ly input/standchen-16.tex input/standchen-20.ly input/standchen-20.tex input/standchen.ly input/toccata-fuga-E.ly input/twinkle-pop.ly input/twinkle.ly input/wtk1-fugue1.ly input/wtk1-fugue2.ly input/wtk1-prelude1.ly Documentation/mudela-course.doc Documentation/mudela-man.doc
+%doc input/beams.ly input/cadenza.ly input/collisions.ly input/coriolan-alto.ly input/font.ly input/font20.ly input/gallina.ly input/gallina.tex input/gourlay.ly input/keys.ly input/kortjakje.ly input/multi.ly input/pedal.ly input/rhythm.ly input/scales.ly input/scripts.ly input/scsii-menuetto.ly input/scsii-menuetto.tex input/sleur.ly input/slurs.ly input/standchen-16.ly input/standchen-16.tex input/standchen-20.ly input/standchen-20.tex input/standchen.ly input/toccata-fuga-E.ly input/twinkle-pop.ly input/twinkle.ly input/wtk1-fugue1.ly input/wtk1-fugue2.ly input/wtk1-prelude1.ly Documentation/mudela-course.doc Documentation/mudela-man.doc
%doc Documentation/out/lelie_logo.gif
/usr/bin/convert-mudela
/usr/bin/mudela-book
#
TEXFILES = $(wildcard *.tex)
MFFILES = $(wildcard *.mf)
-EXTRA_DISTFILES = $(MFFILES) $(TEXFILES) TODO
+EXTRA_DISTFILES = $(MFFILES) $(TEXFILES) TODO README
#
FONT_FILES = $(wildcard *[0-9].mf)
--- /dev/null
+
+This is a font of music symbols. All MF sources are original. The
+symbols are modelled after various editions of music, notably
+
+ - Baerenreiter
+ - Hofmeister
+ - Breitkopf
+ - Durand & C'ie
+
+The best references on Music engraving are [Wanske] and [Ross], some
+of their insights have also been used. Although a matter of taste,
+I'd say that Baerenreiter has the finest typography of all.
+
+Traditional engraving uses a set of 9 standardised sizes for Staffs
+(running from 0 to 8).
+
+I tried measuring those (helped by a magnifying glass), and I get the
+staffsizes in the following table. One should note that these are
+estimates, so I think there could be a measuring error of ~ .5 pt.
+Moreover [Ross] states that not all engravers use exactly those sizes.
+
+Staffsize Numbers Name
+
+26.2pt No. 0
+22.6pt No. 1 Giant/English
+21.3pt No. 2 Giant/English
+19.9pt No. 3 Regular, Ordinary, Common
+19.1pt No. 4 Peter
+17.1pt No. 5 Large middle
+15.9pt No. 6 Small middle
+13.7pt No. 7 Cadenza
+11.1pt No. 8 Pearl
+
+
+This table is partially taken from [Ross]. Most music is set in No.3,
+but the papersizes usually are bigger than standard printer paper
+(such as A4).
+
+[Ross] states that the dies (the stamps to make the symbols) come in
+12 different sizes.
+
+
- lo-res fixes.
- work out sizes of character fonts.
- more symbols
- * some scripts:
+ * some scripts: flageolet
* piano pedals,
* trills
* maxima notehead
* coda signs.
- * 0 - 9:
- - 4/6pt slanted ?
- - large(3/4staff)
- 128th flags
- include important spacing dims in fetalog
%
% The down marcato char (not very much used).
% Contrary to what some MF/TeX `gurus' believe
-% it is *point*-symmetric with the "up" version; (at least [Chlapik] and
-% and [Wanske] agree with us)
-%
+% it is *point*-symmetric with the "up" version
fet_beginchar("marcato down", "dmarcato", "dmarcato")
draw_marcato;
xy_mirror_char;
% Creator: mf-to-table.py version 0.4
-% Automatically generated on Fri Dec 12 01:52:34 1997
+% Automatically generated on Fri Dec 12 11:29:20 1997
% Do not edit
% input from out/feta16.log
% name
% Creator: mf-to-table.py version 0.4
-% Automatically generated on Fri Dec 12 01:52:57 1997
+% Automatically generated on Fri Dec 12 11:29:22 1997
% Do not edit
% input from out/feta20.log
% name
-\def\turnOnExperimentalFeatures{
%
% WARNING: don't leave blank lines in the PS-code; they are
%
+\def\turnOnPostScript{
+\def\embeddedps##1{
+ %
+ % This sets CTM so that you get to the currentpoint
+ % by executing a 0 0 moveto
+ \special{ps: @beginspecial @setspecial ##1 @endspecial}
+}
\special{ps:
/draw_decresc
{
}
def
}
+}
-
+\def\turnOnExperimentalFeatures{
% draw a slur in embedded postscript
\special{ps:
/xbow 1 3 div def
}
\def\embeddedtex#1{#1}
-\def\embeddedps#1{
- %
- % This sets CTM so that you get to the currentpoint
- % by executing a 0 0 moveto
- \special{ps: @beginspecial @setspecial #1 @endspecial}
-}
+
\def\embeddedmf#1{
\edef\embedid{feta-sleur-\number\embedcount}
\immediate\openout\embedfile=\embedid.mf