pgfkey 中的逗号分隔值列表不是列表

pgfkey 中的逗号分隔值列表不是列表

这个问题可能很愚蠢,但我找不到合适的解决方案。

如果我把逗号分隔的值列表作为参数使用鍵盤,那么结果pgfkeys值是一个原子值而不是列表。

代码(不起作用)如下:

\documentclass{article}
\usepackage{fontenc}
\usepackage{tikz}
\usepackage{color}
\usetikzlibrary{shapes,
    shapes.geometric,
    shapes.symbols,
    shapes.arrows,
    shapes.multipart,
    shapes.callouts,
    shapes.misc,
    tikzmark,
    arrows, 
    positioning,
    calc,
    math,
    scopes,
}

\tikzstyle{every entity} = []
\tikzstyle{entity} = [shape=rectangle, draw, black,  thick,
                      minimum width=6em, minimum height=3em,
                      every entity]

% \usepackage[active,pdftex,tightpage]{preview}
\newcommand{\rol}[3][type=normal,arcfmt=--,card=N,total=false]{
\pgfkeys{/incoMer/.cd,
startPoint/.initial={-},
endPoint/.initial={},
arcfmt/.initial={--},
rolname/.initial={},
rolnameParams/.initial={},
card/.initial={N},
cardpos/.initial={above},
#1,
}

\draw [-] (#2) \pgfkeysvalueof{/incoMer/arcfmt} node[pos=0.80,\pgfkeysvalueof{/incoMer/cardpos}]{\pgfkeysvalueof{/incoMer/card}} 
            node[\pgfkeysvalueof{/incoMer/rolnameParams}]{\pgfkeysvalueof{/incoMer/rolname}} (#3);
}

\title{prueba}
\begin{document}
% Comienza el Mer
\begin{tikzpicture}
  % Entidad Estudiantes
\node[entity](st){Students};

\node[entity][left=5cm of st](cs){Courses};

\rol[%
    arcfmt={edge[bend left,sloped]},
    rolname={very very very long test},
    rolnameParams={below,sloped},
    %rolnameParams={below},
    ]{st}{cs};

\end{tikzpicture}


\end{document}

当。。。的时候角色名称参数通过注释该行并删除下一行中的 % 来更改行,一切正常。

错误是:

软件包 pgfkeys 错误:我不知道密钥“/tikz/below,sloped”,我将忽略它。也许你拼错了。

必须指出的是弧形参数工作正常,但如果对节点使用相同的策略,它就不起作用。

为什么会这样?如何解决?

答案1

可选参数中的 PGF 键列表的解析器\node在扩展任何内容之前会查找逗号分隔符,因此在您的情况下\pgfkeysvalueof{/incoMer/rolnameParams}被认为(扩展后!)生成单个 PGF 键,因此出现错误消息。

我建议在这里使用一种样式(名为/incoMer/impl/rolnameParams@style),并从使用rolnameParams可选参数的键中定义这种样式,其中本身是一种使用其参数定义的样式:\rol\pgfqkeys{/incoMer}{#1}rolnameParams/incoMer/impl/rolnameParams@style

rolnameParams/.style={/incoMer/impl/rolnameParams@style/.style={#1}}

同样的道理也适用于cardpos,它也用于生成 PGF 密钥列表。其他事项:

  • 我改进了结构;

  • 不要使用早已过时的\tikzstyle—use\tikzset.style pgfkeys处理程序;

  • 不要在您自己的宏调用之后使用(这会导致示例中的;警告);Missing character: There is no ; in font nullfont!

  • 请写最小例子下次。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}

\tikzset{
  every entity/.style={},
  entity/.style={
    shape=rectangle, draw, black, thick,
    minimum width=6em, minimum height=3em, every entity},
}

\makeatletter
\pgfkeys{
  /incoMer/.cd,
  arcfmt/.initial={--},
  rolname/.initial={},
  card/.initial={N},
  % Styles
  impl/cardpos@style/.style={above},
  cardpos/.style={/incoMer/impl/cardpos@style/.style={#1}},
  impl/rolnameParams@style/.style={},
  rolnameParams/.style={/incoMer/impl/rolnameParams@style/.style={#1}},
}

\newcommand*{\rol}[3][type=normal,arcfmt=--,card=N,total=false]{%
  \begingroup
    \pgfqkeys{/incoMer}{#1}%
    \draw [-] (#2) \pgfkeysvalueof{/incoMer/arcfmt}
      node[pos=0.80, /incoMer/impl/cardpos@style]{\pgfkeysvalueof{/incoMer/card}}
      node[/incoMer/impl/rolnameParams@style] {\pgfkeysvalueof{/incoMer/rolname}}
      (#3);
  \endgroup
}
\makeatother

\begin{document}
\begin{tikzpicture}
\node[entity] (st) {Students};

\node[entity, left=5cm of st] (cs) {Courses};

\rol[%
    arcfmt={edge[bend left,sloped]},
    rolname={very very very long test},
    rolnameParams={pos=0.3,below,sloped},
  ]{st}{cs}                 % don't end this with ';'

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容