備忘録やめた

備忘録として使用していたけどやめた.このブログに載せてあるコードのライセンスは別途記載がない限りWTFPL OR NYSLです.

LaTeXのソースコードのコンパイル時にbashスクリプトを走らせる

この記事は,UEC2 Advent Calendar 2020の一日目の記事です.

はじめに

レポート作成中に,結果やコードの誤りに気付いて,コードを修正して,コンパイルして,実行して,結果を修正する,というプロセスを改善します.コードの修正は自分で行ないますが,それ以降のコンパイル等をLaTeXコンパイルの際に同時に行ないます.

使うもの

bashfulというパッケージを使います.以下のusepackage文を記述してください.

\usepackage{bashful}

尚,Gentooでは2020年11月30日現在,dev-texlive/texlive-latexextraemergeすればインストールされます.

%e-file bashful.sty
[I] dev-texlive/texlive-latexextra
    Available Versions: 2016 2017 2019-r2 2020 2020-r1 2020-r2 
    Last Installed Ver: 2020-r2(20201021161627秒)
    Description:        TeXLive LaTeX additional packages
    Matched Files:      /usr/share/texmf-dist/tex/latex/bashful/bashful.sty; 

使い方

\documentclass[dvipdfmx,uplatex,a4j,12pt]{jsarticle}
\usepackage{listings}
\usepackage{bashful}
\lstset{%
    basicstyle={\ttfamily\small},
    commentstyle={\ttfamily\small},
    frame=tb,
    breaklines=true,
    lineskip=-0.5ex,
    tabsize=2,
    numbers=left,
    numberstyle={\ttfamily\scriptsize},
    columns=[1]{fullflexible},
}
\begin{document}

\title{\LaTeX Example}
\author{\LaTeX \LaTeXe \pLaTeX \upLaTeX}
\maketitle

\lstinputlisting[caption=main.rs]{main.rs}

\bash[stdoutFile=stdout.tex,stderrFile=/dev/null]
rustc main.rs
./main
\END

\lstinputlisting[caption=stdout]{stdout.tex}

\end{document}

f:id:tokuchan3515:20200806234820p:plain
出力例

こんな感じに,出力を貼り付けることが出来ます.ソースコードを編集すると,LaTeXコードのコンパイル時に再度プログラムが実行され,出力が自動で更新されます.*1

仕組み

コンパイル時に,\bash\ENDで囲まれた間のシェルスクリプトが実行され,指定されたファイルに標準出力が書き込まれます.それをlstinputlistingを使って貼り付けるだけです.

*1:画像ではPDFが三ヶ月前に出力されたものとなっていますが,これは,僕がこの記事を3ヶ月前に書き,結局公開せず放置していたものを,アドベントカレンダーに登録するために使用したからです.2020年11月30日現在もこのLaTeXコードをコンパイルすると同じPDFが得られます.