如何在 pgf-umlsd 中使用希腊字母(或通常以 \ 开头的术语)

如何在 pgf-umlsd 中使用希腊字母(或通常以 \ 开头的术语)

我正在绘制一个序列图pgf-umlsd并且我想在消息描述中加入一个希腊字母。类似\mess[1]{a}{Message $\alpha$}{b}。虽然pgf-umlsd似乎允许$使用数学模式,但它显然不允许任何\(所以我不能写例如\alpha)。

\protect也不起作用。此外,我用 定义了一个变量\def\alph{$\alpha$},并将其与 一起使用\mess[1]{a}{Message \alph}{b},但同样无济于事。如果将定义设置为\def\alph{$alpha$},它可以正常工作,但当然不会产生 alpha。因此,\显然在内部通常不被禁止pgf-umlsd消息描述。

是否有可能以某种方式使用希腊字母?

以下是该问题的一个简单示例:

\documentclass{article}                                                                                     
\usepackage{pgf-umlsd}                                                                                      
\begin{document}                                                                                            
\begin{figure} [ht!]                                                                                        
\def\alph{$\alpha$}                                                                                         
\def\bet {$beta$}                                                                                           
\begin{sequencediagram}                                                                                     
    \newthread{a}{Alice}{Alice}                                                                             
    \newthread{b}{Bob}{Bob}                                                                                 
    \mess[1]{a}{Message \alph}{b} %This doesn't compile                                                     
    \mess[1]{a}{Message \bet} {b} %This compiles but generates no greek letter                              
\end{sequencediagram}                                                                                       
\end{figure}                                                                                                
\end{document}                                                                                              

答案1

问题是由\mess的定义方式引起的(从 的 v0.7 开始pgf-umlsd.sty):

\newcommand{\mess}[4][0]{
  \stepcounter{seqlevel}
  \path
  (#2)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess from) {};
  \addtocounter{seqlevel}{#1}
  \path
  (#4)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess to) {};
  \draw[->,>=angle 60] (mess from) -- (mess to) node[midway, above]
  {#3};

  \node (#3 from) at (mess from) {};
  \node (#3 to) at (mess to) {};
}

第三个参数(用 表示#3)是消息,但它还用于定义两个附加节点,位于箭头的起点和终点,如最后两行所示,

\node (#3 from) at (mess from) {};
\node (#3 to) at (mess to) {};

我不知道具体的限制是什么,但$\alpha$至少在节点名称中不起作用。

现在,如果这些节点名称没有在任何地方使用,您可以通过重新定义命令来消除这些节点

\renewcommand{\mess}[4][0]{
  \stepcounter{seqlevel}
  \path
  (#2)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess from) {};
  \addtocounter{seqlevel}{#1}
  \path
  (#4)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess to) {};
  \draw[->,>=angle 60] (mess from) -- (mess to) node[midway, above]
  {#3};    
}

但如果需要它们,其他东西就不起作用,所以这可能会或可能不会有帮助。

在此处输入图片描述

\documentclass{article}                                                                                     
\usepackage{pgf-umlsd}                                                                                      

\begin{document}                                                                                            
\begin{sequencediagram}                                                                                     
    \newthread{a}{Alice}{Alice}                                                                             
    \newthread{b}{Bob}{Bob}                                                                                 
    \mess[1]{a}{Message alfa}{b} 
    \mess[1]{a}{Message beta} {b}

% draw borders around the above mentioned nodes:
\draw [ultra thick,red] (Message beta from.south east) rectangle (Message beta from.north west);
\draw [ultra thick,green] (Message beta to.south east) rectangle (Message beta to.north west);
\end{sequencediagram}                                                                                       

% redefine the \mess
\renewcommand{\mess}[4][0]{
  \stepcounter{seqlevel}
  \path
  (#2)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess from) {};
  \addtocounter{seqlevel}{#1}
  \path
  (#4)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess to) {};
  \draw[->,>=angle 60] (mess from) -- (mess to) node[midway, above]
  {#3};
}

\begin{sequencediagram}                                                                                     
    \newthread{a}{Alice}{Alice}                                                                             
    \newthread{b}{Bob}{Bob}                                                                                 
    \mess[1]{a}{Message $\alpha$}{b} 
    \mess[1]{a}{Message $\beta$} {b} 

\end{sequencediagram}                                                                                       
\end{document} 

答案2

我建议用两种方法来解决您的问题。

  1. 重新定义\mess以在适当的位置“字符串化”有问题的论点

  2. 定义一个\Mess带有附加可选参数(引用文本的字符串)的命令;如果的第二个强制参数\Mess(对应于中的相同位置\mess)仅为字符,则无需在可选参数中添加标签。

\documentclass{article}
\usepackage{pgf-umlsd}

%%%% First way: redefine \mess
\renewcommand{\mess}[4][0]{
  \stepcounter{seqlevel}
  \path
  (#2)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess from) {};
  \addtocounter{seqlevel}{#1}
  \path
  (#4)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess to) {};
  \draw[->,>=angle 60] (mess from) -- (mess to) node[midway, above]
  {#3};

  \node (\detokenize{#3} from) at (mess from) {};
  \node (\detokenize{#3} to) at (mess to) {};
}

%%%% Second way: define a command with a different syntax

\usepackage{xparse}
\NewDocumentCommand{\Mess}{O{0}mmom}{%
  \IfNoValueTF{#4}
    {\xmess{#1}{#2}{#3}{#3}{#5}}
    {\xmess{#1}{#2}{#3}{#4}{#5}}%
}

\NewDocumentCommand{\xmess}{mmmmm}{
  \stepcounter{seqlevel}
  \path
  (#2)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess from) {};
  \addtocounter{seqlevel}{#1}
  \path
  (#5)+(0,-\theseqlevel*\unitfactor-0.7*\unitfactor) node (mess to) {};
  \draw[->,>=angle 60] (mess from) -- (mess to) node[midway, above]
  {#3};

  \node (#4 from) at (mess from) {};
  \node (#4 to) at (mess to) {};
}


\begin{document}

\begin{sequencediagram}
\newthread{a}{Alice}{Alice}
\newthread{b}{Bob}{Bob}
\mess[1]{a}{Message $\alpha$}{b}
\mess[1]{a}{Message $\beta$} {b}
\end{sequencediagram}

\begin{sequencediagram}
\newthread{a}{Alice}{Alice}
\newthread{b}{Bob}{Bob}
\Mess[1]{a}{Message $\alpha$}[malpha]{b}
\Mess[1]{a}{Message $\beta$}[mbeta] {b}
\end{sequencediagram}
\end{document}

在此处输入图片描述

答案3

我不确定这是否是您想要的,但这里有一些与您的示例类似的东西:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows,shadows}
\usepackage{pgf-umlsd}
\begin{document}
    \begin{figure} [ht!]
        \newcommand{\alphn}{$\alpha$}
        \newcommand{\bet}{$\beta$}
        \begin{sequencediagram}
            \newthread{a}{Alice}
            \newthread{b}{Bob}
            \mess{a}{Message \alphn}{b} %This doesn't compile
            \mess{a}{Message \bet } {b} %This compiles but generates no greek letter
        \end{sequencediagram}
    \end{figure}
\end{document} 

代码生成的图像

我认为一般来说你应该避免使用原始的 TeX 命令,例如\def,并使用 LaTeX 等效命令\newcommand\renewcommand。我对希腊字母没有任何问题,但你使用 pdf-umlsd 的方式与此处的示例代码有些不同: http://www.csrdu.org/nauman/2011/11/24/creating-uml-sequence-diagrams-with-tikz-in-latex/ ,所以错误很可能就出在这里。

相关内容