¿Cómo hago un script para que Inkscape TikZ sea más legible para los humanos?

¿Cómo hago un script para que Inkscape TikZ sea más legible para los humanos?

Cuando exporto un svgarchivo de Inkscape a TikZ, el resultado suele ser enorme y no muy legible por humanos. Me gustaría escribir un script en Perl para posprocesar el resultado. El guión debería poder:

  1. identificar qué números son coordenadas x y coordenadas y
  2. multiplicar las coordenadas x por una constante dada
  3. multiplicar las coordenadas y por una constante dada
  4. redondea las coordenadas al múltiplo más cercano de otra constante

Esto puede usarse, por ejemplo, para deshacerse de los cuatro decimales, si no son necesarios, y se yscale=-1pueden eliminar.

¿Qué expresión regular seleccionará coordenadas y puntos de control?

Si las coordenadas y los puntos de control se multiplican por una constante, ¿se ampliará (y/o se estirará) la imagen resultante? ¿O sucederá algo inesperado por mi parte?

Se agradecen otros pensamientos y sugerencias.

Ediciones: Gracias por las respuestas, pero a pesar de las advertencias sobre que necesitaría analizar TikZ, sigo siendo ingenuo. No he visto ningún resultado de Inkscape que tenga coordenadas en otras formas que no sean (12.3456,42.4242).

Respuesta1

Ciertamente es posible posprocesar el resultado de la inkscape2tikzexportación en Perl, pero será una tarea compleja. Básicamente tienes que analizar el TikZcódigo hasta cierto punto.

Un enfoque diferente es mejorar cosas en la propia rutina de exportación. Resulta que esto es una prioridad para el autor (Kjell Magne Fauske) e incluso se implementa parcialmente (inkscape2tikz número 27). La exportación se realiza utilizando un script de Python relativamente simple, por lo que una mejora aquí será mucho más fácil y beneficiará a todos los que utilicen la rutina.

Respuesta2

Las expresiones regulares ciertamente no son suficientes para analizar y manipular arbitrariosTikZcódigo. Por lo tanto, debes echar un vistazo a qué tipo de construccionespaisaje de tintaestá produciendo. Supongo que eso no está bien documentado, por lo que es posible que tengas que mirarpaisaje de tintaEl código fuente de.

Si nos das ejemploTikZcódigo, seguramente podríamos explicarte lo que significa. Pero otro buen enfoque para su problema es agregar la funcionalidad apaisaje de tintaEl propio mecanismo de exportación. Esa es la belleza del software libre. Por supuesto, no puedo decirle cuánto esfuerzo requeriría este enfoque o su idea de posprocesamiento, ya que eso depende mucho depaisaje de tintaLa estructura interna de la rutina de exportación y el tipo deTikZcódigo que produce.

Respuesta3

Mi primer intento (las opciones de línea de comando aún no están implementadas). Por favor dime si ves algo que se pueda mejorar.

Código:

#!/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 };

}

Uso:

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

Entrada de prueba:

\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}

Producción:

\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}

Aún no se pueden proporcionar argumentos de la línea de comando. Línea adicional ;agregada incorrectamente en la salida. Los ángulos no están redondeados.

información relacionada