2
$\begingroup$

I want to convert a TikZ graph from TikZiT into a graph in Mathematica. I want to retain the vertices, edges, and the positions of the vertices. As for the color of the vertices or the style of the edges, I don't need to worry about that for now. Then I used the code written by GPT (with some minor adjustments on my part). When the edge style is not set, everything works fine.

The information of a graph in TikZIt is explained as follows.

\node [style=square] (1) at (10, -10) {};

The node, named 1, is located at (10, -10).

\draw [style=blackedge] (5) to (11);

or

 \draw  (5) to (11);

This means an egde (5,11) (edge style is like to style=..).

A graph code is stored in test.tikz:

\begin{tikzpicture}[scale=1.0]
    \begin{pgfonlayer}{nodelayer}
        \node [style=square] (1) at (10, -10) {};
        \node [style=whitenode] (2) at (5.29412, -3.33333) {};
        \node [style=square] (3) at (10, 10) {};
        \node [style=square] (4) at (-10, -10) {};
        \node [style=whitenode] (5) at (3.33333, -5.29412) {};
        \node [style=whitenode] (6) at (2.54902, -1.37255) {};
        \node [style=whitenode] (7) at (5.29412, 3.33333) {};
        \node [style=whitenode] (8) at (3.33333, 5.29412) {};
        \node [style=square] (9) at (-10, 10) {};
        \node [style=whitenode] (10) at (-5.29412, -3.33333) {};
        \node [style=whitenode] (11) at (-3.33333, -5.29412) {};
        \node [style=whitenode] (12) at (1.37255, -2.54902) {};
        \node [style=square] (13) at (0.980392, -0.980392) {};
        \node [style=whitenode] (14) at (2.54902, 1.37255) {};
        \node [style=whitenode] (15) at (1.37255, 2.54902) {};
        \node [style=whitenode] (16) at (-3.33333, 5.29412) {};
        \node [style=whitenode] (17) at (-5.29412, 3.33333) {};
        \node [style=whitenode] (18) at (-2.54902, -1.37255) {};
        \node [style=whitenode] (19) at (-1.37255, -2.54902) {};
        \node [style=square] (20) at (-0.980392, -0.980392) {};
        \node [style=square] (21) at (0.980392, 0.980392) {};
        \node [style=whitenode] (22) at (-1.37255, 2.54902) {};
        \node [style=whitenode] (23) at (-2.54902, 1.37255) {};
        \node [style=square] (24) at (-0.980392, 0.980392) {};
    \end{pgfonlayer}
    \begin{pgfonlayer}{edgelayer}
        \draw (1) to (2);
        \draw (1) to (3);
        \draw (1) to (4);
        \draw (1) to (5);
        \draw (2) to (5);
        \draw (2) to (6);
        \draw (2) to (7);
        \draw (3) to (7);
        \draw (3) to (8);
        \draw (3) to (9);
        \draw (4) to (9);
        \draw (4) to (10);
        \draw (4) to (11);
        \draw (5) to (11);
        \draw (5) to (12);
        \draw (6) to (12);
        \draw (6) to (13);
        \draw (6) to (14);
        \draw (7) to (8);
        \draw (7) to (14);
        \draw (8) to (15);
        \draw (8) to (16);
        \draw (9) to (16);
        \draw (9) to (17);
        \draw (10) to (11);
        \draw (10) to (17);
        \draw (10) to (18);
        \draw (11) to (19);
        \draw (12) to (13);
        \draw (12) to (19);
        \draw (13) to (20);
        \draw (13) to (21);
        \draw (14) to (15);
        \draw (14) to (21);
        \draw (15) to (21);
        \draw (15) to (22);
        \draw (16) to (17);
        \draw (16) to (22);
        \draw (17) to (23);
        \draw (18) to (19);
        \draw (18) to (20);
        \draw (18) to (23);
        \draw (19) to (20);
        \draw (20) to (24);
        \draw (21) to (24);
        \draw (22) to (23);
        \draw (22) to (24);
        \draw (23) to (24);
        \draw (16) to (15);
        \draw (8) to (22);
        \draw (17) to (22);
        \draw (16) to (23);
        \draw (23) to (10);
        \draw (17) to (18);
        \draw (18) to (11);
        \draw (10) to (19);
        \draw (19) to (5);
        \draw (12) to (11);
        \draw (6) to (5);
        \draw (12) to (2);
        \draw (2) to (14);
        \draw (7) to (6);
        \draw (15) to (7);
        \draw (8) to (14);
        \draw (22) to (21);
        \draw (15) to (24);
        \draw (24) to (13);
        \draw (21) to (20);
        \draw (20) to (12);
        \draw (13) to (19);
        \draw (23) to (20);
        \draw (24) to (18);
        \draw (13) to (14);
        \draw (6) to (21);
        \draw (9) to (10);
        \draw (17) to (4);
        \draw (4) to (5);
        \draw (11) to (1);
        \draw (1) to (7);
        \draw (3) to (2);
        \draw (9) to (8);
        \draw (16) to (3);
        \draw (4) to (3);
        \draw (9) to (1);
    \end{pgfonlayer}
\end{tikzpicture}
ImportTikZGraph[file_String] := 
 Module[{tikzCode, lines, nodes, edges, line, parts, nodeID, xCoord, 
   yCoord, startNode, endNode, 
   g},(*Import the TikZ code from the file*)
  tikzCode = Import[file, "Text"];
  (*Initialize lists for nodes and edges*)nodes = {};
  edges = {};
  (*Split the TikZ code into lines*)
  lines = StringSplit[tikzCode, "\n"];
  (*Extract node information*)
  For[i = 1, i <= Length[lines], i++, line = StringTrim[lines[[i]]];
   If[StringStartsQ[line, "\\node"],(*Extract node ID and coordinates*)
    parts = StringCases[line, 
      "\\node [" ~~ ___ ~~ "] (" ~~ nodeID : DigitCharacter .. ~~ 
        ") at (" ~~ x : (DigitCharacter | "." | "-" | "E") .. ~~ 
        ", " ~~ y : (DigitCharacter | "." | "-" | "E") .. ~~ 
        ") {};" :> {nodeID, x, y}];
    If[Length[parts] > 0, nodeID = ToExpression[parts[[1, 1]]];
     xCoord = ToExpression[parts[[1, 2]]];
     yCoord = ToExpression[parts[[1, 3]]];
     AppendTo[nodes, nodeID -> {xCoord, yCoord}];];];];
  (*Extract edge information*)
  For[i = 1, i <= Length[lines], i++, line = StringTrim[lines[[i]]];
   If[StringStartsQ[line, 
     "\\draw"],(*Extract the start and end nodes of edges*)
    parts = StringCases[line, 
      "\\draw (" ~~ startNode : DigitCharacter .. ~~ ") to (" ~~ 
        endNode : DigitCharacter .. ~~ ");" :> {startNode, endNode}];
    If[Length[parts] > 0, startNode = ToExpression[parts[[1, 1]]];
     endNode = ToExpression[parts[[1, 2]]];
     AppendTo[edges, UndirectedEdge[startNode, endNode]];];];];
  (*Create the graph from extracted edges and node positions*)
  g = Graph[edges, VertexCoordinates -> nodes, 
    VertexStyle -> GrayLevel[1], VertexSize -> Medium];
  (*Return the graph*)g]

graph = ImportTikZGraph["test.tikz"]

enter image description here

However, when I set the edge styles, it seems to fail. I've tried a few times.

\begin{tikzpicture}[scale=1.0]
    \begin{pgfonlayer}{nodelayer}
        \node [style=square] (1) at (10, -10) {};
        \node [style=whitenode] (2) at (5.29412, -3.33333) {};
        \node [style=square] (3) at (10, 10) {};
        \node [style=square] (4) at (-10, -10) {};
        \node [style=whitenode] (5) at (3.33333, -5.29412) {};
        \node [style=whitenode] (6) at (2.54902, -1.37255) {};
        \node [style=whitenode] (7) at (5.29412, 3.33333) {};
        \node [style=whitenode] (8) at (3.33333, 5.29412) {};
        \node [style=square] (9) at (-10, 10) {};
        \node [style=whitenode] (10) at (-5.29412, -3.33333) {};
        \node [style=whitenode] (11) at (-3.33333, -5.29412) {};
        \node [style=whitenode] (12) at (1.37255, -2.54902) {};
        \node [style=square] (13) at (0.980392, -0.980392) {};
        \node [style=whitenode] (14) at (2.54902, 1.37255) {};
        \node [style=whitenode] (15) at (1.37255, 2.54902) {};
        \node [style=whitenode] (16) at (-3.33333, 5.29412) {};
        \node [style=whitenode] (17) at (-5.29412, 3.33333) {};
        \node [style=whitenode] (18) at (-2.54902, -1.37255) {};
        \node [style=whitenode] (19) at (-1.37255, -2.54902) {};
        \node [style=square] (20) at (-0.980392, -0.980392) {};
        \node [style=square] (21) at (0.980392, 0.980392) {};
        \node [style=whitenode] (22) at (-1.37255, 2.54902) {};
        \node [style=whitenode] (23) at (-2.54902, 1.37255) {};
        \node [style=square] (24) at (-0.980392, 0.980392) {};
    \end{pgfonlayer}
    \begin{pgfonlayer}{edgelayer}
        \draw [style=blackedge] (1) to (2);
        \draw [style=blackedge] (1) to (3);
        \draw [style=blackedge] (1) to (4);
        \draw [style=blackedge] (1) to (5);
        \draw [style=blackedge] (2) to (5);
        \draw [style=blackedge] (2) to (6);
        \draw [style=blackedge] (2) to (7);
        \draw [style=blackedge] (3) to (7);
        \draw [style=blackedge] (3) to (8);
        \draw [style=blackedge] (3) to (9);
        \draw [style=blackedge] (4) to (9);
        \draw [style=blackedge] (4) to (10);
        \draw [style=blackedge] (4) to (11);
        \draw [style=blackedge] (5) to (11);
        \draw [style=blackedge] (5) to (12);
        \draw [style=blackedge] (6) to (12);
        \draw [style=blackedge] (6) to (13);
        \draw [style=blackedge] (6) to (14);
        \draw [style=blackedge] (7) to (8);
        \draw [style=blackedge] (7) to (14);
        \draw [style=blackedge] (8) to (15);
        \draw [style=blackedge] (8) to (16);
        \draw [style=blackedge] (9) to (16);
        \draw [style=blackedge] (9) to (17);
        \draw [style=blackedge] (10) to (11);
        \draw [style=blackedge] (10) to (17);
        \draw [style=blackedge] (10) to (18);
        \draw [style=blackedge] (11) to (19);
        \draw [style=blackedge] (12) to (13);
        \draw [style=blackedge] (12) to (19);
        \draw [style=blackedge] (13) to (20);
        \draw [style=blackedge] (13) to (21);
        \draw [style=blackedge] (14) to (15);
        \draw [style=blackedge] (14) to (21);
        \draw [style=blackedge] (15) to (21);
        \draw [style=blackedge] (15) to (22);
        \draw [style=blackedge] (16) to (17);
        \draw [style=blackedge] (16) to (22);
        \draw [style=blackedge] (17) to (23);
        \draw [style=blackedge] (18) to (19);
        \draw [style=blackedge] (18) to (20);
        \draw [style=blackedge] (18) to (23);
        \draw [style=blackedge] (19) to (20);
        \draw [style=blackedge] (20) to (24);
        \draw [style=blackedge] (21) to (24);
        \draw [style=blackedge] (22) to (23);
        \draw [style=blackedge] (22) to (24);
        \draw [style=blackedge] (23) to (24);
        \draw [style=blueedge] (16) to (15);
        \draw [style=blueedge] (8) to (22);
        \draw [style=blueedge] (17) to (22);
        \draw [style=blueedge] (16) to (23);
        \draw [style=blueedge] (23) to (10);
        \draw [style=blueedge] (17) to (18);
        \draw [style=blueedge] (18) to (11);
        \draw [style=blueedge] (10) to (19);
        \draw [style=blueedge] (19) to (5);
        \draw [style=blueedge] (12) to (11);
        \draw [style=blueedge] (6) to (5);
        \draw [style=blueedge] (12) to (2);
        \draw [style=blueedge] (2) to (14);
        \draw [style=blueedge] (7) to (6);
        \draw [style=blueedge] (15) to (7);
        \draw [style=blueedge] (8) to (14);
        \draw [style=blueedge] (22) to (21);
        \draw [style=blueedge] (15) to (24);
        \draw [style=blueedge] (24) to (13);
        \draw [style=blueedge] (21) to (20);
        \draw [style=blueedge] (20) to (12);
        \draw [style=blueedge] (13) to (19);
        \draw [style=blueedge] (23) to (20);
        \draw [style=blueedge] (24) to (18);
        \draw [style=blueedge] (13) to (14);
        \draw [style=blueedge] (6) to (21);
        \draw [style=blueedge] (9) to (10);
        \draw [style=blueedge] (17) to (4);
        \draw [style=blueedge] (4) to (5);
        \draw [style=blueedge] (11) to (1);
        \draw [style=blueedge] (1) to (7);
        \draw [style=blueedge] (3) to (2);
        \draw [style=blueedge] (9) to (8);
        \draw [style=blueedge] (16) to (3);
        \draw [style=blueedge, bend left=60, looseness=2.25] (4) to (3);
        \draw [style=blueedge, bend left=60, looseness=2.25] (9) to (1);
    \end{pgfonlayer}
\end{tikzpicture}

It looks the following: enter image description here

$\endgroup$
3
  • $\begingroup$ In what it fails? $\endgroup$ Commented Dec 5 at 13:15
  • $\begingroup$ If some edge like \draw [style=blackedge]…, the edge cannot be recognized. $\endgroup$
    – licheng
    Commented Dec 5 at 13:58
  • 1
    $\begingroup$ I added answer that works also with the second input. $\endgroup$ Commented Dec 5 at 15:10

1 Answer 1

3
$\begingroup$
(* strg is string of OP "\begin{tikzpicture}[scale=1.0]..."*)

vc = ToExpression@
   StringCases[strg, 
    Shortest["\\node " ~~ ___ ~~ "("] ~~ Shortest[n__] ~~ ") at (" ~~ 
      Shortest[x__] ~~ "," ~~ Shortest[y__] ~~ ")" :> {n, {x, y}}];
ed = ToExpression@
   StringCases[strg, 
    Shortest["\\draw " ~~ ___ ~~ "("] ~~ Shortest[n1__] ~~ ") to (" ~~
       Shortest[n2__] ~~ ")" :> {n1, n2}];

Graph[vc[[All, 1]], ed, VertexCoordinates -> vc[[All, 2]]]

enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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