Проблема создания блок-схемы с использованием TikZ в Latex

Проблема создания блок-схемы с использованием TikZ в Latex

У меня возникла глупая проблема. Я не могу соединить последние два ящика. И еще я хочу иметь |.| в одном из ящиков, но не знаю, как это сделать. Может ли кто-нибудь мне помочь с этим?

\documentclass{standalone}
\usepackage{amsmath,amscd,amssymb,latexsym,upref} %stmaryrd
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usetikzlibrary{arrows.meta,
                backgrounds,
                chains,
                fit,
                quotes}
\begin{document}

\resizebox{16cm}{2cm}{%
    \begin{tikzpicture}[auto,
    node distance = 12mm,
        start chain = A going right,
     block/.style = {draw, fill=white,
                     text width=#1, minimum height=10mm, align=center,
                     outer sep=0pt, on chain},
     block/.default = 18mm,
 container/.style = {draw, fill=gray!50,
                     inner xsep=2mm, inner ysep=7mm},
                        ]
\node   [block=14mm] {a};    % block name is A-1
\node   [block=12mm] {b};
\node   [block=22mm] {c};
\node   [block=15mm] {d};
\node   [block=22mm] {e};    % block name is A-4
\node   [block=22mm] {f};    % block name is A-6
\node   [block=12mm] {g};
\node   [block=24mm] {h};    % block name is A-8
\node   [block=24mm] {i};    % block name is A-8
%
\scoped[on background layer]
    \node [container, label={[anchor=north]joined},
           fit= (A-5) (A-6)] (container) {};
\draw [-Stealth]
    (A-1) edge  (A-2)    % text on arrow is between " and "
    (A-2) edge  (A-3)
    (A-3) edge  (A-4)
    (A-4) edge  (A-5)
    (A-5) edge  (A-6)
    (A-6) edge  (A-7);
    (A-7) edge (A-8);
    (A-8) edge (A-8);
    \end{tikzpicture}
    }
\end{document}

решение1

Последний блок, помеченный i, имеет имя A-9, и если вы поставите точки с запятой, вам нужно будет добавить новую команду рисования. Надеюсь, я правильно понял ваш запрос modulo bar.

\documentclass{standalone}
\usepackage{amsmath,amscd,amssymb,latexsym,upref} %stmaryrd
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\usetikzlibrary{arrows.meta,
                backgrounds,
                chains,
                fit,
                quotes}
\begin{document}

\resizebox{16cm}{2cm}{%
    \begin{tikzpicture}[auto,
    node distance = 12mm,
        start chain = A going right,
     block/.style = {draw, fill=white,
                     text width=#1, minimum height=10mm, align=center,
                     outer sep=0pt, on chain},
     block/.default = 18mm,
 container/.style = {draw, fill=gray!50,
                     inner xsep=2mm, inner ysep=7mm},
                        ]
\node   [block=14mm] {a};    % block name is A-1
\node   [block=12mm] {b};
\node   [block=22mm] {c};
\node   [block=15mm] {d};
\node   [block=22mm] {e~$|.|$};    % block name is A-4
\node   [block=22mm] {f};    % block name is A-6
\node   [block=12mm] {g};
\node   [block=24mm] {h};    % block name is A-8
\node   [block=24mm] {i};    % block name is A-9
%
\scoped[on background layer]
    \node [container, label={[anchor=north]joined},
           fit= (A-5) (A-6)] (container) {};
\draw [-Stealth]
    (A-1) edge  (A-2)    % text on arrow is between " and "
    (A-2) edge  (A-3)
    (A-3) edge  (A-4)
    (A-4) edge  (A-5)
    (A-5) edge  (A-6)
    (A-6) edge  (A-7)
    (A-7) edge (A-8)
    (A-8) edge (A-9);
    \end{tikzpicture}
    }
\end{document}

решение2

  • МВЕ, о котором идет речь, мне очень знакомо :-)
  • вам следует проанализировать код, который вы используете в вашем mwe... тогда вы увидите, что имя последнего узла A-9(а не такое A-8, как вы отметили в вашем mwe)
  • для наиболее распространенного размера следует выбрать размер по умолчанию, например, block/.default=22mmи только для остальных напишите желаемую ширину текста (вам действительно нужен такой разный размер узла? Я бы использовал только 18mmnad 9mm, см. mwe ниже)
  • математическое выражение можно записать в узле как в тексте, например $|\cdot|$
  • *не используйте \resizebox{16cm}{.... Это изменяет размер всего изображения и делает его некрасивым. Вместо этого пересчитайте ширину узлов и расстояния между узлами так, чтобы их сумма составила 16 см:

    14мм + 12мм + 22мм + 15мм + 22мм + 22мм +12мм +24мм +24мм + 9x2x(внутренний промежуток) +8*(расстояние между узлами)=318 mm

    что почти в два раза длиннее. Я предлагаю уменьшить вдвое длину всех элементов изображения (см. пример ниже) и использовать меньший размер шрифта, например footnotesize:

из mwe не следует, что вы добавите текст на стрелки между узлами. если это так, то вы можете нарисовать их макросом joinиз chainsбиблиотеки

принимая во внимание вышеизложенные комментарии и предложения, ваш вариант станет:

\documentclass[margin=3mm]{standalone}
\usepackage{amsmath,amscd,amssymb,latexsym,upref} %stmaryrd
\usepackage{pgfplots}
\pgfplotsset{compat=1.15}
\usetikzlibrary{arrows.meta,
                backgrounds,
                chains,
                fit,
                quotes}
\begin{document}

    \begin{tikzpicture}[
    node distance = 7mm,
        start chain = A going right,
     block/.style = {draw, fill=white,
                     text width=#1, minimum height=10mm, align=center,
                     font=\footnotesize, inner sep=1mm, outer sep=0pt,
                     on chain, join=by -Stealth},
     block/.default = 12mm,
 container/.style = {draw, fill=gray!50,
                     inner xsep=2mm, inner ysep=7mm},
                        ]
\node   [block=6mm] {a};    % block name is A-1
\node   [block=6mm] {b};
\node   [block]     {$|\cdot|$};
\node   [block=6mm] {d};
\node   [block]     {e};    % block name is A-4
\node   [block]     {f};    % block name is A-6
\node   [block=6mm] {g};
\node   [block]     {h};
\node   [block]     {i};    % block name is A-9
%
\scoped[on background layer]
    \node [container, label={[anchor=north]joined},
           fit= (A-5) (A-6)] (container) {};
    \end{tikzpicture}
\end{document}

примечание: если вы хотите пометить стрелки между узлами, то вам следует удалить joinопцию из определения стиля блока и добавить к изображению:

\draw [-Stealth]
    (A-1) edge ["$\alpha$"]    (A-2) 
    (A-2) edge ["$\beta$"]     (A-3)
    (A-3) edge ["$\gamma$"]    (A-4)
    (A-4) edge ["$\epsilon$"]  (A-5)
    (A-5) edge ["$\zeta$"]     (A-6)
    (A-6) edge ["$\theta$"]    (A-7)
    (A-7) edge ["$\iota$"]     (A-8)
    (A-8) edge ["$\kappa$"]    (A-9);

и к параметрам изображения добавьте:

every edge quote/.append style = {font=\footnotesize}

введите описание изображения здесь

Рисование изображений требует много терпения, точности и времени...

Связанный контент