无法从perl脚本调用pdflatex(由于编码?)

时间:2016-02-01 16:53:34

标签: perl encoding pdflatex

当我从windows命令行手动调用pdflatex时,它会生成所需的pdf。 当我从perl脚本调用pdflatex时,它不会:

system("pdflatex $fileName");

..结果

Sorry, but pdflatex did not succeed.

You may want to visit the MiKTeX project page, if you need help.
utf8 "\x80" does not map to Unicode at C:/strawberry-perl/perl/site/lib/Encode.pm line 200.

该脚本之前在unix上运行并正常运行。现在,在将其迁移到Windows系统后,它并没有。 tex-input-file的内容也由脚本生成。我的Mac上的"文件" - 命令告诉我该文件被编码为" us-ascii"。 因此我尝试将perl编码为" utf-8",但它不起作用:

open(FH, "> :encoding(utf-8)", $fileName);

binmode(FH, ":utf8");

仍然使用us-ascii编码生成文件。我怎么能改变它?

到目前为止,编码是我唯一的线索。 还有什么可能是问题?

1 个答案:

答案 0 :(得分:1)

如果在手动输入命令行时这可以正常工作,这可能是由于perl在将命令传递给系统之前插入引号的方式。您是否尝试打印您打的电话以测试它是否提供与手动输入时完全相同的输入?否则,为了通过perl中的系统命令将参数传递给程序,我总是按如下方式将它们分开,以避免任何插值错误:

#...
my $prog = "Z.*";
my $arg1 = "X";
my $arg2 = "Y";
#...
my $file = "W.*";
system("$prog", ("$arg1", "$arg2", ..., "$file"));
#...

如果这不起作用,另一个虽然相当笨重的解决方案可能是将文件内容导入变量并尝试以下内容在perl中“手动”编码,如下所示:

use Encode;
use utf8;
use charnames qw( :full :short );

my $encodedfile = encode("utf8", $filecontents);

如果你碰巧在文件中有任何活动的caracters可能会影响pdflatex处理最终输出的方式(例如在perl \\ give \ to pdflatex,最终结束),你可以将以下内容添加到编码中:

my $str = $encodedfile;
my $find = "\\N{U+005C}";
my $replace = "\\textbackslash ";
$str =~ s/$find/$replace/g;

my %special_characters;
$special_characters{"\\N{U+0025}"} = "\\pourcent ";
$special_characters{"\\\$"} = "\\\$";
$special_characters{"\\N{U+007B}"} = "\\{";
$special_characters{"\N{U+007D}"} = "\\}";
$special_characters{"\N{U+0026}"} = "\\&";
$special_characters{"\\N{U+005F}"} = "\\textunderscore ";
$special_characters{"\\N{U+002F}"} = "\/";
$special_characters{"\\N{U+005B}"} = "\[";
$special_characters{"\\N{U+005D}"} = "\]";
$special_characters{"\\N{U+005E}"} = "\\textasciicircum ";
$special_characters{"\\N{U+0023}"} = "\\#";
$special_characters{"\\\N{U+007E}"} = "\\textasciitilde ";
$special_characters{"\\\N{U+0021}"} = " \\newline ";

my $string = $str;
foreach my $char (keys %special_characters) {
  $string =~ s/$char/$special_characters{$char}/g;
}

希望这有帮助。