2010-07-15 4 views
42

Я пытаюсь сделать следующее в LaTeX:Как выполнить сценарий оболочки из LaTeX?

\documentclass{article} 
\begin{document} 
\execute{/usr/local/bin/my-shell-script.sh} 
\end{document} 

Идея заключается в том, чтобы выполнить /usr/local/bin/my-shell-script.sh в момент .tex обработки документов и ввести свой вывод в LaTeX поток. Это вообще возможно?

+1

Смотрите также http://stackoverflow.com/questions/2671079/how-can-i-save- shell-output-to-a-variable-in-latex –

+3

Забавно, как это закрывается как «вне темы». – Orion

ответ

40

Я хотел бы сделать что-то вроде следующего (частично мотивированный b у того, что предложил Roman): сделать файл LaTeX быть

\documentclass{article} 
\begin{document} 
\input{scriptoutput.tex} 
\end{document} 

и сгенерировать файл scriptoutput.tex используя

/usr/local/bin/my-shell-script.sh > scriptoutput.tex 

Вы могли закодировать это в Makefile, если вы хотите, чтобы он запускается автоматически при необходимости. Кроме того, вы можете использовать TeX \write18 command,

\documentclass{article} 
\immediate\write18{/usr/local/bin/my-shell-script.sh > scriptoutput.tex} 
\begin{document} 
\input{scriptoutput.tex} 
\end{document} 

, и я думаю, что будет автоматически запускать сценарий оболочки каждый раз, когда вы компилируете документ. \immediate необходим, чтобы убедиться, что сценарий запущен, когда LaTeX встречает команду, а не ждет, пока не будет написана страница вывода. (См this question больше на рутине shipout.)

+0

Ваше решение, безусловно, более чистое, чем мое. Мое удобно, если у вас много заметок. –

+2

+1 для идеи makefile – Gabe

+0

David, большое спасибо, это именно то, что я искал! – yegor256

-1

Я не думаю, что это возможно. Для этого я бы использовал простой препроцессор. То есть изменить документ

\documentclass{article} 
\begin{document} 
%%OUTPUT%% 
\end{document} 

и предобработки его с

#!/usr/bin/perl -lp 
BEGIN { $output = `/usr/local/bin/my-shell-script.sh`; } 
s/%%OUTPUT%%/$output/g; 

Команда:

perl so.pl template.tex > preprocessed.tex 

или на месте:

perl -i so.pl template.tex 
1

Если это не является обязательным, что скрипт запускается во время LaTeX работает я бы рекомендовал только с помощью make запустить LaTeX и вам сценарий.

Я использовал этот подход, чтобы добавить подсчет слов для статей и включить статистику по библиографическим ссылкам.

Пусть ваш скрипт сгенерирует файл .tex и включит его в исходный файл LaTeX.

Ниже приведен отрывок из одного из моих Makefiles:

TEX = /usr/texbin/pdflatex 
PREVIEW = /usr/bin/open 

REPORT = SimMon 
REPORT_MASTER = $(REPORT).tex 

TEX_OPTIONS = -halt-on-error 

SimMon: $(REPORT_MASTER) countRefferedPages 
    $(TEX) $(TEX_OPTIONS) $(REPORT_MASTER) 
    @$(PREVIEW) $(REPORT).pdf 

countRefferedPages: BibTeXPageCount 
    cat *.tex | support/BPC/build/Debug/BPC Castle.bib > litteraturTotal.tex 
6

Вы можете сделать это в TeX. В этом paper (PDF) показано, как писать и запускать вирус в TeX. Те же принципы применяются для выполнения сценария оболочки. Однако, на мой взгляд, более практично писать Makefile, который выполняется до запуска LaTeX и вставляет результат.

28

Как указал Дэвид, вы можете использовать \write18 для вызова внешних программ, затем \input результирующий выходной файл. Однако вы, вероятно, захотите использовать \immediate\write18, чтобы убедиться, что сценарий выполнен до вызова \input.

В качестве альтернативы, если вы используете новые версии PDF (ла) текс (после 1.40, я думаю), вы можете перенаправить вывод непосредственно в документ, используя водопроводную команду ввода:

\documentclass{article} 
\begin{document} 
\input{|"/usr/local/bin/my-shell-script.sh"} 
\end{document} 

Для либо вам нужно будет включить внешние вызовы программ. Для дистрибутивов TeXlive вам необходимо позвонить латекс с опцией -shell-escape, или для MikTeX, я считаю, что опция -enable-write18.

2

В Ubuntu 11.10 GNU/Linux

pdflatex --enable-pipes --shell-escape mytexfile 

с

... 
[This section currently is 
\input{|"wc kmb-box.tex| tr -s ' ' | cut -d' ' -f 4"} 
/2000 allowed characters] 

\input{kmb-box} 

... 

работает хорошо. т.е. используется wordcount (wc), чтобы сообщить, сколько символов находится в файле kmb-box.tex, который является частью (включенным) в документ.

(кстати Если вы хотите слова, а не символы, просто измените число в «-f 4»)

+0

Я получаю ошибки при переключении команды на «ls». Есть проблема с новыми строками в выводе команды? –

Смежные вопросы