
我是在 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
#1
如果您可以為命令中的arg 定義合適的單位\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
如果您在 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>]
內部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}
如果您想要每個圖片有多個網格,您可以使用 apic
或,就像您最初所做的那樣,只需定義一個命令。
\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}