Hatena::ブログ(Diary)

アセトアミノフェンの気ままな日常

2016-08-15

TeX Live (win32) をビルドしてみる実験(2)

前回の記事にいただいたコメントで、少し先に進めるようになった。

ビルド手順(つづき)

前回の途中から再挑戦。

[3'] libs のビルド(やりなおし)

前回、zlib → libpng → xpdf とビルドしていて、xpdf でエラーが出てしまった。そのままではビルドに失敗するのは、以下の2つのファイルである:

SplashOutputDev.cc(1552) : error C3861: 'unlink': identifier not found
TextOutputDev.cc(4202) : error C3861: 'setmode': identifier not found
TextOutputDev.cc(4202) : error C3861: 'fileno': identifier not found

これは、VS2013 が昔の VS とは仕様が変わっていることが原因だったようだ。したがって、Microsoft 公式の案内に従い、使われなくなった関数を書き換える:

  • SplashOutputDev.cc 1552行目 → unlink_unlink
  • TextOutputDev.cc 4202行目 → setmode_setmode に、fileno_fileno

こうすると w32tex-src\ktx\libs\xpdf\xpdf で nmake に成功し、libxpdf.lib が生成する*1。次いで、xpdf のほかのディレクトリもビルドする。

> cd ..
> cd fofi
> nmake

これで libfofi.lib が生成し、さらに

> cd ..
> cd goo
> nmake

これで libGoo.lib が生成している。

[4'] web2c のビルド(やりなおし)

改めて web2c をビルドしよう。

> cd ktx\texk\web2c
> make

前回に比べて、アプリケーションが増えた!

  • pdftex.dll
  • wopl2ofm.exe
  • wofm2opl.exe
  • wovf2ovp.exe
  • wovp2ovf.exe
  • pdftosrc.exe
  • aleph.dll
  • synctex.exe

今度は以下のエラーで止まる:

make: *** No rule to make target `mp.web', needed by `mp.p'.  Stop.

たしかに mp.web が見当たらない…後日調べてみよう。

[5] texk のビルド

ほかのプログラムもビルドしてみよう。なんとなく dvipdfm-x をビルドできると便利そうなので、挑戦してみることにした。

> cd w32tex-src\ktx\texk\dvipdfm-x
> make

早速エラーが出る:

make: *** No rule to make target `jp2image.obj', needed by `dvipdfmx.dll'.  Stop.

どうやら .obj の make が出来ないらしいので、Makefile に以下の3行を追加してみた(これが最適な方法かどうかは不明):

.SUFFIXES: .c .obj
.c.obj:
	$(CC) $(CFLAGS) $(CPPFLAGS) -c $<

改めて make すると .obj がビルドでき、ライブラリが見つからないと怒られる。

make: *** No rule to make target `../../libs/libpaper/lib/libpaper.lib', needed
by `dvipdfmx.dll'.  Stop.

というわけで、今度は libs の libpaper のビルド。

> cd ..\..
> cd libs\libpaper
> make

今度もまたエラー。

cl -nologo -MD -O2 -DWIN32=1 -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_DEPREC
ATE -D_CRT_OBSOLETE_NO_DEPRECATE -D_SECURE_SCL=0 -DHAVE_CONFIG_H -D_REENTRANT -I
. -I.. -c -Folibpaper_la-paper.obj paper.c
paper.c
paper.c(21) : fatal error C1083: Cannot open include file: 'unistd.h': No such f
ile or directory
make: *** [libpaper_la-paper.obj] Error 2

VC で unistd.h を使いたいのだが、そもそも Unix 系でないため unistd.h が存在するはずはない。そこで、とりあえずココに例示してあるヘッダをコピペして unistd.h というファイル名で保存し、texk\libs\libpaper\lib に置き、改めて make してみると、幸いなことにビルドが通って lib 以下に libpaper.lib が生成した。警告が出ていたので一応メモしておく:

.\unistd.h(92) : warning C4273: '_getpid' : inconsistent dll linkage
        C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\process.h
(69) : see previous definition of '_getpid'
.\unistd.h(105) : warning C4293: '>>' : shift count negative or too big, undefin
ed behavior

これで、改めて texk\dvipdfm-x に戻って make すると

  • dvipdfmx.dll

が出来た。

make: *** No rule to make target `../calldll/dvipdfmx.exe', needed by `calldll.e
xe'.  Stop.

なるエラーが出ているが、その先はまた後日。

*1:これとは別に「w32tex-src\ktx\libs\xpdf\xpdf\Makefile を編集して CXXFLAGS の値から -DWIN32=1 を外す」という方法でもビルドに成功することに気づいた。この方法は、xpdf の本家ソースに付属している ms_make.bat でビルドする場合にこのオプションが付いていないことに由来するが、詳細不明なので今回は不採用とした。

2016-08-12

TeX Live (win32) をビルドしてみる実験(1)

TeX Live の win32 バイナリ(または W32TeX のバイナリ)をソースからビルドしてみる」を実践した例がググっても全然出てこないので、自分でやってみることにした。全然最後までたどり着かないが、(e-)(u)pTeX まではビルドできたので、何かの参考にしていただければ。

手元の環境は Windows 7 Professional 64bit。

ソースの入手

TeX Live のソースツリーの中に「w32tex-src.tar.xz」というアーカイブがあって、これが TeX Live の win32 バイナリのソースであると思われる。ちなみに r41087 が、TeX Live 2016 のバイナリのソースらしいので、これをダウンロードして適当な場所に展開する。

ビルド環境

角藤さんは Windows の古い OS もサポートするためにもっと古い特殊な環境を使っているというウワサを聴いたことがあるが、とりあえず無償で入手可能な Visual Studio Community を使う。最新は 2015 だが、僕の環境はちょっと前の 2013 のままになっているのでソレを使ってみる。

さらに、make も必要なので MSYS をインストールしておく。たぶん MSYS1 で十分なはず…(なんかソースアーカイブ内に make のソース等も付属しているようだが、ひとまず横着^^;)

Visual Studio に付属している「VS2013 x86 Native Tools Command Prompt」を起動して、ここから MSYS の make などが見つかるようにパス設定する。

> set PATH=%PATH%;C:\MinGW\msys\1.0\bin

のような感じ。ちなみにこのときのパス一覧:

===== ここから VS2013 によるパス =====
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow
C:\Program Files (x86)\Microsoft SDKs\F#\3.1\Framework\v4.0\
C:\Program Files (x86)\MSBuild\12.0\bin
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools
C:\Windows\Microsoft.NET\Framework\v4.0.30319
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\VCPackages
C:\Program Files (x86)\HTML Help Workshop
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Performance Tools
C:\Program Files (x86)\Windows Kits\8.1\bin\x86
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\
===== ここから元々の Windows のパス =====
C:\Program Files\Common Files\Microsoft Shared\Windows Live
C:\Program Files (x86)\Common Files\Microsoft Shared\Windows Live
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
C:\Program Files (x86)\Windows Live\Shared
C:\Program Files\Intel\WiFi\bin\
C:\Program Files\Common Files\Intel\WirelessCommon\
c:\Program Files (x86)\Common Files\Roxio Shared\DLLShared\
c:\Program Files (x86)\Common Files\Roxio Shared\OEM\DLLShared\
c:\Program Files (x86)\Common Files\Roxio Shared\OEM\12.0\DLLShared\
c:\Program Files (x86)\Roxio 2010\OEM\AudioCore\
===== さっき追加した MSYS1 のパス ====
C:\MinGW\msys\1.0\bin

この状態でビルド開始。

ビルド手順

どこからビルドするのが正しいか全然わからない…が、足掻いてみる。

[1] kpathsea ライブラリのビルド
> cd w32tex-src
> cd ktx\texk\kpathsea
> make
> cd win32
> make

これで、ktx\texk\kpathsea にライブラリ kpathsea622.lib と以下のアプリケーションが出来る:

  • kpsewhich.exe
  • kpsestat.exe
  • kpsereadlink.exe
  • kpseaccess.exe
  • kpathsea622.dll

また、ktx\texk\kpathsea\win32 に以下のアプリケーションが出来る:

  • mktexpk.exe
  • mktextfm.exe
  • mktexmf.exe
  • mktexupd.exe
  • mktexfmt.exe
  • texhash.exe ← TeX Live には収録なし*1
  • mktexlsr.exe

ここで天下り的だが、出来上がった kpathsea622.dll を ktx\texk\web2c と ktx\texk\web2c\web2c にコピーしておくと後で便利。

[2] ptexenc ライブラリのビルド
> cd ..\..
> cd ptexenc
> nmake

これにより、あとで pTeX 系をビルドするときに使われる libptexenc.lib というライブラリが出来る。

[3] libs のビルド

ここからいくつかの外部ライブラリをビルドしておく。まずは zlib から:

> cd ..\..
> cd libs\zlib
> nmake

これはエラーで止まって

NMAKE : fatal error U1073: don't know how to make './test/example.c'
Stop.

と出るが、test のことなので無視しよう。肝心の libz.lib というライブラリは生成しているため大丈夫だろう。

次に libpng のビルド。

> cd ..\libpng
> nmake

ライブラリ libpng.lib が出来れば OK。ついで xpdf へ。

> cd ..\xpdf
> cd xpdf
> nmake

これはエラーで止まってしまった。あちゃあ…

        cl -nologo -MD -O2 -TP -EHsc -DWIN32=1 -D_CRT_NONSTDC_NO_DEPRECATE -D_CR
T_SECURE_NO_DEPRECATE  -D_CRT_OBSOLETE_NO_DEPRECATE -D_SECURE_SCL=0 -I.. -I./../
goo  -I./../fofi -I./../splash -I.  -I../../../texk -I../../../texk/kpathsea  -I
../../freetype/include -I../../libpng -c SplashOutputDev.cc
SplashOutputDev.cc
SplashOutputDev.cc(1552) : error C3861: 'unlink': identifier not found
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0
\VC\BIN\cl.EXE"' : return code '0x2'
Stop.

…諦めよう。

[4] web2c のビルド

気を取り直して、TeX 本体の方をビルドしてみることに。

> cd ktx\texk\web2c
> make

うわあ、止まってしまった…

cl -DHAVE_CONFIG_H  -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE -D_CR
T_OBSOLETE_NO_DEPRECATE -D_SECURE_SCL=0 -I. -I. -I.. -I./..  -I../../libs/libpng
 -Ilualibs/lua51 -Ilualibs -Dextra_version_info=`date +-%Y%m%d%H` -I../../libs/z
lib -nologo -MD -O2 -DWIN32=1 -I. -I.. -I../.. -I../../.. -Isynctexdir -Ilibmd5
 -c ctangle.c
ctangle.c
./cwebdir/ctang-w2c.ch(132) : fatal error C1083: Cannot open include file: 'cweb
.h': No such file or directory
make: *** [ctangle.obj] Error 2

この時点で出来ているのは

  • ctangleboot.exe ← TeX Live には収録なし

だけだった。よくわからないが、なんか足掻いてみよう。

> make cweb

やっぱりエラー。でも内容が変わっている。

cl -nologo -MD -O2 -DWIN32=1 -I. -I.. -I../.. -I../../.. -Isynctexdir -Ilibmd5
-I../../libs/libpng -Ilualibs/lua51 -Ilualibs -Dextra_version_info=`date +-%Y%m%
d%H` -I../../libs/zlib -link /SUBSYSTEM:CONSOLE /OPT:NOREF  cweb.c lib/lib.lib .
./kpathsea/kpathsea622.lib advapi32.lib gdi32.lib user32.lib wsock32.lib   -o cw
eb
cl : Command line error D8003 : missing source filename
make: *** [cweb] Error 2

よくみると、ん? cweb.h が湧いてきたぞ…?

というわけで、もう一回 make してみる。さらに天下り的だが、W32TeX に付属する texmf.cnf をカレントディレクトリすなわち web2c にコピーして置いておく。

> make

すると結構な数のアプリケーションのビルドが通ってしまった…中には BibTeX や METAFONT、TeX の姿も。

  • ctangle.exe
  • tie.exe
  • cweave.exe
  • tangleboot.exe ← TeX Live には収録なし
  • tangle.exe
  • bibtex.exe
  • dvicopy.exe
  • dvitype.exe
  • gftodvi.exe
  • gftopk.exe
  • gftype.exe
  • mf-nowin.exe
  • mf.exe
  • mft.exe
  • odvicopy.exe
  • odvitype.exe
  • otangle.exe
  • patgen.exe
  • pktogf.exe
  • pktype.exe
  • pooltype.exe
  • ttf2afm.exe
  • vftovp.exe
  • vptovf.exe
  • weave.exe
  • pltotf.exe
  • tftopl.exe
  • tex.dll
  • etex.dll ← TeX Live には収録なし*2

で、エラーで止まってしまったのだが…どうやら pdfTeX のビルド中の模様:

make[1]: Entering directory `/path/to/w32tex-src/ktx/libs/xpdf/xpdf'
lib -out:libxpdf.lib ./AcroForm.obj ./Annot.obj ./Array.obj ./BuiltinFont.obj ./
BuiltinFontTables.obj ./CMap.obj ./Catalog.obj ./CharCodeToUnicode.obj ./CoreOut
putDev.obj ./Decrypt.obj ./Dict.obj ./Error.obj ./FontEncodingTables.obj ./Form.
obj ./Function.obj ./Gfx.obj ./GfxFont.obj ./GfxState.obj ./GlobalParams.obj ./H
TMLGen.obj ./ImageOutputDev.obj ./JArithmeticDecoder.obj ./JBIG2Stream.obj ./JPX
Stream.obj ./Lexer.obj ./Link.obj ./NameToCharCode.obj ./Object.obj ./OptionalCo
ntent.obj ./Outline.obj ./OutputDev.obj ./PDFCore.obj ./PDFDoc.obj ./PDFDocEncod
ing.obj ./PSOutputDev.obj ./PSTokenizer.obj ./Page.obj ./Parser.obj ./PreScanOut
putDev.obj ./SecurityHandler.obj ./SplashOutputDev.obj ./Stream.obj ./TextOutput
Dev.obj ./TextString.obj ./UnicodeMap.obj ./UnicodeTypeTable.obj ./XFAForm.obj .
/XpdfPluginAPI.obj ./XRef.obj ./Zoox.obj
Microsoft (R) Library Manager Version 12.00.40629.0
Copyright (C) Microsoft Corporation.  All rights reserved.

LINK : fatal error LNK1181: cannot open input file './SplashOutputDev.obj'
make[1]: *** [libxpdf.lib] Error 157
make[1]: Leaving directory `/path/to/w32tex-src/ktx/libs/xpdf/xpdf'
make: *** [../../libs/xpdf/xpdf/libxpdf.lib] Error 2

これはさっき諦めた xpdf 関連ですね… pdfTeX は xpdf に依存しているので、xpdf のライブラリをビルドできないことには始まらないらしい。いったんあきらめよう。

[5] pTeX 系のビルド

pdfTeX は諦めたのだが、pTeX などは依存ライブラリが ptexenc くらいなので、極めて簡単にビルドできる状態になっている。

> cd ptexdir
> make
> cd ..
> cd uptexdir
> make
> cd ..
> cd eptexdir
> make
> cd ..
> cd euptexdir
> make

以上で ktx\texk\web2c\ptexdir に出来るもの:

  • ptftopl.exe
  • ppltotf.exe
  • pdvitype.exe
  • pbibtex.exe
  • ptex.dll

ktx\texk\web2c\ptexdir に出来るもの:

  • uptftopl.exe
  • uppltotf.exe
  • updvitype.exe
  • upbibtex.exe
  • uptex.dll

ktx\texk\web2c\eptexdir に出来るもの:

  • eptex.dll

ktx\texk\web2c\euptexdir に出来るもの:

  • euptex.dll

以上のように、(e-)(u)pTeX がビルドできている。

動作確認

TeX Live の bin/win32 ディレクトリや W32TeX の bin ディレクトリに同名のファイルが存在するので、これを置き換える。pLaTeX などは当然ながらフォーマット再作成が必要である。

---! c:/w32tex/share/texmf-dist/web2c/eptex/platex.fmt doesn't match eptex.pool
(Fatal format file error; I'm stymied)

このエラーが出たら、fmtutil(-sys) でフォーマット再作成しよう。そうすれば、正常に動作するはずである*3

追記 (2016-08-15):先へ進めたので続きを書いた

*1:texhash は環境によっては「mktexlsr のコマンドの別名」とされているらしいが、詳細不明。

*2:最近の TeX Live では、e-TeX は pdfTeX の symlink になっている。

*3:もしここで「プロシージャエントリポイント is_cp932_system がダイナミックライブラリ kpathsea622.dll から見つかりませんでした。」というメッセージが出る場合は、kpathsea622.dll を自分でビルドしたものに置き換えればよい。どうやら新しい kpathsea622.dll ではこの部分に何らかの変更があったらしく、「古い kpathsea622.dll + 新しい eptex.dll」だと上記のメッセージが出ることが、TeX Forum で報告されている

2016-08-11

「いまプリアンブルなのか、それとも本文中なのか」判定

LaTeX パッケージを作るときに、「この命令がプリアンブルで実行されたら…、本文中で実行されたら…」のような分岐が必要な場合に役立つ判定法のメモ。なお、「プリアンブル」とは \documentclass … \begin{document} で挟まれた部分のこと*1

最初に「答え」

  1. プリアンブルより前の場合
    • これは「以下の 2. から 4. のいずれでもない場合」。
  2. プリアンブルの場合
    • \documentclass の定義=\@twoclasseserror」かつ「4. でない」。
  3. 本文中の場合
    • \documentclass の定義=\@notprerr」。
  4. プリアンブルの中で、特に \AtBeginDocument の中の場合
    • \AtBeginDocument の定義=\@firstofone」。

これで判定可能であることは、以下に掲げる latex.ltx のソースを読めばわかる(以下の行番号は LaTeX2e 2016/03/31 Patch level 3 の source2e.pdf に対応している)。

ltdefns.dtx
 43 \def\@preamblecmds{}
 44 \def\@onlypreamble#1{%
 45   \expandafter\gdef\expandafter\@preamblecmds\expandafter{%
 46        \@preamblecmds\do#1}}
 47 \@onlypreamble\@onlypreamble
 48 \@onlypreamble\@preamblecmds
ltfiles.dtx
 11 \def\document{\endgroup
    … 中略 …
 47   \let\AtBeginDocument\@firstofone
 48   \@begindocumenthook
    … 中略 …
 56   \gdef\do##1{\global\let ##1\@notprerr}%
 57   \@preamblecmds
    … 中略 …
 60   \ignorespaces}
 61 \@onlypreamble\document
ltclass.dtx
206 \def\documentclass{%
207   \let\documentclass\@twoclasseserror
208   \if@compatibility\else\let\usepackage\RequirePackage\fi
209   \@fileswithoptions\@clsextension}
210 \@onlypreamble\documentclass
385 \def\AtBeginDocument{\g@addto@macro\@begindocumenthook}
386 \def\AtEndDocument{\g@addto@macro\@enddocumenthook}
387 \@onlypreamble\AtBeginDocument

以下で簡単に説明しておく。

「プリアンブルより前」と「プリアンブル」の区別

ltclass.dtx の206-209行目の \documentclass の定義を読むと

一度 \documentclass が実行された(=プリアンブルに入った)時点で \documentclass\@twoclasseserror に再定義される

ことがわかる。したがって、素直にこれを利用してしまおう。ちなみに \@twoclasseserror とは LaTeX Error: Two \documentclass or \documentstyle commands. というエラーのこと。

「プリアンブル」と「本文中」の区別

ltclass.dtx の210行目が意味するのは

\begin{document} が実行された(=本文開始した)時点で \documentclass\@notprerr に再定義する

ということである(ちなみに \@notprerr とは LaTeX Error: Can be used only in preamble. というエラーのこと)。これだけでは難しいのでもう少し詳しくみていく。

まず、ltclass.dtx の210行目に登場する \@onlypremable は「引数にとった命令に \do を付けて \@preamblecmds という“リスト”に次々と追加していく」という命令である(ltdefns.dtx 44-46行目)。すぐ上の43行目をみるとわかるとおり、リストは「空」に初期化されていて、以降でたとえば \@onlypremable\ナントカ が施されると、“リスト”末尾に \do\ナントカ が追加される。この命令は LaTeX カーネルや各種パッケージで大量に登場する*2ので、最終的に \@preamblecmds\do\ホゲホゲ \do\フガフガ \do\ピヨピヨ … のような長大なリストになる。

出来上がったリスト \@preamblecmds は、\begin{document}(=実体は \document という命令)の一部として実行される(ltfiles.dtx 57行目)。この実行直前の56行目で \do が「引数にとった命令を \@notprerr へと再定義する」という意味に定義されるので、結果としてリストに追加されていたすべての \ナントカ が一気に \@notprerr に再定義されることになる。最初に述べたとおり、このリストの中には \documentclass も含まれているため、\documentclass がこのタイミングで \@notprerr に再定義されるのである。

特殊なケース:「\AtBeginDocument の中」の扱い

そもそも \AtBeginDocument とは「プリアンブル中に命令を書いておくが、その実行を \begin{document} する時点まで遅延させる」場合に用いる命令である。すなわち、実行のタイミングは “2. と 3. の境目” であり、ほとんどの場合は 2. に含めてしまって問題ない。しかし、特別扱いが必要なごく稀なケースが存在することは確かである。ここで役立つのが

\AtBeginDocument の中身が実行されるときには \AtBeginDocument\@firstofone に再定義されている

という事実である。

改めて \AtBeginDocument の定義を確認すると、引数にとったモノを \@begindocumenthook という“リスト”に追加していく命令であることがわかる(ltclass.dtx 385行目)。このリスト \@begindocumenthook\begin{document}(=\document)の一部としてようやく実行される(ltfiles.dtx 48行目)のだが、いったんこれを実行する段階に達したらもうこれ以上遅延させる必要はないことに気づくだろう。

そこで、たとえリストの中身(あるいはそれ以降)に\AtBeginDocument が使われていたとしても、もうこれ以上遅延せずその場で実行するのが妥当である。そこで、\@begindocumenthook の実行直前にあたる47行目で \AtBeginDocument\@firstofone に再定義されているのである。なお、ltclass.dtx の387行目により、\AtBeginDocument はすぐ後の ltfiles.dtx 57行目の時点で \@notprerr に再定義されてしまうので、\AtBeginDocument の意味が \@firstofone であるような範囲はごく限られていることも保障されている。

判定の実用例

某記事で紹介した scsnowman パッケージ\makedocumentsnowman を見てみよう。

*1:つまり、\documentclass より前はプリアンブルではない。これは \usepackage を \documentclass より前に書くと出るエラーのヘルプメッセージ \usepackage may only appear in the document preamble, i.e., between \documentclass and \begin{document}. が示唆している。なお、本記事に登場する \@onlypreamble という命令は、名前の上からは「(ある命令を)プリアンブル専用(にする)」だが、実際にはその命令をプリアンブルより前で使うこともできる。

*2:これは、プリアンブル以外で使っても何の意味を持たない命令や有害な命令だけでなく、あるいは使う頻度が格段に下がる命令を「エラー」に再定義することで、メモリ使用量を節約するという効果があるとされている。

2016-08-10

\AtBeginDocument の中での \begin{document}

どうでもいいんだけど、コレって無限ループするんだね…(考えてみれば当然だが)

\documentclass{article}
\AtBeginDocument{\begin{document}}
\begin{document}
$ latex test
This is pdfTeX, Version 3.14159265-2.6-1.40.17 (TeX Live 2017/dev) (preloaded format=latex)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2016/03/31> patch level 3
Babel <3.9r> and hyphenation patterns for 83 language(s) loaded.
(/usr/local/texlive/2016dev/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2016dev/texmf-dist/tex/latex/base/size10.clo))
No file test.aux.
(./test.aux) (./test.aux) (./test.aux) (./test.aux) (./test.aux) (./test.aux)
… 中略 …
(./test.aux) (./test.aux) (./test.aux) (./test.aux) (./test.aux) (./test.aux)
! TeX capacity exceeded, sorry [input stack size=5000].
<write> 
        LaTeX Font Info: \space \space \space Checking defaults for OML/cmm/...
l.3 \begin{document}

test.aux を 4,992 回読み込んでいた…なんでこんなことに気づいてしまったかというと、某記事\makedocumentsnowman の実装中に

\documentclass[dvipdfmx]{article}
\usepackage{scsnowman}
\AtBeginDocument{\makedocumentsnowman}

と書いてしまったからである… 某 scsnowman パッケージでは、上記のコードで無限ループしないように ad hoc に対処している。

2016-08-09

「ゆきだるまの日」裏話

昨日は「ゆきだるまの日」だった。

なお「ゆきだるま=8」は周知の事実であろうと思われる(図はここから)。

f:id:acetaminophen:20160809120239p:image

その割には、ツイッターに「☃を作った」という報告も、残念ながら雪が積もっていない地域の方からの渾身の☃ネタも、ほとんど観測されなかった。

天皇お気持ちの日」と被ってしまったのが不幸だったということにしておこう。

↑ ☃さんのお気持ちが表明されている。

細かいネタ

昨日出した記事:

のどうでもいいネタを解説しておく。

  1. URL を見てみると「2016/08/08/080800」である。本当は「2016/08/08/080808」を狙ったのはいうまでもないが、よく考えてみるとズレたときにむしろ格好悪いので、結局「予約投稿機能」を使った。
  2. 登場する☃のほとんどが、マフラーを巻いている。暑苦しそうだと思われるかもしれないが、むしろマフラーを巻いたほうが周囲の熱が伝わりにくく解けづらいらしい(フジテレビ系・平成教育委員会2016で放送されていたらしい*1)。

どうでもいいですね…

ところで

これ、まだ情報提供お待ちしております。

ところで「お気持ちフォント」DFP超極太楷書体の「☃」絵文字がツイッターに流れて来ないんですが、無いのでしょうか?(私は持っていません)

(twitter@aminophen)

*1:番組は見ていないのだが、なぜか情報をキャッチして自分でもツイートしていたので覚えていた。