使用 sgf2dg 排版 Go 图表

使用 sgf2dg 排版 Go 图表

这是关于排版图表的问题围棋使用这些sgf2dg工具(目前版本为 4.252,可从其CPAN 主页)。该sgf2dg工具可用于从 sgf 文件(智能游戏格式)创建围棋图表,并注释图表,如下例所示:

Example for a Go diagram

这些图对我来说看起来非常漂亮,我也想添加带有编号石头的注释。TeXsgf2dggooemacs.sty提供了用于此目的的命令\textstone{}。以下几行

This is a black stone: \textstone{\goo\003@}
This is a smaller black stone: {\setGoFonts at 1.8ex \textstone{\goo\003@}}

产生良好的输出:

example of textstone command

现在我的问题

\textstone{}命令可以完成我想要的所有功能,但需要付出代价:输入的围棋棋子标签必须采用特定格式\goo(或\goe),即四位数代码。在上面的例子中\goo\003@,将产生一个标有 3 的黑棋。\goo(及其相关项\goe\bgoo和)是字体选择机制。以下是来自包\bgoe的定义:\googooemacs.sty

\def\goo{\offinterlineskip\parindent=0pt\parskip=0pt\obeylines%black odd, white even
\setbox0\hbox{\gooegb +}\global\goIntWd=\wd0\global\goIntHt=\ht0\global\goTextAdj=2pt%
\def\0##1##2##3{\if##1?\gooegb ##3 \else \gooa\char##1##2 \fi}%
\def\1##1##2##3{\if##1?\gooegb ##3 \else \goob\char##1##2 \fi}%
\def\2##1##2##3{\if##1?\gooegb ##3 \else \gooc\char##1##2 \fi}%
\def\3##1##2##3{\if##1?\gooegb ##3 \else \good\char##1##2 \fi}%
\def\4##1##2##3{\if##1?\gooegb ##3 \else \gobl\char##1##2 \fi}%
\def\5##1##2##3{\if##1?\gooegb ##3 \else \gowl\char##1##2 \fi}%
\def\-##1##2{\gooegb ##1}%
\def\!##1{\leavevmode\hbox to \goIntWd{\hss\raise\goTextAdj\hbox{\rm ##1}\hss}}% #1 on empty intersections
}

然而,我认为它们的加密太复杂了,在写我的围棋图注释时不值得考虑。

为了注释图表,我想使用高级 LaTeX 宏,例如\Black{}。我想写入\Black{3}我的源代码,然后将其转换为相应的\goo\003@

问题

我的尝试是定义一个新命令,例如:

\newcommand{\Black}[1]{%
\ifnum #1 >299 {\goo\#1@}\fi%
}
\Black{301}

但替换#1失败(我猜是因为前面的原因\)并产生输出 \#1。我该如何避免这种情况?我如何让 TeX 替换 #1 并将其放在反斜杠后面?

评论

我确实意识到还有更多问题需要解决:基于偶数/奇数标签号的字体选择,缺少较小石料编号(1-99)的前导零。

如果您尝试将 sgf 文件转换为 tex,请注意sgf2dg4.252 版本中的错误:stackoverflow.com

gooemacs.sty( )中的更改字体大小命令\setGoFonts at #1缺少行尾符号%s,请参阅行末百分号(%)有什么用?


作为 MWE,我在sgf2dg软件包中附加了一些可用的 TeX 代码。如上所述,我的尝试\Black{}失败了,因此未包含在此处。该示例需要安装sgf2dg软件包(使用 gooemacs),该软件包在许多 Linux 发行版中也可用。

\documentclass[margin=1mm]{standalone}
\usepackage{gooemacs}

\begin{document}
This is a black stone: \textstone{\goo\003@}
This is a smaller black stone: {\setGoFonts at 1.8ex \textstone{\goo\003@}}
\end{document}

答案1

如果我理解了要求,我认为

\Black{3}

\Black{41}

\Black{99}

\Black{555}

生产

testing:\goo\003@
testing:\goo\041@
testing:\goo\099@
testing:\goo\555@

在这个版本中只是回显到终端,删除了\goo你真实代码的定义。

\documentclass{article}

%this line just for testing without the go package
\def\goo#1@{\typeout{testing:\string\goo\string#1@}}

\newcommand\Black[1]{{%
\count0=#1\relax
\divide\count0 by 100\relax
\count2=\numexpr#1-100*\count0\relax
\count4=\count2\relax
\divide\count2 by 10
\count4=\numexpr\count4-10*\count2\relax
\edef\tmp{\noexpand\goo
\expandafter\noexpand\csname\the\count0\endcsname
\the\count2
\the\count4
@}\tmp
}}
\begin{document}


\Black{3}

\Black{41}

\Black{99}

\Black{555}


\end{document}

答案2

在此回答中,我提出了一种既适用于偶数石头也适用于字母标记的解决方案。\goo我们不用编写高级宏,而是用新的字体选择机制来代替它\mygo

font test Black

\documentclass[margin=3mm]{standalone}
\usepackage{gooemacs}

\def\mygo{%
  \def\a##1##2##3{\ifodd ##3 \gooa\char##2##3 \else \goea\char##2##3\fi}% 1 - 99
  \def\b##1##2##3{\ifodd ##3 \goob\char##2##3 \else \goeb\char##2##3\fi}% hundreds
  \def\c##1##2##3{\ifodd ##3 \gooc\char##2##3 \else \goec\char##2##3\fi}% two hundreds
  \def\d##1##2##3{\ifodd ##3 \good\char##2##3 \else \goed\char##2##3\fi}% three hundreds
  \def\s##1{\gooegb##1}%
  \def\t##1##2{\gobl\char##1##2}% if label, subst 2 for ##1 ??
}

\newcommand{\Black}[1]{%
\if!\ifnum9<1#1!\fi% if it's a number:
{\ifnum #1<10 {\mygo\a00#1}%
  \else \ifnum #1<100 {\mygo\a0#1}%
  \else \ifnum #1<200 {\mygo\b#1}%
  \else \ifnum #1<300 {\mygo\c#1}%
  \else \ifnum #1<400 {\mygo\d#1}%
  \fi% larger numbers will not be printed, no error message.
  \fi%
  \fi%
  \fi%
  \fi}%
\else%if it's a letter:
{\mygo\t\numexpr`#1-`\a+1\relax}\fi%
}%

\begin{document}
\begin{minipage}{5cm}

\Black{1}\Black{2}\Black{11}\Black{12}\Black{111}\Black{112}\Black{211}\Black{212}\Black{311}\Black{312}\\
\Black{a}\Black{b}\Black{c}\Black{d}\Black{e}\Black{f}\Black{g}\Black{h}\Black{i}\Black{j}

\end{minipage}
\end{document}

该解决方案可轻松扩展至白石。


可能的扩展/改进:我想知道是否可以减少条件的数量。 if-then-else 结构的顺序可能最好先测试字母,因为人们更有可能评论黑棋 a 而不是黑棋 312?

此外,目前还不支持符号。我想知道可选参数是否是这里的解决方法。例如,\Black[t]{}对于用三角形标记的黑棋。\mygo为此准备了的定义\def\s##1{\gooegb##1}%\gooegbsgf2dg标记棋子的字体)。

相关内容