#endif
String print_dimen (Real);
+const Real point_constant = 1 PT;
#endif /* DIMENSIONS_HH */
class Bezier;
class Bezier_bow;
class Book;
+class Box;
class Break_algorithm;
class Change_iterator;
class Change_translator;
void set_default_output (String s);
String find_file (String);
void call_constructors ();
-
Array<String> get_inclusion_names ();
void set_inclusion_names (Array<String>);
--- /dev/null
+/*
+ text-metrics.hh -- declare text metric lookup functions
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+*/
+
+#ifndef TEXT_METRICS_HH
+#define TEXT_METRICS_HH
+
+#include "lily-guile.hh"
+#include "box.hh"
+
+void try_load_text_metrics (String);
+SCM ly_load_text_dimensions (SCM);
+Box lookup_tex_text_dimension (Font_metric *font,
+ SCM text);
+
+#endif /* TEXT_METRICS_HH */
+
*/
#include "lily-parser.hh"
-
+#include "text-metrics.hh"
#include "book.hh"
#include "lilypond-key.hh"
#include "file-name.hh"
void
Lily_parser::parse_file (String init, String name, String out_name)
{
+ if (output_format_global == "tex")
+ {
+ try_load_text_metrics (out_name);
+ }
+
lexer_ = new Lily_lexer (sources_);
scm_gc_unprotect_object (lexer_->self_scm ());
// TODO: use $parser
(c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
+#include <cctype>
#include "modified-font-metric.hh"
#include "pango-font.hh"
-
-#include <cctype>
-
+#include "text-metrics.hh"
#include "warn.hh"
#include "stencil.hh"
b.scale (magnification_);
return b;
}
-
-
if (input_encoding_ == "TeX")
b = tex_kludge (text);
if (idx >= 0)
char_box = orig_->get_indexed_char (idx);
- char_box.scale (magnification_);
if (!char_box[X_AXIS].is_empty ())
/* length ? */
w += char_box[X_AXIS][RIGHT];
ydims = Interval (0, 0);
b = Box (Interval (0, w), ydims);
+ b.scale (magnification_);
}
return b;
#include "dimensions.hh"
#include "modified-font-metric.hh"
-const Real point_constant = 1 PT;
-
FT_Byte *
load_table (char const *tag_str, FT_Face face, FT_ULong *length)
{
--- /dev/null
+/*
+ text-metrics.cc -- implement text metric lookup functions
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
+
+#include "dimensions.hh"
+#include "font-metric.hh"
+#include "main.hh"
+
+static SCM text_dimension_hash_tab;
+
+
+Box
+lookup_tex_text_dimension (Font_metric *font,
+ SCM text)
+{
+ Box b;
+
+ SCM limit = ly_lily_module_constant ("TEX_STRING_HASHLIMIT");
+ String key_str = ly_scm2string (font->font_file_name());
+ int hash_code = scm_to_int (scm_hash (text, limit));
+ key_str = to_string (hash_code) + key_str;
+
+ SCM val = SCM_BOOL_F;
+ if (text_dimension_hash_tab)
+ {
+ scm_hash_ref (text_dimension_hash_tab,
+ scm_makfrom0str (key_str.to_str0 ()),
+ SCM_BOOL_F);
+ }
+ if (scm_is_pair (val))
+ {
+ b[X_AXIS][LEFT] = 0.0;
+ b[X_AXIS][RIGHT] = scm_to_double (scm_car (val)) * point_constant;
+ val = scm_cdr (val);
+ b[Y_AXIS][UP] = scm_to_double (scm_car (val)) * point_constant;
+ val = scm_cdr (val);
+ b[Y_AXIS][DOWN] = scm_to_double (scm_car (val)) * point_constant;
+ }
+
+ return b;
+}
+
+
+
+LY_DEFINE(ly_load_text_dimensions, "ly:load-text-dimensions",
+ 1, 0, 0,
+ (SCM dimension_alist),
+ "Load dimensions from TeX in a (KEY . (W H D)) format alist")
+{
+ if (!text_dimension_hash_tab)
+ {
+ text_dimension_hash_tab =
+ scm_gc_protect_object (scm_make_hash_table (scm_from_int (113)));
+ }
+
+ for (SCM s = dimension_alist;
+ scm_is_pair (s);
+ s = scm_cdr (s))
+ {
+ SCM key = scm_caar (s);
+ SCM val = scm_cdar (s);
+
+ if (scm_hash_ref (text_dimension_hash_tab, key, SCM_BOOL_F)
+ == SCM_BOOL_F)
+ {
+ scm_hash_set_x (text_dimension_hash_tab, key, val);
+ }
+ }
+
+ return SCM_UNSPECIFIED;
+}
+
+void
+try_load_text_metrics (String basename)
+{
+ String path = global_path.find_file (basename + ".textmetrics");
+ if (path != "")
+ {
+ String contents (gulp_file_to_string (path));
+ contents = "(quote (" + contents + "))";
+
+ SCM lst = scm_c_eval_string (contents.to_str0 ());
+ ly_load_text_dimensions (lst);
+ }
+}
#include "warn.hh"
#include "dimensions.hh"
-static SCM tex_dimension_hash_tab;
static Tex_font_char_metric dummy_static_char_metric;
-
-Box
-lookup_tex_text_dimension (Font_metric *font,
- SCM text)
-{
- Box b;
-
- SCM limit = ly_lily_module_constant ("TEX_STRING_HASHLIMIT");
- String key_str = ly_scm2string (font->font_file_name());
- int hash_code = scm_to_int (scm_hash (text, limit));
- key_str = to_string (hash_code) + key_str;
-
- SCM val = scm_hash_ref (tex_dimension_hash_tab,
- scm_makfrom0str (key_str.to_str0 ()),
- SCM_BOOL_F);
-
- if (scm_is_pair (val))
- {
- b[X_AXIS][LEFT] = 0.0 PT;
- b[X_AXIS][RIGHT] = scm_to_double (scm_car (val)) PT;
- val = scm_cdr (val);
- b[Y_AXIS][UP] = scm_to_double (scm_car (val)) PT;
- val = scm_cdr (val);
- b[Y_AXIS][DOWN] = scm_to_double (scm_car (val)) PT;
- }
-
- return b;
-}
-
Tex_font_char_metric::Tex_font_char_metric ()
{
Real point_constant = 1 PT;
- return Box (Interval (0, width_*point_constant ),
- Interval ((d <? height_)*point_constant,
- (d >? height_)*point_constant));
+ return Box (Interval (0, width_* point_constant ),
+ Interval ((d <? height_) * point_constant,
+ (d >? height_) * point_constant));
}
Tex_font_metric::Tex_font_metric ()
else
return -1;
}
-
-
-LY_DEFINE(ly_load_text_dimensions, "ly:load-text-dimensions",
- 1, 0, 0,
- (SCM dimension_alist),
- "Load dimensions from TeX in a (KEY . (W H D)) format alist")
-{
- if (!tex_dimension_hash_tab)
- {
- tex_dimension_hash_tab =
- scm_gc_protect_object (scm_make_hash_table (scm_from_int (113)));
- }
-
- for (SCM s = dimension_alist;
- scm_is_pair (s);
- s = scm_cdr (s))
- {
- SCM key = scm_caar (s);
- SCM val = scm_cdar (s);
-
- if (scm_hash_ref (tex_dimension_hash_tab, key, SCM_BOOL_F)
- == SCM_BOOL_F)
- {
- scm_hash_set_x (tex_dimension_hash_tab, key, val);
- }
- }
-
- return SCM_UNSPECIFIED;
-}
(srfi srfi-13)
(lily))
-
(define (header filename)
(format "% header
\\input{lilypond-tex-metrics}
\\documentclass{article}
\\lilyglobalscale{1.0}
-\\lilymetricsfile{~a.lpm}
+\\lilymetricsfile{~a.textmetrics}
\\begin{document}
" filename))
pages)
(ly:outputter-dump-string outputter (footer))))
-
-
(define-public (convert-to-ps . args) #t)
(define-public (convert-to-pdf . args) #t)
(define-public (convert-to-png . args) #t)
(guile)
(ice-9 regex)
(srfi srfi-13)
+ (lily output-tex)
(lily))
(define (dummy . foo) #f)
(hash str TEX_STRING_HASHLIMIT)
(ly:font-file-name font)
(ly:font-file-name font)
- str) port)
+ (sanitize-tex-string str))
+ port)
)))