Как выполнить расчет длины на основе массива `\foreach`

Как выполнить расчет длины на основе массива `\foreach`

Я пытаюсь улучшить читаемость своего \drawHoshisмакроса, создавая переменные для координат x и y, а также выполняя вычисления со знаком минус внутри скобок (например x * (y - 1)). Не знаю почему, но мне просто не удаётся заставить TeX работать с ним. Думаю, это связано с массивом из 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];
}

Я пытаюсь сделать это примерно так:

\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];
    }
  }{}
}

Вот полный текстработающийпример:

\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}

Я перепробовал много вариантов этого, но ни один не сработал (я пробовал и без \dimexprнего). Может ли кто-нибудь заметить, чего мне не хватает?

решение1

Я не уверен, что вы хотите, чтобы код произвел, но все будет намного проще, если вы используете \pgfmathsetmacroвместо , \setlengthтак как это автоматически выполнит вычисления за вас. Нет необходимости добавлять единицу длины, потому что базовая единица в TiкZ в любом случае 1 см. Я бы также заменил \ifthenelseкоманду, требующую какой-то пакет, на \ifnum.

Если вы хотите выполнить вычисления внутри координаты, требующие использования скобок, вам нужно обернуть все в фигурные скобки. Следующие две строки представляют одну и ту же координату:

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

В любом случае, похоже, что в вашем коде индексы для выбора элементов из массивов неверны, по крайней мере в одном из показанных вами фрагментов кода. Убедитесь, что они верны.

\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}

Альтернативно:

\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}

Вывод обоих фрагментов кода:

введите описание изображения здесь

Связанный контент