如何通过变量将 LaTeX 代码传递给 PHP 中的 pdflatex?

How to pass LaTeX code through a variable to pdflatex in PHP?

我试过这个: (.php 文件)

<?php
$texscript = "
\documentclass[12pt,a4paper]{article}
\usepackage{helvet}
\usepackage{times}
\usepackage{multido}
\usepackage{fancyhdr}
\usepackage[hmargin=.8cm,vmargin=1.5cm,nohead,nofoot]{geometry}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}

\fancyhf{} % clear all header and footer fields
\renewcommand{\headrulewidth}{0pt}
\pagestyle{fancy}
%\rhead{{\large\bfseries\thepage}}
\rhead{{\fbox{\large\bfseries\thepage}}}
\setcounter{page}{1}
\multido{}{1383}{\vphantom{x}\newpage}
\end{document}
";

$pdflatex = shell_exec("echo $PATH > myenv; pdflatex ".$texscript." ");
?>

我收到一个错误:

pdflatex : This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015/Debian) (preloaded format=pdflatex) restricted \write18 enabled. ** ! End of file on the terminal...

为什么?

上面给出的代码是在 PHP 变量中编写 LaTeX 并将其传递给 pdflatex 命令的正确方法吗? 如果不是,那么请建议更正! 我不想调用外部 .tex 文件,而是在 PHP 文件本身和 运行 中编写 LaTeX 代码。

转义可能是一部分,另一部分是调用命令pdflatex;我(首先)通过在之前写入文件和(第二)通过替换变量上的注释和换行符来规避,因此 pdflatex 不再有问题......

<?php

error_reporting(E_ALL);
ini_set('error_reporting', E_ALL);

$texscript = '\documentclass[12pt,a4paper]{article}
\usepackage{helvet}
\usepackage{times}
\usepackage{multido}
\usepackage{fancyhdr}
\usepackage[hmargin=.8cm,vmargin=1.5cm,nohead,nofoot]{geometry}
\renewcommand{\familydefault}{\sfdefault}
\begin{document}

\fancyhf{} % clear all header and footer fields
\renewcommand{\headrulewidth}{0pt}
\pagestyle{fancy}
%\rhead{{\large\bfseries\thepage}}
\rhead{{\fbox{\large\bfseries\thepage}}}
\setcounter{page}{1}
\multido{}{1383}{\vphantom{x}\newpage}
\end{document}
';

//write code to file
$fn="texfile.tex";
$myfile = fopen($fn, "w");
fwrite($myfile, $texscript);
fclose($myfile);

//then execute pdflatex with parameter
//didnt need
//echo $PATH > myenv;
$pdflatex = shell_exec('pdflatex ' .$fn .'' );

//var_dump( $pdflatex );
//test for success
if (!file_exists("texfile.pdf")){
    print_r( file_get_contents("texfile.log") );
} else {
    echo "PDF crated from file\n";
}

//trying same without file
//removed comments and newlines
$texscript = preg_replace('/[ \t]*\%.*[ \t]*[\r\n]+/', '', $texscript);
$texscript = preg_replace('/[\r\n]+/', '', $texscript);
//ahve a look on the variable
//var_dump($texscript);

$pdflatex = shell_exec('pdflatex "' .$texscript.'"' );
if (!file_exists("article.pdf")){
    print_r(  file_get_contents("article.log") );
} else {
    echo "PDF created from String\n";
}    

?>

写 tex 文件应该没关系,因为 pdflatex 会写除所需 PDF 之外的文件。

还添加了用于替换 comments/newline 的正则表达式。

我用 php test.php 在 cli 上用 GNU/Linux Debian 8

调用脚本

这会产生输出:

PDF crated from file
string(405) "\documentclass[12pt,a4paper]{article}\usepackage{helvet}\usepackage{times}\usepackage{multido}\usepackage{fancyhdr}\usepackage[hmargin=.8cm,vmargin=1.5cm,nohead,nofoot]{geometry}\renewcommand{\familydefault}{\sfdefault}\begin{document}\fancyhf{}\renewcommand{\headrulewidth}{0pt}\pagestyle{fancy}\rhead{{\fbox{\large\bfseries\thepage}}}\setcounter{page}{1}\multido{}{1}{\vphantom{x}\newpage}\end{document}"
PDF created from String

并且 PDF 文件都可以工作并且具有相同的文件大小:

-rw-r--r-- 1 vv01f vv01f 3360 Mai  5 article.pdf
-rw-r--r-- 1 vv01f vv01f 3360 Mai  5 texfile.pdf