Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Assume that I have a figure like the next one. How can I put two labels on the edge? For instance, here I would like to name the edge a and keep some auxiliary info associated with the edge.

\begin{figure}[b]
   \centering
    \begin{tikzpicture}
     \SetUpEdge[lw         = 1pt,
                color      = black,
                labelcolor = white]
      \SetVertexNoLabel
      \GraphInit[vstyle=Normal] 
      \SetGraphUnit{3}
      \tikzset{VertexStyle/.append  style={fill}}
      \Vertex{s}
      \NO(s){a}  \EA(a){b} \SO(b){c}
      %\Edge[label={$a$}](s)(a) and the next line
      \Edge[label={$\{g_1\}$}, labelstyle={left}](s)(a)
      \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
      \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)
    \end{tikzpicture}
\end{subfigure}

You need package tkz-graph to compile the document.

share|improve this question
add comment

2 Answers

up vote 7 down vote accepted

I can add some explanations and other solutions.

Firstly, tkz-graph is a tool for drawing graphs at school and generally one edge has one label but I can understand that sometimes it's necessary to use two labels. Secondly, i use xkeyval for the keys and options and I have some difficulties to make something substantial; you can find some inconsistency in the syntax. In the next version, I will use pgfkeys and I think I will get a better code.

Actually, easiest way with all my packages, is to use TikZ when you get a problem here a solution is to add : (like Gonzalo's code)

 \path (s)-- node [right]{$a$}(a); 

The best way

Sorry I forget my personal code :(

When you draw an edge, style is used to draw the edge but labelstyle is to add extra options for the labels

With \Edge[label={$\{g_1\}$}, labelstyle={left,label=right:$a$}](s)(a) you put the main label with label= and you can add another label inside the labelstyle ! (I forgot this possibility !!

   \documentclass{article}
   \usepackage{tkz-graph}


   \begin{document}

   \begin{figure}[b]
      \centering
       \begin{tikzpicture}
        \SetUpEdge[lw         = 1pt,
                   color      = black,
                   labelcolor = white]
         \SetVertexNoLabel
         \GraphInit[vstyle=Normal] 
         \SetGraphUnit{3}
         \tikzset{VertexStyle/.append  style={fill}}
         \Vertex{s}
         \NO(s){a}  \EA(a){b} \SO(b){c} 

         \Edge[label={$\{g_1\}$}, labelstyle={left,label=right:$a$}](s)(a)

         \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
         \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)
       \end{tikzpicture}
   \end{figure}

   % or with a circle

    \begin{tikzpicture}[rotate=-45]% needs another rotation here -45
    \SetVertexNoLabel
    \SetGraphUnit{3}
    \GraphInit[vstyle=Normal]  
    \Vertices{circle}{c,b,a,s}
    \Edge[label={left:$\{g_1\}$}, labelstyle={left,label=right:$a$,label=60:$b$}](s)(a)     
    \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
    \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)  
    \end{tikzpicture}  

   \end{document}  

You can add several labels with for example:

  \Edge[label={left:$\{g_1\}$}, labelstyle={left,label=right:$a$,label=60:$b$}](s)(a) 

More complex is the use of LabelStylelike this

   \documentclass{article}
   \usepackage{tkz-graph}

   \begin{document}

   \begin{figure}[b]
      \centering
       \begin{tikzpicture}
        \SetUpEdge[lw         = 1pt,
                   color      = black,
                   labelcolor = white]
         \SetVertexNoLabel
         \GraphInit[vstyle=Normal] 
         \SetGraphUnit{3}
         \tikzset{VertexStyle/.append  style={fill}}
         \Vertex{s}
         \NO(s){a}  \EA(a){b} \SO(b){c} 
         {\tikzset{LabelStyle/.style={label=right:$a$}}%
         \Edge[label={$\{g_1\}$}, labelstyle={left}](s)(a)  }

          %\path (s)-- node [right]{$a$}(a);   

         \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
         \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)
       \end{tikzpicture}
   \end{figure}

   \end{document}    

You can see that I need to use a scope (TeX's group to limit the action of the style.

The result is always :

enter image description here

Another way to draw your graph

you can use \Vertices with the option square , this macro can place vertices on a line, a triangle, a square and a circle directly.

   \documentclass{article}
   \usepackage{tkz-graph}

    \begin{document} 

    \begin{tikzpicture}[rotate=45]
    \SetVertexNoLabel
    \SetGraphUnit{3}
    \GraphInit[vstyle=Normal]  
    \Vertices{square}{c,b,a,s}
    \Edge[label={left:$\{g_1\}$}, labelstyle={left,label=right:$a$,label=60:$b$}](s)(a)     
    \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
    \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)  
    \end{tikzpicture}  

Conclusion

1) Remember that tkz-graph uses TikZ and you can use the commands of TikZ.

2) Rmember that you can modify each style locally with a TeX's group

share|improve this answer
add comment

An option is to use two \Edges connecting the same vertices, each \Edge can contain its own label:

\documentclass{article}
\usepackage{tkz-graph}

\begin{document}

\begin{figure}[b]
   \centering
    \begin{tikzpicture}
     \SetUpEdge[lw         = 1pt,
                color      = black,
                labelcolor = white]
      \SetVertexNoLabel
      \GraphInit[vstyle=Normal] 
      \SetGraphUnit{3}
      \tikzset{VertexStyle/.append  style={fill}}
      \Vertex{s}
      \NO(s){a}  \EA(a){b} \SO(b){c}
      \Edge[label={$\{g_1\}$}, labelstyle={left}](s)(a)
      \Edge[label={$a$}, labelstyle={right}](s)(a)     
      \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
      \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)
    \end{tikzpicture}
\end{figure}

\end{document}

enter image description here

Or you can also use any valid TikZ construct; for example: a node in a \path:

\documentclass{article}
\usepackage{tkz-graph}

\begin{document}

\begin{figure}[b]
   \centering
    \begin{tikzpicture}
     \SetUpEdge[lw         = 1pt,
                color      = black,
                labelcolor = white]
      \SetVertexNoLabel
      \GraphInit[vstyle=Normal] 
      \SetGraphUnit{3}
      \tikzset{VertexStyle/.append  style={fill}}
      \Vertex{s}
      \NO(s){a}  \EA(a){b} \SO(b){c}
      \Edge[label={$\{g_1\}$}, labelstyle={left}](s)(a)
      \path (s) to node[label=right:$a$] {} (a);     
      \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
      \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)
    \end{tikzpicture}
\end{figure}

\end{document}

enter image description here

or simply a \node:

\documentclass{article}
\usepackage{tkz-graph}
\usetikzlibrary{calc}

\begin{document}

\begin{figure}[b]
   \centering
    \begin{tikzpicture}
     \SetUpEdge[lw         = 1pt,
                color      = black,
                labelcolor = white]
      \SetVertexNoLabel
      \GraphInit[vstyle=Normal] 
      \SetGraphUnit{3}
      \tikzset{VertexStyle/.append  style={fill}}
      \Vertex{s}
      \NO(s){a}  \EA(a){b} \SO(b){c}
      \Edge[label={$\{g_1\}$}, labelstyle={left}](s)(a)
      \node[xshift=3mm] at ($ (s)!0.5!(a) $) {$a$};     
      \Edge[label={$\{g_1\}$}, labelstyle={above}](a)(b)
      \Edge[label={$\{g_1\}$}, labelstyle={right}](b)(c)
    \end{tikzpicture}
\end{figure}

\end{document}

enter image description here

share|improve this answer
1  
I don't like the first solution because you draw twice the edge but it's a possibility. –  Alain Matthes May 24 '12 at 6:44
    
@Altermundus me neither; that's why I added the other options. –  Gonzalo Medina May 24 '12 at 15:35
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.