diff options
author | Karl Berry <karl@freefriends.org> | 2024-02-26 21:00:02 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2024-02-26 21:00:02 +0000 |
commit | 7601acc97e5606a954255c65ba9a200d27230d51 (patch) | |
tree | 37267a789085e3f1382c1111d360d54073e5d66e /Master/texmf-dist/tex/latex/weiqi | |
parent | 0a1fe3f66e29ef96e93997a49b891d7e16667215 (diff) |
weiqi (26feb24)
git-svn-id: svn://tug.org/texlive/trunk@70178 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/weiqi')
-rw-r--r-- | Master/texmf-dist/tex/latex/weiqi/weiqi.sty | 1329 |
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'. |