Archiv verlassen und diese Seite im Standarddesign anzeigen : hartes umbrechen von extrem langen Worten (Camelcase-SMS)
Liebe Leute,
ich setze momentan ein Buch, in das ich eine ganze Menge SMS einbinden möchte.
Ich habe mir Scripte geschrieben, die aus den SMS-Dateien kurze tex-Dateien generieren in denen die einzelnen Metainfos und der SMS-Text selbst als Parameter einem Befehl übergeben werden.
So eine sms.tex sieht dann so aus:
\sms{2010}{01}{26}{07}{17}{14}{an}{Alice}{DiesIstD erTextDerSMSPlatzsparendInCamelcaseOhnePunktUndKom ma}
Der Befehl \sms{} im Hauptdokument legt dann fest wie die einzelnen Daten formatiert werden sollen.
%\sms{#1 DAY}{#2 MONTH}{#3 YEAR}{#4 HOUR}{#5 MINUTE}{#6 SECOND}{#7 von/an}{#8 NUMBER/Name}{#9 MESSAGE}
\newcommand{\sms}[9]{
\textbf{SMS #7 #8} \textsc{(#4:#5:#6)}\\
\texttt{#9}\\\\
}
Die langen CamelcaseWorte gehen natürlich über den Rand hinaus und werden nicht umgebrochen. Natürlich könnte ich mein Script so verändern, dass Zeilenumbrüche eingefügt werden. Ich möchte aber die Formatierung von den Daten trennen und erst später in der Hauptdatei festlegen.
Mein Frage also:
Gibt es in LaTeX eine Möglichkeit unbekannte Worte automatisch hart nach einer vorgegebenen Anzahl von Zeichen oder sogar besser nach einer bestimmten Breite umzubrechen.
Etwa so:
/magie{Hallo Alice DiesIstDerTextDerSMSPlatzsparendInCamelcaseOhnePun ktUndKomma dein Bob}
Sollte so umgebrochen werden:
Hallo Alice DiesI
stDerTextDerSM
SPlatzsparendIn
Camelcase Ohne
PunktUndKomma
dein Bob
u_fischer
21-03-2011, 14:06
Das geht z.B. mit seqsplit. Es verschluckt allerdings Leerzeichen, die müsstest du als ~ oder \space o.ä. eingeben. Sollte die Datei utf8 kodiert sein und deine SMS irgendwelche Umlaute enthalten, musst du die Umlaute einklammern.
Das ist schon erst mal das Eichtige. super - danke Ulrike!
Ich habe schon alle Umlaute ß und Spanische Sonderzeichen ausgetauscht, dadurch sind eine menge SMS jetzt auch durchgekommen. Bei einigen kommt nun aber eine "weird" Fehlermeldung
(./SMS/2010-04-20_07.18.52.vmg.tex
! Missing number, treated as zero.
<to be read again>
\accent@spacefactor
l.1 ...SMSTEXTAUSSCHNITT}
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
! Missing number, treated as zero.
<to be read again>
}
Weiß jemand weiter?
OK es ging nicht nur um Umlaute, Sonderzeichen und Akzente sondern anscheinend auch, darum, dass als letztes Zeichen vor der letzten } meines \sms befehls kein Leerzeichen stehen durfte...
wer irgendwann mal hierdrauf stößt, kann den mit seqsplit zu formatierenden Text unter Linux mit folgenden shellscript bereinigen:
#!/bin/sh
sed -i 's/\([äöüÄÖÜ]\)/{"{\1}}/g' *.tex
sed -i 's/Ö/O/g' *.tex
sed -i 's/Ä/A/g' *.tex
sed -i 's/Ü/U/g' *.tex
sed -i 's/ö/o/g' *.tex
sed -i 's/ä/a/g' *.tex
sed -i 's/ü/u/g' *.tex
sed -i 's/[ ]*}/}/g' *.tex
sed -i 's/ /~/g' *.tex
sed -i 's/ß/{\\ss}/g' *.tex
sed -i 's/ñ/{\\~{n}}/g' *.tex
sed -i "s/é/{\\\'{e}}/g" *.tex
sed -i "s/è/{\\\`{e}}/g" *.tex
sed -i "s/í/{\\\'{i}}/g" *.tex
Es gibt natürlich noch andere Sonderzeichen die beachtet werden müssten
Achtung: das script wandelt in allen tex-Dateien ALLE Sonderzeichen um. Nicht nur die in seqsplit. Das lässt sich aber leicht ummodeln...
Sollte es wirklich vorkommen, dass jemand anderes Nokia-SMS-Dateien (.vmg) in LaTeX einbinden will, ist hier mein zusammengestückelter Workflow:
1. SMS vom Handy ziehen (Nokiasoftware)
möglichst in einen extra Ordner dann funktionieren die folgenden scripte alle mit "*.tex")
2. aus den .vmg die .tex erzeugen
das folgende script "vmg2tex.sh" verarbeitet eine als Parameter übergebene vmg
#!/bin/sh
FILE=$1;
MESSAGE=$(grep -v '^BEGIN:\|^Date:\|^VERSION:\|^X-IRMC-STATUS:\|^X-IRMC-BOX:\|^X-NOK-DT:\|^X-MESSAGE-TYPE:\|^BEGIN:\|^VERSION:\|^N:\|^TEL:\|^END:' $FILE);
NUMBER=$(grep 'TEL:[0-9|+]' $FILE | sed 's/:/ /g' | awk '{print $2;}');
YEAR=$(grep 'Date:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $2;}');
MONTH=$(grep 'Date:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $3;}');
DAY=$(grep 'Date:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $4;}');
HOUR=$(grep 'Date:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $5;}');
MINUTE=$(grep 'Date:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $6;}');
SECOND=$(grep 'Date:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $7;}');
FROMTO=$(grep 'X-MESSAGE-TYPE:' $FILE | sed 's/:/ /g' | sed 's/\./ /g' | awk '{print $2;}');
if [ "$FROMTO" = "DELIVER" ]; then FROMTO2="von"; fi
if [ "$FROMTO" = "SUBMIT" ]; then FROMTO2="an" ; fi;
echo "\sms{$DAY}{$MONTH}{$YEAR}{$HOUR}{$MINUTE}{$SECOND} {$FROMTO2}{$NUMBER}{$MESSAGE}";
das Script kann für alle sms gleichzeitig aufgerufen werden mit:
for i in $(ls -1 *.vmg); do sh vmg2tex.sh $i>$i.tex; done;
3. Die Rufnummern können durch den Namen ausgetauscht werden mit:
sed -i 's/[+0-9]*171234567/Alice/g' *.tex;
4. Die Sonderzeichen und Leerzeichen aller tex-Dateien werden für \seqsplit formatiert mit
sed -i 's/\([äöüÄÖÜ]\)/{"{\1}}/g' *.tex
sed -i 's/Ö/O/g' *.tex
sed -i 's/Ä/A/g' *.tex
sed -i 's/Ü/U/g' *.tex
sed -i 's/ö/o/g' *.tex
sed -i 's/ä/a/g' *.tex
sed -i 's/ü/u/g' *.tex
sed -i 's/[ ]*}/}/g' *.tex
sed -i 's/ /~/g' *.tex
sed -i 's/ß/{\\ss}/g' *.tex
sed -i 's/ñ/{\\~{n}}/g' *.tex
sed -i "s/é/{\\\'{e}}/g" *.tex
sed -i "s/è/{\\\`{e}}/g" *.tex
sed -i "s/í/{\\\'{i}}/g" *.tex
In der Haupt-tex-Datei können die SMS dann einfach eingebunden werden als Include
\input{2010-01-25_00.24.00.vmg.tex}
Der Befehl \sms[9], der in den SMS genutzt wird, muss in der Haupt-tex-Datei definiert werden:
%\sms{#1 DAY}{#2 MONTH}{#3 YEAR}{#4 HOUR}{#5 MINUTE}{#6 SECOND}{#7 von/an}{#8 NUMBER/Name}{#9 MESSAGE}
% Formatiert die einzelnen übergebenen SMS-Daten
\newcommand{\sms}[9]{
\textbf{SMS #7 #8} \textsc{(#4:#5:#6)}\\
\texttt{\seqsplit{#9}}\\\\
}
Wenn das wirklich jemandem genutzt hat, möge _/er/sie es hier posten. :)
sed-Tutorialliste auf: http://wiki.ubuntuusers.de/sed
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.