Inkscape TikZ를 사람이 더 쉽게 읽을 수 있도록 스크립트를 만드는 방법

Inkscape TikZ를 사람이 더 쉽게 읽을 수 있도록 스크립트를 만드는 방법

Inkscape에서 TikZ로 파일을 내보낼 때 svg결과가 너무 커서 사람이 읽을 수 없는 경우가 많습니다. 출력 후처리를 위한 Perl 스크립트를 작성하고 싶습니다. 스크립트는 다음을 수행할 수 있어야 합니다.

  1. x좌표와 y좌표가 무엇인지 식별
  2. x 좌표에 주어진 상수를 곱합니다.
  3. y 좌표에 주어진 상수를 곱합니다.
  4. 좌표를 다른 상수의 가장 가까운 배수로 반올림

예를 들어, 필요하지 않은 경우 소수 네 자리를 제거하는 데 사용할 수 있으며 yscale=-1제거할 수 있습니다.

좌표와 제어점을 선택하는 정규식은 무엇입니까?

좌표와 제어점에 상수를 곱하면 결과 그림의 크기가 조정됩니까(및/또는 늘어납니까)? 아니면 나한테 예상치 못한 일이 일어날까?

다른 생각과 제안에 감사드립니다.

편집: 답변해 주셔서 감사합니다. 하지만 TikZ를 구문 분석해야 한다는 경고는 경멸합니다. 저는 여전히 순진합니다. .(12.3456,42.4242)

답변1

내보내기 의 출력을 후처리하는 것은 inkscape2tikz확실히 Perl에서 가능하지만 복잡한 작업이 될 것입니다. 기본적으로 TikZ코드를 어느 정도 구문 분석해야 합니다 .

다른 접근 방식은 내보내기 루틴 자체의 사항을 개선하는 것입니다. 이는 저자(Kjell Magne Fauske)의 우선순위이며 부분적으로 구현되기도 한 것으로 밝혀졌습니다(inkscape2tikz 문제 27). 내보내기는 상대적으로 간단한 Python 스크립트를 사용하여 수행되므로 여기서의 개선은 훨씬 더 쉽고 루틴을 사용하는 모든 사람에게 도움이 될 것입니다.

답변2

정규식은 확실히 임의의 구문을 분석하고 조작하는 데 충분하지 않습니다.TikZ암호. 따라서 어떤 종류의 구성이 있는지 살펴봐야 합니다.잉크스케이프생산하고 있습니다. 내 생각에는 잘 문서화되어 있지 않으므로 살펴 봐야 할 수도 있습니다.잉크스케이프의 소스 코드.

우리에게 예를 든다면TikZ코드가 무엇을 의미하는지 확실히 설명해 드릴 수 있습니다. 그러나 문제에 대한 또 다른 좋은 접근 방식은잉크스케이프의 수출 메커니즘 자체. 이것이 바로 자유 소프트웨어의 아름다움입니다. 물론 이 접근 방식이나 후처리 아이디어에 얼마나 많은 노력이 필요할지는 말씀드릴 수 없습니다.잉크스케이프의 내보내기 루틴의 내부 빌드 및 종류TikZ그것이 생성하는 코드.

답변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}

아직 명령줄 인수를 지정할 수 없습니다. ;출력에 잘못 추가된 추가 줄입니다 . 각도는 둥글게 처리되지 않습니다.

관련 정보