решение1
Есть много пакетов, которые позволяют это сделать: например metapost
, pstricks
, , asymptote
, TikZ
и, конечно, другие, которые я забыл.
Вот версия с TikZ
. Если у вас есть вопросы по коду, я слушаю.
\documentclass[tikz,border=5mm]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[gray!20] (0,0)rectangle(3,3);
\draw (0,0)grid(3,3);
\node foreach \j in {1,2} [left] at (0,\j) {$10^\circ$};
\node foreach \j in {1,2} [right] at (3,\j) {$40^\circ$};
\node foreach \i in {1,2} [below] at (\i,0) {$30^\circ$};
\node foreach \i in {1,2} [above] at (\i,3) {$20^\circ$};
\node foreach \i in {1,2} [above right] at (\i,2) {$\i$};
\node foreach \lab [count=\n] in {4,3} [above right] at (\n,1) {$\lab$};
\foreach \list[count=\j from 0] in {{1,2},{0,1,2,3},{0,1,2,3},{1,2}}
\foreach \x in \list {
\fill (\x,\j)[cyan] circle (2pt);
}
\end{tikzpicture}
\end{document}
решение2
Базовый рисунок LaTeX с использованием TikZ: прямоугольник с линиями, точками и метками.
Вам нужен только один пакет:
\usepackage{tikz}
Давайте определим синий и серый цвета для нашей фигуры:
\definecolor{mBlue}{HTML}{1F77B4}
\definecolor{mGray}{HTML}{d7dbdd}
Теперь создайте стиль для точек. Мы не хотим писать много команд и опций снова и снова. Мы назовем этот стиль vertex
и используем команду \tikzstyle{vertex}
. Из опций мы видим, что это circle
, он нарисован цветом, mBlue
который мы определили выше, и он также заполнен тем же цветом. Параметры разделения косвенно управляют размером круга и разделением между любым текстом, который вы решите написать внутри узла. Вы также можете использовать minimimum size=0.2
.
\tikzstyle{vertex}=[circle,draw=mBlue,fill=mBlue,inner sep=0.6mm, outer sep=0mm]
Мы можем поместить три приведенные выше строки в преамбулу, т. е. «материал» перед \begin{document}
.
Теперь мы готовы использовать среду фигуры и рисовать. Наши рисунки будут размещены внутри tikzpicture
среды. Вы заметите, что есть также scale
опция. Ее можно использовать для увеличения/уменьшения размера фигуры. Интересно, что масштабирование не влияет на текст, размещенный внутри фигуры.
\begin{figure}[h]
\centering
\begin{tikzpicture}[scale=1]
% our drawing goes here
\end{tikzpicture}
\caption{The figure.}
\end{figure}
Теперь самое важное, что вам нужно будет сделать, это назначить некоторые координаты важным точкам на вашей фигуре. Это может показаться пугающим для некоторых поначалу, но это проще, чем кажется. Допустим, мы обозначим нижний левый угол как точку (0,0), а самую верхнюю точку как (3,3). Вы можете использовать команду \coordinate (name) at (<x>,<y>);
для каждой из шестнадцати точек на фигуре. Однако я хотел ввести for
циклы, потому что многие новые пользователи пропускают эту суперудобную функцию. Я добавил координатную фигуру.
\foreach \x in {0,...,3} {
\foreach \y in {0,...,3} {
\coordinate (\x_\y) at (\x,\y);
}
}
Теперь draw
внешний прямоугольник и линии. Вы можете заполнить прямоугольник, используя draw[fill=mGray]
.
\draw (0_0) -- (3_0) -- (3_3) -- (0_3) -- (0_0);
\draw (1_0) -- (1_3);
\draw (2_0) -- (2_3);
\draw (0_1) -- (3_1);
\draw (0_2) -- (3_2);
Давайте нарисуем синие точки и добавим к ним метки. Эти метки задают текст. Положение метки можно указать с помощью left
, right
, below
, и above
. Мы также можем объединить их в above right
.
\node[vertex, label=below:$30^\circ$] at (1_0) {};
\node[vertex, label=below:$30^\circ$] at (2_0) {};
\node[vertex, label=left:$10^\circ$] at (0_1) {};
\node[vertex, label=left:$10^\circ$] at (0_2) {};
\node[vertex, label=above right:$2$] at (2_2) {};
Мы сможем заполнить остальное!
Редактировать: Как указано в комментариях, вы можете напрямую использовать значение координат вместо использования имен, например, напрямую использовать (2,3) вместо (2_3). Вам также не нужно использовать двойные циклы for для определения координат.
решение3
Возможная Asymptote
версия:
// tab3x3.asy
//
// run asy tab3x3.asy to get tab3x3.pdf
//
settings.tex="pdflatex";
size(4cm);
pen fillPen=rgb("E3E3E5");
pen linePen=rgb("201D1D")+0.7bp;;
pen dotPen =rgb("00A4EC")+4bp;
filldraw(box((-3,-3),(3,3)),fillPen,linePen);
guide mid=box((-1,1),(1,-1));
guide[] net=(-1,3)--(-1,-3)^^(1,3)--(1,-3)^^(-3,-1)--(3,-1)^^(-3,1)--(3,1);
draw(net,linePen);
dot(net,dotPen);
int[] labVal={10,20,30,40};
pair[][] labPos={{(-3,-1),(-3,1)},{(-1,3),(1,3)},{(-1,-3),(1,-3)},{(3,-1),(3,1)}};
pair[] labOff={W,N,S,E};
for(int i=0;i<length(mid);++i){
dot(point(mid,i),dotPen);
label("$"+string(i+1)+"$",point(mid,i),plain.NE,linePen);
}
for(int i=0;i<labVal.length;++i){
for(int j=0;j<labPos[0].length;++j){
label("$"+string(labVal[i])+"^\circ$",labPos[i][j],labOff[i]);
}
}
решение4
Еще одно простое, «ручное» решение асимптоты
// http://asymptote.ualberta.ca/
unitsize(1.5cm);
import math; // for grid
fill(box((0,0),(3,3)),lightgray);
add(grid(3,3));
pair[] pts={(1,2),(2,2),(2,1),(1,1),(0,1),(0,2),(1,3),(2,3),(3,1),(3,2),(2,0),(1,0)};
string[] s={"$10^{\circ}$","$20^{\circ}$","$30^{\circ}$","$40^{\circ}$"} ;
string[] lb={"$1$","$2$","$3$","$4$",s[0],s[0],s[1],s[1],s[2],s[2],s[3],s[3]};
pair[] a={NE,NE,NE,NE,W,W,N,N,E,E,S,S};
for(int i=0; i<pts.length; ++i){
fill(circle(pts[i],.06),magenta);
label(lb[i],align=a[i],pts[i]);
}
shipout(bbox(5mm));