TeX処理自動化」タグアーカイブ

TeXConf 2019向けのClutTeX発表資料

これは TeX & LaTeX Advent Calendar 2019 の10日目の記事です。9日目は munepi さんの ぼくのかんがえたさいきょうのLaTeX索引スタイルファイル でした。11日目は doraTeX さんです。

10月に予定されていたTeXConf 2019 が残念ながら台風によって中止になってしまいました。そこで、この記事では TeX 言語で台風の進路を制御する方法……ではなく、 TeXConf 2019 の発表で使う予定だった資料の供養をします。

続きを読む

TeXにとってやばい入力ファイル名

空白や記号類を名前に含むファイル名をTeXで処理させようとすると、うまく処理できないことがある。

例えば foo%bar.tex というファイルを latex foo%bar.tex のような感じでLaTeXに処理させようとすると、 % 以下の部分がコメント扱いされ、LaTeXは代わりに foo(.tex) というファイルを処理しようとする。

目次

やばい名前のファイルを難しいことを考えずに処理できればいい方へ

8月中にリリースされる ClutTeX v0.4 を使って cluttex -e latex foo%bar.tex とすれば良い。

どういうファイル名がやばいのか、ClutTeX v0.4はどのように問題を解決するのか知りたい方へ

例によって結論に至るまでの経過をくどくど書いているので、結論だけ知りたい方は適当に読み飛ばすことをお勧めする。

続きを読む

技術書典6に、ClutTeX(LaTeX文書処理自動化ツール)の本を出します

4月14日(日曜日)に池袋で開催される技術同人誌即売会「技術書典6」に、「だめぽラボ」としてサークル参加します。

技術書典6(公式サイト)

サークル詳細 | だめぽラボ | 技術書典 ←気になる方はサークルチェックリストに入れてください

サークル(だめぽラボ)としてのページ:https://lab.miz-ar.info/

日時と場所について

公式サイトより:

日時 2019/04/14 (日) 11:00〜17:00
場所 池袋サンシャインシティ2F 展示ホールD(文化会館ビル2F)
主催 TechBooster/達人出版会
一般参加は11時~13時のみ有料

https://techbookfest.org/event/tbf06

当サークルの配置は か15 です。

頒布物について

筆者が作っているLaTeX処理自動化ツール「ClutTeX」についての本を出します。

利用ガイドの他に、LaTeX処理の自動化に関する知見を詰め込んでいます(第3章)。そのため、単なるマニュアル以上の価値があるかと思います。

この他、既刊「代数的数を作る 根と因数分解のアルゴリズム」のダウンロードカードも販売します(紙の本は販売しません。紙の本は見本として置きます)。なお、既刊は BOOTH でも購入可能です: https://damepo-lab.booth.pm/items/1051034

さらに、新刊または既刊をお買い上げの方に、「だめぽラボステッカー」を配布します!今回の技術書典で購入してくださった方のほか、過去に技術書典またはBOOTHで既刊をお買い上げくださった方も対象です。その際はその旨をお伝えください(感想もあれば嬉しいです)。

LaTeX処理自動化ツール ClutTeX をリリースした

2年ほど前からマイペースで作っていたLaTeX処理自動化ツールClutTeXだが、ある程度の機能が整ったと判断し、バージョン0.1をリリースした。ClutTeXに関しては2年前にもブログ記事で紹介したが、初のリリースを迎えた今、改めてその機能と使い方を紹介する。 続きを読む

TeXのターミナル出力がうるさい件

TeX文書をターミナルで処理させると、ターミナルに大量の出力が表示させる。

そのうち(パッケージ開発者ではない)一般ユーザーにも有益なものはほんのわずか(Undefined referenceとかOverfull hboxとか)で、大半は価値のない文字列である。一般人というのは「大量のメッセージが表示される」→「解読するのが面倒なので読まない」という思考回路で動く[要出典]ので、価値のない文字列が大量に表示されるのは有害である。(一般人はターミナルではなくTeXworksとかの統合環境を使うのでターミナルにどれだけ文字列が表示されようと関係ない、という説はある)

そこで、TeX文書の処理時に表示される文字列がなるべく少なくなるようにするにはどうしたらいいか考えよう。

なお、-interaction=batchmodeを指定すれば当然ターミナルに表示される文字列は減るが、しかしそれでは有益な情報も表示されなくなるし、何よりエラー時のメッセージもターミナルに表示されなくなってしまうので、-interaction=batchmode以外のモードで表示文字列を減らすことを考える。 続きを読む

LuaTeX における外部コマンド実行とログ出力

前置き

LuaTeX 以前の TeX 処理系では \write18 によって TeX 文書中から外部コマンドを実行できた。しかし、 LuaTeX では Lua の機能 (os.execute) によって外部コマンドの実行ができるため、現在の LuaTeX からは \write18 による外部コマンド実行機能は削除されている。

詳しくは以下のブログ記事を参照されたい:

新しい LuaTeX だって \write18 したい – マクロツイーター

対策 (2) :外部コマンドが実行されない → shellesc パッケージ!

要するに、 shellesc パッケージを使えば \write の定義が書き換えられて、従来の \immediate\write18 がそのまま動く。\ShellEscape, \DelayedShellEscape というコマンドも提供されている。(\immediate なしの \write18 相当のことをするには \write18 そのままではなく \DelayedShellEscape を使う必要がある)

また、pdftexcmds パッケージで提供されている \pdf@system コマンドを使うという手もある。

というわけで、一般の利用者および LaTeX パッケージを書く人にとっては、これらは既に済んだ話である。しかし、TeX の実行を補助するツールを作る人にとっては、話はまだ終わっていない。

本題:ログファイルへの出力

従来の \write18 によるコマンド実行の場合は、ログファイルに、実行したコマンドが

runsystem(ほにゃらら)...executed.

という感じで書き出されていた。このような実行ログは、 TeX の実行を補助するツールにおいて役に立つ場合がある。

しかし、LuaTeX における os.execute はログファイルに何も出力しない。これは困る。

LuaTeX で外部コマンド実行の際にログファイルにコマンドを吐き出すようにするには、

  • \write18 の代替となるコマンドで、ログを出力するようにする
  • LuaTeX の os.execute を乗っ取って、ログ出力も行うようにする

という手段が考えられる。(LuaTeX 本体の os.execute の定義を書き換えるのは、ハードルが高そうなので考えないことにする)

\write18 の代替となるコマンドでの対処

pdftexcmds パッケージの \pdf@system コマンドは、既に、実行時に

system(ほにゃらら) executed.

というメッセージを出力するようになっている。微妙に書式が違うが、まあ十分だろう。

一方で、 shellesc パッケージが提供する \write18 および \ShellEscape, \DelayedShellEscape コマンドは、実行するコマンドを書き出すという処理は特に行なっていない。

以前書いたような外部コマンドを実行する LaTeX パッケージのうち、 epstopdf パッケージは pdftexcmds パッケージの \pdf@system コマンドを使うので、ログファイルを調べることで実行されたコマンドを取得することができる。

epstopdf 以外の外部コマンドを実行する LaTeX パッケージは、基本的に「shellesc パッケージを読み込みつつ、従来通り \immediate\write18 を使用」していると思われるので、実行されたコマンド文字列をログファイルから取得する手段がない。

外部コマンドを実行するパッケージが、 shellesc パッケージに頼らずに直接 \directlua していた場合も同様である。

os.execute を乗っ取る

Lua コードによって os.execute の定義を置き換えてしまえば、 shellesc パッケージが使われていようが、直接 \directlua していようが、実行されるコマンド文字列を取得できる。

というわけで、 TeX 文書を処理する際に次のような TeX コードを実行しておけば、既存の TeX エンジンと同様にログファイルに出力してくれる:

\directlua{
local e=os.execute
if e then
  local s=status.shell_escape or e()
  local function h(c,r,...)
    if c then
      texio.write_nl("log","runsystem("..c..")..."..(s==0 and"disabled"or(s==1 and"executed"or(r==nil and"disabled (restricted)"or"executed safely (allowed)")))..".\noexpand\n")
    end
    return r,...
  end
  function os.execute(c)
    return h(c,e(c))
  end
end
}

(LuaTeX で外部コマンドを実行する関数は、 os.execute 以外にもいくつか存在するが、見なかったことにする。どうせ使われてないよね…?)

余談:os.execute の仕様

本家 Lua の os.execute の戻り値の仕様は、Lua 5.1 と Lua 5.2 で少し変化している。具体的には、 Lua 5.1 では C の system 関数の戻り値を整数としてそのまま返していたのが、 Lua 5.2 では、(POSIX の場合に)POSIX の仕様に沿って system 関数の戻り値を解釈するようになった。

LuaTeX はと言うと、ベースとなっている Lua のバージョンは 5.2 なのだが、 os.execute 関数の戻り値の仕様は Lua 5.1 当時のままである。

LuaTeX の os.execute 関数は本家 Lua のものではなく、独自に実装されたものなので、使用する Lua を 5.2 にアップグレードする際に変更し忘れたか、あるいは既存の Lua コードの互換性を考えてそのままにしたのだと思われる。

LuaTeX における os.execute 関数の実装は loslibext.c というファイルに入っている。

LaTeX と -output-directory

カレントディレクトリを散らかさずに LaTeX を処理する方法について、ざっくりとした方針はこの間の記事に書いた。しかし、現実はそう単純にはいかない。今回は、出力ディレクトリを指定する場合に遭遇する落とし穴とその対処法について考察する。 続きを読む

TeX 文書の Magic Comment

この記事では、 TeX 文書におけるマジックコメントの種類と構文についてまとめてみた。

マジックコメントとは

プログラムのソースコードというのは、プログラミング言語の処理系(実行環境)向けに書かれているものである。しかし、テキストエディターなどの周辺ツールは、そのソースコードについて、処理系が必要とする以上の情報が欲しいことがある。そういう場合に、追加の情報をソースコードのコメントとして記述してやって、周辺ツールに与えてやるということがよく行われる。このようなコメントは、俗に、マジックコメントと呼ばれる。

「追加の情報」の中で典型的なものが、文字コードである。Emacs で編集されるソースコードに -*- coding: utf-8 -*- と書かれたコメントがあるのを見たことがある方も多いだろう。

(ちなみに、 Python や Ruby などの一部のスクリプト言語処理系は、マジックコメントによってファイルの文字コードを判定する場合がある。つまり、コメントとして書かれたものが処理系にとってい意味を持つ。) 続きを読む