Lichess PGN -> LaTeX -> PDF

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von hikaru » 20.12.2021 13:24:25

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 13:09:24
Ich habe bei mir einfach jedes Wort auf eine eigene Zeile gemacht. Das ergibt dann ein Drei-Zeilen-Muster das sich wiederholt: Zugnummer, Weiss, Schwarz. Diese Daten werte ich dann mit awk aus, indem ich die jeweils drei Zeilen mit `getline' einlese.
Ich hatte mit sed genau das Gegenteil gemacht: Alles in eine Zeile geholt, dann nach Tripeln (Delimiter: Leerzeichen) geteilt und entsprechend ersetzt um Latex-Code zu erhalten.
Daher auch meine Frage, ob ein Zug anders strukturiert sein kann, also ob meine Leerzeichen-Delimiter überhaupt taugen. tobos Erklärung zufolge taugen sie nicht, wenn Kommentare zu erwarten sind.
In awk könnte man das sicher mit if-Abfragen abfangen, indem man schaut, ob geschweifte Klammern auftauchen. In sed sah ich dazu keine Möglichkeit.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 20.12.2021 13:34:39

hikaru hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 13:24:25
Meillo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 13:09:24
Ich habe bei mir einfach jedes Wort auf eine eigene Zeile gemacht.
Ich hatte mit sed genau das Gegenteil gemacht: Alles in eine Zeile geholt [...]
Beides ist gleichermassen moeglich und einfach. (Die Zeilenlaengenbegrenzungen aeltere Implementierungen will ich hier aussen vor lassen.) Darum denke ich (wie ich anfangs schon geschrieben hatte) eine dieser beiden Moeglichkeiten -- egal welche -- sinnvoll ist. die an sich schoenere Variante, die jeweils ein Zug-Tripel auf eine Zeile bringt, ist aufwaendiger. Dieses Zusammenfassen von jeweils drei Werten machen sowohl hikaru als auch ich im nachgelagerten Schritt, wo dann auch schon die Ausgabe passiert.

Egal wie man es macht, das grundsaetzliche Vorgehen bleibt: Erst die Eingangsdaten aufbereiten/homogenisieren/schoen machen und danach erst anfangen sie zu verarbeiten.


Kommentare ignoriere ich auch. Da es Ausgangsdaten auch kommentarlos gibt, sehe ich derzeit keinen Grund die einzubauen. Andernfalls wuerde ich einfach einen weiteren Kommentar-Entferne-Filter vor meinem awk-Script in die Pipeline setzen. Das genau ist eben die Maechtigkeit des Pipes-and-Filters-Ansatzes: Ich muss mein Programm gar nicht veraendern, sondern nur die Eingangsdaten noch ein bisschen mehr umformen, indem ich ein separates Programm schreibe, das nur eben genau das macht, und dieses mit in die Pipeline haenge. ;-)


@nixblick: Kannst du (oder sonst jemand) vielleicht noch ein paar reale, runtergeladene Inputdateien hier reinkopieren als weiteres Testmaterial?
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von hikaru » 20.12.2021 13:38:54

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 13:34:39
Kommentare ignoriere ich auch. Da es Ausgangsdaten auch kommentarlos gibt, sehe ich derzeit keinen Grund die einzubauen. Andernfalls wuerde ich einfach einen weiteren Kommentar-Entferne-Filter vor meinem awk-Script in die Pipeline setzen.
Auf die Idee kam ich gar nicht. Mein Ansruch war eher, Kommentare auch auszugeben, wenn sie vorhanden sind.

Edit:
Noch eine Verständnisfrage zu Kommentaren:
Das sind alles gültige Kommentare, richtig?:
1. c4 c5 {Kommetar 1}
2. Nc3 { Kommentar 2 } Nc6
3. g3 {Kommentar 3a} g6 { Kommentar 3b }

Was ist hiermit?:
4. Bg2 Bg7 { Kommentar {4} }

Anders gefragt: Müsste man beim Filtern Klammern zählen, oder reichen greedy-Regex?

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von tobo » 20.12.2021 16:14:15

hikaru hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 13:38:54
Noch eine Verständnisfrage zu Kommentaren:
Das sind alles gültige Kommentare, richtig?:
1. c4 c5 {Kommetar 1}
2. Nc3 { Kommentar 2 } Nc6
3. g3 {Kommentar 3a} g6 { Kommentar 3b }
Ja
Was ist hiermit?:
4. Bg2 Bg7 { Kommentar {4} }
Das ist nicht zulässig!

Ich würde aber auch Kommentare "erstmal" nicht betrachten. Oder anders gesagt, wenn man Kommentare betrachtet, dann muss man wisssen, dass man Untervarianten, verschachtelte Untervarianten, Kommentare in Untervarianten, Zugbewertungen, Stellungsbewertungen oder Computerbewertungen nicht beachtet. Das pgn-Format komplett innerhalb sed zu parsen ist glaube ich ziemlich anspruchsvoll. Und wohlgemerkt: dieses pgn-Format ist durch seine Verbreitung und die freie Verfügbarkeit bereits der heilige Gral. Das wäre so, als wollte man ein perpetuum mobile in einen Kernreaktor überführen.

Als Beispieltext mal die ersten 8 Partien von 1972:

Code: Alles auswählen

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "1"]
[White "Spassky, Boris V"]
[Black "Fischer, Robert James"]
[Result "1-0"]
[WhiteElo "2660"]
[BlackElo "2785"]
[ECO "E56"]

1.d4 Nf6 2.c4 e6 3.Nf3 d5 4.Nc3 Bb4 5.e3 O-O 6.Bd3 c5 7.O-O Nc6 8.a3 Ba5
9.Ne2 dxc4 10.Bxc4 Bb6 11.dxc5 Qxd1 12.Rxd1 Bxc5 13.b4 Be7 14.Bb2 Bd7 15.Rac1 Rfd8
16.Ned4 Nxd4 17.Nxd4 Ba4 18.Bb3 Bxb3 19.Nxb3 Rxd1+ 20.Rxd1 Rc8 21.Kf1 Kf8
22.Ke2 Ne4 23.Rc1 Rxc1 24.Bxc1 f6 25.Na5 Nd6 26.Kd3 Bd8 27.Nc4 Bc7 28.Nxd6 Bxd6
29.b5 Bxh2 30.g3 h5 31.Ke2 h4 32.Kf3 Ke7 33.Kg2 hxg3 34.fxg3 Bxg3 35.Kxg3 Kd6
36.a4 Kd5 37.Ba3 Ke4 38.Bc5 a6 39.b6 f5 40.Kh4 f4 41.exf4 Kxf4 42.Kh5 Kf5
43.Be3 Ke4 44.Bf2 Kf5 45.Bh4 e5 46.Bg5 e4 47.Be3 Kf6 48.Kg4 Ke5 49.Kg5 Kd5
50.Kf5 a5 51.Bf2 g5 52.Kxg5 Kc4 53.Kf5 Kb4 54.Kxe4 Kxa4 55.Kd5 Kb5 56.Kd6  1-0

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "2"]
[White "Fischer, Robert James"]
[Black "Spassky, Boris V"]
[Result "0-1"]
[WhiteElo "2785"]
[BlackElo "2660"]
[ECO "A00"]

0-1

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "3"]
[White "Spassky, Boris V"]
[Black "Fischer, Robert James"]
[Result "0-1"]
[WhiteElo "2660"]
[BlackElo "2785"]
[ECO "A77"]

1.d4 Nf6 2.c4 e6 3.Nf3 c5 4.d5 exd5 5.cxd5 d6 6.Nc3 g6 7.Nd2 Nbd7 8.e4 Bg7
9.Be2 O-O 10.O-O Re8 11.Qc2 Nh5 12.Bxh5 gxh5 13.Nc4 Ne5 14.Ne3 Qh4 15.Bd2 Ng4
16.Nxg4 hxg4 17.Bf4 Qf6 18.g3 Bd7 19.a4 b6 20.Rfe1 a6 21.Re2 b5 22.Rae1 Qg6
23.b3 Re7 24.Qd3 Rb8 25.axb5 axb5 26.b4 c4 27.Qd2 Rbe8 28.Re3 h5 29.R3e2 Kh7
30.Re3 Kg8 31.R3e2 Bxc3 32.Qxc3 Rxe4 33.Rxe4 Rxe4 34.Rxe4 Qxe4 35.Bh6 Qg6
36.Bc1 Qb1 37.Kf1 Bf5 38.Ke2 Qe4+ 39.Qe3 Qc2+ 40.Qd2 Qb3 41.Qd4 Bd3+  0-1

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "4"]
[White "Fischer, Robert James"]
[Black "Spassky, Boris V"]
[Result "1/2-1/2"]
[WhiteElo "2785"]
[BlackElo "2660"]
[ECO "B88"]

1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 Nc6 6.Bc4 e6 7.Bb3 Be7 8.Be3 O-O
9.O-O a6 10.f4 Nxd4 11.Bxd4 b5 12.a3 Bb7 13.Qd3 a5 14.e5 dxe5 15.fxe5 Nd7
16.Nxb5 Nc5 17.Bxc5 Bxc5+ 18.Kh1 Qg5 19.Qe2 Rad8 20.Rad1 Rxd1 21.Rxd1 h5
22.Nd6 Ba8 23.Bc4 h4 24.h3 Be3 25.Qg4 Qxe5 26.Qxh4 g5 27.Qg4 Bc5 28.Nb5 Kg7
29.Nd4 Rh8 30.Nf3 Bxf3 31.Qxf3 Bd6 32.Qc3 Qxc3 33.bxc3 Be5 34.Rd7 Kf6 35.Kg1 Bxc3
36.Be2 Be5 37.Kf1 Rc8 38.Bh5 Rc7 39.Rxc7 Bxc7 40.a4 Ke7 41.Ke2 f5 42.Kd3 Be5
43.c4 Kd6 44.Bf7 Bg3 45.c5+  1/2-1/2

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "5"]
[White "Spassky, Boris V"]
[Black "Fischer, Robert James"]
[Result "0-1"]
[WhiteElo "2660"]
[BlackElo "2785"]
[ECO "E41"]

1.d4 Nf6 2.c4 e6 3.Nc3 Bb4 4.Nf3 c5 5.e3 Nc6 6.Bd3 Bxc3+ 7.bxc3 d6 8.e4 e5
9.d5 Ne7 10.Nh4 h6 11.f4 Ng6 12.Nxg6 fxg6 13.fxe5 dxe5 14.Be3 b6 15.O-O O-O
16.a4 a5 17.Rb1 Bd7 18.Rb2 Rb8 19.Rbf2 Qe7 20.Bc2 g5 21.Bd2 Qe8 22.Be1 Qg6
23.Qd3 Nh5 24.Rxf8+ Rxf8 25.Rxf8+ Kxf8 26.Bd1 Nf4 27.Qc2 Bxa4  0-1

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "6"]
[White "Fischer, Robert James"]
[Black "Spassky, Boris V"]
[Result "1-0"]
[WhiteElo "2785"]
[BlackElo "2660"]
[ECO "D59"]

1.c4 e6 2.Nf3 d5 3.d4 Nf6 4.Nc3 Be7 5.Bg5 O-O 6.e3 h6 7.Bh4 b6 8.cxd5 Nxd5
9.Bxe7 Qxe7 10.Nxd5 exd5 11.Rc1 Be6 12.Qa4 c5 13.Qa3 Rc8 14.Bb5 a6 15.dxc5 bxc5
16.O-O Ra7 17.Be2 Nd7 18.Nd4 Qf8 19.Nxe6 fxe6 20.e4 d4 21.f4 Qe7 22.e5 Rb8
23.Bc4 Kh8 24.Qh3 Nf8 25.b3 a5 26.f5 exf5 27.Rxf5 Nh7 28.Rcf1 Qd8 29.Qg3 Re7
30.h4 Rbb7 31.e6 Rbc7 32.Qe5 Qe8 33.a4 Qd8 34.R1f2 Qe8 35.R2f3 Qd8 36.Bd3 Qe8
37.Qe4 Nf6 38.Rxf6 gxf6 39.Rxf6 Kg8 40.Bc4 Kh8 41.Qf4  1-0

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "7"]
[White "Spassky, Boris V"]
[Black "Fischer, Robert James"]
[Result "1/2-1/2"]
[WhiteElo "2660"]
[BlackElo "2785"]
[ECO "B97"]

1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Qb6 8.Qd2 Qxb2
9.Nb3 Qa3 10.Bd3 Be7 11.O-O h6 12.Bh4 Nxe4 13.Nxe4 Bxh4 14.f5 exf5 15.Bb5+ axb5
16.Nxd6+ Kf8 17.Nxc8 Nc6 18.Nd6 Rd8 19.Nxb5 Qe7 20.Qf4 g6 21.a4 Bg5 22.Qc4 Be3+
23.Kh1 f4 24.g3 g5 25.Rae1 Qb4 26.Qxb4+ Nxb4 27.Re2 Kg7 28.Na5 b6 29.Nc4 Nd5
30.Ncd6 Bc5 31.Nb7 Rc8 32.c4 Ne3 33.Rf3 Nxc4 34.gxf4 g4 35.Rd3 h5 36.h3 Na5
37.N7d6 Bxd6 38.Nxd6 Rc1+ 39.Kg2 Nc4 40.Ne8+ Kg6 41.h4 f6 42.Re6 Rc2+ 43.Kg1 Kf5
44.Ng7+ Kxf4 45.Rd4+ Kg3 46.Nf5+ Kf3 47.Ree4 Rc1+ 48.Kh2 Rc2+ 49.Kg1  1/2-1/2

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "8"]
[White "Fischer, Robert James"]
[Black "Spassky, Boris V"]
[Result "1-0"]
[WhiteElo "2785"]
[BlackElo "2660"]
[ECO "A39"]

1.c4 c5 2.Nc3 Nc6 3.Nf3 Nf6 4.g3 g6 5.Bg2 Bg7 6.O-O O-O 7.d4 cxd4 8.Nxd4 Nxd4
9.Qxd4 d6 10.Bg5 Be6 11.Qf4 Qa5 12.Rac1 Rab8 13.b3 Rfc8 14.Qd2 a6 15.Be3 b5
16.Ba7 bxc4 17.Bxb8 Rxb8 18.bxc4 Bxc4 19.Rfd1 Nd7 20.Nd5 Qxd2 21.Nxe7+ Kf8
22.Rxd2 Kxe7 23.Rxc4 Rb1+ 24.Bf1 Nc5 25.Kg2 a5 26.e4 Ba1 27.f4 f6 28.Re2 Ke6
29.Rec2 Bb2 30.Be2 h5 31.Rd2 Ba3 32.f5+ gxf5 33.exf5+ Ke5 34.Rcd4 Kxf5 35.Rd5+ Ke6
36.Rxd6+ Ke7 37.Rc6  1-0

[Event "World Championship 28th"]
[Site "Reykjavik"]
[Date "1972.??.??"]
[Round "15"]
[White "Spassky, Boris V"]
[Black "Fischer, Robert James"]
[Result "1/2-1/2"]
[WhiteElo "2660"]
[BlackElo "2785"]
[ECO "B99"]

1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 e6 7.f4 Be7 8.Qf3 Qc7
9.O-O-O Nbd7 10.Bd3 b5 11.Rhe1 Bb7 12.Qg3 O-O-O 13.Bxf6 Nxf6 14.Qxg7 Rdf8
15.Qg3 b4 16.Na4 Rhg8 17.Qf2 Nd7 18.Kb1 Kb8 19.c3 Nc5 20.Bc2 bxc3 21.Nxc3 Bf6
22.g3 h5 23.e5 dxe5 24.fxe5 Bh8 25.Nf3 Rd8 26.Rxd8+ Rxd8 27.Ng5 Bxe5 28.Qxf7 Rd7
29.Qxh5 Bxc3 30.bxc3 Qb6+ 31.Kc1 Qa5 32.Qh8+ Ka7 33.a4 Nd3+ 34.Bxd3 Rxd3
35.Kc2 Rd5 36.Re4 Rd8 37.Qg7 Qf5 38.Kb3 Qd5+ 39.Ka3 Qd2 40.Rb4 Qc1+ 41.Rb2 Qa1+
42.Ra2 Qc1+ 43.Rb2 Qa1+  1/2-1/2
Edit:
15. Partie mit O-O-O ergänzt und 2. Partie berichtigt.
Zuletzt geändert von tobo am 20.12.2021 16:42:16, insgesamt 1-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 20.12.2021 16:26:04

Danke fuer die realen Beispiele, tobo.

Da zeigt sich nun, dass hinter der Zugnummer gar kein Leerzeichen ist! (Es sieht so aus, dass das optional ist.)

Zudem muss das Ergebnis in der Verarbeitung gesondert behandelt werden, da das nach dem ersten Halbzug oder nach dem zweiten Halbzug kommen kann. Es kann ``0-1'', ``1-0'' oder ``1/2-1/2'' lauten. (``0-0'' dagegen ist die Rochade, bzw. ``0-0-0'' fuer die lange Rochade. Zweitere kommt in den Daten hier nicht vor.)

Edit: Am meisten hilft uns hier wohl: https://en.wikipedia.org/wiki/Portable_Game_Notation weiter. Die Essenz daraus: das Format muss tolerant geparst werden. ;-)
Use ed once in a while!

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von tobo » 20.12.2021 16:54:56

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 16:26:04
Da zeigt sich nun, dass hinter der Zugnummer gar kein Leerzeichen ist! (Es sieht so aus, dass das optional ist.)
Ja - das hängt offensichtlich davon ab, wer das pgn erstellt.
Zudem muss das Ergebnis in der Verarbeitung gesondert behandelt werden, da das nach dem ersten Halbzug oder nach dem zweiten Halbzug kommen kann. Es kann ``0-1'', ``1-0'' oder ``1/2-1/2'' lauten. (``0-0'' dagegen ist die Rochade, bzw. ``0-0-0'' fuer die lange Rochade. Zweitere kommt in den Daten hier nicht vor.)
Für die lange Rochade habe ich die 15.Partie oben noch angehängt. Dabei (beim suchen mit grep) ist mir aufgefallen, dass die Rochaden mit O statt mit 0 geschrieben werden. Habe das gerade mal in meinen anderen pgn-Dateien geprüft - das ist tatsächlich überall so. Ist mir nie aufgefallen.
Und die 2. Partie habe ich oben auch noch editiert - der Witz diese Partien auszuwählen war ja gerade, dass da eine kampflose Partie drin ist. Vielleicht konnte der Ersteller das formal mit seinem Programm nicht machen.
Edit: Am meisten hilft uns hier wohl: https://en.wikipedia.org/wiki/Portable_Game_Notation weiter. Die Essenz daraus: das Format muss tolerant geparst werden. ;-)
Wie gesagt, das Ergebnis z.B. könnte auch unterhalb der Partie stehen.

Benutzeravatar
hikaru
Moderator
Beiträge: 13585
Registriert: 09.04.2008 12:48:59

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von hikaru » 20.12.2021 17:03:55

tobo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 16:54:56
Dabei (beim suchen mit grep) ist mir aufgefallen, dass die Rochaden mit O statt mit 0 geschrieben werden. Habe das gerade mal in meinen anderen pgn-Dateien geprüft - das ist tatsächlich überall so. Ist mir nie aufgefallen.
Da bist du vermutlich nicht der Einzige. Also sollte ein PGN-Parser das im Rahmen seiner Fehlerbehandlung mi einbeziehen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 20.12.2021 17:09:15

tobo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 16:54:56
Für die lange Rochade habe ich die 15.Partie oben noch angehängt. Dabei (beim suchen mit grep) ist mir aufgefallen, dass die Rochaden mit O statt mit 0 geschrieben werden. Habe das gerade mal in meinen anderen pgn-Dateien geprüft - das ist tatsächlich überall so. Ist mir nie aufgefallen.
;-)
Und die 2. Partie habe ich oben auch noch editiert - der Witz diese Partien auszuwählen war ja gerade, dass da eine kampflose Partie drin ist. Vielleicht konnte der Ersteller das formal mit seinem Programm nicht machen.
Heisst das, in den heruntergeladenen Daten war da ein Eroeffnungszug von Bobby Fischer und dann seine Aufgabe, waehrend er tatsaechlich vor dem ersten Zug schon aufgegeben hat (so wie du es nun notiert hast)?

hikaru hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 17:03:55
tobo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 16:54:56
Dabei (beim suchen mit grep) ist mir aufgefallen, dass die Rochaden mit O statt mit 0 geschrieben werden. Habe das gerade mal in meinen anderen pgn-Dateien geprüft - das ist tatsächlich überall so. Ist mir nie aufgefallen.
Da bist du vermutlich nicht der Einzige. Also sollte ein PGN-Parser das im Rahmen seiner Fehlerbehandlung mi einbeziehen.
Das denke ich auch, jedoch sollte es irrelevant sein die der String des Zuges lautet. Du musst nur den Endzustand (Sieg, Niederlage, Remis) erkennen koennen.
Use ed once in a while!

tobo
Beiträge: 1989
Registriert: 10.12.2008 10:51:41

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von tobo » 20.12.2021 18:10:25

Meillo hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 17:09:15
Und die 2. Partie habe ich oben auch noch editiert - der Witz diese Partien auszuwählen war ja gerade, dass da eine kampflose Partie drin ist. Vielleicht konnte der Ersteller das formal mit seinem Programm nicht machen.
Heisst das, in den heruntergeladenen Daten war da ein Eroeffnungszug von Bobby Fischer und dann seine Aufgabe, waehrend er tatsaechlich vor dem ersten Zug schon aufgegeben hat (so wie du es nun notiert hast)?
Ja, da stand "1.d4 0-1". Fischer hatte die Partie damals nicht aufgegeben, er ist zur Partie überhaupt nicht aufgetaucht. Die haben da wohl eine Stunde auf ihn gewartet und dann wurde die Partie kampflos an Spasski gegeben. Ihn haben wohl irgendwie die Fernsehkameras gestört.

Edit:
Habe das gerade mal in xboard und scid getestet: Beide Programme nehmen die Rochade sowohl mit O als auch mit 0 und die Weißzüge mit oder ohne führendes Leerzeichen (auch gemischt in einer Partie). Der normale Weg so eine pgn-Datei zu erstellen ist ja, dass man die Partie(n) in einem Schachprogramm oder einer Schachdatenbank eingibt und dann dort abspeichert. Die formalen Regeln sollten also grundsätzlich zutreffen.

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 23.12.2021 11:21:56

Nachdem nun aufgekommen ist, dass das Format tolerant geparst werden sollte, habe ich gedacht, dass das vielleicht ein Fall fuer Lex waere. Damit liebaeugle ich immer mal wieder, habe aber kaum Praxiserfahrung damit. Also: Buch rausgeholt und rumgespielt. Jetzt habe ich auch eine Umsetzung in Lex, die durchaus ihre Schoenheit hat, da sie den Whitespace automatisch handhabt und deutlich flexibler ist.


@nixblick: Wie sieht es denn bei dir aus? Kommst du voran? Wo steckst du? Und vor allem: Wann waere es in Ordnung, dass wir anderen unsere Programme hier veroeffentlichen. Wir wollen dir das Selberherausfinden nicht nehmen, aber natuerlich auch nicht ewig warten muessen. Schreib uns wie es dir am liebsten waere.
Use ed once in a while!

Benutzeravatar
nixblick
Beiträge: 7
Registriert: 23.01.2013 10:04:43

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 23.12.2021 20:40:19

Hallo @all,

also ich bin groß genug, wenn ihr was posten wollt, postet. Mir mangelt es an Zeit. Was ich habe: Ich kann mit awk die pgn einlesen und alles wegwerfen was ich nicht brauche. und Ich kann einzelne Züge in den Endzustand bringen. Was ich nicht schaffe momentan, ist aus der einen Zeile in der alle Züge stehen die so zu manipulieren, das pro Zeile ein Halbzug dabei herauskommt. Habe ne tolle Quelle gefunden https://www-user.tu-chemnitz.de/~hot/un ... n/awk.html - da hab ich viel draus gelernt (find ich einfacher als: man awk zum beispiel...).

Hab halt nie wirklich programmiert. Und entgegen meiner Vermutung das awk ein tool ist, so ist es ja auch eine Sprache. Und das fasziniert mich auch. Da es auf der einen Seite recht simpel daher kommt. Beispiele wie das hier,

Code: Alles auswählen

cat pgn/3gUXHQ4q.pgn | gawk 'BEGIN { FS = "" }
                  {
                      for (i = 1; i <= NF; i = i + 1)
                          print "Field", i, "is", $i
                  }' 
kann ich sehr gut nachvollziehen. Aber das dann transferieren in das was ich brauche, da bin ich noch nicht :( Versuche es über die kommende Tage hinzubekommen. Aber schneller wird es bei mir nicht. :/

Und wenn hier jemand was postet, oder ihr das Thema weiterentwickelt, ist doch cool! Muss das ja nicht lesen :) Mich interessiert es, bin auch echt gespannt was ihr so wie gelöst habt. Meine Lösung wird hölzern, a la nimm pgn, mach was > zwischenschritt.txt, lies wieder ein, do awk magic > ergebnis.txt mach vielleicht noch mal awk magic > endergebnis

Ist mir auch etwas peinlich. Aber für relativ wenig Zeit (in einer Pandemie mit Familie und Job drumherum kurz vor Weihnachten) bin ich mit mir ganz zufrieden. :)

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 24.12.2021 13:01:27

Mach dir nicht so viele Gedanken wegen deinen Programmierkenntnissen und wie schoen oder hoelzern deine Umsetzung wird. Ich glaube, dass einen solche Gedanken mehr behindern als dass sie einem helfen.


Hier ist mal der Teil meiner ersten Umsetzung, der die Daten in eine homogenere Form bringt:

Code: Alles auswählen

sed '1,/^$/d; s/  */ /g' INPUTDATEI | tr -d \\n | tr ' ' \\n
Daran anschliessend kommt dann ein awk-Script, das die Ausgabe erledigt.

Ich moechte kurz erklaeren was der Code macht:

Der sed-Befehl macht zwei Dinge: Der Teil bis zum Strichpunkt entfernt den Header (alle Zeilen von der ersten Zeile bis zur ersten leeren Zeile werden geloescht/uebergangen). Der Teil hinter dem Strichpunkt macht aus mehrfachen Leerzeichen jeweils ein einzelnes.

Der erste tr-Befehl entfernt alle Newlines in der Ausgabe, d.h. es wird eine einzige lange Zeile daraus.

Weil mir aber viele kurze Zeilen, die je nur ein Wort enthalten, lieber ist als eine lange Zeile mache ich diese Umformung mit dem zweiten tr-Befehl.

(Dieser Code basiert auf der Annahme, dass zwischen Zugnummer und dem weissen Zug ein Leerzeichen ist.)

Die Ausgabe dieser Pipelines sieht mit deiner Inputdatei dann so aus:

Code: Alles auswählen

1.
c4
c5
2.
Nc3
Nc6
3.
g3
g6
4.
...
Damit arbeite ich dann mit awk weiter, indem ich jeweils drei Zeilen einlese (`getline var') und mit diesen drei Werten eine Ausgabefunktion aufrufe.

Das ganze Script poste ich in den naechsten Tagen mal.
Use ed once in a while!

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 24.12.2021 13:07:43

Was ich jetzt schon posten will ist meine Umsetzung mit lex, die sehr flexibel mit Whitespace klar kommt.

Technologisch ist das natuerlich etwas mehr fortgeschritten. Ihr braucht auch eine Build-Umgebung fuer C und eine Lex-Implementierung (z.B. Debianflex), um das Programm ueberhaupt erstellen zu koennen.

Schoen daran finde ich, wie uebersichtlich und flexibel bei diesem Ansatz alles ist.

Code: Alles auswählen

:-Q cat chess.l
%{
        int num;
        int white=1;
%}
%%
^\[[^]]+\]      ;  /* ignore headers */
[ \t\n\r]       ;  /* ignore whitespace */

[0-9]+\.        {
                num = atoi(yytext);
                white = 1;
        }

"1-0"|"0-1"|"1/2-1/2"   {
                printf("Ergebnis: %s\n", yytext);
        }

[A-Za-z0-9+-]+  {
                printf("\\currentboard\n\\newframe\\hidemoves{%d.%s%s}%%\n",
                                num, (white ? "" : ".. "), yytext);
                white = !white;
        }
%%
int
main(void) {
        printf("\\begin{animateinline}[autoplay,loop]{1}%%\n");
        yylex();
        printf("\\currentboard\n\\end{animateinline}\n");
        return 0;
}


:-Q cat Makefile 
LDLIBS=-ll

all: chess

clean:
        rm -f chess.c chess.o

realclean: clean
        rm -f chess
Use ed once in a while!

Benutzeravatar
nixblick
Beiträge: 7
Registriert: 23.01.2013 10:04:43

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 10.01.2022 08:26:35

Hallo,
komme an einer Stelle nicht weiter.

Ich kann simpel Schleifen bauen in awk

Beispiel:

Code: Alles auswählen

awk '{for (i = $1; i <= NF; i++) {printf  n };}'
Und ich kann Felder auslesen:

Code: Alles auswählen

awk '{ print $1 $2 " " $3 "\n" $4 $5 " " $6 }' zwischenschritt > laststep


Aber wie bekomm ich diese 2 Dinge nun zusammen? Alle Züge stehen bei mir ja entweder in einer Zeile (und es sind unterschiedlich viele Züge). Oder, wie hier auch schon gezeigt, kann ich es in mehrere Zeilen schreiben, aber dann nach dem Schema:

Code: Alles auswählen

1.
Sf3
d5
2.
g3
Sf6
usw.

Das müsste ich dann wieder zu den jeweiligen Halbzügen zusammen bauen.

Meine Idee ist, dass im "laststep" ich eine Datei habe, bei der der Zug von Weiß $1 ist und Schwarz $2. Und damit kann ich dann Zeilenweise das verarbeiten. Ich bekomme den Transfer von Theorie in awk Praxis nicht hin, da so viele Infos in einer Zeile mit Länge X vorhanden sind und es ja flexibel sein soll. :/

Ich sollte ja fragen :)
Danke!!!

Benutzeravatar
Meillo
Moderator
Beiträge: 8813
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 10.01.2022 13:33:37

nixblick hat geschrieben: ↑ zum Beitrag ↑
10.01.2022 08:26:35
Aber wie bekomm ich diese 2 Dinge nun zusammen? Alle Züge stehen bei mir ja entweder in einer Zeile (und es sind unterschiedlich viele Züge). Oder, wie hier auch schon gezeigt, kann ich es in mehrere Zeilen schreiben, aber dann nach dem Schema:

Code: Alles auswählen

1.
Sf3
d5
2.
g3
Sf6
usw.

Das müsste ich dann wieder zu den jeweiligen Halbzügen zusammen bauen.
Nachdem mich paedubucher auf die Idee gebracht hat, mit diesem Befehl kannst du jeweils drei Zeilen (d.h. ein ganzer Zug) auf eine Zeile bringen:

Code: Alles auswählen

paste - - -
Pipe also deine Ausgabe von oben durch diesen Befehl und du hast lauter Zeilen der Form: Zugnummer Tab Zug-Weiss Tab Zug-Schwarz

In awk kannst du die dann mit den zwei Variablen $1 (Zugnummer), $2 (Zug-Weiss) und $3 (Zug-Schwarz) nutzen.

Meine Idee ist, dass im "laststep" ich eine Datei habe, bei der der Zug von Weiß $1 ist und Schwarz $2. Und damit kann ich dann Zeilenweise das verarbeiten. Ich bekomme den Transfer von Theorie in awk Praxis nicht hin, da so viele Infos in einer Zeile mit Länge X vorhanden sind und es ja flexibel sein soll. :/
Alternativ kannst du die Folgezeilen mit `getline' einlesen, z.B. so:

Code: Alles auswählen

{
	zugnr = $0
	getline zugw
	getline zugs
	printf("Nr. %s: Weiss:%s -- Schwarz:%s\n", zugnr, zugw, zugs)
}
Der aeusserer Block springt eigentlich fuer jede Zeile an, also gleich fuer die erste. Dort liest du aber mit `getline' die Zeilen 2 und 3 ein, so dass die weg sind und der aeussere Block dann wieder fuer die vierte Zeile anspringt, usw.

Ich hoffe das bringt dich weiter. Sonst einfach wieder fragen. ;-)
Use ed once in a while!

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von eggy » 10.01.2022 14:45:12

und im Fall, dass mehrere Züge auf einer Zeile stehen, kommt man mit split ganz gut weiter

Benutzeravatar
nixblick
Beiträge: 7
Registriert: 23.01.2013 10:04:43

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 10.01.2022 16:14:28

Ahh ich bin blond. Lese es, mache es teilweise, aber verstehe es eben erst beim praktischen versuchen. Danke. Dachte am Ende müsse ich auch noch mal eine Schleife bauen. Aber durch das Zeilenweise einlesen muss ich das ja gar nicht... Es sind die kleinen Dinge.

Also, ich habe jetzt eine pgn. Da werfe ich den Anfang weg, und schreibe alle "Zugelemente" untereinander. Dann lese ich es neu ein und bringe es in eine andere Form. Könnte man sicher beides in einem Schritt machen, aber was solls...

Und am Ende schreibe ich es in die LaTeX Form die ich gern hätte. Sieht bei mir jetzt so aus:
awk '/^[0-9]/{print $0}' pgn/3gUXHQ4q.pgn | tr " " "\n" > step1.txt

awk '{ zugnr = $0
getline zugw
getline zugs
printf("%s %s - %s\n", zugnr, zugw, zugs) }' step1.txt > step2.txt

awk '{
print "\\newframe\\hidemoves{"$1 $2 "}%"
print "\\currentboard"
print "\\newframe\\hidemoves{"$1".." $4 "}%"
print "\\currentboard"
}' step2.txt >> step3.txt
JETZT schau ich mir das von meillo an, was er mit LaTeX gebastelt hat. Das habe ich bisher (absichtlich) ignoriert. Vielen Dank!

Ihr könnt ja mal eure schönen Code posten :) Bin gespannt.

Antworten