11

For presenting positions in the game of backgammon, there is a commercially developed, but free for personal use, without modifications, font called eXtremeGammon. The ttf font file is available from the eXtreme Gammon site ttf file. I was hoping to use this font for typesetting notes and references using LaTeX. I took the advice from the accepted answer to an earlier TeX Stackexchange post, Installing TTF fonts in LaTeX, on using ttf fonts in LaTeX by using XeTeX rather than LaTeX.

I have two problems with this approach:

1) Some characters in the font are not found by XeLaTeX, eg. digraphs and the £ character. The font does work with these characters outside TeX and the characters do appear with a symbol when studying the ttf file using FontForge. The following simple example outputs a pdf file from XeLaTeX, but containins only the symbol for the @-character.

\documentclass{article}
\usepackage{fontspec}
\setromanfont{eXtremeGammon}
\begin{document}
ñ © @ £
\end{document}

The only thing I can understand as related in the log file is these lines:

Missing character: There is no ñ in font eXtreme Gammon/ICU!
Missing character: There is no © in font eXtreme Gammon/ICU!
Missing character: There is no £ in font eXtreme Gammon/ICU!

I tried using the tip from this earlier posting related to inputting characters to XeLaTeX Foreign characters in XeLaTeX, but it did not change anything for me.

2) The goal is to be able to typeset positions with end result as in this picture enter image description here

which is an image of how browsers render the font. The font works by individual characters being eg. a black disc on the middle fifth of a downward triangle with white background, a white disc on the lowest fifth of an upward triangle with lined background or eg. a part of the playing frame. In order to have the characters "connect" and not have holes in the resulting position I add \offinterlineskip. However, this still leaves very thin horizontal empty lines in the diagram after some lines. Here is a simple example that draws a downward white triangle using the font. The spacing is better but not quite right at all lines, even with \offinterlineskip

\documentclass{article}
\usepackage{fontspec}
\setromanfont{eXtremeGammon}
\begin{document}
\offinterlineskip %% Still leaves thin vertical lines of empty space
                  %% after some lines. Problem in font itself ?
\noindent 
A\\
B\\
C\\
D\\
E
\end{document}

Here is image of the triangle in the pdf output with thin empty lines in two spots:

enter image description here

A last note is that the eg. the triangles does not look nearly as "sharp" as in a browser when it is rendered using a CSS sheet with @font-face, so perhaps this overall strategy on how to typeset these positions in TeX is flawed ?

UPDATE: Regarding part 1) I tried running Leo Liu's answer to Generating a table of glyphs with XeLaTeX and it turns out that only for values i in the range from 32 to 160 are there any for which \iffontchar\font\i is true despite there being more characters with symbols in the ttf font then the number of trues here. I haven't worked much with LaTeX and fonts but I am starting to think if this could be some sort of encoding problem ? The following post could be relevant Font has glyph but XeLaTeX reports "Missing character". How would I check the following from the last comment in that post: if this font is to old and doesn't use unicode ?

8
  • I added the image from the font website. Could you add the image from your code? As you don't have enough rep yet to do this, the right way is to upload via the image button and then remove just the ! from the automatically inserted code. Then another user can easily add the image. If you edit the code before you have enough rep to include images, you'll need to remove the !s from both image inclusions (as you'll need to do to add the second image since I've added the first - if I'd thought about it, I'd've waited before adding the first! Sorry!). Commented Mar 19, 2012 at 14:26
  • Not sure if I understand correctly: "Could you add the image from your code?". I could press the image button and input the URL for it and only when submitting the question the "Oops..." message appeared with the info about images and new users. Or you mean somehow add image from TeX code ? Commented Mar 19, 2012 at 14:37
  • @MichaelRas I have upvoted, please try again. You can ping the person you want to reply to by putting an @ character and typing the nickname of that particular user.
    – percusse
    Commented Mar 19, 2012 at 14:40
  • @percusse Thank you for info. I have added proper image now. Commented Mar 19, 2012 at 14:45
  • 1
    The link to the font doesn't seem to work.
    – Alan Munn
    Commented Mar 19, 2012 at 15:03

2 Answers 2

12

Since I like to play backgammon, this seemed like a useful thing to do. Here's an initial version of a backgammon display package. This is pretty rough, and I expect to update it, but it's pretty usable in its present state. Obviously it still needs some documentation, and there may be a few features missing.

Update

The package described below is currently being developed and is not yet officially released. The latest version of the code can be obtained from GitHub. Comments welcome.

tikz-backgammon.sty

Put this in your local texmf folder:

% Copyright 2012 by Alan Munn
%
% This package may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This package has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this package is Alan Munn.
%
% This package consists of the file tikz-backgammon.sty and documentation files
% tikz-backgammon.tex and tikz-backgammon.pdf
%
% Version 0.5 2012/03/20
%
%
\ProvidesPackage{tikz-backgammon}[2012/03/20 Backgammon game display using TikZ v0.5]
\RequirePackage{etoolbox}
\RequirePackage{tikz}
\usetikzlibrary{positioning}

% Construct the board
%
% alternating colours for the board
\newcommand*{\BW}{\pgfmathifthenelse{mod(\x,2)==0}{1}{0}\let\fillstyle\pgfmathresult}
\newcommand*{\WB}{\pgfmathifthenelse{mod(\x,2)==0}{0}{1}\let\fillstyle\pgfmathresult}
% construct a  down point
\newcommand*{\dpoint}{%
\BW
\draw[thick,style=\fillstyle]
     (\x,0) -- (\x+3/2,15) -- (\x+3,0) -- cycle; }
% construct an up point
\newcommand{\upoint}{%
\WB
\draw[thick,style=\fillstyle]
     (\x,32) -- (\x+3/2,17) -- (\x+3,32) -- cycle; }
% set basic tikzparameters     
\tikzset{1/.style={fill=\boardblack},
                0/.style={fill=\boardwhite},
                stone/.style={scale=1.35,draw=black,circle},
                sans/.style={font=\footnotesize\sffamily},
                cube/.style={minimum size=.5cm}
                }
% initialization
\def\cubepos{above}
\pgfdeclarelayer{board}
\pgfdeclarelayer{pieces}
\pgfsetlayers{board,pieces,main}
% These should be made internal or key values
\newcommand*{\black}{black} % for the stones
\newcommand*{\white}{white}
\newcommand*{\boardblack}{brown}
\newcommand*{\boardwhite}{olive!50}
\newcommand*{\defaultscale}{.2}
\newlength{\betweengameskip}
\setlength{\betweengameskip}{2\baselineskip}
% initial state of the doubling cube
\newcommand*{\doublestate}{neutral}
\newcommand*{\doublenum}{2}
% create 24 counters for the point counts
% create 24 macros for the point state (black,white,none)
\foreach \x in {1,...,24}{
\newcounter{bk@pt\x}
\expandafter\gdef\csname bk@state\x\endcsname{none}
}

% some debugging commands
\newcommand*\showpoint[1]{\the\csname c@bk@pt#1\endcsname}
\newcommand*\setstate[2]{\expandafter\gdef\csname bk@state#1\endcsname{#2}}
\newcommand*\usestate[1]{\csname bk@state#1\endcsname}

% basic command to draw the board
% all of these numbers probably shouldn't be hard coded
%
\newcommand{\drawboard}{%
  \begin{pgfonlayer}{board}
% draw the boarder and the point numbers
    \draw[line width=4pt] (0,0) -- (0,32) -- (38,32) -- (38,0) -- cycle;
    \foreach \x in {1,...,6}{
       \node[sans] (\x) at (39.5-\x*3,-1.5)  {\x};
        \pgfmathparse{int(\x+6)}\let\nodename\pgfmathresult
        \node[sans] (\nodename) at (25.5-\x*3-6,-1.5)  {\nodename};
        \pgfmathparse{int(25-\x)}\let\nodename\pgfmathresult
        \node[sans] (\nodename) at (39.5-\x*3,33.5)  {\nodename};
        \pgfmathparse{int(\x+12)}\let\nodename\pgfmathresult
         \node[sans] (\nodename) at (25.5+\x*3-27,33.5)  {\nodename};
    }
% now draw the first half points
  \foreach \x in {0,3,...,15}
     \dpoint;
  \foreach \x in {0,3,...,15}
     \upoint;
% draw the bar and set the anchors for bar and the doubling cube
  \draw[very thick,fill=brown](18,0) -- (18,32) -- (20,32) -- (20,0) -- cycle;
  \node (barcenter) at (19,14) {};
  \node (black double) at (40, 2) {};
  \node (white double) at (40, 30) {};
  \node (neutral double) at (40,12.5) {};
% draw the other half of the points
  \foreach \x in {20,23,...,35}
     \dpoint;
  \foreach \x in {20,23,...,35}
     \upoint;
  \end{pgfonlayer}
}
% commands to place markers on a point and set its state
% these are used for setting the initial board and for users
% to make arbitrary board configurations
% placement is still a little off (some overlap)

% first for a black point
\newcommand{\blackpoint}[2]{%
  \global\csname c@bk@pt#1\endcsname #2\relax
  \setstate{#1}{black}
% check to see if we're on an up point or a down point
  \pgfmathparse{ifthenelse(#1>12,"below","above")}\let\pos\pgfmathresult
  \begin{pgfonlayer}{pieces}
    \foreach \x in {1,...,#2}
       \node[fill=\black,style=stone,\pos=.5*\x-.45  of #1]  {};
  \end{pgfonlayer}}
% same again for a white point
\newcommand{\whitepoint}[2]{%
  \global\csname c@bk@pt#1\endcsname #2\relax
  \setstate{#1}{white}
  \pgfmathparse{ifthenelse(#1>12,"below","above")}\let\pos\pgfmathresult
  \begin{pgfonlayer}{pieces}
     \foreach \x in {1,...,#2}
        \node[fill=\white,style=stone,\pos=.5*\x-.45  of #1]  {};
  \end{pgfonlayer}}
% now a generic version of the command for use in displaying the board
% this is really an internal command
\newcommand{\placepoint}[2]{%
  \let\ptname#1
  \ifnumcomp{#2}{<}{1}
     {}
     {\pgfmathparse{ifthenelse(#1>12,"below","above")}\let\pos\pgfmathresult
      \begin{pgfonlayer}{pieces}
         \foreach \x in {1,...,#2}
            \node[fill=\usestate{\ptname},style=stone,\pos=.5*\x-.45  of \ptname]  {};
       \end{pgfonlayer}
      }
}
% command to place pieces on the bar
\newcommand*{\onbar}[2]{%
  \begin{pgfonlayer}{board}
     \foreach \x in {1,...,#2}
         \node[fill=\csname#1\endcsname,style=stone,above=.5*\x-.35 of barcenter)] {};
      \end{pgfonlayer}
}
% user command to set a double
% syntax is \double{<owner>}{amount}
\newcommand*{\double}[2]{%
  \let\doublenum#2
  \ifstrequal{#1}{neutral}
     {\gdef\doublestate{neutral double}}
     {\ifstrequal{#1}{white}
        {\gdef\cubepos{below}\gdef\doublestate{white double}}
        {\gdef\cubepos{above}\gdef\doublestate{black double}}
     }
}
% internal command to place the doubling cube in the correct place
\newcommand*{\placedouble}{
   \node[draw,style=cube, \cubepos=.5cm of \doublestate %
  ,font={\bfseries\sffamily}] {\doublenum};}

% command to set a new game and display it  
\newcommand*{\newgame}[1][\defaultscale]{%
  \begin{tikzpicture}[scale=#1]
     \drawboard
         \whitepoint{1}{2}
         \whitepoint{12}{5}
         \whitepoint{17}{3}
         \whitepoint{19}{5}
         \blackpoint{24}{2}
         \blackpoint{13}{5}
         \blackpoint{8}{3}
         \blackpoint{6}{5}
         \double{neutral}{2}
         \placedouble
  \end{tikzpicture}}

% commands to move first black, then white  

\newcommand\blackmove[4]{
    \advance\csname c@bk@pt#1\endcsname -1\relax
    \ifnumcomp{\the\csname c@bk@pt#1\endcsname}{=}{0}
        {\expandafter\gdef\csname bk@state#1\endcsname{none}}
        {\expandafter\gdef\csname bk@state#1\endcsname{black}}
    \ifnumcomp{#2}{=}{0}{}{\advance\csname c@bk@pt#2\endcsname 1\relax}
    \expandafter\gdef\csname bk@state#2\endcsname{black}
    \advance\csname c@bk@pt#3\endcsname -1\relax
    \ifnumcomp{\the\csname c@bk@pt#3\endcsname}{=}{0}
        {\expandafter\gdef\csname bk@state#1\endcsname{none}}
        {\expandafter\gdef\csname bk@state#3\endcsname{black}}
    \ifnumcomp{#4}{=}{0}{}{\advance\csname c@bk@pt#4\endcsname 1\relax}
    \expandafter\gdef\csname bk@state#4\endcsname{black}
}

\newcommand\whitemove[4]{
    \advance\csname c@bk@pt#1\endcsname -1\relax
    \ifnumcomp{\the\csname c@bk@pt#1\endcsname}{=}{0}
        {\expandafter\gdef\csname bk@state#1\endcsname{none}}
        {\expandafter\gdef\csname bk@state#1\endcsname{white}}
    \ifnumcomp{#2}{=}{0}{}{\advance\csname c@bk@pt#2\endcsname 1\relax}
    \expandafter\gdef\csname bk@state#2\endcsname{white}
    \advance\csname c@bk@pt#3\endcsname -1\relax
    \ifnumcomp{\the\csname c@bk@pt#3\endcsname}{=}{0}
        {\expandafter\gdef\csname bk@state#1\endcsname{none}}
        {\expandafter\gdef\csname bk@state#3\endcsname{white}}
    \ifnumcomp{#4}{=}{0}{}{\advance\csname c@bk@pt#4\endcsname 1\relax}
    \expandafter\gdef\csname bk@state#4\endcsname{white}
}

% command to display the current state of the board
\newcommand{\displayboard}{%
  \par\vspace{\betweengameskip}
  \begin{tikzpicture}[scale=\defaultscale]
        \drawboard
        \foreach \x in {1,...,24}{
            \placepoint{\x}{\the\csname c@bk@pt\x\endcsname}}
        \placedouble
    \end{tikzpicture}
}
\endinput
% Still to be added:
% Displaying the dice (easy, but I can't be bothered)

Sample document

% This is a test document for the tikz-backgammon package.
\documentclass[12pt]{article}
\usepackage{tikz-backgammon}
\begin{document}
\newgame
\blackmove{13}{8}{8}{5}
\whitemove{1}{7}{1}{7}
\double{white}{4}
\blackmove{24}{18}{24}{18}
\blackmove{8}{2}{8}{2}
\blackmove{8}{4}{13}{10}
\whitemove{12}{16}{12}{15}
\displayboard
\end{document}

Output

output of sample document

6
  • That is impressive. Very nice to get a super tutorial on TeX and tikz coding by reading your code. This is so good I feel I should mark this as the answer despite it not technically being an answer to the original question. Will keep this open for 24 hours and if nothing ttf specific shows up, I will close, if it is not considered too bad Stack Exchange form :) Commented Mar 20, 2012 at 8:31
  • 1
    Amazing code, Alan! I wish I could upvote your answer ten times. :) Commented Mar 20, 2012 at 10:35
  • @MichaelRas Yes, I know it's not an answer to your question. I messed around with the font and then decided that any system using it would be close to unusable, hence this alternative. (But don't feel obliged to accept the answer unless you decide this is effectively a better solution for your larger problem.)
    – Alan Munn
    Commented Mar 20, 2012 at 12:03
  • @AlanMunn Ok, and I am happy you messed around. Learning a lot from the code. Similar to FEN notation for chess, there are standard ways of encoding backgammon positions. Programs and some people store positions using these encodings. I am using the font on the web with a small tool that translates encodings to the text for the position in the given ttf font and my first thought was to do the same in TeX. Definitely the right way to go in general is a package. I know that the LaTeX using part of the backgammon community have been looking for a package like yours before. Commented Mar 20, 2012 at 14:01
  • @MichaelRas If you have suggestions for the syntax let me know. (You can find the code on GitHub or email me). Also if there are features that are missing. I didn't include anything for the dice roll, for example, but that wouldn't be hard to do. Since I just play backgammon for fun, I don't have much sense of the notation.
    – Alan Munn
    Commented Mar 20, 2012 at 14:06
2

I know it's been a while, and this question has even resulted in a new package, which is amazing ;) However, I just stumbled upon this question and managed to create a beautiful board with the extremegammon font. One needs the fancyvrb package, which lets you define a new verbatim environment (board) which is basically verbatim without any line height (taken from xelatex — remove line spacing in verbatim environment). Then, you have to set the mono font to the one offered by extreme gammon (I put the font into ~/.fonts and ran fc-cache). The whole thing gets compiled with lualatex, I'm currently using the version that comes with TeXLive 2019. The example board is taken from the website (I added rolls by just using simple numbers for the dice), but you can export a position from extreme gammon into the font.

\documentclass{scrartcl}
% from the fontspec documentation, chp. 4.2: Specifically choosing the NFSS family
\usepackage{fontspec}
\usepackage{fancyvrb}
\fvset{fontfamily=myverbatimfont}
\newfontfamily\verbatimfont[NFSSFamily=myverbatimfont]{eXtreme Gammon}
% create a new verbatim environment that uses the gammon font (with its new name)
\DefineVerbatimEnvironment{board}{Verbatim}{%
  formatcom={\baselineskip=-\maxdimen\lineskip=0pt},
  fontfamily=myverbatimfont
}
\begin{document}
\begin{board}
 ñ¡²±²¢ò
 ðPAZAZA@ @ZAPAFKð
 ðQBGB[B@ @[BGBGBð
 ðRCHC\C@ @\CHCHCð
 ðIDIDID@ @]DIDIDð
 ðJEJEJE@ @ÛEJEJEð
'ð      @ @ 3  1 ð
 ðejejej@ @ejejejð
 ðxididi@ @dididið
 ðwhchmh@ @mhchchð
 ðvgbglg@ @lglgb{ð
 ðupapkf@ @kfkfazð
 ó£´³´¤ô
\end{board}
\end{document}

Here's how it looks:

Board rendered with the eXtreme Gammon font

4
  • +1 for actually answering the question. :) The input here leaves a lot to be desired but I guess you could write Lua code to map move notation into boards.
    – Alan Munn
    Commented Aug 3, 2020 at 13:01
  • Thanks ;) I'm not sure if I really understand, but if you want to see which move is best in this situation or has been made in a game, you could just add it as text and layout in latex.
    – drm
    Commented Aug 3, 2020 at 16:58
  • All I meant was that inputting all of those characters to generate a board doesn't seem particularly user-friendly (just an observation, not a criticism).
    – Alan Munn
    Commented Aug 3, 2020 at 17:00
  • 1
    Ah, now I get it ;) You can export any position from eXtreme Gammon (the software) directly into the font (along with an analysis table for the best moves). It would be cool to directly translate a XGID or GnuBG-ID into a position as font, much like on fishbust.com/diagram, but then you would miss the analysis of course.
    – drm
    Commented Aug 3, 2020 at 17:11

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .