Как выполнить сценарий оболочки от ЛАТЕКСА? [закрытый]

Я пытаюсь сделать следующее в ЛАТЕКСЕ:

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

Идея состоит в том, чтобы выполниться /usr/local/bin/my-shell-script.sh во время .tex обработка документов и вводит свой вывод в ЛАТЕКСНЫЙ поток. Действительно ли это возможно вообще?

48
задан Mateusz Piotrowski 20 November 2017 в 08:21
поделиться

5 ответов

Я бы сделал что-то вроде следующего (частично мотивировано предложением Романа): сделайте ваш файл 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 встречает команду, а не ждет, пока страница вывода не будет записана. (См. этот вопрос для получения дополнительной информации о программе отправки.)

47
ответ дан 7 November 2019 в 12:28
поделиться

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

6
ответ дан 7 November 2019 в 12:28
поделиться

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

\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
ответ дан 7 November 2019 в 12:28
поделиться

Если не требуется, чтобы скрипт выполнялся во время работы 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
2
ответ дан 7 November 2019 в 12:28
поделиться

Как указал Дэвид, вы можете использовать \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.

35
ответ дан 7 November 2019 в 12:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: