Wie erstelle ich ein Skript, um Inkscape TikZ für Menschen besser lesbar zu machen?

Wie erstelle ich ein Skript, um Inkscape TikZ für Menschen besser lesbar zu machen?

Wenn ich eine Datei von Inkscape nach TikZ exportiere svg, ist das Ergebnis oft riesig und nicht sehr lesbar. Ich möchte ein Perl-Skript zur Nachbearbeitung der Ausgabe schreiben. Das Skript sollte Folgendes können:

  1. Identifizieren Sie, welche Zahlen x-Koordinaten und y-Koordinaten sind
  2. multiplizieren Sie die x-Koordinaten mit einer gegebenen Konstante
  3. Multiplizieren Sie die y-Koordinaten mit einer gegebenen Konstante
  4. runden Sie die Koordinaten auf das nächste Vielfache einer anderen Konstanten

Dies kann beispielsweise dazu verwendet werden, die vier Dezimalstellen loszuwerden, wenn diese nicht benötigt werden und yscale=-1entfernt werden können.

Welcher reguläre Ausdruck wählt Koordinaten und Kontrollpunkte aus?

Wenn Koordinaten und Kontrollpunkte mit einer Konstanten multipliziert werden, wird das resultierende Bild dann skaliert (und/oder gestreckt)? Oder passiert etwas von mir Unvorhergesehenes?

Andere Gedanken und Vorschläge sind willkommen.

Änderungen: Vielen Dank für die Antworten, aber trotz der Warnungen, dass ich TikZ analysieren müsste, bin ich immer noch naiv. Ich habe noch keine Ausgabe von Inkscape gesehen, die Koordinaten in anderen Formen als hat (12.3456,42.4242).

Antwort1

Die Nachbearbeitung der Ausgabe des inkscape2tikzExports ist in Perl zwar möglich, wird aber eine komplexe Aufgabe sein. Sie müssen den TikZCode grundsätzlich bis zu einem gewissen Grad analysieren.

Ein anderer Ansatz besteht darin, Dinge in der Exportroutine selbst zu verbessern. Es stellt sich heraus, dass dies für den Autor (Kjell Magne Fauske) eine Priorität ist und es ist sogar teilweise implementiert (inkscape2tikz Ausgabe 27). Der Export erfolgt über ein relativ einfaches Python-Skript, so dass eine Verbesserung hier viel einfacher ist und allen zugute kommt, die die Routine verwenden.

Antwort2

Reguläre Ausdrücke reichen sicherlich nicht aus, um beliebigeTikZCode. Man muss sich also anschauen, welche Art von KonstruktenInkscapeproduziert. Ich denke, das ist nicht gut dokumentiert, also müssen Sie sich vielleicht ansehenInkscape's Quellcode.

Wenn Sie uns ein Beispiel gebenTikZCode, wir könnten Ihnen sicherlich erklären, was es bedeutet. Aber ein anderer guter Ansatz für Ihr Problem ist das Hinzufügen der Funktionalität zuInkscapeExportmechanismus selbst. Das ist das Schöne an freier Software. Natürlich kann ich Ihnen nicht sagen, wie viel Aufwand dieser Ansatz oder Ihre Idee der Nachbearbeitung erfordern würde, da dies stark davon abhängtInkscapeDer interne Aufbau der Exportroutine und die Art derTikZden von ihm erzeugten Code.

Antwort3

Mein erster Versuch (Befehlszeilenoptionen noch nicht implementiert). Bitte sagen Sie mir, wenn Sie etwas sehen, das verbessert werden kann.

Code:

#!/usr/bin/perl

#Default values
$startRegex = ".*begin\{tikzpicture\}.*";
$endRegex   = ".*end\{tikzpicture\}.*";
$shift_x    = 0;
$shift_y    = 1000;
$scale_x    = 1;
$scale_y    = -1;
$precision  = 1;

#Insert code to accept command line arguments

$process = 0;
while(<STDIN>)
{
  if($_ =~ $endRegex) { $process=0 };

  if($process)
    {
      my @lines = split(';', $_);

      foreach my $line (@lines)
    {
      my $newline = '';
      while($line =~ m/\((-{0,1}\d*\.{0,1}\d+),(-{0,1}\d*\.{0,1}\d+)\)/)
        {
          $line = $';
          my $x = int(($1*$scale_x+$shift_x)/$precision)*$precision;
          my $y = int(($2*$scale_y+$shift_y)/$precision)*$precision;
          $newline .= "$`($x,$y)";
        }
      $newline .= "$line;";
      print "$newline\n";
    }
    }
  else
    {
      print;
    }

  if($_ =~ $startRegex) { $process=1 };

}

Verwendung:

./ink2TikZpost.pl <test.tex >newTest.tex

Testeingabe:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}

\begin{tikzpicture}[y=0.80pt,x=0.80pt,yscale=-1, inner sep=0pt, outer sep=0pt]
\path[draw=black,miter limit=4.00,line width=2.835pt,rounded corners=0.0000cm] (100.0000,115.2193) rectangle (560.0000,483.7908);\path[draw=black,line join=miter,line cap=butt,miter limit=4.00,line width=2.835pt] (237.1429,303.7908) -- (468.5714,623.7908);\path[draw=black,miter limit=4.00,line width=2.835pt] (317.1429,696.6479)arc(0.000:180.000:90.000)arc(-180.000:0.000:90.000) -- cycle;\path[draw=black,miter limit=4.00,line width=2.835pt] (622.8571,789.5051)arc(0.000:180.000:100.000000 and 42.857)arc(-180.000:0.000:100.000000 and 42.857) -- cycle;\path[draw=black,miter limit=4.00,line width=2.835pt] (331.4286,939.5051)arc(0.000:100.000:77.142860 and 35.714);
\end{tikzpicture}
\end{document}

Ausgabe:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}

\begin{tikzpicture}[y=0.80pt,x=0.80pt,yscale=-1, inner sep=0pt, outer sep=0pt]
\path[draw=black,miter limit=4.00,line width=2.835pt,rounded corners=0.0000cm] (100,884) rectangle (560,516);
\path[draw=black,line join=miter,line cap=butt,miter limit=4.00,line width=2.835pt] (237,696) -- (468,376);
\path[draw=black,miter limit=4.00,line width=2.835pt] (317,303)arc(0.000:180.000:90.000)arc(-180.000:0.000:90.000) -- cycle;
\path[draw=black,miter limit=4.00,line width=2.835pt] (622,210)arc(0.000:180.000:100.000000 and 42.857)arc(-180.000:0.000:100.000000 and 42.857) -- cycle;
\path[draw=black,miter limit=4.00,line width=2.835pt] (331,60)arc(0.000:100.000:77.142860 and 35.714);

;
\end{tikzpicture}
\end{document}

Kommandozeilenargumente können noch nicht angegeben werden. Zusätzliche Zeile fälschlicherweise ;in der Ausgabe hinzugefügt. Winkel sind nicht gerundet.

verwandte Informationen