Подтвердить что ты не робот

Как выполнить оболочку script из 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. Возможно ли вообще?

4b9b3361

Ответ 1

Я хотел бы сделать что-то вроде этого (частично мотивировано тем, что предложил Роман): сделать ваш файл LaTeX

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

В 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 characters are allowed here

\input{kmb-box}

%...

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

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

Ответ 5

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

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

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

Ниже приведен фрагмент из одного из моих файлов Makefile:

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

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

\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