HTML-zu-LaTeX: diverse Sonderfälle bzgl. Zeilenumbrüchen behandeln
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 9 Feb 2016 10:29:16 +0000 (11:29 +0100)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 9 Feb 2016 10:29:16 +0000 (11:29 +0100)
Zeilenumbrüche an verschiedenen Stellen sorgten dafür, dass LaTeX die
Fehlmerldung »There's no line to end here« ausspuckte. Die folgenden
Sonderfälle werden nun abgefangen und in \vspace*-Anweisungen
umgewandelt:

✓ Zeilenumbrüche direkt am Anfang des Texts
✓ Zeilenumbrüche direkt am Anfang eines Absatzes
✓ Zeilenumbrüche nach Umgebungen wie Strich- und Aufzählugnslisten

Zusätzlich werden Zeilenumbrüche am Ende des Texts schlicht entfernt.

SL/Template/LaTeX.pm

index 352f793..8a579ef 100644 (file)
@@ -66,6 +66,13 @@ my %html_replace = (
   '<br>'      => "\\newline ",
 );
 
+sub _lb_to_space {
+  my ($to_replace) = @_;
+
+  my $vspace = '\vspace*{0.5cm}';
+  return $vspace x (length($to_replace) / length($html_replace{'<br>'}));
+}
+
 sub _format_html {
   my ($self, $content, %params) = @_;
 
@@ -86,7 +93,11 @@ sub _format_html {
   } split(m{(<.*?>)}x, $content);
 
   $content =  join '', @parts;
-  $content =~ s{ (?: [\n\s] | \\newline )+$ }{}gx;
+  $content =~ s{ (?: [\n\s] | \\newline )+ $ }{}gx;                                         # remove line breaks at the end of the text
+  $content =~ s{ ^ \s+ }{}gx;                                                               # remove white space at the start of the text
+  $content =~ s{ ^ ( \\newline \  )+ }{ _lb_to_space($1) }gxe;                              # convert line breaks at the start of the text to vertical space
+  $content =~ s{ ( \n\n+ ) ( \\newline \  )+ }{ $1 . _lb_to_space($2) }gxe;                 # convert line breaks at the start of a paragraph to vertical space
+  $content =~ s{ ( \\end\{ [^\}]+ \} \h* ) ( \\newline \  )+ }{ $1 . _lb_to_space($2) }gxe; # convert line breaks after LaTeX environments like lists to vertical space
 
   return $content;
 }