这是关于排版图表的问题围棋使用这些sgf2dg
工具(目前版本为 4.252,可从其CPAN 主页)。该sgf2dg
工具可用于从 sgf 文件(智能游戏格式)创建围棋图表,并注释图表,如下例所示:
这些图对我来说看起来非常漂亮,我也想添加带有编号石头的注释。TeXsgf2dg
库gooemacs.sty
提供了用于此目的的命令\textstone{}
。以下几行
This is a black stone: \textstone{\goo\003@}
This is a smaller black stone: {\setGoFonts at 1.8ex \textstone{\goo\003@}}
产生良好的输出:
现在我的问题
该\textstone{}
命令可以完成我想要的所有功能,但需要付出代价:输入的围棋棋子标签必须采用特定格式\goo
(或\goe
),即四位数代码。在上面的例子中\goo\003@
,将产生一个标有 3 的黑棋。\goo
(及其相关项\goe
、\bgoo
和)是字体选择机制。以下是来自包\bgoe
的定义:\goo
gooemacs.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,请注意sgf2dg
4.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
。
\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}%
(\gooegb
是sgf2dg
标记棋子的字体)。