Lichess PGN -> LaTeX -> PDF

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
nixblick
Beiträge: 7
Registriert: 23.01.2013 10:04:43

Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 17.12.2021 09:23:02

Suche besten Weg mit wenig Programmierfähigkeiten


Hallo,

ich will Coole PDFs erstellen mit LaTeX. Das ist hier aber nicht Thema ;)
Und dabei will ich meinen Schachpartien bei Lichess (im PGN Format) automatisch in ein LaTeX freundlichen Text umwandeln. Soweit der Hintergrund.

Nun bin ich kein Programmierpro. Hab aber schon mal was von Variablen, Schleifen, read, cut und awk gehört. Bin bereit mich einzuarbeiten, kann aber nicht abschätzen ob das mit Debian Boardmitteln überhaupt geht (vermutlich ja, sonst würde ich hier nicht posten). Daher ganz konkret die Frage, was muss ich machen um aus File 1 File 2 herauszubekommen. Und das idealerweise immer wieder mit anderen Quellen:

So sieht File 1 aus:

Code: Alles auswählen

[Event "Casual Bullet game"]
[Site "https://lichess.org/3gUXHQ4q"]
[Date "2021.12.12"]
[... Text gekürzt]
[Opening "English Opening: Symmetrical Variation, Symmetrical Variation"]
[Termination "Normal"]

1. c4 c5 2. Nc3 Nc6 3. g3 g6 4. Bg2 Bg7 5. e3 e6 6. Nge2 Nge7 7. O-O O-O 8. d4 a6 9. d5 exd5 
10. cxd5 Nb4 11. e4 c4 12. a3 Nd3 13. Be3 b5 14. b3 Qa5 15. b4 Qc7 16. Bd4 d6 17. Bxg7 Kxg7 
18. Nd4 Bg4 19. f3 Bd7 20. Qd2 Nc8 21. Rfd1 Nb6 22. Bf1 Ne5 23. Kg2 Rad8 24. h3 Qc8 25. Kh2 f5 
26. f4 Nf7 27. Bg2 Nh6 28. e5 dxe5 29. fxe5 f4 30. g4 Bxg4 31. hxg4 Nxg4+ 32. Kh1 Ne3 33. Rg1 Qc7 34. Ne6+ 1-0
Und das wäre das gewünschte Ergebnis, File 2:

Code: Alles auswählen

\begin{animateinline}[autoplay,loop]{1}%
\currentboard
\newframe\hidemoves{1.c4}%
\currentboard
\newframe\hidemoves{1... c5}%
\currentboard
\newframe\hidemoves{2. Nc3}%
\currentboard
\newframe\hidemoves{2... Nc6}%
\currentboard
\newframe\hidemoves{3.g3}%
\currentboard
\newframe\hidemoves{3... g6}%
\currentboard
\newframe\hidemoves{4.Bg2}%
\currentboard
\newframe\hidemoves{4... Bg7}%
\currentboard
\newframe\hidemoves{5.e3}%
\currentboard
\newframe\hidemoves{5... e6}%
\currentboard
\newframe\hidemoves{6.Nge2}%
\currentboard
\newframe\hidemoves{6... Nge7}%
\currentboard
\newframe\hidemoves{7.O-O}%
\currentboard
\newframe\hidemoves{7... O-O}%
\currentboard
\newframe\hidemoves{8.d4}%
\currentboard
\newframe\hidemoves{8... a6}%
\currentboard
\newframe\hidemoves{9.d5}%
\currentboard
\newframe\hidemoves{9... exd5}%
\currentboard
\newframe\hidemoves{10.cxd5}%
\currentboard
\newframe\hidemoves{10... Nb4}%
\currentboard
\newframe\hidemoves{11.e4}%
\currentboard
\newframe\hidemoves{11... c4}%
\currentboard
\newframe\hidemoves{12.a3}%
\currentboard
\newframe\hidemoves{12... Nd3}%
\currentboard
\newframe\hidemoves{13.Be3}%
\currentboard
\newframe\hidemoves{13... b5}%
\currentboard
\newframe\hidemoves{14.b3}%
\currentboard
\newframe\hidemoves{14... Qa5}%
\currentboard
\newframe\hidemoves{15.b4}%
\currentboard
\newframe\hidemoves{15... Qc7}%
\currentboard
\newframe\hidemoves{16.Bd4}%
\currentboard
\newframe\hidemoves{16... d6}%
\currentboard
\newframe\hidemoves{17.Bxg7}%
\currentboard
\newframe\hidemoves{17... Kxg7}%
\currentboard
\newframe\hidemoves{18.Nd4}%
\currentboard
\newframe\hidemoves{18... Bg4}%
\currentboard
\newframe\hidemoves{19.f3}%
\currentboard
\newframe\hidemoves{19... Bd7}%
\currentboard
\newframe\hidemoves{20.Qd2}%
\currentboard
\newframe\hidemoves{20... Nc8}%
\currentboard
\newframe\hidemoves{21.Rfd1}%
\currentboard
\newframe\hidemoves{21... Nb6}%
\currentboard
\newframe\hidemoves{22.Bf1}%
\currentboard
\newframe\hidemoves{22... Ne5}%
\currentboard
\newframe\hidemoves{23.Kg2}%
\currentboard
\newframe\hidemoves{23... Rad8}%
\currentboard
\newframe\hidemoves{24.h3}%
\currentboard
\newframe\hidemoves{24... Qc8}%
\currentboard
\newframe\hidemoves{25.Kh2}%
\currentboard
\newframe\hidemoves{25... f5}%
\currentboard\\
\newframe\hidemoves{26.f4}%
\currentboard
\newframe\hidemoves{26... Nf7}%
\currentboard
\newframe\hidemoves{27.Bg2}%
\currentboard
\newframe\hidemoves{27... Nh6}%
\currentboard
\newframe\hidemoves{28.e5}%
\currentboard
\newframe\hidemoves{28... dxe5}%
\currentboard
\newframe\hidemoves{29.fxe5}%
\currentboard
\newframe\hidemoves{29... f4}%
\currentboard
\newframe\hidemoves{30.g4}%
\currentboard
\newframe\hidemoves{30... Bxg4}%
\currentboard
\newframe\hidemoves{31.hxg4}%
\currentboard
\newframe\hidemoves{31... Nxg4+}%
\currentboard
\newframe\hidemoves{32.Kh1}%
\currentboard
\newframe\hidemoves{32... Ne3}%
\currentboard
\newframe\hidemoves{33.Rg1}%
\currentboard
\newframe\hidemoves{33... Qc7}%
\currentboard
\newframe\hidemoves{34.Ne6+}%
\currentboard
\end{animateinline}
Was muss ich lernen um das in einem Skript "umwandeln" lassen zu können? Wie wäre der Weg?
Zuletzt geändert von Meillo am 17.12.2021 10:01:13, insgesamt 2-mal geändert.
Grund: Titel inhaltlich aussagekraeftig gemacht

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von eggy » 17.12.2021 12:33:56

Da hast Dir aber gleich nen saftiges Erstlingswerk zugelegt.
awk ist aber schonmal ne gute Wahl :mrgreen: wenn auch hier vielleicht ein klein wenig schwerer als notwendig, Python wäre bei sowas als Einsteigersprache auch gut geeignet.

In Zeile 7 ist in der Beispielausgabe vermutlich nen Leerzeichen zu viel, sagt jedenfalls diff mit meiner Scriptausgabe - sag, wenn ich mein Script posten soll, 37 Zeilen Chaos. Ich geh mal davon aus, dass Du das selbst schreiben lernen willst und lieber Hilfe beim Rantasten als ne fertige Lösung haben willst.

Allgemeines Vorgehen bei awk (und so ziemlich jeder anderen Sprache):
Erstmal nen groben Plan machen: was soll passieren? Den Ablauf/Code vorab in Stichpunkten runterschreiben hilft, damit man bei komplizierteren Aufgaben nicht unterwegs den Weg verliert.
Zwischenstände backuppen, man rennt mal schnell in die falsche Richtung und ist dann froh, wenn man nen alten Stand hat. Und nicht nur Kommentieren, was man vorhat, sondern auch aufschreiben, was die einzelnen Codeteile machen.

Fragen, mit denen ich oft anfang:
Wie ist die Ausgabe aufgebaut, was wiederholt sich?
Wie ist die Eingabe aufgebaut, welche Teile sollen wo in der Ausgabe auftauchen?
Muss man irgendwas zusammenfassen? Kann man die Eingabe überhaupt Zeilen-/Blockweise abarbeiten? Falls nicht: vermutlich ist dann awk bei der Aufgabe eher weniger gut geeignet, andere Sprache nehmen. (Hier geht's aber ganz gut)

diff (und dessen graphische Varianten wie meld) sind brauchbare Helfer auf dem Weg von "das hab ich schon" zu "so soll's aussehen". Ich finde es ganz praktisch mich Stück für Stück an das Ergebnis ranzutasten und kann so einfach sehen, was ich schon fertig hab, bzw was noch fehlt oder falsch ist. "awk -f awk.awk input.txt > ausgabe.txt && diff --side-by-side ausgabe.txt ziel.txt"

Man könnte dann damit anfangen, die Teile der Eingabe zu identifizieren, die gebraucht werden; den Rest verwerfen.
Hier gibt's unterschiedliche Ansätze, z.B. "immer wenn die Zeile mit ner Zahl beginnt", "immer ab Zeile 6", "immer nach ner Leerzeile" oder "immer wenn XYZ in der Zeile stand geht's drei Zeilen später los" etc.

Der ersten Schritte sähen also zum Beispiel so aus:
"awk '{print $0}' input.txt" ... viel zu viel zuviel unnötiges Zeug.
Überlegen, was unterschiedet das Benötigte von dem Überflüssigen? ... Eckige Klammern vs. Zahlen.
"awk '/^[0-9]/{print $0}' input.txt" .... nur noch Zeilen die mit ner Zahl anfangen.
Oder Struktur als "unnötigerBlock" - Leerzeile - "sinnvollerBlock" erkennen.
Das ist dann nen klassischer Fall für nen "Schalter": eine Hilfsvariable definieren und jenachdem ob die gesetzt ist, etwas tun oder nicht:

Code: Alles auswählen

/tuwas==1/{print $0}
/^$/{tuwas=1}
Ist das die Art der Hilfe die Du Dir vorgestellt hast? Oder geht's um "welche sind die für ne Lösung genutzten awk Befehle"? Dann "man awk" und da mal mit "split(s, a [, r [, seps] ])" auseinandersetzen)

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 17.12.2021 13:07:36

Hallo eggy,
Danke für die vielen Informationen. Mach mich gleich mal dran alles nachzuvollziehen.

Du hast mich schon richtig verstanden. Im Ideal versteh (und lern) ich gleich wie es geht. Wenn du denkst, awk kann das, dann fuchse ich mich da ein. Python lernen dafür scheint mir etwas zu krass. Am Ende ist es ja die Lösung die begeistert. Und wenn die noch Wochen entfernt ist, dann frustriert das eher (zuviel).

Der Plan ist: Der obere Teil der PGN kann im ersten Schritt weggeworfen werden, später vielleicht mal interessant. Der Teil mit den Zügen sollte flexibel einlesbar sein. Jede Partie endet ja bei einem anderen Zug. Die Ausgabe ist immer wieder das gleiche, je nachdem ob für Weiß oder Schwarz. Das lässt sich bestimmt mittels einer Schleife machen in der immer die jeweile eingelesene Variable an der richtigen Stelle ausgegeben wird. Das würde vermutlich auch das Problem mit der Anzahl der Züge einfangen, denn wenn nix mehr da ist zum einlesen, endet es...

Dann bleibt die Frage, wie bekomme ich das eingelesen, in eine Variable geschrieben und an die Schleife übergeben. Gesetz dem Fall man würde das so machen, oder? :)

Dafür gibt es ja X how to. Wenn du, oder jemand anderes mir sagen kann, dass ist (ein möglicher) Weg, dann ok. Top. Meine Sorge ist, dass ich nach einer Zeit X merke, dass alles viel schwieriger ist weil... und ich dann doch Python z.B. lernen muss.

Wenn es nur Python kann, ok. Dann wäre das auch ne Aussage. Dann spare ich die Zeit mit awk & co... Versteht mich wer? Das was am Ende heraus kommt, wäre mega. Ein PDF was Partien automatisch vorspielt, und das zeitnah erstellt aus aktuellem Content. Da kann man was draus machen. Das lohnt gewissen Aufwand. Aber eben nicht manuell für jede Partie einzeln ca. 80 Zeilen per Hand copy und paste zusammen zu bauen.

Sorry für die Länge des Textes...

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 17.12.2021 13:24:11

Ich habe ein 25-Zeilen Script geschrieben, mit sed, tr und awk, das die Aufgabe erledigt. Du willst aber etwas lernen, wie mir scheint, darum poste ich das hier (noch) nicht, sondern helfe dir lieber bei der Frage, wie man vorgehen kann.

Zunaechst solltest du die vermutlich Vertipper in Input und Output finden und entfernen (Leerzeichen zu viel, Leerzeichen zu wenig, Backslash zu viel). Das erleichtet die Arbeit danach.

Dann muss ich ein grosses Lob aussprechen, dass du den vorhandenen Input und den gewuenschten Output bereitgestellt hast. Das ist top! :THX:


Ich denke, dass sich anfangs die Frage stellt, ob du das ganz in einer ``richtigen'' Programmiersprache (z.B. Python) oder ob du es in der Shell umsetzen willst. Im ersteren Fall machst du alles in der Sprache, im zweiteren Fall arbeitest du schrittweise mit Tools. Mir persoenlich ist fuer solche Aufgaben die Shell lieber, aber das ist auch eine Gewohnheitsfrage.

Hier mal wie ich es in der Shell mache: Ich arbeite schrittweise, fange also erstmal an, den Input in eine passende Form zu bekommen. D.h. die Headerzeilen entfernen. Dafuer schreibe ich einen Befehl, z.B. mit `sed', wende den auf den Input an und schaue ob das Ergebnis passt. Wenn nicht, dann passe ich ihn an. Das mache ich so lange bis der Header weg ist. Anschliessend vereinheitliche ich die Zugangaben. Die sind ja gemischt: mehrere auf einer Zeile und mehrere Zeilen. Ich will nur eine Form haben. Also entweder alles auf eine Zeile oder alles auf separate Zeilen. (Das habe ich mit `tr' gemacht.) Daran fummle ich auch so lange rum bis ich zufrieden bin. Dann haenge ich einfach den naechsten Befehl in die Pipeline, der dann die Zugangaben umformt (dafuer habe ich awk verwendet). Zum Schluss setze ich (ggf. mit einem weiteren Befehl) die Anfangs- und Endzeile drum herum (das habe ich im gleichen awk-Script erledigt).

In einer ``richtigen'' Programmiersprache wuerde man wohl eher mit einer Funktion den Input in eine Datenstruktur lesen und mit einer zweiten Funktion die Datenstruktur ausgeben. Da liegt also ein etwas anderes Denkmuster zugrunde.

Wenn du willst koennen ich und andere deinen Prozess gerne hier schrittweise begleiten.



Edit, weil sich unsere Posts ueberschnitten haben:

Du bist schon ganz auf dem richtigen Weg. Einzig, du suchst den direkten Weg zum Ziel. Wenn man Fahrradfahren lernt, dann sollte das erste Ziel auch nicht sein irgendwo hin zu kommen. Das kann zwar die Motivation sein, aber anfangs muss man auch einfach nur mal fahren ... erst wenn man das ein bisschen kann, dann kann man sich in Richtung Ziel aufmachen. Schreibe also in awk einfach mal irgendwas zusammen und veraendere das dann nach und nach. Ueber Umwege und Uebungen findest du dann zum Ziel. ;-)

Btw: Wenn du fragst, wie man sich einen Wert in einer Variablen merkt, dann gibt es darauf verschiedene Moeglichkeiten: Man kann es in der Shell selbst machen, man kann sich in sed etwas merken, man kann sich in awk etwas merken ... mit jeder der Varianten kann man das Problem loesen. :-P Oder in Python, Go, ...
Use ed once in a while!

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von hikaru » 17.12.2021 13:25:38

Ich hätte eine ganz furchtbare sed-Pipe als Lösung im Angebot, die zumindest für dieses Beispiel funktioniert.
Ob sie als allgemeine Lösung taugt kann ich nicht sagen, da sowohl meine Kenntnisse der Schachnotation als auch von Latex bestenfalls bruchstückhaft sind.

Genau bei diesen meinen Defiziten würde ich für eine saubere Lösung ansetzen, denn ich müsste z.B. bei der Schachnotation zunächst klären, ob ich die Notationsregeln vollständig verstanden habe.*
Wenn mir die Regeln klar wären, geht es an die eigentliche Überlegung zur Programmierung. Eine der ersten Fragen die sich dabei stellt ist, ob das Programm kontextsensitiv sein soll oder nicht? D.h., soll es wissen was in der Notation ein Zug (Zugnummer, Zuganfang, Zugende) ist oder reicht eine Umformatierung von Strings?

So lange es kontextfrei geht kann man es meist mit sed lösen. Braucht man Kontext, dann ist eher awk oder eine andere "richtige" Programmiersprache die richtige Wahl.


*) Ich weiß z.B., dass man die Figur weglassen kann wenn ein Bauer gezogen wird, aber ich bin mir unsicher, ob ein Zug immer aus genau drei Werten besteht (Zugnummer, Zuganfang, Zugende), oder ob es auch mal nur zwei oder gar vier Werte sein können (z.B.: Werden Rochaden speziell markiert?; Werden Zeitüberschreitungen im Blitzschach erfasst? Wenn ja, wie?; etc.).

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von eggy » 17.12.2021 13:34:39

Wie gesagt: 37 Zeilen hat meine Version - ist also machbar mit awk (für mich wars ne nette Fingerübung, bei jemanden der damit noch nie was gemacht hat, würd ich sagen "anspruchsvoll - aber definitiv machbar".
Die Aufgabe hat aber nen paar kleinere Schwierigkeiten, die evtl frustrierend wirken können. Also rechtzeitig um nen Schubs in die richtige Richtung bitten, eh Du es Dir selbst unnötig schwer machst.
nixblick hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 13:07:36
Dann bleibt die Frage, wie bekomme ich das eingelesen, in eine Variable geschrieben und an die Schleife übergeben.

Code: Alles auswählen

awk '{print $0}' eingabe.txt
awk '{print "Zeile " NR " (" NF " Felder): " $1 " |-------| " $2 }' eingabe.txt
awk liest die Eingabe direkt in ein nummeriertes Array, anhand eines Feldtrenners. Die anderen Zauberworte sind Blöcke und Pattern. Wenn Dir das noch Nichts sagt: manpage, awk-Buch, Einsteiger Tutorials lesen. Auch wenn's hart klingt: vorher haben alle weiteren Erklärungen wenig Sinn, denn ohne die Grundlagen reden wir an einander vorbei.

https://wiki.debianforum.de/AWK (Achtung verwaiste Baustelle, wenn was unverständlich ist, bitte sagen)

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 17.12.2021 14:29:14

Bin begeistert von der Resonanz und dem Engagement! Vielen Dank schon mal! Cool: Es geht mit Boardmitteln. TOP! Ob nun awk, sed, beides zusammen oder etwas anderes... da bin ich, nun ja, leidenschaftslos. Bin in den jeweiligen Tools nicht so tief drinnen um innerhalb kürzester Zeit etwas posten zu können, probiere aber nebenbei aus.

Zusatzinfos, falls ihr was testen wollt. Man kann super bei Lichess seine eigenen Partien (kommentiert und unkommentiert) downloaden. Wer kein Account hat, kann die 16 MB Datenbank von 2003 herunterladen :D
https://database.lichess.org/

Zu den Leerzeichen: Wollte das Prinzip bzw. die Aufgabe verdeutlichen. Hatte nicht damit gerechnet das jemand das gleich praktisch löst. Hatte daher auf Leerzeichen oder so nicht geachtet. 8O

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von eggy » 17.12.2021 14:51:22

nixblick hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 14:29:14
Hatte nicht damit gerechnet das jemand das gleich praktisch löst.
Tja. :mrgreen:

Wer hier was von awk schreibt, muss mit sowas halt rechnen.
Ich glaub, im ganzen Forum findet man keinen ungelösten awk-Thread. Und die meisten von den Threads brechen nach der Lösung dann auch noch in $randomadjektiv Smalltalk aus - ob die Diskussionen lehrreich sind, wage ich lieber nicht zu beurteilen, aber der ein oder andere alte Thread hatte zumindest einiges an Unterhaltungswert.

JTH
Moderator
Beiträge: 3077
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von JTH » 17.12.2021 14:55:00

Nachdem es dies Jahr keinen awk-ventskalender gibt, muss die Energie bei dem einen oder der anderen ja irgendwie anders raus :D
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von tobo » 17.12.2021 15:47:12

hikaru hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 13:25:38
*) Ich weiß z.B., dass man die Figur weglassen kann wenn ein Bauer gezogen wird, aber ich bin mir unsicher, ob ein Zug immer aus genau drei Werten besteht (Zugnummer, Zuganfang, Zugende), oder ob es auch mal nur zwei oder gar vier Werte sein können (z.B.: Werden Rochaden speziell markiert?; Werden Zeitüberschreitungen im Blitzschach erfasst? Wenn ja, wie?; etc.).
Da ein Bauer keine Figur ist, wird er auch nicht davor angeführt. So ein Zug in Kurznotation gibt immer nur die mögliche Figur und das Zugende an. Also z.B. Sg3 für Springer zieht nach g3. Bei Springer, Läufer und Turm gibt's unter Umständen die Möglichkeit, dass die paarweise andere Figur auch dieses Feld betreten könnte, dann muss man noch eine eindeutige und ergänzende Angabe vom Ursprungsfeld machen. Also z.B. S2g3 oder Sfg3. Ob Reihe oder Linie ist egal, sie muss nur eindeutig im Bezug zur paarweise anderen Figur sein. Gibt der Zug Schach, dann folgt dem Zug ohne Leerzeichen ein +. Schlagfälle werden mit x gekennzeichnet - Bei Figuren mit Sxg3 bzw. S2xg3 und bei Bauern durch zusätzliche Linienangabe wie z.B. bxc6. Die Rochade (kurze und lange) ist eine Sonderform, Notation ist 0-0 und 0-0-0. Somit ist der längste (textuell) mögliche Zug 0-0-0+.
Die allgemeine sich wiederholende Form ist Zugnummer, weißer Zug, Leerzeichen, schwarzer Zug. Zwischen weißen und schwarzem Zug ist (mindestens?) ein Leerzeichen, nach der Zugnummer und vor dem weißen Zug kann ein Leerzeichen stehen. Das Spielergebnis ist irgendwo am Ende - je nach Partieausteller steht es durch Leerzeichen getrennt in der letzten Zugzeile oder aber eine oder mehrere Zeilen darunter isoliert. Kommentare/Varianten können nach den Zügen (weiß oder schwarz) eingeflochten werden und werden dann in {} eingeschlossen. Zeitüberschreitungen sind nur für das Ergebnis relevant - wenn sie Erwähnung finden, dann zusätzlich als Kommentar in {}. Normalerweise steht da aber nur das Ergebnis. Zeitüberschreitungen können nicht nur in Blitzpartien, sondern auch in ganz normalen Turnierpartien passieren. Was da genau für eine Partie gespielt wurde, dürfte oben im Header irgendwo vermerkt sein.

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von hikaru » 17.12.2021 17:21:36

tobo hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 15:47:12
Die allgemeine sich wiederholende Form ist Zugnummer, weißer Zug, Leerzeichen, schwarzer Zug.
Siehst du, das wusste ich mal, hatte es inzwischen aber wieder vergessen. Deshalb hatte ich hier die Züge falsch interpretiert.
tobo hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 15:47:12
nach der Zugnummer und vor dem weißen Zug kann ein Leerzeichen stehen.
...muss aber offenbar nicht. An dieser Stelle musste ich meine Lösung anpassen.
tobo hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 15:47:12
Das Spielergebnis ist irgendwo am Ende - je nach Partieausteller steht es durch Leerzeichen getrennt in der letzten Zugzeile oder aber eine oder mehrere Zeilen darunter isoliert. Kommentare/Varianten können nach den Zügen (weiß oder schwarz) eingeflochten werden und werden dann in {} eingeschlossen.
Mit solchen Kommentaren käme meine Lösung aktuell nicht zurecht, wenn sie durch Leerzeichen von den Zügen abgetrennt wären, oder wenn sie selbst Leerzeichen enthalten.
tobo hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 15:47:12
Zeitüberschreitungen können nicht nur in Blitzpartien, sondern auch in ganz normalen Turnierpartien passieren. Was da genau für eine Partie gespielt wurde, dürfte oben im Header irgendwo vermerkt sein.
Da stellt sich mir als Unwissenden die Frage, ob der Latex-Konverter den Inhalt des Headers verstehen muss. Können bestimmte Schlüsselwörter im Header eine Auswirkung darauf haben, wie die Zug-Records zu verarbeiten sind?

Danke für den Crashkurs!

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 17.12.2021 17:22:47

OT:
JTH hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 14:55:00
Nachdem es dies Jahr keinen awk-ventskalender gibt, muss die Energie bei dem einen oder der anderen ja irgendwie anders raus :D
:facepalm: Daran habe ich ueberhaupt nicht gedacht (und wohl auch sonst niemand), sonst haetten wir das natuerlich wieder machen koennen ... in irgendeiner Form.

Aber wenigstens versorgen uns heinz und nixblick ja mit schoenen Programmierprojekten. :THX:

... und wir lauern alle hier, ganz heiss darauf, nixblick zu helfen. Hoffentlich will der ganz viel lernen ... dann bekommt er naemlich einen Intensivst-awk-Kurs von uns verpasst. Geballte Ladung! :mrgreen:

(Aeh, wirkt das eigentlich abschreckend? :roll: ;-) )
Use ed once in a while!

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von tobo » 17.12.2021 17:51:32

hikaru hat geschrieben: ↑ zum Beitrag ↑
17.12.2021 17:21:36
Können bestimmte Schlüsselwörter im Header eine Auswirkung darauf haben, wie die Zug-Records zu verarbeiten sind?
Unten stehen die Züge und oben im Header steht, wer, wann, wo, warum (und was einem noch so wichtig ist) diese Züge gemacht hat/wurden. Egal was oben im Header steht, auf das Untere hat das keine (verändernde) Wirkung.

Wobei mir gerade noch einfällt: Kampflose Partien haben einen ausgefüllten Header, aber keine Züge, sondern nur ein Ergebnis.

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von nixblick » 20.12.2021 12:57:08

Hallo,
am Wochenende steht Familie im Vordergrund, daher bin ich so still... Kann nur unter der Woche weitermachen.

Noch Anmerkungen von mir zum Austausch. Kommentare in der Partie sind möglich. Das können Wörter sein, oder einfach Varianten (also noch mehr Züge). Man kann bei Lichess aber unkommentierte Partien herunterladen - auch wenn sie kommentiert sind, daher habe ich diesen Fall ausgeblendet. Mein Horizont würde der Fall auf jeden Fall übersteigen. Wer Spaß daran hat, kann das natürlich ausprobieren - muss aber bis 24.12. fertig sonst ungültig für #awknotfalladventskalenderbonus :lol:

Die Leerzeichen sind LaTeX bzw. dem Plugin egal. Also "1.Sc3" ist genau so möglich wie "1. Sc3". War mir selber gar nicht bewusst, aber durch den Tippfehler von mir beim händischen ändern getestet.

Zum inhaltlichen. Mit awk freunde ich mich immer mehr an. Mit TR bekomm ich keine "Halbzüge" hin (so nennt man den Zug von Weiß bzw. Schwarz). Mit TR kann ich nur "1." - "Sc3" bspw. getrennt voneinander auswerten... brauche aber doch den gesamten Ausdruck, also den ganzen Halbzug oder? So stell ich es mir zumindest bisher vor. Die Halbzüge auslesen und an die richtige Stelle bringen - in der Ausgabe.

Danke und Beste Grüße
nixblick

!Melde mich früher oder später wieder :)

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

Re: Lichess PGN -> LaTeX -> PDF

Beitrag von Meillo » 20.12.2021 13:09:24

Danke fuer das Update.
nixblick hat geschrieben: ↑ zum Beitrag ↑
20.12.2021 12:57:08
Zum inhaltlichen. Mit awk freunde ich mich immer mehr an. Mit TR bekomm ich keine "Halbzüge" hin (so nennt man den Zug von Weiß bzw. Schwarz). Mit TR kann ich nur "1." - "Sc3" bspw. getrennt voneinander auswerten... brauche aber doch den gesamten Ausdruck, also den ganzen Halbzug oder? So stell ich es mir zumindest bisher vor. Die Halbzüge auslesen und an die richtige Stelle bringen - in der Ausgabe.
Mit ``TR'' meinst du wohl das Kommandozeilenprogramm `tr', oder? (Ich hab zwei Minuten rumueberlegen muessen was ``TR'' heissen koennte. :-D ) Du hast recht, damit kann man keine Halbzuege auf Zeilen bringen. 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. Oder genauer gesagt sieht der Abschnitt bei mir so aus:

Code: Alles auswählen

{
        num = $0 + 0
        getline p1
        getline p2
        #printf("### %d - %s - %s", num, p1, p2)
        move(num, p1, p2)
}
(In der Zeile der Zugnummer lese ich also noch zwei weitere Zeilen ein. Dann kommt die auskommentierte Debugausgabe. Dann der Aufruf meiner Zugausgabefunktion `move()'.)

(`$0 + 0' forciert eine Integer-Konvertierung von `$0', wodurch Nicht-Zahl-Zeichen wie der Punkt und Whitespace wegfallen.)

Das ist ein moeglicher Weg, um das zu loesen.


Poste hier doch mal deinen derzeitigen Code, dann wird das fuer uns gleich anschaulicher.
Use ed once in a while!

Benutzeravatar
hikaru
Moderator
Beiträge: 13896
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: 9224
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: 13896
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: 2336
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: 9224
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: 2336
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: 13896
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: 9224
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: 2336
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: 9224
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!

Antworten