inkscape TikZ を人間が読みやすいものにするためのスクリプトを作成するにはどうすればいいですか

inkscape TikZ を人間が読みやすいものにするためのスクリプトを作成するにはどうすればいいですか

inkscape から TikZ にファイルをエクスポートするとsvg、結果が巨大になり、人間が読みにくいことがよくあります。出力を後処理するための Perl スクリプトを書きたいと思います。スクリプトは次のことができる必要があります。

  1. x座標とy座標の数値を特定する
  2. x座標に与えられた定数を掛ける
  3. y座標に与えられた定数を掛ける
  4. 座標を他の定数の最も近い倍数に丸める

これは、たとえば、必要ない場合は 4 つの小数点を取り除くために使用でき、yscale=-1削除できます。

どの正規表現が座標と制御点を選択するのでしょうか?

座標と制御点に定数を掛けると、結果の画像は拡大縮小(および/または引き伸ばし)されますか? それとも、予期せぬことが起こるでしょうか?

その他のご意見やご提案も歓迎いたします。

編集: 回答ありがとうございます。しかし、TikZ を解析する必要があるという警告を無視して、私はまだ世間知らずのままです。 以外の形式の座標を持つ inkscape の出力は見たことがありません(12.3456,42.4242)

答え1

エクスポートからの出力を後処理することはinkscape2tikzPerl で可能ですが、複雑な作業になります。基本的には、TikZある程度コードを解析する必要があります。

別のアプローチとしては、エクスポートルーチン自体を改善するというものがあります。これは著者 (Kjell Magne Fauske) にとって優先事項であり、部分的に実装されています (inkscape2tikz 問題 27)。エクスポートは比較的単純な Python スクリプトを使用して行われるため、ここでの改善ははるかに簡単になり、ルーチンを使用するすべての人にメリットをもたらします。

答え2

正規表現は、任意の文字列を解析して操作するのに十分ではない。ティックZコード。したがって、どのような構造がインクスケープ生産しています。これはあまり文書化されていないので、確認する必要があるかもしれませんインクスケープのソースコード。

例を挙げるとティックZコードの意味を説明できるでしょう。しかし、問題に対するもう1つの良いアプローチは、インクスケープのエクスポートメカニズム自体です。これがフリーソフトウェアの美しさです。もちろん、このアプローチや後処理のアイデアにどれだけの労力がかかるかはわかりません。それは、インクスケープのエクスポートルーチンの内部構築とティックZ生成されるコード。

答え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}

コマンドライン引数はまだ指定できません。;出力に誤って余分な行が追加されました。角度は丸められません。

関連情報