tkz-graph:边和环之间的不一致

tkz-graph:边和环之间的不一致

我发现了这个很棒的软件包tkz-graph,但在使用宏时遇到了一些麻烦\Loop

\Loop宏与宏之间似乎存在一些不一致之处\Edge。例如,在下面的文档中,边的标签放置方式不同。首先,循环有一个数组,但边没有。其次,\( \)数学模式的语法仅在循环的情况下有效。

\documentclass{minimal}
\usepackage{fixltx2e}
\usepackage{tkz-graph}
\begin{document}
\begin{tikzpicture}[scale=1]
  \Vertex{A}
  \Vertex[x=2,y=0]{B}
  \Loop[dist=1.5cm,dir=WE,label=\(x\)](A)
  \Edges[label=$y$](A,B)
\end{tikzpicture}
\end{document}

第三,宏\tikzset{EdgeStyle/.append style = …}不适用于循环,我在用户手册中没有找到解决方案。例如,\tikzset{EdgeStyle/.append style ={->}}边缘和循环不使用相同的箭头尖端。

最后,使用style={->}会在循环中产生与边缘不同的结果(后者的路径更粗)。以下是上述代码的输出,但使用了\tikzset{EdgeStyle/.append style ={->}}边和环具有不同的样式

答案1

抱歉,文档是法语的,但下一版我会尝试写一个英文版。问题是关于tkz-graph而不是tkz-berge并且tkz-berge有英文文档!!

在我回答之前,最后要说的是,我对这些包的选项(样式)不满意,因为我用 xkeyval 编写了它们,很难获得与 Tikz 相同的选项。我将用 pgfkeys 编写下一个版本。

现在问题出现了,因为有很多方法可以改变样式。EdgeStyle用于修改边的全局样式,LoopStyle是循环的全局样式,样式是本地的;Loop首先查看EdgeStyle,然后查看,LoopStyle最后如果此样式存在则应用本地样式。对于标签,您有LabelStyle,然后labelstyle

代码如下

\def\tkzGR@loop[#1](#2){%
\setkeys[GR]{loop}{#1}%
\protected@edef\@tempa{%
\noexpand \draw[\cmdGR@loop@color] (#2)%
  edge [EdgeStyle,LoopStyle,\cmdGR@loop@style]%
  node [LabelStyle,\cmdGR@loop@labelstyle]%
  {\cmdGR@loop@label} (#2)}\@tempa;%
}%

一个可能的解决方案是

\documentclass{minimal}
\usepackage{fixltx2e}
\usepackage{tkz-berge}

\tikzset{LabelStyle/.style= {fill=yellow}}

\begin{document}
\begin{tikzpicture}[scale=1]
  \Vertex{A}
  \Vertex[x=2,y=0]{B}     
  \Loop[dist=1.5cm,dir=WE,label=\(x\),
        labelstyle={left=12pt,color=red,fill=white,draw}](A)
  \Edges[label=$y$](A,B)
\end{tikzpicture}
\end{document} 

在此处输入图片描述 如果您发现样式不清楚或令人困惑,我同意,但我会在下一版本中做出改进pgfkeys。我需要使版本兼容,因为tkz-graph很多人都在使用它。

Count Zero 的第一个解决方案也很好

更新 :另一个解决方案是定义个人风格,并仅用于Tikz绘制循环。始终可以使用 tikz。

答案2

您有两个选择:

  1. 或者将白色(或其他颜色,但不透明)的背景放在节点上:

    \documentclass{minimal}
    \usepackage{fixltx2e}
    \usepackage{tkz-berge}
    
    \tikzset{LabelStyle/.style= {fill=white}}
    
    \begin{document}
    \begin{tikzpicture}[scale=1]
      \Vertex{A}
      \Vertex[x=2,y=0]{B}
      \Loop[dist=1.5cm,dir=WE,label=\(x\)](A)
      \Edges[label=$y$](A,B)
    \end{tikzpicture}
    \end{document}
    
  2. 或者你替换标签(这可能是一个不太优雅的黑客攻击):

    \documentclass{minimal}
    \usepackage{fixltx2e}
    \usepackage{tkz-berge}
    
    \begin{document}
    \begin{tikzpicture}[scale=1]
      \Vertex{A}
      \Vertex[x=2,y=0]{B}
      \tikzset{LabelStyle/.style= {xshift=-.25cm}}
      \Loop[dist=1.5cm,dir=WE,label=\(x\)](A)
      \tikzset{LabelStyle/.style= {xshift=0cm}}% set shift back to original (0) value
      \Edges[label=$y$](A,B)
    \end{tikzpicture}
    \end{document}
    

无论你喜欢哪一个。:) 请注意,在这两种情况下,我都弄错了LabelStyle/.style=... 不是 EdgeStyle

编辑: EdgeStyle接受一个labelstyle参数,这与直接修改基本相同LabelStyle。因此我怀疑还有其他解决方法。

附言:可惜文档只有法语版...我之所以这么说,是因为tkz软件包系列是非常棒事实上语言障碍阻碍了很多人使用它们。

相关内容