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

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: 9241
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: 9241
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: 9241
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: 3334
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