+SCM
+fontify_atom (Font_metric const * met, SCM f)
+{
+ if (f == SCM_EOL)
+ return f;
+ else
+ return scm_list_n (ly_symbol2scm ("fontify"),
+ ly_quote_scm (met->description_), f, SCM_UNDEFINED);
+}
+
+LY_DEFINE(ly_fontify_atom,"ly:fontify-atom", 2, 0, 0,
+ (SCM met, SCM f),
+ "Add a font selection command for the font metric @var{met} to @var{f}.")
+{
+ SCM_ASSERT_TYPE(unsmob_metrics (met), met, SCM_ARG1, __FUNCTION__, "font metric");
+
+ return fontify_atom (unsmob_metrics (met), f);
+}
+LY_DEFINE(ly_align_to_x,"ly:align-to!", 3, 0, 0, (SCM mol, SCM axis, SCM dir),
+ "Align @var{mol} using its own extents.")
+{
+ SCM_ASSERT_TYPE(unsmob_molecule (mol), mol, SCM_ARG1, __FUNCTION__, "molecule");
+ SCM_ASSERT_TYPE(ly_axis_p (axis), axis, SCM_ARG2, __FUNCTION__, "axis");
+ SCM_ASSERT_TYPE(ly_dir_p (dir), dir, SCM_ARG3, __FUNCTION__, "dir");
+
+ unsmob_molecule (mol)->align_to ((Axis)gh_scm2int (axis), Direction (gh_scm2int (dir)));
+
+ return SCM_UNDEFINED;
+}
+
+
+
+/*
+ Hmm... maybe this is not such a good idea ; stuff can be empty,
+ while expr_ == '()
+ */
+bool
+Molecule::empty_b () const
+{
+ return expr_ == SCM_EOL;
+}
+
+SCM
+Molecule::get_expr () const
+{
+ return expr_;
+}
+
+
+
+Box
+Molecule::extent_box () const
+{
+ return dim_;
+}
+IMPLEMENT_SIMPLE_SMOBS (Molecule);
+
+
+int
+Molecule::print_smob (SCM , SCM port, scm_print_state *)