Anschließend konvertiere ich die .txt in eine .tex Datei (ich mag Texte aus verschiedenen Gründen nicht gleich als .tex-Datei schreiben). Dabei füge ich dann immer "\\" ein, wenn newline erhalten bleiben soll, usw.
Nun habe ich mich endlich dazu durchgerungen, das zu automatisieren, also ein Script zu schreiben, welches für mich - zumindest grob - die Formatierung übernimmt.
Aufgaben:
1. .txt Datei in eine gleichnamige .tex Datei kopieren (und letztere dabei erstellen).
2. Alle leeren Zeilen mit "\\" füllen.
3. Bei jeder Zeile, die mit Punkt oder Doppelpunkt endet, prüfen, ob das erste Wort der nächsten Zeile noch hingepasst hätte (bei einer Zeilenlänge von 79 Zeichen). Wenn ja, annehmen, dass dieser Zeilenumbruch gewollt ist und "\\" anfügen.
Das ist natürlich nicht perfekt, deckt aber häufige Fälle ab und erleichtert mir die Arbeit.
Also habe ich da mal was in Perl verfasst. Das füllt aber leider nur die leeren Zeilen mit "\\". Die anderen Fälle werden nicht abgedeckt, obwohl ich mir einbilde, das so programmiert zu haben. Mag vielleicht jemand so freundlich sein und mir sagen, wo der Fehler in diesem Script ist?
Code: Alles auswählen
#!/usr/bin/perl
use strict;
use warnings;
use File::Copy;
use Tie::File;
use utf8;
# input = filename. Append it to full path.
my $ofile = "$ENV{HOME}/Dokumente/@ARGV";
# exit if file is not a .txt file
if ($ofile !~ m/.txt$/) {
die $!;
}
# build the name for the new .tex file by changing the suffix
my $file = $ofile =~ s/.txt$/.tex/r;
# copy the .txt file to a .tex file
copy($ofile,$file) or die $!;
# read file into an array
tie my @lines, 'Tie::File', $file or die $!;
# loop over the array (= file) line by line
for (my $i=0; $i<=$#lines; $i++) {
# make programming easier
my $line = $lines[$i];
# if line is empty, insert "\\"
if ($line eq "") {
$lines[$i] =~ s/^$/\\\\/g;
next;
}
# if line do not end with "." or ":", we jump to next iteration
if ($line !~ m/\.$/ || $line !~ m/\:$/) {
next;
}
# get length of line
my $llen = length($line);
# if the line is 79 chars long, we jump to next iteration
if ($llen == 79) {
next;
}
# get next line
my $nline = $lines[$i+1];
# get first word of next line
my $nword = $nline =~ s/ .*//r;
# get length of this word
my $nwlen = length($nword);
# check if space after $line is longer than length of $nword
# if so, we insert "\\" after the last "." or ":" of $line
# because we assume that the linebreak is intended.
if (79-$llen > $nwlen) {
if ($line =~ m/\.$/) {
$lines[$i] =~ s/\.$/\.\\\\/;
} else {
$lines[$i] =~ s/\:$/\:\\\\/;
}
}
}