0

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}

psygo
  • 438

1 Answers1

2

you could have cut 100 or so lines out of your example., the error message highlights the location of the error

! Illegal unit of measure (pt inserted).
<to be read again> 
                   *

You have

\setlength{\leftRightShift}{\dimexpr #3 * 10 / 14 \relax}

at this point, #3 is \step which is defined essentially as

\def\step{0.625}

so as the error message says, you have no units in this expression.

You could, for example, use either this:

\pgfmathsetmacro{\leftRightShift}{#3 * 10 / 14}

Or this:

\setlength{\leftRightShift}{\dimexpr #3cm * 10 / 15 \relax}
psygo
  • 438
David Carlisle
  • 757,742
  • I'm kinda dumbfounded. I thought I had tried this at some point. Apparently, I didn't. Thanks, @DavidCarlisle! – psygo Feb 06 '24 at 13:16
  • 1
    @PhilippeFanaro Note that #3cm will lead to errors when #3 does contain a unit. So, it might be a good idea to use #3 * 1cm. – Jasper Habicht Feb 06 '24 at 13:50