• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Mit sed in Latex Normausdruecke ersetzen

matnerda

Newbie
Hallo,
ich sitze gerade an meiner Diplomarbeit und habe folgendes Problem:
Ich wuerde gern in meinem etwa 1000 zeiligen tex Dokument die Normen mittels Konsole durch einen neudefinierten Befehl ersetzen. Ich hab heute schon ein bisschen rumprobiert, aber noch nicht das richtige gefunden. Ausserdem habe ich das Problem, dass die '\' in sed eine Bedeutung haben und ich nicht weiss wie ich nach ihnen suchen soll.
Genauer:
Ich moechte folgenden Ausdruck
$\|arg1\|_{L^2(raum)}$
durch einen solchen automatisch ersetzen:
$\lnormM{arg1}{raum}$

Koennt ihr mir helfen?
Danke schonmal im Voraus!
 

abgdf

Guru
Hi,

ich würde Dir für die Aufgabe Python empfehlen. Für ein einfaches Ersetzen brauchst Du da noch nicht einmal reguläre Ausdrücke. Würde Dir so ein Code was sagen:
Code:
#!/usr/bin/env python
# coding: iso-8859-1

a = """$\|arg1\|_{L^2(raum)}$"""
b = """$\lnormM{arg1}{raum}$"""

line = """asd vwweroqx qweja $\|arg1\|_{L^2(raum)}$ dac qq122"""

print line

line = line.replace(a, b)

print line
? Wie man das mit tex-Dateien macht (lesen und schreiben) könnte ich dann gegebenenfalls noch hinzufügen.

Gruß
 
OP
M

matnerda

Newbie
Hallo,
erstmal danke fuer deine Antwort. Ich denke aber, dass ich so meine Problem nicht loesen kann, weil an der Stelle des Arguments "arg1" und des Raumes "raum" im Text verteilt ja immer unterschiedliche Ausdruecke stehen, nur die Form bleibt gleich. Sonst koennte ich ja einfach Suchen und Ersetzen benutzen, aber ich braeuchte was, dass mir den Text nach der Form \|arg1\|_{L^2(raum)} durchsucht und automatisch die verschiedenen Argumente in eine andere Form bringt.
Gruesse!
 

abgdf

Guru
matnerda schrieb:
Ich denke aber, dass ich so meine Problem nicht loesen kann, weil an der Stelle des Arguments "arg1" und des Raumes "raum" im Text verteilt ja immer unterschiedliche Ausdruecke stehen, nur die Form bleibt gleich. Sonst koennte ich ja einfach Suchen und Ersetzen benutzen, aber ich braeuchte was, dass mir den Text nach der Form \|arg1\|_{L^2(raum)} durchsucht und automatisch die verschiedenen Argumente in eine andere Form bringt.
Sowas kann Python (oder Perl) natürlich auch, aber da wird's dann halt ein bißchen komplizierter.
Mit dem arg1 willst Du offenbar in einer Regex einen Teil des Ausdrucks extrahieren und diesen an einer anderen Stelle einfügen. Geht wie gesagt, schon.
Braüchte man aber genauere Angaben, und es könnte dann ein (etwas) größeres Skript werden.
Wahrscheinlich kann sed das auch irgendwie, aber der Befehl dürfte dann ziemlich unlesbar werden. Da würde ich mich dann aus dem Thema raushalten.

Gruß
 
OP
M

matnerda

Newbie
Hallo,
an abgdj: hum was fuer Angaben benoetigst du denn?
an spoensche: also die Normen in Latex haben immer dieselbe Form: \|arg1\|_{L^2(raum)}. Zwischen den beiden \| steht ein Argument, dass immer unterschiedlich sein kann -hier habe ich es arg1 genannt. Dieses Argument muesste rauskopiert werden und in der neuen Form zwischen den beiden geschweiften Klammern stehen: \lnormM{arg1}{raum}. Genau dasselbe mit der raum-Variable. Diese ist immer unterschiedlich und wird innerhalb des _{..(..)} in zwei runden Klammern eingefasst. Man erkennt die Variable also an der Abfolge der Zeichen _{..(raum und das Ende ist bevor )}. Das was an der Stelle des raum s steht muss in die zweite geschweifte Klammer (wie oben).
Gruß!
 
A

Anonymous

Gast
versuch mal das hier, aber nur an einem Beispiel bin ich mir nicht ganz so sicher ob es wirklich alles abdeckt. Oder ob es irgendwelchen Mist macht wenn dort noch mehr Sonderzeichen irgendwo auf der selben Zeile stehen.

Code:
sed 's/\$\\|\(.*\)\\|_{.*(\(.*\))}\$/\$lnormM{\1}{\2}\$/g'  DATEI

robi
 

abgdf

Guru
Hmm, bin nicht sicher, ob ich Dich bzgl. der "|" richtig verstehe.
Ein einfaches LaTeX-Dokument "hallo.tex" könnte doch so aussehen:
Code:
\documentclass{article}
\begin{document}
Hallo Welt
\end{document}
Das läßt sich dann kompilieren und ansehen mit:
Code:
latex hallo.tex
xdvi hallo.dvi
Da wären dann keine "|". Aber es gibt ja noch komplexere Befehle. Bitte poste doch etwas kompilierbaren LaTeX-Code, am besten mit Ist-Zustand und Soll-Zustand. Und bitte benutze die Code-Tags, das heißt schließe den Code zwischen [code\] und [/code\] ein (jeweils ohne den Backslash vor der letzten "]").
 
OP
M

matnerda

Newbie
Ah, danke robi, das ist das was ich gesucht habe! Ich puzzle noch ein wenig dran rum, mal schauen ob ich den Text korrekt veraendert kriege!
(Danke auch an alle anderen, die sich die Zeit genommen haben!)
 

abgdf

Guru
Das verstehe ich nicht. Wenn Du so einen kryptischen Ausdruck wie
Code:
sed 's/\$\\|\(.*\)\\|_{.*(\(.*\))}\$/\$lnormM{\1}{\2}\$/g'  DATEI
verstehen kannst, hättest Du ihn doch auch selbst finden können. Etwa über ein Tutorial wie

http://www.tty1.net/sed-tutorium/index.html

Außerdem würde ich trotzdem nicht eine kaum zu verstehende sed-Zeile über meine Diplomarbeit laufen lassen (am Besten noch von der Konsole (und nicht von einem Skript) aus, so daß Du später noch nichtmal nachvollziehen kannst, was genau Du dort eingegeben hattest). Kann lustig werden, wenn die RegEx irgendwas Unvorhergesehenes matcht (gerade ".*" kann problematisch sein, Stichwort "Gier"), Du das bei einem 1000-zeiligen Dokument nicht merkst und das so abgibst. Viel Spaß!
 
Oben