Я пытаюсь сделать следующее в ЛАТЕКСЕ:
\documentclass{article}
\begin{document}
\execute{/usr/local/bin/my-shell-script.sh}
\end{document}
Идея состоит в том, чтобы выполниться /usr/local/bin/my-shell-script.sh
во время .tex
обработка документов и вводит свой вывод в ЛАТЕКСНЫЙ поток. Действительно ли это возможно вообще?
Я бы сделал что-то вроде следующего (частично мотивировано предложением Романа): сделайте ваш файл LaTeX размером
\documentclass{article}
\begin{document}
\input{scriptoutput.tex}
\end{document}
и сгенерируйте файл scriptoutput.tex
, используя
/usr/local/bin/my-shell-script.sh > scriptoutput.tex
. Вы можете закодировать это в makefile, если вы хотите, чтобы он запускался автоматически при необходимости. В качестве альтернативы вы можете использовать команду TeX \ write18
,
\documentclass{article}
\immediate\write18{/usr/local/bin/my-shell-script.sh > scriptoutput.tex}
\begin{document}
\input{scriptoutput.tex}
\end{document}
, и я думаю, что она автоматически запускает сценарий оболочки каждый раз, когда вы компилируете документ. \ немедленный
необходим для обеспечения того, чтобы сценарий запускался, когда LaTeX встречает команду, а не ждет, пока страница вывода не будет записана. (См. этот вопрос для получения дополнительной информации о программе отправки.)
Это можно сделать в TeX. В этой статье (PDF) показано, как написать и запустить вирус в TeX. Те же принципы применимы для выполнения сценария оболочки. Однако, на мой взгляд, более практично написать Makefile, который запускается перед запуском LaTeX и вставляет результат.
Я не думаю, что это возможно. Я бы использовал для этого простой препроцессор. Т.е. измените документ на
\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
Если не требуется, чтобы скрипт выполнялся во время работы 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
Как указал Дэвид, вы можете использовать \write18
для вызова внешних программ, а затем \input
результирующего выходного файла. Однако вы, вероятно, захотите использовать \immediate\write18
, чтобы убедиться, что скрипт будет выполнен до вызова \input
.
В качестве альтернативы, если вы используете более новые версии pdf(la)tex (после 1.40, я думаю), вы можете направить вывод непосредственно в документ, используя команду piped input:
\documentclass{article}
\begin{document}
\input{|"/usr/local/bin/my-shell-script.sh"}
\end{document}
Для любого из этих методов вам потребуется включить вызов внешних программ. Для дистрибутивов TeXlive вам нужно вызвать latex с опцией -shell-escape
, или для MikTeX, я думаю, опция -enable-write18
.