매크로(`\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에서 이것이 가능합니까? 나는 일반 프로그래밍 언어에서 이런 종류의 것을 더 읽기 쉽게 만들기 위해 많이 사용합니다. (또한, 혹시 이런 종류의 책이나 웹사이트 참고 자료가 있다면 정말 감사하겠습니다.)

답변1

TikZ 내에서 치수 계산을 위한 적절한 구문을 사용하면서 명령 #1에서 arg에 적합한 단위를 정의할 수 있다면 예제에서는 모든 것이 작동할 것입니다 . \setlengthTikZ 도면에서는 단위를 생략할 수 있지만 치수 계산에서는 생략할 수 없습니다. 따라서 를 사용해야 합니다 \setlength{\size}{\dimexpr#1cm/19\relax}.

TikZ에서는 좌표 단위가 생략되면 cm가정됩니다. 선 너비에는 pt가 사용됩니다.

주석에서 언급했듯이 \newlength{\size}매번 동일한 새 길이를 다시 정의할 필요가 없으므로 명령 정의에서 제외해야 합니다.

다음은 코드를 사용하여 그리드를 생성하는 두 가지 예입니다. 치수 계산이 실제로 작동했음을 보여주기 위해 \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}

세 개의 그리드

단위를 지정하지 않으면 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}

그림당 여러 개의 그리드를 원하는 경우 a를 사용하거나 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}

다양한 맞춤형 고그리드

관련 정보