Примеры PIC в библиотеке TIKZ
Живой пример использования мощи TIKZ на примерах с маленькими картинками PIC
Categories:
Примеры использования поисковых запросов POSIX
Живой пример для создания настраиваемых картинок при описании документации
Постановка задачи
Необходимо разработать динамичную картинку,которой на вход подается массив адресов и они размещаются в структурированной матрице с цифровым обозначением выходов на устройстве.
Немного запутанно, но суть в том, что у устройства есть адреса на каждом выходе, и эти адреса изменяются, а картинок несколько.
Было принято решение не рисовать в редакторе картинки, а запрограммировать в LATEX и на вход просто подавать массив с адресами и номерами выходов.
- рисуем матрицу с адресами
- адрес состоит из двух частей, разделенных :
- первая часть 4 разряда
- вторая часть 5 разрядов
- матрица может располагаться горизонтально и вертикально
- в вертикальном положении над каждым адресом необходимо указать номер порта в черном кружке и схематичное изображение в виде скобки с кружком
- в горизонтальном положении слева от адреса расположить номер порта в черном кружке
Решение
- Создать стили для вертикальных и горизонтальных адресов
- Создать шаблон для номера выходного порта (цифра в черном кружке)
- Создать шаблон для имитации скрепки с красной точкой
- Создать шаблон для формирования горизонтального адреса
- Создать шаблон для формирования вертикального адреса
- Создать матрицу из 5-ти горизонтальных адресов в одной строке с номерами выходных портов в черных кружках
- Создать матрицу из 5-ти вертикальных адресов в одной колонке с номерами выходных портов в черных кружках и скрепкой с красной точкой
Код с описанием
\tikzset{vad/.style={node distance=0pt,inner sep=2pt,rotate=90,draw}}%настройка стиля для вертикальных адресов
\tikzset{had/.style={node distance=0pt,inner sep=2pt,rotate=0,draw}}%настройка стиля для горизонтальных адресов
\tikzset{
orr/.pic={%рисуем маленький красный кружок на белом фоне
\fill[white] (0,-0.3mm) ellipse (.6mm and 1mm);
\fill[red] (0,0) ellipse (.4mm and .6mm);},
piro/.pic={%рисуем скобку и внизу скобки помещаем красный кружок orr
\draw[thick,orange,rounded corners] (-.7ex,1cm) -- (-.7ex,.3cm) -- (0,0) pic{orr} -- (.7ex,.3cm) -- (.7ex,1cm);},
pics/ntt/.style={%рисуем черный кружок с переменной номер внутри кружка
code={\node [circle,fill=black,minimum size=1em,inner sep=0pt,text=white] {#1};}},
sp/.pic={\path (0,0)--(.2,0);}%это хитрый pic пробел. Чтобы не разъезжались строки.
}
\def\haddr#1#2{%строим горизонтальный адрес в формате 4:5
\coordinate(a0)at(0,.12);
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#1}{
\node(a\x)[had,right=of a\y] {\z};
};
\node(s0)[had,draw=none,right=of a4] {:};
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#2}{
\node(s\x)[had,right=of s\y] {\z};
};
}
\def\vaddr#1#2{%строим вертикальный адрес в формате 4:5
\coordinate(a0)at(0,0);
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#1}{
\node(a\x)[vad,right=of a\y] {\z};
};
\node(s0)[vad,draw=none,right=of a4] {:};
\foreach \z [count=\x,evaluate=\x as \y using \x-1] in {#2}{
\node(s\x)[vad,right=of s\y] {\z};
};
}
%рисуем горизонтальную матрицу из пяти адресов
%в первой колонке черный кружок с номером \pic{ntt=1}
%во второй колонке пробел \pic{sp}, чтобы отделить
%в третьей колонке горизонтальный адрес \haddr...
\begin{tikzpicture}
\matrix[matrix of nodes,row sep={0ex}]{
\pic{ntt=1};&\pic{sp};&\haddr{0,0,0,1}{0,0,0,1,2}\\
\pic{ntt=2};& &\haddr{0,0,0,1}{0,0,0,1,3}\\
\pic{ntt=3};& &\haddr{0,0,0,1}{0,0,0,1,4}\\
\pic{ntt=4};& &\haddr{0,0,0,1}{0,0,0,1,5}\\
\pic{ntt=5};& &\haddr{0,0,0,1}{0,0,0,1,6}\\};
\end{tikzpicture}
%рисуем вертикальную матрицу из пяти адресов
%в первой строке черные кружки с номерами \pic{ntt=1}
%во второй строке скобки, \pic{piro}
%в третьей строке вертикальный адрес \vaddr...
\begin{tikzpicture}
\matrix[matrix of nodes,column sep={0ex}]{
\pic{ntt=1};&\pic{ntt=2};&\pic{ntt=3};&\pic{ntt=4};&\pic{ntt=5};\\
\pic{piro};&\pic{piro};&\pic{piro};&\pic{piro};&\pic{piro};\\
\vaddr{0,0,0,1}{0,0,0,1,2}&
\vaddr{0,0,0,1}{0,0,0,1,2}&
\vaddr{0,0,0,1}{0,0,0,1,2}&
\vaddr{0,0,0,1}{0,0,0,1,2}&
\vaddr{0,0,0,1}{0,0,0,1,2}\\};
\end{tikzpicture}