
私はUnixのコマンドラインを使ったチュートリアルの教材(PDF)を準備しています。自動化を目指しているので(怠惰と呼ぶ人もいます)、\write18
(--shell-escape
)とverbatim
パッケージを使って、次のようなことができる小さなパッケージを作成しました。
- コマンドを実行する(例
ls
)コマンドその間私の.tex
文書を編集し、私の文書にタイプセットします。 - 結果
stdout
をstderr
外部ファイルにリダイレクトし、 - ドキュメントに
stdout
と をタイプセットするために、これらの外部ファイルを入力します。stderr
.tex
しかし、私の理解では、 の各呼び出しは\write18
独自のシェルセッションを開いたり閉じたりするようです。これは残念なことです。なぜなら、いくつかの変更とコードの重複が必要になるからです。特に、
- あるセッション中に定義されたすべてのシェル変数は次のセッションでは使用できません。
- 前のコマンドの終了時にいたのと
cd
同じディレクトリに戻るには、各コマンドの開始時に同じディレクトリに移動する必要があります。\write18
\write18
下の私のおもちゃの例をご覧ください。
実行中にシェルを操作しながら、ある呼び出しから次の呼び出しまでpdflatex
シェル セッションを開いたままにする方法はありますか? または、私のニーズに合ったより良い方法はありますか?\write18
\documentclass{article}
\usepackage{lipsum}
\begin{document}
First, initialise the repository.
% pretend that the following is an environment that both
% - runs commands at the CL
% - typesets them in the .tex document
\immediate\write18{%
cd $HOME/Desktop;
mkdir myrepo;
cd myrepo;
git init;
}
Let's see what git has to say...
\immediate\write18{%
# I'm back in $HOME :(
# I have to cd to $HOME/Desktop/myrepo, here, but I'd like to avoid it...
cd $HOME/Desktop/myrepo;
git status
# ...
}
\end{document}
答え1
\documentclass{article}
\begin{document}
\immediate\write18{echo pwd > /tmp/zzpipe}
\texttt{\input{result.txt}}
\immediate\write18{echo cd > /tmp/zzpipe}
\immediate\write18{echo pwd > /tmp/zzpipe}
\texttt{\input{result.txt}}
\immediate\write18{echo 'FOO=wibble' > /tmp/zzpipe}
\immediate\write18{echo 'echo FOO is $FOO' > /tmp/zzpipe}
\texttt{\input{result.txt}}
\end{document}
a) コマンドを受け入れるための「サーバー」を設定します。私は名前付きパイプを使用します。
$ cd /tmp
$ mkfifo zzpipe
$ while true ; do eval `cat /tmp/zzpipe` >/tmp/result.txt ; done
次に、上記の tex ファイル (in/tmp
または arrangement がresult.txt
他の場所に書き込まれている) を実行すると、出力は次のようになります。
これは、cygwin bash を使用した Windows の場合です。他のコマンドラインも同様ですが、異なる引用規則が必要になる場合があります。また、ご覧のとおり、 とcd
の設定は、FOO
1 つの書き込みから別の書き込みに引き継がれます。
答え2
基本的なbashサポートを追加しましたpythontex
...20行未満のコードで済みました。これを使用するには、最新バージョンが必要です。GitHubpythontex
実行する必要がある新しい bash コードがある場合は、常に標準の 3 ステップ コンパイルを使用する必要があります(LaTeX の実行、PythonTeX スクリプトの実行、LateX の実行)。実行する必要がある新しいコードがない場合は、LaTeX を単独で実行できます。これは を使用しないため\write18
、シェル エスケープは必要ありません (コードの実行は PythonTeX スクリプトによって処理されます)。
すべて正常に動作しているようですが、バグが見つかった場合はお知らせください。エラー行番号は、実行されるコードの行番号と正しく同期されている必要があります。
以下にサンプル ドキュメントを示します。出力は以下のとおりです。 はデフォルトでそのまま実行されるため、 (または同等の)\stdoutpythontex
のように形式を指定する必要はありません。\printpythontex
\stdoutpythontex
\documentclass{article}
\usepackage[makestderr, usefamily=bash]{pythontex}
\setpythontexfv{numbers=left, firstnumber=last}
\begin{document}
A block of bash...
\begin{bashblock}
myvar="myvar's value"
echo $myvar
\end{bashblock}
...with output:
\printpythontex[verbatim]
Another block, accessing the previous variable...
\begin{bashblock}
echo "In another LaTeX environment later on..."
echo $myvar
\end{bashblock}
...with output:
\printpythontex[verbatim]
A block with an error.
\begin{bashblock}
echo "In another LaTeX environment later on..."
echo $myvar
lsERROR
\end{bashblock}
Stdout:
\printpythontex[verbatim]
Stderr:
\stderrpythontex
\end{document}