diff --git a/bin/main.ml b/bin/main.ml index 6b94c1f..d720843 100644 --- a/bin/main.ml +++ b/bin/main.ml @@ -1,4 +1,4 @@ -open Lwt.Syntax +(* open Lwt.Syntax open Yojson.Safe.Util open Pgn_logic @@ -14,9 +14,11 @@ let cors_middleware next_handler request = if Dream.method_ request = `OPTIONS then ( let response = Dream.response "" in Dream.add_header response "Access-Control-Allow-Origin" allowed_origin; - Dream.add_header response "Access-Control-Allow-Methods" "POST, GET"; + Dream.add_header response "Access-Control-Allow-Methods" + "POST, GET, OPTIONS"; Dream.add_header response "Access-Control-Allow-Headers" "Content-Type, Authorization"; + Dream.add_header response "Access-Control-Max-Age" "86400"; Dream.set_status response `No_Content; Lwt.return response) else @@ -25,6 +27,35 @@ let cors_middleware next_handler request = Lwt.return response let handle_convert request = + let start_time = Unix.gettimeofday () in + + let temp_id = + Int64.to_string (Int64.of_float (Unix.gettimeofday () *. 1000.0)) + in + + let temp_dir = Filename.get_temp_dir_name () in + + let tex_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.tex" temp_id) + in + + let pdf_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.pdf" temp_id) + in + + let log_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.log" temp_id) + in + + let aux_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.aux" temp_id) + in + + let cleanup () = + [ tex_file_path; pdf_file_path; log_file_path; aux_file_path ] + |> List.iter (fun path -> if Sys.file_exists path then Sys.remove path) + in + let* body = Dream.body request in try @@ -59,6 +90,152 @@ let handle_convert request = (Printf.sprintf {|{"type": "error", "message": "%s"}|} (Printexc.to_string exn)) +let () = + Dream.run ~interface:"0.0.0.0" ~port:8080 + @@ Dream.logger @@ cors_middleware + @@ Dream.router + [ + Dream.get "/" (fun request -> + Dream.from_filesystem "static" "doc.html" request); + Dream.get "/health" (fun _ -> Dream.respond "OK"); + Dream.post "/api/v1/pdf" handle_convert; + Dream.get "/api/v1" (fun request -> + Dream.from_filesystem "static" "doc.html" request); + Dream.get "/swagger.json" (fun request -> + Dream.from_filesystem "static" "swagger.json" request); + ] *) + +open Lwt.Syntax +open Yojson.Safe.Util +open Pgn_logic + +let is_dev_mode () = + Array.to_list Sys.argv + |> List.exists (fun arg -> arg = "DREAM_ENV=development") + +let cors_middleware next_handler request = + let allowed_origin = + if is_dev_mode () then "*" else "https://chess-scribe.org" + in + + if Dream.method_ request = `OPTIONS then ( + let response = Dream.response "" in + Dream.add_header response "Access-Control-Allow-Origin" allowed_origin; + Dream.add_header response "Access-Control-Allow-Methods" + "POST, GET, OPTIONS"; + Dream.add_header response "Access-Control-Allow-Headers" + "Content-Type, Authorization"; + Dream.add_header response "Access-Control-Max-Age" "86400"; + Dream.set_status response `No_Content; + Lwt.return response) + else + let* response = next_handler request in + Dream.add_header response "Access-Control-Allow-Origin" allowed_origin; + Lwt.return response + +let handle_convert request = + (* let start_time = Unix.gettimeofday () in *) + let temp_id = + Int64.to_string (Int64.of_float (Unix.gettimeofday () *. 1000.0)) + in + + let temp_dir = Filename.get_temp_dir_name () in + + let tex_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.tex" temp_id) + in + + let pdf_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.pdf" temp_id) + in + + let log_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.log" temp_id) + in + + let aux_file_path = + Filename.concat temp_dir (Printf.sprintf "game-%s.aux" temp_id) + in + + let cleanup () = + [ tex_file_path; pdf_file_path; log_file_path; aux_file_path ] + |> List.iter (fun path -> if Sys.file_exists path then Sys.remove path) + in + + let* body = Dream.body request in + + try + let json = Yojson.Safe.from_string body in + + let pgn = json |> member "pgn" |> to_string in + let diagram_clock = json |> member "diagramClock" |> to_bool in + let diagrams_json = json |> member "diagrams" in + + let diagrams_data = + Yojson.Safe.to_string diagrams_json |> Pgn2tex.parse_diagrams_json + in + + let game_tex = + "\\begin{document}\\begin{multicols}{2}" + ^ Pgn2tex.to_tex pgn ~diagram_data:diagrams_data ~clock:diagram_clock + ^ "\\end{multicols}\\end{document}" + in + + Out_channel.with_open_text tex_file_path (fun oc -> + Out_channel.output_string oc game_tex); + + let argv = + [| + "pdflatex"; + "-fmt"; + "./preambles/chess"; + "-interaction=nonstopmode"; + Printf.sprintf "-output-directory=%s" temp_dir; + tex_file_path; + |] + in + + let pid = + Unix.create_process "pdflatex" argv Unix.stdin Unix.stdout Unix.stderr + in + (* let _, process_status = Unix.waitpid [] pid in *) + let _, _ = Unix.waitpid [] pid in + + if Sys.file_exists pdf_file_path then ( + let pdf_content = + In_channel.with_open_bin pdf_file_path In_channel.input_all + in + + cleanup (); + + (* TODO: record_metrics "SUCCESS" start_time; *) + Dream.respond ~status:`Created + ~headers: + [ + ("Content-Disposition", "inline"); + ("Content-Type", "application/pdf"); + ] + pdf_content) + else failwith "PDF generation failed: output file not found on disk" + with + | Type_error (msg, _) -> + cleanup (); + Dream.json ~status:`Bad_Request + (Printf.sprintf + {|{"type": "error", "message": "JSON structure error: %s"}|} msg) + | Yojson.Json_error msg -> + cleanup (); + Dream.json ~status:`Bad_Request + (Printf.sprintf + {|{"type": "error", "message": "Invalid JSON syntax: %s"}|} msg) + | exn -> + cleanup (); + let err_msg = Printexc.to_string exn in + (* TODO: record_metrics "FAIL" start_time err_msg; *) + (* TODO: logger.error err_msg; *) + Dream.json ~status:`Internal_Server_Error + (Printf.sprintf {|{"type": "error", "message": "%s"}|} err_msg) + let () = Dream.run ~interface:"0.0.0.0" ~port:8080 @@ Dream.logger @@ cors_middleware diff --git a/preambles/chess.fmt b/preambles/chess.fmt new file mode 100644 index 0000000..6cd9e9f Binary files /dev/null and b/preambles/chess.fmt differ diff --git a/preambles/chess.log b/preambles/chess.log new file mode 100644 index 0000000..0ecfd2e --- /dev/null +++ b/preambles/chess.log @@ -0,0 +1,691 @@ +This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2022/dev/Debian) (preloaded format=pdflatex 2026.2.2) 17 FEB 2026 15:13 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**&pdflatex ./preambles/chess.tex +(./preambles/chess.tex +LaTeX2e <2021-11-15> patch level 1 +L3 programming layer <2022-01-21> +(/usr/share/texlive/texmf-dist/tex/latex/base/article.cls +Document Class: article 2021/10/04 v1.4n Standard LaTeX document class +(/usr/share/texlive/texmf-dist/tex/latex/base/size10.clo +File: size10.clo 2021/10/04 v1.4n Standard LaTeX file (size option) +) +\c@part=\count185 +\c@section=\count186 +\c@subsection=\count187 +\c@subsubsection=\count188 +\c@paragraph=\count189 +\c@subparagraph=\count190 +\c@figure=\count191 +\c@table=\count192 +\abovecaptionskip=\skip47 +\belowcaptionskip=\skip48 +\bibindent=\dimen138 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2021/04/29 v2.0v Standard LaTeX package +) +(/usr/share/texlive/texmf-dist/tex/latex/base/inputenc.sty +Package: inputenc 2021/02/14 v1.3d Input encoding file +\inpenc@prehook=\toks16 +\inpenc@posthook=\toks17 +) +(/usr/share/texlive/texmf-dist/tex/latex/xskak/xskak.sty +Package: xskak 2019/06/23 version v1.5 extended chess typesetting and parsing + +(/usr/share/texlive/texmf-dist/tex/latex/skak/skak.sty +Package: skak 2018/01/08 v1.5.3 Chess typesetting + +(/usr/share/texlive/texmf-dist/tex/latex/chessfss/chessfss.sty +Package: chessfss 2006/06/14 v1.2a chess font selection scheme + +(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2020/11/24 v1.1c Standard LaTeX ifthen package (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty +Package: xkeyval 2020/11/20 v2.8 package option processing (HA) + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/xkvutils.tex +\XKV@toks=\toks18 +\XKV@tempa@toks=\toks19 + +(/usr/share/texlive/texmf-dist/tex/generic/xkeyval/keyval.tex)) +\XKV@depth=\count193 +File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA) +)) +(/usr/share/texlive/texmf-dist/tex/latex/chessfss/lsbenc.def +File: lsbenc.def 2006/06/09 v1.2 Standard LaTeX file +Now handling font encoding LSB ... +... no UTF-8 mapping file for font encoding LSB +) +(/usr/share/texlive/texmf-dist/tex/latex/chessfss/lsfenc.def +File: lsfenc.def 2006/06/09 v1.2 Standard LaTeX file +Now handling font encoding LSF ... +... no UTF-8 mapping file for font encoding LSF +) +(/usr/share/texlive/texmf-dist/tex/latex/chessfss/lsienc.def +File: lsienc.def 2006/06/09 v1.2 Standard LaTeX file +Now handling font encoding LSI ... +... no UTF-8 mapping file for font encoding LSI +) +\len@cfss@squarewidth=\skip49 +\len@cfss@squaretotalheight=\skip50 +\len@cfss@squaredepth=\skip51 +) +(/usr/share/texlive/texmf-dist/tex/plain/lambda-lists/lambda.sty) +(/usr/share/texlive/texmf-dist/tex/latex/tools/calc.sty +Package: calc 2017/05/25 v4.3 Infix arithmetic (KKT,FJ) +\calc@Acount=\count194 +\calc@Bcount=\count195 +\calc@Adimen=\dimen139 +\calc@Bdimen=\dimen140 +\calc@Askip=\skip52 +\calc@Bskip=\skip53 +LaTeX Info: Redefining \setlength on input line 80. +LaTeX Info: Redefining \addtolength on input line 81. +\calc@Ccount=\count196 +\calc@Cskip=\skip54 +) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2020/02/02 v2.0n Standard LaTeX package +) +\c@fileFrom=\count197 +\c@rankFrom=\count198 +\c@fileTo=\count199 +\c@rankTo=\count266 +\c@ps@inverse=\count267 +\c@ps@knightangle=\count268 +\c@halfmove=\count269 +\c@move=\count270 +\c@helpgobble=\count271 +\c@helpnumber=\count272 +\c@helpnumberMove=\count273 +\squarelength=\skip55 +\square@multiplier=\count274 +\ranklift=\skip56 +LaTeX Font Info: Trying to load font information for LSB+skaknew on input li +ne 1774. + +(/usr/share/texlive/texmf-dist/tex/latex/chessfss/lsbskaknew.fd +File: lsbskaknew.fd 2006/03/31 v1.0 Chess font definitions +) +LaTeX Font Info: Trying to load font information for T1+cmss on input line 1 +774. + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1cmss.fd +File: t1cmss.fd 2019/12/16 v2.5j Standard LaTeX font definitions +) + +LaTeX Font Warning: Font shape `T1/cmss/m/up' undefined +(Font) using `T1/cmss/m/n' instead on input line 1774. + +\store@toks=\toks20 +) (/usr/share/texlive/texmf-dist/tex/latex/xifthen/xifthen.sty +Package: xifthen 2015/11/05 v1.4.0 Extended ifthen features + +(/usr/share/texlive/texmf-dist/tex/latex/ifmtarg/ifmtarg.sty +Package: ifmtarg 2018/04/16 v1.2b check for an empty argument +)) +(/usr/share/texlive/texmf-dist/tex/latex/etoolbox/etoolbox.sty +Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW) +\etb@tempcnta=\count275 +) +(/usr/share/texlive/texmf-dist/tex/latex/chessboard/chessboard.sty +Package: chessboard 2020/11/01 version v1.9 print chessboards + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifpdf.sty +Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead. + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/iftex.sty +Package: iftex 2020/03/06 v1.0d TeX engine tests +)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/frontendlayer/tikz.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgf.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex +\pgfutil@everybye=\toks21 +\pgfutil@tempdima=\dimen141 +\pgfutil@tempdimb=\dimen142 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-common-lists.t +ex)) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def +\pgfutil@abb=\box50 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/pgf.revision.tex) +Package: pgfrcs 2021/05/15 v3.1.9a (3.1.9a) +)) +Package: pgf 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/latex/pgf/basiclayer/pgfcore.sty +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2021/03/04 v1.4d Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 2021/08/11 v1.11 sin cos tan (DPC) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/graphics.cfg +File: graphics.cfg 2016/06/04 v1.11 sample graphics configuration +) +Package graphics Info: Driver file: pdftex.def on input line 107. + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-def/pdftex.def +File: pdftex.def 2020/10/05 v1.2a Graphics/color driver for pdftex +)) +\Gin@req@height=\dimen143 +\Gin@req@width=\dimen144 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex +Package: pgfsys 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex +\pgfkeys@pathtoks=\toks22 +\pgfkeys@temptoks=\toks23 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeysfiltered.code.t +ex +\pgfkeys@tmptoks=\toks24 +)) +\pgf@x=\dimen145 +\pgf@y=\dimen146 +\pgf@xa=\dimen147 +\pgf@ya=\dimen148 +\pgf@xb=\dimen149 +\pgf@yb=\dimen150 +\pgf@xc=\dimen151 +\pgf@yc=\dimen152 +\pgf@xd=\dimen153 +\pgf@yd=\dimen154 +\w@pgf@writea=\write3 +\r@pgf@reada=\read2 +\c@pgf@counta=\count276 +\c@pgf@countb=\count277 +\c@pgf@countc=\count278 +\c@pgf@countd=\count279 +\t@pgf@toka=\toks25 +\t@pgf@tokb=\toks26 +\t@pgf@tokc=\toks27 +\pgf@sys@id@count=\count280 + (/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg +File: pgf.cfg 2021/05/15 v3.1.9a (3.1.9a) +) +Driver file for pgf: pgfsys-pdftex.def + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def +File: pgfsys-pdftex.def 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.de +f +File: pgfsys-common-pdf.def 2021/05/15 v3.1.9a (3.1.9a) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code. +tex +File: pgfsyssoftpath.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgfsyssoftpath@smallbuffer@items=\count281 +\pgfsyssoftpath@bigbuffer@items=\count282 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code. +tex +File: pgfsysprotocol.code.tex 2021/05/15 v3.1.9a (3.1.9a) +)) (/usr/share/texlive/texmf-dist/tex/latex/xcolor/xcolor.sty +Package: xcolor 2021/10/31 v2.13 LaTeX color extensions (UK) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics-cfg/color.cfg +File: color.cfg 2016/01/02 v1.6 sample color configuration +) +Package xcolor Info: Driver file: pdftex.def on input line 227. +Package xcolor Info: Model `cmy' substituted by `cmy0' on input line 1352. +Package xcolor Info: Model `hsb' substituted by `rgb' on input line 1356. +Package xcolor Info: Model `RGB' extended on input line 1368. +Package xcolor Info: Model `HTML' substituted by `rgb' on input line 1370. +Package xcolor Info: Model `Hsb' substituted by `hsb' on input line 1371. +Package xcolor Info: Model `tHsb' substituted by `hsb' on input line 1372. +Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1373. +Package xcolor Info: Model `Gray' substituted by `gray' on input line 1374. +Package xcolor Info: Model `wave' substituted by `hsb' on input line 1375. +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcore.code.tex +Package: pgfcore 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathcalc.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathutil.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathparser.code.tex +\pgfmath@dimen=\dimen155 +\pgfmath@count=\count283 +\pgfmath@box=\box51 +\pgfmath@toks=\toks28 +\pgfmath@stack@operand=\toks29 +\pgfmath@stack@operation=\toks30 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.code.tex +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.basic.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.trigonomet +ric.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.random.cod +e.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.comparison +.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.base.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.round.code +.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.misc.code. +tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfunctions.integerari +thmetics.code.tex))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmathfloat.code.tex +\c@pgfmathroundto@lastzeros=\count284 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfint.code.tex) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepoints.code.te +x +File: pgfcorepoints.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgf@picminx=\dimen156 +\pgf@picmaxx=\dimen157 +\pgf@picminy=\dimen158 +\pgf@picmaxy=\dimen159 +\pgf@pathminx=\dimen160 +\pgf@pathmaxx=\dimen161 +\pgf@pathminy=\dimen162 +\pgf@pathmaxy=\dimen163 +\pgf@xx=\dimen164 +\pgf@xy=\dimen165 +\pgf@yx=\dimen166 +\pgf@yy=\dimen167 +\pgf@zx=\dimen168 +\pgf@zy=\dimen169 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathconstruct. +code.tex +File: pgfcorepathconstruct.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgf@path@lastx=\dimen170 +\pgf@path@lasty=\dimen171 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathusage.code +.tex +File: pgfcorepathusage.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgf@shorten@end@additional=\dimen172 +\pgf@shorten@start@additional=\dimen173 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorescopes.code.te +x +File: pgfcorescopes.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgfpic=\box52 +\pgf@hbox=\box53 +\pgf@layerbox@main=\box54 +\pgf@picture@serial@count=\count285 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoregraphicstate.c +ode.tex +File: pgfcoregraphicstate.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgflinewidth=\dimen174 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransformation +s.code.tex +File: pgfcoretransformations.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgf@pt@x=\dimen175 +\pgf@pt@y=\dimen176 +\pgf@pt@temp=\dimen177 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorequick.code.tex +File: pgfcorequick.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreobjects.code.t +ex +File: pgfcoreobjects.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepathprocessing +.code.tex +File: pgfcorepathprocessing.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorearrows.code.te +x +File: pgfcorearrows.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgfarrowsep=\dimen178 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreshade.code.tex +File: pgfcoreshade.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgf@max=\dimen179 +\pgf@sys@shading@range@num=\count286 +\pgf@shadingcount=\count287 +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreimage.code.tex +File: pgfcoreimage.code.tex 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoreexternal.code. +tex +File: pgfcoreexternal.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgfexternal@startupbox=\box55 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorelayers.code.te +x +File: pgfcorelayers.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcoretransparency.c +ode.tex +File: pgfcoretransparency.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorepatterns.code. +tex +File: pgfcorepatterns.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/basiclayer/pgfcorerdf.code.tex +File: pgfcorerdf.code.tex 2021/05/15 v3.1.9a (3.1.9a) +))) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleshapes.code.tex +File: pgfmoduleshapes.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgfnodeparttextbox=\box56 +) (/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmoduleplot.code.tex +File: pgfmoduleplot.code.tex 2021/05/15 v3.1.9a (3.1.9a) +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-0-65 +.sty +Package: pgfcomp-version-0-65 2021/05/15 v3.1.9a (3.1.9a) +\pgf@nodesepstart=\dimen180 +\pgf@nodesepend=\dimen181 +) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/compatibility/pgfcomp-version-1-18 +.sty +Package: pgfcomp-version-1-18 2021/05/15 v3.1.9a (3.1.9a) +)) (/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgffor.sty +(/usr/share/texlive/texmf-dist/tex/latex/pgf/utilities/pgfkeys.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex)) +(/usr/share/texlive/texmf-dist/tex/latex/pgf/math/pgfmath.sty +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/utilities/pgffor.code.tex +Package: pgffor 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/math/pgfmath.code.tex) +\pgffor@iter=\dimen182 +\pgffor@skip=\dimen183 +\pgffor@stack=\toks31 +\pgffor@toks=\toks32 +)) +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex +Package: tikz 2021/05/15 v3.1.9a (3.1.9a) + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/libraries/pgflibraryplothandlers +.code.tex +File: pgflibraryplothandlers.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgf@plot@mark@count=\count288 +\pgfplotmarksize=\dimen184 +) +\tikz@lastx=\dimen185 +\tikz@lasty=\dimen186 +\tikz@lastxsaved=\dimen187 +\tikz@lastysaved=\dimen188 +\tikz@lastmovetox=\dimen189 +\tikz@lastmovetoy=\dimen190 +\tikzleveldistance=\dimen191 +\tikzsiblingdistance=\dimen192 +\tikz@figbox=\box57 +\tikz@figbox@bg=\box58 +\tikz@tempbox=\box59 +\tikz@tempbox@bg=\box60 +\tikztreelevel=\count289 +\tikznumberofchildren=\count290 +\tikznumberofcurrentchild=\count291 +\tikz@fig@count=\count292 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/modules/pgfmodulematrix.code.tex +File: pgfmodulematrix.code.tex 2021/05/15 v3.1.9a (3.1.9a) +\pgfmatrixcurrentrow=\count293 +\pgfmatrixcurrentcolumn=\count294 +\pgf@matrix@numberofcolumns=\count295 +) +\tikz@expandcount=\count296 + +(/usr/share/texlive/texmf-dist/tex/generic/pgf/frontendlayer/tikz/libraries/tik +zlibrarytopaths.code.tex +File: tikzlibrarytopaths.code.tex 2021/05/15 v3.1.9a (3.1.9a) +))) +\len@board@tempx=\skip57 +\len@board@tempy=\skip58 +\c@cnt@board@file=\count297 +\c@cnt@board@rank=\count298 +\c@cnt@board=\count299 +\c@filelabel=\count300 +\c@ranklabel=\count301 + +(/usr/share/texlive/texmf-dist/tex/latex/chessboard/chessboard-keys-main.sty +File: chessboard-keys-main.sty 2020/11/01 version v1.9 key definitions for ches +sboard.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/chessboard/chessboard-keys-pgf.sty +File: chessboard-keys-pgf.sty 2020/11/01 version v1.9 key definitions for chess +board.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/chessboard/chessboard-pgf.sty +File: chessboard-pgf.sty 2020/11/01 version v1.9 pgf code for chessboard.sty +)) +(/usr/share/texlive/texmf-dist/tex/latex/xskak/xskak-keys.sty +File: xskak-keys.sty 2019/06/23 version v1.5 key definitions for xskak.sty +) +(/usr/share/texlive/texmf-dist/tex/latex/xskak/xskak-nagdef.sty +File: xskak-nagdef.sty 2019/06/23 version v1.5 nag definitions for xskak.sty +) +LaTeX Info: Redefining \variation on input line 1473. +) +(/usr/share/texlive/texmf-dist/tex/latex/tools/multicol.sty +Package: multicol 2021/10/28 v1.9b multicolumn formatting (FMi) +\c@tracingmulticols=\count302 +\mult@box=\box61 +\multicol@leftmargin=\dimen193 +\c@unbalance=\count303 +\c@collectmore=\count304 +\doublecol@number=\count305 +\multicoltolerance=\count306 +\multicolpretolerance=\count307 +\full@width=\dimen194 +\page@free=\dimen195 +\premulticols=\dimen196 +\postmulticols=\dimen197 +\multicolsep=\skip59 +\multicolbaselineskip=\skip60 +\partial@page=\box62 +\last@line=\box63 +\maxbalancingoverflow=\dimen198 +\mult@rightbox=\box64 +\mult@grightbox=\box65 +\mult@firstbox=\box66 +\mult@gfirstbox=\box67 +\@tempa=\box68 +\@tempa=\box69 +\@tempa=\box70 +\@tempa=\box71 +\@tempa=\box72 +\@tempa=\box73 +\@tempa=\box74 +\@tempa=\box75 +\@tempa=\box76 +\@tempa=\box77 +\@tempa=\box78 +\@tempa=\box79 +\@tempa=\box80 +\@tempa=\box81 +\@tempa=\box82 +\@tempa=\box83 +\@tempa=\box84 +\@tempa=\box85 +\@tempa=\box86 +\@tempa=\box87 +\@tempa=\box88 +\@tempa=\box89 +\@tempa=\box90 +\@tempa=\box91 +\@tempa=\box92 +\@tempa=\box93 +\@tempa=\box94 +\@tempa=\box95 +\@tempa=\box96 +\@tempa=\box97 +\@tempa=\box98 +\@tempa=\box99 +\@tempa=\box100 +\@tempa=\box101 +\@tempa=\box102 +\@tempa=\box103 +\c@minrows=\count308 +\c@columnbadness=\count309 +\c@finalcolumnbadness=\count310 +\last@try=\dimen199 +\multicolovershoot=\dimen256 +\multicolundershoot=\dimen257 +\mult@nat@firstbox=\box104 +\colbreak@box=\box105 +\mc@col@check@num=\count311 +) +(/usr/share/texlive/texmf-dist/tex/latex/parskip/parskip.sty +Package: parskip 2021-03-14 v2.0h non-zero parskip adjustments + +(/usr/share/texlive/texmf-dist/tex/latex/kvoptions/kvoptions.sty +Package: kvoptions 2020-10-07 v3.14 Key value format for package options (HO) + +(/usr/share/texlive/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty +Package: ltxcmds 2020-05-10 v1.25 LaTeX kernel commands for general use (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty +Package: kvsetkeys 2019/12/15 v1.18 Key value parser (HO) +))) +(/usr/share/texlive/texmf-dist/tex/latex/geometry/geometry.sty +Package: geometry 2020/01/02 v5.9 Page Geometry + +(/usr/share/texlive/texmf-dist/tex/generic/iftex/ifvtex.sty +Package: ifvtex 2019/10/25 v1.7 ifvtex legacy package. Use iftex instead. +) +\Gm@cnth=\count312 +\Gm@cntv=\count313 +\c@Gm@tempcnt=\count314 +\Gm@bindingoffset=\dimen258 +\Gm@wd@mp=\dimen259 +\Gm@odd@mp=\dimen260 +\Gm@even@mp=\dimen261 +\Gm@layoutwidth=\dimen262 +\Gm@layoutheight=\dimen263 +\Gm@layouthoffset=\dimen264 +\Gm@layoutvoffset=\dimen265 +\Gm@dimlist=\toks33 +) ) +Beginning to dump on file ./preambles/chess.fmt + (preloaded format=./preambles/chess 2026.2.17) +38907 strings of total length 741210 +619761 memory locations dumped; current usage is 519&614766 +35125 multiletter control sequences +\font\nullfont=nullfont +\font\c__fp_exp_intarray=cmr10 at 0.00002pt +\font\c__fp_trig_intarray=cmr10 at 0.00003pt +\font\c_initex_cctab=cmr10 at 0.00005pt +\font\c_other_cctab=cmr10 at 0.00006pt +\font\c_str_cctab=cmr10 at 0.00008pt +\font\g__regex_state_active_intarray=cmr10 at 0.00009pt +\font\g__regex_thread_info_intarray=cmr10 at 0.0001pt +\font\g__regex_submatch_prev_intarray=cmr10 at 0.00012pt +\font\g__regex_submatch_begin_intarray=cmr10 at 0.00014pt +\font\g__regex_submatch_end_intarray=cmr10 at 0.00015pt +\font\g__regex_submatch_case_intarray=cmr10 at 0.00017pt +\font\g__regex_balance_intarray=cmr10 at 0.00018pt +\font\OMX/cmex/m/n/10=cmex10 +\font\tenln=line10 +\font\tenlnw=linew10 +\font\tencirc=lcircle10 +\font\tencircw=lcirclew10 +\font\OT1/cmr/m/n/5=cmr5 +\font\OT1/cmr/m/n/7=cmr7 +\font\OT1/cmr/m/n/10=cmr10 +\font\OML/cmm/m/it/5=cmmi5 +\font\OML/cmm/m/it/7=cmmi7 +\font\OML/cmm/m/it/10=cmmi10 +\font\OMS/cmsy/m/n/5=cmsy5 +\font\OMS/cmsy/m/n/7=cmsy7 +\font\OMS/cmsy/m/n/10=cmsy10 +\font\c_code_cctab=cmr10 at 0.0002pt +\font\c_document_cctab=cmr10 at 0.00021pt +\font\T1/cmr/m/n/10=ecrm1000 +\font\LSB/skaknew/m/n/20=SkakNew-Diagram at 20.0pt +\font\T1/cmss/m/up/10=ecss1000 +470936 words of font info for 31 preloaded fonts +1141 hyphenation exceptions +Hyphenation trie of length 419883 has 8811 ops out of 35111 + 424 for language 86 + 852 for language 84 + 53 for language 83 + 377 for language 82 + 54 for language 81 + 110 for language 80 + 19 for language 79 + 420 for language 78 + 127 for language 77 + 38 for language 74 + 58 for language 73 + 195 for language 71 + 119 for language 70 + 5 for language 68 + 14 for language 67 + 21 for language 65 + 37 for language 63 + 137 for language 62 + 36 for language 61 + 7 for language 60 + 38 for language 59 + 71 for language 58 + 21 for language 57 + 63 for language 53 + 194 for language 52 + 265 for language 50 + 6 for language 48 + 23 for language 47 + 229 for language 45 + 27 for language 43 + 143 for language 41 + 224 for language 39 + 40 for language 38 + 66 for language 37 + 43 for language 36 + 62 for language 35 + 31 for language 34 + 38 for language 33 + 89 for language 32 + 147 for language 31 + 145 for language 30 + 185 for language 29 + 77 for language 28 + 12 for language 27 + 206 for language 26 + 76 for language 25 + 248 for language 24 + 25 for language 23 + 852 for language 22 + 216 for language 21 + 7 for language 20 + 148 for language 18 + 97 for language 17 + 235 for language 16 + 58 for language 15 + 432 for language 14 + 50 for language 13 + 138 for language 12 + 113 for language 11 + 60 for language 9 + 207 for language 8 + 21 for language 7 + 3 for language 6 + 37 for language 5 + 39 for language 4 + 18 for language 3 + 2 for language 1 + 181 for language 0 +0 words of pdfTeX memory +3 indirect objects +No pages of output. +PDF statistics: + 3 PDF objects out of 1000 (max. 8388607) + 0 named destinations out of 1000 (max. 500000) + 1 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/preambles/chess.tex b/preambles/chess.tex new file mode 100644 index 0000000..ff1045b --- /dev/null +++ b/preambles/chess.tex @@ -0,0 +1,15 @@ +\documentclass{article} + +% \usepackage[T1]{fontenc} +% \usepackage[utf8]{inputenc} + +\usepackage{xskak} +\usepackage{multicol} +\usepackage{parskip} + +\usepackage[a4paper]{geometry} + +\geometry{left=1.25cm,right=1.25cm,top=1.5cm,bottom=1.5cm,columnsep=1.2cm} +\setlength{\parindent}{0pt} + +\dump \ No newline at end of file