更新:现在这是一个sf.net 上的错误报告。
pgfkeys
我认为我理解了关键参数中特殊字符的规则:如果它包含 { ,
、=
、]
} 中的任何一个,则必须通过将整个参数放在括号中来保护它。在这种情况下,括号将被剥离,pgfkeys
并且括号内的所有内容都会保留,包括周围的空格。
现在,我使用以下 MWEminimum {width,height,size}
作为代表性三人组:
\documentclass[tikz]{standalone}
\tikzset{minimum width= {max(1,2)} } % (1) works
%\tikzset{minimum width= max(1,2) } % (2) doesn't work because of comma
%\tikzset{minimum size = max(1,2) } % (3) doesn't work (expected)
%\tikzset{minimum size = {max(1,2)} } % (4) doesn't work (but I think it should)
%\tikzset{minimum size ={{max(1,2)}}} % (5) doesn't work (desperate attempt)
\begin{document}\end{document}
我很清楚 (2) 和 (3) 无法工作,因为这会使解析器感到困惑。我可以通过查看中的定义来解释为什么 (4) 不起作用pgfmoduleshapes.code.tex
:
\pgfset{minimum size/.style={/pgf/minimum width=#1,/pgf/minimum height=#1}}
通过将参数替换为去掉括号的参数(现在max(1,2)
为)#1
,我们得到了无效的pgfkeys
语法。如果我将定义更改为
\pgfset{minimum size/.style={/pgf/minimum width={#1},/pgf/minimum height={#1}}}
。这是shapes
模块中的一个错误还是这个更改存在我没有看到的缺点?
顺便说一句,我尝试了 (5) 作为解决方法,但也不起作用。为什么?
如果想要更实用的 MWE:我最初是在摆弄使用 TikZ 将节点绘制为正方形并得到以下代码:
\documentclass[border=2mm,tikz]{standalone}
\tikzset{square/.style={
minimum width={max(width("#1") + 2 * \pgfshapeinnerxsep, height("#1") + depth("#1") + 2 * \pgfshapeinnerysep)},
minimum height={max(width("#1") + 2 * \pgfshapeinnerxsep, height("#1") + depth("#1") + 2 * \pgfshapeinnerysep)},
node contents={#1},
}}
\begin{document}
\begin{tikzpicture}
\node[draw,square=Hello];
\end{tikzpicture}
\end{document}
我想使用它minimum size
来避免重复表达。
答案1
除了评论中的建议外,我的建议是
\tikzset{
square/.style={
/utils/exec={
\pgfmathsetmacro\mysize{
max(width("#1")+2*\pgfshapeinnerxsep,
height("#1")+depth("#1")+2*\pgfshapeinnerysep)
}
},
minimum width=\mysize,
minimum height=\mysize,
node contents={#1}
}
}
原因很简单:即使您可以传递一个复杂的数学表达式作为参数,它也会被计算多次并浪费一些时间。
此外,相同的数学表达式有时不会给出相同的结果。一个有趣的例子是
\tikz\draw circle(rnd);
是圆形还是椭圆形?
评论
是的,这是一个错误。应该有={#1}
其他用途。
对整个 PGF 进行粗暴搜索,\=\#\d\,
得到以下结果
\tikzset{radius/.style={/tikz/x radius=#1,/tikz/y radius=#1}}
\tikzset{cs/radius/.style={/tikz/cs/x radius=#1,/tikz/cs/y radius=#1}}
verbose/.style={ verbose IO=#1, verbose optimize=#1, verbose up to date=#1, },
\def\tikz@lib@chainin@#1[#2]{\path[late options={name=#1,on chain,every chain in/.try,#2}]}
shape start size/.style={% shape start width=#1, shape start height=#1% },% shape end size/.style={% shape end width=#1, shape end height=#1% },% shape size/.style={% shape start size=#1, shape end size=#1% },% shape width/.style={% shape start width=#1, shape end width=#1 }, shape height/.style={% shape start height=#1, shape end height=#1 }
trapezium angle/.style={ /pgf/trapezium left angle=#1, /pgf/trapezium right angle=#1 },%
\pgfkeys{/pgf/chamfered rectangle sep/.style={% /pgf/chamfered rectangle xsep=#1,/pgf/chamfered rectangle ysep=#1}% }
zerofill/.style={/pgf/number format/fixed zerofill=#1,/pgf/number format/sci zerofill=#1},
radius/.style={start radius=#1,end radius=#1},
/pgf/segment amplitude/.style={/pgf/decoration={amplitude=#1,shape height=2*#1}},
/pgf/segment object length/.style={/pgf/decoration={shape width=#1,radius=#1}}}
inner sep/.style={/pgf/inner xsep=#1,/pgf/inner ysep=#1},
minimum size/.style={/pgf/minimum width=#1,/pgf/minimum height=#1},
省略了文件和数据可视化库的一些结果.def
。我并不是说上面的这些行包含错误。但尝试一下可能会很有趣。你可能还想尝试\=\#\d\}
一下\=\#\d.*\,
玩得开心