マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

Web 上にあるファイルを \read する件について

\documentclass{minimal}
\newread\file
\newcommand{\content}{}
\begin{document}
\immediate \typeout{here1}
\immediate\openin\file=http://404.org
\immediate \typeout{here2}
\immediate\read\file to \content
\immediate \typeout{here3}
\immediate\closein\file
\content
\end{document}

むむむ、私の環境にはこのコードを実行する能力のある TeX エンジンがインストールされていないようだ……残念無念。((ちなみに、「http://〜」形式のファイル名指定で HTTP 経由でアクセスできる画期的な TeX エンジンでない場合、そのような \openin はそういうパス名の(ローカルのファイルシステム上の)ファイルを開こうとして、当然見つからない。ちなみに、そういう場合の TeX の動作は、開いた直後に既にファイル終端(\ifeof 判定が真)の状態になり、その後の(つまり最初から)\read の対象が端末に振り替えられる。(つまり \read16 と同じ動作になる。)))

そのような貧弱な環境で、同じことを実現しようとすると、一番手っ取り早いのは、コマンド実行の出力をパイプで取り込む方法かな。((ある程度新しい TeX エンジンは「空白を含むパス名」に対応している。ただし、その場合はパス名を " " で囲むというあまり TeX らしくない書式を用いることになる。))

% (pdf)latex -shell-escape が必要
\documentclass{minimal}
\newread\file
\newcommand{\content}{}
\begin{document}
% ※ 読み込みは常に \immediate.
% ※ \typeout は既に \immediate 付きで定義されている.
\typeout{here1}
\openin\file="|curl http://404.org"
\typeout{here2}
\read\file to \content
\typeout{here3}
\closein\file
\ttfamily \content
\end{document}

ただし、これはシェルエスケープの機能((一番有名なのが \write18 でのコマンド単純実行。))を使って curl を実行しているので、LaTeX-shell-escape を付けて実行する必要がある。*1

なお、LuaTeX の socket ライブラリを用いるというネタは使用済みである。

*1:パイプ入出力機能は、pdfTeX の拡張機能であるが、最近の pTeX 系エンジンでもサポートされているようだ。XeTeX や LuaTeX では非サポート。