After following the tips in this answer by @JasperHabricht, I'm trying to improve the following macro, but all I get is Illegal unit of measure (pt inserted), despite the measurement calculations being made, and the fact that, before using \pgfmathsetmacro in the other macros, everything was working fine. And, yes, I did try replacing the \newlengths and \setlengths by \pgfmathsetmacros.
\newcounter{coordinateCounter}
\setcounter{coordinateCounter}{1}
\newlength{\coordinateShift}
\newlength{\leftRightShift}
\newlength{\topBottomShift}
% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 3: step
%
% Example: A 19x19 board with size 10cm x 10cm: `\coordinates{10}{19}{\step}'
\newcommand{\coordinates}[3]{
% For some reason, TeX doesn't like dividin by non-integers?
\setlength{\leftRightShift}{\dimexpr #3 * 10 / 14 \relax}
\setlength{\topBottomShift}{\dimexpr #3 * 10 / 15 \relax}
\foreach [count=\i] \l in {A, B, ..., Z} {
\ifthenelse{\equal{\l}{I} \OR \i > \numexpr #2 + 1 \relax}{}{
\setlength{\coordinateShift}{\dimexpr #3 * (\thecoordinateCounter - 1) \relax}
% Top
\draw[
xshift = \coordinateShift,
yshift = #1cm + \topBottomShift,
] node {\l};
% Right
\draw[
xshift = #1cm + \leftRightShift,
yshift = \coordinateShift,
] node {\thecoordinateCounter};
% Bottom
\draw[
xshift = \coordinateShift,
yshift = -(\leftRightShift),
] node {\l};
% Left
\draw[
xshift = -(\leftRightShift),
yshift = \coordinateShift,
] node {\thecoordinateCounter};
\stepcounter{coordinateCounter}
}
}
\setcounter{coordinateCounter}{1}
}
The complete minimal example:
\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen}
% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
%
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{
\pgfmathsetmacro{\step}{#1 / (#2 - 1)} % chktex 1
\draw[step=\step] (0, 0) grid (#1, #1);
\boardOutline{#1}
\coordinates{#1}{#2}{\step} % chktex 1
\drawHoshis{#1}{#2}{\step}
}
% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 3: step
%
% Example: A 19x19 board with size 10cm x 10cm: `\drawHoshis{10}{19}{\step}'
\newcommand{\drawHoshis}[3]{
\ifnum#2=9\relax
\foreach \sloc in {{3, 3}, {3, 7}, {7, 3}, {7, 7}, {5, 5}}{
\pgfmathsetmacro{\hoshiCoordX}{#3 * ({\sloc}[0] - 1)}
\pgfmathsetmacro{\hoshiCoordY}{#3 * ({\sloc}[1] - 1)}
\filldraw (\hoshiCoordX, \hoshiCoordY)
circle [radius=#3 / 10];
}
\fi
}
% Parameters
%
% 1: dimension (in cm)
%
% Example: \boardOutline{10}
\newcommand{\boardOutline}[1]{
\pgfmathsetmacro{\boardOutlineLineWidth}{#1 * 5 / 1000}
% Just so the board outline isn't jagged
\pgfmathsetmacro{\boardOutlinePadding}{\boardOutlineLineWidth / 2}
% Top
\draw[black, line width = \boardOutlineLineWidth]
(-\boardOutlinePadding, #1) -- (#1 + \boardOutlinePadding, #1); % chktex 1 chktex 8
% Right
\draw[black, line width = \boardOutlineLineWidth]
(#1, 0) -- (#1, #1); % chktex 8
% Bottom
\draw[black, line width = \boardOutlineLineWidth]
(-\boardOutlinePadding, 0) -- (#1 + \boardOutlinePadding, 0); % chktex 1 chktex 8
% Left
\draw[black, line width = \boardOutlineLineWidth]
(0, 0) -- (0, #1); % chktex 8
}
\newcounter{coordinateCounter}
\setcounter{coordinateCounter}{1}
\newlength{\coordinateShift}
\newlength{\leftRightShift}
\newlength{\topBottomShift}
% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 3: step
%
% Example: A 19x19 board with size 10cm x 10cm: `\coordinates{10}{19}{\step}'
\newcommand{\coordinates}[3]{
% For some reason, TeX doesn't like dividin by non-integers?
\setlength{\leftRightShift}{\dimexpr #3 * 10 / 14 \relax}
\setlength{\topBottomShift}{\dimexpr #3 * 10 / 15 \relax}
\foreach [count=\i] \l in {A, B, ..., Z} {
\ifthenelse{\equal{\l}{I} \OR \i > \numexpr #2 + 1 \relax}{}{
\setlength{\coordinateShift}{\dimexpr #3 * (\thecoordinateCounter - 1) \relax}
% Top
\draw[
xshift = \coordinateShift,
yshift = #1cm + \topBottomShift,
] node {\l};
% Right
\draw[
xshift = #1cm + \leftRightShift,
yshift = \coordinateShift,
] node {\thecoordinateCounter};
% Bottom
\draw[
xshift = \coordinateShift,
yshift = -(\leftRightShift),
] node {\l};
% Left
\draw[
xshift = -(\leftRightShift),
yshift = \coordinateShift,
] node {\thecoordinateCounter};
\stepcounter{coordinateCounter}
}
}
\setcounter{coordinateCounter}{1}
}
\begin{document}
\begin{figure}[ht]
\begin{center}
\begin{tikzpicture}
\goGrid{5}{9}
\end{tikzpicture}
\caption{Goban 1}\label{my_goban_1}
\end{center}
\end{figure}
\end{document}
#3cmwill lead to errors when#3does contain a unit. So, it might be a good idea to use#3 * 1cm. – Jasper Habicht Feb 06 '24 at 13:50