マクロ (`\newcommand`) パラメータに名前を付けて、それを使用して計算を行うことは可能ですか?

マクロ (`\newcommand`) パラメータに名前を付けて、それを使用して計算を行うことは可能ですか?

私は LaTeX でコマンドを作成するのが初めてなので、計算を行うときにコマンド内にもっとわかりやすい名前を追加したり、そのパラメータを使って計算を行ったりしたいと思っています。次に例を示します。

\documentclass{article}

\usepackage{tikz}

\newcommand{\gogrid}[1][1]{
  % Here are some of my attempts:

  % \def\size{#1 / 19}
  \newlength{\size}
  \setlength{\size}{#1 / 19}
  % Maybe I need to specify the type of the `#1` parameter?

  \draw[step=#1 / 19] (-#1, -#1) grid (#1,#1);
  \draw[line width=1] (-#1, #1) -- (#1 + 0.015, #1); % chktex 8
  \draw[line width=1] (#1, -#1) -- (#1, #1); % chktex 8
}

\begin{document}
  \begin{figure}[h]
    \begin{center}
      \begin{tikzpicture}
        \gogrid
        % \draw(-5,-5) grid (5,5);
        \filldraw[black](0,0)circle[radius=3pt];
        \filldraw[black](1,1)circle[radius=3pt];
      \end{tikzpicture}
      \caption{\label{my_grid}A grid with two points!}
    \end{center}
  \end{figure}
\end{document}

これは LaTeX で可能ですか? 通常のプログラミング言語では、読みやすくするためにこのようなことをよく使います。(また、余談ですが、このようなことを説明した本や Web サイトの参考資料をお持ちの方がいらっしゃいましたら、ぜひ教えてください。)

答え1

#1コマンドの引数に適切な単位を定義し、TikZ 内での寸法計算にも適切な構文を使用すれば、例のすべてが機能します\setlength。TikZ 描画の単位は省略できますが、寸法計算では省略できません。したがって、 を使用する必要があります\setlength{\size}{\dimexpr#1cm/19\relax}

TikZ では、座標の単位が省略された場合は がcm想定されます。線幅にはptが使用されます。

コメントで述べたように、\newlength{\size}毎回同じ新しい長さを再定義する必要はないため、はコマンド定義の外に配置する必要があります。

以下に、コードを使用してグリッドを生成する 2 つの例を示します。寸法計算が実際に機能していることを示すために\size、中心点の下のノードとして の値を出力し、中心点の半径を長さと同じに設定しました\size。中心点は正確に 4 つのブロックを占めます。

\documentclass{article}

\usepackage{tikz}

\newlength{\size}
\newcommand{\gogrid}[1][1]{
  \setlength{\size}{\dimexpr#1cm/19\relax}

  \draw[step=\size] (-#1, -#1) grid (#1,#1);
  \draw[red,line width=1] (-#1, #1) -- (\dimexpr#1cm+1cm , #1); 
  \draw[blue,line width=1] (#1, -#1) -- (#1, #1);
}

\begin{document}
  \begin{figure}[ht]
    \begin{center}
      \begin{tikzpicture}
        \gogrid
        \filldraw (0,0) circle [radius=1.49751pt] node[below] {\the\size};
        \filldraw (1,1) circle[radius=1.49751pt];
      \end{tikzpicture}
      \caption{A grid with two points!}\label{my_grid1}
    \end{center}
  \end{figure}

  \begin{figure}[ht]
    \begin{center}
      \begin{tikzpicture}
        \gogrid[5]
        \filldraw (0,0) circle [radius=7.48756pt] node[below=0.5cm] {\the\size};
        \filldraw (5,5) circle[radius=3pt];
      \end{tikzpicture}
      \caption{Another grid with two points!}\label{my_grid2}
    \end{center}
  \end{figure}
\end{document}

出力:

デフォルトサイズ = 1 サイズ = 5

答え2

これを s 内で実行する場合は、計算を処理させるtikzpictureことができます。と の行を削除するだけで機能します。pgfmath\newlength...\setlength...

\newcommand{\gogrid}[1][1]{%
  \draw[step=#1 / 19] (-#1, -#1) grid (#1,#1);
  \draw[line width=1] (-#1, #1) -- (#1 + 0.015, #1); % chktex 8
  \draw[line width=1] (#1, -#1) -- (#1, #1); % chktex 8
}

\gogrid[<number or length>]s内で有効にしますtikzpicture

\begin{tikzpicture}
  \gogrid[10mm]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\begin{tikzpicture}
  \gogrid[5]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}

ただし、この特定の用途では、grid直接使用することもできます。

\begin{tikzpicture}
  \draw [step=2/19]  (-2,-2) grid (2,2);
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}

3つのグリッド

単位を指定しない場合、ほとんどの場合、PGF は現在の単位を使用することに注意してください。デフォルトでは、各軸で 1cm ですが、値はカスタマイズ可能で、必要に応じて水平と垂直で個別に設定できます。

完全なコード:

\documentclass{standalone}

\usepackage{tikz}
\newcommand{\gogrid}[1][1]{%
  \draw[step=#1 / 19] (-#1, -#1) grid (#1,#1);
  \draw[line width=1] (-#1, #1) -- (#1 + 0.015, #1); % chktex 8
  \draw[line width=1] (#1, -#1) -- (#1, #1); % chktex 8
}

\begin{document}
\begin{tikzpicture}
  \gogrid[10mm]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\begin{tikzpicture}
  \gogrid[5]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\begin{tikzpicture}
  \draw [step=2/19]  (-2,-2) grid (2,2);
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\end{document}

編集

計算をわかりやすくするためにパラメータではなくマクロを使いたい場合は、pgfkeysでこれを行う場合はを使用しますtikzpicture。設定方法はいろいろありますが、サイズのみを指定したい場合(他のオプションでグリッドを微調整したくない場合)、次のようなものを試してみてください。

\documentclass{standalone}
\usepackage{tikz}
\tikzset{%
  go grid/.code={%
    \tikzset{%
      go grid/.cd,
      size=#1,
    }%
    \draw [step=\gogridsize/19] (-\gogridsize, -\gogridsize) grid (\gogridsize,\gogridsize);
    \draw[line width=1] (-\gogridsize, \gogridsize) -- (\gogridsize + 0.015, \gogridsize); % chktex 8
    \draw[line width=1] (\gogridsize, -\gogridsize) -- (\gogridsize, \gogridsize); % chktex 8
  },
  go grid/.default=10mm,
  go grid/.cd,
  size/.store in=\gogridsize,
  size/.initial=1cm,
}

\begin{document}
\begin{tikzpicture}[go grid]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\begin{tikzpicture}[go grid=5]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\begin{tikzpicture}[go grid=20mm]
  \filldraw[black](0,0)circle[radius=3pt];
  \filldraw[black](1,1)circle[radius=3pt];
\end{tikzpicture}
\end{document}

画像ごとに複数のグリッドが必要な場合は、 を使用するpicか、最初に行ったように コマンドを定義します。

\newcommand{\gogrid}[1][1]{%
  \tikzset{go grid/size=#1,go grid}%
}

グリッドの他の側面を指定したい場合は、また別のアプローチがあります。次のようなものを試してみるとよいでしょう。

\documentclass{standalone}
\usepackage{tikz}
\tikzset{% ateb: https://tex.stackexchange.com/a/708415/ addaswyd o gwestiwn: https://tex.stackexchange.com/q/708410/
  go grid/.search also={/tikz,/pgf},
  go grid/.code={%
    \tikzset{%
      go grid/.cd,
      #1,
    }%
    \begin{scope}[draw=\gogridcolour]
      \draw [step=\gogridsize/19] (-\gogridsize, -\gogridsize) grid (\gogridsize,\gogridsize);
      \draw[line width=1] (-\gogridsize, \gogridsize) -- (\gogridsize + 0.015, \gogridsize); % chktex 8
      \draw[line width=1] (\gogridsize, -\gogridsize) -- (\gogridsize, \gogridsize); % chktex 8
    \end{scope}
    \edef\tempa{}\edef\tempb{\gogridstonesat}%
    \ifx\tempa\tempb
    \else
      \foreach \i in \gogridstonesat \filldraw[\gogridstones]\i circle [radius=\gogridstonesize];
    \fi
  },
  go grid/.default={size=10mm},
  go grid/.cd,
  grid/.store in=\gogridcolour,
  grid=black,
  size/.store in=\gogridsize,
  size=1cm,
  stone size/.store in=\gogridstonesize,
  stone size=3pt,
  stones/.store in=\gogridstones,
  stones=black,
  stones at/.store in=\gogridstonesat,
  stones at={},
}
\NewDocumentCommand \gogrid { O{} }
{%
  \tikz[go grid={#1}]{}%
}

\begin{document}
\begin{tikzpicture}[go grid={grid=blue,stones at={(0,0),(1,1)},stones=red}]
\end{tikzpicture}
\begin{tikzpicture}[go grid={size=5,stones at={(0,0),(1,1)}}]
\end{tikzpicture}
\begin{tikzpicture}[go grid={size=20mm,grid=green,stones at={(0,0),(1,1)},stone size=4pt}]
  \node [above] at (current bounding box.north) {Green Go Grid};
\end{tikzpicture}
\gogrid
\gogrid[size=2.5cm,grid=orange,stones at={(0,1),(1,0),(-1,0),(0,-1)},stone size=2.5pt,stones=blue]
\end{document}

さまざまなカスタマイズされた囲碁グリッド

関連情報