\NeedsTeXFormat{LaTeX2e}[2020/10/01] \ProvidesPackage{pgf-go}[2026/10/23 v0.2026.10.23 Go diagrams with PGF] \RequirePackage{tikz} \usetikzlibrary{patterns, arrows.meta} \RequirePackage{xparse} \definecolor{pgfgo}{RGB}{220,179,92} \ExplSyntaxOn \cs_new_protected:Npn \pgfgo_set:n #1 {\keys_set:nn {pgfgo} {#1}} \cs_generate_variant:Nn \pgfgo_set:n {e} \let\pgfgoset\pgfgo_set:n \NewDocumentCommand{\pgfgosetallplayers}{m}{\keys_set:nn {pgfgo / players}{all = {#1}}} %LOS MODULOS SE BUSCAN EN LA MISMA CARPETA QUE pgf-go.sty (POR EJ. \usepackage{../../latex/pgf-go}). %SI NO ESTAN AHI, SE BUSCAN EN EL PATH DE TEX. \tl_const:Ne \c__pgfgo_path_tl {\CurrentFilePath} \cs_new_protected:Npn \__pgfgo_load_module:n #1 { \tl_if_empty:NTF \c__pgfgo_path_tl {\file_input:n {#1 .sty}} { \file_if_exist:nTF {\c__pgfgo_path_tl / #1 .sty} {\file_input:n {\c__pgfgo_path_tl / #1 .sty}} {\file_input:n {#1 .sty}} } \ExplSyntaxOn } \cs_generate_variant:Nn \__pgfgo_load_module:n {e} %EJECUTA #2 SI EL MODULO #1 NO ESTA NI JUNTO A pgf-go.sty NI EN EL PATH DE TEX. \cs_new_protected:Npn \__pgfgo_module_if_exist:nF #1#2 { \file_if_exist:nF {#1 .sty} { \tl_if_empty:NTF \c__pgfgo_path_tl {#2} {\file_if_exist:nF {\c__pgfgo_path_tl / #1 .sty} {#2}} } } %KERNEL DE CALCULO: \usepackage[kernel = expl3 | lua]{pgf-go}. VER pgf-go-kernel.sty. %POR DEFECTO, lua CON LuaLaTeX Y expl3 CON LOS DEMAS MOTORES. \tl_new:N \g_pgfgo_kernel_tl %IDIOMA DE LOS TEXTOS: \usepackage[lang = es]{pgf-go}. VER pgf-go-lang.sty. \tl_new:N \g__pgfgo_lang_option_tl \keys_define:nn {pgfgo / package} { kernel .choices:nn = {expl3, lua} {\tl_gset_eq:NN \g_pgfgo_kernel_tl \l_keys_choice_tl}, lang .tl_gset:N = \g__pgfgo_lang_option_tl, } \sys_if_engine_luatex:TF {\tl_gset:Nn \g_pgfgo_kernel_tl {lua}} {\tl_gset:Nn \g_pgfgo_kernel_tl {expl3}} \IfFormatAtLeastTF {2022-06-01} {\ProcessKeyOptions [pgfgo / package]} {\RequirePackage{l3keys2e}\ProcessKeysOptions{pgfgo / package}} %VARIANTE QUE USAN LOS MODULOS (LOS l3kernel RECIENTES YA LA TIENEN). \prg_generate_conditional_variant:Nnn \regex_match:nn {nV} {T, F, TF} %LAS VARIABLES DEL ESTILO: LAS LOCALES (l_pgfgo..., l__pgfgo...) QUE CREAN LOS MODULOS DE ESTILO, SALVO LAS %DE LAS VISTAS Y DE resume. UN goban CON NOMBRE GUARDA SUS VALORES, Y \pgfgoview LOS VUELVE A PONER (VER %\pgfgo_style_save: EN pgf-go-goban.sty). MIENTRAS SE CARGAN ESOS MODULOS, \tl_new:N, \bool_new:N, ... %TAMBIEN ANOTAN LA VARIABLE. \seq_new:N \g_pgfgo_style_vars_seq \bool_new:N \g__pgfgo_style_register_bool \clist_const:Nn \c__pgfgo_style_types_clist {tl, str, clist, seq, prop, bool, int, dim, skip, fp} \clist_const:Nn \c__pgfgo_style_modules_clist {pgf-go-images, pgf-go-players, pgf-go-stones, pgf-go-goban, pgf-go-marks, pgf-go-lines, pgf-go-territory} \cs_new_protected:Npn \__pgfgo_style_register:nN #1#2 { \bool_if:NT \g__pgfgo_style_register_bool { \exp_args:Ne \__pgfgo_style_register:nnN {\cs_to_str:N #2} {#1} #2 } } \cs_new_protected:Npn \__pgfgo_style_register:nnN #1#2#3 { \bool_lazy_or:nnT {\str_if_eq_p:ee {\str_range:nnn {#1} {1} {7}} {l_pgfgo}} {\str_if_eq_p:ee {\str_range:nnn {#1} {1} {8}} {l__pgfgo}} { \str_if_in:nnF {#1} {view} { \str_if_in:nnF {#1} {resume} {\seq_gput_right:Nn \g_pgfgo_style_vars_seq {{#2} #3}} } } } \clist_map_inline:Nn \c__pgfgo_style_types_clist { \cs_new_eq:cc {__pgfgo_style_ #1 _new:N} {#1_new:N} \cs_new_protected:cpn {__pgfgo_style_ #1 _register:N} ##1 { \use:c {__pgfgo_style_ #1 _new:N} ##1 \__pgfgo_style_register:nN {#1} ##1 } } \clist_map_inline:Nn \c__pgfgo_style_types_clist {\cs_gset_eq:cc {#1_new:N} {__pgfgo_style_ #1 _register:N}} \clist_map_inline:nn { pgf-go-kernel, pgf-go-lang, pgf-go-remember, pgf-go-images, pgf-go-profiles, pgf-go-players, pgf-go-stones, pgf-go-goban, pgf-go-marks, pgf-go-lines, pgf-go-territory, pgf-go-layout, pgf-go-sgf, pgf-go-store } { \clist_if_in:NnTF \c__pgfgo_style_modules_clist {#1} {\bool_gset_true:N \g__pgfgo_style_register_bool} {\bool_gset_false:N \g__pgfgo_style_register_bool} \__pgfgo_load_module:n {#1} } \bool_gset_false:N \g__pgfgo_style_register_bool \clist_map_inline:Nn \c__pgfgo_style_types_clist {\cs_gset_eq:cc {#1_new:N} {__pgfgo_style_ #1 _new:N}} \keys_define:nn {pgfgo}{ goban .code:n = {\keys_set:nn {pgfgo / goban} {#1}}, view .code:n = {\keys_set:nn {pgfgo / view} {#1}}, stone .code:n = {\keys_set:nn {pgfgo / players} {all = {stone = {#1}}}}, move .code:n = {\keys_set:nn {pgfgo / players} {all = {move = {#1}}}}, mark .code:n = {\keys_set:nn {pgfgo / mark} {#1}}, territory .code:n = {\keys_set:nn {pgfgo / territory} {#1}}, players .code:n = {\keys_set:nn {pgfgo / players} {#1}}, } %EL ESTILO INICIAL: EL PERFIL default, QUE ES TAMBIEN A LO QUE VUELVE profile ANTES DE PONER UN PERFIL. \pgfgo_set:e {goban = {size = 9}} \pgfgo_profile_use_profile:n {default} \pgfgo_profile_save_reset: \pgfgo_style_save_initial: \ExplSyntaxOff