排版大型围棋棋盘

排版大型围棋棋盘

我需要排版一些非常大的围棋棋盘,比普通的 19x19 棋盘大得多,这是我正在进行的一个项目的一部分无限围棋,类似于我的项目无限棋你能帮我排版非常大的围棋棋盘吗,比如下面这个相对较小的例子:

在此处输入图片描述

我知道 LaTeX 包我去,它似乎可以生成高质量的围棋棋盘图像,虽然我没有太多使用经验,但它似乎在棋盘尺寸方面很灵活。如果需要,我可以想象将几块这样的棋盘放在一起,以制作大棋盘。这就是我制作各种无限棋盘位置所必须做的事情,而且它工作得很好。

然而,我实际上无法在我的(miktek,Windows)系统上运行 igo 包,因此很抱歉我无法提供一个最小的工作示例。

同时,我发现 igo 包中使用的输入格式对于典型的无限围棋位置(有几十颗棋子)来说不太方便。使用 igo 格式,显然需要输入类似

\white{b4,c4,d4,e4,f4,g3,g2,c3}
\black{b3,b2,c2,d3,e3,f3,f2}
\begin{center}
\shortstack{\showgoban\\White to kill}
\end{center}

获取图像:

在此处输入图片描述

因此,需要分别指定每块石头的坐标。

不过,如果能够像这样指定位置,那就方便多了:

 showgoboard{........\\
             .WWWWW..\\   
             .BWBBBW.\\
             .BB..BW.\\
             ........\\}

或类似的东西,并且还有(更大)的板尺寸。

重点是,在无限围棋位置的设计中,玩家经常会复制和粘贴位置的某些部分,或者将所有内容向上或向右移动一个或两个单位,等等,如果使用坐标式 igo 符号,这会非常烦人,但使用我的符号就很容易了。我想要一个符号系统,允许玩家轻松地将位置的某些部分作为一个区块复制到棋盘的其他部分。

有人能帮帮我吗?我想要一个可以接受类似我的符号的 Go 板程序包,或者一个可以将我的符号或类似符号转换为 igo 或其他 Go 程序包接受的符号的翻译宏。

答案1

第一个命题

这是通过 TikZ 的简单解决方案(注意:不要用作.空交叉点)。

\documentclass[tikz,margin=2mm]{standalone}
\usepackage{etoolbox}
\usepackage{xparse}
\tikzset{
  @go line/.code args={#1#2#3!}{
    \edef\myrest{#3}
    \edef\myletter{#2}
    \draw (#1,-\mycount) +(0,-.5) -- +(0,.5) +(.5,0) -- +(-.5,0);
    \ifdefstring{\myletter}{W}{
      \path[draw,fill=white] (#1,-\mycount) circle (.4);
    }{
      \ifdefstring{\myletter}{B}{
        \path[draw,fill=black] (#1,-\mycount) circle (.4);
      }{}
    }
    \ifdefstring{\myrest}{}{}{
      \pgfmathsetmacro\mynext{int(#1+1)}
      \pgfkeysalso{@go line={\mynext}#3!}
    }
  },
  go line/.style={@go line={0}#1!},
}
\NewDocumentCommand\showgoboard{m}{
  \begin{tikzpicture}[x=\mygounit,y=\mygounit]
    \edef\myconf{#1}
    \foreach [count=\mycount] \myline in \myconf {
      \tikzset{go line/.expanded=\myline}
    }
  \end{tikzpicture}
}
\def\mygounit{5mm}
\begin{document}
\showgoboard{
  --------,
  -WWWWW--,
  -BWBBBW-,
  -BB--BW-,
  --------
}
\end{document}

在此处输入图片描述

第二个提议

增强版本,更好地利用了 pgfkeys 和可能的注释。(可定制)解析器使用以下约定:

  • .(一个点)是错误!
  • B就像黑色的石头
  • W就像白色的石头
  • -(减号)为空点
  • 任何其他符号作为注释字母
\documentclass[tikz,margin=2mm]{standalone}
\usepackage{lmodern}
\usepackage{etoolbox}
\usepackage{xparse}
\tikzset{
  @go draw intersection/.code 2 args={
    \draw[line width=.5\pgflinewidth] (#1,-#2) +(0,-.5) -- +(0,.5) +(.5,0) -- +(-.5,0);
  },
  @go draw stone/.code n args={3}{
    \path[draw,fill=#3] (#1,-#2) circle (.4);
  },
  @go draw annot/.code n args={3}{
    \pgfmathsetmacro\gofsa{\gounit*.8}
    \pgfmathsetmacro\gofsb{\gofsa*1.2}
    \path (#1,-#2)
    node[fill=white,inner sep=.1em,node font=\fontsize{\gofsa pt}{\gofsb pt}\selectfont,anchor=mid]
    {#3};
  },
  @go draw W/.style 2 args={@go draw stone={#1}{#2}{white}},
  @go draw B/.style 2 args={@go draw stone={#1}{#2}{black}},
  @go draw -/.style 2 args={},
  @go line/.code args={#1#2#3!}{
    \pgfkeysalso{
      @go draw intersection={#1}{\gocount},
      @go draw #2/.try={#1}{\gocount}
    }
    \ifbool{pgfkeyssuccess}{}{\pgfkeysalso{@go draw annot={#1}{\gocount}{#2}}}
    \edef\gorest{#3}
    \ifdefstring{\gorest}{}{}{
      \pgfmathsetmacro\gonext{int(#1+1)}
      \pgfkeysalso{@go line={\gonext}#3!}
    }
  },
  go line/.style={@go line={0}#1!},
}
\NewDocumentCommand\showgoboard{m}{
  \begin{tikzpicture}[x=\gounit,y=\gounit,line width=\gounit*0.03]
    \edef\goconf{#1}
    \foreach [count=\gocount] \goline in \goconf {
      \tikzset{go line/.expanded=\goline}
    }
  \end{tikzpicture}
}
\def\gounit{6mm}
\begin{document}
\showgoboard{
  ---------,
  --BBcd---,
  -WWWWW-e-,
  -BWBBBW--,
  -BB-aBWb-,
  ---------
}
\end{document}

在此处输入图片描述

答案2

如果您愿意使用 LuaLaTex,将您的符号转换为 igo 符号相当简单:

    \documentclass[10pt,a4paper]{article}
    \usepackage{luacode}

    \newcommand{\white}[1]{WHITE:#1\\}
    \newcommand{\black}[1]{BLACK:#1\\}
    \newbox\tmp
    \newenvironment{go}{
      \setbox\tmp\vbox\bgroup{}
      \directlua{startrecording()}
    }{
      \egroup
      \directlua{stoprecording()}
    }

    \begin{luacode*}
    do
      local board = {}

      function readbuf( buf )
        -- record a part (line) of the go board
        print("Adding to buffer"..buf)
        board = board .. buf .. "\n"
      end

      function startrecording()
        -- start recording the go board; called before the go environment starts
        board = ""
        luatexbase.add_to_callback('process_input_buffer', readbuf, 'readbuf')
      end

      function row_to_char(row)
          -- converts a row number to a character (0=>a, 1=>b, 2=>c, etc)
          return string.char(65+row):lower()
      end

      function stoprecording()
        -- called when the go environment ends
        -- converts the board notation into a string for white & black

        -- removes the callback to stop recording
        luatexbase.remove_from_callback('process_input_buffer', 'readbuf')

        local row = 0               -- current row number
        local col = 0               -- current column 
        local white = ""            -- the string of white positions
        local black = ""            -- the string of black positions
        local c_char = ""           -- helper variable containing the current character

        for pos = 1 , board:len() do  -- iterate over the board string
          c_char = board:sub(pos,pos):lower()
          print("At pos"..row_to_char(row)..col.."("..pos.."), char:"..board:sub(pos,pos))
          if c_char == '.' then 
              col = col + 1
          elseif c_char == 'w' then
              col = col + 1
              white = white..','..row_to_char(row)..col
          elseif c_char == 'b' then
              col = col + 1
              black = black..','..row_to_char(row)..col
          elseif c_char == '\n' then
              col = 0
              row = row + 1
          end
        end

        -- output the commands \white{white position} \black{black position}
        tex.print("\\white{"..white:sub(2).."}\\black{"..black:sub(2).."}")
      end

    end
    \end{luacode*}

    \begin{document}
    \begin{go}
     ..W..W..
     BB.BB..B
     ........
     WWBBWWBB
    \end{go}
    \end{document}

相关内容