评论

评论

更新:现在这是一个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.*\,

玩得开心

相关内容