Как создать скрипт, который сделает Inkscape TikZ более удобным для чтения человеком?

Как создать скрипт, который сделает Inkscape TikZ более удобным для чтения человеком?

Когда я экспортирую svgфайл из inkscape в TikZ, результат часто оказывается огромным и не очень удобным для чтения человеком. Я хотел бы написать скрипт perl для постобработки вывода. Скрипт должен уметь:

  1. определить, какие числа являются x-координатами и y-координатами
  2. умножить координаты x на заданную константу
  3. умножить координаты y на заданную константу
  4. округлить координаты до ближайшего кратного другой константе

Это можно использовать, например, для того, чтобы избавиться от четырех знаков после запятой, если они не нужны, и их yscale=-1можно удалить.

Какое регулярное выражение выберет координаты и контрольные точки?

Если координаты и контрольные точки умножить на константу, будет ли полученная картинка масштабироваться (и/или растягиваться)? Или произойдет что-то непредвиденное мной?

Приветствуются любые другие мысли и предложения.

Изменения: Спасибо за ответы, но пренебрегите предупреждениями о том, что мне нужно будет разобрать TikZ, я все еще остаюсь наивным. Я не видел никаких выходных данных из inkscape, которые имели бы координаты в других формах, кроме (12.3456,42.4242).

решение1

Постобработка вывода из inkscape2tikzэкспорта, конечно, возможна в perl, но это будет сложная задача. По сути, вам придется разобрать код TikZдо определенной степени.

Другой подход заключается в улучшении самой процедуры экспорта. Оказывается, это приоритет для автора (Кьелл Магне Фауске) и он даже частично реализован (inkscape2tikz выпуск 27). Экспорт выполняется с использованием относительно простого скрипта Python, поэтому усовершенствование здесь будет намного проще и принесет пользу всем, кто использует эту процедуру.

решение2

Регулярных выражений, безусловно, недостаточно для анализа и обработки произвольных данных.ТикЗкод. Таким образом, вы должны посмотреть, какие конструкцииinkscapeпроизводит. Я думаю, это не очень хорошо документировано, так что вам, возможно, придется взглянуть наinkscapeИсходный код.

Если вы дадите нам примерТикЗcode, мы, конечно, могли бы объяснить вам, что это значит. Но другой хороший подход к вашей проблеме — это добавление функциональности вinkscape's сам механизм экспорта. В этом и заключается прелесть свободного ПО. Конечно, я не могу сказать, сколько усилий потребует этот подход или ваша идея постобработки, поскольку это во многом зависит отinkscapeвнутренняя структура экспортной процедуры и ее видТикЗкод, который он производит.

решение3

Моя первая попытка (параметры командной строки пока не реализованы). Пожалуйста, сообщите мне, если вы видите что-то, что можно улучшить.

Код:

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

}

Использование:

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

Тестовый ввод:

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

Выход:

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

Аргументы командной строки пока не могут быть заданы. ;В вывод добавлена ​​дополнительная строка с ошибкой. Углы не округлены.

Связанный контент