<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
%%
%% ć–‡ä»¶ďĽšweiqi.dtx
%%
%% ç‰ćť (C) 2023-2024 By Ms_yam
%%
%% ĺ®ĺŹŻä»Ąĺś¨ LaTeX éˇąç›®ĺ…¬ĺ…±č®¸ĺŹŻďĽLPPLďĽ‰1.3c ĺŹŠäą‹ĺŽçš„ä»»ć„Źç‰ćś¬ďĽéšŹä˝&nbsp;çš„ć„Źč§ďĽ‰ä¸‹ĺ†ĺŹ‘ć–äż®ć”ąă€‚
%% čż™ä¸Şč®¸ĺŹŻçš„ćś€ć–°ç‰ćś¬ĺś¨ĺ¦‚ä¸‹ć–‡ä»¶ä¸­ďĽš
%%
%%   https://www.latex-project.org/lppl.txt
%%
%% ćś¬ĺ®ŹĺŚ…ä¸şä˝śč€…ç»äą&nbsp; epxl3 ĺ’ŚçĽ–ĺ†™ dtx ć–‡ä»¶ć‰€çĽ–ĺ†™ďĽŚé‡Śéť˘çš„ćŽĄĺŹŁĺŹŠć–ąćł•ĺą¶ä¸ŤćŻćś€äĽçš„ă€‚
%% ä»…äľ›ĺŹ‚č€ă€‚
%%
% \fi
%
% \iffalse
%&lt;*driver&gt;
\documentclass[full]{l3doc}

\usepackage{weiqi}

% ĺ›ĺ»şä»Łç&nbsp;ç¤şäľ‹
\usepackage{listings}
\ExplSyntaxOn
\makeatletter
\lst@RequireAspects{writefile}
\box_new:N \l__demo_box
\lstnewenvironment{demo}[1][code and example]
  {
    \use:c { demo_#1: }
  }
  { \use:c { demo_#1_end: } }
\cs_new:Nn \__demo_common:
  {
    \setkeys{lst}
      {
        basicstyle   = \ttfamily,
        gobble       = 2,
        language     = [LaTeX]{TeX},
      }
  }
\cs_new:Nn \__demo_input:
  {
    \catcode`\^^M = 10\relax
    \catcode`\% = 14\relax
    \input{\jobname.tmp}
  }  
\cs_new:Npn \__demo_init:nnn #1#2#3
  {
    \cs_set:cn {demo_#1:} { #2 }
    \cs_set:cn {demo_#1_end:} { #3 }
  }
   
\__demo_init:nnn{code and example}
  {%
    \hbox_set:Nw \l__demo_box
      \__demo_common:
      \lst@BeginAlsoWriteFile{\jobname.tmp}%
  }
  {%
      \lst@EndWriteFile    
    \hbox_set_end:    
    %\begin{center}
      \fp_compare:nNnTF
        { \box_wd:N \l__demo_box  } &gt; {  0.6 * \linewidth }
        {
          \begin{minipage}{\linewidth}
            \box_use:N \l__demo_box
          \end{minipage}%
          \par
          \begin{minipage}{\linewidth}
            \__demo_input:
          \end{minipage}
      }
      {
          \begin{minipage}{0.40\linewidth}
            \__demo_input:
          \end{minipage}%
          %\hfil
          \begin{minipage}{0.54\linewidth}
            \box_use:N \l__demo_box
          \end{minipage}%
      }
    %\end{center}
  }
\makeatother
\ExplSyntaxOff
 
% ^^A ć·»ĺŠ&nbsp;ä¸­ć–‡ć”ŻćŚĺŹŠč®ľç˝®č¶…çş§é“ľćŽĄ
\usepackage[UTF8,hyperref]{ctex} 
\hypersetup{ 
  colorlinks,
  linkcolor=blue,
  hyperindex,
  pdfstartview=FitH,
  plainpages=false,
  backref,
}

% ^^A ĺĽ•ç”¨ĺľ…ĺŠžĺŚ…
\usepackage{todo}

% ^^A ć±‰ĺŚ– l3doc çš„é¨ĺ†ĺ®šäą‰
\NewDocumentEnvironment { texnote } { }% ä¸Ťč˝ç”¨ Renew...ďĽŚĺŽźĺ›&nbsp;ćśŞçźĄ
{
  \endgraf
  \vspace{0.5em}% 3mm =&gt; 0.5em
  \small\textbf{\TeX{} é»‘ĺ®˘ç¬”č®°ďĽš}% \TeX~hackers~note:
}
{
  \vspace{0.5em}% 3mm =&gt; 0.5em
}

\begin{document}
  \DocInput{\jobname.dtx}
  \todos % ^^A ĺ—ĺ‡şĺľ…ĺŠžäş‹ĺ®ś
\end{document}
%&lt;/driver&gt;
% \fi
%
% \title{^^A
%   \pkg{weiqi}ĺ®ŹĺŚ…ďĽšç»ĺ¶ĺ›´ćŁ‹ćŁ‹č°±^^A
% }
%
% \author{Ms\_yam\thanks
%     {^^A
%       ćś¬ĺ®ŹĺŚ…ćŻä˝śč€…ç»äą&nbsp; \LaTeX3 ĺ’ŚçĽ–ĺ†™ dtx ć–‡ä»¶çš„ä˝śĺ“ďĽŚé‡Śéť˘çš„ćŽĄĺŹŁĺŹŠć–ąćł•ĺą¶ćśŞäĽĺŚ–ďĽ›ä˝†ĺ®ŹĺŚ…ćĽŹć´žäĽšĺ°˝ĺŠ›äż®ĺ¤Ťă€‚
%     }^^A
%   \  ďĽ\href{mailto:Ms_yam@163.com}{Ms\_yam@163.com}ďĽ‰^^A
% }
% \date{\zhdigits*{2024}ĺą´\zhnumber{02}ćś\zhnumber{22}ć—Ą}
%
% \maketitle
%
% \DoNotIndex{\[,\\,\]}
% \DoNotIndex{\Large, \meta, \noindent, \textbf, \texttt}
% \DoNotIndex{\ExplSyntaxOn, \ExplSyntaxOff, \NeedsTeXFormat, \RequirePackage, \ProvidesExplPackage, \NewDocumentCommand}
% \DoNotIndex{\IfBooleanT, \IfBooleanF, \IfNoValueTF}
% \DoNotIndex{\bool_new:N, \bool_set_eq:NN, \bool_set_false:N, \bool_set_inverse:N, \bool_set_true:N, \bool_to_str:N}
% \DoNotIndex{\bool_gset_eq:NN, \bool_gset_false:N, \bool_gset_true:N}
% \DoNotIndex{\bool_if:nT, \bool_if:NT, \bool_if:nTF, \bool_if:NTF}
% \DoNotIndex{\bool_lazy_all:nT, \bool_lazy_all:nTF, \bool_lazy_and:nnT, \bool_lazy_and:nnTF}
% \DoNotIndex{\bool_lazy_any:nTF, \bool_lazy_or:nnT, \bool_lazy_or:nnF, \bool_lazy_or:nnTF}
% \DoNotIndex{\box_ht:N, \box_wd:N}
% \DoNotIndex{\clist_new:N, \clist_const:Nn, \clist_clear:N, \clist_set:Nn, \clist_set_eq:NN, \clist_set_from_seq:NN, \clist_pop:NN, \clist_use:Nn}
% \DoNotIndex{\clist_gclear:N, \clist_gput_right:Nn, \clist_set_eq:Nc, \clist_gset_eq:NN, \clist_gset_eq:cN}
% \DoNotIndex{\clist_if_empty:NTF, \clist_map_function:NN, \clist_map_inline:Nn}
% \DoNotIndex{\color_fill:n, \color_select:n}
% \DoNotIndex{\cs_new:Nn, \cs_new:Npn, \cs_generate_variant:Nn, \cs_if_free:cT, \cs_if_free:cTF}
% \DoNotIndex{\draw_begin:, \draw_end:, \draw_linewidth:n, \draw_path_circle:nn, \draw_path_lineto:n, \draw_path_moveto:n}
% \DoNotIndex{\draw_box_use:Nn, \draw_path_use_clear:n, \draw_transform_scale:n}
% \DoNotIndex{\fp_new:N, \fp_set_eq:NN, \fp_set:Nn, \fp_add:Nn,\fp_sub:Nn, \fp_compare:nNnT, \fp_compare:nNnTF, \fp_gset:Nn, \fp_use:N}
% \DoNotIndex{\group_begin:, \group_end:}
% \DoNotIndex{\hbox_set:Nn}
% \DoNotIndex{\int_new:N, \int_new:c, \int_const:Nn, \int_set_eq:NN, \int_set_eq:Nc, \int_set:Nn, \int_set:Ne, \int_add:Nn, \int_incr:N, \int_use:N} 
% \DoNotIndex{\int_gset:Nn, \int_gset:Ne, \int_gincr:N, \int_gset_eq:NN, \int_gset_eq:Nc, \int_gset_eq:cN}
% \DoNotIndex{\int_max:nn, \int_min:nn,  \int_sign:n, \int_abs:n, \int_from_alph:n, \int_from_alph:e, \int_to_alph:n, \int_to_Alph:n}
% \DoNotIndex{\int_case:nn, \int_compare_p:n, \int_compare_p:nNn, \int_compare:nNnT, \int_compare:nNnF, \int_compare:nNnTF}
% \DoNotIndex{\int_if_zero:nF, \int_if_zero:nTF, \int_step_inline:nn, \int_step_inline:nnnn}
% \DoNotIndex{\intarray_new:Nn, \intarray_new:cn, \intarray_gset:Nnn, \intarray_gset:cnn, \intarray_gzero:N, \intarray_item:Nn, \intarray_item:cn}
% \DoNotIndex{\ior_open:Nn, \ior_close:N, \ior_str_map_inline:Nn}
% \DoNotIndex{\prg_set_conditional:Npnn, \prg_return_false:, \prg_return_true:, \prg_generate_conditional_variant:Nnn, \prg_break_point:, \prg_break:}
% \DoNotIndex{\regex_match:nn, \regex_match:nnTF, \regex_match:nVTF, \regex_extract_all:nnN}
% \DoNotIndex{\regex_extract_once:nnN, \regex_extract_once:nVN, \regex_extract_once:nnNTF, \regex_extract_once:nVNTF}
% \DoNotIndex{\seq_new:N, \seq_new:c, \seq_put_right:Nn, \seq_item:Nn, \seq_gclear:N, \seq_gset_item:Nnn, \seq_gset_item:NnV}
% \DoNotIndex{\seq_if_in:NnT, \seq_if_in:NnF, \seq_if_in:NnTF}
% \DoNotIndex{\str_new:N, \str_const:Nn, \str_set:Nn, \str_set:NV, \str_set:Nx, \str_set_eq:NN}
% \DoNotIndex{\str_put_right:Nn, \str_put_right:NV, \str_put_right:Nx}
% \DoNotIndex{\str_gset_eq:NN}
% \DoNotIndex{\str_head:N, \str_item:Nn, \str_range:Nnn, \str_range:nnn, \str_tail:N, \str_lowercase:n}
% \DoNotIndex{\str_if_empty_p:N, \str_if_empty:NTF, \str_if_empty:nTF, \str_if_eq_p:nn, \str_if_eq_p:Vn, \str_if_eq:nnTF}
% \DoNotIndex{\str_case:nn, \str_case_e:nn, \str_compare:eNeT, \str_compare:nNnTF, \str_compare:eNeTF}
%
% \begin{documentation}
%
% \section{\pkg{weiqi} ć–‡ćˇŁ}
%
% ćś¬ĺ®ŹĺŚ…ćŹäľ›äş†ç»ĺ¶ĺ›´ćŁ‹ćŁ‹č°±ĺŠźč˝ă€‚ćś¬ĺ®ŹĺŚ…ĺŹ‚č€ďĽć–ĺ»¶ç”¨ďĽ‰äş† \pkg{igo} ĺ®ŹĺŚ…çš„é¨ĺ†ĺ‘˝ä»¤ďĽŚ
% ä˝†ćś¬ĺ®ŹĺŚ…çš„ĺ®žçŽ°ĺ®Śĺ…¨é‡‡ç”¨ \pkg{expl3} ć–ąĺĽŹă€‚
%
% ćś¬ĺ®ŹĺŚ…çš„ç»ĺ›ľé‡‡ç”¨ \pkg{l3draw} ĺ®ŹĺŚ…ďĽ2024-01-04 ç‰ďĽ‰ĺ®žçŽ°ďĽŚĺ›&nbsp;ĺ‰Ťč€…ĺ…·ćś‰\emph{é«ĺş¦}ĺ®žéŞŚć€§ďĽŚĺ›&nbsp;äş›ćś¬
% ĺ®ŹĺŚ…äąźĺŚć&nbsp;·ĺ…·ä˝“\emph{é«ĺş¦}ĺ®žéŞŚć€§ă€‚
%
%
% \subsection{ç›¸ĺ…łć¦‚ĺżµ}^^A
%
%
% \subsubsection{ĺ°şĺŻ¸}
%
% ćś¬ĺ®ŹĺŚ…ä¸­çš„ \meta{ĺ°şĺŻ¸} ç‰ąćŚ‡ćŁ‹ç›ĺ°şĺŻ¸ďĽĺŤłä¸€ä¸Şć–ąĺ‘ĺŚ…ĺ«ĺ‡&nbsp;č·ŻďĽ‰ďĽŚćŁ‹ç›ĺ¤§ĺ°Źä¸ş \meta{ĺ°şĺŻ¸} x \meta{ĺ°şĺŻ¸}ă€‚
% ćś¬ĺ®ŹĺŚ…ć”ŻćŚçš„ \meta{ĺ°şĺŻ¸} ĺŹ–ĺ€Ľä¸ş $2$\~{}$26$ďĽŚä˝†é€šĺ¸¸ĺ»şč®®ä˝żç”¨ $9$ă€$13$ ĺ’Ś $19$ ä¸‰ç§Ťĺ°şĺŻ¸ă€‚
% ĺ…¶ä¸­ďĽŚ$19$x$19$ ä¸şć&nbsp;‡ĺ‡†ćŁ‹ç›ĺ¤§ĺ°ŹďĽäąźćŻé»č®¤ĺ¤§ĺ°ŹďĽ‰ă€‚
%
%
% \subsubsection{ĺťć&nbsp;‡}
% 
% ä¸şć–ąäľżćŹŹčż°č˝ĺ­ä˝Ťç˝®ďĽŚćś¬ĺ®ŹĺŚ…äľťćŻäľ‹é‡‡ç”¨ \meta{ĺťć&nbsp;‡} çš„ć¦‚ĺżµă€‚
% ćś¬ĺ®ŹĺŚ…ć”ŻćŚä¸¤ç§Ťĺ˝˘ĺĽŹçš„ \meta{ĺťć&nbsp;‡}ďĽšä»Ąĺ·¦ä¸‹č§’ä¸şčµ·ç‚ąďĽĺ¸¸č§„ć¨ˇĺĽŹďĽ‰ĺ’Śĺ·¦ä¸Šč§’ä¸şčµ·ç‚ąďĽ$SGF$ ć¨ˇĺĽŹďĽ‰ă€‚
%
% ä¸¤ç§Ťĺ˝˘ĺĽŹçš„ć¨Şĺťć&nbsp;‡ç›¸ĺŚďĽŚä»Žĺ·¦ĺľ€ĺŹłäľťć¬ˇä¸ş $a$ă€$b$ă€\dotsă€‚ĺ®ä»¬çš„ĺŚşĺ«ĺś¨äşŽďĽš
% ĺ‰Ťč€…çşµĺťć&nbsp;‡ä»Žä¸‹ĺľ€ä¸Šäľťć¬ˇä¸ş $1$ă€$2$ă€\dotsďĽ›č€ŚĺŽč€…çš„çşµĺťć&nbsp;‡ä»Žä¸Šĺľ€ä¸‹äľťć¬ˇä¸ş $a$ă€$b$ă€\dotsă€‚
% ĺ‰Ťč€…ćŻä¸şäľżäşŽäşşĺ‘äş¤äş’č®ľč®ˇďĽŚĺŽč€…ćŻä¸şć”ŻćŚ $sgf$ ćŁ‹č°±ĺťć&nbsp;‡č€Śč®ľč®ˇă€‚
%
% ć¨Şĺťć&nbsp;‡ä¸Žçşµĺťć&nbsp;‡ç»„ĺĺ˝˘ć \meta{ĺťć&nbsp;‡}ďĽŚĺ¦‚ |a1|ă€|dp| ç­‰ă€‚
% é€šĺ¸¸éś€č¦ \meta{ĺťć&nbsp;‡} çš„ĺś°ć–ąďĽŚäąźć”ŻćŚé€—ĺŹ·ĺ—čˇ¨ĺ˝˘ĺĽŹçš„ \meta{ĺťć&nbsp;‡} é›†ĺďĽŚĺ¦‚ â€ś|a2, b2, dp|â€ťă€‚
%
% \begin{minipage}{0.45\linewidth}
%   \newweiqi
%   \showweiqi[a1,e4]
% \end{minipage}%
% \begin{minipage}{0.45\linewidth}
%   \sgflocmode
%   \showweiqi[aa,ed]
% \end{minipage}\\
%
%
% \subsubsection{č™šçť€}
%
% ĺ›´ćŁ‹ćś‰ä¸€ä¸ŞćŻ”čľç‰ąć®Šçš„č§„ĺ™ďĽšĺ®ĺ…č®¸ä¸€ć–ąĺśä¸€ć‰‹ďĽäąźĺŹ«č™šçť€ďĽ‰ďĽŚĺŹ¦ä¸€ć–ąç»§ç»­ä¸‹ă€‚
% ä¸şäş†ä»Ąç»źä¸€çš„ć–ąĺĽŹč®°ĺ˝•ćŻŹä¸€ć‰‹ćŁ‹ďĽŚç‰ąĺ°†č™šçť€çš„ \meta{ĺťć&nbsp;‡} ĺ®šäą‰ä¸ş |-| ć– |pass|ă€‚
%
% \subsection{ĺźşćś¬ĺ‘˝ä»¤}^^A 
%
%
% \begin{function}{\newweiqi}
%   \begin{syntax}
%     \cs{newweiqi} [\meta{ĺ°şĺŻ¸}]
%   \end{syntax}
%   ĺťĺ§‹ĺŚ–ć–°ĺŻąĺ±€ďĽŚ\meta{ĺ°şĺŻ¸}ç”¨äşŽćŚ‡ĺ®šćŁ‹ç›ĺ¤§ĺ°ŹďĽé»č®¤ä¸ş $19$ďĽ‰ă€‚
%   ĺ¸¦ćźĺŹ·ç‰ćś¬ĺŚć—¶ć›´ć”ą \meta{ĺ°şĺŻ¸} çš„é»č®¤ĺ€Ľă€‚
% \end{function}
%
%
% \begin{function}{\weiqisize}
%   \begin{syntax}
%     \cs{weiqisize} \Arg{ĺ°şĺŻ¸}
%   \end{syntax}
%   äż®ć”ąćŁ‹ç›ĺ¤§ĺ°Źä¸ş \meta{ĺ°şĺŻ¸}ă€‚
%   ĺ¸¦ćźĺŹ·ç‰ćś¬ĺŚć—¶ć›´ć”ą \meta{ĺ°şĺŻ¸} çš„é»č®¤ĺ€Ľă€‚
%   \begin{texnote}
%     äż®ć”ąćŁ‹ç›ĺ°şĺŻ¸ä¸ŤäĽšćŁ€ćźĄĺ·˛ćś‰ćŁ‹ĺ­ćŻĺ¦č¶Šç•Śă€‚
%     ĺŚć—¶čżäĽšĺĽ•ĺŹ‘ĺ·˛ćś‰çš„ \meta{ĺťć&nbsp;‡}ä¸ş $SGF$ ć¨ˇĺĽŹçš„ćŁ‹ĺ­çš„ä˝Ťç˝®é”™äą±ă€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{function}{\weiqiblack, \weiqiwhite}
%   \begin{syntax}
%     \cs{weiqiblack} [\meta{ć&nbsp;‡ç­ľ}] \Arg{ĺťć&nbsp;‡}
%   \end{syntax}
%   ĺ‘ĺ˝“ĺ‰ŤĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ćŁ‹ĺ­ă€‚
%   ĺ…¶ä¸­ďĽŚĺ¦‚ćžś \meta{ć&nbsp;‡ç­ľ} ä¸şć‰‹ć•°ďĽŚĺ™äĽšč‡ŞĺŠ¨é€’ĺ˘žä¸”ĺ‡ćŤ˘é»‘ç™˝ć–ąă€‚
%   ĺ¦‚ćžś \meta{ć&nbsp;‡ç­ľ} ä¸ş $0$ďĽŚĺ™ä¸Ťćľç¤şć&nbsp;‡ç­ľä˝†ä»Ťĺ‡ćŤ˘é»‘ç™˝ć–ąă€‚
%   \meta{ĺťć&nbsp;‡} ćŻä¸€ç»„čˇ¨ç¤şćŁ‹ĺ­ä˝Ťç˝®çš„é€—ĺŹ·ĺ†éš”ĺ—čˇ¨ďĽŚćŻŹä¸€éˇąčˇ¨ç¤şä¸€ć‰‹ćŁ‹ďĽ›
%   é»č®¤ä»Ąĺ·¦ä¸‹č§’çš„ \meta{ĺťć&nbsp;‡} ä¸ş $a1$ďĽ›č™šçť€čŻ·ä˝żç”¨ $-$ă€|pass| ć–ç•™ç©şă€‚
% \end{function}
%
%
% \begin{function}{\weiqidie}
%   \begin{syntax}
%     \cs{weiqidie} \Arg{ĺťć&nbsp;‡}
%   \end{syntax}
%   č®ľç˝®ćŚ‡ĺ®šä˝Ťç˝®çš„ćŁ‹ĺ­ä¸şć­»ĺ­ă€‚
%   \meta{ĺťć&nbsp;‡} ćŻä¸€ç»„čˇ¨ç¤şćŁ‹ĺ­ä˝Ťç˝®çš„é€—ĺŹ·ĺ†éš”ĺ—čˇ¨ďĽŚćŻŹä¸€éˇąčˇ¨ç¤şä¸€ä¸Şä˝Ťç˝®ă€‚
%   \begin{texnote}
%     ć­»ĺ­ćŻäą‹ĺ‰Ťĺ·˛ç»Źä¸‹čż‡çš„ćŁ‹ĺ­ďĽŚĺ›&nbsp;ä¸şć˛ˇćś‰ć°”ďĽŚć‰€ä»Ąéś€č¦ä»ŽćŁ‹ç›ć‹żčµ°ă€‚
%     ĺ°†ć˛ˇćś‰ć&nbsp;‡ç­ľçš„ćŁ‹ĺ­ć&nbsp;‡č®°ä¸şć­»ĺ­ćŻć˛ˇćś‰ć„Źäą‰çš„ă€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{function}{\showweiqi}
%   \begin{syntax}
%     \cs{showweiqi} [\meta{ĺŚşé—´}] 
%   \end{syntax}
%   ç»ĺ¶ĺŻąĺ±€ă€‚ĺ¦‚ćžśćŚ‡ĺ®š \meta{ĺŚşé—´}ďĽŚĺ™ \meta{ĺŚşé—´} ĺş”ç”±ä¸¤ä¸Şč§’ç‚ąĺťć&nbsp;‡ć– |full| ç»„ćďĽŚä»Ąç¤şćŚ‡ĺ®šĺŚşé—´ĺ†…çš„äżˇćŻďĽ›
%   ĺ¦‚ćśŞćŚ‡ĺ®šĺŚşé—´ďĽŚĺ™äĽšč‡ŞĺŠ¨č®ˇç®—čŚĺ›´ďĽŚčŻĄčŚĺ›´ĺŹŻäżťčŻč‡łĺ°‘ĺŚ…ĺ«ä¸€ä¸Şč§’ďĽŚĺ…¶ä˝™čľąč‡łĺ°‘ä˝™ä¸€č·Żă€‚
%   é»č®¤ć…ĺ†µćľç¤şĺ®ŚćĺŽäĽšć¸…é™¤ĺŻąĺ±€ďĽŚä˝żç”¨ćźĺŹ·ĺ‘˝ä»¤ĺŹŻäżťç•™ĺŻąĺ±€ă€‚
%   \begin{texnote}
%     č‡ŞĺŠ¨č®ˇç®—çš„čŚĺ›´äĽšč€č™‘ćś€ĺ°Źćľç¤şĺ¤§ĺ°ŹďĽ›ĺ¦‚ćžśćŚ‡ĺ®šĺŚşé—´ďĽŚĺ™ä¸ŤĺŹ—ć­¤é™ĺ¶ă€‚ĺŚşé—´ĺ¤–ĺ†…ĺ®ąä¸ŤäĽšćľç¤şă€‚
%   \end{texnote}
% \end{function}
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack[0]{bq,dq,-}
%   \weiqiwhite[1]{b2,c2,c3,a2,d2,b1}
%   \weiqiwhite[7]{-,b2}
%   \weiqidie{b2}
%   \showweiqi
% \end{demo}\\
%
%
% ć­»ĺ­ĺ’Śĺ¸¦ć&nbsp;‡ç­ľďĽé€šĺ¸¸ä¸şć‰‹ć•°ďĽ‰č™šçť€äĽšç»ĺ¶ĺś¨ćŁ‹ç›ä¸‹ć–ąďĽ›ä¸Ťĺ¸¦ć&nbsp;‡ç­ľçš„č™šçť€ĺ™ä¸ŤäĽšç»ĺ¶ďĽĺ›&nbsp;ä¸şĺ®ć˛ˇćś‰ä»»ć„Źĺ®žé™…ć„Źäą‰ďĽ‰ă€‚
%
% \subsection{ć&nbsp;‡ç­ľä¸ŽćŚ‡ç¤şç‚ą}^^A 
%
%
% \begin{function}{\weiqilabel, \clearlabel}
%   \begin{syntax}
%     \cs{weiqilabel} [\meta{ć&nbsp;‡ç­ľ}] \Arg{ĺťć&nbsp;‡}\\
%     \cs{clearlabel}
%   \end{syntax}
%   ĺ‘ĺ˝“ĺ‰ŤĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ć&nbsp;‡ç­ľďĽŚć–ć¸…é™¤ĺŻąĺ±€ä¸­çš„ć‰€ćś‰ć&nbsp;‡ç­ľă€‚
%   ĺ…¶ä¸­ďĽŚĺ¦‚ćžś \meta{ć&nbsp;‡ç­ľ} ä¸şć‰‹ć•°ďĽŚĺ™äĽšč‡ŞĺŠ¨é€’ĺ˘žă€‚\meta{ć&nbsp;‡ç­ľ} é»č®¤ä¸ş $a$ă€‚
%   \meta{ĺťć&nbsp;‡} ćŻä¸€ç»„čˇ¨ç¤şćŁ‹ĺ­ä˝Ťç˝®çš„é€—ĺŹ·ĺ†éš”ĺ—čˇ¨ďĽŚćŻŹä¸€éˇąčˇ¨ç¤şä¸€ä¸Şć&nbsp;‡ç­ľă€‚
%   ĺ¸¦ćźĺŹ·ç‰ćś¬ĺś¨ć·»ĺŠ&nbsp;ć&nbsp;‡ç­ľçš„ĺŚć—¶äĽšĺ&nbsp;é™¤ć—§çš„ć&nbsp;‡ç­ľă€‚
%   \begin{texnote}
%     ĺ¦‚ćžś \meta{ć&nbsp;‡ç­ľ} ä¸ş $0$ ć–ä¸şç©şďĽ|[]|ďĽ‰ďĽŚĺ™ćľç¤şĺ®žĺżç©şç™˝ĺś†ă€‚
%     \meta{ĺťć&nbsp;‡} č§„ĺ™ä¸ŽćŁ‹ĺ­ä¸€č‡´ďĽŚćś¬č§„ĺ™ĺś¨ć‰€ćś‰ \meta{ĺťć&nbsp;‡} ä¸­ç”źć•ă€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{function}{\weiqired, \weiqigreen, \weiqiblue, \clearpoint}
%   \begin{syntax}
%     \cs{weiqired} \Arg{ĺťć&nbsp;‡}\\
%     \cs{clearpoint} 
%   \end{syntax}
%   ĺ‘ĺ˝“ĺ‰ŤĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ćŚ‡ç¤şç‚ąďĽŚć–ć¸…é™¤ć‰€ćś‰ćŚ‡ç¤şç‚ąă€‚
%   \meta{ĺťć&nbsp;‡} ćŻä¸€ç»„čˇ¨ç¤şćŁ‹ĺ­ä˝Ťç˝®çš„é€—ĺŹ·ĺ†éš”ĺ—čˇ¨ďĽŚćŻŹä¸€éˇąčˇ¨ç¤şä¸€ä¸Şç‚ąă€‚
%   ĺ¸¦ćźĺŹ·ç‰ćś¬ĺś¨ć·»ĺŠ&nbsp;ć&nbsp;‡ç­ľçš„ĺŚć—¶äĽšĺ&nbsp;é™¤ć—§çš„ćŚ‡ç¤şç‚ąďĽĺ«ĺ…¶ĺ®é˘śč‰˛ďĽ‰ă€‚
% \end{function}
%
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack{a2,-,b1,cq}
%   \weiqilabel[1]{c2,dq,-}
%   \weiqired{d2,e3,-}
%   \weiqigreen{b3}
%   \showweiqi[a1,e3]
% \end{demo}
%
%
% \subsection{ćŁ‹ç›č®ľç˝®}^^A 
%  
%
% \begin{function}{\weiqirotate, \weiqimirror, \weiqiposition}
%   \begin{syntax}
%     \cs{weiqirotate} [\meta{č§’ĺş¦}]\\
%     \cs{weiqimirror} [\meta{é•śĺŹč˝´}]\\
%     \cs{weiqiposition} [\meta{č§’ĺş¦}]
%   \end{syntax}
%   čż™ä¸‰ä¸Şĺ‘˝ä»¤ç”¨äşŽč®ľç˝®ćŁ‹ç›çš„ć–ąä˝ŤďĽć—‹č˝¬ă€é•śĺŹĺŹŠćŚ‡ĺ®šć–ąĺ‘ďĽ‰ă€‚
%   ĺ…¶ä¸­ďĽŚĺ‰Ťä¸¤ä¸Şĺ‘˝ä»¤ćŻĺźşäşŽĺ·˛ćś‰ć–ąä˝Ťçš„ďĽŚćś€ĺŽä¸€ä¸Şĺ™ä¸Ťč€č™‘ĺ˝“ĺ‰Ťć–ąä˝Ťă€‚\\
%   \meta{č§’ĺş¦}ä»Ąĺş¦ä¸şĺŤ•ä˝ŤďĽé€†ć—¶é’ć–ąĺ‘ďĽ‰ďĽŚĺ¦‚ćśŞćŚ‡ĺ®šďĽŚé»č®¤ĺ†ĺ«ä¸ş $90$ ĺş¦ďĽć—‹č˝¬ďĽ‰ĺ’Ś $0$ ĺş¦ďĽćŚ‡ĺ®šć–ąĺ‘ďĽ‰ă€‚
%   \meta{é•śĺŹč˝´} ĺş”ĺ˝“ä¸ş $x$ă€$y$ ć– $xy$ďĽé»č®¤ďĽ‰ ä¸‰č€…äą‹ä¸€ă€‚\\
%   ä˝żç”¨ćźĺŹ·ĺ‘˝ä»¤ĺŹŻä˝żĺ˝“ĺ‰ŤćŁ‹ç›ć–ąä˝Ťä¸şé»č®¤ć–ąä˝Ťă€‚
% \end{function}
%
%
% \begin{function}{\weiqiscale}
%   \begin{syntax}
%     \cs{weiqiscale} [\meta{ćŻ”äľ‹}] 
%   \end{syntax}
%   ćŚ‰ \meta{ćŻ”äľ‹} çĽ©ć”ľćŁ‹ç›ă€‚ ĺ¦‚ćśŞćŚ‡ĺ®šďĽŚĺ™ć˘ĺ¤Ťé»č®¤ćŻ”äľ‹ă€‚
%   ä˝żç”¨ćźĺŹ·ĺ‘˝ä»¤ĺŹŻä˝żĺ˝“ĺ‰ŤçĽ©ć”ľćŻ”äľ‹ä¸şé»č®¤çĽ©ć”ľćŻ”äľ‹ă€‚çĽ©ć”ľćŻĺźşäşŽĺŽźćś‰ćŻ”äľ‹çš„ă€‚
% \end{function}
%
%
% \begin{function}{\weiqiminsize}
%   \begin{syntax}
%     \cs{weiqiminsize} \meta{ĺ®˝ĺş¦} \meta{é«ĺş¦} 
%   \end{syntax}
%   ćŁ‹ç›ćś€ĺ°Źćľç¤şĺ¤§ĺ°ŹďĽä»Ąć&nbsp;Ľĺ­č®ˇďĽ‰ďĽŚä˝żç”¨ćźĺŹ·ĺ‘˝ä»¤ĺŹŻä˝żĺ˝“ĺ‰Ťĺ¤§ĺ°Źä¸şé»č®¤ĺ€Ľă€‚
% \end{function}
%
%
% \begin{function}{\nonelocmode, \normallocmode, \sgflocmode}
%   \begin{syntax}
%     \cs{nonelocmode}
%   \end{syntax}
%   ĺ°†ćŁ‹ç›ĺťć&nbsp;‡ćľç¤şć–ąĺĽŹč®ľç˝®ä¸şďĽšä¸Ťćľç¤şĺťć&nbsp;‡ă€ĺ¸¸č§„ć¨ˇĺĽŹĺťć&nbsp;‡ĺ’Ś $SGF$ ć¨ˇĺĽŹĺťć&nbsp;‡äą‹ä¸€ă€‚
%   ĺ…¶ä¸­ďĽŚé»č®¤ä¸şĺ¸¸č§„ć¨ˇĺĽŹďĽŚä˝żç”¨ćźĺŹ·ĺ‘˝ä»¤ĺŹŻä˝żĺ˝“ĺ‰Ťč®ľç˝®ä¸şé»č®¤ĺ€Ľă€‚ 
% \end{function}
%
% ~\\
% \begin{demo}
%   \newweiqi
%   \weiqiblack[1]{a2,b2,c3,-,dr}
%   \weiqilabel[A]{dq}
%   \weiqirotate[180]
%   \weiqiscale[0.8]
%   \weiqiminsize{6}{5}
%   \sgflocmode
%   \showweiqi
% \end{demo}
%
%
% \subsection{ćŁ‹ĺ±€ĺ¤Ťç”¨}^^A 
%
% \begin{function}{\saveweiqi, \useweiqi}
%   \begin{syntax}
%     \cs{saveweiqi} [\meta{ĺşŹĺŹ·}] 
%   \end{syntax}
%   äżťĺ­/ä˝żç”¨ĺŻąĺ±€ďĽĺŹŞäżťç•™ĺŻąĺ±€äżˇćŻďĽŚćŁ‹ç›ć–ąä˝Ťç­‰äżˇćŻä¸Ťäżťĺ­ďĽ‰ă€‚
%   \meta{ĺşŹĺŹ·} ćŻäżťĺ­çš„ä˝Ťç˝®ĺşŹĺŹ·ďĽč‡Şç„¶ć•°ďĽŚćŽ¨čŤ $0$\~{}$26$ďĽ‰ă€‚
%   ćźĺŹ·ç‰ä˝żç”¨ĺŻąĺ±€äĽšĺ&nbsp;é™¤ć‰€ćś‰ćŁ‹ĺ­ć&nbsp;‡ç­ľĺŹŠć&nbsp;‡ç­ľă€‚
% \end{function}
%
%
% \begin{function}{\weiqichange}
%   \begin{syntax}
%     \cs{weiqichange} \Arg{ĺťć&nbsp;‡}
%   \end{syntax}
%   ĺ‡ćŤ˘ćŚ‡ĺ®šä˝Ťç˝®çš„ćŁ‹ĺ­çš„ć‰€ĺ±žć–ąďĽé»‘ç™˝ć–ąďĽ‰ă€‚
%   \meta{ĺťć&nbsp;‡} ćŻä¸€ç»„čˇ¨ç¤şćŁ‹ĺ­ä˝Ťç˝®çš„é€—ĺŹ·ĺ†éš”ĺ—čˇ¨ďĽŚćŻŹä¸€éˇąčˇ¨ç¤şä¸€ä¸Şä˝Ťç˝®ă€‚
% \end{function}
%
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack[1]{a2,b2,c3,-,dr}
%   \weiqilabel[A]{dq}
%   \saveweiqi[1]
%   \newweiqi
%   \useweiqi*[1]
%   \weiqichange{dr}
%   \showweiqi
% \end{demo}
%
%
% \begin{function}{\weiqiremove}
%   \begin{syntax}
%     \cs{weiqiremove} \Arg{ĺťć&nbsp;‡}
%   \end{syntax}
%   ç§»é™¤ćŚ‡ĺ®šä˝Ťç˝®çš„ć‰€ćś‰ćŁ‹ĺ­ďĽŚç§»é™¤ĺŽç›¸ĺ˝“äşŽć˛ˇćś‰čż™ä¸€ć‰‹ćŁ‹ă€‚
%   \meta{ĺťć&nbsp;‡} ćŻä¸€ç»„čˇ¨ç¤şćŁ‹ĺ­ä˝Ťç˝®çš„é€—ĺŹ·ĺ†éš”ĺ—čˇ¨ďĽŚćŻŹä¸€éˇąčˇ¨ç¤şä¸€ä¸Şä˝Ťç˝®ă€‚
%   \begin{texnote}
%     čż™ä¸Ž \cs{weiqidie} ćś‰ćś¬č´¨çš„ĺŚşĺ«ďĽš\cs{weiqidie} ć—¨ĺś¨ć&nbsp;‡č®°ć­»ĺ­ďĽčż™ć‰‹ćŁ‹ćŻçśźĺ®žĺ­ĺś¨çš„ďĽ‰ďĽ›
%     č€Śćś¬ĺ‘˝ä»¤ćŻç›´ćŽĄç§»é™¤čż™ć‰‹ćŁ‹ďĽŚä¸»č¦ćŻä»Ąĺ¤Ťç”¨ćŁ‹ĺ±€č€Śč®ľç˝®ă€‚
%   \end{texnote}
% \end{function}
%
%
% \begin{demo}
%   \newweiqi
%   \weiqiblack[0]{bq,dq,-}
%   \weiqiwhite[1]{b2,c2,c3,a2,d2,b1}
%   \weiqidie{b2}
%   \weiqiremove{d2}
%   \weiqiwhite[5]{b4}
%   \sgflocmode
%   \showweiqi
% \end{demo}
%
%
% \begin{function}{\resetnumber}
%   \begin{syntax}
%     \cs{resetnumber} [\meta{čµ·ç‚ą}]
%   \end{syntax}
%   é‡Ťç˝®ĺ›´ćŁ‹ć‰‹ć•°ďĽŚ\meta{čµ·ç‚ą} ć‰€ĺś¨ä˝Ťç˝®çš„ć&nbsp;‡ç­ľč®ľç˝®ä¸ş $1$ďĽŚäą‹ĺŽć&nbsp;‡ç­ľäľťć¬ˇé€’ĺ˘žďĽŚäą‹ĺ‰Ťć—&nbsp;ć&nbsp;‡ç­ľďĽ›é»č®¤ä»Ąç¬¬ $1$ ć‰‹ä¸şčµ·ç‚ąă€‚
% \end{function}
%
%
% \begin{demo}
%   \useweiqi*[1]
%   \resetnumber[2]
%   \showweiqi
% \end{demo}
% 
% \subsection{sgf ćŁ‹č°±ć”ŻćŚ}^^A 
%
%
% \begin{function}{\weiqisgf}
%   \begin{syntax}
%     \cs{weiqisgf} [\meta{ć&nbsp;‡ç­ľ}] \Arg{ć–‡ćś¬}
%   \end{syntax}
%   ä˝żç”¨ |sgf| ćŁ‹č°± \Arg{ć–‡ćś¬} ćťĄćŚ‡ĺ®šćŁ‹ĺ­ă€‚ĺ¦‚ćžś \meta{ć&nbsp;‡ç­ľ} ä¸şć‰‹ć•°ďĽŚĺ™äĽšč‡ŞĺŠ¨é€’ĺ˘žă€‚
% \end{function}
%
% ~\\
% \begin{demo}
%   \newweiqi
%   \weiqisgf{;B[cc];W[dd]}
%   \weiqisgf[1]{;B[cd];W[dc];B[cb]}
%   \showweiqi
% \end{demo}
%
% \begin{function}{\inputsgf}
%   \begin{syntax}
%     \cs{weiqisgf} [\meta{čµ·ç‚ą}] \Arg{ć–‡ä»¶}
%   \end{syntax}
%   ć–°ĺ»şĺŻąĺ±€ĺą¶čľ“ĺ…ĄćŚ‡ĺ®šćŁ‹č°±ă€‚\meta{čµ·ç‚ą} ć‰€ĺś¨ä˝Ťç˝®çš„ć&nbsp;‡ç­ľč®ľç˝®ä¸ş $1$ďĽŚäą‹ĺŽć&nbsp;‡ç­ľäľťć¬ˇé€’ĺ˘žďĽŚäą‹ĺ‰Ťć—&nbsp;ć&nbsp;‡ç­ľďĽ›é»č®¤ä»Ąç¬¬ $1$ ć‰‹ä¸şčµ·ç‚ąă€‚
% \end{function}
%
%
% \subsection{č°čŻ•ć”ŻćŚ}^^A
%
% \begin{function}{\weiqidata}
%   \begin{syntax}
%     \cs{weiqidata} 
%   \end{syntax}
%   ć&nbsp;ĽĺĽŹĺŚ–čľ“ĺ‡şĺ†…é¨ĺŹé‡Źć•°ćŤ®ă€‚ĺ¸¦ćźĺŹ·ç‰ćś¬äĽšé˘ťĺ¤–čľ“ĺ‡şčľąç•ŚĺŹé‡ŹäżˇćŻă€‚
% \end{function}
%
% \newweiqi
% \weiqiblack[0]{bq,dq,-}
% \weiqiwhite[1]{b2,c2,c3,a2,d2,b1}
% \weiqidie{b2}
% \weiqiremove{d2}
% \weiqiwhite[5]{b4}
% \weiqidata*
%
% \subsection{ä¸‹ä¸€ć­Ąč®ˇĺ’}^^A 
%
% ä¸­ć–‡ć&nbsp;‡ç­ľçš„ć”ŻćŚă€‚
%
% \end{documentation}
%
% \begin{implementation}
%
% \newpage
%
% \section{\pkg{weiqi}ĺ®žçŽ°}
%
% \subsection{ĺťĺ§‹ĺŚ–äżˇćŻ}
%
%    \begin{macrocode}
%&lt;*package&gt;
%&lt;@@=weiqi&gt;
%    \end{macrocode}
%
% ĺ®ŹĺŚ…ĺźşćś¬äżˇćŻďĽš
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesExplPackage{weiqi}{2024-02-22}{0.1}
  {drawing weiqi using expl3}
%    \end{macrocode}
%
% éś€č¦ l3draw ĺ®ŹĺŚ…ďĽŚä»Ąć”ŻćŚç»ĺ›ľďĽš
%    \begin{macrocode}
\RequirePackage{l3draw}[2024-01-04]
%    \end{macrocode}
%
% ĺĽ€ĺŻ expl3 ć¨ˇĺĽŹďĽš
%    \begin{macrocode}
\ExplSyntaxOn
%    \end{macrocode}
%
%
% \subsection{ĺŁ°ćŽçł»ç»źĺ‡˝ć•°çš„ĺŹä˝“}
%
%    \begin{macrocode}
\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 }
%    \end{macrocode}
%
% \subsection{ĺŁ°ćŽé€‰éˇą}
% 
%    \begin{macrocode}
% ĺľ…ĺ®žçŽ°
%    \end{macrocode}
%
%
% \subsection{ĺ®šäą‰ĺ¸¸é‡Ź}
%
% \begin{variable}{\c_@@_normal_size_int, \c_@@_mid_size_int, \c_@@_small_size_int, \c_@@_normal_star_clist, 
%    \c_@@_mid_star_clist, \c_@@_small_star_clist }
% ćŁ‹ç›ĺ°şĺŻ¸ĺŹŠĺŻąĺş”ćźä˝Ťĺťć&nbsp;‡ďĽš
%    \begin{macrocode}
\int_const:Nn \c_@@_normal_size_int { 19 }
\int_const:Nn \c_@@_mid_size_int { 13 }
\int_const:Nn \c_@@_small_size_int { 9 }
\clist_const:Nn \c_@@_normal_star_clist 
  { d4, j4, p4, d10, j10, p10, d16, j16, p16 }
\clist_const:Nn \c_@@_mid_star_clist 
  { c3, g3, k3, c7, g7, k7, c11, g11, k11 }
\clist_const:Nn \c_@@_small_star_clist { c3, k3, c7, k7 }
%    \end{macrocode}
% \end{variable}
%
%
% \begin{variable}{\c_@@_max_step_int, \c_@@_normal_mode_str, \c_@@_sgf_mode_str }
% ć”ŻćŚçš„ćś€ĺ¤§ć­Ąć•°ĺŹŠĺťć&nbsp;‡ćľç¤şć¨ˇĺĽŹďĽš
%    \begin{macrocode}
\int_const:Nn \c_@@_max_step_int { 500 }
\str_const:Nn \c_@@_normal_mode_str { normal }
\str_const:Nn \c_@@_sgf_mode_str { sgf }
%    \end{macrocode}
% \end{variable}
%
%
% \subsection{ĺ®šäą‰ĺŹé‡Ź}
%
% \subsubsection{ćŁ‹ç›äżˇćŻ}
%
% ćŁ‹ç›äżˇćŻĺŚ…ĺ«ć–ąä˝ŤďĽ$x/y$ć–ąĺ‘ĺŹŠćŻĺ¦äş’ćŤ˘ä¸‰č€…ĺ†łĺ®šďĽ‰ă€ćŻ”äľ‹ă€ćś€ĺ°Źćľç¤şĺ¤§ĺ°ŹďĽé•żä¸Žĺ®˝ďĽ‰ĺŹŠĺťć&nbsp;‡ćŽ§ĺ¶ďĽćŻĺ¦ćľç¤şĺŹŠĺťć&nbsp;‡ć¨ˇĺĽŹďĽ‰ă€‚
% ĺ…±ćś‰ $8$ ä¸ŞĺŹé‡ŹćŽ§ĺ¶ďĽŚä¸”ĺť‡ĺ…·ćś‰ĺ…¨ĺ±€ĺŹŠćś¬ĺś°äą‹ĺ†ă€‚ĺ…¨ĺ±€ĺŹé‡Źä¸şé»č®¤ĺ€ĽďĽŚćś¬ĺś°ä¸şĺ˝“ĺ‰ŤĺŻąĺ±€çš„č®ľç˝®ă€‚
%
% \begin{variable}{\g_@@_x_direction_int, \g_@@_y_direction_int, \g_@@_swap_xy_bool, 
%    \g_@@_scale_fp, \g_@@_min_width_int, \g_@@_min_hight_int, \g_@@_show_loc_bool,
%    \g_@@_loc_mode_str}
% ĺ…¨ĺ±€ćŁ‹ç›äżˇćŻďĽš
%    \begin{macrocode}
\int_new:N \g_@@_x_direction_int
\int_new:N \g_@@_y_direction_int
\bool_new:N \g_@@_swap_xy_bool
\fp_new:N \g_@@_scale_fp
\int_new:N \g_@@_min_width_int
\int_new:N \g_@@_min_hight_int
\bool_new:N \g_@@_show_loc_bool
\str_new:N \g_@@_loc_mode_str
%    \end{macrocode}
%    \begin{macrocode}
\int_gset:Nn \g_@@_x_direction_int { 1 }
\int_gset:Nn \g_@@_y_direction_int { 1 }
\bool_gset_false:N \g_@@_swap_xy_bool
\fp_gset:Nn \g_@@_scale_fp { 1 }
\int_gset:Nn \g_@@_min_width_int { 3 }
\int_gset:Nn \g_@@_min_hight_int { 2 }
\bool_gset_true:N \g_@@_show_loc_bool
\str_gset_eq:NN \g_@@_loc_mode_str \c_@@_normal_mode_str
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\l_@@_x_direction_int, \l_@@_y_direction_int, \l_@@_swap_xy_bool, 
%    \l_@@_scale_fp, \l_@@_min_width_int, \l_@@_min_hight_int, \l_@@_show_loc_bool,
%    \l_@@_loc_mode_str}
% ćś¬ĺś°ćŁ‹ç›äżˇćŻďĽš
%    \begin{macrocode}
\int_new:N \l_@@_x_direction_int
\int_new:N \l_@@_y_direction_int
\bool_new:N \l_@@_swap_xy_bool
\fp_new:N \l_@@_scale_fp
\int_new:N \l_@@_min_width_int
\int_new:N \l_@@_min_hight_int
\bool_new:N \l_@@_show_loc_bool
\str_new:N \l_@@_loc_mode_str
%    \end{macrocode}
% \end{variable}
%
%
% \subsubsection{ĺŻąĺ±€äżˇćŻ}
%
% ĺŻąĺ±€äżˇćŻĺŚ…ć‹¬ćŁ‹ç›ĺ¤§ĺ°Źă€ć­Ąć•°ă€ćŁ‹ĺ­/ć&nbsp;‡ç­ľçš„äżˇćŻé›†ďĽ$x/y$ ĺťć&nbsp;‡ďĽŚćŁ‹ć‰‹ďĽŚć&nbsp;‡ç­ľďĽ‰ă€ć­»ĺ­é›†ďĽç´˘ĺĽ•ďĽ‰ĺŹŠćŚ‡ç¤şç‚ąé›†ďĽä¸‰č‰˛ďĽ‰ç»„ćă€‚
% ĺ…± $10$ ä¸ŞĺŹé‡ŹďĽŚĺŹ¦ĺŠ&nbsp;ä¸€ä¸Şé»č®¤ćŁ‹ç›ĺ¤§ĺ°Źă€‚ćś¬ĺ°ŹčŠ‚çš„ĺŹé‡Źçš„ĺŹ–ĺ€Ľĺť‡ä¸şĺŽźĺ§‹ć–ąä˝Ťçš„ĺŹ–ĺ€Ľă€‚
%
% \begin{variable}{\g_@@_default_size_int}
% é»č®¤ĺŻąĺ±€ĺ¤§ĺ°ŹďĽš
%    \begin{macrocode}
\int_new:N \g_@@_default_size_int
\int_gset_eq:NN \g_@@_default_size_int \c_@@_normal_size_int
%    \end{macrocode}
% \end{variable}
%
% \begin{variable}{\g_@@_size_int, \g_@@_step_count_int, \g_@@_x_intarray, 
%   \g_@@_y_intarray, \g_@@_player_intarray, \g_@@_label_seq, \g_@@_die_seq}
% ĺŻąĺ±€ĺ†…ĺ®ąďĽš
%    \begin{macrocode}
\int_new:N \g_@@_size_int
\int_new:N \g_@@_step_count_int
\intarray_new:Nn \g_@@_x_intarray { \c_@@_max_step_int }
\intarray_new:Nn \g_@@_y_intarray { \c_@@_max_step_int }
\intarray_new:Nn \g_@@_player_intarray { \c_@@_max_step_int }
\seq_new:N \g_@@_label_seq
\seq_new:N \g_@@_die_seq
%    \end{macrocode}
% \end{variable}
%
%
% \begin{variable}{\g_@@_red_point_clist, \g_@@_green_point_clist,\g_@@_blue_point_clist}
% ĺŻąĺ±€čľ…ĺŠ©ćŚ‡ç¤şç‚ąďĽš
%    \begin{macrocode}
\clist_new:N \g_@@_red_point_clist
\clist_new:N \g_@@_green_point_clist
\clist_new:N \g_@@_blue_point_clist
%    \end{macrocode}
% \end{variable}
%
%
% \subsubsection{čľąç•ŚäżˇćŻ}
%
% ćś¬ĺ°ŹčŠ‚çš„ĺŹé‡Źä¸şç»ĺ›ľčż‡ç¨‹ä¸­ä˝żç”¨çš„čľąç•ŚäżˇćŻĺŹé‡Źă€‚ĺ…¶ćŻĺťć&nbsp;‡ćŻč€č™‘ć–ąä˝ŤäżˇćŻçš„ďĽŚä˝†ĺ·¦ĺŹłă€ä¸Šä¸‹ĺŹŠĺ¤§ĺ°Źä¸Ťč€č™‘ă€‚
%
% ćŁ‹ĺ­ĺŚşé—´ďĽä¸Ťč€č™‘ĺ»¶äĽ¸çš„äżˇćŻďĽ‰ďĽš
%    \begin{macrocode}
\int_new:N \l_@@_x_min_int
\int_new:N \l_@@_x_max_int
\int_new:N \l_@@_y_min_int
\int_new:N \l_@@_y_max_int
%    \end{macrocode}
%
% ćŁ‹ç›čľąç•ŚďĽč€č™‘ĺ»¶äĽ¸çš„äżˇćŻďĽ‰ďĽš
%    \begin{macrocode}
\bool_new:N \l_@@_left_bool
\bool_new:N \l_@@_right_bool
\bool_new:N \l_@@_up_bool
\bool_new:N \l_@@_down_bool
\fp_new:N \l_@@_x_min_fp
\fp_new:N \l_@@_x_max_fp
\fp_new:N \l_@@_y_min_fp
\fp_new:N \l_@@_y_max_fp
%    \end{macrocode}
%
% \subsubsection{ĺ…¶ĺ®ĺŹé‡Ź}
% 
% é€šç”¨äżˇćŻĺŹé‡ŹďĽš
%    \begin{macrocode}
\str_new:N \l_@@_label_str
\int_new:N \l_@@_x_int
\int_new:N \l_@@_y_int
\int_new:N \l_@@_player_int
\fp_new:N \l_@@_x_fp
\fp_new:N \l_@@_y_fp
\clist_new:N \l_@@_point_clist
%    \end{macrocode}
%
% ĺ…¶ĺ®ä¸´ć—¶ĺŹé‡ŹďĽš
%    \begin{macrocode}
\int_new:N \l_@@_tmp_int
\str_new:N \l_@@_tmp_str
\bool_new:N \l_@@_tmp_bool
\seq_new:N \l_@@_tmp_seq
%    \end{macrocode}
%
%
% \subsection{č®ľç˝®ćŁ‹ĺ±€çš„ĺ‡˝ć•°}
%
% \subsubsection{ĺŻąĺ±€ĺ‡†ĺ¤‡}
%
% ćŚ‡ĺ®šĺ›´ćŁ‹ĺ¤§ĺ°Źă€ĺťĺ§‹ĺŚ–ĺŻąĺ±€çš„ĺ…¶ä˝™ $9$ ä¸ŞĺŹé‡ŹďĽć¸…ç©şĺŻąĺ±€ć‰€ćś‰ĺŻąĺ±€äżˇćŻďĽ‰ĺŹŠćŁ‹ç›äżˇćŻçš„ $8$ ä¸ŞĺŹé‡ŹďĽä˝żç”¨é»č®¤ĺ€Ľ[ĺ…¨ĺ±€ĺŹé‡Ź]ďĽ‰ă€‚
%
% \begin{macro}{\@@_new_game:n}
% ĺťĺ§‹ĺŚ–ĺŻąĺ±€äżˇćŻďĽ|#1| ćŁ‹ç›ĺ¤§ĺ°ŹďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_new_game:n #1 
  { 
    \int_set_eq:NN \l_@@_x_direction_int \g_@@_x_direction_int
    \int_set_eq:NN \l_@@_y_direction_int \g_@@_y_direction_int
    \bool_set_eq:NN \l_@@_swap_xy_bool \g_@@_swap_xy_bool
    \fp_set_eq:NN \l_@@_scale_fp \g_@@_scale_fp
    \int_set_eq:NN \l_@@_min_width_int \g_@@_min_width_int
    \int_set_eq:NN \l_@@_min_hight_int \g_@@_min_hight_int
    \bool_set_eq:NN \l_@@_show_loc_bool \g_@@_show_loc_bool
    \str_set_eq:NN \l_@@_loc_mode_str \g_@@_loc_mode_str 
%    \end{macrocode}
%    \begin{macrocode}    
    \int_gset:Ne \g_@@_size_int { #1 }
    \int_gset:Nn \g_@@_step_count_int { 0 }
    \intarray_gzero:N \g_@@_x_intarray 
    \intarray_gzero:N \g_@@_y_intarray 
    \intarray_gzero:N \g_@@_player_intarray
    \seq_gclear:N \g_@@_label_seq  
    \seq_gclear:N \g_@@_die_seq 
%    \end{macrocode}
%    \begin{macrocode}   
    \clist_gclear:N \g_@@_red_point_clist
    \clist_gclear:N \g_@@_green_point_clist
    \clist_gclear:N \g_@@_blue_point_clist
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{ĺťć&nbsp;‡č˝¬ćŤ˘ĺ‡˝ć•°}
%
% ĺ®žçŽ°ćŁ‹ĺ­ĺťć&nbsp;‡çš„ĺťć&nbsp;‡ĺŻąĺ˝˘ĺĽŹä¸Žĺ­—ç¬¦ä¸˛ĺ˝˘ĺĽŹďĽč™šçť€ä˝żç”¨ |-| ďĽ‰ä¸¤č€…äą‹é—´çš„č˝¬ćŤ˘ă€‚
%
% \begin{macro}{\@@_loc_to_xy:n, \@@_loc_to_xy:V}
% č®ľç˝® $x$ă€$y$ ĺťć&nbsp;‡ĺŹé‡ŹďĽ|#1| ĺťć&nbsp;‡ďĽŚć”ŻćŚä¸¤ç§Ťć¨ˇĺĽŹďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_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_@@_x_int { 0 }
        \int_set:Nn \l_@@_y_int { 0 }
      }
      {      
        \int_set:Ne \l_@@_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_@@_y_int { \g_@@_size_int - \l_tmpa_int + 1 }
          } 
          { 
            \int_set:Ne \l_@@_y_int 
              { \str_range:Nnn \l_tmpa_str { 2 } { 5 } } 
          }
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\cs_generate_variant:Nn \@@_loc_to_xy:n { V }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_xy_to_loc:N}
% ĺ°†ćŚ‡ĺ®šĺŹé‡Źč®ľç˝®ä¸şĺ˝“ĺ‰Ťĺťć&nbsp;‡çš„ĺ­—ç¬¦ä¸˛ĺ˝˘ĺĽŹďĽ|#1| ćŚ‡ĺ®šçš„ĺ­ĺ‚¨ĺŹé‡ŹďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_xy_to_loc:N #1
  { 
    \int_compare:nNnTF { \l_@@_x_int } = { 0 }
      { \str_set:Nn #1 { - } }
      {
        \str_set:Nx \l_tmpa_str 
          { \int_to_alph:n { \l_@@_x_int } }
        \str_compare:eNeTF 
          { \l_@@_loc_mode_str } = { \c_@@_sgf_mode_str }
          { 
            \int_set:Nn \l_tmpa_int 
              { \g_@@_size_int - \l_@@_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_@@_y_int } }
        \str_set_eq:NN #1 \l_tmpa_str 
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{ć·»ĺŠ&nbsp;ćŁ‹ĺ­ć–çşŻć&nbsp;‡ç­ľ}
%
% ĺ‘ĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ćŁ‹ĺ­ć–çşŻć&nbsp;‡ç­ľďĽŚĺ®ä»¬ä˝żç”¨ç›¸ĺŚçš„ç»“ćž„ĺ­ĺ‚¨ă€‚é™¤äş†ć‰€ĺ±žć–ąä¸Ťä¸€ć&nbsp;·ĺ¤–ďĽŚĺ®ä»¬ĺ†…é¨ć·»ĺŠ&nbsp;ć–ąĺĽŹĺ®Śĺ…¨ç›¸ĺŚă€‚
% ĺ…¶ä¸­ďĽŚć‰€ĺ±žć–ąç”¨ $0$ čˇ¨ç¤şćśŞä˝żç”¨\footnote{ć–°ĺ±€ĺĽ€ĺ§‹ďĽŚć‰€ĺ±žć–ąĺť‡ĺťĺ§‹ĺŚ–ä¸ş $0$ďĽ›ç§»é™¤çŠ¶ć€çš„ćŁ‹ĺ­ďĽŚäąźäĽšč®ľç˝®ä¸şé›¶ďĽĺŚć—¶ĺťć&nbsp;‡äąźä¸şé›¶ďĽ‰ă€‚}ďĽŚ
% $1$ čˇ¨ç¤şé»‘ć–ąďĽŚ$2$ čˇ¨ç¤şç™˝ć–ąďĽŚ$3$ čˇ¨ç¤şçşŻć&nbsp;‡ç­ľă€‚
%
% ćŁ‹ĺ­ĺŹŻä»Ąĺ«ć&nbsp;‡ç­ľďĽĺ¦‚ć‰‹ć•°ć–ç‰ąć®Šĺ­—ç¬¦ç­‰ďĽ‰ďĽŚćŁ‹ĺ­|+| çşŻć&nbsp;‡ç­ľä¸Ťç­‰äşŽĺ¸¦ć&nbsp;‡ç­ľçš„ćŁ‹ĺ­ă€‚
% ĺ›&nbsp;ä¸şĺ‰Ťč€…ćŻä¸¤ćťˇč®°ĺ˝•ďĽŚĺŽč€…ćŻä¸€ćťˇč®°ĺ˝•ďĽŚĺŽç»­ĺ¤„ç†äąźä¸Ťä¸€ć&nbsp;·ă€‚
%
% \begin{macro}{\@@_add_stone:nnn, \@@_add_stone:nnV,  \@@_add_stone:nVV}
% ĺ‘ĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ä¸€ć­ĄćŁ‹ďĽ|#1| é»‘ç™˝ć–ą ďĽ›|#2| ĺťć&nbsp;‡ďĽ›|#3| ć&nbsp;‡ç­ľďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_stone:nnn #1#2#3
  {     
    \int_gincr:N \g_@@_step_count_int
    \intarray_gset:Nnn \g_@@_player_intarray 
      \g_@@_step_count_int { #1 }
%    \end{macrocode}
%    \begin{macrocode}
    \@@_loc_to_xy:n { #2 }
    \intarray_gset:Nnn \g_@@_x_intarray 
      \g_@@_step_count_int \l_@@_x_int 
    \intarray_gset:Nnn \g_@@_y_intarray 
      \g_@@_step_count_int \l_@@_y_int
%    \end{macrocode}
%    \begin{macrocode}
    \str_if_eq:nnTF { #3 } { 0 }  
      { \seq_put_right:Nn \g_@@_label_seq {} }
      { \seq_put_right:Nn \g_@@_label_seq { #3 } }
  }
%    \end{macrocode}
%    \begin{macrocode}
\cs_generate_variant:Nn \@@_add_stone:nnn {nnV, nVV}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_add_stones:nnn}
% ć‰ąé‡Źĺ‘ĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ćŁ‹ĺ­ďĽ|#1| é»‘ç™˝ć–ą ďĽ›|#2| ĺťć&nbsp;‡ĺşŹĺ—ďĽ›|#3| ć&nbsp;‡ç­ľďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_stones:nnn #1#2#3
  { 
    \int_set:Nn \l_@@_player_int { #1 }
    \clist_set:Nn \l_@@_position_clsit { #2 }
    \bool_set_false:N \l_@@_tmp_bool
    \str_if_empty:nTF { #3 }
      { \str_set:Nn \l_@@_tmp_str {} } 
      {
        \regex_match:nnTF { [^0-9]+ } { #3 } 
          { \str_set:Nx \l_@@_tmp_str { #3 } } 
          { 
            \bool_set_true:N \l_@@_tmp_bool
            \int_set:Nn \l_@@_tmp_int { #3 }
          }
      }
    \clist_map_inline:Nn \l_@@_position_clsit
      {
        \bool_if:nTF \l_@@_tmp_bool
          {
            \@@_add_stone:nnV 
              { \l_@@_player_int } 
              { ##1 }
              { \l_@@_tmp_int }
            \int_case:nn { \l_@@_player_int } 
              {
                { 1 } { \int_set:Nn \l_@@_player_int { 2 } }
                { 2 } { \int_set:Nn \l_@@_player_int { 1 } }
                { 3 } { \int_set:Nn \l_@@_player_int { 3 } }
              }
            \int_compare:nNnT { \l_@@_tmp_int } &gt; { 0 }
              { \int_incr:N \l_@@_tmp_int }
          }
          { \@@_add_stone:nnV { #1 } { ##1 } { \l_@@_tmp_str } }    
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_add_sgf_stones:nn, \@@_add_sgf_stones:VV}
% ć‰ąé‡Źĺ‘ĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp; sgf ć&nbsp;ĽĺĽŹćŁ‹ĺ­ďĽ|#1| ĺ¸¦é»‘ç™˝ć–ąçš„ĺťć&nbsp;‡ĺşŹĺ—ďĽ›|#2| ć&nbsp;‡ç­ľďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_sgf_stones:nn #1#2
  { 
    \regex_extract_all:nnN { ;[BW]\[[a-z]{2}\] } { #1 } \l_@@_tmp_seq
    \clist_set_from_seq:NN \l_@@_point_clist \l_@@_tmp_seq
    \bool_set_false:N \l_@@_tmp_bool
    \str_if_empty:nTF { #2 }
      { \str_set:Nn \l_@@_tmp_str {} } 
      {
        \regex_match:nnTF { [^0-9]+ } { #2 } 
          { \str_set:Nx \l_@@_tmp_str { #2 } } 
          { 
            \bool_set_true:N \l_@@_tmp_bool
            \int_set:Nn \l_@@_tmp_int { #2 }
          }
      }
    \clist_map_inline:Nn \l_@@_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_@@_player_int { 1 } }
          { W } { \int_set:Nn \l_@@_player_int { 2 } }
        }
        \bool_if:nTF \l_@@_tmp_bool
          {
            \@@_add_stone:nVV { \l_@@_player_int } 
              { \l_tmpb_str } { \l_@@_tmp_int }
            \int_compare:nNnT { \l_@@_tmp_int } &gt; { 0 }
              { \int_incr:N \l_@@_tmp_int }
          }
          { 
            \@@_add_stone:nVV { \l_@@_player_int } 
              { \l_tmpb_str } { \l_@@_tmp_str } 
          }    
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\cs_generate_variant:Nn  \@@_add_sgf_stones:nn { VV }
%    \end{macrocode}
% \end{macro}
%
% \subsubsection{äż®ć”ąĺŻąĺ±€}
%
% äż®ć”ąĺŻąĺ±€ä¸­çš„ćŁ‹ĺ­äżˇćŻďĽć‰€ćś‰ć–ąă€ć&nbsp;‡ç­ľç­‰ďĽ‰ă€ç§»é™¤ćŁ‹ĺ­ ć–č®ľç˝®ć­»ĺ­ç­‰ă€‚
% ĺ…¶ä¸­ďĽŚç§»é™¤ćŁ‹ĺ­ç›¸ĺ˝“äşŽć˛ˇćś‰čľ“ĺ…Ąčż™ä¸ŞćŁ‹ĺ­\footnote{
% ç§»é™¤ćŁ‹ĺ­ćŻé€ščż‡ćŠŠčŻĄć‰‹ćŁ‹ĺ…¨é¨č®ľç˝®ä¸şé›¶ćťĄĺ®žçŽ°ďĽ›čż™ä¸Žč™šçť€ä¸Ťä¸€ć&nbsp;·ďĽŚĺŽč€…ä»Ťćś‰ć‰€ĺ±žć–ąă€‚}ďĽ›
% č€Śč®ľç˝®ć­»ĺ­ĺ™ç”¨äşŽćŁ‹ĺ­č˘«ĺçš„ć…ĺ†µ\footnote{
% č®ľç˝®ć­»ĺ­ćŻé€ščż‡ĺ°†ćŁ‹ĺŠ&nbsp;ĺ…Ąć­»ĺ­ĺ—čˇ¨ä¸­ćťĄĺ®žçŽ°ďĽŚĺ…¶ĺťć&nbsp;‡äżˇćŻĺ…¨é¨ä¸ŤĺŹă€‚}ă€‚
%
% \begin{macro}{\@@_reset_stone_number:n}
% é‡Ťç˝®ć‰€ćś‰ćŁ‹ĺ­çš„ć&nbsp;‡ç­ľďĽŚç§»é™¤ć‰€ćś‰ćŁ‹ĺ­ć&nbsp;‡ç­ľďĽä¸Ťĺ«çşŻć&nbsp;‡ç­ľďĽ‰ĺą¶ćŚ‰ć‰‹ć•°ďĽä»Ą |#1| čµ·ä¸şç¬¬ $1$ ć‰‹ďĽ‰č®ľç˝®ć–°ć&nbsp;‡ç­ľă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_reset_stone_number:n #1
  { 
    \int_set:Ne \l_@@_tmp_int { 1 - #1 }
    \int_step_inline:nn { \c_@@_max_step_int } 
      {
        \bool_lazy_or:nnF
          {
            \int_compare_p:nNn
              { \intarray_item:Nn \g_@@_player_intarray { ##1 } } = { 0 }
          }
          {
            \int_compare_p:nNn
              { \intarray_item:Nn \g_@@_player_intarray { ##1 } } = { 3 }
          }          
          {            
            \int_incr:N \l_@@_tmp_int 
            \int_compare:nNnTF { \l_@@_tmp_int } &gt; { 0 }
              { \seq_gset_item:NnV \g_@@_label_seq { ##1 } { \l_@@_tmp_int } }
              { \seq_gset_item:Nnn \g_@@_label_seq { ##1 } {} }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_change_stone:n}
% ĺ‡ćŤ˘ćŚ‡ĺ®šç´˘ĺĽ•çš„ćŁ‹ĺ­çš„é»‘ç™˝ć–ąďĽ|#1| ç´˘ĺĽ•ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_change_stone:n #1
  { 
    \int_case:nn 
      { \intarray_item:Nn \g_@@_player_intarray { #1 } }
      {
        { 1 } { \intarray_gset:Nnn \g_@@_player_intarray { #1 } { 2 } }
        { 2 } { \intarray_gset:Nnn \g_@@_player_intarray { #1 } { 1 } }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_remove_stone:n}
% ĺ&nbsp;é™¤ćŚ‡ĺ®šç´˘ĺĽ•çš„ćŁ‹ĺ­ďĽ|#1| ç´˘ĺĽ•ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_remove_stone:n #1
  { 
    \intarray_gset:Nnn \g_@@_x_intarray  { #1 } { 0 }
    \intarray_gset:Nnn \g_@@_y_intarray  { #1 } { 0 }
    \intarray_gset:Nnn \g_@@_player_intarray  { #1 } { 0 }
    \seq_gset_item:Nnn \g_@@_label_seq { #1} { }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_die_stone:n}
% č®ľç˝®ćŚ‡ĺ®šç´˘ĺĽ•çš„ćŁ‹ĺ­ä¸şć­»ĺ­ďĽ|#1| ç´˘ĺĽ•ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_die_stone:n #1
  { 
    \seq_if_in:NnF \g_@@_die_seq { #1 }
      {
        \seq_put_right:Nn \g_@@_die_seq { #1 }
        \prg_break:
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_modify_stone:N}
% ä˝żç”¨ćŚ‡ĺ®šĺ‡˝ć•°ďĽ|#1|ďĽ‰äż®ć”ąćŚ‡ĺ®šä˝Ťç˝®çš„ćŁ‹ĺ­ďĽç”± $x$, $y$ ĺťć&nbsp;‡ćŚ‡ĺ®šďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_modify_stone:N #1
  { 
    \int_step_inline:nn { \c_@@_max_step_int } 
      {
        \bool_lazy_and:nnT
        { 
          \int_compare_p:n 
            { \intarray_item:Nn \g_@@_x_intarray { ##1 } = \l_@@_x_int } 
        }
        {
          \int_compare_p:n 
            { \intarray_item:Nn \g_@@_y_intarray { ##1 } = \l_@@_y_int } 
        }
        { #1 { ##1 } }
      }
      \prg_break_point:
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_modify_stones:nN}
% ć‰ąé‡Źäż®ć”ąĺ˝“ĺ‰ŤĺŻąĺ±€ä¸­çš„ćŁ‹ĺ­ďĽ|#1| ĺťć&nbsp;‡ĺşŹĺ—ďĽŚ|#2| äż®ć”ąĺ‡˝ć•°ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_modify_stones:nN #1#2
  { 
    \clist_set:Nn \l_@@_position_clsit { #1 }
    \clist_map_inline:Nn \l_@@_position_clsit
      {
        \@@_loc_to_xy:n { ##1 }
        \int_compare:nNnF { \l_@@_x_int } = { 0 }
          { \@@_modify_stone:N { #2 } }
      } 
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_clear_labels:}
% ć¸…é™¤ć‰€ćś‰çşŻć&nbsp;‡ç­ľă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_clear_labels:
  { 
    \int_step_inline:nn { \c_@@_max_step_int } 
      {
        \int_compare:nNnT
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } } = { 3 }
          {
            \intarray_gset:Nnn \g_@@_x_intarray  { ##1 } { 0 }
            \intarray_gset:Nnn \g_@@_y_intarray  { ##1 } { 0 }
            \intarray_gset:Nnn \g_@@_player_intarray  { ##1 } { 0 }
            \seq_gset_item:Nnn \g_@@_label_seq { ##1 } {}
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% 
% \subsubsection{ćŚ‡ç¤şç‚ą}
%
% ćŚ‡ç¤şç‚ąćŻćŁ‹ç›ä¸Šçš„ç‰ąć®Šĺś†ç‚ąďĽŚĺ®ć”ŻćŚçş˘ç»żč“ťä¸‰ç§Ťé˘śč‰˛ă€‚ć—¨ĺś¨ç”¨äşŽĺś¨ćźä¸Şç‰ąĺ®šć…ĺ†µä¸‹çš„ç‰ąć®ŠćŚ‡ç¤şă€‚
% ćŚ‡ç¤şç‚ąçš„ĺ®žçŽ°ĺŽźç†ä¸ŽçşŻć&nbsp;‡ç­ľĺ®Śĺ…¨ä¸Ťä¸€ć&nbsp;·ďĽŚäľ§é‡Ťç‚ąäąźä¸Ťä¸€ć&nbsp;·ă€‚
%
% \begin{macro}{\@@_add_points:nn}
% ć‰ąé‡Źĺ‘ĺŻąĺ±€ä¸­ć·»ĺŠ&nbsp;ćŚ‡ç¤şç‚ąďĽ|#1| é˘śč‰˛ ďĽ›|#2| ĺťć&nbsp;‡ĺşŹĺ—ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_add_points:nn #1#2
  { 
    \str_case:nn { #1 }
      {
        { red }   
        { \clist_gput_right:Nn \g_@@_red_point_clist { #2 } }
        { green } 
        { \clist_gput_right:Nn \g_@@_green_point_clist { #2 } }
        { blue }  
        { \clist_gput_right:Nn \g_@@_blue_point_clist { #2 } }
      }  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_clear_points:}
% ć¸…é™¤ć‰€ćś‰ćŚ‡ç¤şç‚ąă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_clear_points:
  { 
    \clist_clear:N \g_@@_red_point_clist 
    \clist_clear:N \g_@@_green_point_clist
    \clist_clear:N \g_@@_blue_point_clist
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{ç»ĺ¶ćŁ‹ĺ±€çš„ĺ‡˝ć•°}
%
% \subsubsection{ĺťć&nbsp;‡ĺŹćŤ˘}
%
% ç”±äşŽĺŻąĺ±€ä¸­çš„ĺťć&nbsp;‡ä»ĄĺŽźĺ§‹ć–ąä˝Ťčľ“ĺ…Ąä¸Žäżťĺ­ďĽŚč€Śćľç¤şć—¶éś€č¦ćŚ‰ćŚ‡ĺ®šçš„ć–ąä˝ŤćťĄćľç¤şďĽŚ
% ĺ›&nbsp;ć­¤ĺś¨ćľç¤şďĽç»ĺ›ľďĽ‰ĺ‰Ťéś€č¦ć&nbsp;ąćŤ®ćŁ‹ç›ć–ąä˝ŤäżˇćŻćťĄčż›čˇŚĺťć&nbsp;‡ĺŹćŤ˘ă€‚
%
% \begin{macro}{\@@_transform_xy:NN}
% č˝¬ćŤ˘ĺťć&nbsp;‡ďĽ|#1|ă€|#2| ĺ†ĺ«ä¸ş $x,y$ ĺťć&nbsp;‡ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_transform_xy:NN #1#2
  {
    \int_set:Ne \l_tmpa_int { #1 * \l_@@_x_direction_int }
    \int_set:Ne \l_tmpb_int { #2 * \l_@@_y_direction_int }
    \bool_if:NTF \l_@@_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
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{čľąç•Śĺ‡˝ć•°}
%
% ç»ĺ¶ćŁ‹ĺ±€ć—¶ďĽŚéś€č¦çˇ®č®¤č¦ćľç¤şçš„ĺŚşĺźźďĽćľç¤şć•´ä¸ŞćŁ‹ç›é€šĺ¸¸ä¸ŤćŻćś€äĽć–ąćˇďĽ‰ďĽŚ
% ćś¬ĺ°ŹčŠ‚ćŹäľ›ä¸€çł»ĺ—ĺ‡˝ć•°ďĽŚç”¨äşŽçˇ®č®¤ćľç¤şčľąç•Śă€‚
%
% \begin{macro}{\@@_calc_range:}
% č®ˇç®—ćŁ‹ĺ­ć‰€ĺś¨ĺŚşé—´čľąç•Śă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_calc_range:
  {
    \int_set:Nn \l_@@_x_min_int { 99 }
    \int_set:Nn \l_@@_y_min_int { 99 }
    \int_set:Nn \l_@@_x_max_int { 0 }
    \int_set:Nn \l_@@_y_max_int { 0 }
%    \end{macrocode} 
% éŤĺŽ†ç”źćč‡Şç„¶čľąç•ŚďĽš
%    \begin{macrocode}
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_compare:nNnF
          { \l_@@_x_int } = { 0 }
          {
            \int_compare:nNnT  
              \l_@@_x_min_int &gt; \l_@@_x_int 
              { \int_set_eq:NN \l_@@_x_min_int \l_@@_x_int } 
            \int_compare:nNnT
              \l_@@_x_max_int &lt; \l_@@_x_int 
              { \int_set_eq:NN \l_@@_x_max_int \l_@@_x_int } 
            \int_compare:nNnT
              \l_@@_y_min_int &gt; \l_@@_y_int 
              { \int_set_eq:NN \l_@@_y_min_int \l_@@_y_int } 
            \int_compare:nNnT
              \l_@@_y_max_int &lt; \l_@@_y_int 
              { \int_set_eq:NN \l_@@_y_max_int \l_@@_y_int }
          }
      }
%    \end{macrocode} 
% ć—&nbsp;ćś‰ć•ćŁ‹ĺ­çš„ć…ĺ†µä¸‹ďĽŚćľç¤şć•´ä¸ŞćŁ‹ç›ďĽš
%    \begin{macrocode}
  \int_compare:nNnT
    { \l_@@_x_min_int } = { 99 }
    {
      \int_set:Nn \l_@@_x_min_int { 1 }
      \int_set:Nn \l_@@_y_min_int { 1 }
      \int_set_eq:NN \l_@@_x_max_int \g_@@_size_int
      \int_set_eq:NN \l_@@_y_max_int \g_@@_size_int  
    }
%    \end{macrocode} 
% ĺ‘ĺ¤–ĺ»¶äĽ¸ďĽŚä»ĄäżťčŻč‡łĺ°‘ćś‰ä¸€ä¸Şč§’ďĽš
%    \begin{macrocode}
    \int_set:Ne \l_tmpa_int 
      { \int_min:nn { \g_@@_size_int } { \l_@@_min_width_int } }
    \int_compare:nNnTF
      { \g_@@_size_int - \l_@@_x_max_int } &gt; { \l_@@_x_min_int - 1 } 
      { 
        \int_set:Nn \l_@@_x_min_int { 1 }
        \int_set:Ne \l_@@_x_max_int
          { \int_max:nn { \l_@@_x_max_int + 1 } { \l_tmpa_int } }
      } 
      { 
        \int_set_eq:NN \l_@@_x_max_int \g_@@_size_int 
        \int_compare:nNnF
          { \l_@@_x_min_int } = { 1 }
          {
            \int_set:Ne \l_@@_x_min_int 
              { 
                \int_min:nn 
                  { \l_@@_x_min_int - 1 } 
                  { \g_@@_size_int -  \l_tmpa_int + 1 }
              }
          }
      } 
    \int_set:Ne \l_tmpa_int 
      { \int_min:nn { \g_@@_size_int } { \l_@@_min_hight_int } }
    \int_compare:nNnTF
      { \g_@@_size_int - \l_@@_y_max_int } &gt; { \l_@@_y_min_int - 1 }  
      { 
        \int_set:Nn \l_@@_y_min_int { 1 } 
        \int_set:Ne \l_@@_y_max_int
          { \int_max:nn { \l_@@_y_max_int + 1 } { \l_tmpa_int } }
      } 
      { 
        \int_set_eq:NN \l_@@_y_max_int \g_@@_size_int 
        \int_compare:nNnF
          { \l_@@_y_min_int } = { 1 }
          {
            \int_set:Ne \l_@@_y_min_int 
              { 
                \int_min:nn 
                  { \l_@@_y_min_int - 1 } 
                  { \g_@@_size_int - \l_tmpa_int + 1 } 
              }
          }
      } 
%    \end{macrocode} 
% ĺŹćŤ˘ĺťć&nbsp;‡ďĽš
%    \begin{macrocode}
    \@@_transform_xy:NN \l_@@_x_min_int \l_@@_y_min_int
    \@@_transform_xy:NN \l_@@_x_max_int \l_@@_y_max_int      
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_set_range:n}
% ćŚ‡ĺ®šćŁ‹ĺ­ĺŚşé—´čľąç•ŚďĽčľąç•Śĺ¤–ćŁ‹ĺ­ä¸Ťćľç¤şďĽ‰ďĽŚć”ŻćŚ |full|ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_set_range:n #1
  {
    \str_compare:eNeTF
      { \str_lowercase:n { #1 } } = { full }
      {
        \int_set:Nn \l_@@_x_min_int { 1 }
        \int_set:Nn \l_@@_y_min_int { 1 }
        \int_set_eq:NN \l_@@_x_max_int \g_@@_size_int
        \int_set_eq:NN \l_@@_y_max_int \g_@@_size_int
      }
      {
        \clist_set:Nn \l_@@_position_clsit { #1 }    
        \clist_pop:NN \l_@@_position_clsit \l_tmpa_tl
        \@@_loc_to_xy:V { \l_tmpa_tl }
        \int_set_eq:NN \l_@@_x_min_int \l_@@_x_int
        \int_set_eq:NN \l_@@_y_min_int \l_@@_y_int
        \clist_pop:NN \l_@@_position_clsit \l_tmpa_tl
        \@@_loc_to_xy:V { \l_tmpa_tl }
        \int_set_eq:NN \l_@@_x_max_int \l_@@_x_int
        \int_set_eq:NN \l_@@_y_max_int \l_@@_y_int      
      }
%    \end{macrocode}
% ç”źćć&nbsp;‡ĺ‡†ĺŻąč§’ç‚ąďĽŚĺŹćŤ˘ĺťć&nbsp;‡ďĽš
%    \begin{macrocode}
    \int_compare:nNnT { \l_@@_x_min_int } &gt; { \l_@@_x_max_int }
    {
      \int_set_eq:NN \l_tmpa_int \l_@@_x_min_int
      \int_set_eq:NN \l_@@_x_min_int \l_@@_x_max_int
      \int_set_eq:NN \l_@@_x_max_int \l_tmpa_int
    }
    \int_compare:nNnT { \l_@@_y_min_int } &gt; { \l_@@_y_max_int }
    {
      \int_set_eq:NN \l_tmpa_int \l_@@_y_min_int
      \int_set_eq:NN \l_@@_y_min_int \l_@@_y_max_int
      \int_set_eq:NN \l_@@_y_max_int \l_tmpa_int
    }
    \@@_transform_xy:NN \l_@@_x_min_int \l_@@_y_min_int
    \@@_transform_xy:NN \l_@@_x_max_int \l_@@_y_max_int      
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_calc_board_border:}
% č®ˇç®—ćŁ‹ç›çš„ćľç¤şčľąç•Śă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_calc_board_border:
  {    
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_x_min_int } } = { 1 }
      {
        \bool_set_true:N \l_@@_left_bool
        \fp_set:Nn \l_@@_x_min_fp 
          { \l_@@_x_min_int }
      }
      { 
        \bool_set_false:N \l_@@_left_bool
        \fp_set:Nn \l_@@_x_min_fp 
          { \l_@@_x_min_int - 0.3 * \int_sign:n { \l_@@_x_min_int } }           
      } 
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_x_max_int } } = { \g_@@_size_int }
      {
        \bool_set_true:N \l_@@_right_bool
        \fp_set:Nn \l_@@_x_max_fp 
          { \l_@@_x_max_int }
      }
      { 
        \bool_set_false:N \l_@@_right_bool
        \fp_set:Nn \l_@@_x_max_fp 
          { \l_@@_x_max_int + 0.3 * \int_sign:n { \l_@@_x_max_int } }
      }     
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_y_min_int } } = { 1 }
      {
        \bool_set_true:N \l_@@_down_bool
        \fp_set:Nn \l_@@_y_min_fp 
          { \l_@@_y_min_int }
      }
      { 
        \bool_set_false:N \l_@@_down_bool
        \fp_set:Nn \l_@@_y_min_fp 
          { \l_@@_y_min_int - 0.3 * \int_sign:n { \l_@@_y_min_int } }           
      } 
    \int_compare:nNnTF
      { \int_abs:n { \l_@@_y_max_int } } = { \g_@@_size_int }
      {
        \bool_set_true:N \l_@@_up_bool
        \fp_set:Nn \l_@@_y_max_fp 
          { \l_@@_y_max_int }
      }
      { 
        \bool_set_false:N \l_@@_up_bool
        \fp_set:Nn \l_@@_y_max_fp 
          { \l_@@_y_max_int + 0.3 * \int_sign:n { \l_@@_y_max_int } }           
      }
  }  
%    \end{macrocode}
% \end{macro} 
%
%
% \begin{macro}{\@@_within_range_p:nn, \@@_within_range:nnT}
% ĺ¤ĺ®šç‚ąćŻĺ¦ĺś¨čŚĺ›´ĺ†…ďĽ|#1| $x$ĺťć&nbsp;‡ďĽ›|#2| $y$ ĺťć&nbsp;‡ďĽ‰ă€‚
% ĺťć&nbsp;‡ćŻĺŹćŤ˘ĺŽçš„ĺťć&nbsp;‡ă€‚
%    \begin{macrocode}
\prg_set_conditional:Npnn \@@_within_range:nn #1#2 { p, T }
  {
    \fp_set:Nn \l_tmpa_fp { abs( \l_@@_x_min_fp - #1 ) }
    \fp_add:Nn \l_tmpa_fp { abs( \l_@@_x_max_fp - #1 ) }
    \fp_sub:Nn \l_tmpa_fp { abs( \l_@@_x_max_fp - \l_@@_x_min_fp ) }
    \fp_add:Nn \l_tmpa_fp { abs( \l_@@_y_min_fp - #2 ) }
    \fp_add:Nn \l_tmpa_fp { abs( \l_@@_y_max_fp - #2 ) }
    \fp_sub:Nn \l_tmpa_fp { abs( \l_@@_y_max_fp - \l_@@_y_min_fp ) }
    \fp_compare:nNnTF
      { \l_tmpa_fp } &lt; { 0.1 }
      { \prg_return_true: }
      { \prg_return_false: }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsubsection{ç»ĺ¶ĺ‡˝ć•°}
%
% ç»ĺ¶ĺŻąĺ±€ĺŚ…ć‹¬ç»ĺ¶ćŁ‹ç›ă€ćŁ‹ĺ­ä¸ŽçşŻć&nbsp;‡ç­ľă€ć&nbsp;‡č®°ç‚ąĺŹŠć­»ĺ­ĺ‡&nbsp;ä¸Şć­ĄéŞ¤ă€‚
% ĺ…¶ä¸­ďĽŚćŁ‹ç›ĺŚ…ć‹¬ç˝‘ć&nbsp;Ľçşżă€čľąç•Śçşżă€č§’ă€ćźä˝ŤĺŹŠĺťć&nbsp;‡ć&nbsp;‡ç­ľă€‚
% ç»ĺ¶ĺ‰Ťéś€č¦č®ľç˝®ĺĄ˝ćŁ‹ĺ­ĺŚşé—´čľąç•Ś\footnote{ćŁ‹ç›čľąç•Śĺś¨ç»ĺ¶ćŁ‹ç›ć—¶ĺ†…é¨č°ç”¨ďĽŚĺ›&nbsp;ć­¤ä¸Ťéś€č¦é˘ťĺ¤–č®ľç˝®ă€‚}ă€‚
%
%
% \begin{macro}{\@@_draw_board_grid:}
% ç»ĺ¶ćŁ‹ç›çš„ç˝‘ć&nbsp;ĽçşżďĽč·Żĺľ„ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_grid:
  {
    \int_set:Ne \l_@@_tmp_int 
      { \int_sign:n { \l_@@_x_max_int - \l_@@_x_min_int } }
    \int_step_inline:nnnn
      { \l_@@_x_min_int } { \l_@@_tmp_int } { \l_@@_x_max_int }
      {
        \draw_path_moveto:n { ##1 cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { ##1 cm, \l_@@_y_max_fp cm }
      }      
    \int_set:Ne \l_@@_tmp_int 
      { \int_sign:n { \l_@@_y_max_int - \l_@@_y_min_int } }
    \int_step_inline:nnnn 
      { \l_@@_y_min_int } { \l_@@_tmp_int } { \l_@@_y_max_int }
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, ##1 cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, ##1 cm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_border:}
% ç»ĺ¶ćŁ‹ç›çš„čľąç•ŚçşżďĽč·Żĺľ„ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_border:
  {
    \bool_if:nT { \l_@@_left_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
      }
    \bool_if:nT { \l_@@_right_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
      }
    \bool_if:nT { \l_@@_down_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
      }
    \bool_if:nT { \l_@@_up_bool } 
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_corner:}
% ç»ĺ¶ćŁ‹ç›çš„č§’ďĽč·Żĺľ„ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_corner:
  {
    \bool_if:nT { \l_@@_left_bool &amp;&amp; \l_@@_down_bool }     
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
      }
    \bool_if:nT { \l_@@_right_bool &amp;&amp; \l_@@_down_bool }         
      {
        \draw_path_moveto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
      }
    \bool_if:nT { \l_@@_right_bool &amp;&amp; \l_@@_up_bool }      
      {
        \draw_path_moveto:n { \l_@@_x_max_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
      }
    \bool_if:nT { \l_@@_left_bool &amp;&amp; \l_@@_up_bool }           
      {
        \draw_path_moveto:n { \l_@@_x_min_fp cm, \l_@@_y_min_fp cm }
        \draw_path_lineto:n { \l_@@_x_min_fp cm, \l_@@_y_max_fp cm }
        \draw_path_lineto:n { \l_@@_x_max_fp cm, \l_@@_y_max_fp cm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_draw_point:n}
% ç»ĺ¶ĺŤ•ä¸Şç‚ąďĽč·Żĺľ„ďĽ‰ďĽ|#1| ĺťć&nbsp;‡ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Npn \@@_draw_point:n #1
  {
    \__weiqi_loc_to_xy:n { #1 }
    \@@_transform_xy:NN \l_@@_x_int \l_@@_y_int 
    \@@_within_range:nnT { \l_@@_x_int } { \l_@@_y_int } 
      { 
        \draw_path_circle:nn 
          { \l_@@_x_int  cm, \l_@@_y_int cm } { 1mm }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_star:}
% ç»ĺ¶ćŁ‹ç›çš„ćźä˝ŤďĽč·Żĺľ„ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_star:
  {
    \clist_clear:N \l_@@_point_clist
    \int_case:nn { \g_@@_size_int }
      {
        { \c_@@_normal_size_int }
        { \clist_set_eq:NN \l_@@_point_clist \c_@@_normal_star_clist }
        { \c_@@_mid_size_int }
        { \clist_set_eq:NN \l_@@_point_clist \c_@@_mid_star_clist }
        { \c_@@_small_size_int }
        { \clist_set_eq:NN \l_@@_point_clist \c_@@_small_star_clist }
      }
    \clist_map_function:NN \l_@@_point_clist \@@_draw_point:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_set_loc_label:nn}
% č®ľç˝®ĺťć&nbsp;‡ć&nbsp;‡ç­ľďĽ|#1| ć&nbsp;‡ç­ľć–ąćˇďĽ›|#2| ĺŤ•č˝´ĺťć&nbsp;‡ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Npn \@@_set_loc_label:nn #1#2
  {
    \str_case_e:nn { #1 }
    {
      { A }
      { \str_set:Nx \l_@@_label_str { \int_to_Alph:n { #2 } } }
      { \c_@@_normal_mode_str }
      { \str_set:NV \l_@@_label_str { #2 } }      
      { \c_@@_sgf_mode_str }
      { 
        \int_set:Nn \l_tmpa_int { \g_@@_size_int - #2 + 1 }
        \str_set:Nx\l_@@_label_str { \int_to_alph:n { \l_tmpa_int } } 
      }
    }    
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board_loc:}
% ç»ĺ¶ćŁ‹ç›çš„ĺťć&nbsp;‡ďĽč·Żĺľ„ďĽ‰ă€‚
%    \begin{macrocode}  
\cs_new:Nn \@@_draw_board_loc:
  {
    \int_gset:Nn \g_tmpa_int 
      { \int_sign:n { \l_@@_x_max_int - \l_@@_x_min_int } }   
    \int_gset:Nn \g_tmpb_int 
      { \int_sign:n { \l_@@_y_max_int - \l_@@_y_min_int } }       
    \int_step_inline:nnnn
      { \l_@@_x_min_int } { \g_tmpa_int } { \l_@@_x_max_int }
      {
        \int_set:Ne \l_@@_tmp_int { \int_abs:n { ##1 } }
        \bool_if:NTF \l_@@_swap_xy_bool
          { \@@_set_loc_label:nn { \l_@@_loc_mode_str } { \l_@@_tmp_int } }
          { \@@_set_loc_label:nn { A } { \l_@@_tmp_int } }        
        \hbox_set:Nn \l_tmpa_box { \l_@@_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_@@_up_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {
                ##1 cm - 0.5 * { \box_wd:N \l_tmpa_box },
                (\l_@@_y_max_fp + \l_tmpa_fp ) cm - abs(\l_tmpb_fp) + \l_tmpb_fp
              } 
          }
        \bool_if:NT \l_@@_down_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {
                ##1 cm - 0.5 * { \box_wd:N \l_tmpa_box },
                (\l_@@_y_min_fp - \l_tmpa_fp ) cm - abs(\l_tmpb_fp) - \l_tmpb_fp 
              } 
          } 
      }
    \int_step_inline:nnnn
      { \l_@@_y_min_int } { \g_tmpb_int } { \l_@@_y_max_int }
      {
        \int_set:Ne \l_@@_tmp_int { \int_abs:n { ##1 } }
        \bool_if:NTF \l_@@_swap_xy_bool
          { \@@_set_loc_label:nn { A } { \l_@@_tmp_int } }
          { \@@_set_loc_label:nn { \l_@@_loc_mode_str } { \l_@@_tmp_int } }    
        \hbox_set:Nn \l_tmpa_box { \l_@@_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_@@_left_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {               
                (\l_@@_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_@@_right_bool
          {
            \draw_box_use:Nn \l_tmpa_box 
              {                
                (\l_@@_y_max_fp + \l_tmpa_fp) cm  - abs(\l_tmpb_fp) + \l_tmpb_fp,
                ##1 cm - 0.5 * { \box_ht:N \l_tmpa_box }
              } 
          }   
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_board:}
% ç»ĺ¶ĺ®Ść•´çš„ćŁ‹ç›ĺ…ç´&nbsp;ă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_board:
  {
    \@@_calc_board_border:
%    \end{macrocode} 
%
%    \begin{macrocode}     
    \draw_linewidth:n { 0.7 }
    \color_select:n { black }
    \@@_draw_board_grid:
    \draw_path_use_clear:n { stroke }
%    \end{macrocode} 
%
%    \begin{macrocode} 
    \draw_linewidth:n { 2 }
    \@@_draw_board_border:
    \draw_path_use_clear:n { stroke }
    \@@_draw_board_corner:
    \draw_path_use_clear:n { stroke }
%    \end{macrocode} 
%
%    \begin{macrocode}     
    \color_select:n { black }
    \@@_draw_board_star:
    \draw_path_use_clear:n { draw, fill }
%    \end{macrocode} 
%
%    \begin{macrocode} 
    \color_select:n { black!50 }
    \bool_if:NT \l_@@_show_loc_bool
      { \@@_draw_board_loc: }
    \draw_path_use_clear:n { stroke }  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_points:}
% ç»ĺ¶ĺ®Ść•´çš„ćŚ‡ç¤şç‚ąă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_draw_points:
  {
    \color_select:n { red }
    \clist_map_function:NN \g_@@_red_point_clist \@@_draw_point:n
    \draw_path_use_clear:n { draw, fill }
    \color_select:n { green }
    \clist_map_function:NN \g_@@_green_point_clist \@@_draw_point:n
    \draw_path_use_clear:n { draw, fill }
    \color_select:n { blue }
    \clist_map_function:NN \g_@@_blue_point_clist \@@_draw_point:n
    \draw_path_use_clear:n { draw, fill }
  }
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\@@_draw_stone:nnnn}
% ç»ĺ¶ä¸€ć‰‹ćŁ‹ć–çşŻć&nbsp;‡ç­ľďĽ|#1| é»‘ç™˝ć–ąďĽ›|#2| $x$ĺťć&nbsp;‡ďĽ›|#3| $y$ ĺťć&nbsp;‡ďĽ›|#4| ć&nbsp;‡ç­ľďĽ‰ă€‚\\
% ĺťć&nbsp;‡ćŻĺŹćŤ˘ĺŽçš„ĺťć&nbsp;‡ă€‚
%    \begin{macrocode}
\cs_new:Npn \@@_draw_stone:nnnn #1#2#3#4
  {
%    \end{macrocode}
% ç»ĺ¶ĺ¤–ĺ›´ç©şç™˝ďĽŚĺ¦‚ćžśćŻçşŻć&nbsp;‡ç­ľĺ™ä¸Ťç»ĺ¶ďĽš
%    \begin{macrocode}
    \int_compare:nNnF { #1 } = { 3 }
      {
        \color_fill:n { white }
        \draw_path_circle:nn { #2cm, #3cm } { 4.4mm }
        \draw_path_use_clear:n { fill }
      }
%    \end{macrocode}
% ç»ĺ¶ćŁ‹ĺ­ďĽä¸Ťĺ«ć&nbsp;‡ç­ľďĽ‰ďĽ›ĺ¦‚ćžśä¸şçşŻć&nbsp;‡ç­ľďĽŚĺ™ç»ĺ¶ç©şç™˝ďĽš
%    \begin{macrocode}
    \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 }
%    \end{macrocode}
% ç»ĺ¶ćŁ‹ĺ­ć&nbsp;‡ç­ľďĽš
%    \begin{macrocode}
    \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 }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_stones:}
% ç»ĺ¶ĺ®Ść•´çš„ĺ¸¸č§„ćŁ‹ĺ­ă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_stones:
  {
    \draw_linewidth:n { 1 }
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_set:Ne \l_@@_player_int
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } }
        \str_set:Nx \l_@@_tmp_str 
          { \seq_item:Nn \g_@@_label_seq { ##1 } }
        \seq_if_in:NnT \g_@@_die_seq { ##1 } 
          { \int_set:Nn \l_@@_x_int { 0 } }
        \int_if_zero:nF { \l_@@_x_int }
          {
            \@@_transform_xy:NN \l_@@_x_int \l_@@_y_int 
            \@@_within_range:nnT 
              { \l_@@_x_int } { \l_@@_y_int }
              {
                \@@_draw_stone:nnnn { \l_@@_player_int }
                  { \l_@@_x_int } { \l_@@_y_int } { \l_@@_tmp_str }
              }
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_specific_stone:}
% ç»ĺ¶ćŚ‡ĺ®šçš„ä¸€ä¸Şç‰ąć®Šçš„ćŁ‹ĺ­ďĽć­»ĺ­ă€č™šçť€ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_specific_stone:
  {
    \color_select:n { black }
    \int_case:nn { \l_@@_player_int }
      {
        { 1 } { \color_fill:n { black } } 
        { 2 } { \color_fill:n { white } }
      }
    \draw_path_circle:nn{ \l_@@_x_fp cm, \l_@@_y_fp cm } { 4mm }
    \draw_path_use_clear:n { draw, fill }
%    \end{macrocode}
%    \begin{macrocode}
    \int_case:nn { \l_@@_player_int }
      {
        { 1 } { \color_select:n { white } } 
        { 2 } { \color_select:n { black } }
      }  
    \@@_xy_to_loc:N \l_tmpa_str
    \hbox_set:Nn \l_tmpa_box { \Large \textbf{ \l_@@_tmp_str } } 
    \hbox_set:Nn \l_tmpb_box { \Large \texttt{ \l_tmpa_str } } 
    \draw_box_use:Nn \l_tmpa_box 
      {
        \l_@@_x_fp cm - 0.5 * { \box_wd:N \l_tmpa_box },
        \l_@@_y_fp cm - 0.5 * { \box_ht:N \l_tmpa_box }
      }
    \color_select:n { black }
    \draw_box_use:Nn \l_tmpb_box 
      {
        \l_@@_x_fp cm + 6mm,
        \l_@@_y_fp cm - 0.5 * { \box_ht:N \l_tmpa_box }
      }
%    \end{macrocode}
%    \begin{macrocode}
    \fp_set:Nn \l_tmpa_fp { min(\l_@@_x_min_fp, \l_@@_x_max_fp) }
    \fp_set:Nn \l_tmpb_fp { max(\l_@@_x_min_fp, \l_@@_x_max_fp) }
    \fp_add:Nn \l_@@_x_fp { 2 }
    \fp_compare:nNnT { \l_@@_x_fp } &gt; { \l_tmpb_fp }
      {
        \fp_set_eq:NN \l_@@_x_fp \l_tmpa_fp
        \fp_sub:Nn \l_@@_y_fp { 1 }
      }
  } 
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_draw_specific_stones:}
% ç»ĺ¶ĺ®Ść•´çš„ç‰ąć®ŠćŁ‹ĺ­ďĽć­»ĺ­ă€č™šçť€ďĽ‰ă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_draw_specific_stones:
  {
    \draw_linewidth:n { 1 }
    \fp_set:Nn \l_@@_x_fp { min(\l_@@_x_min_int, \l_@@_x_max_int) }
    \fp_set:Nn \l_@@_y_fp { min(\l_@@_y_min_int, \l_@@_y_max_int) - 1.2}
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_set:Ne \l_@@_player_int
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } }
        \str_set:Nx \l_@@_tmp_str 
          { \seq_item:Nn \g_@@_label_seq { ##1 } }
%    \end{macrocode}     
%    \begin{macrocode}     
        \seq_if_in:NnTF \g_@@_die_seq { ##1 } 
          { \int_set:Nn \l_tmpa_int { 0 } }
          { \int_set_eq:NN \l_tmpa_int \l_@@_x_int }
        \str_compare:eNeT { \l_@@_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_@@_player_int } &gt; { 0 } }
            { \int_compare_p:nNn { \l_@@_player_int } &lt; { 3 } }
          }
          { \@@_draw_specific_stone: }
      } 
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\@@_show:}
% ćľç¤şĺ®Ść•´ĺŻąĺ±€ă€‚
%    \begin{macrocode}
\cs_new:Nn \@@_show:
  {
    \draw_begin:
      \group_begin:
        \draw_transform_scale:n { \l_@@_scale_fp }
        \@@_draw_board:   
        \@@_draw_points:   
        \@@_draw_stones:
        \@@_draw_specific_stones:
      \group_end:
    \draw_end:
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{ĺ®šäą‰ć–‡ćˇŁĺ‘˝ä»¤}
%
% ćś¬čŠ‚ĺ®šäą‰äş†ä¸€äş›äľ›ĺ®ŹĺŚ…ĺ¤–ä˝żç”¨çš„ć–‡ćˇŁĺ‘˝ä»¤ă€‚
%
% \begin{macro}{\newweiqi}
% ĺĽ€ĺ§‹ć–°ĺŻąĺ±€ă€‚
%    \begin{macrocode}
\NewDocumentCommand \newweiqi { s o }
  {
     \IfNoValueTF { #2 }
       { \@@_new_game:n { \g_@@_default_size_int } }
       { 
         \IfBooleanT { #1 } { \int_gset:Nn \g_@@_default_size_int { #2 } }
         \@@_new_game:n { #2 } 
       }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqisize}
% ć›´ć”ąćŁ‹ç›ĺ¤§ĺ°Źă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqisize { s m }
  {
    \IfBooleanT{ #1 }
      { \int_gset:Nn \g_@@_default_size_int { #2 } }
    \int_set:Nn \g_@@_size_int { #2 }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiblack, \weiqiwhite}
% ć·»ĺŠ&nbsp;é»‘/ç™˝ćŁ‹ĺ­ă€‚ćźĺŹ·ç‰ćś¬ĺ‘˝ä»¤ć—&nbsp;ĺŚşĺ«ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiblack { s o m }
  { 
    \IfNoValueTF { #2 }
      { \@@_add_stones:nnn { 1 } { #3 } { } }
      { \@@_add_stones:nnn { 1 } { #3 } { #2 } }
  }
%    \end{macrocode}
%    \begin{macrocode}
\NewDocumentCommand \weiqiwhite { s o m }
  { 
    \IfNoValueTF { #2 }
      { \@@_add_stones:nnn { 2 } { #3 } { } }
      { \@@_add_stones:nnn { 2 } { #3 } { #2 } }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqisgf}
% ä˝żç”¨ sgf ć–‡ćś¬ć·»ĺŠ&nbsp;é»‘/ç™˝ćŁ‹ĺ­ă€‚ćźĺŹ·ç‰ćś¬ĺ‘˝ä»¤ć—&nbsp;ĺŚşĺ«ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqisgf { s o m }
  { 
    \IfNoValueTF { #2 }
      { \@@_add_sgf_stones:nn { #3 } { } }
      { \@@_add_sgf_stones:nn { #3 } { #2 } }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\inputsgf}
% čŻ»ĺŹ– sgf ćŁ‹č°±ă€‚ćźĺŹ·ç‰ćś¬ĺ‘˝ä»¤ć—&nbsp;ĺŚşĺ«ă€‚
%    \begin{macrocode}
\NewDocumentCommand \inputsgf { s o m }
  { 
    \ior_open:Nn \g_tmpa_ior { #3 }
    \str_set:Nn \l_@@_tmp_str {}
    \ior_str_map_inline:Nn \g_tmpa_ior 
      {
        \str_put_right:Nx \l_@@_tmp_str { ##1 }
      }
    \ior_close:N \g_tmpa_ior
%    \end{macrocode}  
%    \begin{macrocode}  
    \regex_extract_once:nVNTF { ;GM\[1\] } { \l_@@_tmp_str } \l_tmpa_seq
      {
        \regex_extract_once:nVNTF { SZ\[[0-9]+\] } { \l_@@_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_@@_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 } }
            \@@_add_sgf_stones:VV { \l_@@_tmp_str } { \l_tmpa_int }  
          }
          { č§ŁćžćŁ‹ç›ĺ¤§ĺ°Źĺ¤±č´Ą }
      }
      { ä¸Ťć”ŻćŚçš„ćŁ‹č°± }  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\resetnumber}
% é‡Ťć–°äż®ć”ąćŁ‹ĺ­ć‰‹ć•°ă€‚ćźĺŹ·ç‰ćś¬ĺ‘˝ä»¤ć—&nbsp;ĺŚşĺ«ă€‚
%    \begin{macrocode}
\NewDocumentCommand \resetnumber { s o }
  { 
    \IfNoValueTF { #2 }
      { \@@_reset_stone_number:n { 1 } }
      { \@@_reset_stone_number:n { #2 } }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqilabel, \clearlabel}
% ć·»ĺŠ&nbsp;/ĺ&nbsp;é™¤ć&nbsp;‡ç­ľă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqilabel { s o m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_labels: } 
    \IfNoValueTF { #2 }
      { \@@_add_stones:nnn { 3 } { #3 } { a } }
      { \@@_add_stones:nnn { 3 } { #3 } { #2 } }
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \clearlabel { }
  { \@@_clear_labels: }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqired, \weiqigreen, \weiqiblue, \clearpoint}
% ć·»ĺŠ&nbsp;çş˘ç»żč“ťç‚ąă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqired { s m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_points: } 
    \@@_add_points:nn { red } { #2 } 
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \weiqigreen { s m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_points: } 
    \@@_add_points:nn { green } { #2 } 
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \weiqiblue { s m }
  { 
    \IfBooleanT{ #1 } { \@@_clear_points: } 
    \@@_add_points:nn { blue } { #2 } 
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \clearpoint { }
  { \@@_clear_points: }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqidie}
% ć&nbsp;‡č®°ć­»ĺ­ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqidie { s m }
  {
    \@@_modify_stones:nN { #2 } \@@_die_stone:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiremove}
% ç§»é™¤ćŁ‹ĺ­ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiremove { s m }
  {
    \@@_modify_stones:nN { #2 } \@@_remove_stone:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqichange}
% ĺ‡ćŤ˘ćŁ‹ĺ­é»‘ç™˝ć–ąă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqichange { s m }
  {
    \@@_modify_stones:nN { #2 } \@@_change_stone:n
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\showweiqi}
% ćľç¤şćŁ‹ç›ă€‚
%    \begin{macrocode}
\NewDocumentCommand \showweiqi { s o }
  {
    \IfNoValueTF { #2 }
      { \@@_calc_range: }
      { \@@_set_range:n { #2 } }
    \@@_show:
    \IfBooleanF { #1 } { \newweiqi }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\nonelocmode, \normallocmode, \sgflocmode}
% č®ľç˝®ĺ›´ćŁ‹ĺťć&nbsp;‡ćľç¤şć¨ˇĺĽŹă€‚
%    \begin{macrocode}
\NewDocumentCommand \nonelocmode { s }
  {
    \bool_set_false:N \l_@@_show_loc_bool
    \IfBooleanT { #1 } { \bool_gset_false:N \g_@@_show_loc_bool }
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \normallocmode { s }
  {
    \bool_set_true:N \l_@@_show_loc_bool
    \str_set_eq:NN \l_@@_loc_mode_str \c_@@_normal_mode_str   
    \IfBooleanT { #1 } 
      {
        \bool_gset_true:N \g_@@_show_loc_bool
        \str_gset_eq:NN \g_@@_loc_mode_str \c_@@_normal_mode_str
      }  
  }
%    \end{macrocode}
%
%    \begin{macrocode}
\NewDocumentCommand \sgflocmode { s } 
  { 
    \bool_set_true:N \l_@@_show_loc_bool
    \str_set_eq:NN \l_@@_loc_mode_str \c_@@_sgf_mode_str
    \IfBooleanT { #1 } 
      {
        \bool_gset_true:N \g_@@_show_loc_bool
        \str_gset_eq:NN \g_@@_loc_mode_str \c_@@_sgf_mode_str
      }  
  }
%    \end{macrocode}
% \end{macro}
%

%
% \begin{macro}{\weiqirotate, \weiqimirror, \weiqiposition}
% ć—‹č˝¬ćŁ‹ç›ă€é•śĺŹćŁ‹ç›ć–ćŚ‡ĺ®šćŁ‹ç›ć–ąä˝Ťă€‚
%    \begin{macrocode}
\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 } &lt; { 0 }
      { \int_add:Nn \l_tmpa_int { 360 } }
    \int_case:nn { \l_tmpa_int }
      {
        { 90 }  
        { 
          \bool_set_inverse:N \l_@@_swap_xy_bool
          \int_set:Ne \l_tmpb_int { \l_@@_x_direction_int }
          \int_set:Ne \l_@@_x_direction_int { \l_@@_y_direction_int }
          \int_set:Ne \l_@@_y_direction_int { 0 - \l_tmpb_int }
        }  
        { 180 } 
        {
          \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_x_direction_int }
          \int_set:Ne \l_@@_y_direction_int { 0 - \l_@@_y_direction_int }
        }
        { 270 } 
        { 
          \bool_set_inverse:N \l_@@_swap_xy_bool
          \int_set:Ne \l_tmpb_int { \l_@@_x_direction_int }
          \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_y_direction_int }
          \int_set:Ne \l_@@_y_direction_int { \l_tmpb_int }
        } 
      }
    \IfBooleanT{ #1 }
      { 
        \bool_gset_eq:NN \g_@@_swap_xy_bool \l_@@_swap_xy_bool
        \int_gset_eq:NN \g_@@_x_direction_int \l_@@_x_direction_int
        \int_gset_eq:NN \g_@@_y_direction_int \l_@@_y_direction_int
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\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_@@_x_direction_int { 0 - \l_@@_x_direction_int }
      }
      { y }
      {
        \int_set:Ne \l_@@_y_direction_int { 0 - \l_@@_y_direction_int }
      }
      { xy }
      {
        \int_set:Ne \l_@@_x_direction_int { 0 - \l_@@_x_direction_int }
        \int_set:Ne \l_@@_y_direction_int { 0 - \l_@@_y_direction_int }
      }
    
    }
    \IfBooleanT{ #1 }
      { 
        \bool_set_eq:NN \g_@@_swap_xy_bool \l_@@_swap_xy_bool
        \int_set_eq:NN \g_@@_x_direction_int \l_@@_x_direction_int
        \int_set_eq:NN \g_@@_y_direction_int \l_@@_y_direction_int
      }
  }
%    \end{macrocode}
%    \begin{macrocode}
\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 } &lt; { 0 }
      { \int_add:Nn \l_tmpa_int { 360 } }
    \int_case:nn { \l_tmpa_int }
      {
        { 0 }
        {
          \bool_set_false:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { 1 }
          \int_set:Nn \l_@@_y_direction_int { 1 }
        }
        { 90 }  
        { 
          \bool_set_true:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { 1 }
          \int_set:Nn \l_@@_y_direction_int { -1 }
        }  
        { 180 } 
        {
          \bool_set_false:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { -1 }
          \int_set:Nn \l_@@_y_direction_int { -1 }
        }
        { 270 } 
        { 
          \bool_set_true:N \l_@@_swap_xy_bool
          \int_set:Nn \l_@@_x_direction_int { -1 }
          \int_set:Nn \l_@@_y_direction_int { 1 }
        } 
      }
    \IfBooleanT{ #1 }
      { 
        \bool_gset_eq:NN \g_@@_swap_xy_bool \l_@@_swap_xy_bool
        \int_gset_eq:NN \g_@@_x_direction_int \l_@@_x_direction_int
        \int_gset_eq:NN \g_@@_y_direction_int \l_@@_y_direction_int
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiscale}
% çĽ©ć”ľćŁ‹ç›ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiscale { s o }
  {
    \IfNoValueTF { #2 }
      { \fp_set:Nn \l_@@_scale_fp { 1.0 } }
      { \fp_set:Nn \l_@@_scale_fp { #2 * \l_@@_scale_fp } }
    \IfBooleanT{ #1 }
      { \fp_set_eq:NN \g_@@_scale_fp \l_@@_scale_fp }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqiminsize}
% ćś€ĺ°Źćľç¤şĺ°şĺŻ¸ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqiminsize { s m m }
  {
    \int_set:Nn \l_@@_min_width_int { #2 }
    \int_set:Nn \l_@@_min_hight_int { #3 }
    \IfBooleanT{ #1 }
      {
        \int_gset:Nn \g_@@_min_width_int { #2 }
        \int_gset:Nn \g_@@_min_hight_int { #3 }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\saveweiqi}
% äżťĺ­ĺŻąĺ±€ă€‚
%    \begin{macrocode}
\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_@@_size_int_\l_tmpa_str }
      {
        \int_new:c { g_@@_size_int_\l_tmpa_str }
        \int_new:c { g_@@_step_count_int_\l_tmpa_str }
        \intarray_new:cn { g_@@_x_intarray_\l_tmpa_str } 
          { \c_@@_max_step_int }
        \intarray_new:cn { g_@@_y_intarray_\l_tmpa_str } 
          { \c_@@_max_step_int }
        \intarray_new:cn { g_@@_player_intarray_\l_tmpa_str }
          { \c_@@_max_step_int }
        \seq_new:c { g_@@_label_seq_\l_tmpa_str }
        \seq_new:c { g_@@_die_seq_\l_tmpa_str }
      }    
    \int_gset_eq:cN { g_@@_size_int_\l_tmpa_str } \g_@@_size_int
    \int_gset_eq:cN 
      { g_@@_step_count_int_\l_tmpa_str } \g_@@_step_count_int 
    \int_step_inline:nn { \c_@@_max_step_int }
      { 
        \intarray_gset:cnn { g_@@_x_intarray_\l_tmpa_str } { ##1 }
          { \intarray_item:Nn \g_@@_x_intarray  { ##1 } }
        \intarray_gset:cnn { g_@@_y_intarray_\l_tmpa_str } { ##1 }
          { \intarray_item:Nn \g_@@_y_intarray  { ##1 } }
        \intarray_gset:cnn { g_@@_player_intarray_\l_tmpa_str } { ##1 }
          { \intarray_item:Nn \g_@@_player_intarray  { ##1 } }
      }
    \clist_gset_eq:cN { g_@@_label_seq_\l_tmpa_str } \g_@@_label_seq  
    \clist_gset_eq:cN { g_@@_die_seq_\l_tmpa_str } \g_@@_die_seq  
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\useweiqi}
% ä˝żç”¨ĺŻąĺ±€ă€‚
%    \begin{macrocode}
\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_@@_size_int_\l_tmpa_str }
      { \@@_new_game:n { \g_@@_default_size_int } }  
      {
        \int_set_eq:Nc \l_tmpa_int { g_@@_size_int_\l_tmpa_str }
        \@@_new_game:n { \l_tmpa_int }
        \int_gset_eq:Nc \g_@@_step_count_int 
          { g_@@_step_count_int_\l_tmpa_str }
        \int_step_inline:nn { \c_@@_max_step_int }
          { 
            \intarray_gset:Nnn \g_@@_x_intarray { ##1 }
              { \intarray_item:cn { g_@@_x_intarray_\l_tmpa_str }  { ##1 } }
            \intarray_gset:Nnn \g_@@_y_intarray { ##1 }
              { \intarray_item:cn { g_@@_y_intarray_\l_tmpa_str }  { ##1 } }
            \intarray_gset:Nnn \g_@@_player_intarray { ##1 }
              { 
                \intarray_item:cn 
                  { g_@@_player_intarray_\l_tmpa_str }  { ##1 } 
              }
          }
        \clist_set_eq:Nc \g_@@_label_seq { g_@@_label_seq_\l_tmpa_str }
        \clist_set_eq:Nc \g_@@_die_seq { g_@@_die_seq_\l_tmpa_str }
      }
    \IfBooleanT{ #1 }
      {
        \@@_clear_labels:
        \int_step_inline:nn { \g_@@_step_count_int } 
          {
            \seq_gset_item:Nnn \g_@@_label_seq { ##1 } {}
          }
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\weiqidata}
% ćźĄčŻ˘ĺ†…é¨ć•°ćŤ®ă€‚
%    \begin{macrocode}
\NewDocumentCommand \weiqidata { s }
  {
    \noindent ćŁ‹ç›ĺ¤§ĺ°ŹďĽš\int_use:N \g_@@_size_int~
    ďĽé»č®¤ďĽš\int_use:N \g_@@_default_size_intďĽ‰\\
    ĺ˝“ĺ‰ŤĺŻąĺ±€ć­Ąć•°ďĽš\int_use:N \g_@@_step_count_int~ďĽĺ«çşŻć&nbsp;‡ç­ľĺŹŠç§»é™¤ćŁ‹ĺ­ďĽ‰\\
    \int_compare:nNnT { \g_@@_step_count_int } &gt; { 0 }
      { ĺşŹĺŹ·ďĽš($x$,~$y$)ďĽŚć‰€ĺ±žć–ąďĽŚć&nbsp;‡ç­ľďĽŚĺ¤‡ćł¨\\ }
    \int_step_inline:nn  {\g_@@_step_count_int} 
      {
        \int_set:Ne \l_@@_x_int 
          { \intarray_item:Nn \g_@@_x_intarray { ##1 } }
        \int_set:Ne \l_@@_y_int 
          { \intarray_item:Nn \g_@@_y_intarray { ##1 } }
        \int_set:Ne \l_@@_player_int
          { \intarray_item:Nn \g_@@_player_intarray { ##1 } }
        \str_set:Nx \l_@@_tmp_str 
          { \seq_item:Nn \g_@@_label_seq { ##1 } }          
        ##1ďĽš
        (\int_use:N \l_@@_x_int,~\int_use:N \l_@@_y_int)ďĽŚ
        \int_case:nn { \l_@@_player_int }
          {
            { 1 } { B }
            { 2 } { W }
            { 3 } { L }
            { 0 } { - }
          }ďĽŚ
        \str_if_empty:NTF \l_@@_tmp_str  
          { \meta{ç©ş} }  
          { \l_@@_tmp_str }ďĽŚ
        \int_compare:nNnTF 
          { \l_@@_player_int } = { 0 }
          { \meta{ć—&nbsp;ć•} }
          {
            \seq_if_in:NnT \g_@@_die_seq { ##1 } 
              {  \meta{ć­»ĺ­} }
              { 
                \int_compare:nNnT
                  { \l_@@_x_int } = { 0 }
                  {  \meta{č™šçť€} }
              }
          }\\
      } 
    çş˘č‰˛ćŚ‡ç¤şç‚ąďĽš
      \clist_if_empty:NTF \g_@@_red_point_clist
        { \meta{ç©ş} }
        { \clist_use:Nn \g_@@_red_point_clist {,~} }\\
    ç»żč‰˛ćŚ‡ç¤şç‚ąďĽš
      \clist_if_empty:NTF \g_@@_green_point_clist
        { \meta{ç©ş} }
        { \clist_use:Nn \g_@@_green_point_clist {,~} }\\
    č“ťč‰˛ćŚ‡ç¤şç‚ąďĽš
      \clist_if_empty:NTF \g_@@_blue_point_clist
        { \meta{ç©ş} }
        { \clist_use:Nn \g_@@_blue_point_clist {,~} }\\
    ć–ąä˝ŤäżˇćŻďĽš
      \int_use:N \l_@@_x_direction_int,~
      \int_use:N \l_@@_x_direction_int,~ 
      \bool_to_str:N \l_@@_swap_xy_boolďĽ›~
    ďĽĺ…¨ĺ±€ďĽš
      \int_use:N \g_@@_x_direction_int,~ 
      \int_use:N \g_@@_x_direction_int,~ 
      \bool_to_str:N \g_@@_swap_xy_bool
    ďĽ‰\\
    çĽ©ć”ľćŻ”äľ‹ďĽš\fp_use:N \l_@@_scale_fp~
    ďĽĺ…¨ĺ±€ďĽš\fp_use:N \g_@@_scale_fpďĽ‰\\
    ĺťć&nbsp;‡ĺ»ĺş¦ďĽš\l_@@_loc_mode_str,~\bool_to_str:N \l_@@_show_loc_bool
    ďĽĺ…¨ĺ±€ďĽš\g_@@_loc_mode_str,~\bool_to_str:N \g_@@_show_loc_boolďĽ‰\\
    ćś€ĺ°Źćľç¤şĺ°şĺŻ¸ďĽš
      \int_use:N \l_@@_min_width_int,~
      \int_use:N \l_@@_min_hight_int~
    ďĽĺ…¨ĺ±€ďĽš
      \int_use:N \g_@@_min_width_int,~
      \int_use:N \g_@@_min_hight_int
    ďĽ‰\\
    \IfBooleanT{ #1 }
      {
        ćŁ‹ĺ­ĺŚşé—´ďĽš
        (\int_use:N \l_@@_x_min_int,~\int_use:N \l_@@_y_max_int)ďĽŚ
        (\int_use:N \l_@@_x_max_int,~\int_use:N \l_@@_y_min_int)\\
        ćŁ‹ç›čľąç•ŚďĽš
        (\fp_use:N \l_@@_x_min_fp,~\fp_use:N \l_@@_x_max_fp)ďĽŚ
        (\fp_use:N \l_@@_y_min_fp,~\fp_use:N \l_@@_y_max_fp)\\
        ćŻĺ¦čľąč·ŻďĽš
        \bool_to_str:N \l_@@_up_boolďĽŚ
        \bool_to_str:N \l_@@_down_boolďĽŚ
        \bool_to_str:N \l_@@_left_boolďĽŚ
        \bool_to_str:N \l_@@_right_boolďĽä¸Šä¸‹ĺ·¦ĺŹłďĽ‰\\
      }
  }
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{ć‰«ĺ°ľ}
%
% ĺťĺ§‹ć–°ĺŻąĺ±€
%    \begin{macrocode}
\newweiqi
%    \end{macrocode}
%
% ĺ…łé—­ expl3 ć¨ˇĺĽŹ
%    \begin{macrocode}
\ExplSyntaxOff
%    \end{macrocode}
%
%    \begin{macrocode}
%&lt;/package&gt;
%    \end{macrocode}
%
% \end{implementation}
%
% \PrintIndex
</pre></body></html>