Como fazer cálculos de comprimento com base em um array `\foreach`

Como fazer cálculos de comprimento com base em um array `\foreach`

Estou tentando melhorar a legibilidade da minha \drawHoshismacro criando variáveis ​​para as coordenadas x e y, além de também executar um cálculo com menos entre parênteses (ex. x * (y - 1)). Não sei por que, mas simplesmente não consigo fazer o TeX funcionar com ele. Acho que é algo relacionado ao array do TikZ/PGF \foreach:

\foreach \sloc in {{3, 3}, {3, 7}, {7, 3}, {7, 7}, {5, 5}}{
  % This is what I'm tryig to improve:
  \filldraw (#3 * {\sloc}[0] - #3, #3 * {\sloc}[1] - #3)
    circle [radius=#3 / 10];
}

Estou tentando fazer com que fique mais parecido com isto:

\newlength{\hoshiCoordX}
\newlength{\hoshiCoordY}
% 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]{
  \ifthenelse{#2 = 9} { 
    \foreach \sloc in {{3, 3}, {3, 7}, {7, 3}, {7, 7}, {5, 5}}{
      \setlength{\hoshiCoordX}{\dimexpr #3 * ({\sloc}[0] - 1) \relax}
      \setlength{\hoshiCoordY}{\dimexpr #3 * ({\sloc}[1] - 1) \relax}

      \filldraw (\hoshiCoordX, \hoshiCoordY)
        circle [radius=#3 / 10];
    }
  }{}
}

Aqui está o completotrabalhandoexemplo:

\documentclass{article}

\newlength{\step}
% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{
  \setlength{\step}{\dimexpr #1cm / (#2 - 1) \relax} % chktex 1

  \draw[step=\step] (0, 0) grid (#1, #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]{
  \ifthenelse{#2 = 9} { 
    \foreach \sloc in {{3, 3}, {3, 7}, {7, 3}, {7, 7}, {5, 5}}{
      % This is what I'm tryig to improve:
      \filldraw (#3 * {\sloc}[0] - #3, #3 * {\sloc}[1] - #3)
        circle [radius=#3 / 10];
    }
  }{}
}

\usepackage{tikz}

\begin{document}
  \begin{figure}[ht]
    \begin{center}
      \begin{tikzpicture}
        \goGrid{10}{9}
      \end{tikzpicture}
      \caption{Goban 1}\label{my_goban_1}
    \end{center}
  \end{figure}
\end{document}

Eu tentei muitas variações disso, mas nenhuma funcionou até agora (tentei sem \dimexprtambém). Alguém consegue identificar o que estou perdendo?

Responder1

Não tenho certeza do que você deseja que o código produza, mas as coisas serão muito mais fáceis se você usar \pgfmathsetmacroem vez de, \setlengthpois isso fará os cálculos automaticamente para você. Não há necessidade de adicionar uma unidade de comprimento, porque a unidade base em TikZ tem 1 cm de qualquer maneira. Eu também substituiria o \ifthenelsecomando que requer algum pacote por \ifnum.

Se você quiser fazer cálculos dentro de uma coordenada que exija o uso de parênteses, será necessário colocar as coisas entre chaves. As duas linhas a seguir representam a mesma coordenada:

(#3 * {\sloc}[0] - #3, #3 * {\sloc}[1] - #3) 
({#3 * ({\sloc}[0] - 1}, {#3 * ({\sloc}[1] - 1)}) 

De qualquer forma, parece que no seu código os índices para seleção dos itens dos arrays estão errados, pelo menos em um dos trechos de código que você mostra. Certifique-se de que estão corretos.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

% 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);
  \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}}{
      % This is what I'm trying to improve:
      %\filldraw (#3 * {\sloc}[0] - #3, #3 * {\sloc}[1] - #3)
      \filldraw ({#3 * ({\sloc}[0] - 1}, {#3 * ({\sloc}[1] - 1)})
        circle[radius={#3 / 10}];
    }
  \fi
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{9}
  \end{tikzpicture}
\end{document}

Alternativamente:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}

% 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);
  \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
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{9}
  \end{tikzpicture}
\end{document}

Saída de ambos os trechos de código:

insira a descrição da imagem aqui

informação relacionada