我需要排版一些非常大的围棋棋盘,比普通的 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}