
Quando exporto um svg
arquivo 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:
- identificar quais números são coordenadas x e coordenadas y
- multiplique as coordenadas x por uma determinada constante
- multiplique as coordenadas y por uma determinada constante
- 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=-1
ser 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 inkscape2tikz
exportação é certamente possível em perl, mas será uma tarefa complexa. Basicamente, você precisa analisar o TikZ
có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.