From 6a0ea5e307744ad53d8b4a7381f2b27c2cfc9c13 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Fri, 25 Jul 1997 10:22:40 +0200 Subject: [PATCH] patch::: 0.0.75.jcn6: pats pl 75.jcn6 - {lyric,meter,key}-performer - span-brace-* pl 75.jcn5 - doze compile --- .version | 2 +- NEWS | 7 +++ init/engraver.ini | 1 + init/performer.ini | 2 + init/table16.ini | 1 + lily/.version | 2 +- lily/elem-group.cc | 4 ++ lily/include/elem-group.hh | 2 +- lily/include/key-performer.hh | 30 ++++++++++ lily/include/lyric-performer.hh | 11 ++-- lily/include/meter-performer.hh | 30 ++++++++++ lily/include/music-list.hh | 1 + lily/include/span-brace-engraver.hh | 31 +++++++++++ lily/include/span-brace-item.hh | 32 +++++++++++ lily/key-performer.cc | 65 ++++++++++++++++++++++ lily/lookup.cc | 16 +++--- lily/lyric-performer.cc | 51 ++++++++--------- lily/meter-performer.cc | 60 ++++++++++++++++++++ lily/span-brace-engraver.cc | 57 +++++++++++++++++++ lily/span-brace-item.cc | 85 +++++++++++++++++++++++++++++ lily/template7.cc | 2 + lily/template8.cc | 2 + mi2mu/midi-event.cc | 4 +- tex/dimen.tex | 6 +- tex/lilyponddefs.tex | 3 +- 25 files changed, 458 insertions(+), 49 deletions(-) create mode 100644 lily/include/key-performer.hh create mode 100644 lily/include/meter-performer.hh create mode 100644 lily/include/span-brace-engraver.hh create mode 100644 lily/include/span-brace-item.hh create mode 100644 lily/key-performer.cc create mode 100644 lily/meter-performer.cc create mode 100644 lily/span-brace-engraver.cc create mode 100644 lily/span-brace-item.cc diff --git a/.version b/.version index 0d744cf4c4..4733fbb512 100644 --- a/.version +++ b/.version @@ -4,4 +4,4 @@ TOPLEVEL_PATCH_LEVEL = 75 # use to send patches, always empty for released version: # include separator: ".postfix", "-pl" makes rpm barf -TOPLEVEL_MY_PATCH_LEVEL = .jcn4 +TOPLEVEL_MY_PATCH_LEVEL = .jcn6 diff --git a/NEWS b/NEWS index d2f72f8830..e68557764c 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,10 @@ +pl 75.jcn6 + - {lyric,meter,key}-performer + - span-brace-* + +pl 75.jcn5 + - doze compile + pl 75.jcn4 - midi output, notes only diff --git a/init/engraver.ini b/init/engraver.ini index fac0e15c06..f78fa772b4 100644 --- a/init/engraver.ini +++ b/init/engraver.ini @@ -14,6 +14,7 @@ \consists "Vertical_align_engraver"; \consists "Span_bar_engraver"; + \consists "Span_brace_engraver"; \contains\requesttranslator { Engraver "Staff_engravers" diff --git a/init/performer.ini b/init/performer.ini index 093ac59b5f..174da6fb0b 100644 --- a/init/performer.ini +++ b/init/performer.ini @@ -21,7 +21,9 @@ \contains\requesttranslator{ Performer "Performer_group_performer" \consists "Lyric_performer"; + \consists "Key_performer"; \consists "Note_performer"; + \consists "Meter_performer"; \consists "Silent_performer"; } } diff --git a/init/table16.ini b/init/table16.ini index d09a275b72..d18731c845 100644 --- a/init/table16.ini +++ b/init/table16.ini @@ -129,6 +129,7 @@ table_sixteen= % dims ignored for this table "param" = \table { + "brace" "\brace{%}" 0.0\pt 0.0\pt -3.0\pt 3.0\pt "meter" "\generalmeter{%}{%}" 0.0\pt 10.0\pt -5.0\pt 5.0\pt "linestaf" "\linestafsym{%}{%}" "stem" "\stem{%}{%}" diff --git a/lily/.version b/lily/.version index 85229439ea..c535523065 100644 --- a/lily/.version +++ b/lily/.version @@ -4,4 +4,4 @@ PATCH_LEVEL = 75 # use to send patches, always empty for released version: # include separator: ".postfix", "-pl" makes rpm barf -MY_PATCH_LEVEL = .jcn2 +MY_PATCH_LEVEL = .jcn5 diff --git a/lily/elem-group.cc b/lily/elem-group.cc index e104187fc2..1bf661a271 100644 --- a/lily/elem-group.cc +++ b/lily/elem-group.cc @@ -150,6 +150,10 @@ Elbement_group::Elbement_group() IMPLEMENT_IS_TYPE_B2(Horizontal_vertical_group, Horizontal_group, Vertical_group); IMPLEMENT_STATIC_NAME(Horizontal_vertical_group); +Horizontal_vertical_group::Horizontal_vertical_group() +{ +} + void Horizontal_vertical_group::do_substitute_dependency(Score_elem*o,Score_elem*n) { diff --git a/lily/include/elem-group.hh b/lily/include/elem-group.hh index c49c425a45..245b2dfcf1 100644 --- a/lily/include/elem-group.hh +++ b/lily/include/elem-group.hh @@ -60,7 +60,7 @@ class Horizontal_vertical_group : public Vertical_group, protected: virtual Horizontal_vertical_group* elem_group() { return this; } public: - Element_group(); + Horizontal_vertical_group(); bool contains_b(Score_elem const *)const; NAME_MEMBERS(); virtual void do_substitute_dependency(Score_elem*,Score_elem*); diff --git a/lily/include/key-performer.hh b/lily/include/key-performer.hh new file mode 100644 index 0000000000..b2612147f0 --- /dev/null +++ b/lily/include/key-performer.hh @@ -0,0 +1,30 @@ +/* + key-performer.hh -- declare Key_performer + + source file of the GNU LilyPond music typesetter + + (c) 1997 Jan Nieuwenhuizen +*/ + +#ifndef KEY_PERFOMER_HH +#define KEY_PERFOMER_HH + +#include "lily-proto.hh" +#include "performer.hh" + +class Key_performer : public Performer { +public: + NAME_MEMBERS(); + Key_performer(); + ~Key_performer(); + +protected: + void do_print() const; + virtual bool try_request( Request* req_l ); + virtual void process_requests(); + +private: + Key_change_req* key_req_l_; +}; + +#endif // KEY_PERFOMER_HH diff --git a/lily/include/lyric-performer.hh b/lily/include/lyric-performer.hh index 3abb55b0ba..e9bd22a2ee 100644 --- a/lily/include/lyric-performer.hh +++ b/lily/include/lyric-performer.hh @@ -3,8 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys - Jan Nieuwenhuizen + (c) 1997 Jan Nieuwenhuizen */ @@ -21,11 +20,13 @@ public: Lyric_performer(); ~Lyric_performer(); +protected: + void do_print() const; + virtual bool try_request( Request* req_l ); + virtual void process_requests(); + private: Array lreq_arr_; - virtual bool do_try_request(Request*); - virtual void do_process_requests(); - virtual void do_post_move_processing(); }; #endif // LYRIC_PERFOMER_HH diff --git a/lily/include/meter-performer.hh b/lily/include/meter-performer.hh new file mode 100644 index 0000000000..13cbec5bd0 --- /dev/null +++ b/lily/include/meter-performer.hh @@ -0,0 +1,30 @@ +/* + meter-performer.hh -- declare Meter_performer + + source file of the GNU LilyPond music typesetter + + (c) 1997 Jan Nieuwenhuizen +*/ + +#ifndef METER_PERFOMER_HH +#define METER_PERFOMER_HH + +#include "lily-proto.hh" +#include "performer.hh" + +class Meter_performer : public Performer { +public: + NAME_MEMBERS(); + Meter_performer(); + ~Meter_performer(); + +protected: + void do_print() const; + virtual bool try_request( Request* req_l ); + virtual void process_requests(); + +private: + Meter_change_req* meter_req_l_; +}; + +#endif // METER_PERFOMER_HH diff --git a/lily/include/music-list.hh b/lily/include/music-list.hh index 30d5793253..6ea2ae0f47 100644 --- a/lily/include/music-list.hh +++ b/lily/include/music-list.hh @@ -56,6 +56,7 @@ public: class Voice_element : public Chord { public: NAME_MEMBERS(); + Voice_element(); VIRTUAL_COPY_CONS(Voice_element,Music); }; diff --git a/lily/include/span-brace-engraver.hh b/lily/include/span-brace-engraver.hh new file mode 100644 index 0000000000..a91556923c --- /dev/null +++ b/lily/include/span-brace-engraver.hh @@ -0,0 +1,31 @@ +/* + span-brace-engraver.hh -- declare Span_brace_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys +*/ + + +#ifndef SPAN_BRACE_GRAV_HH +#define SPAN_BRACE_GRAV_HH + +#include "engraver.hh" + +class Span_brace_engraver : public Engraver +{ +public: + NAME_MEMBERS(); + Span_brace_engraver(); + ~Span_brace_engraver(); + + virtual void acknowledge_element( Score_elem_info i ); + virtual void do_pre_move_processing(); + +private: + Span_brace_item* span_brace_p_; + Array bar_l_arr_; + Vertical_align_element* valign_l_; +}; + +#endif // SPAN_BRACE_GRAV_HH diff --git a/lily/include/span-brace-item.hh b/lily/include/span-brace-item.hh new file mode 100644 index 0000000000..88c8c2a40c --- /dev/null +++ b/lily/include/span-brace-item.hh @@ -0,0 +1,32 @@ +/* + span-brace-item.hh -- declare Span_brace_item + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + + +#ifndef SPAN_BRACE_ITEM_HH +#define SPAN_BRACE_ITEM_HH + +#include "bar.hh" + +class Span_brace_item : public Item +{ +public: + NAME_MEMBERS(); + SCORE_ELEM_CLONE(Span_brace_item); + + void add( Bar* bar_l ); + void set( Vertical_align_element* vae_l ); + void do_pre_processing(); + void do_substitute_dependency( Score_elem*, Score_elem* ); + Molecule* brew_molecule_p() const; + +private: + Link_array spanning_l_arr_; +}; + +#endif // SPAN_BRACE_ITEM_HH diff --git a/lily/key-performer.cc b/lily/key-performer.cc new file mode 100644 index 0000000000..0ed1f33afa --- /dev/null +++ b/lily/key-performer.cc @@ -0,0 +1,65 @@ +/* + key-performer.cc -- implement Key_performer + + source file of the GNU LilyPond music typesetter + + (c) 1997 Jan Nieuwenhuizen +*/ + +#include "key-performer.hh" +#include "command-request.hh" +#include "midi-item.hh" + + +IMPLEMENT_STATIC_NAME(Key_performer); +IMPLEMENT_IS_TYPE_B1(Key_performer,Performer); +ADD_THIS_PERFORMER(Key_performer); + +Key_performer::Key_performer() +{ + key_req_l_ = 0; +} + +Key_performer::~Key_performer() +{ +} + +void +Key_performer::do_print() const +{ +#ifndef NPRINT + if ( key_req_l_ ) + key_req_l_->print(); +#endif +} + +void +Key_performer::process_requests() +{ + if ( key_req_l_ ) { + int sharps_i = key_req_l_->sharps_i(); + int flats_i = key_req_l_->flats_i(); + // midi cannot handle non-conventional keys + if ( !( flats_i && sharps_i ) ) { + Midi_key k( sharps_i - flats_i, key_req_l_->minor_b() ); + play_event( &k ); + } + key_req_l_ = 0; + } +} + +bool +Key_performer::try_request( Request* req_l ) +{ + if ( key_req_l_ ) + return false; + + if ( req_l->command() ) + key_req_l_ = req_l->command()->keychange(); + + if ( key_req_l_ ) + return true; + + return false; +} + diff --git a/lily/lookup.cc b/lily/lookup.cc index e4a92693db..790ab2d34a 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -240,18 +240,18 @@ Lookup::stem(Real y1,Real y2) const } Symbol -Lookup::vbrace(Real &y) const +Lookup::vbrace( Real &y ) const { - if (y < 2* 20 PT) { - warning ( "piano brace too small (" + print_dimen(y)+ ")"); - y = 2*20 PT; + if ( y < 2 * 20 PT ) { + warning( "staff brace too small (" + print_dimen( y ) + ")" ); + y = 2 * 20 PT; } - if (y > 67 * 2 PT) { - warning ( "piano brace too big (" + print_dimen(y)+ ")"); - y = 67 *2 PT; + if ( y > 2 * 67 PT ) { + warning( "staff brace too big (" + print_dimen( y ) + ")" ); + y = 2 * 67 PT; } - int idx = int(rint((y/2.0 - 20 ) + 148)); + int idx = int( rint( y/2.0 - 20 ) ); Symbol s = (*symtables_)("param")->lookup("brace"); diff --git a/lily/lyric-performer.cc b/lily/lyric-performer.cc index aa24dcac25..81014b9d5d 100644 --- a/lily/lyric-performer.cc +++ b/lily/lyric-performer.cc @@ -3,15 +3,13 @@ source file of the GNU LilyPond music typesetter - (c) 1997 Han-Wen Nienhuys - Jan Nieuwenhuizen + (c) 1997 Jan Nieuwenhuizen */ #include "lyric-performer.hh" +#include "text-def.hh" #include "musical-request.hh" -//#include "text-item.hh" -//#include "paper-def.hh" -//#include "lookup.hh" +#include "midi-item.hh" IMPLEMENT_STATIC_NAME(Lyric_performer); @@ -26,37 +24,34 @@ Lyric_performer::~Lyric_performer() { } -bool -Lyric_performer::do_try_request( Request* req_l ) +void +Lyric_performer::do_print() const { - Musical_req* m_l = req_l->musical(); - if ( !m_l || ! m_l->lreq_l() ) - return false; - lreq_arr_.push( m_l->lreq_l() ); - - return true; +#ifndef NPRINT + if ( lreq_arr_.size() ) + lreq_arr_[ 0 ]->print(); +#endif } void -Lyric_performer::do_process_requests() +Lyric_performer::process_requests() { -#if 0 - Text_item * last_item_l =0; - for (int i=0; i < lreq_arr_.size(); i++) { - Text_item *lp = new Text_item(lreq_arr_[i]->tdef_p_ ); - lp->dir_i_ = -1; - lp->fat_b_ = true; - if (last_item_l) - lp->add_support(last_item_l); - last_item_l = lp; - typeset_element(lp); + if ( lreq_arr_.size() ) { + Midi_text t( Midi_text::LYRIC, lreq_arr_[ 0 ]->tdef_p_->text_str_ ); + play_event( &t ); } -#endif + + lreq_arr_.clear(); } -void -Lyric_performer::do_post_move_processing() +bool +Lyric_performer::try_request( Request* req_l ) { - lreq_arr_.set_size(0); + Musical_req* m_l = req_l->musical(); + if ( !m_l || ! m_l->lreq_l() ) + return false; + lreq_arr_.push( m_l->lreq_l() ); + + return true; } diff --git a/lily/meter-performer.cc b/lily/meter-performer.cc new file mode 100644 index 0000000000..c04bf3bf56 --- /dev/null +++ b/lily/meter-performer.cc @@ -0,0 +1,60 @@ +/* + meter-performer.cc -- implement Meter_performer + + source file of the GNU LilyPond music typesetter + + (c) 1997 Jan Nieuwenhuizen +*/ + +#include "meter-performer.hh" +#include "command-request.hh" +#include "midi-item.hh" + + +IMPLEMENT_STATIC_NAME(Meter_performer); +IMPLEMENT_IS_TYPE_B1(Meter_performer,Performer); +ADD_THIS_PERFORMER(Meter_performer); + +Meter_performer::Meter_performer() +{ + meter_req_l_ = 0; +} + +Meter_performer::~Meter_performer() +{ +} + +void +Meter_performer::do_print() const +{ +#ifndef NPRINT + if ( meter_req_l_ ) + meter_req_l_->print(); +#endif +} + +void +Meter_performer::process_requests() +{ + if ( meter_req_l_ ) { + Midi_time m( meter_req_l_->beats_i_, meter_req_l_->one_beat_i_, 18 ); + play_event( &m ); + meter_req_l_ = 0; + } +} + +bool +Meter_performer::try_request( Request* req_l ) +{ + if ( meter_req_l_ ) + return false; + + if ( req_l->command() ) + meter_req_l_ = req_l->command()->meterchange(); + + if ( meter_req_l_ ) + return true; + + return false; +} + diff --git a/lily/span-brace-engraver.cc b/lily/span-brace-engraver.cc new file mode 100644 index 0000000000..d1f73147dd --- /dev/null +++ b/lily/span-brace-engraver.cc @@ -0,0 +1,57 @@ +/* + span-brace-engraver.cc -- implement Span_brace_engraver + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + +#include "span-brace-item.hh" +#include "span-brace-engraver.hh" +#include "vertical-align-spanner.hh" + +IMPLEMENT_STATIC_NAME(Span_brace_engraver); +IMPLEMENT_IS_TYPE_B1(Span_brace_engraver,Engraver); +ADD_THIS_ENGRAVER(Span_brace_engraver); + +Span_brace_engraver::Span_brace_engraver() +{ + span_brace_p_ = 0; + valign_l_ = 0; +} + +Span_brace_engraver::~Span_brace_engraver() +{ +} + +void +Span_brace_engraver::acknowledge_element( Score_elem_info i ) +{ + if ( i.elem_l_->is_type_b( Bar::static_name() ) ) { + bar_l_arr_.push( (Bar*)i.elem_l_->item() ); + + if ( bar_l_arr_.size() >= 2 && !span_brace_p_ ) { + span_brace_p_ = new Span_brace_item; + announce_element( Score_elem_info( span_brace_p_, 0 ) ); + } + } + else if ( i.elem_l_->is_type_b( Vertical_align_spanner::static_name() ) + && i.origin_grav_l_arr_.size() <= 2 ) + valign_l_ = (Vertical_align_spanner*)i.elem_l_->spanner(); +} + +void +Span_brace_engraver::do_pre_move_processing() +{ + if ( span_brace_p_ ) { + for ( int i=0; i < bar_l_arr_.size() ; i++ ) + span_brace_p_->add( bar_l_arr_[ i ] ); + span_brace_p_->set( valign_l_ ); + typeset_breakable_item( span_brace_p_ ); + span_brace_p_ = 0; + } + + bar_l_arr_.clear(); +} + diff --git a/lily/span-brace-item.cc b/lily/span-brace-item.cc new file mode 100644 index 0000000000..877914e764 --- /dev/null +++ b/lily/span-brace-item.cc @@ -0,0 +1,85 @@ +/* + span-brace-item.cc -- implement Span_brace_item + + source file of the GNU LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys + Jan Nieuwenhuizen +*/ + +#include "span-brace-item.hh" +#include "lookup.hh" +#include "symbol.hh" +#include "paper-def.hh" +#include "molecule.hh" +#include "vertical-align-elem.hh" + +IMPLEMENT_STATIC_NAME(Span_brace_item); +IMPLEMENT_IS_TYPE_B1( Span_brace_item, Item ); + +void +Span_brace_item::add( Bar* b ) +{ + b->spanned_i_++; + spanning_l_arr_.push( b ); + add_dependency( b ); +} + +void +Span_brace_item::do_substitute_dependency( Score_elem* o, Score_elem* n ) +{ + Bar* bold = 0; + if ( o->is_type_b( Bar::static_name() ) ) + bold = (Bar*)o->item(); + else + return; + + bold->spanned_i_--; + Bar* b = 0; + if ( n && n->is_type_b( Bar::static_name() ) ) { + b = (Bar*)n->item(); + b->spanned_i_++; + } + + spanning_l_arr_.substitute( bold, b ); +} + +void +Span_brace_item::set( Vertical_align_element* a ) +{ + add_dependency( a ); +} + + +void +Span_brace_item::do_pre_processing() +{ + if ( spanning_l_arr_.size () < 1 ) { + transparent_b_ = true; + empty_b_ = true; + } + else { // 0: nobreak, 1: pre, 2: post + empty_b_ = ( break_status_i() != 2 ); + transparent_b_ = ( break_status_i() != 1 ); + } +} + +Molecule* +Span_brace_item::brew_molecule_p() const +{ + Interval y; + for ( int i = 0; i < spanning_l_arr_.size(); i++ ) + y.unite( spanning_l_arr_[ i ]->height() ); + // ugh, one extra staff @ 16pt +// Real length_f = y.length() + spanning_l_arr_[ 0 ]->height().length(); +// Real length_f = y.length() + 16; + Real length_f = y.length() - 6; + Symbol s = paper()->lookup_l()->vbrace( length_f ); + Molecule* mol_p = new Molecule( Atom ( s ) ); +// mol_p->translate_y( - ( length_f + 16 ) / 2 ); + // urgh, what's wrong here? + mol_p->translate_y( - length_f / 2 - 6 ); + + return mol_p; +} + diff --git a/lily/template7.cc b/lily/template7.cc index 602fdeb2b6..6a5bb7d83f 100644 --- a/lily/template7.cc +++ b/lily/template7.cc @@ -6,6 +6,8 @@ (c) 1997 Han-Wen Nienhuys */ +#include "proto.hh" +#include "plist.hh" #include "plist.tcc" #include "pcursor.tcc" diff --git a/lily/template8.cc b/lily/template8.cc index db1531f0a9..bd33a49eb3 100644 --- a/lily/template8.cc +++ b/lily/template8.cc @@ -1,3 +1,5 @@ +#include "proto.hh" +#include "plist.hh" #include "plist.tcc" #include "pcursor.tcc" diff --git a/mi2mu/midi-event.cc b/mi2mu/midi-event.cc index d96c6f7f1b..4f16fe3c36 100644 --- a/mi2mu/midi-event.cc +++ b/mi2mu/midi-event.cc @@ -34,12 +34,12 @@ Midi_key::Midi_key( int accidentals_i, int minor_i ) String Midi_key::mudela_str( bool command_mode_bo ) { - String str = "\\key\\"; + String str = "\\key"; if ( !minor_i_ ) str += String( (char)( ( key_i_ + 2 ) % 7 + 'A' ) ); else // heu, -2: should be - 1 1/2: A -> fis str += String( (char)( ( key_i_ + 2 - 2 ) % 7 + 'a' ) ); - str = String( "%" ) + str + ";\n"; // "\key\F" not supported yet... + str = String( "% " ) + '"' str + '"' + "; % not supported yet\n"; return str; } diff --git a/tex/dimen.tex b/tex/dimen.tex index c67dee6551..4bfc721865 100644 --- a/tex/dimen.tex +++ b/tex/dimen.tex @@ -4,7 +4,9 @@ \font\musicfont=musix16 \font\slurfont=xslu16 -\def\thefont{\musicfont} +\font\specfont=musixspx +% \def\thefont{\musicfont} +\def\thefont{\specfont} \def\mb#1{{\thefont\char#1}} @@ -18,7 +20,7 @@ \divide\wid by 2 \here=-\wid \loop\ifdim\here<\wid\advance\here by\inc - \hbox to0pt{\kern\here\vrule width0.05pt height 2pt\hss}% + \hbox to0pt{\kern\here\vrule width0.05pt height 4pt\hss}% \repeat% } diff --git a/tex/lilyponddefs.tex b/tex/lilyponddefs.tex index bbfef12dfc..d003f860b7 100644 --- a/tex/lilyponddefs.tex +++ b/tex/lilyponddefs.tex @@ -194,9 +194,10 @@ \def\beamslope#1#2{{\count0=#2\advance\count0 by#1\musicfnt\char\count0}} -\def\rulesym#1#2{\vrule height #1 width #2} +\def\brace#1{\count0=148\advance\count0 by #1\musicdraw\char\count0} \def\crescendosym#1{\count0=84\advance\count0 by #1\musicdraw\char\count0} \def\decrescendosym#1{\count0=116\advance\count0 by #1\musicdraw\char\count0} +\def\rulesym#1#2{\vrule height #1 width #2} \def\settext#1{\textfont #1} \def\setitalic#1{\italicfont #1} \def\setdynamic#1{\dynfont #1} -- 2.39.2