php中的LaTeX执行和路径问题

php中的LaTeX执行和路径问题,php,latex,path,exec,Php,Latex,Path,Exec,我正在尝试使用exec从php编译一个latex源文件: echo shell_exec("/usr/texbin/pdflatex source.tex"); 不幸的是,当通过php调用latex时,它似乎看不到所有的包 例如,我 LaTeX Error: File `customclass.cls' not found 当我尝试使用安装在本地texmf文件夹中的customclass时。其他地方安装的某些软件包也存在同样的问题 这当然与路径变量或类似的设置有关,但我已经一个小时没找到什么

我正在尝试使用
exec
从php编译一个latex源文件:

echo shell_exec("/usr/texbin/pdflatex source.tex");
不幸的是,当通过php调用latex时,它似乎看不到所有的包

例如,我

LaTeX Error: File `customclass.cls' not found
当我尝试使用安装在本地
texmf
文件夹中的
customclass
时。其他地方安装的某些软件包也存在同样的问题

这当然与路径变量或类似的设置有关,但我已经一个小时没找到什么了


有人有想法吗?

PHP解释器可能是以其他用户的身份运行的,比如www数据或其他相关的东西:这意味着它看不到安装在您通常用户的texmf目录中的包(我假设这就是您所说的本地),因为只有当pdflatex作为该用户运行时,才会加载用户的texmf


这似乎是一个潜在的解决方案,可以根据shell变量(来自TeX FAQ)将LaTeX路径扩展到本地texmf所在的任何位置。

PHP解释器可能作为其他用户运行,如www数据或相关内容:这意味着它看不到安装在您通常用户的texmf目录中的包(我假设这就是您所说的本地),因为只有当pdflatex作为该用户运行时,才会加载用户的texmf


这似乎是一个潜在的解决方案,可以根据shell变量(来自TeX FAQ)将LaTeX路径扩展到本地texmf所在的任何位置。

您可以将*.cls文件放入与source.TeX相同的目录中。如果,启动latex时,latex解释器也会找到它,并用于编译latex文件

这也是与php一起使用的一个更好的解决方案,因为您不想让应用程序的用户将某些内容安装到www data user的主目录中。出于安全原因,这可能被禁止

因此,解决方案是:

  • 将source.tex放入名为latexfiles(或您选择的名称)的目录中
  • 将*.cls文件放到最新的文件中
  • 使用以下代码编译latex文档:

您可以将*.cls文件放在与source.tex相同的目录中。如果在启动latex时将目录更改为“当前目录”,则latex解释器也会找到该目录并用于编译latex文件

这也是与php一起使用的一个更好的解决方案,因为您不想让应用程序的用户将某些内容安装到www data user的主目录中。出于安全原因,这可能被禁止

因此,解决方案是:

  • 将source.tex放入名为latexfiles(或您选择的名称)的目录中
  • 将*.cls文件放到最新的文件中
  • 使用以下代码编译latex文档:

/Users/My/Sites/tex/index.php
文件的源代码如下。例如,让
http://localhost/~My/tex/index.php
链接

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>PDF file compillation</title>
</head>
<body>
<?php 
ini_set('safe_mode', 'Off');
$output = array();
/*
   /usr/texbin/ - directory, where the pdftex exists
   /Users/My/Sites/tex/output - directory for test.pdf and everything else. This directory have to have permissions to write.
   /Users/My/Sites/tex/test.tex - source .tex file
*/
exec("/usr/texbin/pdftex --shell-escape --synctex=1 -output-directory=/Users/My/Sites/tex/output /Users/My/Sites/tex/test.tex", $output);
if($output){
    echo("<h3>Console output</h3><pre>".implode("\n", $output)."</pre>");
/*
    /Users/My/Sites/tex/output/test.pdf - the result file after compilling
*/
    echo('<p>Go to compilled <a href="http://localhost/~My/tex/output/test.pdf">PDF file</a></p>');
}else{
    echo('<h3>Error</h3><p>Shell script execution failed.</p>');
}
?>  
</body>
</html>

PDF文件编译

下面是
/Users/My/Sites/tex/index.php
文件的源代码。例如,让
http://localhost/~My/tex/index.php
链接

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <title>PDF file compillation</title>
</head>
<body>
<?php 
ini_set('safe_mode', 'Off');
$output = array();
/*
   /usr/texbin/ - directory, where the pdftex exists
   /Users/My/Sites/tex/output - directory for test.pdf and everything else. This directory have to have permissions to write.
   /Users/My/Sites/tex/test.tex - source .tex file
*/
exec("/usr/texbin/pdftex --shell-escape --synctex=1 -output-directory=/Users/My/Sites/tex/output /Users/My/Sites/tex/test.tex", $output);
if($output){
    echo("<h3>Console output</h3><pre>".implode("\n", $output)."</pre>");
/*
    /Users/My/Sites/tex/output/test.pdf - the result file after compilling
*/
    echo('<p>Go to compilled <a href="http://localhost/~My/tex/output/test.pdf">PDF file</a></p>');
}else{
    echo('<h3>Error</h3><p>Shell script execution failed.</p>');
}
?>  
</body>
</html>

PDF文件编译

我曾尝试使用这些path变量,但未能使其工作……对于带有
putenv(“TEXINPUTS=/path to/texmf/”;echo shell_exec(“/usr/texbin/pdflatex source.tex”)的eaemple
LaTeX再也找不到
source.tex了……putenv是否覆盖了以前在TEXINPUTS中的内容?对不起,我对PHP不太熟悉,putenv文档也没有说。如果是这样,默认情况下可能会有一个.in TEXINPUTS,而将其设置为putenv会覆盖它?我已经尝试过使用这些路径变量,但我没有这样做过能够让它工作…对于带有
putenv(“TEXINPUTS=/path to/texmf/”)的eaemple;echo shell_exec(“/usr/texbin/pdflatex source.tex”)
LaTeX再也找不到
source.tex
了……putenv是否覆盖了以前在TEXINPUTS中的内容?对不起,我对PHP不太熟悉,putenv文档也没有这样说。如果是,默认情况下可能会有一个.in TEXINPUTS,而将其设置为putenv会覆盖它?