Schrift
[thread]7085[/thread]

Perl-Script für LaTeX-Indexerstellung: Suche ein Script

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2005-06-28 20:59
#55803 #55803
Guten Tag!

Habe von Perl keine Ahnung, aber da ich mit awk und sed nicht weiterkomme, wende ich mich mal an euch.
Arbeite viel mit LaTeX und schreibe teilweise auch größere Dokumente, die ein umfangreiches Stichwortverzeichnis enthalten.
Die Erstellung eines solchen ist immer ne blöde Arbeit, die meist aus dem Durchsuchen der einzelnen tex-Files besteht.
Ich würde diesen Vorgang gerne automatisieren und stelle mir folgendes vor:
Ich schreibe eine simple Textdatei, in der jeweils das Wort steht, welches ins Stichwortverzeichnis soll und dahinter der Eintrag, wie es dort erscheinen soll. Diese Datei lasse ich von einem Script einlesen und die tex-Files dahingehend untersuchen.

Beispiel für die Textdatei:

Positron - Positron
Positronen - Positron
Einstein - Einstein, Albert

etc.

Ist es sehr schwierig, ein solches Script zu schreiben?
Mich wundert es immer, daß außer mir anscheinend noch niemand diese Idee hatte...

Also, wenn jemand eine Idee hat - würde mich über jeden Tipp freuen!

Gruß...
renee
 2005-06-28 21:37
#55804 #55804
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dafür muss man doch kein LaTeX können, oder?? Das Wort steht ja so in der tex-Datei drin...

Du musst nur die Datei öffnen, den Inhalt nach den Worten durchsuchen (mit Regulären Ausdrücken) und dann was auch immer anstellen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
lichtkind
 2005-06-28 21:42
#55805 #55805
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
was du schreibst ist recht ungenau denn wie du das problem schilderst sind es bis jetzt sind es 2,3 zeilen perl die man schnell schreiben kann wenn man genau wüsste was du willst, habe aber auch ka von latex syntax
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
TeX-Er
 2005-06-28 22:58
#55806 #55806
User since
2005-06-28
4 Artikel
BenutzerIn
[default_avatar]
Also:

Um einen Index zu erstellen, muß man die tex-Dateien durchsuchen und jedes Wort, das man in den Index haben will, mit einem Befehl versehen. So kann man also z.B. mit suchen-ersetzen aus jedem "Positron" ein "\index{positron}" machen.
Das ist ja soweit nicht schwierig.
Nur: Wenn ich 200 Wörter im Index haben will, muß ich 200x suchen-ersetzen machen, bzw. wenn mein Dokument aus sagen wir 4 tex-Dateien zusammengesetzt ist, 800x, oder sogar noch mehr, weil ich ja auch die Plural-Varianten ersetzen muß, also "Positronen" - "\index{Positron}" (schließlich sollen Einzahl und Mehrzahl nur EINEN Eintrag bilden und nicht zwei!).
Das bedeutet: Über 1000x suchen-ersetzen im Editor. Das nimmt ne Menge Zeit in Anspruch.

Deshalb wäre es meines Erachtens sinnvoller, eine Textdatei anzulegen, in die man nach und nach alle Wörter eintragen kann, die in das Stichwortverzeichnis sollen.

Und dann benötigt man halt noch das Script, welches diese Textdatei einliest und die tex-Files selbstständig durchsucht und die Ersetzungen vornimmt.

Ist es so verständlicher?
Thorium
 2005-06-29 02:35
#55807 #55807
User since
2003-08-04
232 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl
use strict;
use warnings;

my $indexfile = shift;
my @texfiles = @ARGV;

# index_datei einlesen
open INPUT, $indexfile or die $!;
my @to_parse = <INPUT>;
close INPUT;

my %index;

foreach my $eintrag (@to_parse) {
    # Format: <gesuchteswort> <indexname> <beschreibung>
    $eintrag =~ m~^(\S+)\s+(\S+)\s+(.+)$~;
    $index{$ 1} = $ 2
    # Oben sollte natürlich $ 1 und $ 2 zusammengeschrieben werden
}

foreach my $texfile (@texfiles) {
    open TEXFILE, $texfile or die $!;
    my @inhalt = <TEXFILE>;
    close TEXFILE;

    open OUTFILE, "$texfile.out" or die $!;
    foreach my $zeile (@inhalt) {
            $zeile =~ s~($_)~\\index{$index{$_}}~i foreach keys %index;
            print OUTFILE $zeile;
    }
    close OUTFILE;
}


nicht getestet und in diesem winzigen forum-input-feld geschrieben :)

EDIT: Forumseditor Parsefehler behoben
Um die umbenennenfunktion erweitert\n\n

<!--EDIT|Thorium|1119998340-->
Per|li|nist der; -en, -en <zu ↑...ist>: a) Anhänger, Vertreter der radikalen Perlinisten die Perl als die einzig wahre Sprache ansehen; b) Mitglied einer perlinistischen Community.
Crian
 2005-06-29 13:30
#55808 #55808
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Du willst die Worte aber sicher nicht durch den Indexeintrag ersetzen, sondern diesen dahinter (oder davor) einsetzen, oder?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
TeX-Er
 2005-06-30 03:36
#55809 #55809
User since
2005-06-28
4 Artikel
BenutzerIn
[default_avatar]
[quote=Thorium,29.06.2005, 00:35]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/usr/bin/perl
use strict;
use warnings;

my $indexfile = shift;
my @texfiles = @ARGV;

# index_datei einlesen
open INPUT, $indexfile or die $!;
my @to_parse = <INPUT>;
close INPUT;

my %index;

foreach my $eintrag (@to_parse) {
    # Format: <gesuchteswort> <indexname> <beschreibung>
    $eintrag =~ m~^(\S+)\s+(\S+)\s+(.+)$~;
    $index{$ 1} = $ 2
    # Oben sollte natürlich $ 1 und $ 2 zusammengeschrieben werden
}

foreach my $texfile (@texfiles) {
    open TEXFILE, $texfile or die $!;
    my @inhalt = <TEXFILE>;
    close TEXFILE;

    open OUTFILE, "$texfile.out" or die $!;
    foreach my $zeile (@inhalt) {
            $zeile =~ s~($_)~\\index{$index{$_}}~i foreach keys %index;
            print OUTFILE $zeile;
    }
    close OUTFILE;
}


nicht getestet und in diesem winzigen forum-input-feld geschrieben :)

EDIT: Forumseditor Parsefehler behoben
Um die umbenennenfunktion erweitert[/quote]
Zunächst mal ein großes DANKE für das hier gepostete Script, ich werde es ausprobieren.

Und zu der Frage, ob ich Wörter ersetzen oder hinzufügen möchte:
hinzufügen wäre schon einfacher, ja....
Crian
 2005-07-01 13:35
#55810 #55810
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Wenn Du die Worte ersetzt, werden sie im Fließtext nicht mehr vorkommen.
\index{Positron} ist kein Markup, sondern ein zusätzlicher Eintrag, dass in den Index unter dem angegebenen Wort an diese Stelle verwiesen werden soll.

Am besten schaust Du nochmal in die TeX-Bücher ;)

@Thorium: Statt

Code: (dl )
1
2
$eintrag =~ m~^(\S+)\s+(\S+)\s+(.+)$~;
$index{$ 1} = $ 2


tuts auch ein simples

Code: (dl )
1
2
my ($key, $value) = split(/\s+/, $eintrag, 2);
$index{$key} = $value
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
TeX-Er
 2005-07-04 01:47
#55811 #55811
User since
2005-06-28
4 Artikel
BenutzerIn
[default_avatar]
Bitte?
ICH soll nochmal in ein TeX-Handbuch schauen? Warum das? LaTeX beherrsche ich seit 5 Jahren, ich bin doch nur hier, weil ich kein Perl kann...
Und wie meine index-Makros definiert sind, kannst Du gar nicht wissen, weil Du mein Stylefile nicht kennst.
Mir gehts wirklich nur um das Perl-Script, mit LaTeX habe ich keine Probleme, danke...
renee
 2005-07-04 11:41
#55812 #55812
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das Skript von Thorium dürfte so ziemlich die Lösung für Dein Problem sein, oder??
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2005-06-28 20:59.