texjporg / platex

pLaTeX community edition
BSD 3-Clause "New" or "Revised" License
49 stars 8 forks source link

tabular の右揃えセル (r) が揃わないバグ #54

Closed aminophen closed 6 years ago

aminophen commented 6 years ago

forum:2232#p13308 で報告されたように,2017/07/29 付けの #43 の修正ミスによりバグが混入していました。r による右揃えしようとしたセルの中身が空だった場合の出力が正しくありません。

\documentclass{jsarticle}
\begin{document}

\begin{tabular}{|r|c|}
& xyz \\
a & 111 \\
bb & 22 \\
ccc & 3
\end{tabular}
2番目の縦罫線が揃わない。

\vspace{5mm}

\begin{tabular}{|r|c|}
{} & xyz \\
a & 111 \\
bb & 22 \\
ccc & 3
\end{tabular}
問題なし。

\end{document}

master ブランチは次のリリース準備の途中だったので,fixtabular ブランチを新たに切って a698323 でなおしてみました。と言っても 165cd95 のコミットを revert しただけです。

aminophen commented 6 years ago

# なんでそうコミットしたのか,はよく覚えていません。確か,網羅的に準備したつもりのテストケース (tabglue.tex) の時点では以下の2つの手があって,どっちでもよかったのだという記憶があります。

でも実際には「空」の場合が抜けていて,今回のバグに至った,ということですね…。

aminophen commented 6 years ago

今さらですが,このバグコードが「なんとなく動いた」理由もこれと同じで,pTeX の「\inhibitglue が展開不能トークンを透過するケースがある」という挙動に由来していました。

TeX Live 2017 時点の pTeXでは:

お\inhibitglue\ignorespaces (あ % (1)

では \inhibitglue が \ignorespaces によってリセットされ, のグルーが入る一方,

あ\hskip0pt\inhibitglue\ignorespaces (あ % (2)

では \inhibitglue がなぜかリセットされなくなり, のグルーが消える。この後者 (2) のケースを利用したのが \@tabclassz に「\inhibitglue … \unskip を追加する方法」だったことになる。