Hatena::ブログ(Diary)

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

2016-06-24

color パッケージが縦組でアレになってしまった話

先日の「color パッケージの dvips オプションがエラーになる話」の調査継続中。

「(2) pLaTeX で対処できるかもしれない案」の続き

先日の方法だと、\AtBeginDvi{} を発行するとまたエラーが起きてしまうことがわかった。そこで、unbox せずに box する方法を追求するなら

\makeatletter
\def \@begindvi{%
  \box \@begindvibox
  \global\let \@begindvi \@empty
}
\def \AtBeginDvi #1{%
  \global \setbox \@begindvibox
  \vbox{\box \@begindvibox #1}%
}
\makeatother
\documentclass[dvips]{tarticle}
\usepackage{color}
\AtBeginDvi{}
\begin{document}

あいうえお

\end{document}

とする必要があるようだ。出力も正常だがやっぱり副作用が心配。

「(3) pLaTeX でエラーだけ消し去る案」の続き

先日の方法だとレイアウトは駄目なままだったが、以下のようにする:

\makeatletter
\def \@begindvi{%
  \iftbox\@begindvibox\tate\else\yoko\fi
  \unvbox \@begindvibox
  \global\let \@begindvi \@empty
}
\def \AtBeginDvi #1{%
  \global \setbox \@begindvibox
  \vbox{\iftbox\@begindvibox\tate\else\yoko\fi
  \unvbox \@begindvibox #1}%
}
\makeatother
\documentclass[dvips]{tarticle}
\usepackage{color}
\AtBeginDvi{}
\begin{document}

あいうえお

\end{document}

これはなんと出力が正常!(ちょっと驚き)

上記 2 例とも A4 縦以外のレイアウトを試していないが、実際にクラスオプションに [a5paper] などを指定してみると「dvips.def が意図した setpagesize が正しくはたらいている」ことも確認できた。

事の顛末:そもそも color パッケージは関係なかった話

ちなみに、LaTeX team の David さんから

\documentclass{tarticle}
\AtBeginDocument{\AtBeginDvi{}}
\begin{document}

a

\end{document}

がエラーを出す MWE であることも教えていただいた。2 種類の \AtBeginナントカ がそろって初めてエラーになるので、いままで pLaTeX で気づかなかったのだろう。

2016-06-18

pLaTeX と共存できていない LaTeX パッケージの備忘録(続・続編)

なんか多忙のためサブブログを書かない日が数週間続いてしまった。この期間にメインブログの記事は 3 回も更新したが…

気を取り直して、初回第2回に続き、3回目。

color パッケージ

縦組で使うと、ドライバ dvipdfmx 指定だと正常終了なのに dvips 指定だとエラー。

\documentclass[dvips]{tarticle}
\usepackage{color}
\begin{document}

{\color{red}あいうえお}

\end{document}
./test.tex:7: Incompatible direction list can't be unboxed.
\@begindvi ->\unvbox \@begindvibox 
                                   \global \let \@begindvi \@empty 
l.7 \end{document}
                  
? 

原因はまだ調べていない。別のところで報告されているのすら見つからない…

追記 (2016-06-23):TeX Live 2015 最終版では通る模様。2016 最新版はエラー。

  • 2015 は「dvips.def 2015/12/30 v3.0k」
  • 2016 は「dvips.def 2016/06/02 v3.0l」あるいは「dvips.def 2016/06/17 v3.0m」

なので、この間の変更すなわち setpagesize が関係していると推測*1
→ かなり厄介そうなので forum:1956 へ。とりあえず回避するには:

(1) ユーザ側でなんとかする案:nosetpagesize オプション
\documentclass[dvips]{tarticle}
\usepackage[nosetpagesize]{color}
\begin{document}

{\color{red}あいうえお}

\end{document}

デフォルトが setpagesize なので、それを override する。しかし、この方法はよほどユーザが注意しないと忘れがちだと思う*2

(2) pLaTeX で対処できるかもしれない案
\makeatletter
\def\@begindvi{%
  \box\@begindvibox
  \global\let\@begindvi\@empty
}
\makeatother
\documentclass[dvips]{tarticle}
\usepackage{color}
\begin{document}

{\color{red}あいうえお}

\end{document}

これはエラーなく終了して出力も正常。ただし unbox しないことで良からぬ副作用がないかどうかは未検討。もし副作用がないならこれは優れた方法かも。

(3) pLaTeX でエラーだけ消し去る案(レイアウトは駄目なまま)
\makeatletter
\def\@begindvi{%
  \iftbox\@begindvibox\tate\else\yoko\fi
  \unvbox\@begindvibox
  \global\let\@begindvi\@empty
}
\makeatother
\documentclass[dvips]{tarticle}
\usepackage{color}
\begin{document}

{\color{red}あいうえお}

\end{document}

先述の心配事である unbox は保持できるが、dvips.def に対して pLaTeX 縦組用に ad hoc な変更を加えてもらうことが前提として必要になってしまう。
もう少し調べてみた (2016-06-24) 。

ちょっと前の biblatex パッケージ(?)

これは forum:1508 より。最小ソースは置いてあるんだが…あれ、今やってみるとエラー出なかった… biblatex が変わったのかな。

CJK パッケージ ← 要注意!

欧文 LaTeX (pdflatex) などで日中韓文書を作りたい場合に便利な CJK パッケージだが、結論を言うと僕自身は CJK.sty は pLaTeX とは共存しないと思う。最も引っかかりそうなのが、ruby.sty という「ルビをふるパッケージ」である。これが CJK パッケージ群のものだとは名前からは気づきにくい。

\documentclass[a4j]{tarticle}
\usepackage{ruby} % including CJK.sty here!
\begin{document}
振り仮名のテスト。\ruby{}{}\ruby{}{}\ruby{}{}のテスト。
\end{document}

ルビが小書きにならないのは、pLaTeX が再定義している \selectfont が CJK.sty によって上書きされてしまうから。同じ原因で、OTF パッケージが文字化けするという問題も知られている (forum:1748) 。pLaTeX でルビをつけたければ、美しい pxrubrica パッケージを使うか、簡単なマクロなら okumacro を参考に \ruby を作ってしまうのが上策だろう。

先日の記事では everysel / tracefnt パッケージによる \selectfont の再定義をうまく回避する方法を考察したが、これは everysel など(や、それに依存したパッケージたち)に一定の有用性を見いだせたからである。しかし、CJK の場合はなにが有用なのか分からない… というわけで、forum:1954 へ出した。

*1:geometry パッケージが縦組で使えないのも同じエラーなので、たぶん現象としては近いことが起きているのかも。

*2:第三者のパッケージが color を呼ぶ事例は極めて多いが、ページを shipout するところで初めてエラーが出るため、原因に気づきづらいはずだ。

2016-05-25

\jis, \euc, \sjis, \kuten(続き)

先日のソースOS X で処理してみた。

pTeX と upTeX(および LuaTeX-ja)で比較 on OS X

ソースも再掲。表が実際の処理結果 (TeX Live 2016 pretest final, OS X self-build) 。

\ifx\directlua\undefined\else
  \input luatexja.sty
\fi
[1] \char\jis"2422    % あ
[2] \char\euc"A4A2    % あ
[3] \char\sjis"82A0   % あ
[4] \char\jis"2420    % .notdef
[5] \char\euc"A4A0    % .notdef
[6] \char\sjis"829E   % .notdef
[7] \char\sjis"829E1  % (invalid)
[8] \char\kuten"253C  % 怒
[9] \char\kuten"253C1 % (invalid)
\bye
(e-)pTeX(e-)upTeXLuaTeX-ja
[1]
[2]
[3]
[4]! Bad character code (42144).NUL (^@)NUL (^@)
[5]! Bad character code (42144).NUL (^@)NUL (^@)
[6].notdefNUL (^@)NUL (^@)
[7]! invalid character code (535009).
[8]
[9]! Bad character code (-1).NUL (^@)NUL (^@)

OS X の場合 (e-)pTeX は漢字コードは utf8.euc なので、W32TeX とはもちろん微妙に異なる。(e-)upTeX は utf8.uptex で W32TeX と同じ結果、LuaTeX-ja も W32TeX と同じ結果になった(ただし期待とは違う)。

割り当てられた文字がない場合(文字コード表でいうところの「左上角」のアキ点にあたる [4][5][6])や不正な入力をした場合(16 bit 数値であるべきところにそれより大きな値を入れた [7] や [9])は仕様が未定義なのかもしれない。LuaTeX-ja の「あ」→「ぢ」は明らかに変なので、後日調べてみようと思う。

追記 (2016-05-27):LuaTeX-ja の \sjis のバグの原因が判明。

--- ltj-compat.lua.1~	Sun May 15 03:29:22 2016
+++ ltj-compat.lua	Fri May 27 23:04:03 2016
@@ -110,7 +110,7 @@
 	if c1>0x7f then i=0x40 else i=0x3f end
 	c1 = c1 - i
      else
-	c1 = c1 - 0x7e
+	c1 = c1 - 0x9e
      end
      from_kuten(c2*256+c1)
   end

これで「あ」→「あ」と正常になるはず。というわけでとりあえず報告

2016-05-23

\jis, \euc, \sjis, \kuten

以前 ptexenc のバッファオーバーランが原因で(特定の環境において)たくさんのファイルを一度に open するとヘンになる(余分なΛが出てくるなど)例があった。今度は \jis / \euc / \sjis / \kuten といった pTeX のプリミティブであれ?と思った例を書いておく。まだ手元では Win32 でしか実験していない。

pTeX と upTeX(および LuaTeX-ja)で比較 on Win32

以下のソースを (e-)(u)pTeX で処理。仮にエラーが出て止まった場合は、その行をコメントアウトしてその後の行の結果を見ていくことにする。ソース各行の末尾のコメントは、僕が思っていた結果。その下の表が実際の処理結果 (W32TeX 2016/05/23) 。Win32 バイナリでは (e-)pTeX の漢字コードは sjis、(e-)upTeX は utf8.uptex だった。

\ifx\directlua\undefined\else
  \input luatexja.sty
\fi
[1] \char\jis"2422    % あ
[2] \char\euc"A4A2    % あ
[3] \char\sjis"82A0   % あ
[4] \char\jis"2420    % .notdef
[5] \char\euc"A4A0    % .notdef
[6] \char\sjis"829E   % .notdef
[7] \char\sjis"829E1  % (invalid)
[8] \char\kuten"253C  % 怒
[9] \char\kuten"253C1 % (invalid)
\bye
(e-)pTeX(e-)upTeXLuaTeX-ja
[1]
[2]
[3]
[4].notdefNUL (^@)NUL (^@)
[5].notdefNUL (^@)NUL (^@)
[6].notdefNUL (^@)NUL (^@)
[7]! Bad character code (535009).! invalid character code (535009).
[8]
[9]! Bad character code (33087).NUL (^@)NUL (^@)

(e-)pTeX は予想どおりだったのだけど、(e)-upTeX や LuaTeX-ja は「Γ」が出てきたし(これはたぶん 0 つまり nul のこと?)、全然違う文字が出てきたところもある。また明日以降、別の環境で試してみるつもり。 → 続き

2016-05-20

古い TeX をインストールする (W32TeX, TeX Live) 続編

前回の続きということで。

古い W32TeX のダウンロード

数か月前程度のものなら兼宗さんのところに残っている場合があるのは、割と知られている(W32TeX - TeX Wiki にも記述あり)。

それよりちょっと古い 2013 年末のものが KTUG にある。同じ KTUG にはさらに古い 2008 年のものも残されている。

驚いたのが、dviout/dviprt で有名な大島先生のところ。2003 年の W32TeX がバックアップされている。残念ながら pTeX のバイナリを含む ptex-3.1.2-w32.tar.gz だけが残っていないが、他はそろっているようだ。手元の Windows 7 でもちゃんと動く。

それより古いものは…書籍についている CD-ROM やフロッピーディスクを読めれば入手可能だと思うが、試していない。

余談 (1):W32TeX のインストーラ版

ちなみに、W32TeX は一時期 msi 形式のインストーラを持っていたことがあるらしい。こちらも KTUG のアーカイブに残されている。

これに丸ごと入っているので、これ一つ持っておけばいつでも 2008 年初頭の W32TeX を展開&インストールできて便利。

余談 (2):e-pTeX 電卓?

2008 年の W32TeX というのを挙げたが、この頃は北川さんによる e-pTeX が話題になった直後である。当時の資料*1にも書かれているとおり「浮動小数点演算の実装」パッチがまだ入っていたころである。というわけで

C:\tmp>eptex \fpinit
This is e-pTeX, Version 3.141592-p3.1.10-2.2 (sjis) (Web2C 7.5.6)
entering extended mode
Floating operation initialized.

*\skip300=\real2 \fplog\skip300

*$\log2\simeq\fpfrac\skip300\times10^{\fpexpr\skip300}$\bye
[1]
Output written on texput.dvi (1 page, 440 bytes).
Transcript written on texput.log.

C:\tmp>dvipdfmx texput
texput.dvi -> texput.pdf
[1]
7550 bytes written

となって計算結果がプリントされる(この例は fp.pdf より)。
f:id:acetaminophen:20160523225442p:image
もちろん最近の eptex では

C:\tmp>eptex \fpinit
This is e-pTeX, Version 3.14159265-p3.7-160201-2.6 (sjis) (TeX Live 2016/W32TeX)
 (preloaded format=eptex)
 restricted \write18 enabled.
entering extended mode
! Undefined control sequence.
<*> \fpinit

? 

となる。

余談 (3):アレ、restricted \write18 は?

さっきの 余談(2) の e-pTeX の起動時のログを見ると

restricted \write18 enabled.

がない*2。この当時はまだ restricted shell escape という概念が存在せず、-shell-escape と -no-shell-escape の二択だったことを示している。restricted shell escape が導入されたのは TeX Live 2009 なので当然である:

いろいろ見ていると、やはり TeX も生きていることを感じる。

*1:「計算数学II 作業記録」resume.pdf または eptex_resume.pdf を参照。

*2:そういえば、LuaTeX beta-0.85.0 で \write18 が廃止されたのも記憶に新しい。