
當我將svg
文件從 inkscape 匯出到 TikZ 時,結果通常很大,而且不太可讀。我想編寫一個 perl 腳本來對輸出進行後處理。該腳本應該能夠:
- 決定哪些數字是 x 座標和 y 座標
- 將 x 座標乘以給定常數
- 將 y 座標乘以給定常數
- 將座標四捨五入為其他常數的最接近的倍數
例如,如果不需要的話,這可以用來去掉四位小數,並且yscale=-1
可以將其刪除。
什麼正規表示式會選擇座標和控制點?
如果座標和控制點乘以一個常數,所得圖片是否會縮放(和/或拉伸)?還是會發生我無法預見的事?
其他想法和建議表示讚賞。
編輯:
感謝您的回答,但鄙視關於我需要解析 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}
尚無法給予命令列參數。;
在輸出中錯誤地添加了額外的行。角度不是圓角的。