Como faço um script para tornar o inkscape TikZ mais legível por humanos?

Como faço um script para tornar o inkscape TikZ mais legível por humanos?

Quando exporto um svgarquivo do inkscape para o TikZ, o resultado costuma ser enorme e pouco legível por humanos. Eu gostaria de escrever um script perl para pós-processar a saída. O script deve ser capaz de:

  1. identificar quais números são coordenadas x e coordenadas y
  2. multiplique as coordenadas x por uma determinada constante
  3. multiplique as coordenadas y por uma determinada constante
  4. arredondar as coordenadas para o múltiplo mais próximo de outra constante

Isto pode, por exemplo, ser usado para eliminar as quatro casas decimais, se elas não forem necessárias, e podem yscale=-1ser removidas.

Qual regEx escolherá coordenadas e pontos de controle?

Se as coordenadas e os pontos de controle forem multiplicados por uma constante, a imagem resultante será dimensionada (e/ou esticada)? ou vai acontecer algum imprevisto meu?

Outros pensamentos e sugestões são apreciados.

Editar% s: Obrigado pelas respostas, mas desprezo os avisos sobre que eu precisaria analisar o TikZ, ainda continuo ingênuo. Não vi nenhuma saída do inkscape que tenha coordenadas em outras formas que não (12.3456,42.4242).

Responder1

O pós-processamento da saída da inkscape2tikzexportação é certamente possível em perl, mas será uma tarefa complexa. Basicamente, você precisa analisar o TikZcódigo até certo ponto.

Uma abordagem diferente é melhorar a própria rotina de exportação. Acontece que esta é uma prioridade para o autor (Kjell Magne Fauske) e está até parcialmente implementada (Inkscape2tikz edição 27). A exportação é feita usando um script python relativamente simples, então uma melhoria aqui será muito mais fácil e beneficiará todos que utilizam a rotina.

Responder2

Expressões regulares certamente não são suficientes para analisar e manipularTikZcódigo. Portanto, você deve dar uma olhada em que tipo de construçõespaisagem de tintaestá produzindo. Eu acho que isso não está bem documentado, então você pode precisar dar uma olhadapaisagem de tintacódigo-fonte de.

Se você nos der um exemploTikZcódigo, certamente poderíamos explicar a você o que isso significa. Mas outra boa abordagem para o seu problema é adicionar a funcionalidade aopaisagem de tintapróprio mecanismo de exportação. Essa é a beleza do software livre. É claro que não posso dizer quanto esforço essa abordagem ou sua ideia de pós-processamento exigiria, pois isso depende muito depaisagem de tintaa rotina de exportação é construída internamente e o tipo deTikZcódigo que ele produz.

Responder3

Minha primeira tentativa (opções de linha de comando ainda não implementadas). Por favor, diga-me se você vê algo que pode ser melhorado.

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 teste:

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

Saída:

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

Os argumentos da linha de comando ainda não podem ser fornecidos. Linha extra ;adicionada incorretamente na saída. Os ângulos não são arredondados.

informação relacionada