这个问题可能很愚蠢,但我找不到合适的解决方案。
如果我把逗号分隔的值列表作为参数使用鍵盤,那么结果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}