Johnny B.: Modul zum deutschen Text umbrechen gesucht

Hallo geehrtes Forum,

ich suche ein Modul, welches Text umbrechen kann. Text::Wrap ist schon recht gut, problematisch sind nur die langen Worte:

<text>
     auffrischen. Ausserdem, wer sagt denn, dass
     Sie eine Pause machen muessen?

Die Hebamme, die Aerzte, die
     Krankenschwestern, andere Patienten koennten
</text>

Viel schöner wäre:
<text>
     auffrischen. Ausserdem, wer sagt denn, dass
     Sie eine Pause machen muessen?

Die Hebamme, die Aerzte, die Kranken-
     schwestern, andere Patienten koennten Ihre
</text>

Hat jemand eine Idee, wie ich bewerkstelligen könnte, daß die langen Worte erkannt und mit einem Bindestrich korrekt umgebrochen werden? Scheint mir eine ziemlich komplexe Aufgabenstellung zu sein. Andererseits hat jeder, der Zeitungsartikel bearbeitet, dasselbe Problem. Hhhhmmmmm...

Lieben Gruß
JOhnnY

  1. Vielleicht löst sich dein Problem ja in Luft auf, wenn du weißt dass ein Zeitungsartikel fest gelayoutet ist, eine HTML-Seite aber nicht? Da bricht der Text je nach Schriftgröße und Fenstergröße wo ganz anders um.

  2. use TeX::Hyphen;  
    use TeX::Hyphen::Pattern;  
      
    my $pattern = TeX::Hyphen::Pattern->new;  
    $pattern->label('de_DE');  
      
    my $hyphenator = TeX::Hyphen->new($pattern->filename);  
    say $hyphenator->visualize($_) for split ' ', $phrase
    
    1. Hallo CPAN,

      [code lang=perl]use TeX::Hyphen;
      use TeX::Hyphen::Pattern;

      ich bin beeindruckt. Dein Nick ist nicht nur CPAN, Du kennst es auch wie Deine Westentasche.

      Prima, mit diesem Modul kann ich Worte mit Bindestrichen versehen. Um nun zu meiner ursprünglichen Aufgabenstellung zu kommen, würde ich folgendes tun:

      • Text laden
      • alle im Text enthaltenen Bindestriche durch ~ (was sonst nirgendwo vorkommt) ersetzen
      • alle Worte durch TeX::Hyphen mit Bindestrichen versehen
      • Text::Wrap drüberlaufen lassen, umbrechen bei ' -~'
      • alle Bindestriche, die nicht am Ende einer Zeile sind, löschen
      • die ~ wieder in Bindestriche zurückwandeln
      • Text ausgeben (für Encoder: es ist keine HTML-Seite)

      Soweit ein schlauer Plan?

      Lieben Gruß
      JOhnnY

      1. Hallo nochmal,

        • Text::Wrap drüberlaufen lassen, umbrechen bei ' -~'

        das ist unpraktisch, denn so wird der Bindestrich beim Umbrechen gelöscht. Ich möchte umbrechen lassen bei einem Leerzeichen, wobei das Leerzeichen gelöscht werden soll, oder _nach_ einem Bindestrich, der jedoch erhalten bleiben soll. Hhhmmm...

        In der Beschreibung von Text::Wrap findet sich diese Anleitung:
        "It is possible to control which characters terminate words by modifying $Text::Wrap::break. Set this to a string such as '[\s:]' (to break before spaces or colons) or a pre-compiled regexp such as qr/[\s']/ (to break before spaces or apostrophes)."

        Wenn ich $Text::Wrap::break = "qr/[\s']/"; setze, dann bricht Text::Wrap ohne Zeichen zu löschen bei jedem Zeichen um. Es passiert also _nicht_ was nach der Beschreibung passieren sollte. Da ich einen Fehler in der Beschreibung für unwahrscheinlich halte, verstehe ich wohl nicht genau, was ein 'pre-compiled regexp' sein soll. Kann mir jemand auf die Sprünge helfen?

        Lieben Gruß
        JOhnnY

      2. Methode hyphenate liefert die Trennstellen.

        1. Hallo CPAN,

          Methode hyphenate liefert die Trennstellen.

          das habe ich verstanden. Nur harmoniert das nicht mit Text::Wrap zusammen, oder? Ich könnte jetzt natürlich meine eigene Umbrech-Routine schreiben, die dann die Trennstellen auswertet und dort passend umbricht. Aber schöner wäre, ich könnte das bereits fertige Modul (entweder Text::Wrap oder ein anderes) dafür nutzen. Und da weiß ich trotz der gelieferten Liste der Trennstellen nicht, wie ich damit weiterarbeiten kann.

          Lieben Gruß
          JOhnnY

          1. Ich könnte jetzt natürlich meine eigene Umbrech-Routine schreiben, die dann die Trennstellen auswertet und dort passend umbricht.

            hab ich getan. Funktioniert auch. Das Dumme ist jetzt nur, daß das Endergebnis trotzdem nicht wirklich schick aussieht, da die Buchstaben nur im <pre>-Modus gleiche Zeichenbreiten haben.

            Die Berechnung, wieviel Platz ein Zeichen eines bestimmten Zeichensatzes benötigt, um dann die Zeile nicht nach 75 Zeichen, sondern nach 750 Punkten umzubrechen, ist aber wohl viel zu komplex - oder gibt es da eventuell auch ein entsprechendes Modul?

            Lieben Gruß
            JOhnnY

            1. Die Berechnung, wieviel Platz ein Zeichen eines bestimmten Zeichensatzes benötigt, um dann die Zeile nicht nach 75 Zeichen, sondern nach 750 Punkten umzubrechen, ist aber wohl viel zu komplex - oder gibt es da eventuell auch ein entsprechendes Modul?

              Da du uns ja nicht gesagt hast, wie und wo die Ausgabe erfolgt, ist keine Antwort darauf möglich. Du kannst aber mal justify und deinem Ausgabemedium googlen.

              Struppi.

            2. Ich könnte jetzt natürlich meine eigene Umbrech-Routine schreiben, die dann die Trennstellen auswertet und dort passend umbricht.
              hab ich getan. Funktioniert auch. Das Dumme ist jetzt nur, daß das Endergebnis trotzdem nicht wirklich schick aussieht, da die Buchstaben nur im <pre>-Modus gleiche Zeichenbreiten haben.

              Um meine Antwort deutlich zu machen, hier sprichst du vom <pre> Modus. pre ist ein HTML Tag, im Thread hast du aber gesagt es ging nicht um eine HTML Seite.

              Die Berechnung, wieviel Platz ein Zeichen eines bestimmten Zeichensatzes benötigt, um dann die Zeile nicht nach 75 Zeichen, sondern nach 750 Punkten umzubrechen, ist aber wohl viel zu komplex - oder gibt es da eventuell auch ein entsprechendes Modul?

              In einer HTML Seite kannst du justify:center verwenden, wobei dann aber sinnvollerweise eine Silbentrennung mit &shy; erfolgen sollte.

              Ob es für Plain/text, PDF, Bilder, Word/OpenOffice, ${deinAusgabeFormat}  ein Modul für den Blocksatz gibt, weiß ich aber nicht.

              Struppi.