%20%D0%B8%20%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D1%8F%D1%82%D1%8C%20%D1%81%20%D0%BD%D0%B8%D0%BC%D0%B8%20%D0%BC%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5%20%D0%BE%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%B8%3F.png)
Я новичок в создании команд в 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
В вашем примере все будет работать, если вы сможете определить подходящую единицу для arg #1
в \setlength
команде, используя правильный синтаксис для расчета размеров внутри TikZ. Вы можете опустить единицы для чертежа TikZ, но не для расчета размеров. Поэтому вы должны использовать \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}
Выход:
решение2
Если вы делаете это внутри tikzpicture
s, вы можете просто позволить 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>]
внутри tikzpicture
s.
\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 в большинстве случаев будет использовать текущую единицу. По умолчанию это 1 см по каждой оси, но значение можно настроить и установить независимо для горизонтали и вертикали, если это необходимо.
Полный код:
\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}