我正在绘制一个序列图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
我建议用两种方法来解决您的问题。
重新定义
\mess
以在适当的位置“字符串化”有问题的论点定义一个
\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/
,所以错误很可能就出在这里。