某 Forum のコレについてもう少し詳しく調べてみる。
- Re: lengthconvert.sty で単位変換の値がおかしい (TeX Forum;ZR 氏の返信)
l3fp のどこが変わったのか
- 「連接による乗算」に高い優先順位を持たせているか否かが違う。
- TL2013 では「連接による乗算」は「除算(
/
)」より高い優先順位をもつ。
1/2mm
=1/(2mm)
≠1/2*mm
- TL2015 では「連接による乗算」は「通常の乗算(
*
)」と同じ(従って「除算」とも同じ)優先順位をもつ。
1/2mm
=(1/2)mm
=1/2*mm
(注意: l3fp では
mm
のような長さ単位は単なる数値の定数(mm
= 2.84527)として扱われる。)仕様は何であるか、何であったか
この動作の変更が本当に「仕様の変更」によるもの(バグではなく)なのかを確認してみよう。
TeX Live 2015 の expl3 のマニュアル((texdoc で開く場合は“expl3”ではなく“interface3”を指定する(texdoc interface3
)。ただし現状では“l3fp”でも同じ文書が開かれる。))には l3fp の式の演算子優先順位は次のようになっている。(9.2 節“Precedence of operators”)
- Function calls (
sin
,ln
, etc).- Binary
**
and^
(right associative).- Unary
+
,-
,!
.- Binary
*
,/
, and implicit multiplication by juxtaposition (2pi
,3(4+5)
, etc).- Binary
+
and-
.(後省略)これを見ると「連接による乗算」が
*
と同順位であることが明示されていることが判る。従って、現在の動作は“正しい仕様”である。ところが、この後を見ると、何やら様子がおかしい。
In particular, those precedences imply thatsin2pi
= sin(2π) = 0,
2^2max(3, 4)
= 22max(3,4) = 256.さっき示した規則に従うと、「連接を
*
に変えても同じ」だから以下のようになるはずである。
sin2pi
=sin2*pi
=(sin2)*pi
= 2.856642^2max(3, 4)
=2^2*max(3, 4)
=(2^2)*max(3, 4)
= 16実際に試してみると、TL2015 では「規則通りの」値になり、一方で TL2013 は「マニュアルに書いてある」値になる。
\typeout{% % TL2015 TL2013 \fp_eval:n{sin2pi}^^J% % 2.85664 -0.00000 \fp_eval:n{2^2max(3, 4)}} % 16 256ということは、やはり「仕様が変わった」のだと予想される。マニュアルの「規則の記述」は更新したが、その後にある例の記述の修正を忘れているのだろう。
というわけで、実際に TeX Live 2013(最終版)の expl3 のマニュアルを調べてみた。やはり、この時点の仕様では「連接による乗算」に高い優先順位を持たせていたことが判る。
- Implicit multiplication by juxtaposition (
2pi
,3(4+5)
, etc).- Function calls (
sin
,ln
, etc).- Binary
**
and^
(right associative).- Unary
+
,-
,!
.- Binary
*
,/
and%
.- Binary
+
and-
.