Примеры PIC в библиотеке TIKZ

Живой пример использования мощи TIKZ на примерах с маленькими картинками PIC

Примеры использования поисковых запросов POSIX

Постановка задачи

Немного запутанно, но суть в том, что у устройства есть адреса на каждом выходе, и эти адреса изменяются, а картинок несколько.

Было принято решение не рисовать в редакторе картинки, а запрограммировать в LATEX и на вход просто подавать массив с адресами и номерами выходов.

  1. рисуем матрицу с адресами
  2. адрес состоит из двух частей, разделенных :
  3. первая часть 4 разряда
  4. вторая часть 5 разрядов
  5. матрица может располагаться горизонтально и вертикально
  6. в вертикальном положении над каждым адресом необходимо указать номер порта в черном кружке и схематичное изображение в виде скобки с кружком
  7. в горизонтальном положении слева от адреса расположить номер порта в черном кружке

Решение

  1. Создать стили для вертикальных и горизонтальных адресов
  2. Создать шаблон для номера выходного порта (цифра в черном кружке)
  3. Создать шаблон для имитации скрепки с красной точкой
  4. Создать шаблон для формирования горизонтального адреса
  5. Создать шаблон для формирования вертикального адреса
  6. Создать матрицу из 5-ти горизонтальных адресов в одной строке с номерами выходных портов в черных кружках
  7. Создать матрицу из 5-ти вертикальных адресов в одной колонке с номерами выходных портов в черных кружках и скрепкой с красной точкой

h

Код с описанием

\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}

v