如何编写脚本让 Inkscape TikZ 更加人性化

如何编写脚本让 Inkscape TikZ 更加人性化

当我将svg文件从 Inkscape 导出到 TikZ 时,结果通常很大,而且不太人性化。我想编写一个 perl 脚本来对输出进行后期处理。该脚本应该能够:

  1. 确定 x 坐标和 y 坐标的数字
  2. 将 x 坐标乘以给定常数
  3. 将 y 坐标乘以给定常数
  4. 将坐标四舍五入为另一个常数的最接近的倍数

例如,这可以用来除掉四位小数,如果不需要的话,yscale=-1可以将其删除。

哪个 regEx 将选择坐标和控制点?

如果坐标和控制点乘以一个常数,得到的图片会被缩放(和/或拉伸)吗?或者会发生一些我无法预料的事情?

我们也非常感激其他的想法和建议。

编辑: 谢谢你的回答,但尽管有警告说我需要解析 TikZ,我还是太天真了。我还没有看到任何来自 inkscape 的输出,其中的坐标不是(12.3456,42.4242)

答案1

在 perl 中对导出的输出进行后处理inkscape2tikz当然是可能的,但这将是一项复杂的任务。基本上,您必须TikZ在一定程度上解析代码。

另一种方法是改进导出程序本身。事实证明,这是作者 (Kjell Magne Fauske) 的优先事项,甚至已部分实施 (inkscape2tikz 第 27 期)。导出是使用一个相对简单的python脚本完成的,因此这里的改进将更加容易,并使使用该例程的每个人都受益。

答案2

正则表达式当然不足以解析和操作任意蒂克兹代码。因此你必须看看什么样的结构墨景正在生产。我想,这没有很好的记录,所以你可能需要看看墨景的源代码。

如果你给我们举个例子蒂克兹代码,我们当然可以向你解释它的含义。但解决你的问题的另一个好方法是将功能添加到墨景的导出机制本身。这就是免费软件的魅力所在。当然,我无法告诉你这种方法或你的后处理想法需要多少努力,因为这在很大程度上取决于墨景的导出例程的内部构建和类型蒂克兹它产生的代码。

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

命令行参数尚无法给出。;输出中错误地添加了额外的行。角度未四舍五入。

相关内容