我正在尝试使用模拟从 ASP.NET Web 应用程序运行 pdflatex 或 lualatex。标准输出和标准错误流正在被重定向,我正在将其内容保存到日志文件中。
问题是,要么pdflatex
在lualatex
创建零大小chart.log
文件后停止,要么无法完成编译。我只能从任务管理器中杀死它们。
这就是最终在标准输出日志中的内容:
This is LuaTeX, Version beta-0.76.0-2013062820 (rev 4627)
\write18 enabled.
(D:/Project1/Latex/chart.tex
最后一行显示文件名,就是这样。
但是,当我运行相同的命令行,但不使用模拟,而是向 Process 类提供域、用户名和密码时,它运行良好,生成 PDF。不幸的是,模拟强加于我。
为了查看这是否与我的代码有关,或者与 pdflatex/lualatex 有关,我尝试运行一个简单的命令行程序,该程序仅将一些文本输出到 stdout,并且运行良好。然后我尝试运行 7zip 进行压缩chart.tex
,它也生成了chart.7z
文件。听起来根本原因在pdflatex
或lualatex
程序中的某个地方,除非我遗漏了什么。
程序的调用方式如下:
Dim p As Process = New Process()
Try
p.StartInfo.FileName = ConfigurationManager.AppSettings("PDFLaTeXPath")
p.StartInfo.WorkingDirectory = "D:\Project1\Latex"
p.StartInfo.Arguments = " --shell-escape -interaction=nonstopmode D:\Project1\Latex\chart.tex 1>nul 2>nul") ' Tried with and w/o redirecting
p.StartInfo.UseShellExecute = False
p.StartInfo.RedirectStandardOutput = True
p.StartInfo.RedirectStandardError = True
ImpersonatingContextWrapper.impersonateValidUser( _
ConfigurationManager.AppSettings("RunAsUser"), _
ConfigurationManager.AppSettings("RunAsDomain"), _
ConfigurationManager.AppSettings("RunAsPassword") _
)
p.Start()
Dim output As String = p.StandardOutput.ReadToEnd()
If Not String.IsNullOrEmpty(output) Then
My.Computer.FileSystem.WriteAllText("D:\Project1\Latex\stdout.txt", output, True)
LogEvent(output, EventLogEntryType.Information)
End If
Dim errors As String = p.StandardError.ReadToEnd()
If Not String.IsNullOrEmpty(errors) Then
My.Computer.FileSystem.WriteAllText("D:\Project1\Latex\stderr.txt", errors, True)
LogEvent(errors, EventLogEntryType.Warning)
End If
p.WaitForExit()
Catch ex As Exception
LogEvent("Error running PDFLaTeX compiler: " & ex.Message, EventLogEntryType.Error)
Return False
Finally
ImpersonatingContextWrapper.undoImpersonation()
End Try
编辑:
感谢 Sean 的评论,很明显,TEX 文件中的某些内容导致了挂断,因为当我给它一个文件
\documentclass{letter}
\begin{document}
abc
\end{document}
它产生了很好的结果。但是当我运行下面的文件时,它挂了:
\documentclass[border=10pt]{standalone}
\begin{document}
abc
\end{document}
因此standalone
,我需要能够生成非常大的文档并打印在多页上的类,这是根本原因之一。进一步的实验发现,加载任何包都会导致挂断。MikTex 是否正在尝试再次下载包并等待确认,即使我在已经下载包的自己的帐户下运行它?
答案1
肖恩的评论有助于发现,MikTex 的 lualatex 正在尝试下载这些软件包,即使这些软件包之前已经安装好了。
进入 MikTex 设置(管理)程序并将“询问”更改为“是”以动态安装软件包,然后再次运行编译,解决了挂断问题并生成了一个文件。