Hatena::ブログ(Diary)

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

2016-10-21

marginnote パッケージが pLaTeX でアレな話(続き)

前回「ひとまず \chardef\pdfoutput=1TeX ファイル冒頭に書いておくと正常になる」と書いたが、こうしたバッドノウハウではなく「パッケージ側に e-pTeX をサポートしてもらう」ということにすれば

--- marginnote.sty.1~	Sun Jun 12 08:18:53 2016
+++ marginnote.sty	Fri Oct 21 07:20:59 2016
@@ -121,7 +121,12 @@
       \begingroup\expandafter\expandafter\expandafter\endgroup
       \expandafter\ifx\csname pdfoutput\endcsname\relax % bg 3
         \begingroup\expandafter\expandafter\expandafter\endgroup
-        \expandafter\ifx\csname XeTeXrevision\endcsname\relax\else % bg 4
+        \expandafter\ifx\csname XeTeXrevision\endcsname\relax % bg 4
+          \begingroup\expandafter\expandafter\expandafter\endgroup
+          \expandafter\ifx\csname epTeXinputencoding\endcsname\relax\else % bg 5
+            \@mn@pdfmodetrue
+          \fi % ed 5
+        \else % or 4
           \@mn@pdfmodetrue
         \fi % ed 4
       \else % or 3

で横書きは大丈夫になる。しかし、縦書きはやはり駄目である。2パス処理でダメになることを根拠に aux ファイルの中身を覗いてみると

[1] pdflatex/lualatex

\newmarginnote{note.1.1}{{1}{7030046sp}}
\newmarginnote{note.1.2}{{1}{7030046sp}}

[2] platex(上記のパッチなし)

\newmarginnote{note.1.1}{{1}{}}
\newmarginnote{note.1.2}{{1}{}}

[3] platex(上記のパッチあり)横書き (book)

\newmarginnote{note.1.1}{{1}{7030046sp}}
\newmarginnote{note.1.2}{{1}{7030046sp}}

[4] platex(上記のパッチあり)縦書き (tbook)

\newmarginnote{note.1.1}{{1}{34700926sp}}
\newmarginnote{note.1.2}{{1}{32472702sp}}

[5] lualatex 縦書き (ltjtbook)

\newmarginnote{note.1.1}{{1}{5915934sp}}
\newmarginnote{note.1.2}{{1}{5915934sp}}

LuaTeX-ja 縦組では正常っぽくなった。eptexdoc.pdf をみると

\pdflastxpos, \pdflastypos
\pdfsavepos が置かれた場所の,dvi における出力位置を返す内部整数(読み取り専用).原点は紙の(物理的な意味の)左下隅であり,y 軸は(物理的な)上方向に向かって増加する.
pTeX では横組・縦組と組方向が複数あるので,\pdflastxpos, \pdflastypos の値の座標系を「物理的な」向きとすべきか,それとも「組方向に応じた」向きとすべきかは悩みどころである.110227 版以降,現在までの版では上記のように物理的な向きとしている.

とあるが、もしかして marginnote の計算と合致していないのだろうか? いずれにせよ pLaTeX の縦書きはヤヤコシイ…

そもそも marginnote パッケージもアレ

現在の marginnote の実装だと「素の e-TeX」すら自分でつぶしてダメにしている気がする。パッケージ作者の意図としては

  • e-TeX なしだとエラー
  • (素の)e-TeX ありなら動作して手動調節機能が使える状態
  • pdfTeX/XeTeX/LuaTeX のように \(pdf)savepos が使える場合は自動調節

ということのように見える。ところが、この「素の e-TeX」の場合には手動調節機能が使えるようになってほしいはずなのに:

Package marginnote Info: xpos not known,
(marginnote)             using \marginnoterightadjust on input line 8.

これが出てほしいのに、代わりに

Package marginnote Info: xpos seems to be 0.0pt,
(marginnote)             \marginnoterightadjust ignored on input line 7.

これが出て注の位置が吹っ飛んでしまっているっぽい。「位置を取得していないはずなのに 0.0pt が湧いてくる」という現象がまずいのは明らかなので、これを直すには

--- marginnote.sty.1~	Sun Jun 12 08:18:53 2016
+++ marginnote.sty	Fri Oct 21 09:01:37 2016
@@ -212,7 +212,9 @@
     \edef\@mn@currpage{\csname
       mn@note.\@mn@thispage.\@mn@atthispage\endcsname}%
     \edef\@mn@currxpos{\expandafter\@secondoftwo\@mn@currpage}%
-    \edef\@mn@currxpos{\the\dimexpr \@mn@currxpos -\hoffset\relax}%
+    \ifx\@mn@currxpos\@empty\else %%% !!!
+      \edef\@mn@currxpos{\the\dimexpr \@mn@currxpos -\hoffset\relax}%
+    \fi                           %%% !!!
     \begingroup\expandafter\expandafter\expandafter\endgroup
     \expandafter\ifx\csname pdfhorigin\endcsname\relax\else
       \begingroup\expandafter\expandafter\expandafter\endgroup

でよさそう。

…アレ、こうすると(最初のパッチのように e-pTeX サポートを入れてもらわなくても)pLaTeX 縦書きでも(だいたい)正常になるぞ!*1

→ 2016-10-21 18:16 パッチ(すぐ上に書いてある「そもそも素の e-TeX でダメ」なところに書いたもの)を作者に送ったところ、早速 CTAN に修正版をアップロードしたと返信が来ました。ありがとうございます!

(とはいえ、せっかく「\pdfsavepos などのプリミティブが e-pTeX で使える」のに、その機能を相変わらず marginnote が活用しないままなのはあまり嬉しくないかもしれない。単純に活用したら上記のように縦組でおかしくなるわけだから、「e-pTeX 向けにはどうコードを書くのが望ましいか」というのも考えておいたほうが良いのかもしれない。)

*1:ただし、marginnote v1.1 のときと比べて、縦組の場合の marginnote の配置が微妙に違う。まあ許容範囲とみなすこともできる?

2016-10-20

marginnote パッケージが pLaTeX でアレな話

marginnote パッケージを最近の pLaTeX で処理すると、1パス目は正しそうに見えるのに、2パス目でおかしくなることに気づいた。

\listfiles
\documentclass{book}
\usepackage{marginnote}
\begin{document}

\marginnote{\footnotesize{1 marginnote test}}

[1]
Test test Test test Test test Test test Test test Test test Test test Test test
Test test Test test Test test Test test Test test Test test Test test Test test

\reversemarginpar

\marginnote{\footnotesize{2 marginnote test}}

[2]
Test test Test test Test test Test test Test test Test test Test test Test test
Test test Test test Test test Test test Test test Test test Test test Test test

\end{document}

e-pTeX のバージョンと pLaTeX の日付:

This is e-pTeX, Version 3.14159265-p3.7.1-160201-2.6 (utf8.euc) (TeX Live 2017/dev)
pLaTeX2e <2016/09/08> (based on LaTeX2e <2016/03/31> patch level 3)
Babel <3.9r> and hyphenation patterns for 83 language(s) loaded.

各種パッケージやファイルの日付:

 *File List*
  pldefs.ltx    2016/06/26 v1.6e pLaTeX Kernel (Default settings)
   jy1mc.fd    1997/01/24 v1.3 KANJI font defines
   jy1gt.fd    1997/01/24 v1.3 KANJI font defines
   jt1mc.fd    1997/01/24 v1.3 KANJI font defines
   jt1gt.fd    1997/01/24 v1.3 KANJI font defines
 kinsoku.tex
    book.cls    2014/09/29 v1.4h Standard LaTeX document class
    bk10.clo    2014/09/29 v1.4h Standard LaTeX file (size option)
marginnote.sty    2016/06/02 v1.2 non floating margin notes for LaTeX

ログを見ると、marginnote のデバッグ情報が出ている。

Package marginnote Info: either \pdflastxpos or \pdfoutput not available
(marginnote)             or \pdfoutput set to 0.
(marginnote)             Extended position detection mode deactivated.
Package marginnote Info: Margin note 1.1 is on absolute page 1
(marginnote)              on input line 7.
Package marginnote Info: xpos seems to be 0.0pt,
(marginnote)             \marginnoterightadjust ignored on input line 7.
Package marginnote Info: Margin note 1.2 is on absolute page 1
(marginnote)              on input line 15.
Package marginnote Info: xpos seems to be 0.0pt,
(marginnote)             \marginnoteleftadjust ignored on input line 15.

後で詳しく調べるが、ひとまず

\chardef\pdfoutput=1

TeX ファイル冒頭に書いておくと正常になる(笑) ちなみに、縦書きだと(TeX Live r41762 の修正適用前か後かにかかわらず)いずれも変なままである*1

報告例

すでにどこかで出ていないだろうかと思ったが

これ一件だけだった。熊澤さんところフツーに使っているみたいなんだけど敢えて相当昔(2006年頃)のパッケージ (2006/10/26 v1.1) を使用してどうにかうまくいったと思われる(この頃は「e-TeX 必須」の実装ではなかった!)。pTeX → e-pTeX で pdfTeX 由来の \pdflast{x,y}pos が実装されたという変化の影響だろうか。

調べてみると、2006 年の v1.1 当時だと縦組・横組ともに OK だったことがわかった。拡張機能を使うようにした結果、e-pTeX が「想定外」になってしまったということかもしれない。

続き

*1:r41762 のパッチの前後で出力は変わらないように見える(確認あってるよね…?)一方で、2016/09/03 以降の exppl2e に導入されている「strutbox パッチ」の影響は受ける。このことは僕が見た限り想定内である。

2016-10-06

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

前回の記事で xtx のほうの texk のプログラムのうち upmendex.exe だけビルドしていたが、実はすでにほかもビルドしていたので記録を公開しておく。

[5'] texk のビルド(続き)

bibtex-x は簡単。

> cd w32tex-src\xtx\texk\bibtex-x
> make

これで bibtex8.exe と bibtexu.exe ができる。

dvisvgm は若干てこずった。

> cd w32tex-src\xtx\libs\potrace
> nmake
> cd w32tex-src\xtx\texk\dvisvgm
> cd clipper
> nmake
> cd ..\xxhash
> nmake
> cd ..\src
> nmake

ここでエラー。

	cl  /c ./dvisvgm.cpp ./gzstream.cpp 
Microsoft (R) C/C++ Optimizing Compiler Version 18.00.40629 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

dvisvgm.cpp
./dvisvgm.cpp(21) : fatal error C1083: Cannot open include file: 'config.h': No such file or directory
gzstream.cpp
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\xlocale(337) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
path\to\w32tex-src\xtx\texk\dvisvgm\src\gzstream.h(35) : fatal error C1083: Cannot open include file: 'zlib.h': No such file or directory
Generating Code...
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\cl.EXE"' : return code '0x2'
Stop.

Makefile に以下の一行を足す:

CPPFLAGS=$(CXXFLAGS)

これで再度

> nmake

とするとビルドが通る。

sam2p もビルド。

> cd w32tex-src\xtx\texk\sam2p-0.48
> make

これも例によって(僕の環境では)/manifest オプションの書式が使えないので、Makedep を書き変える:

sam2p.exe: $(GLOBFILES) sam2p_main.obj appliers.obj crc32.obj out_gif.obj in_ps.obj in_tga.obj in_pnm.obj in_bmp.obj in_gif.obj in_lbm.obj in_xpm.obj mapping.obj in_pcx.obj in_jai.obj in_png.obj in_jpeg.obj in_tiff.obj rule.obj minips.obj encoder.obj pts_lzw.obj pts_fax.obj pts_defl.obj error.obj image.obj gensio.obj snprintf.obj gensi.obj
	$(LDALL) -Fe$@ sam2p_main.obj appliers.obj crc32.obj out_gif.obj in_ps.obj in_tga.obj in_pnm.obj in_bmp.obj in_gif.obj in_lbm.obj in_xpm.obj mapping.obj in_pcx.obj in_jai.obj in_png.obj in_jpeg.obj in_tiff.obj rule.obj minips.obj encoder.obj pts_lzw.obj pts_fax.obj pts_defl.obj error.obj image.obj gensio.obj snprintf.obj gensi.obj ../kpathsea/libkpathsea.lib user32.lib advapi32.lib shell32.lib -link /manifest
	mt -manifest $@.manifest -outputresource:$@";"1
	@echo "Created executable file: sam2p (size: `perl -e 'print -s "sam2p"'`)."

このなかの -manifest に書き換えて

> make

すると完了。

[6] utils のビルド

簡単にビルドできるものだけ。

> cd w32tex-src\ktx\utils
> cd devnag\src
> nmake
> cd ..\..
> cd dviinfo
> nmake
> cd ..
> cd epstool
> nmake
> cd ..
> cd lacheck
> nmake
> cd ..
> cd m-tx
> nmake
> cd ..
> cd pmx
> cd libf2c
> nmake
> cd ..
> nmake
> cd ..
> cd ps2eps
> make
> cd ..
> cd t1utils
> make
> cd ..
> cd texview
> make
> cd ..
> cd txtutil
> nmake
> cd ..
> cd vlna
> make
> cd ..

ほかはまだ成功していない。

2016-09-29

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

第3回に続き4回目。今度は第2回の続編のような位置づけで、texk 以下の諸々、つまり dvipng などをビルドしてみた。

[5'] texk のビルド(続き)

だいたいのプログラムは、極めて簡単にビルド出来る:

> cd w32tex-src\ktx\texk
> cd afm2pl
> make
> cd ..
> cd aftopl
> nmake
> cd ..
> cd autosp
> nmake
> cd ..
> cd chktex
> nmake
> cd ..
> cd dtl
> make
> cd ..
> cd dvi2tty
> nmake
> cd ..
> cd dvidvi
> make
> cd ..
> cd dvihp
> make
> cd ..
> cd dviljk
> nmake all
> cd ..
> cd dvipos
> make
> cd ..
> cd dvipsk
> make
> cd ..
> cd gsftopk
> make
> cd ..
> cd makeindexk
> make
> cd ..
> cd makejvf
> nmake
> cd ..
> cd mendexk
> nmake
> cd ..
> cd musixtnt
> cd musixtnt-src
> nmake
> cd ..\..
> cd ps2otfps
> make
> cd ..
> cd ps2pk
> make
> cd ..
> cd seetexk
> make
> cd ..
> cd tex4htk
> make

で、問題は dvipng のビルド。これに少々てこずった。

まずは依存ライブラリ gd のビルドが必要。

> cd w32tex-src\ktx\libs\gd
> make

僕の環境では、よくわからないが Makefile

$(EXE_OBJS:.obj=.exe): $*.obj $(DLLNAME)
	link /out:$*.exe $*.obj $(DYNAMICLIB)

.SUFFIXES: .obj .exe
.obj.exe:
	link /out:$*.exe $*.obj $(DYNAMICLIB)

に変更しないと何も make できなかった。で、こう変更して make すると、なんと libjpeg が必要とおっしゃる…「png」じゃないの?

        cl.exe -I. -I.. -I../zlib -I.. -I../libpng -I../../extra/libjpeg  -I../f
reetype/include -nologo -DHAVE_CONFIG_H -DWIN32=1  -D_WIN32 -DMSWIN32 -DBGDWIN32
 -DHAVE_GD_BUNDLED=1   -DHAVE_GD_GIF_READ=1   -DHAVE_GD_GIF_CREATE=1   -DHAVE_GD
_IMAGESETBRUSH=1   -DHAVE_GD_IMAGESETTILE=1  -DHAVE_GD_JPG=1   -DHAVE_GD_PNG=1
 -DHAVE_GD_STRINGFTEX=1   -DHAVE_GD_STRINGTTF=1   -DHAVE_GD_XBM=1   -DHAVE_GD_H=
1  -DHAVE_PNG_H=1  -DHAVE_LIBZ=1  -DHAVE_FT2BUILD_H=1  -DHAVE_LIBFREETYPE=1  -DH
AVE_LIBJPEG=1   -DHAVE_LIBPNG=1   -DUSE_GD_IMGSTRTTF=1  -DNONDLL=1  -Oi -O2 -Oy
-GF -MD -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE  -D_CRT_OBSOLETE_
NO_DEPRECATE -D_SECURE_SCL=0 -Dinline=__inline -c gd_jpeg.c
gd_jpeg.c
gd_jpeg.c(52) : fatal error C1083: Cannot open include file: 'jpeglib.h': No suc
h file or directory
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0
\VC\BIN\cl.exe"' : return code '0x2'
Stop.

最新の w32tex-src.tar.xz には含まれないが、角藤さんの2008年のソースには libjpeg が入っていた。そこで、横着して2008年1月の w32tex-src.tar.bz2(過去記事で紹介した ktug にある)を取ってきて、libjpeg を w32tex-src\ktx\extra\libjpeg に配置する。

> cd extra\libjpeg
> nmake
> cd ..\..

あらためて gd をビルド。さらに freetype も必要っぽいので、このタイミングでビルドしておく。

> cd libs
> cd gd
> make
> cd ..
> cd freetype
> make
> cd ..\..

で、dvipng のビルドへ。

> cd texk\dvipng
> make

なんかまたよくわからないのだが

	cl -DHAVE_CONFIG_H -nologo -MD -DWIN32=1 -DW32TEX=1  -DDEBUG=1 -D_CRT_NONSTDC_NO_DEPRECATE -D_CRT_SECURE_NO_DEPRECATE  -D_CRT_OBSOLETE_NO_DEPRECATE -D_SECURE_SCL=0 -Dinline=__inline  -DBGDWIN32=1 -DNONDLL=1 -O2 -wd4005 -wd4819 /c dvipng.c color.c draw.c dvi.c font.c misc.c pk.c set.c sfd.c special.c papersiz.c ppagelist.c vf.c enc.c fontmap.c ft.c tfm.c 
dvipng.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
color.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
draw.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
dvi.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
font.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
misc.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
pk.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
set.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
sfd.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
special.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
papersiz.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
ppagelist.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
vf.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
enc.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
fontmap.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
ft.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
tfm.c
path\to\w32tex-src\ktx\texk\dvipng\dvipng.h(66) : fatal error C1083: Cannot open include file: 'gd.h': No such file or directory
Generating Code...

が出て、include するディレクトリ指定が効いていなかった。Makefile

CFLAGS = -DHAVE_CONFIG_H -nologo -MD -DWIN32=1 -DW32TEX=1 \
-DDEBUG=1 $(YDEFS) -O2 -wd4005 -wd4819

CFLAGS = -DHAVE_CONFIG_H -nologo -MD -DWIN32=1 -DW32TEX=1 \
-DDEBUG=1 $(YDEFS) -O2 -wd4005 -wd4819 $(CPPFLAGS)

に変えて再度 make すると、dvipng.exe が生成した。

ちなみに、xtx のほうの upmendex も、前回 XeTeX をがんばったおかげで簡単にビルドできる。これは嬉しい!

> cd w32tex-src\xtx\texk
> cd upmendex
> nmake

これで upmendex.exe が一発。というのも、upmendex は kpathsea と icu にしか依存していないからである(まあ前回みたとおり icu が面倒なのだけど…)。

ついでなので

僕がビルドしてみたバイナリをダウンロードできるようにしてみました。

ヒマな人は使ってみてください。ちなみに mendex は僕が一文字だけ足したパッチを (r42167) 適用済みでビルドしているので、-s オプションで読ませる .ist ファイルにもエンコード推定が効くようになっているはず。

やりのこし

メジャーなものでビルドできていないのは、LuaTeX/LuaJITTeX と MetaPost くらいかなあ。この辺ができると自給自足できそうなのだが…

追記 (2016-10-06):ほかの簡単なプログラムをビルドしてみた

2016-09-19

LaTeX パッケージ作者もオプションには空白を含めないほうがよい話

前回の記事に関連したタレコミが。

\begin{filecontents}{test3.sty}
\DeclareOption{foo}{\typeout{*** FOO OPTION ***}}
\DeclareOption{bar}{\typeout{*** BAR OPTION ***}}
\DeclareOption{baz}{\typeout{*** BAZ OPTION ***}}
\DeclareOption{qux}{\typeout{*** QUX OPTION ***}}
\ExecuteOptions{foo, bar}
\ProcessOptions\relax
\end{filecontents}

\documentclass{article}
\usepackage[baz, qux]{test3}
\begin{document}
a
\end{document}

パッケージが既定で foo と bar を実行し(パッケージ内で作者が \ExecuteOptions で指定)、さらにユーザが baz と qux を指定する(\usepackage のオプション)ので、全部で四つのメッセージが出そうである。ところが

*** FOO OPTION ***
*** BAZ OPTION ***
*** QUX OPTION ***

あれ、BAR が出ない! という話。\usepackage はコンマの周りに空白があってもよいのに、\ExecuteOptions はダメ、というトラップだそうだ。

LaTeX team も「20年経って今頃なんでこんなに…?」と戸惑っていました…次回全部(これで3つめ?)直すらしい。

追記:対処されたらしい (2016-10-04)

LaTeX2e public svn のほうをみると、2016/10/02 付けで「\ExecuteOptions に空白があるとオプションを無視する話」と「\@if@pti@ns で空白があると Option clash する話」について対処された (r1227) 。いちばん難しい「\ProcessOptions の干渉」はまだの模様(処理が難しい上、バグが入ったら影響が大きいため慎重にしているっぽい)。次の LaTeX リリースは 2016/12/01 なのかな?