summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/weiqi/weiqi.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/weiqi/weiqi.sty')
-rw-r--r--Master/texmf-dist/tex/latex/weiqi/weiqi.sty1329
1 files changed, 1329 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/weiqi/weiqi.sty b/Master/texmf-dist/tex/latex/weiqi/weiqi.sty
new file mode 100644
index 00000000000..3fddd04badf
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/weiqi/weiqi.sty
@@ -0,0 +1,1329 @@
+%%
+%% This is file `weiqi.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% weiqi.dtx (with options: `package')
+%%
+%%
+%% 文件:weiqi.dtx
+%%
+%% 版权 (C) 2023-2024 By Ms_yam
+%%
+%% 它可以在 LaTeX 项目公共许可(LPPL)1.3c 及之后的任意版本(随你的意见)下分发或修改。
+%% 这个许可的最新版本在如下文件中:
+%%
+%% https://www.latex-project.org/lppl.txt
+%%
+%% 本宏包为作者练习 epxl3 和编写 dtx 文件所编写,里面的接口及方法并不是最优的。
+%% 仅供参考。
+%%
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesExplPackage{weiqi}{2024-02-22}{0.1}
+ {drawing weiqi using expl3}
+\RequirePackage{l3draw}[2024-01-04]
+\ExplSyntaxOn
+\cs_generate_variant:Nn \int_set:Nn { Ne }
+\cs_generate_variant:Nn \int_gset:Nn { Ne }
+\cs_generate_variant:Nn \int_from_alph:n { e }
+\cs_generate_variant:Nn \seq_gset_item:Nnn { NnV }
+\cs_generate_variant:Nn \regex_extract_once:nnN { nVN }
+\prg_generate_conditional_variant:Nnn \regex_match:nn { nV } { T, F, TF }
+\prg_generate_conditional_variant:Nnn \regex_extract_once:nnN { nVN } { T, F, TF }
+\int_const:Nn \c__weiqi_normal_size_int { 19 }
+\int_const:Nn \c__weiqi_mid_size_int { 13 }
+\int_const:Nn \c__weiqi_small_size_int { 9 }
+\clist_const:Nn \c__weiqi_normal_star_clist
+ { d4, j4, p4, d10, j10, p10, d16, j16, p16 }
+\clist_const:Nn \c__weiqi_mid_star_clist
+ { c3, g3, k3, c7, g7, k7, c11, g11, k11 }
+\clist_const:Nn \c__weiqi_small_star_clist { c3, k3, c7, k7 }
+\int_const:Nn \c__weiqi_max_step_int { 500 }
+\str_const:Nn \c__weiqi_normal_mode_str { normal }
+\str_const:Nn \c__weiqi_sgf_mode_str { sgf }
+\int_new:N \g__weiqi_x_direction_int
+\int_new:N \g__weiqi_y_direction_int
+\bool_new:N \g__weiqi_swap_xy_bool
+\fp_new:N \g__weiqi_scale_fp
+\int_new:N \g__weiqi_min_width_int
+\int_new:N \g__weiqi_min_hight_int
+\bool_new:N \g__weiqi_show_loc_bool
+\str_new:N \g__weiqi_loc_mode_str
+\int_gset:Nn \g__weiqi_x_direction_int { 1 }
+\int_gset:Nn \g__weiqi_y_direction_int { 1 }
+\bool_gset_false:N \g__weiqi_swap_xy_bool
+\fp_gset:Nn \g__weiqi_scale_fp { 1 }
+\int_gset:Nn \g__weiqi_min_width_int { 3 }
+\int_gset:Nn \g__weiqi_min_hight_int { 2 }
+\bool_gset_true:N \g__weiqi_show_loc_bool
+\str_gset_eq:NN \g__weiqi_loc_mode_str \c__weiqi_normal_mode_str
+\int_new:N \l__weiqi_x_direction_int
+\int_new:N \l__weiqi_y_direction_int
+\bool_new:N \l__weiqi_swap_xy_bool
+\fp_new:N \l__weiqi_scale_fp
+\int_new:N \l__weiqi_min_width_int
+\int_new:N \l__weiqi_min_hight_int
+\bool_new:N \l__weiqi_show_loc_bool
+\str_new:N \l__weiqi_loc_mode_str
+\int_new:N \g__weiqi_default_size_int
+\int_gset_eq:NN \g__weiqi_default_size_int \c__weiqi_normal_size_int
+\int_new:N \g__weiqi_size_int
+\int_new:N \g__weiqi_step_count_int
+\intarray_new:Nn \g__weiqi_x_intarray { \c__weiqi_max_step_int }
+\intarray_new:Nn \g__weiqi_y_intarray { \c__weiqi_max_step_int }
+\intarray_new:Nn \g__weiqi_player_intarray { \c__weiqi_max_step_int }
+\seq_new:N \g__weiqi_label_seq
+\seq_new:N \g__weiqi_die_seq
+\clist_new:N \g__weiqi_red_point_clist
+\clist_new:N \g__weiqi_green_point_clist
+\clist_new:N \g__weiqi_blue_point_clist
+\int_new:N \l__weiqi_x_min_int
+\int_new:N \l__weiqi_x_max_int
+\int_new:N \l__weiqi_y_min_int
+\int_new:N \l__weiqi_y_max_int
+\bool_new:N \l__weiqi_left_bool
+\bool_new:N \l__weiqi_right_bool
+\bool_new:N \l__weiqi_up_bool
+\bool_new:N \l__weiqi_down_bool
+\fp_new:N \l__weiqi_x_min_fp
+\fp_new:N \l__weiqi_x_max_fp
+\fp_new:N \l__weiqi_y_min_fp
+\fp_new:N \l__weiqi_y_max_fp
+\str_new:N \l__weiqi_label_str
+\int_new:N \l__weiqi_x_int
+\int_new:N \l__weiqi_y_int
+\int_new:N \l__weiqi_player_int
+\fp_new:N \l__weiqi_x_fp
+\fp_new:N \l__weiqi_y_fp
+\clist_new:N \l__weiqi_point_clist
+\int_new:N \l__weiqi_tmp_int
+\str_new:N \l__weiqi_tmp_str
+\bool_new:N \l__weiqi_tmp_bool
+\seq_new:N \l__weiqi_tmp_seq
+\cs_new:Npn \__weiqi_new_game:n #1
+ {
+ \int_set_eq:NN \l__weiqi_x_direction_int \g__weiqi_x_direction_int
+ \int_set_eq:NN \l__weiqi_y_direction_int \g__weiqi_y_direction_int
+ \bool_set_eq:NN \l__weiqi_swap_xy_bool \g__weiqi_swap_xy_bool
+ \fp_set_eq:NN \l__weiqi_scale_fp \g__weiqi_scale_fp
+ \int_set_eq:NN \l__weiqi_min_width_int \g__weiqi_min_width_int
+ \int_set_eq:NN \l__weiqi_min_hight_int \g__weiqi_min_hight_int
+ \bool_set_eq:NN \l__weiqi_show_loc_bool \g__weiqi_show_loc_bool
+ \str_set_eq:NN \l__weiqi_loc_mode_str \g__weiqi_loc_mode_str
+ \int_gset:Ne \g__weiqi_size_int { #1 }
+ \int_gset:Nn \g__weiqi_step_count_int { 0 }
+ \intarray_gzero:N \g__weiqi_x_intarray
+ \intarray_gzero:N \g__weiqi_y_intarray
+ \intarray_gzero:N \g__weiqi_player_intarray
+ \seq_gclear:N \g__weiqi_label_seq
+ \seq_gclear:N \g__weiqi_die_seq
+ \clist_gclear:N \g__weiqi_red_point_clist
+ \clist_gclear:N \g__weiqi_green_point_clist
+ \clist_gclear:N \g__weiqi_blue_point_clist
+ }
+\cs_new:Npn \__weiqi_loc_to_xy:n #1
+ {
+ \str_set:Nx \l_tmpa_str { \str_lowercase:n { #1 } }
+ \bool_lazy_any:nTF
+ {
+ { \str_if_empty_p:N \l_tmpa_str }
+ { \str_if_eq_p:Vn { \l_tmpa_str } { - } }
+ { \str_if_eq_p:Vn { \l_tmpa_str } { pass } }
+ }
+ {
+ \int_set:Nn \l__weiqi_x_int { 0 }
+ \int_set:Nn \l__weiqi_y_int { 0 }
+ }
+ {
+ \int_set:Ne \l__weiqi_x_int
+ { \int_from_alph:e { \str_head:N \l_tmpa_str } }
+ \regex_match:nVTF { [a-z]{2} } { \l_tmpa_str }
+ {
+ \int_set:Ne \l_tmpa_int
+ { \int_from_alph:e { \str_tail:N \l_tmpa_str } }
+ \int_set:Nn \l__weiqi_y_int { \g__weiqi_size_int - \l_tmpa_int + 1 }
+ }
+ {
+ \int_set:Ne \l__weiqi_y_int
+ { \str_range:Nnn \l_tmpa_str { 2 } { 5 } }
+ }
+ }
+ }
+\cs_generate_variant:Nn \__weiqi_loc_to_xy:n { V }
+\cs_new:Npn \__weiqi_xy_to_loc:N #1
+ {
+ \int_compare:nNnTF { \l__weiqi_x_int } = { 0 }
+ { \str_set:Nn #1 { - } }
+ {
+ \str_set:Nx \l_tmpa_str
+ { \int_to_alph:n { \l__weiqi_x_int } }
+ \str_compare:eNeTF
+ { \l__weiqi_loc_mode_str } = { \c__weiqi_sgf_mode_str }
+ {
+ \int_set:Nn \l_tmpa_int
+ { \g__weiqi_size_int - \l__weiqi_y_int + 1 }
+ \str_set:Nx \l_tmpb_str
+ { \int_to_alph:n { \l_tmpa_int } }
+ \str_put_right:NV \l_tmpa_str { \l_tmpb_str }
+ }
+ { \str_put_right:NV \l_tmpa_str { \l__weiqi_y_int } }
+ \str_set_eq:NN #1 \l_tmpa_str
+ }
+ }
+\cs_new:Npn \__weiqi_add_stone:nnn #1#2#3
+ {
+ \int_gincr:N \g__weiqi_step_count_int
+ \intarray_gset:Nnn \g__weiqi_player_intarray
+ \g__weiqi_step_count_int { #1 }
+ \__weiqi_loc_to_xy:n { #2 }
+ \intarray_gset:Nnn \g__weiqi_x_intarray
+ \g__weiqi_step_count_int \l__weiqi_x_int
+ \intarray_gset:Nnn \g__weiqi_y_intarray
+ \g__weiqi_step_count_int \l__weiqi_y_int
+ \str_if_eq:nnTF { #3 } { 0 }
+ { \seq_put_right:Nn \g__weiqi_label_seq {} }
+ { \seq_put_right:Nn \g__weiqi_label_seq { #3 } }
+ }
+\cs_generate_variant:Nn \__weiqi_add_stone:nnn {nnV, nVV}
+\cs_new:Npn \__weiqi_add_stones:nnn #1#2#3
+ {
+ \int_set:Nn \l__weiqi_player_int { #1 }
+ \clist_set:Nn \l__weiqi_position_clsit { #2 }
+ \bool_set_false:N \l__weiqi_tmp_bool
+ \str_if_empty:nTF { #3 }
+ { \str_set:Nn \l__weiqi_tmp_str {} }
+ {
+ \regex_match:nnTF { [^0-9]+ } { #3 }
+ { \str_set:Nx \l__weiqi_tmp_str { #3 } }
+ {
+ \bool_set_true:N \l__weiqi_tmp_bool
+ \int_set:Nn \l__weiqi_tmp_int { #3 }
+ }
+ }
+ \clist_map_inline:Nn \l__weiqi_position_clsit
+ {
+ \bool_if:nTF \l__weiqi_tmp_bool
+ {
+ \__weiqi_add_stone:nnV
+ { \l__weiqi_player_int }
+ { ##1 }
+ { \l__weiqi_tmp_int }
+ \int_case:nn { \l__weiqi_player_int }
+ {
+ { 1 } { \int_set:Nn \l__weiqi_player_int { 2 } }
+ { 2 } { \int_set:Nn \l__weiqi_player_int { 1 } }
+ { 3 } { \int_set:Nn \l__weiqi_player_int { 3 } }
+ }
+ \int_compare:nNnT { \l__weiqi_tmp_int } > { 0 }
+ { \int_incr:N \l__weiqi_tmp_int }
+ }
+ { \__weiqi_add_stone:nnV { #1 } { ##1 } { \l__weiqi_tmp_str } }
+ }
+ }
+\cs_new:Npn \__weiqi_add_sgf_stones:nn #1#2
+ {
+ \regex_extract_all:nnN { ;[BW]\[[a-z]{2}\] } { #1 } \l__weiqi_tmp_seq
+ \clist_set_from_seq:NN \l__weiqi_point_clist \l__weiqi_tmp_seq
+ \bool_set_false:N \l__weiqi_tmp_bool
+ \str_if_empty:nTF { #2 }
+ { \str_set:Nn \l__weiqi_tmp_str {} }
+ {
+ \regex_match:nnTF { [^0-9]+ } { #2 }
+ { \str_set:Nx \l__weiqi_tmp_str { #2 } }
+ {
+ \bool_set_true:N \l__weiqi_tmp_bool
+ \int_set:Nn \l__weiqi_tmp_int { #2 }
+ }
+ }
+ \clist_map_inline:Nn \l__weiqi_point_clist
+ {
+ \str_set:Nx \l_tmpa_str { \str_item:Nn { ##1 } { 2 } }
+ \str_set:Nx \l_tmpb_str { \str_range:nnn { ##1 } { 4 } { -2 } }
+ \str_case_e:nn { \l_tmpa_str }
+ {
+ { B } { \int_set:Nn \l__weiqi_player_int { 1 } }
+ { W } { \int_set:Nn \l__weiqi_player_int { 2 } }
+ }
+ \bool_if:nTF \l__weiqi_tmp_bool
+ {
+ \__weiqi_add_stone:nVV { \l__weiqi_player_int }
+ { \l_tmpb_str } { \l__weiqi_tmp_int }
+ \int_compare:nNnT { \l__weiqi_tmp_int } > { 0 }
+ { \int_incr:N \l__weiqi_tmp_int }
+ }
+ {
+ \__weiqi_add_stone:nVV { \l__weiqi_player_int }
+ { \l_tmpb_str } { \l__weiqi_tmp_str }
+ }
+ }
+ }
+\cs_generate_variant:Nn \__weiqi_add_sgf_stones:nn { VV }
+\cs_new:Npn \__weiqi_reset_stone_number:n #1
+ {
+ \int_set:Ne \l__weiqi_tmp_int { 1 - #1 }
+ \int_step_inline:nn { \c__weiqi_max_step_int }
+ {
+ \bool_lazy_or:nnF
+ {
+ \int_compare_p:nNn
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } } = { 0 }
+ }
+ {
+ \int_compare_p:nNn
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } } = { 3 }
+ }
+ {
+ \int_incr:N \l__weiqi_tmp_int
+ \int_compare:nNnTF { \l__weiqi_tmp_int } > { 0 }
+ { \seq_gset_item:NnV \g__weiqi_label_seq { ##1 } { \l__weiqi_tmp_int } }
+ { \seq_gset_item:Nnn \g__weiqi_label_seq { ##1 } {} }
+ }
+ }
+ }
+\cs_new:Npn \__weiqi_change_stone:n #1
+ {
+ \int_case:nn
+ { \intarray_item:Nn \g__weiqi_player_intarray { #1 } }
+ {
+ { 1 } { \intarray_gset:Nnn \g__weiqi_player_intarray { #1 } { 2 } }
+ { 2 } { \intarray_gset:Nnn \g__weiqi_player_intarray { #1 } { 1 } }
+ }
+ }
+\cs_new:Npn \__weiqi_remove_stone:n #1
+ {
+ \intarray_gset:Nnn \g__weiqi_x_intarray { #1 } { 0 }
+ \intarray_gset:Nnn \g__weiqi_y_intarray { #1 } { 0 }
+ \intarray_gset:Nnn \g__weiqi_player_intarray { #1 } { 0 }
+ \seq_gset_item:Nnn \g__weiqi_label_seq { #1} { }
+ }
+\cs_new:Npn \__weiqi_die_stone:n #1
+ {
+ \seq_if_in:NnF \g__weiqi_die_seq { #1 }
+ {
+ \seq_put_right:Nn \g__weiqi_die_seq { #1 }
+ \prg_break:
+ }
+ }
+\cs_new:Npn \__weiqi_modify_stone:N #1
+ {
+ \int_step_inline:nn { \c__weiqi_max_step_int }
+ {
+ \bool_lazy_and:nnT
+ {
+ \int_compare_p:n
+ { \intarray_item:Nn \g__weiqi_x_intarray { ##1 } = \l__weiqi_x_int }
+ }
+ {
+ \int_compare_p:n
+ { \intarray_item:Nn \g__weiqi_y_intarray { ##1 } = \l__weiqi_y_int }
+ }
+ { #1 { ##1 } }
+ }
+ \prg_break_point:
+ }
+\cs_new:Npn \__weiqi_modify_stones:nN #1#2
+ {
+ \clist_set:Nn \l__weiqi_position_clsit { #1 }
+ \clist_map_inline:Nn \l__weiqi_position_clsit
+ {
+ \__weiqi_loc_to_xy:n { ##1 }
+ \int_compare:nNnF { \l__weiqi_x_int } = { 0 }
+ { \__weiqi_modify_stone:N { #2 } }
+ }
+ }
+\cs_new:Nn \__weiqi_clear_labels:
+ {
+ \int_step_inline:nn { \c__weiqi_max_step_int }
+ {
+ \int_compare:nNnT
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } } = { 3 }
+ {
+ \intarray_gset:Nnn \g__weiqi_x_intarray { ##1 } { 0 }
+ \intarray_gset:Nnn \g__weiqi_y_intarray { ##1 } { 0 }
+ \intarray_gset:Nnn \g__weiqi_player_intarray { ##1 } { 0 }
+ \seq_gset_item:Nnn \g__weiqi_label_seq { ##1 } {}
+ }
+ }
+ }
+\cs_new:Npn \__weiqi_add_points:nn #1#2
+ {
+ \str_case:nn { #1 }
+ {
+ { red }
+ { \clist_gput_right:Nn \g__weiqi_red_point_clist { #2 } }
+ { green }
+ { \clist_gput_right:Nn \g__weiqi_green_point_clist { #2 } }
+ { blue }
+ { \clist_gput_right:Nn \g__weiqi_blue_point_clist { #2 } }
+ }
+ }
+\cs_new:Nn \__weiqi_clear_points:
+ {
+ \clist_clear:N \g__weiqi_red_point_clist
+ \clist_clear:N \g__weiqi_green_point_clist
+ \clist_clear:N \g__weiqi_blue_point_clist
+ }
+\cs_new:Npn \__weiqi_transform_xy:NN #1#2
+ {
+ \int_set:Ne \l_tmpa_int { #1 * \l__weiqi_x_direction_int }
+ \int_set:Ne \l_tmpb_int { #2 * \l__weiqi_y_direction_int }
+ \bool_if:NTF \l__weiqi_swap_xy_bool
+ {
+ \int_set_eq:NN #1 \l_tmpb_int
+ \int_set_eq:NN #2 \l_tmpa_int
+ }
+ {
+ \int_set_eq:NN #1 \l_tmpa_int
+ \int_set_eq:NN #2 \l_tmpb_int
+ }
+ }
+\cs_new:Nn \__weiqi_calc_range:
+ {
+ \int_set:Nn \l__weiqi_x_min_int { 99 }
+ \int_set:Nn \l__weiqi_y_min_int { 99 }
+ \int_set:Nn \l__weiqi_x_max_int { 0 }
+ \int_set:Nn \l__weiqi_y_max_int { 0 }
+ \int_step_inline:nn {\g__weiqi_step_count_int}
+ {
+ \int_set:Ne \l__weiqi_x_int
+ { \intarray_item:Nn \g__weiqi_x_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_y_int
+ { \intarray_item:Nn \g__weiqi_y_intarray { ##1 } }
+ \int_compare:nNnF
+ { \l__weiqi_x_int } = { 0 }
+ {
+ \int_compare:nNnT
+ \l__weiqi_x_min_int > \l__weiqi_x_int
+ { \int_set_eq:NN \l__weiqi_x_min_int \l__weiqi_x_int }
+ \int_compare:nNnT
+ \l__weiqi_x_max_int < \l__weiqi_x_int
+ { \int_set_eq:NN \l__weiqi_x_max_int \l__weiqi_x_int }
+ \int_compare:nNnT
+ \l__weiqi_y_min_int > \l__weiqi_y_int
+ { \int_set_eq:NN \l__weiqi_y_min_int \l__weiqi_y_int }
+ \int_compare:nNnT
+ \l__weiqi_y_max_int < \l__weiqi_y_int
+ { \int_set_eq:NN \l__weiqi_y_max_int \l__weiqi_y_int }
+ }
+ }
+ \int_compare:nNnT
+ { \l__weiqi_x_min_int } = { 99 }
+ {
+ \int_set:Nn \l__weiqi_x_min_int { 1 }
+ \int_set:Nn \l__weiqi_y_min_int { 1 }
+ \int_set_eq:NN \l__weiqi_x_max_int \g__weiqi_size_int
+ \int_set_eq:NN \l__weiqi_y_max_int \g__weiqi_size_int
+ }
+ \int_set:Ne \l_tmpa_int
+ { \int_min:nn { \g__weiqi_size_int } { \l__weiqi_min_width_int } }
+ \int_compare:nNnTF
+ { \g__weiqi_size_int - \l__weiqi_x_max_int } > { \l__weiqi_x_min_int - 1 }
+ {
+ \int_set:Nn \l__weiqi_x_min_int { 1 }
+ \int_set:Ne \l__weiqi_x_max_int
+ { \int_max:nn { \l__weiqi_x_max_int + 1 } { \l_tmpa_int } }
+ }
+ {
+ \int_set_eq:NN \l__weiqi_x_max_int \g__weiqi_size_int
+ \int_compare:nNnF
+ { \l__weiqi_x_min_int } = { 1 }
+ {
+ \int_set:Ne \l__weiqi_x_min_int
+ {
+ \int_min:nn
+ { \l__weiqi_x_min_int - 1 }
+ { \g__weiqi_size_int - \l_tmpa_int + 1 }
+ }
+ }
+ }
+ \int_set:Ne \l_tmpa_int
+ { \int_min:nn { \g__weiqi_size_int } { \l__weiqi_min_hight_int } }
+ \int_compare:nNnTF
+ { \g__weiqi_size_int - \l__weiqi_y_max_int } > { \l__weiqi_y_min_int - 1 }
+ {
+ \int_set:Nn \l__weiqi_y_min_int { 1 }
+ \int_set:Ne \l__weiqi_y_max_int
+ { \int_max:nn { \l__weiqi_y_max_int + 1 } { \l_tmpa_int } }
+ }
+ {
+ \int_set_eq:NN \l__weiqi_y_max_int \g__weiqi_size_int
+ \int_compare:nNnF
+ { \l__weiqi_y_min_int } = { 1 }
+ {
+ \int_set:Ne \l__weiqi_y_min_int
+ {
+ \int_min:nn
+ { \l__weiqi_y_min_int - 1 }
+ { \g__weiqi_size_int - \l_tmpa_int + 1 }
+ }
+ }
+ }
+ \__weiqi_transform_xy:NN \l__weiqi_x_min_int \l__weiqi_y_min_int
+ \__weiqi_transform_xy:NN \l__weiqi_x_max_int \l__weiqi_y_max_int
+ }
+\cs_new:Npn \__weiqi_set_range:n #1
+ {
+ \str_compare:eNeTF
+ { \str_lowercase:n { #1 } } = { full }
+ {
+ \int_set:Nn \l__weiqi_x_min_int { 1 }
+ \int_set:Nn \l__weiqi_y_min_int { 1 }
+ \int_set_eq:NN \l__weiqi_x_max_int \g__weiqi_size_int
+ \int_set_eq:NN \l__weiqi_y_max_int \g__weiqi_size_int
+ }
+ {
+ \clist_set:Nn \l__weiqi_position_clsit { #1 }
+ \clist_pop:NN \l__weiqi_position_clsit \l_tmpa_tl
+ \__weiqi_loc_to_xy:V { \l_tmpa_tl }
+ \int_set_eq:NN \l__weiqi_x_min_int \l__weiqi_x_int
+ \int_set_eq:NN \l__weiqi_y_min_int \l__weiqi_y_int
+ \clist_pop:NN \l__weiqi_position_clsit \l_tmpa_tl
+ \__weiqi_loc_to_xy:V { \l_tmpa_tl }
+ \int_set_eq:NN \l__weiqi_x_max_int \l__weiqi_x_int
+ \int_set_eq:NN \l__weiqi_y_max_int \l__weiqi_y_int
+ }
+ \int_compare:nNnT { \l__weiqi_x_min_int } > { \l__weiqi_x_max_int }
+ {
+ \int_set_eq:NN \l_tmpa_int \l__weiqi_x_min_int
+ \int_set_eq:NN \l__weiqi_x_min_int \l__weiqi_x_max_int
+ \int_set_eq:NN \l__weiqi_x_max_int \l_tmpa_int
+ }
+ \int_compare:nNnT { \l__weiqi_y_min_int } > { \l__weiqi_y_max_int }
+ {
+ \int_set_eq:NN \l_tmpa_int \l__weiqi_y_min_int
+ \int_set_eq:NN \l__weiqi_y_min_int \l__weiqi_y_max_int
+ \int_set_eq:NN \l__weiqi_y_max_int \l_tmpa_int
+ }
+ \__weiqi_transform_xy:NN \l__weiqi_x_min_int \l__weiqi_y_min_int
+ \__weiqi_transform_xy:NN \l__weiqi_x_max_int \l__weiqi_y_max_int
+ }
+\cs_new:Nn \__weiqi_calc_board_border:
+ {
+ \int_compare:nNnTF
+ { \int_abs:n { \l__weiqi_x_min_int } } = { 1 }
+ {
+ \bool_set_true:N \l__weiqi_left_bool
+ \fp_set:Nn \l__weiqi_x_min_fp
+ { \l__weiqi_x_min_int }
+ }
+ {
+ \bool_set_false:N \l__weiqi_left_bool
+ \fp_set:Nn \l__weiqi_x_min_fp
+ { \l__weiqi_x_min_int - 0.3 * \int_sign:n { \l__weiqi_x_min_int } }
+ }
+ \int_compare:nNnTF
+ { \int_abs:n { \l__weiqi_x_max_int } } = { \g__weiqi_size_int }
+ {
+ \bool_set_true:N \l__weiqi_right_bool
+ \fp_set:Nn \l__weiqi_x_max_fp
+ { \l__weiqi_x_max_int }
+ }
+ {
+ \bool_set_false:N \l__weiqi_right_bool
+ \fp_set:Nn \l__weiqi_x_max_fp
+ { \l__weiqi_x_max_int + 0.3 * \int_sign:n { \l__weiqi_x_max_int } }
+ }
+ \int_compare:nNnTF
+ { \int_abs:n { \l__weiqi_y_min_int } } = { 1 }
+ {
+ \bool_set_true:N \l__weiqi_down_bool
+ \fp_set:Nn \l__weiqi_y_min_fp
+ { \l__weiqi_y_min_int }
+ }
+ {
+ \bool_set_false:N \l__weiqi_down_bool
+ \fp_set:Nn \l__weiqi_y_min_fp
+ { \l__weiqi_y_min_int - 0.3 * \int_sign:n { \l__weiqi_y_min_int } }
+ }
+ \int_compare:nNnTF
+ { \int_abs:n { \l__weiqi_y_max_int } } = { \g__weiqi_size_int }
+ {
+ \bool_set_true:N \l__weiqi_up_bool
+ \fp_set:Nn \l__weiqi_y_max_fp
+ { \l__weiqi_y_max_int }
+ }
+ {
+ \bool_set_false:N \l__weiqi_up_bool
+ \fp_set:Nn \l__weiqi_y_max_fp
+ { \l__weiqi_y_max_int + 0.3 * \int_sign:n { \l__weiqi_y_max_int } }
+ }
+ }
+\prg_set_conditional:Npnn \__weiqi_within_range:nn #1#2 { p, T }
+ {
+ \fp_set:Nn \l_tmpa_fp { abs( \l__weiqi_x_min_fp - #1 ) }
+ \fp_add:Nn \l_tmpa_fp { abs( \l__weiqi_x_max_fp - #1 ) }
+ \fp_sub:Nn \l_tmpa_fp { abs( \l__weiqi_x_max_fp - \l__weiqi_x_min_fp ) }
+ \fp_add:Nn \l_tmpa_fp { abs( \l__weiqi_y_min_fp - #2 ) }
+ \fp_add:Nn \l_tmpa_fp { abs( \l__weiqi_y_max_fp - #2 ) }
+ \fp_sub:Nn \l_tmpa_fp { abs( \l__weiqi_y_max_fp - \l__weiqi_y_min_fp ) }
+ \fp_compare:nNnTF
+ { \l_tmpa_fp } < { 0.1 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_new:Nn \__weiqi_draw_board_grid:
+ {
+ \int_set:Ne \l__weiqi_tmp_int
+ { \int_sign:n { \l__weiqi_x_max_int - \l__weiqi_x_min_int } }
+ \int_step_inline:nnnn
+ { \l__weiqi_x_min_int } { \l__weiqi_tmp_int } { \l__weiqi_x_max_int }
+ {
+ \draw_path_moveto:n { ##1 cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { ##1 cm, \l__weiqi_y_max_fp cm }
+ }
+ \int_set:Ne \l__weiqi_tmp_int
+ { \int_sign:n { \l__weiqi_y_max_int - \l__weiqi_y_min_int } }
+ \int_step_inline:nnnn
+ { \l__weiqi_y_min_int } { \l__weiqi_tmp_int } { \l__weiqi_y_max_int }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_min_fp cm, ##1 cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, ##1 cm }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_board_border:
+ {
+ \bool_if:nT { \l__weiqi_left_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_max_fp cm }
+ }
+ \bool_if:nT { \l__weiqi_right_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_max_fp cm }
+ }
+ \bool_if:nT { \l__weiqi_down_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_min_fp cm }
+ }
+ \bool_if:nT { \l__weiqi_up_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_max_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_max_fp cm }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_board_corner:
+ {
+ \bool_if:nT { \l__weiqi_left_bool && \l__weiqi_down_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_max_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_min_fp cm }
+ }
+ \bool_if:nT { \l__weiqi_right_bool && \l__weiqi_down_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_max_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_min_fp cm }
+ }
+ \bool_if:nT { \l__weiqi_right_bool && \l__weiqi_up_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_max_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_max_fp cm }
+ }
+ \bool_if:nT { \l__weiqi_left_bool && \l__weiqi_up_bool }
+ {
+ \draw_path_moveto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_min_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_min_fp cm, \l__weiqi_y_max_fp cm }
+ \draw_path_lineto:n { \l__weiqi_x_max_fp cm, \l__weiqi_y_max_fp cm }
+ }
+ }
+\cs_new:Npn \__weiqi_draw_point:n #1
+ {
+ \__weiqi_loc_to_xy:n { #1 }
+ \__weiqi_transform_xy:NN \l__weiqi_x_int \l__weiqi_y_int
+ \__weiqi_within_range:nnT { \l__weiqi_x_int } { \l__weiqi_y_int }
+ {
+ \draw_path_circle:nn
+ { \l__weiqi_x_int cm, \l__weiqi_y_int cm } { 1mm }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_board_star:
+ {
+ \clist_clear:N \l__weiqi_point_clist
+ \int_case:nn { \g__weiqi_size_int }
+ {
+ { \c__weiqi_normal_size_int }
+ { \clist_set_eq:NN \l__weiqi_point_clist \c__weiqi_normal_star_clist }
+ { \c__weiqi_mid_size_int }
+ { \clist_set_eq:NN \l__weiqi_point_clist \c__weiqi_mid_star_clist }
+ { \c__weiqi_small_size_int }
+ { \clist_set_eq:NN \l__weiqi_point_clist \c__weiqi_small_star_clist }
+ }
+ \clist_map_function:NN \l__weiqi_point_clist \__weiqi_draw_point:n
+ }
+\cs_new:Npn \__weiqi_set_loc_label:nn #1#2
+ {
+ \str_case_e:nn { #1 }
+ {
+ { A }
+ { \str_set:Nx \l__weiqi_label_str { \int_to_Alph:n { #2 } } }
+ { \c__weiqi_normal_mode_str }
+ { \str_set:NV \l__weiqi_label_str { #2 } }
+ { \c__weiqi_sgf_mode_str }
+ {
+ \int_set:Nn \l_tmpa_int { \g__weiqi_size_int - #2 + 1 }
+ \str_set:Nx\l__weiqi_label_str { \int_to_alph:n { \l_tmpa_int } }
+ }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_board_loc:
+ {
+ \int_gset:Nn \g_tmpa_int
+ { \int_sign:n { \l__weiqi_x_max_int - \l__weiqi_x_min_int } }
+ \int_gset:Nn \g_tmpb_int
+ { \int_sign:n { \l__weiqi_y_max_int - \l__weiqi_y_min_int } }
+ \int_step_inline:nnnn
+ { \l__weiqi_x_min_int } { \g_tmpa_int } { \l__weiqi_x_max_int }
+ {
+ \int_set:Ne \l__weiqi_tmp_int { \int_abs:n { ##1 } }
+ \bool_if:NTF \l__weiqi_swap_xy_bool
+ { \__weiqi_set_loc_label:nn { \l__weiqi_loc_mode_str } { \l__weiqi_tmp_int } }
+ { \__weiqi_set_loc_label:nn { A } { \l__weiqi_tmp_int } }
+ \hbox_set:Nn \l_tmpa_box { \l__weiqi_label_str }
+ \fp_set:Nn \l_tmpa_fp { 0.2 * \g_tmpb_int }
+ \fp_set:Nn \l_tmpb_fp { 0.5 * { \box_ht:N \l_tmpa_box } * \g_tmpb_int }
+ \bool_if:NT \l__weiqi_up_bool
+ {
+ \draw_box_use:Nn \l_tmpa_box
+ {
+ ##1 cm - 0.5 * { \box_wd:N \l_tmpa_box },
+ (\l__weiqi_y_max_fp + \l_tmpa_fp ) cm - abs(\l_tmpb_fp) + \l_tmpb_fp
+ }
+ }
+ \bool_if:NT \l__weiqi_down_bool
+ {
+ \draw_box_use:Nn \l_tmpa_box
+ {
+ ##1 cm - 0.5 * { \box_wd:N \l_tmpa_box },
+ (\l__weiqi_y_min_fp - \l_tmpa_fp ) cm - abs(\l_tmpb_fp) - \l_tmpb_fp
+ }
+ }
+ }
+ \int_step_inline:nnnn
+ { \l__weiqi_y_min_int } { \g_tmpb_int } { \l__weiqi_y_max_int }
+ {
+ \int_set:Ne \l__weiqi_tmp_int { \int_abs:n { ##1 } }
+ \bool_if:NTF \l__weiqi_swap_xy_bool
+ { \__weiqi_set_loc_label:nn { A } { \l__weiqi_tmp_int } }
+ { \__weiqi_set_loc_label:nn { \l__weiqi_loc_mode_str } { \l__weiqi_tmp_int } }
+ \hbox_set:Nn \l_tmpa_box { \l__weiqi_label_str }
+ \fp_set:Nn \l_tmpa_fp { 0.2 * \g_tmpa_int }
+ \fp_set:Nn \l_tmpb_fp { 0.5 * { \box_wd:N \l_tmpa_box } * \g_tmpa_int }
+ \bool_if:NT \l__weiqi_left_bool
+ {
+ \draw_box_use:Nn \l_tmpa_box
+ {
+ (\l__weiqi_x_min_fp - \l_tmpa_fp) cm - abs(\l_tmpb_fp) - \l_tmpb_fp,
+ ##1 cm - 0.5 * { \box_ht:N \l_tmpa_box }
+ }
+ }
+ \bool_if:NT \l__weiqi_right_bool
+ {
+ \draw_box_use:Nn \l_tmpa_box
+ {
+ (\l__weiqi_y_max_fp + \l_tmpa_fp) cm - abs(\l_tmpb_fp) + \l_tmpb_fp,
+ ##1 cm - 0.5 * { \box_ht:N \l_tmpa_box }
+ }
+ }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_board:
+ {
+ \__weiqi_calc_board_border:
+ \draw_linewidth:n { 0.7 }
+ \color_select:n { black }
+ \__weiqi_draw_board_grid:
+ \draw_path_use_clear:n { stroke }
+ \draw_linewidth:n { 2 }
+ \__weiqi_draw_board_border:
+ \draw_path_use_clear:n { stroke }
+ \__weiqi_draw_board_corner:
+ \draw_path_use_clear:n { stroke }
+ \color_select:n { black }
+ \__weiqi_draw_board_star:
+ \draw_path_use_clear:n { draw, fill }
+ \color_select:n { black!50 }
+ \bool_if:NT \l__weiqi_show_loc_bool
+ { \__weiqi_draw_board_loc: }
+ \draw_path_use_clear:n { stroke }
+ }
+\cs_new:Npn \__weiqi_draw_points:
+ {
+ \color_select:n { red }
+ \clist_map_function:NN \g__weiqi_red_point_clist \__weiqi_draw_point:n
+ \draw_path_use_clear:n { draw, fill }
+ \color_select:n { green }
+ \clist_map_function:NN \g__weiqi_green_point_clist \__weiqi_draw_point:n
+ \draw_path_use_clear:n { draw, fill }
+ \color_select:n { blue }
+ \clist_map_function:NN \g__weiqi_blue_point_clist \__weiqi_draw_point:n
+ \draw_path_use_clear:n { draw, fill }
+ }
+\cs_new:Npn \__weiqi_draw_stone:nnnn #1#2#3#4
+ {
+ \int_compare:nNnF { #1 } = { 3 }
+ {
+ \color_fill:n { white }
+ \draw_path_circle:nn { #2cm, #3cm } { 4.4mm }
+ \draw_path_use_clear:n { fill }
+ }
+ \color_select:n { black }
+ \int_case:nn { #1 }
+ {
+ { 1 } { \color_fill:n { black } }
+ { 2 } { \color_fill:n { white } }
+ { 3 } { \color_select:n { white } }
+ }
+ \draw_path_circle:nn{ #2cm, #3cm } { 4mm }
+ \draw_path_use_clear:n { draw, fill }
+ \int_case:nn { #1 }
+ {
+ { 1 } { \color_select:n { white } }
+ { 2 } { \color_select:n { black } }
+ { 3 } { \color_select:n { blue } }
+ }
+ \hbox_set:Nn \l_tmpa_box { \Large \textbf{ #4 } }
+ \draw_box_use:Nn \l_tmpa_box
+ {
+ #2cm - 0.5 * { \box_wd:N \l_tmpa_box },
+ #3cm - 0.5 * { \box_ht:N \l_tmpa_box }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_stones:
+ {
+ \draw_linewidth:n { 1 }
+ \int_step_inline:nn {\g__weiqi_step_count_int}
+ {
+ \int_set:Ne \l__weiqi_x_int
+ { \intarray_item:Nn \g__weiqi_x_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_y_int
+ { \intarray_item:Nn \g__weiqi_y_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_player_int
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } }
+ \str_set:Nx \l__weiqi_tmp_str
+ { \seq_item:Nn \g__weiqi_label_seq { ##1 } }
+ \seq_if_in:NnT \g__weiqi_die_seq { ##1 }
+ { \int_set:Nn \l__weiqi_x_int { 0 } }
+ \int_if_zero:nF { \l__weiqi_x_int }
+ {
+ \__weiqi_transform_xy:NN \l__weiqi_x_int \l__weiqi_y_int
+ \__weiqi_within_range:nnT
+ { \l__weiqi_x_int } { \l__weiqi_y_int }
+ {
+ \__weiqi_draw_stone:nnnn { \l__weiqi_player_int }
+ { \l__weiqi_x_int } { \l__weiqi_y_int } { \l__weiqi_tmp_str }
+ }
+ }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_specific_stone:
+ {
+ \color_select:n { black }
+ \int_case:nn { \l__weiqi_player_int }
+ {
+ { 1 } { \color_fill:n { black } }
+ { 2 } { \color_fill:n { white } }
+ }
+ \draw_path_circle:nn{ \l__weiqi_x_fp cm, \l__weiqi_y_fp cm } { 4mm }
+ \draw_path_use_clear:n { draw, fill }
+ \int_case:nn { \l__weiqi_player_int }
+ {
+ { 1 } { \color_select:n { white } }
+ { 2 } { \color_select:n { black } }
+ }
+ \__weiqi_xy_to_loc:N \l_tmpa_str
+ \hbox_set:Nn \l_tmpa_box { \Large \textbf{ \l__weiqi_tmp_str } }
+ \hbox_set:Nn \l_tmpb_box { \Large \texttt{ \l_tmpa_str } }
+ \draw_box_use:Nn \l_tmpa_box
+ {
+ \l__weiqi_x_fp cm - 0.5 * { \box_wd:N \l_tmpa_box },
+ \l__weiqi_y_fp cm - 0.5 * { \box_ht:N \l_tmpa_box }
+ }
+ \color_select:n { black }
+ \draw_box_use:Nn \l_tmpb_box
+ {
+ \l__weiqi_x_fp cm + 6mm,
+ \l__weiqi_y_fp cm - 0.5 * { \box_ht:N \l_tmpa_box }
+ }
+ \fp_set:Nn \l_tmpa_fp { min(\l__weiqi_x_min_fp, \l__weiqi_x_max_fp) }
+ \fp_set:Nn \l_tmpb_fp { max(\l__weiqi_x_min_fp, \l__weiqi_x_max_fp) }
+ \fp_add:Nn \l__weiqi_x_fp { 2 }
+ \fp_compare:nNnT { \l__weiqi_x_fp } > { \l_tmpb_fp }
+ {
+ \fp_set_eq:NN \l__weiqi_x_fp \l_tmpa_fp
+ \fp_sub:Nn \l__weiqi_y_fp { 1 }
+ }
+ }
+\cs_new:Nn \__weiqi_draw_specific_stones:
+ {
+ \draw_linewidth:n { 1 }
+ \fp_set:Nn \l__weiqi_x_fp { min(\l__weiqi_x_min_int, \l__weiqi_x_max_int) }
+ \fp_set:Nn \l__weiqi_y_fp { min(\l__weiqi_y_min_int, \l__weiqi_y_max_int) - 1.2}
+ \int_step_inline:nn {\g__weiqi_step_count_int}
+ {
+ \int_set:Ne \l__weiqi_x_int
+ { \intarray_item:Nn \g__weiqi_x_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_y_int
+ { \intarray_item:Nn \g__weiqi_y_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_player_int
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } }
+ \str_set:Nx \l__weiqi_tmp_str
+ { \seq_item:Nn \g__weiqi_label_seq { ##1 } }
+ \seq_if_in:NnTF \g__weiqi_die_seq { ##1 }
+ { \int_set:Nn \l_tmpa_int { 0 } }
+ { \int_set_eq:NN \l_tmpa_int \l__weiqi_x_int }
+ \str_compare:eNeT { \l__weiqi_tmp_str } = {}
+ { \int_set:Nn \l_tmpa_int { 1 } }
+ \bool_lazy_all:nT
+ {
+ { \int_compare_p:nNn { \l_tmpa_int } = { 0 } }
+ { \int_compare_p:nNn { \l__weiqi_player_int } > { 0 } }
+ { \int_compare_p:nNn { \l__weiqi_player_int } < { 3 } }
+ }
+ { \__weiqi_draw_specific_stone: }
+ }
+ }
+\cs_new:Nn \__weiqi_show:
+ {
+ \draw_begin:
+ \group_begin:
+ \draw_transform_scale:n { \l__weiqi_scale_fp }
+ \__weiqi_draw_board:
+ \__weiqi_draw_points:
+ \__weiqi_draw_stones:
+ \__weiqi_draw_specific_stones:
+ \group_end:
+ \draw_end:
+ }
+\NewDocumentCommand \newweiqi { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \__weiqi_new_game:n { \g__weiqi_default_size_int } }
+ {
+ \IfBooleanT { #1 } { \int_gset:Nn \g__weiqi_default_size_int { #2 } }
+ \__weiqi_new_game:n { #2 }
+ }
+ }
+\NewDocumentCommand \weiqisize { s m }
+ {
+ \IfBooleanT{ #1 }
+ { \int_gset:Nn \g__weiqi_default_size_int { #2 } }
+ \int_set:Nn \g__weiqi_size_int { #2 }
+ }
+\NewDocumentCommand \weiqiblack { s o m }
+ {
+ \IfNoValueTF { #2 }
+ { \__weiqi_add_stones:nnn { 1 } { #3 } { } }
+ { \__weiqi_add_stones:nnn { 1 } { #3 } { #2 } }
+ }
+\NewDocumentCommand \weiqiwhite { s o m }
+ {
+ \IfNoValueTF { #2 }
+ { \__weiqi_add_stones:nnn { 2 } { #3 } { } }
+ { \__weiqi_add_stones:nnn { 2 } { #3 } { #2 } }
+ }
+\NewDocumentCommand \weiqisgf { s o m }
+ {
+ \IfNoValueTF { #2 }
+ { \__weiqi_add_sgf_stones:nn { #3 } { } }
+ { \__weiqi_add_sgf_stones:nn { #3 } { #2 } }
+ }
+\NewDocumentCommand \inputsgf { s o m }
+ {
+ \ior_open:Nn \g_tmpa_ior { #3 }
+ \str_set:Nn \l__weiqi_tmp_str {}
+ \ior_str_map_inline:Nn \g_tmpa_ior
+ {
+ \str_put_right:Nx \l__weiqi_tmp_str { ##1 }
+ }
+ \ior_close:N \g_tmpa_ior
+ \regex_extract_once:nVNTF { ;GM\[1\] } { \l__weiqi_tmp_str } \l_tmpa_seq
+ {
+ \regex_extract_once:nVNTF { SZ\[[0-9]+\] } { \l__weiqi_tmp_str } \l_tmpa_seq
+ {
+ \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { 1 } }
+ \str_set:Nx \l_tmpa_str { \str_range:Nnn \l_tmpa_str { 4 } { -2 } }
+ \int_set:Ne \l_tmpa_int { \l_tmpa_str }
+ \newweiqi [ \l_tmpa_int ]
+ \regex_extract_once:nVN { HA\[[0-9]+\] } { \l__weiqi_tmp_str } \l_tmpa_seq
+ \str_set:Nx \l_tmpa_str { \seq_item:Nn \l_tmpa_seq { 1 } }
+ \str_set:Nx \l_tmpa_str {\str_range:Nnn \l_tmpa_str { 4 } { -2 } }
+ \int_set:Ne \l_tmpa_int { \l_tmpa_str }
+ \IfNoValueTF { #2 }
+ { \int_add:Nn \l_tmpa_int { 1 } }
+ { \int_add:Nn \l_tmpa_int { #2 } }
+ \__weiqi_add_sgf_stones:VV { \l__weiqi_tmp_str } { \l_tmpa_int }
+ }
+ { 解析棋盘大小失败 }
+ }
+ { 不支持的棋谱 }
+ }
+\NewDocumentCommand \resetnumber { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \__weiqi_reset_stone_number:n { 1 } }
+ { \__weiqi_reset_stone_number:n { #2 } }
+ }
+\NewDocumentCommand \weiqilabel { s o m }
+ {
+ \IfBooleanT{ #1 } { \__weiqi_clear_labels: }
+ \IfNoValueTF { #2 }
+ { \__weiqi_add_stones:nnn { 3 } { #3 } { a } }
+ { \__weiqi_add_stones:nnn { 3 } { #3 } { #2 } }
+ }
+\NewDocumentCommand \clearlabel { }
+ { \__weiqi_clear_labels: }
+\NewDocumentCommand \weiqired { s m }
+ {
+ \IfBooleanT{ #1 } { \__weiqi_clear_points: }
+ \__weiqi_add_points:nn { red } { #2 }
+ }
+\NewDocumentCommand \weiqigreen { s m }
+ {
+ \IfBooleanT{ #1 } { \__weiqi_clear_points: }
+ \__weiqi_add_points:nn { green } { #2 }
+ }
+\NewDocumentCommand \weiqiblue { s m }
+ {
+ \IfBooleanT{ #1 } { \__weiqi_clear_points: }
+ \__weiqi_add_points:nn { blue } { #2 }
+ }
+\NewDocumentCommand \clearpoint { }
+ { \__weiqi_clear_points: }
+\NewDocumentCommand \weiqidie { s m }
+ {
+ \__weiqi_modify_stones:nN { #2 } \__weiqi_die_stone:n
+ }
+\NewDocumentCommand \weiqiremove { s m }
+ {
+ \__weiqi_modify_stones:nN { #2 } \__weiqi_remove_stone:n
+ }
+\NewDocumentCommand \weiqichange { s m }
+ {
+ \__weiqi_modify_stones:nN { #2 } \__weiqi_change_stone:n
+ }
+\NewDocumentCommand \showweiqi { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \__weiqi_calc_range: }
+ { \__weiqi_set_range:n { #2 } }
+ \__weiqi_show:
+ \IfBooleanF { #1 } { \newweiqi }
+ }
+\NewDocumentCommand \nonelocmode { s }
+ {
+ \bool_set_false:N \l__weiqi_show_loc_bool
+ \IfBooleanT { #1 } { \bool_gset_false:N \g__weiqi_show_loc_bool }
+ }
+\NewDocumentCommand \normallocmode { s }
+ {
+ \bool_set_true:N \l__weiqi_show_loc_bool
+ \str_set_eq:NN \l__weiqi_loc_mode_str \c__weiqi_normal_mode_str
+ \IfBooleanT { #1 }
+ {
+ \bool_gset_true:N \g__weiqi_show_loc_bool
+ \str_gset_eq:NN \g__weiqi_loc_mode_str \c__weiqi_normal_mode_str
+ }
+ }
+\NewDocumentCommand \sgflocmode { s }
+ {
+ \bool_set_true:N \l__weiqi_show_loc_bool
+ \str_set_eq:NN \l__weiqi_loc_mode_str \c__weiqi_sgf_mode_str
+ \IfBooleanT { #1 }
+ {
+ \bool_gset_true:N \g__weiqi_show_loc_bool
+ \str_gset_eq:NN \g__weiqi_loc_mode_str \c__weiqi_sgf_mode_str
+ }
+ }
+
+\NewDocumentCommand \weiqirotate { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \int_set:Nn \l_tmpa_int { 90 } }
+ { \int_set:Ne \l_tmpa_int { #2 } }
+ \int_compare:nNnT { \l_tmpa_int } < { 0 }
+ { \int_add:Nn \l_tmpa_int { 360 } }
+ \int_case:nn { \l_tmpa_int }
+ {
+ { 90 }
+ {
+ \bool_set_inverse:N \l__weiqi_swap_xy_bool
+ \int_set:Ne \l_tmpb_int { \l__weiqi_x_direction_int }
+ \int_set:Ne \l__weiqi_x_direction_int { \l__weiqi_y_direction_int }
+ \int_set:Ne \l__weiqi_y_direction_int { 0 - \l_tmpb_int }
+ }
+ { 180 }
+ {
+ \int_set:Ne \l__weiqi_x_direction_int { 0 - \l__weiqi_x_direction_int }
+ \int_set:Ne \l__weiqi_y_direction_int { 0 - \l__weiqi_y_direction_int }
+ }
+ { 270 }
+ {
+ \bool_set_inverse:N \l__weiqi_swap_xy_bool
+ \int_set:Ne \l_tmpb_int { \l__weiqi_x_direction_int }
+ \int_set:Ne \l__weiqi_x_direction_int { 0 - \l__weiqi_y_direction_int }
+ \int_set:Ne \l__weiqi_y_direction_int { \l_tmpb_int }
+ }
+ }
+ \IfBooleanT{ #1 }
+ {
+ \bool_gset_eq:NN \g__weiqi_swap_xy_bool \l__weiqi_swap_xy_bool
+ \int_gset_eq:NN \g__weiqi_x_direction_int \l__weiqi_x_direction_int
+ \int_gset_eq:NN \g__weiqi_y_direction_int \l__weiqi_y_direction_int
+ }
+ }
+\NewDocumentCommand \weiqimirror { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \str_set:Nn \l_tmpa_str { xy } }
+ { \str_set:Nx \l_tmpa_str { #2 } }
+ \str_case_e:nn { \l_tmpa_str }
+ {
+ { x }
+ {
+ \int_set:Ne \l__weiqi_x_direction_int { 0 - \l__weiqi_x_direction_int }
+ }
+ { y }
+ {
+ \int_set:Ne \l__weiqi_y_direction_int { 0 - \l__weiqi_y_direction_int }
+ }
+ { xy }
+ {
+ \int_set:Ne \l__weiqi_x_direction_int { 0 - \l__weiqi_x_direction_int }
+ \int_set:Ne \l__weiqi_y_direction_int { 0 - \l__weiqi_y_direction_int }
+ }
+
+ }
+ \IfBooleanT{ #1 }
+ {
+ \bool_set_eq:NN \g__weiqi_swap_xy_bool \l__weiqi_swap_xy_bool
+ \int_set_eq:NN \g__weiqi_x_direction_int \l__weiqi_x_direction_int
+ \int_set_eq:NN \g__weiqi_y_direction_int \l__weiqi_y_direction_int
+ }
+ }
+\NewDocumentCommand \weiqiposition { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \int_set:Nn \l_tmpa_int { 0 } }
+ { \int_set:Ne \l_tmpa_int { #2 } }
+ \int_compare:nNnT { \l_tmpa_int } < { 0 }
+ { \int_add:Nn \l_tmpa_int { 360 } }
+ \int_case:nn { \l_tmpa_int }
+ {
+ { 0 }
+ {
+ \bool_set_false:N \l__weiqi_swap_xy_bool
+ \int_set:Nn \l__weiqi_x_direction_int { 1 }
+ \int_set:Nn \l__weiqi_y_direction_int { 1 }
+ }
+ { 90 }
+ {
+ \bool_set_true:N \l__weiqi_swap_xy_bool
+ \int_set:Nn \l__weiqi_x_direction_int { 1 }
+ \int_set:Nn \l__weiqi_y_direction_int { -1 }
+ }
+ { 180 }
+ {
+ \bool_set_false:N \l__weiqi_swap_xy_bool
+ \int_set:Nn \l__weiqi_x_direction_int { -1 }
+ \int_set:Nn \l__weiqi_y_direction_int { -1 }
+ }
+ { 270 }
+ {
+ \bool_set_true:N \l__weiqi_swap_xy_bool
+ \int_set:Nn \l__weiqi_x_direction_int { -1 }
+ \int_set:Nn \l__weiqi_y_direction_int { 1 }
+ }
+ }
+ \IfBooleanT{ #1 }
+ {
+ \bool_gset_eq:NN \g__weiqi_swap_xy_bool \l__weiqi_swap_xy_bool
+ \int_gset_eq:NN \g__weiqi_x_direction_int \l__weiqi_x_direction_int
+ \int_gset_eq:NN \g__weiqi_y_direction_int \l__weiqi_y_direction_int
+ }
+ }
+\NewDocumentCommand \weiqiscale { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \fp_set:Nn \l__weiqi_scale_fp { 1.0 } }
+ { \fp_set:Nn \l__weiqi_scale_fp { #2 * \l__weiqi_scale_fp } }
+ \IfBooleanT{ #1 }
+ { \fp_set_eq:NN \g__weiqi_scale_fp \l__weiqi_scale_fp }
+ }
+\NewDocumentCommand \weiqiminsize { s m m }
+ {
+ \int_set:Nn \l__weiqi_min_width_int { #2 }
+ \int_set:Nn \l__weiqi_min_hight_int { #3 }
+ \IfBooleanT{ #1 }
+ {
+ \int_gset:Nn \g__weiqi_min_width_int { #2 }
+ \int_gset:Nn \g__weiqi_min_hight_int { #3 }
+ }
+ }
+\NewDocumentCommand \saveweiqi { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \str_set:Nx \l_tmpa_str { Default } }
+ { \str_set:Nx \l_tmpa_str { \int_to_alph:n { #2 } } }
+ \cs_if_free:cT { g__weiqi_size_int_\l_tmpa_str }
+ {
+ \int_new:c { g__weiqi_size_int_\l_tmpa_str }
+ \int_new:c { g__weiqi_step_count_int_\l_tmpa_str }
+ \intarray_new:cn { g__weiqi_x_intarray_\l_tmpa_str }
+ { \c__weiqi_max_step_int }
+ \intarray_new:cn { g__weiqi_y_intarray_\l_tmpa_str }
+ { \c__weiqi_max_step_int }
+ \intarray_new:cn { g__weiqi_player_intarray_\l_tmpa_str }
+ { \c__weiqi_max_step_int }
+ \seq_new:c { g__weiqi_label_seq_\l_tmpa_str }
+ \seq_new:c { g__weiqi_die_seq_\l_tmpa_str }
+ }
+ \int_gset_eq:cN { g__weiqi_size_int_\l_tmpa_str } \g__weiqi_size_int
+ \int_gset_eq:cN
+ { g__weiqi_step_count_int_\l_tmpa_str } \g__weiqi_step_count_int
+ \int_step_inline:nn { \c__weiqi_max_step_int }
+ {
+ \intarray_gset:cnn { g__weiqi_x_intarray_\l_tmpa_str } { ##1 }
+ { \intarray_item:Nn \g__weiqi_x_intarray { ##1 } }
+ \intarray_gset:cnn { g__weiqi_y_intarray_\l_tmpa_str } { ##1 }
+ { \intarray_item:Nn \g__weiqi_y_intarray { ##1 } }
+ \intarray_gset:cnn { g__weiqi_player_intarray_\l_tmpa_str } { ##1 }
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } }
+ }
+ \clist_gset_eq:cN { g__weiqi_label_seq_\l_tmpa_str } \g__weiqi_label_seq
+ \clist_gset_eq:cN { g__weiqi_die_seq_\l_tmpa_str } \g__weiqi_die_seq
+ }
+\NewDocumentCommand \useweiqi { s o }
+ {
+ \IfNoValueTF { #2 }
+ { \str_set:Nx \l_tmpa_str { Default } }
+ { \str_set:Nx \l_tmpa_str { \int_to_alph:n { #2 } } }
+ \cs_if_free:cTF { g__weiqi_size_int_\l_tmpa_str }
+ { \__weiqi_new_game:n { \g__weiqi_default_size_int } }
+ {
+ \int_set_eq:Nc \l_tmpa_int { g__weiqi_size_int_\l_tmpa_str }
+ \__weiqi_new_game:n { \l_tmpa_int }
+ \int_gset_eq:Nc \g__weiqi_step_count_int
+ { g__weiqi_step_count_int_\l_tmpa_str }
+ \int_step_inline:nn { \c__weiqi_max_step_int }
+ {
+ \intarray_gset:Nnn \g__weiqi_x_intarray { ##1 }
+ { \intarray_item:cn { g__weiqi_x_intarray_\l_tmpa_str } { ##1 } }
+ \intarray_gset:Nnn \g__weiqi_y_intarray { ##1 }
+ { \intarray_item:cn { g__weiqi_y_intarray_\l_tmpa_str } { ##1 } }
+ \intarray_gset:Nnn \g__weiqi_player_intarray { ##1 }
+ {
+ \intarray_item:cn
+ { g__weiqi_player_intarray_\l_tmpa_str } { ##1 }
+ }
+ }
+ \clist_set_eq:Nc \g__weiqi_label_seq { g__weiqi_label_seq_\l_tmpa_str }
+ \clist_set_eq:Nc \g__weiqi_die_seq { g__weiqi_die_seq_\l_tmpa_str }
+ }
+ \IfBooleanT{ #1 }
+ {
+ \__weiqi_clear_labels:
+ \int_step_inline:nn { \g__weiqi_step_count_int }
+ {
+ \seq_gset_item:Nnn \g__weiqi_label_seq { ##1 } {}
+ }
+ }
+ }
+\NewDocumentCommand \weiqidata { s }
+ {
+ \noindent 棋盘大小:\int_use:N \g__weiqi_size_int~
+ (默认:\int_use:N \g__weiqi_default_size_int)\\
+ 当前对局步数:\int_use:N \g__weiqi_step_count_int~(含纯标签及移除棋子)\\
+ \int_compare:nNnT { \g__weiqi_step_count_int } > { 0 }
+ { 序号:($x$,~$y$),所属方,标签,备注\\ }
+ \int_step_inline:nn {\g__weiqi_step_count_int}
+ {
+ \int_set:Ne \l__weiqi_x_int
+ { \intarray_item:Nn \g__weiqi_x_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_y_int
+ { \intarray_item:Nn \g__weiqi_y_intarray { ##1 } }
+ \int_set:Ne \l__weiqi_player_int
+ { \intarray_item:Nn \g__weiqi_player_intarray { ##1 } }
+ \str_set:Nx \l__weiqi_tmp_str
+ { \seq_item:Nn \g__weiqi_label_seq { ##1 } }
+ ##1:
+ (\int_use:N \l__weiqi_x_int,~\int_use:N \l__weiqi_y_int),
+ \int_case:nn { \l__weiqi_player_int }
+ {
+ { 1 } { B }
+ { 2 } { W }
+ { 3 } { L }
+ { 0 } { - }
+ },
+ \str_if_empty:NTF \l__weiqi_tmp_str
+ { \meta{空} }
+ { \l__weiqi_tmp_str },
+ \int_compare:nNnTF
+ { \l__weiqi_player_int } = { 0 }
+ { \meta{无效} }
+ {
+ \seq_if_in:NnT \g__weiqi_die_seq { ##1 }
+ { \meta{死子} }
+ {
+ \int_compare:nNnT
+ { \l__weiqi_x_int } = { 0 }
+ { \meta{虚着} }
+ }
+ }\\
+ }
+ 红色指示点:
+ \clist_if_empty:NTF \g__weiqi_red_point_clist
+ { \meta{空} }
+ { \clist_use:Nn \g__weiqi_red_point_clist {,~} }\\
+ 绿色指示点:
+ \clist_if_empty:NTF \g__weiqi_green_point_clist
+ { \meta{空} }
+ { \clist_use:Nn \g__weiqi_green_point_clist {,~} }\\
+ 蓝色指示点:
+ \clist_if_empty:NTF \g__weiqi_blue_point_clist
+ { \meta{空} }
+ { \clist_use:Nn \g__weiqi_blue_point_clist {,~} }\\
+ 方位信息:
+ \int_use:N \l__weiqi_x_direction_int,~
+ \int_use:N \l__weiqi_x_direction_int,~
+ \bool_to_str:N \l__weiqi_swap_xy_bool;~
+ (全局:
+ \int_use:N \g__weiqi_x_direction_int,~
+ \int_use:N \g__weiqi_x_direction_int,~
+ \bool_to_str:N \g__weiqi_swap_xy_bool
+ )\\
+ 缩放比例:\fp_use:N \l__weiqi_scale_fp~
+ (全局:\fp_use:N \g__weiqi_scale_fp)\\
+ 坐标刻度:\l__weiqi_loc_mode_str,~\bool_to_str:N \l__weiqi_show_loc_bool
+ (全局:\g__weiqi_loc_mode_str,~\bool_to_str:N \g__weiqi_show_loc_bool)\\
+ 最小显示尺寸:
+ \int_use:N \l__weiqi_min_width_int,~
+ \int_use:N \l__weiqi_min_hight_int~
+ (全局:
+ \int_use:N \g__weiqi_min_width_int,~
+ \int_use:N \g__weiqi_min_hight_int
+ )\\
+ \IfBooleanT{ #1 }
+ {
+ 棋子区间:
+ (\int_use:N \l__weiqi_x_min_int,~\int_use:N \l__weiqi_y_max_int),
+ (\int_use:N \l__weiqi_x_max_int,~\int_use:N \l__weiqi_y_min_int)\\
+ 棋盘边界:
+ (\fp_use:N \l__weiqi_x_min_fp,~\fp_use:N \l__weiqi_x_max_fp),
+ (\fp_use:N \l__weiqi_y_min_fp,~\fp_use:N \l__weiqi_y_max_fp)\\
+ 是否边路:
+ \bool_to_str:N \l__weiqi_up_bool,
+ \bool_to_str:N \l__weiqi_down_bool,
+ \bool_to_str:N \l__weiqi_left_bool,
+ \bool_to_str:N \l__weiqi_right_bool(上下左右)\\
+ }
+ }
+\newweiqi
+\ExplSyntaxOff
+\endinput
+%%
+%% End of file `weiqi.sty'.