Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: Manuela am Samstag, 22. Dezember 2018, 10:04

Titel: Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: Manuela am Samstag, 22. Dezember 2018, 10:04
Hi,

es gibt eine Funktion (die in diesem Forum entwickelt wurde), die alle ly-Dateien in einem Verzeichnis inkludiert.

loadFilesr =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "ly" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 (ly:parser-include-string
                  (string-append
                   "\\include \"" dir-name "/" entry "\"")))
       files)))


Jetzt möchte ich alle Dateien in einem Verzeichnis (in diesem Fall eps-Dateien) in ein Markup einbauen, sodass pro Datei eine Seite ausgegeben wird.

\bookpart {
  \markup \column {
    {
      \fill-line {
        \null \epsfile #X #80 #"xxx.eps" \null
      }
    }
  }
}


Dort wo xxx.eps stehen, sollen die EPS-Dateien aus dem Verzeichnis eingesetzt werden, für jede EPS-Datei ein bookpart ausgegeben werden. Meine Bitte an die Scheme Spezialisten, eine passende Funktion zu schreiben. Für mich wäre das vermutlich stundenlanger Aufwand, bis ich dahinter komme.

Titel: Antw:Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: Manuela am Samstag, 22. Dezember 2018, 10:10
Ich habe mal einen ersten Entwurf gebastelt, der den Nachteil hat, keinerlei Ausgabe zu liefern, aber auch keine Fehlermeldung.
\version "2.19.80"

loadFilesr =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 #{
                   \bookpart {
                      \markup \column {
                       {
                         \vspace #-4
                         \fill-line {
                           \null
                           \epsfile #X #80 $entry \null
                         }
                       }
                     }
                   }
                 #}
                 )
       files)))

\loadFilesr "eps1"


Im Unterverzeichns eps1 stehen die eps-Dateien.
Titel: Antw:Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: Manuela am Samstag, 22. Dezember 2018, 10:23
Inzwischen habe die Funktion "verbessert", sodass jetzt eine Fehlermeldung ausgegeben wird
\version "2.19.80"

loadFilesr =
#(define-music-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 #{
                   \bookpart {
                     \paper {
                       evenHeaderMarkup = ##f
                       oddHeaderMarkup = ##f
                     }
                     \markup \column {
                       {
                         \vspace #-4
                         \fill-line {
                           \null \epsfile #X #80 #(string-append entry ".eps") \null
                         }
                       }
                     }
                   }
                 #}
                 )
       files)))

\loadFilesr "eps1"


Fehlermeldung:

»V:/Lilypond/titelinclude1.ly« wird verarbeitet
Analysieren...
V:/Lilypond/titelinclude1.ly:33:1: Fehler: music-Funktion kann nicht ##<unspecified>

ausgeben

\loadFilesr "eps1"
schwerer Fehler: gescheiterte Dateien: "V:/Lilypond/titelinclude1.ly"
Titel: Antw:Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: harm6 am Samstag, 22. Dezember 2018, 18:33
Hallo Manuela,

hier das Beste was ich Dir bieten kann:


\version "2.19.82"

#(define (proc dir-name)
   (let ((dir (opendir dir-name))
         (eps-files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! eps-files (append (list entry) eps-files))))
     (closedir dir)
     (map
        (lambda (arg) #{ \bookpart { \markup \epsfile #X #80 $arg } #})
        eps-files)))

$@(proc "/path/to/folder")


\bookpart is sowas von buggy ...

Ich kann nicht zählen wie oft ich heute schon diesen (oder einen sehr ähnlichen) error gesehen habe:
Zitat
lilypond: /home/gub/NewGub/gub/target/linux-64/src/lilypond-git.sv.gnu.org--lilypond.git-stable-2.20/lily/book.cc:258: void Book::process_score(SCM, Paper_book*, Output_def*): Assertion `0' failed.
Aborted (core dumped)

Aargh !!

Gruß,
  Harm
Titel: Antw:Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: Manuela am Samstag, 22. Dezember 2018, 19:59
Vielen Dank, Harm, genau so etwas habe ich gesucht. Ich habe inzwischen ein wenig weiter recheriert und habe herausgefunden, dass bookpart nicht ganz richtig funktioniert. Umso glücklicher bin ich mit deiner Funktion,
Titel: Antw:Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: Manuela am Montag, 16. November 2020, 15:48
Ich habe diese Funktion reaktiviert und eine Überraschung erlebt. Die letzte Datei im Verzeichnis wird nicht ausgegeben, und für manche Dateien wird eine Fehlermeldung ausgegeben
schwerer Fehler: Datei »xyz.eps« kann nicht gefunden werden
Titel: Antw:Alle Dateinamen in einem Verzeichnis in ein Markup einbauen
Beitrag von: harm6 am Montag, 30. November 2020, 13:05
Hallo Manuela,

es sollte funktionieren.

Kannst Du mal folgendes versuchen:


#(define (proc dir-name)
   (let ((dir (opendir dir-name))
         (eps-files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "eps" entry)
           (set! eps-files (append (list entry) eps-files))))
     (closedir dir)
     (format #t
       "~a contains ~a eps-files:\n~y"
       dir-name
       (length eps-files)
       (sort eps-files string-ci<))
     (map
        (lambda (arg) #{ \bookpart { \markup \epsfile #X #80 $arg } #})
        (sort eps-files string-ci<))))

$@(proc "/path/to/folder")


Es wird dann angezeigt wieviele .eps-files in welchem Ordner gefunden werden und welche.
Diese werden dann alle in bookparts gepackt und ausgegeben.
Neben dem initiierten terminal-output habe ich die eps-files vor der Ausgabe alphabetisch geordnet.

Funktioniert bei mir.

Gruß,
  Harm