Acetaminophen’s diary

化学に関すること,TeXに関すること,ゆきだるまに関すること。

etex パッケージの \extrafloats が少し優しくなった話

この記事は、サブブログの 2016-08-02 投稿記事を移転してきたものです。

LaTeX\extrafloats の小噺を。

 

(復習)\extraflots を etex パッケージの後に使うとエラー

id:doraTeX さんの約11ヶ月前の記事

で、新 LaTeX カーネルに追加された \extrafloats という命令*1を etex パッケージの後で使うと非常にわかりづらいエラーが出ることが指摘されている。

*1:未処理の浮動体の個数の許容上限を指定の数だけ増加させる。

続きを読む

新しい pLaTeX の話:非公式リリースノート 2016 年版 (3)

本ブログでは、先月「コミュニティ版 pLaTeX」の 2016/05/07 について勝手に解説しました。割と好評でしたので、今回はそれ以降にリリースされた 2016/06/10、2016/06/10 patch level 1、2016/07/01 の 3 回分の(正味の)変更内容を勝手に解説します。

昨日 pLaTeX <2016/07/01> と upLaTeX <2016/07/01u01> がリリースされました。お手元の TeX Live にも数日以内に更新が反映されるはずです。

正式なリリース告知と重要なお知らせ(開発に関する議論)を、forum:1967 に出してあります。こちらもあわせてご参照ください。

以前の記事はこちらから:

目次

 

続きを読む

単独でタイプセットできるパッケージファイル

この記事は、サブブログの 2016-06-25 投稿記事を移転してきたものです。

パッケージとそのドキュメントを一緒に開発したいとき、最もよく使われていると思われるのは「docstrip」という仕組みである。最近よく見かける docstrip の使い方は

dtx ファイル(コードとドキュメント本体)+ ins ファイル(dtx から sty をストリップするためのバッチファイル)のセット

だろう。あまり書き方を説明したオンライン日本語文献はほぼ見当たらないが、例えば、ut さんちの「dtx ファイル一般の話とサンプル」の節に

例として、いんちきな dtx ファイルを用意してみました (foobar.dtx.txt):

として簡単な dtx サンプルも付いた記事がある。

以下では「通常の docstrip については既知である」と仮定して(相当読者が絞られるが…)話を進める。もし知らなかった場合は、TeX Live に付属する sty2dtx という Perl スクリプトに適当なパッケージ (hoge.sty) を与えれば、それらしい hoge.dtx が得られるので試してみてほしい*1

 

でも:パッケージファイルひとつにしてみたい

確かに「コードの間近に説明を書き込めて、しかも LaTeX で処理して PDF ドキュメントまで作れる*2」という点は便利である。しかし、いちいち dtx から sty をストリップするのは面倒であるし、わかりづらい。

そうなると、「こんなことはできないだろうか」と考えたくなるのは自然であろう:

  • sty ファイルを直に配布
    • 当然これは \usepackage できる
    • 時に \documentclass より前で \RequirePackage されうる
  • sty ファイル単独でもコンパイルが通る(→ PDF 化できる)
    • dtx 同様のコード解説を含められる

…と思ったのだが、この試みは案外なされていない。そこでやってみた。

実用に供するパッケージではなく、あくまで実装の例示である。 → と思っていたのだが、結局後で実際に exppl2e.stypLaTeX の実験的コードを含めたパッケージ)で実践活用することとなる。

 

ちょっとだけ解説

コード中に解説は書いたが、トリッキーなのでもう少し詳しく。

トリックの中心は

\ifx\undefined\@undefined\relax
  % (パッケージの宣言)
\else
  % (ドキュメント用「ドライバ」コード)
\fi

の部分である(以下「トリックコード」と呼ぶ)。これは〈@〉のカテゴリーコードが「パッケージとして読まれた場合」と「TeX ファイルとして読まれた場合」で異なることを利用している。

case 1: パッケージとして読まれた場合

\usepackage{tcstyalone}

あるいは

\RequirePackage{tcstyalone}

の場合、上記「トリックコード」実行時には \makeatletter が有効になっている。すなわち \ifx が比較するトークンは \undefined\@undefined である。どちらのコントロール・シーケンスも「未定義」なので、判定は真となり(パッケージの宣言)が実行される。

case 2: TeX ファイルとして読まれた場合

$ pdflatex tcstyalone.sty

あるいは

\input{tcstyalone.sty}

のように読まれた場合、上記「トリックコード」は \makeatletter 無効である。この場合、\ifx が比較するトークンは \undefined\@ である。\@ はコントロール・シンボルで、LaTeX では

\spacefactor\@m{}

と定義されている*3ため「未定義」とは異なる。すなわち判定は偽となり(ドキュメント用「ドライバ」コード)が実行される。判定部の後にくっついている undefined\relax なる部分は、真の場合のコードの一部とみなされて、必ずすっ飛ばされることに注意。

さらなる帳尻合わせ

ここで sty を単独でタイプセットしたい場合、「ドライバ」コード部には

\documentclass{...}
\begin{document}
...
\end{document}

を含める必要があるのだが、先の「トリックコード」では \fi\end{document} より後に来てしまう。つまり、case 1 では既に \if...\fi が釣り合っている一方で、このままでは「case 2 の場合だけ一回分 \fi が足りない」という問題が発生する:

(\end occurred when \ifx on line 15 was incomplete)

これを解消するため、ここでは docstrip の「\DocInput では行頭の % が無視される」という仕様を利用してみた。case 2 だけ余分の \fi% 付きで発行するのである。そうして書いたのが、例の gist のコードである。

 

先行研究の例

以上の実装コードを書いたあとで、別解らしきものを見つけた。

*1:実際に sty2dtx を使った例として、pLaTeX がコミュニティ版に移行した後の ascmac パッケージ (tascmac.sty) とそのドキュメント (ascmac.pdf) が挙げられる。アスキーによる tascmac.sty は元々説明なしにコードが書かれていたが、コミュニティ版では sty2dtx で ascmac.dtx を作成したのち文書が書き下ろされている。

*2:もちろん普通の sty でも「%」を使ってコメントを付ければよいわけだが、そのまま LaTeX でタイプセットして PDF 化することはできない。

*3:2014 年までは {} が無かったが、ここではどうでもいい。

TeX Live 2016 の先へ:今後の注目ポイントまとめ

ついに先日、TeX Live 2016 がリリースされました。早速、TeX Live メンテナのお一人である Norbert Preining さんのブログ(英文)に、変更点が簡潔にまとまっています。

また、id:doraTeX さんのブログでも、日本語ユーザ目線で主要な変更点がわかりやすくまとめられています(ナントカBox に記事の多くを割く力の入れよう、doraTeX さんらしさが滲み出ている気がします)。

これらの良記事に触発されて、私もと「個人的に注目した変更点」をまとめることにしました。私らしさ(?)を出すために、大事なところは id:doraTeX さんにお任せすることにして、私は「TeX Live 2016 の先へ向けてぜひ注目したいところ」に重点をおいてみます。ちなみに昨年版(2015)はこちら

 

目次

 

続きを読む

新しい pLaTeX の話:非公式リリースノート 2016 年版 (2)

前回の続きです(新しい pLaTeX の概要や全体の目次は前回の記事を参照)。

【追記:2016-06-11】コミュニティ版 2016/05/07 には、本稿の 5. で解説している「ベースライン補正(縦組)で「Å」が乱れる問題を解消」という修正のやりかたがマズかったことにより、「すべてのアクセント文字」について多くの critical な副作用が生じてしまいました。

コミュニティ版 2016/06/10 では修正されています(参考:Issue #5)。TeX Live や W32TeX にも一両日中に反映されると思いますので、pLaTeX 2016/05/07 または 2016/04/17 をお持ちの方は 2016/06/10 に更新してください。

【追記:2016-06-20】コミュニティ版 2016/06/10 には、同じ「アクセント付き文字」でまた別の副作用(特別扱いされる i のアクセントに関係)が入っていました。

これはコミュニティ版 2016/06/10 patch level 1 (2016-06-19) で修正されましたTeX Live や W32TeX にも一両日中に反映されると思いますので、再度更新してください。

【追記:2016-07-01】トラブルが相次いだことから、この「アクセント付き文字」のパッチだけを一旦リセットしアスキー版の頃の挙動に戻しました。

コミュニティ版 2016/07/01 のほかの変更点も含め、こちらの記事を参照してください。

 

続きを読む