`msccomment` 内的 TikZ 节点抛出 `与其定义不匹配` 错误

`msccomment` 内的 TikZ 节点抛出 `与其定义不匹配` 错误

我有一个协议,msc其中每条消息旁边都有步骤(1、2、3 等)。这是使用\msccomment命令完成的。

例子:\msccomment[draw=none, msccomment distance=0cm, side=left]{12}{a}

现在,我将用 TikZ 节点替换这些步骤,以使其看起来更好。例如,用 替换12上面的步骤\numd{12}。但这会引发错误。

  • 我已经从序列图中删除了所有能删除的内容,包括来自\numd新命令的多个选项,以尝试发现错误,但这超出了我对乳胶的理解。
  • 使用 documentclassreport也无济于事。
  • 删除可选参数\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}

输出:

在此处输入图片描述

相关内容