1

我有一个程序,我正在一个一个地创建大量 LaTeX 文件。在创建这些 LaTeX 文件以检查它们是否可以实际编译为 .pdf 文件时,这一点很重要。

为此,它使用subprocess.call(['pdflatex', '-halt-on-error', tex_file_name]).

0从 a.tex到 a的成功编译返回.pdf,否则返回 1。

我遇到的问题是,这行代码没有做我认为应该做的唯一情况是在py.test运行它时。如果我从解释器运行此代码,或从命令行运行脚本,它就可以工作。但 py.test 没有。

发生错误时py.test,它会留下一个由 创建的日志文件pdflatex,其中包含以下错误:

{c:/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map
!pdfTeX error: pdflatex.exe (file c:/texlive/2012/texmf-var/fonts/map/pdftex/up
dmap/pdftex.map): fflush() failed (Bad file descriptor)
 ==> Fatal error occurred, no output PDF file produced!

我在这里冒险猜测在能够编译它之前对文件做py.test一些事情。但我不知道是什么。.texpdflatex

py.test 文档中讨论了临时文件和目录。我不知道它们是否与我的问题有关,但我只是简单地玩过它们。

如果您想查看代码,测试用例如下所示:

from a import Foo
from b import Tree
from latex_tester import latex_tester


def test_Foo():
    q1 = foo.Foo()
    latex_tester(Tree(1, q1))

和 latex_tester 看起来像这样:

import uuid
import os
import subprocess


def latex_tester(tree):
    """ Test whether latex is compilable to a PDF.

    """ 

    full_path = r'some_path'
    uid = str(uuid.uuid1())

    file_name = os.path.join(full_path, 'test' + uid + '.tex')

    with open(file_name, 'w') as f:
        _write_tree(f, tree)

    retcode = subprocess.call(['pdflatex', '-halt-on-error', file_name])
    if retcode != 0:
        raise RuntimeError("This latex could not be compiled.")
4

2 回答 2

1

奇怪的是,使用 'xelatex' 而不是 'pdflatex' 可以让一切正常工作。

对于任何未来的读者——我安装了 TeXworks,大概安装了这两个工具。我不知道 xelatex 是否会影响最终生成的 pdf。它似乎产生了一个很好的 .pdf

无论如何,我对自己的问题做出了这个回答,因为似乎没有其他任何事情发生,它肯定解决了我的问题。

于 2013-09-09T03:14:51.113 回答
1

我有完全相同的问题。

我使用 C# 作为创建 .tex 文档的编程语言,当我将图像包含到 pdf 中时,它在 pdflatex 期间崩溃。

如果我手动启动它,它会起作用......

错误:

pdfTeX warning: pdflatex
!pdfTeX error: pdflatex (file <linktoFile>/file.pdf): fflush() failed (Bad file descriptor)

不幸的是 xelatex 也不起作用,所以我搜索并最终偶然发现了它。

基本上这个错误发生在我身上:

string tex = tex.Replace("\uFFFD\uFFFDMEMNAME\uFFFD\uFFFD", user.Surname)

这里 user.Surname 为空。

当 tex 字符串被保存到文件中时,它会神秘地记住 null 和 pdflatex 在完全不同的地方崩溃。另一方面,如果您再次手动在同一文件上启动 pdflatex,则 null 消失并且它可以工作。

当我输入姓氏时,整个混乱都消失了,现在它可以在程序中使用。

也许这会帮助有同样问题的人。

于 2014-06-04T09:31:29.340 回答