PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : hartes umbrechen von extrem langen Worten (Camelcase-SMS)



Benks
20-03-2011, 19:44
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.

Benks
21-03-2011, 21:59
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?

Benks
22-03-2011, 00:14
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...

Benks
22-03-2011, 00:36
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