2009-06-24 24 views
52

Tôi đang gọi pdflatex từ trong chương trình (C++) của tôi bằng cách sử dụng hệ thống(), không cần phải nói tất cả các pdflatex rác đặt trên màn hình là một chút khó chịu trong trường hợp này.Chạy pdflatex lặng lẽ

Vậy ... làm cách nào để khuyến khích pdflatex bỏ qua các kết quả đầu ra dài? Nó sẽ là tốt hơn nếu chỉ lỗi sẽ được hiển thị ...

+1

Relatex trên tex SE: http://tex.stackexchange.com/questions/27878/pdflatex-bash-script-to-supress-all-output-except-error-messages –

Trả lời

22

Để đơn giản bỏ qua tất cả đầu ra, chuyển hướng pdflatex stdout vào/dev/null:

system("pdflatex yourdocument >/dev/null"); 

Bạn có thể muốn thêm \nonstopmode ngay từ đầu tài liệu của bạn để hướng dẫn tex tiếp tục ngay cả khi gặp lỗi.

Để nhận được thông báo lỗi, đầu ra pdflatex ống cho chương trình của bạn và tìm kiếm lỗi xung quanh các hàng bắt đầu bằng !, ví dụ:

FILE *outputf = popen("pdflatex yourdocument", "r"); 

// ... read and analyze output from outputf ... 

pclose(outputf); 
+2

Tôi không chắc liệu pdflatex có , nhưng nhiều chương trình dòng lệnh ghi vào cả hai stdout (sẽ được capture bởi ">/dev/null") và stderr (mà sẽ không). Để tắt tiếng * cả *, hãy thêm "2> & 1" sau chuỗi hệ thống() hiện có của bạn. –

+2

Ngoài ra: Trên Windows, thiết bị cần thiết chỉ được gọi là "NUL" (chú thích 1 "L"), không phải là "/ dev/null". Phần "2> & 1" hoạt động như đối với * nix. –

+0

Vấn đề với điều này là nếu bạn gặp lỗi, pdflatex dừng lại, chờ đầu vào, nhưng bạn sẽ không bao giờ hiểu nó. Câu trả lời của Robertson sẽ tốt hơn (mặc dù pdflatex vẫn xuất ra một vài dòng) – Shahbaz

61

Thật không may (La) TeX không thực sự tuân theo các quy tắc của stdoutsterr, do (tôi giả sử) để nguồn gốc từ đầu những năm 80. Nhưng có một số thiết bị chuyển mạch bạn có thể gọi để thay đổi lượng thông tin được hiển thị.

Thực hiện latex bằng các công tắc -interaction=nonstopmode hoặc -interaction=batchmode cho hành vi không dừng lại ngay cả trong trường hợp xảy ra lỗi cú pháp. nonstopmode sẽ in tất cả các dòng thông thường, nó sẽ không dừng lại. batchmode sẽ chặn tất cả trừ một số dòng khai báo ("đây là pdfTeX v3.14 ...").

Đây cũng có thể được gọi từ bên trong tài liệu với \batchmode\nonstopmode, nhưng điều này ít hữu ích hơn cho trường hợp bạn mô tả.

+0

Ý bạn là gì bởi "không thực sự tuân thủ các quy tắc của' stdout' và 'stderr'?" Nó có sử dụng các luồng đầu ra khác không? –

+0

@Matthew nó đã được một thời gian kể từ khi tôi nhìn vào điều này, nhưng bộ nhớ của tôi là cố gắng để chuyển hướng chỉ, nói, các thông báo lỗi một nơi nào đó không làm việc ở tất cả. Nhưng tôi có thể bị nhầm lẫn; xin lỗi vì mơ hồ. –

+0

@Matthew Leingang: do tai nạn tôi tìm thấy [Re: silencing latex (chế độ yên tĩnh/hàng loạt)?] (Http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2007-09/msg00520.html); Tôi tin rằng làm rõ? Chúc mừng! – sdaau