我有一个协议,msc
其中每条消息旁边都有步骤(1、2、3 等)。这是使用\msccomment
命令完成的。
例子:\msccomment[draw=none, msccomment distance=0cm, side=left]{12}{a}
。
现在,我将用 TikZ 节点替换这些步骤,以使其看起来更好。例如,用 替换12
上面的步骤\numd{12}
。但这会引发错误。
- 我已经从序列图中删除了所有能删除的内容,包括来自
\numd
新命令的多个选项,以尝试发现错误,但这超出了我对乳胶的理解。 - 使用 documentclass
report
也无济于事。 - 删除可选参数
\numd
没有帮助。(无论如何,我需要它来设置步骤。) - 仅当使用 时才会发生错误。在序列图中
\msccomment{\numd{1}}{a}
使用确实有效。\msccomment{1}{a}
- 如果我将新命令
\numd
放在 中,它就会起作用\mess
,但我希望将它放在 中\msccomment
。
错误
! Use of \msc@msccomment@opt doesn't match its definition.
\pgfutil@ifnextchar ...1\def \pgfutil@reserved@a {
#2}\def \pgfutil@reserved@...
l.14 \msccomment{\numd{1}}{a}
% this version DOES NOT work: problem is here
代码
\documentclass{standalone}
\usepackage{libertine}
\usepackage[libertine]{newtxmath}
\usepackage{msc}
\newcommand*{\numd}[1]{\tikz[baseline=(char.base)]{\node [minimum size=0.5cm, fill=blue, text=white, font=\libertineSB\scriptsize] (char) {#1}}}
\begin{document}
\begin{msc}{}
\declinst{a}{}{A}
\declinst{v}{}{V}
% DOESN'T WORK Problem in msccomment because of \numd{1} but works if only `1` without `\numd`
\msccomment{\numd{1}}{a} % this version DOES NOT work: problem is here
%\msccomment{1}{a} % this version works
\mess{\numd{1} $x$}{a}{v}
\nextlevel
\end{msc}
\end{document}
更新·更多背景信息
为了提供更多背景信息,我\numd{n}
在序列图和文本中使用了它。例如:
A 将 $x$ 发送给 V \numd{1},然后 V 执行 (...) 并回复 y \numd{2}。
我知道 MWE 中的方形蓝色框可能看起来有点不时尚,但那是因为我在发布问题时简化了代码(我不确定要从原始源代码中删除多少,并且样式本身似乎与我遇到的问题无关)。
对于那些好奇的人来说,\numd
我正在使用的(它本身改编自 tex.SE 上的答案)是:
\newcommand*{\numd}[1]{\tikz[baseline=(char.base)]{\node [solid, rounded rectangle, minimum size=0.3cm, inner sep=0cm, text height=1ex, text depth=0.1ex, fill=magenta!25!black, text=white, font=\libertineSB\scriptsize] (char) {#1}}}
看起来像:
当使用以下命令调用时:
\msccomment[draw=none, msccomment distance=0cm, side=left]{\noexpand\numd{3}}{a}
\mess{$\var{E}$}{a}{v}
\nextlevel
添加\noexpand
如中所述https://tex.stackexchange.com/a/714739/54103解决了我遇到的问题。
答案1
通过检查源代码。中的第一个参数\msccomment
将使用 进行扩展定义\edef
。因此,要使\numd
代码正常工作,您需要\noexpand
在它前面放置 。看这个例子:
\documentclass{standalone}
\usepackage{libertine}
\usepackage[libertine]{newtxmath}
\usepackage{msc}
\newcommand{\numd}[1]{\tikz[baseline=(char.base)]{\node [minimum size=0.5cm, fill=blue, text=white, font=\libertineSB\scriptsize] (char) {#1}}}
\begin{document}
\begin{msc}{}
\declinst{a}{}{A}
\declinst{v}{}{V}
\msccomment{\noexpand\numd{1}}{a}
\end{msc}
\end{document}
输出:
但我不认为这是你想要的。因为默认情况下1
会放在一个节点中。你实际上将新节点放在了前一个节点内。
您可以做的是使用 之前的可选参数直接格式化默认节点样式1
,如下所示:
\documentclass{standalone}
\usepackage{libertine}
\usepackage[libertine]{newtxmath}
\usepackage{msc}
\begin{document}
\begin{msc}{}
\declinst{a}{}{A}
\declinst{v}{}{V}
\msccomment[%
fill=blue,
text=white,
minimum size=0.5cm,
font=\noexpand\libertineSB\noexpand\scriptsize,
every msccomment/.append style={draw=none}%
]{1}{a}
\end{msc}
\end{document}
输出: