Autor Thema: Spacing zwischen Buchstaben in TextMarkup  (Gelesen 12283 mal)

kilgore

  • Member
Spacing zwischen Buchstaben in TextMarkup
« am: Dienstag, 12. Juni 2012, 13:08 »
Hallo Lilys!

Ich such eine Möglichkeit den Platz zwischen den Buchstaben in ein TextMarkup zu vermindern. baseline-skip wird für den Platz zwischen Zeilen benutzt...gibts da was ähnliches für den Platz zwischen den einzelnen Buchstaben, oder ist das eine Sache der Schriftart selber?

Vielen Dank!
kil

Arnold

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #1 am: Mittwoch, 13. Juni 2012, 08:08 »
Also,

eine »Sperren mit negativem Versatzwert zwischen den Buchstaben bzw. »Kerning mit festem Wert unabhängig von der Zeichenpaarung« habe ich nicht im Lilypond-Handbuch gefunden.
Zudem kommt diese Methode den Text zu komprimieren sehr schnell an die Grenzen der Lesbarkeit, die Buchstaben überlappen sich doch recht schnell.
Deshalb wird ein anisotrpisches Skalieren bevorzugt. Also \scale mit einem X-Faktor <= 1.0 und eine Y-Faktor = 1.0.
Bis zu \scale #'(0.6 1.0) sollte die Lesbarkeit nciht beeinträchtigt sein.

Arnold

kilgore

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #2 am: Mittwoch, 13. Juni 2012, 19:55 »
Hallo Arnold,

Danke für deine Hilfe! Das komprimierte Text finde ich ein gute Idee, für diesen Zweck nicht aber geeignet, aber es freut mich trotzdem diese Funktion kennenzulernen. Ich denke ich finde ein Weg zurecht mit dem Text.....

Gruß
kil

Arnold

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #3 am: Donnerstag, 14. Juni 2012, 08:38 »
... gewissermaßen alle Buchstaben als einzel-Markup, und ein \translate dazwischen?

Hab dazu leider keine scheme-Prozedur parat.

Arnold

harm6

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #4 am: Donnerstag, 14. Juni 2012, 09:13 »
Hallo kilgore,

Zitat von: Arnold
... gewissermaßen alle Buchstaben als einzel-Markup, und ein \translate dazwischen?

manchmal geht: alle Buchstaben als einzel-Markup und \override #'(word-space . -0.5)

\markup
     \override #'(word-space . -0.3) {
             \wordwrap {
                   "a" "b" "c"
             }
}

oder vielleicht (Bild im Anhang):

\version "2.14.2"

#(define (string->string-list strg)
   (define (helper-1 strg ls)
    "
    Converts a string into a list of strings,
    every string of the list has string-length 1
    e.g "1234" -> '("1" "2" "3" "4")
    "
      (if (= (string-length strg) 0)
        (begin
          (set! ls '(""))
          ls)
        (begin
          (set! ls (cons (substring strg 0 1) ls))
          (if (>= (string-length (string-drop strg 1)) 1)
            (helper-1 (string-drop strg 1) ls)
            (reverse ls)))))

  (if (string? strg)
    (helper-1 strg '())
    strg))
 
#(define (proc l1 l2)
    "
    l1 is supposed to be a list of strings.
    proc will return a new list l2, build of the
    elements of l1.
    Every string of l2 has string-length 1
    e.g '("12" "34") -> '("1" "2" "3" "4")
    "
  (if (null? l1)
     l2
     (begin
       (set! l2 (append l2 (string->string-list (car l1))))
       (proc (cdr l1) l2))))
 
#(define (stack-chars stencil stils kern)
   (set! stencil (ly:stencil-combine-at-edge stencil X RIGHT (car stils) kern))
   (if (null? (cdr stils))
     stencil
     (stack-chars stencil (cdr stils) kern)))
   
#(define-markup-command (char-space layout props nmbr args)(number? markup-list?)
  (let* ((new-args (list-join args " "))
         (args+ (reverse (cons " " (reverse new-args))))
         (argls (proc args+ '()))
         (stils (map (lambda (x)(interpret-markup layout props x)) argls))
         (new-stils (reverse (cdr (reverse stils)))))

    (stack-chars empty-stencil new-stils nmbr)))
       
\markup \wordwrap {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.2 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.2 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
}

\markup \wordwrap {
     \override #'(font-name . "Purisa") {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.35 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.35 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
        }
}

\markup \wordwrap {
     \override #'(font-name . "Comic Sans MS") {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.2 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.2 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
     }
}

Gruß,
  Harm
« Letzte Änderung: Donnerstag, 14. Juni 2012, 09:15 von harm6 »

kilgore

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #5 am: Donnerstag, 14. Juni 2012, 12:30 »
Hallo Harm,

Wow klasse! Das funktioniert richtig super, genau das was ich suchte.

Nur ein kleines Problem - Sonderbuchstaben sind nicht unterstützt ( ö é ä etc ). Folgende Fehlermeldung kommt dazu:

(process:3156): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

Programmierfehler: FT_Get_Glyph_Name() Fehler: invalid glyph index
Fortsetzung, die Daumen drücken
Programmierfehler: Glyph hat keinen Namen, aber Zeichensatz unterstützt Glyphnamen.
Glyph U+FFFFFFFF wird übersprungen, Datei /home/kilgore/.fonts/ufonts.com_lucida-sans-typewriter-regular-2.ttf
Fortsetzung, die Daumen drücken
Programmierfehler: invalid UTF-8 string
Fortsetzung, die Daumen drücken

Die Sonderzeichen funktionieren aber normalerweise schon...


Danke euch beide!

Gruß
kil

Arnold

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #6 am: Donnerstag, 14. Juni 2012, 13:44 »
Das Sonderzeichenproblem kommt wohl daher, daß scheme noch den UTF8-String als »Byte-Character-String« bearbeitet. Somit darf man die »Zeichenfolge«, die eigentlich ein einziges Unicode-Zeichen beschreibt, nicht auseinanderbröseln.

etwas genauer:
höchstwertiges Bit = 0 , dann ein einzelnes Byte
die ersten zwei höchstwertigen Bit = 11, dann alle Folgebytes hinzunehmen, bei denen die zwei höststwertigen Bit = 10 sind.

Siehe auch die Beispiele im Wikipedia: http://de.wikipedia.org/wiki/UTF8

Arnold


« Letzte Änderung: Donnerstag, 14. Juni 2012, 13:46 von Arnold »

kilgore

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #7 am: Donnerstag, 14. Juni 2012, 16:50 »
Hallo Arnold,

Danke für die Infos und Link! Ich verstehe die Sache nicht gut genug um es wirklich zu kapieren... Gibts eine Chance die Sonderzeichen auch einzubauen? Also muss ich in scheme irgendwie eingeben, dass es den String anders bearbeiten soll?

Gruß
kil

harm6

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #8 am: Donnerstag, 14. Juni 2012, 17:04 »
Zitat von: Arnold
Das Sonderzeichenproblem kommt wohl daher, daß scheme noch den UTF8-String als »Byte-Character-String« bearbeitet. Somit darf man die »Zeichenfolge«, die eigentlich ein einziges Unicode-Zeichen beschreibt, nicht auseinanderbröseln.
Mein string->string-list stammt ursprünglich aus einem file in dem diese Anwendung unproblematisch ist.

Zur Illustration des Problems:
Im guile-interpreter:
guile> (substring "ä" 0 1)
-> "�"

Um dem eigentlichen Problem bei zu kommen habe ich ein weiteres markup-command geschrieben, welches bei Sonderzeichen und Umlauten eingesetzt werden kann. Allerdings müssen die Buchstaben/Zeichen einzeln angegeben werden.

\version "2.14.2"

#(define (string->string-list strg)
   (define (helper-1 strg ls)
    "
    Converts a string into a list of strings,
    every string of the list has string-length 1
    e.g "1234" -> '("1" "2" "3" "4")
    "
      (if (= (string-length strg) 0)
        (begin
          (set! ls '(""))
          ls)
        (begin
          (set! ls (cons (substring strg 0 1) ls))
          (if (>= (string-length (string-drop strg 1)) 1)
            (helper-1 (string-drop strg 1) ls)
            (reverse ls)))))

  (if (string? strg)
    (helper-1 strg '())
    strg))
 
#(define (proc l1 l2)
    "
    l1 is supposed to be a list of strings.
    proc will return a new list l2, build of the
    elements of l1.
    Every string of l2 has string-length 1
    e.g '("12" "34") -> '("1" "2" "3" "4")
    "
  (if (null? l1)
     l2
     (begin
       (set! l2 (append l2 (string->string-list (car l1))))
       (proc (cdr l1) l2))))
       
#(define (stack-chars stencil stils kern)
   (set! stencil (ly:stencil-combine-at-edge stencil X RIGHT (car stils) kern))
   (if (null? (cdr stils))
     stencil
     (stack-chars stencil (cdr stils) kern)))

#(define-markup-command (char-space layout props nmbr args)(number? markup-list?)
  (let* ((args+ (reverse (cons " " (reverse args))))
         (new-args (list-join args+ " "))
         (argls (proc new-args '()))
         (stils (map (lambda (x)(interpret-markup layout props x)) argls))
         (new-stils (reverse (cdr (reverse stils)))))

    (stack-chars (car new-stils) (cdr new-stils) nmbr)))

#(define-markup-command (char-spaceII layout props nmbr args)(number? markup-list?)
  (let* ((args+ (reverse (cons " " (reverse args))))
         (stils (map (lambda (x)(interpret-markup layout props x)) args+))
         (new-stils (reverse (cdr (reverse stils))))
         )

    (stack-chars (car new-stils) (cdr new-stils) nmbr)))
   
\markup \column {
        \char-spaceII #-0.2 {
        "é""è""ê""ë""á""à""â""ä""í""ì""î""ï""ó""ò""ô""ö""ú""ù""û""ü""ç""œ""æ"
        }
        \char-spaceII #2 {
        "^°!§$%&/()=?{[]}`´**~#'-.,;:_<>"
        "^""°""!""§""$""%""&""/""("")""=""?""{""[""]""}""`""´""*""+"
        "~""#""'""-""."","";"":""_""<"">"
        }
}
       
\markup \wordwrap {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.2 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.2 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
}

\markup \wordwrap {
     \override #'(font-name . "Purisa") {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.35 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.35 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
        }
}

\markup \wordwrap {
     \override #'(font-name . "Comic Sans MS") {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige  }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.2 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.2 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
     }
}

Nicolas Sceaux hat es hier: http://lsr.dsi.unimi.it/LSR/Item?id=368 geschafft das Problem mit Umlauten und Akzenten anzugehen. Eine Übertragung auf das jetzige Problem ist mir allerdings nicht gelungen.


Gruß,
  Harm

kilgore

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #9 am: Donnerstag, 14. Juni 2012, 19:18 »
 :o
Immer wieder beeindruckt!

Klappt jetzt super! Es ist schon etwas umständlich für längere Anmerkungen, aber zum Glück haben nicht alle Worte der Deutschen Sprache Sonderzeichen  ;D

Mein Hoffnung für Lucida Sans Typewriter wächst :)

Gruß
kil

Arnold

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #10 am: Freitag, 15. Juni 2012, 09:35 »
Ich schau mal, ob ich übers Wochenende dazu komme, eine UTF8-Variante von string->string-list zu entwickeln.

Arnold

kilgore

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #11 am: Freitag, 15. Juni 2012, 11:20 »
Und ich versuche demnächst mit dem Buch "structures and interpretation of computer programs" anzufangen... dann kann ich endlich mal scheme besser verstehen und vielleicht sogar selber schreiben!  ;)

Arnold

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #12 am: Freitag, 15. Juni 2012, 12:35 »
Hallo kilgore,

sehr empfehlenswert ist auch das »Guile Reference Manual«. Für das aktuelle Lilypond die Version 1.8.
Ich habe eine »Edition 1.1, for use with Guile 1.8.8.5.g9718acd« als PDF gefunden, ich denke es war Teil irgendeiner Linux-Distribution. Unter http://www.gnu.org/software/guile/ fndet man sonst nur die Internet-HTML-Version.
Am meisten 'wühle' ich im Kaptiel »API-Reference« in den Unterkapiteln »Simple Generic Data Types« und »Compound Data Types« herum.

Arnold

kilgore

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #13 am: Freitag, 15. Juni 2012, 17:29 »
Hallo Arnold,

Danke für den Tipp! Ja leider finde ich nur die Version 1.8 als PDF zum kaufen... Ich brauche zunächst aber etwas für Anfänger, ich kenne mich sonst nur mit Lilypond Code aus. Da bin ich wirklich ein Neuling zu anderen Codes!

Ich habe schon mit "structures and interpretation of computer programs" angefangen, aber es hackt immer bei den Conditionals... ::)

harm6

  • Member
Re: Spacing zwischen Buchstaben in TextMarkup
« Antwort #14 am: Samstag, 16. Juni 2012, 19:01 »
Hallo kilgore,

Zum spacing-problem:

Ich habe mein string->string-list noch mal überarbeitet. Geht wahrscheinlich besser und eleganter, aber es scheint mit Umlauten und Sonderzeichen zu funktionieren. Falls nicht wirst Du Dich schon melden. ;)

\version "2.14.2"

#(define default-strg "éèêëáàâäíìîïóòôöúùûüçæ°§´œ")
   
#(define (string->string-list strg)
 
  (define (helper-1 strg ls)
    "
    Converts a string into a list of strings,
    every string of the list has string-length 1
    e.g "1234" -> '("1" "2" "3" "4")
    Works with special characters and german umlaute, too.
    "
      (if (= (string-length strg) 0)
        (begin
          (set! ls '(""))
          ls)
        (begin
         (let* ((substrings (if (and (>= (string-length strg) 1)(string-contains default-strg (string-take strg 1)))
            (substring strg 0 2)
            (substring strg 0 1)))
          (string-drop-number (if (and (>= (string-length strg) 1)
                       (string-contains default-strg (string-take strg 1)))
                         2
                         1)))
          (set! ls (cons substrings ls))
          (if (>= (string-length (string-drop strg string-drop-number)) 1)
            (helper-1 (string-drop strg string-drop-number) ls)
            (reverse ls))))))
  (helper-1 strg '()))
 
#(define (proc l1 l2)
    "
    l1 is supposed to be a list of strings.
    proc will return a new list l2, build of the
    elements of l1.
    Every string of l2 has string-length 1
    e.g '("12" "34") -> '("1" "2" "3" "4")
    "
  (if (null? l1)
     l2
     (begin
       (set! l2 (append l2 (string->string-list (car l1))))
       (proc (cdr l1) l2))))
       
#(define (stack-chars stencil stils kern)
  (set! stencil (ly:stencil-combine-at-edge stencil X RIGHT (car stils) kern))
   (if (null? (cdr stils))
     stencil
     (stack-chars stencil (cdr stils) kern)))

#(define-markup-command (char-space layout props nmbr args)(number? markup-list?)
  (let* ((new-args (list-join args " "))
         (argls (proc new-args '()))
         (stils (map (lambda (x)(interpret-markup layout props x)) argls)))
  (stack-chars (car stils) (cdr stils) nmbr)))
   
\markup \column {
        "Test"
        \char-space #2.2 {
        éèêëáàâäíìîïóòôöúùûüçæœ»
        }
        \char-space #1 { 
        "^°!$%&/()=?{[]}`*+~#'-.,;:_<>^§´œ|~¹²³"
        }
        \char-space #1 {
        le garçon
        }
        \char-space #2 {
        ma sœur
        }
        \vspace #2
}
       
\markup \wordwrap {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.2 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.2 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
}

\markup \wordwrap {
     \override #'(font-name . "Purisa") {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.35 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.35 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
        }
}

\markup \wordwrap {
     \override #'(font-name . "Comic Sans MS") {
        Dies ist ein langer Text bei dem
        \with-color #'(1 0.5 0) \bold \char-space #1 { einige  }
        Worte
        \with-color #'(1 0.5 0) \fontsize #3 \char-space #1 { sehr breit }
        geschrieben sind,
        \with-color #'(0 0.5 0) \char-space #-0.2 { andere } werden jedoch
        \with-color #'(0 0.5 0) \char-space #-0.2 { enger geschrieben. }
        Das ganze klappt auch mit Zahlen:
        \char-space #1 { 234 } -
        \char-space #-0.2 { 35 = 199 }.
     }
}

Zu scheme/guile:
Vokabular/Syntax/Grammatik ist recht schnell erlernbar.

Die Hauptprobleme die ich erlebt habe waren:
(1) Mit scheme ist natürlich ein äußerst hoher Grad an Abstraktion erreichbar. Man muß also sehr klar denken, um schreiben zu können was man halt gerade haben will.
Allerdings dürfte die Möglichkeit zur hohen Abstraktionsfähigkeit auf jede Computersprache zutreffen.
(2) In LilyPond ist sehr vieles natürlich bereits vordefiniert, aber, zumindest in diesem Bereich, schlecht oder gar nicht dokumentiert. Man muß also immer wieder in die Installationsdateien schauen und diese studieren, um zu verstehen was wie gemacht wird. Das ist schwierig und zeitaufwendig.

Hilfreich beim lernen war neben dem eigentlichen guile-manual (hat Arnold ja schon verlinkt) auch folgendes manual:
http://www.math.grin.edu/~stone/scheme-web/table-of-contents.html
Das geht ein bißchen in Richtung "scheme for dummies", hat mir aber sehr geholfen.

Zitat von: kilgore
Ich habe schon mit "structures and interpretation of computer programs" angefangen, aber es hackt immer bei den Conditionals...
Wenn Du fragen hast, so werde ich mich bemühen eine Antwort zu finden. ;)

HTH,
  Harm
« Letzte Änderung: Samstag, 16. Juni 2012, 19:04 von harm6 »