\ExplSyntaxOn
\usepackage{tikz}
\bool_set_false:N\l_pgfgo_goban_partial_bool
\tl_set:Nn\l_pgfgo_goban_from_x_tl{1}
\tl_set:Nn\l_pgfgo_goban_from_y_tl{1}
\tl_set:Nn\l_pgfgo_goban_to_x_tl{9}
\tl_set:Nn\l_pgfgo_goban_to_y_tl{9}
%GRID
\bool_set_true:N\l_pgfgo_goban_grid_bool
\dim_new:N\l_pgfgo_goban_grid_line_width_dim
\dim_new:N\l_pgfgo_goban_grid_x_sep_dim
\dim_new:N\l_pgfgo_goban_grid_y_sep_dim
%BORDER
\bool_set_true:N\l_pgfgo_goban_border_bool
\bool_set_true:N\l_pgfgo_goban_border_line_bool
\bool_set_true:N\l_pgfgo_goban_border_fill_bool
\dim_new:N\l_pgfgo_goban_border_sep_dim
\dim_set:Nn\l_pgfgo_goban_border_sep_dim{\fp_to_dim:n{\l_pgfgo_players_stone_radius_dim * 1.5}}
\dim_new:N\l_pgfgo_goban_border_line_width_dim
\dim_new:N\l_pgfgo_goban_border_rounded_corners_dim
\dim_new:N\l_pgfgo_goban_border_inner_rounded_corners_dim
%LABEL
\tl_set:Nn\l_pgfgo_goban_labels_color_tl{black}
\dim_new:N\l_pgfgo_goban_labels_sep_dim
\dim_set:Nn\l_pgfgo_goban_labels_sep_dim{0.5em}
\bool_set_false:N\l_pgfgo_goban_labels_pos_north_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_east_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_south_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_west_bool
\tl_new:N \l_pgfgo_goban_label_font_tl
%LAYERS
\pgfdeclarelayer{pgfgo_layer_goban_border}
\pgfdeclarelayer{pgfgo_layer_goban_grid}
\pgfdeclarelayer{pgfgo_layer_goban_labels}
\pgfdeclarelayer{pgfgo_layer_territory}
\pgfdeclarelayer{pgfgo_layer_mark_shadow}
\pgfdeclarelayer{pgfgo_layer_stone}
\pgfdeclarelayer{pgfgo_layer_stone_mark}
\pgfdeclarelayer{pgfgo_layer_mark}
\keys_define:nn {pgfgo / goban}{
new~remember .code:n = {
\seq_gclear:N\l_pgfgo_goban_elements_stack_seq
\bool_set_true:N\l_pgfgo_goban_remember_new_bool
\bool_set_true:N\l_pgfgo_goban_remember_add_bool
\pgfgo_goban_remember_all:
},
remember .code:n = {
\bool_set_false:N\l_pgfgo_goban_remember_new_bool
\bool_set_true:N\l_pgfgo_goban_remember_add_bool
\pgfgo_goban_remember_all:
},
forget .code:n = {
\bool_set_false:N\l_pgfgo_goban_remember_new_bool
\bool_set_false:N\l_pgfgo_goban_remember_add_bool
\pgfgo_goban_remember_nothing:
},
resume .code:n = {\bool_set_true:N\l_pgfgo_goban_resume_bool},
grid .code:n = {\keys_set:nx{pgfgo / goban / grid} {#1}},
border .code:n = {\keys_set:nx{pgfgo / goban / border} {#1}}, %DEPRECATED
background .code:n = {\keys_set:nx{pgfgo / goban / background} {#1}},
label .code:n = {\keys_set:nx{pgfgo / goban / label} {#1}},
partial .code:n = { \bool_set_true:N\l_pgfgo_goban_partial_bool
\keys_set:nx{pgfgo / goban / partial} {#1}},
scale .tl_set:N = \l_pgfgo_goban_scale_tl,
scale .initial:n = {1},
size .code:n = {\pgfgo_parse_goban_size:n{#1}},
use~i .bool_set:N = \l_pgfgo_use_i_bool,
use~i .default:n = {true},
unknown .code:n = {\pgfgo_parse_goban_size:V\l_keys_key_str},%INTERNTA PARSEAR EL SIZE
}
\keys_define:nn {pgfgo / goban / grid}{
false .bool_set:N = \l_pgfgo_goban_grid_bool,
false .default:n = {false},
line .code:n = {\keys_set:nn {pgfgo / goban / grid / line} {#1}},
x~sep .dim_set:N = \l_pgfgo_goban_grid_x_sep_dim,
y~sep .dim_set:N = \l_pgfgo_goban_grid_y_sep_dim,
sep .code:n = {\keys_set:nn{pgfgo / goban / grid}{x~sep = #1, y~sep = #1}},
sep .initial:n = {1.25em},
}
\keys_define:nn {pgfgo / goban / grid / line} {
color .tl_set:N = \l_pgfgo_goban_grid_color_tl,
color .initial:n = {black},
opacity .tl_set:N = \l_pgfgo_goban_grid_opacity_tl,
opacity .initial:n = {1},
width .dim_set:N = \l_pgfgo_goban_grid_line_width_dim,
width .initial:n = {0.55pt}
}
\keys_define:nn {pgfgo / goban / background}{
false .bool_set:N = \l_pgfgo_goban_border_bool,
false .default:n = {false},
sep .dim_set:N = \l_pgfgo_goban_border_sep_dim,
sep .initial:n = {0.825em},
line .code:n = {\keys_set:nn {pgfgo / goban / background / line} {#1}},
fill .code:n = {\keys_set:nn {pgfgo / goban / background / fill} {#1}},
rounded~corners .code:n = {\keys_set:nn {pgfgo / goban / background / rounded~corners} {#1}},
drop~shadow .code:n = {\keys_set:nn {pgfgo / goban / background / drop~shadow} {#1}},
drop~shadow .default:n = {true}
}
\keys_define:nn {pgfgo / goban / background / rounded~corners } {
inner .dim_set:N = \l_pgfgo_goban_border_inner_rounded_corners_dim,
inner .initial:n = {0pt},
outer .dim_set:N = \l_pgfgo_goban_border_rounded_corners_dim,
outer .initial:n = {0pt},
unknown .code:n = {
\dim_set:Nn\l_pgfgo_goban_border_rounded_corners_dim {\l_keys_key_str} \dim_set:Nn\l_pgfgo_goban_border_inner_rounded_corners_dim {\l_keys_key_str}
},
}
\bool_new:N \l_pgfgo_goban_background_drop_shadow_bool
\fp_new:N \l_pgfgo_goban_background_drop_shadow_angle_fp
\dim_new:N \l_pgfgo_goban_background_drop_shadow_offset_dim
\fp_new:N \l_pgfgo_goban_background_drop_shadow_opacity_fp
\tl_new:N \l_pgfgo_goban_background_drop_shadow_color_tl
\keys_define:nn {pgfgo / goban / background / drop~shadow} {
true .bool_set:N = \l_pgfgo_goban_background_drop_shadow_bool,
true .default:n = {true},
false .bool_set:N = \l_pgfgo_goban_background_drop_shadow_bool,
false .default:n = {false},
angle .fp_set:N = \l_pgfgo_goban_background_drop_shadow_angle_fp,
angle .initial:n = {-45},
offset .dim_set:N = \l_pgfgo_goban_background_drop_shadow_offset_dim,
offset .initial:n = {1.5pt},
opacity .fp_set:N = \l_pgfgo_goban_background_drop_shadow_opacity_fp,
opacity .initial:n = {0.5},
color .tl_set:N = \l_pgfgo_goban_background_drop_shadow_color_tl,
color .initial:n = {black},
}
%
%\keys_define:nn {pgfgo / goban / background / custom}{
% source .tl_set:N = ,
%
% scale .pf_set:N = ,
% x~scale .pf_set:N = ,
% y~scale .pf_set:N = ,
% x~shift .pf_set:N = ,
% y~shift .pf_set:N = ,
%}
\keys_define:nn {pgfgo / goban / background / line}{
color .tl_set:N = \l_pgfgo_goban_border_color_tl,
color .initial:n = {black},
opacity .tl_set:N = \l_pgfgo_goban_border_opacity_tl,
opacity .initial:n = {1},
width .dim_set:N = \l_pgfgo_goban_border_line_width_dim,
width .initial:n = {0.75pt},
false .code:n = {\bool_set_false:N\l_pgfgo_goban_border_line_bool},
true .code:n = {\bool_set_true:N\l_pgfgo_goban_border_line_bool},
}
\keys_define:nn {pgfgo / goban / background / fill}{
color .tl_set:N = \l_pgfgo_goban_border_fill_color_tl,
color .initial:n = {white},
opacity .tl_set:N = \l_pgfgo_goban_border_fill_opacity_tl,
opacity .initial:n = {1},
false .code:n = {\bool_set_false:N\l_pgfgo_goban_border_fill_bool},
true .code:n = {\bool_set_true:N\l_pgfgo_goban_border_fill_bool},
}
\keys_define:nn {pgfgo / goban / label} {
false .code:n = { \bool_set_false:N\l_pgfgo_goban_labels_pos_north_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_east_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_south_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_west_bool
},
text~color .tl_set:N = \l_pgfgo_goban_labels_color_tl,
sep .dim_set:N = \l_pgfgo_goban_labels_sep_dim,
font .tl_set:N = \l_pgfgo_goban_label_font_tl,
at .code:n = {\keys_set:nx{pgfgo / goban / label / at} {#1}}
}
\keys_define:nn {pgfgo / goban / label / at} {
all .code:n = {
\bool_set_true:N\l_pgfgo_goban_labels_pos_north_bool
\bool_set_true:N\l_pgfgo_goban_labels_pos_east_bool
\bool_set_true:N\l_pgfgo_goban_labels_pos_south_bool
\bool_set_true:N\l_pgfgo_goban_labels_pos_west_bool
},
none .code:n = {
\bool_set_false:N\l_pgfgo_goban_labels_pos_north_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_east_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_south_bool
\bool_set_false:N\l_pgfgo_goban_labels_pos_west_bool
},
north .bool_set:N = \l_pgfgo_goban_labels_pos_north_bool,
north .default:n = {true},
east .bool_set:N = \l_pgfgo_goban_labels_pos_east_bool,
east .default:n = {true},
south .bool_set:N = \l_pgfgo_goban_labels_pos_south_bool,
south .default:n = {true},
west .bool_set:N = \l_pgfgo_goban_labels_pos_west_bool,
west .default:n = {true},
above .bool_set:N = \l_pgfgo_goban_labels_pos_north_bool,
above .default:n = {true},
right .bool_set:N = \l_pgfgo_goban_labels_pos_east_bool,
right .default:n = {true},
below .bool_set:N = \l_pgfgo_goban_labels_pos_south_bool,
below .default:n = {true},
left .bool_set:N = \l_pgfgo_goban_labels_pos_west_bool,
left .default:n = {true},
}
\int_new:N\l_pgfgo_goban_tmp_from_x_int
\int_new:N\l_pgfgo_goban_tmp_from_y_int
\int_new:N\l_pgfgo_goban_tmp_to_x_int
\int_new:N\l_pgfgo_goban_tmp_to_y_int
\keys_define:nn {pgfgo / goban / partial}{
from .code:n = {
\pgfgo_parse_goban_partial_from:n{#1}
\pgfgo_parse_coordinate:x {\l_temp_a_tl}
\int_set:Nn\l_pgfgo_goban_tmp_from_x_int {\l_pgfgo_parsed_x_coordinate_tl}
\int_set:Nn\l_pgfgo_goban_tmp_from_y_int {\l_pgfgo_parsed_y_coordinate_tl}
\pgfgo_parse_coordinate:x {\l_temp_b_tl}
\int_set:Nn\l_pgfgo_goban_tmp_to_x_int {\l_pgfgo_parsed_x_coordinate_tl}
\int_set:Nn\l_pgfgo_goban_tmp_to_y_int {\l_pgfgo_parsed_y_coordinate_tl}
},
false .bool_set:N = \l_pgfgo_goban_partial_bool,
false .default:n = {false}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------------------------goban-----------------------------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\int_new:N \l_pgfgo_goban_to_x_int
\int_new:N \l_pgfgo_goban_to_y_int
\int_new:N \l_pgfgo_goban_from_x_int
\int_new:N \l_pgfgo_goban_from_y_int
\cs_generate_variant:Nn \int_compare_p:nNn {fNn}
\cs_generate_variant:Nn \__pgfgo_goban:nnn {nVV}
\int_new:N\l_pgfgo_goban_labels_current_x_int
\int_new:N\l_pgfgo_goban_labels_current_y_int
\cs_new:Npn\__pgfgo_goban:nnn #1#2#3 {
\group_begin:
\pgfsetlayers{
pgfgo_layer_goban_border,
pgfgo_layer_goban_grid,
pgfgo_layer_goban_labels,
pgfgo_layer_territory,
pgfgo_layer_mark_shadow,
pgfgo_layer_stone,
pgfgo_layer_stone_mark,
pgfgo_layer_mark,
main
}
%---------------------------------------------------
\bool_if:NTF\l_pgfgo_goban_partial_bool{
\int_set:Nn\l_pgfgo_goban_from_x_int {\int_min:nn{\l_pgfgo_goban_tmp_from_x_int}{\l_pgfgo_goban_tmp_to_x_int}}
\int_set:Nn\l_pgfgo_goban_from_y_int {\int_min:nn{\l_pgfgo_goban_tmp_from_y_int}{\l_pgfgo_goban_tmp_to_y_int}}
\int_set:Nn\l_pgfgo_goban_to_x_int {\int_max:nn{\l_pgfgo_goban_tmp_from_x_int}{\l_pgfgo_goban_tmp_to_x_int}}
\int_set:Nn\l_pgfgo_goban_to_y_int {\int_max:nn{\l_pgfgo_goban_tmp_from_y_int}{\l_pgfgo_goban_tmp_to_y_int}}
}{
\int_set:Nn\l_pgfgo_goban_from_x_int {1}
\int_set:Nn\l_pgfgo_goban_from_y_int {1}
\int_set:Nn\l_pgfgo_goban_to_x_int {#2}
\int_set:Nn\l_pgfgo_goban_to_y_int {#3}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%-----------------TIKZ PICTURE---------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\tikzpicture
\pgfsetxvec{\pgfpoint{ \l_pgfgo_goban_grid_x_sep_dim}{0}}
\pgfsetyvec{\pgfpoint{0}{ \l_pgfgo_goban_grid_y_sep_dim}}
\pgftransformscale{\l_pgfgo_goban_scale_tl}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------BORDER AND FILL-------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfonlayer{pgfgo_layer_goban_border}
\bool_if:NT\l_pgfgo_goban_border_bool{
\pgfscope
\pgfsetlinewidth{\l_pgfgo_goban_border_line_width_dim}
\pgfsetstrokecolor{\l_pgfgo_goban_border_color_tl}
\pgfsetstrokeopacity{\l_pgfgo_goban_border_opacity_tl}
\pgfsetfillcolor{\l_pgfgo_goban_border_fill_color_tl}
\pgfsetfillopacity{\l_pgfgo_goban_border_fill_opacity_tl}
% \pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}
%--------DROP SHADOW
\bool_if:NT \l_pgfgo_goban_background_drop_shadow_bool {
\pgfscope
\pgftransformshift{
\pgfpointpolar
{\fp_to_decimal:N\l_pgfgo_goban_background_drop_shadow_angle_fp}
{\l_pgfgo_goban_background_drop_shadow_offset_dim}}
\pgfpathmoveto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_from_x_int}{\l_pgfgo_goban_from_y_int}}{
\pgfpoint{-\l_pgfgo_goban_border_sep_dim}{-\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_to_x_int}={#2} &&
\int_compare_p:nNn{\l_pgfgo_goban_from_y_int}={1}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathlineto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_to_x_int}{\l_pgfgo_goban_from_y_int}}{
\pgfpoint{\l_pgfgo_goban_border_sep_dim}{-\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_to_x_int}={#2} && \int_compare_p:nNn{\l_pgfgo_goban_to_y_int}={#3}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathlineto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_to_x_int}{\l_pgfgo_goban_to_y_int}}{
\pgfpoint{\l_pgfgo_goban_border_sep_dim}{\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_from_x_int}={1} &&
\int_compare_p:nNn{\l_pgfgo_goban_to_y_int}={#3}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathlineto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_from_x_int}{\l_pgfgo_goban_to_y_int}}{
\pgfpoint{-\l_pgfgo_goban_border_sep_dim}{\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_from_x_int}={1} &&
\int_compare_p:nNn{\l_pgfgo_goban_from_y_int}={1}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathclose
\pgfsetfillcolor{\l_pgfgo_goban_background_drop_shadow_color_tl}
\pgfsetfillopacity{\fp_to_decimal:N\l_pgfgo_goban_background_drop_shadow_opacity_fp}
\pgfusepath{fill}
\endpgfscope
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%FONDO
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfpathmoveto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_from_x_int}{\l_pgfgo_goban_from_y_int}}{
\pgfpoint{-\l_pgfgo_goban_border_sep_dim}{-\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_to_x_int}={#2} && \int_compare_p:nNn{\l_pgfgo_goban_from_y_int}={1}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathlineto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_to_x_int}{\l_pgfgo_goban_from_y_int}}{
\pgfpoint{\l_pgfgo_goban_border_sep_dim}{-\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_to_x_int}={#2} &&
\int_compare_p:nNn{\l_pgfgo_goban_to_y_int}={#3}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathlineto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_to_x_int}{\l_pgfgo_goban_to_y_int}}{
\pgfpoint{\l_pgfgo_goban_border_sep_dim}{\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_from_x_int}={1} &&
\int_compare_p:nNn{\l_pgfgo_goban_to_y_int}={#3}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathlineto{
\pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_from_x_int}{\l_pgfgo_goban_to_y_int}}{
\pgfpoint{-\l_pgfgo_goban_border_sep_dim}{\l_pgfgo_goban_border_sep_dim}}
}
\bool_if:nTF {\int_compare_p:nNn{\l_pgfgo_goban_from_x_int}={1} &&
\int_compare_p:nNn{\l_pgfgo_goban_from_y_int}={1}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_rounded_corners_dim}{\l_pgfgo_goban_border_rounded_corners_dim}}}
{\pgfsetcornersarced{\pgfpoint{\l_pgfgo_goban_border_inner_rounded_corners_dim}{\l_pgfgo_goban_border_inner_rounded_corners_dim}}}
\pgfpathclose
\pgfusepath{\bool_if:NT\l_pgfgo_goban_border_line_bool{stroke}, \bool_if:NT\l_pgfgo_goban_border_fill_bool{fill}}
\endpgfscope
}
\endpgfonlayer
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------GRID------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pgfonlayer{pgfgo_layer_goban_grid}
\pgfscope
\bool_if:NT\l_pgfgo_goban_partial_bool{
\pgfpathrectanglecorners
{\pgfpointxy{\int_use:N\l_pgfgo_goban_from_x_int-0.5}{\int_use:N\l_pgfgo_goban_from_y_int-0.5}}
{\pgfpointxy{\int_use:N\l_pgfgo_goban_to_x_int+0.5}{\int_use:N\l_pgfgo_goban_to_y_int+0.5}}
\pgfusepath{clip}
}
\bool_if:NT\l_pgfgo_goban_grid_bool{
\pgfscope
\pgfsetstrokecolor{\l_pgfgo_goban_grid_color_tl}
\pgfsetstrokeopacity{\l_pgfgo_goban_grid_opacity_tl}
\pgfsetlinewidth{\l_pgfgo_goban_grid_line_width_dim}
\pgfsetroundcap
\pgfpathgrid[step = \pgfpointxy{1}{1}] {\pgfpointxy{1}{1}}{\pgfpointxy{#2}{#3}}
\pgfusepath{stroke}
\endpgfscope
}
\endpgfscope
\endpgfonlayer
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------LABELS----------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\int_log:N\l_pgfgo_goban_from_x_int
\int_log:N\l_pgfgo_goban_from_y_int
\int_log:N\l_pgfgo_goban_to_x_int
\int_log:N\l_pgfgo_goban_to_y_int
\pgfonlayer{pgfgo_layer_goban_labels}
\pgfscope
\pgfsetcolor{\l_pgfgo_goban_labels_color_tl}
\bool_if:NT\l_pgfgo_goban_labels_pos_north_bool{
\foreach \x in {\l_pgfgo_goban_from_x_int,...,\l_pgfgo_goban_to_x_int}{
\int_set:Nx\l_pgfgo_goban_labels_current_x_int{\x}
\bool_if:NF\l_pgfgo_use_i_bool{
\int_compare:nNnT{\l_pgfgo_goban_labels_current_x_int}>{8}{
\int_incr:N\l_pgfgo_goban_labels_current_x_int
}}
\pgftext[at = \pgfpointadd
{\pgfpointxy{\x}{\l_pgfgo_goban_to_y_int}}
{\pgfpoint{0}{\l_pgfgo_goban_labels_sep_dim + \l_pgfgo_players_stone_radius_dim + 0.5em}}
] {{
\sffamily\int_to_Alph:n{\l_pgfgo_goban_labels_current_x_int}
}}}
}
\bool_if:NT\l_pgfgo_goban_labels_pos_east_bool{
\int_step_variable:nnNn {\l_pgfgo_goban_from_y_int} {\l_pgfgo_goban_to_y_int}\variable
{
\pgftext[at = \pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_to_x_int}{\variable}}{
\pgfpoint{\l_pgfgo_goban_labels_sep_dim+\l_pgfgo_players_stone_radius_dim+0.5em}{0}}
] {{
\sffamily\variable
}}
}
}
\bool_if:NT\l_pgfgo_goban_labels_pos_south_bool{
\foreach \x in {\l_pgfgo_goban_from_x_int,...,\l_pgfgo_goban_to_x_int}{
\int_set:Nx\l_pgfgo_goban_labels_current_x_int{\x}
\bool_if:NF\l_pgfgo_use_i_bool{
\int_compare:nNnT{\l_pgfgo_goban_labels_current_x_int}>{8}{
\int_incr:N\l_pgfgo_goban_labels_current_x_int
}}
\pgftext[at = \pgfpointadd{
\pgfpointxy{\x}{\l_pgfgo_goban_from_y_int}}{
\pgfpoint{0}{-\l_pgfgo_goban_labels_sep_dim-\l_pgfgo_players_stone_radius_dim-0.5em}}
] {{
\sffamily\int_to_Alph:n{\l_pgfgo_goban_labels_current_x_int}
}}}
}
\bool_if:NT\l_pgfgo_goban_labels_pos_west_bool{
\int_step_variable:nnNn {\l_pgfgo_goban_from_y_int} {\l_pgfgo_goban_to_y_int} \variable {
\pgftext[at = \pgfpointadd{
\pgfpointxy{\l_pgfgo_goban_from_x_int}{\variable}}{
\pgfpoint{-\l_pgfgo_goban_labels_sep_dim-\l_pgfgo_players_stone_radius_dim-0.5em}{0}}
] {{
\sffamily\variable
}}
}
}
\endpgfscope
\endpgfonlayer
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%----------------------RESUME----------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\bool_if:NT\l_pgfgo_goban_resume_bool{
\seq_map_inline:Nn \l_pgfgo_goban_elements_stack_seq {##1}}
}
\cs_new:Npn\__end_pgfgo_goban: {
\endtikzpicture
\group_end:
\int_set:Nn\l_pgfgo_move_from_int{1}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%------------------------------------------LATEX------------------------------------------------%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\NewDocumentEnvironment{goban}{O{}}{
\keys_set:nn {pgfgo / goban} {#1}
\__pgfgo_goban:nVV{}{\l_pgfgo_goban_to_x_int}{\l_pgfgo_goban_to_y_int}
}{\__end_pgfgo_goban:}
\ExplSyntaxOff