Category Archives: Druckvorlagen

Seitenumbruch in Druckvorlagen

Wir benutzen für die Positionstabellen in den Belegen generell die longtable Umgebung. Gerade wenn der Langtext länger wird kommt es immer wieder vor, daß auf dem ausgedruckten Beleg große leere Bereiche entstehen, v.A. auf der ersten Seite, so daß die Positionstabelle erst auf der zweiten Seite beginnt. Das sieht fast immer schlecht aus und erzeugt Unmut beim ästhetischen Belegersteller.

Dies liegt daran, daß LaTeX bei longtable nicht innerhalb einer Tabellenzeile umbrechen kann, und erst auf der zweiten Seite die Chance hat, die Position komplett unterzubringen. Wenn man nur eine Position hat kann man auch nicht durch manuelles Umsortieren der Positionen Abhilfe schaffen.

Bis zur Version 3.1 konnte man dies mit einem Trick umgehen, und zwar indem man \newline umdefinierte. Die Zeilenumbrüche aus der Langbeschreibung wurden in LaTeX nach \newline umgewandelt, und hierfür konnte man statt eines einfachen Zeilenumbruchs eine ganz neue Tabellenzeile generieren. Wenn sich z.B. die Langtextbeschreibung in der 3. Tabellenspalte befindet wie folgt:

\renewcommand{\newline}{ \\ & & }
\begin{longtable}{clp{10.2cm}crr}
...
\end{longtable}
\renewcommand{\newline}{\\ }

Dadurch kann LaTeX innerhalb des Langtextes nach Belieben die Seite umbrechen, da jede Langtextzeile einer Tabellenzeile entspricht. Das ist nicht wirklich elegant, funktioniert aber, solange in keine der anderen Spalten ein \newline vorkommt.

Mit dem neuen Langtexteditor wird der Langtext allerdings als HTML gespeichert, und statt einfacher Zeilenumbrüche wird nun alles in < pa r> Tags gesetzt.

In SL/Tempates/LaTeX.pm wird zudem das < /par > durch \n\n ersetzt, es gibt also kein \newline mehr und der Seitenumbruch funktioniert nicht mehr.

Um das alte Verhalten wiederherzustellen muß man dort das \n\n also durch ein \newline ersetzen.

Fehlermeldungen in LaTeX

Da ich auf der FrOSCon nicht dazu gekommen bin, mir einen der Vorträge anzuschauen, habe ich heute mal in eine der Aufzeichnungen hineingeschaut, Programmierung mit LaTeX

Fast nebenbei wird dort der \typeout Befehl erwähnt, mit dem man während des Kompilierens Ausgaben für den Benutzer erzeugen kann, und sich das damit auch zum Debuggen eignet.

Ein typischer Fehlerfall von kivitendo sind Sonderzeichen z.B. im Langtext von Artikeln, die durch Copy&Paste aus anderen Quellen, z.B. PDFs, eingefügt werden, und von LaTeX nicht verarbeitet werden können. Der Benutzer bekommt dann den Inhalt der .err-Datei angezeigt, kann damit in der Regel aber nicht viel anfangen, weil das betreffende Zeichen meist entstellt angezeigt wird und meist der Kontext fehlt.

Beispiel: ich füge die Zeichen 香港 in den Langtext von Position 2 ein, und erhalte:

! Package inputenc Error: Unicode char \u8:香 not set up for use with LaTeX.
l.188 & & \newline 香
港 \\

Der Benutzer hat keine Ahnung, um welches Zeichen es sich handelt und wo im Dokument es sich befindet, kann entweder durch raten oder gezieltes Löschen die Fehlerursache suchen, oder muß seinen Admin/Dienstleister anrufen.

Mit dem \typeout Befehl kann man aber z.B. in der Artikelschleife bei jeder Position kurz ausgeben, welche Artikelposition gerade ausgegeben wird, so daß man im Falle des Abbruchs zumindest schon mal sehen kann, bei welchem Artikel das Sonderzeichen ist.

<%foreach number%>
\typeout{Position <%runningnumber%> (Artikelnr <%number%>)}

In der .err-Datei, und damit an der Browserobefläche, taucht das dann folgendermaßen auf:

Position 1 (Artikelnr 1)
Position 2 (Artikelnr 1)

! Package inputenc Error: Unicode char \u8:香 not set up for use with LaTeX.

Jetzt weiß man zumindest schon mal, daß das kaputte Zeichen bei Position 2 liegt.

Das Gleiche könnte man auch für andere Eingabefelder, wie z.B. Transportmittel, machen.

Bei der Gelegenheit habe ich mich dann auch gewundert, warum mein 香港 eigentlich im Browser nicht richtig angezeigt wird, auf der Kommandozeile wurde das in der .err-Datei nämlich schön angezeigt. In der entsprechenden Codestelle (SL/Form.pm, sub cleanup) wurde die .err Datei nicht mit UTF-8 Encoding eingelesen, baut man das ein

} elsif (-f "$self->{tmpfile}.err") {
open(FH, "<:encoding(UTF-8)", "$self->{tmpfile}.err");

wird dann auch an der Oberfläche mein fehlerhaftes Zeichen korrekt angezeigt:

Position 1 (Artikelnr 1)
Position 2 (Artikelnr 1)

! Package inputenc Error: Unicode char \u8:香 not set up for use with LaTeX.

Für Unicode Zeichen hilft das dann zumindest schon mal.