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 ライブラリを用いるというネタは使用済みである。