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