tikz-uml: Как разместить объект UML под своей полосой?

tikz-uml: Как разместить объект UML под своей полосой?

У меня есть следующий код:

\documentclass[a4paper]{article}

%% Language and font encodings
\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper,top=3cm,bottom=2cm,left=3cm,right=3cm,marginparwidth=1.75cm]{geometry}

%% Useful packages
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{tikz} % For graphics
\usepackage{pgfplots}
\usepackage{xcolor}
\usetikzlibrary{matrix,arrows,calc,positioning,shapes,decorations.pathreplacing}
\usepackage{graphicx}
\usepackage{tikz-uml}

\title{Your Paper}
\author{You}
\begin{document}
\maketitle
\section{Introduction}

Diagram below:

\small\begin{tikzpicture} 

  \begin{umlseqdiag} 
    \umlactor{User} 
    \umlobject{Proxy} 
    \umlobject[x=7]{Entry station}
    \umlobject[x=10]{Dst station}  

    \begin{umlcall}[op=retrieve(token),return=pkt-info]{User}{Proxy}
      \begin{umlcall}[op=RReq,return=success]{Proxy}{Entry station}
      \end{umlcall}
      \begin{umlcall}[op=RReq,return=success]{Entry station}{Dst station}
      \end{umlcall}
      \begin{umlcallself}[op=lookup,return=pkt-info]{Dst station} 
      \end{umlcallself}
      \begin{umlcall}[op=RRes,return=success]{Dst station}{Entry station}
      \end{umlcall}
      \begin{umlcall}[op=RRes,return=success]{Entry station}{Proxy}
      \end{umlcall}
    \end{umlcall}

    \begin{umlfragment}[type=loop, label=$\forall p_k$, inner ysep=1]
      \begin{umlcall}[dt=7, op=retrieve(token $p_k$),return=fragment $p_k$]{User}{Proxy}
        \umlcreatecall[x=7]{Proxy}{Station}
        \begin{umlcall}[op=RRes,return=success]{Proxy}{Station}
        \end{umlcall}
      \end{umlcall}
    \end{umlfragment}

    \begin{umlcallself}[dt=5, op=aggregate($p_k$), return=packet $p$]{User} 
    \end{umlcallself}
  \end{umlseqdiag} 

\end{tikzpicture} 
\end{document} 

Который выделяет следующее:введите описание изображения здесь

Проблема в объекте Station. На самом деле я не хочу, чтобы был вызов create. Я просто хочу, чтобы эта полоса была размещена там для объекта Stationи использовала его, вот и все. Я не хочу, чтобы createвызов происходил.

Если это невозможно, как я могу хотя бы изменить метку так, чтобы вместо createнее отображалось что-то другое?

решение1

Текст этого узла записан непосредственно в коде пакета (строка 4622 в последней версии), он не представлен каким-либо макросом, который можно переопределить.

Однако вы можете с помощью xpatch, исправить определение , \umlcreatecallзаменив его {create}на , например {\CreateTxt}, макрос, который вы можете определить и переопределить по своему усмотрению. Ниже я изначально определил его как \newcommand{\CreateTxt}{create}, и переопределил его с помощью \renewcommandна диаграмме.

Не относящееся к делу примечание: вы загружаете graphicxдважды, что на самом деле не является необходимым. И оба graphicxи xcolorзагружаются tikz, поэтому добавление их явно не является строго необходимым. tikzв свою очередь загружается обоими pgfplotsи tikz-uml, поэтому с одним из присутствующих .. вы поняли суть.

вывод кода

\documentclass[a4paper]{article}

%% Language and font encodings
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[a4paper,top=3cm,bottom=2cm,left=3cm,right=3cm,marginparwidth=1.75cm]{geometry}

%% Useful packages
\usepackage{amsmath}
\usepackage{tikz-uml}
\usepackage{xpatch}

\newcommand\CreateTxt{create}
% in the macro \umlcreatecall, replace "{create}" with "{\CreateTxt}":
\xpatchcmd{\umlcreatecall}{{create}}{{\CreateTxt}}{}{}

\begin{document}

\begin{tikzpicture} 
\small

  \begin{umlseqdiag} 
    \umlactor{User} 
    \umlobject{Proxy} 
    \umlobject[x=7]{Entry station}
    \umlobject[x=10]{Dst station}  

    \begin{umlcall}[op=retrieve(token),return=pkt-info]{User}{Proxy}
      \begin{umlcall}[op=RReq,return=success]{Proxy}{Entry station}
      \end{umlcall}
      \begin{umlcall}[op=RReq,return=success]{Entry station}{Dst station}
      \end{umlcall}
      \begin{umlcallself}[op=lookup,return=pkt-info]{Dst station} 
      \end{umlcallself}
      \begin{umlcall}[op=RRes,return=success]{Dst station}{Entry station}
      \end{umlcall}
      \begin{umlcall}[op=RRes,return=success]{Entry station}{Proxy}
      \end{umlcall}
    \end{umlcall}

    \begin{umlfragment}[type=loop, label=$\forall p_k$, inner ysep=1]
      \begin{umlcall}[dt=7, op=retrieve(token $p_k$),return=fragment $p_k$]{User}{Proxy}
        % redefine \CreateTxt to be empty
        \renewcommand\CreateTxt{}
        \umlcreatecall[x=7]{Proxy}{Station}
        \begin{umlcall}[op=RRes,return=success]{Proxy}{Station}
        \end{umlcall}
      \end{umlcall}
    \end{umlfragment}

    \begin{umlcallself}[dt=5, op=aggregate($p_k$), return=packet $p$]{User} 
    \end{umlcallself}
  \end{umlseqdiag} 

\end{tikzpicture} 
\end{document}

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