首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从perl脚本调用pdflatex (由于编码?)

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

Stack Overflow用户
提问于 2016-02-02 00:53:34
回答 1查看 173关注 0票数 0

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

代码语言:javascript
复制
system("pdflatex $fileName");

。。结果:

代码语言:javascript
复制
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上的“文件”-command告诉我这个文件被编码为"us-ascii“。因此,我尝试让perl将其编码为"utf-8",但不起作用:

代码语言:javascript
复制
open(FH, "> :encoding(utf-8)", $fileName);

代码语言:javascript
复制
binmode(FH, ":utf8");

文件仍在使用us-ascii编码生成。我如何才能改变这一点?

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

EN

回答 1

Stack Overflow用户

发布于 2016-07-19 20:18:26

如果这在手动输入命令行时运行良好,这可能是由于perl在将命令传递给系统之前插入引号的方式所致。你有没有试过打印你发出的调用,以测试它是否提供了与手动输入完全相同的输入?否则,为了通过perl中的系统命令将参数传递给程序,我总是将它们分开,如下所示,以避免任何插值错误:

代码语言:javascript
复制
#...
my $prog = "Z.*";
my $arg1 = "X";
my $arg2 = "Y";
#...
my $file = "W.*";
system("$prog", ("$arg1", "$arg2", ..., "$file"));
#...

如果这不起作用,另一个解决方案可能是将文件内容导入到一个变量中,然后尝试用perl‘手动’编码它,如下所示:

代码语言:javascript
复制
use Encode;
use utf8;
use charnames qw( :full :short );

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

如果您碰巧在文件中有任何活动字符,这可能会影响pdflatex处理最终输出的方式(例如,在perl \ gives \ to pdflatex中,最终结果是),您可以将以下内容附加到编码中:

代码语言:javascript
复制
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;
}

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35135943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档