OSDN Git Service

ltjsclasses: bug fix
[luatex-ja/luatexja.git] / src / ltjsclasses.dtx
index 6980fd5..5f906b0 100644 (file)
@@ -22,7 +22,7 @@
 %  -----------------------------------------
 %
 % \fi
-% \CheckSum{5121}
+% \CheckSum{5209}
 %% \CharacterTable
 %%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
 %%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
@@ -50,7 +50,7 @@
 %<*driver>
 \ProvidesFile{ltjsclasses.dtx}
 %</driver>
-  [2016/03/21 ]
+  [2016/04/04 ltjsclasses ]
 %<*driver>
 \IfFileExists{luatex85.sty}{\RequirePackage{luatex85}}{}
 \documentclass{ltjsarticle}
 %   削除しました。
 % \item 「\texttt{amsmath}との衝突の回避」のコードは,上流で既に対処されているうえ,
 %   これがあると |grfext.sty| を読み込んだ際にエラーを引き起こすので削除しました。
+% \item 本家|jsclasses.dtx|では|\mag|を用いて「10pt時の組版結果を本文フォントサイズに合わせ拡大縮小」
+%   という方針でしたが,本|ltjsclasses.dtx|ではそのような方法を取っていません。
+%   \begin{itemize}
+%    \item |real|オプション指定時には,単にレイアウトに用いる各種長さの値をスケールさせるだけです。
+%      そのため,例えば本文の文字サイズが17ptのときにはcmr10でなくcmr17を用いることになり,組版結果の印象が
+%      異なる恐れがあります。
+%    \item |xreal|オプション指定時には,上記に加えてオプティカルサイズを調整する(本文ではcmr17の代わりに
+%      cmr10を拡大縮小する,など)ため,\LaTeX のフォント選択システムNFSSへパッチを当てます。
+%      こうすることで前項に書いた不具合はなくなりますが,かえって別の不具合が起きる可能性はあります。
+%   \end{itemize}
+%   標準では|xreal|オプションが有効になっています。オプション名は|bxjscls|パッケージの|magstyle|指定に倣いました。
 % \end{itemize}
 %
 % [2014-02-07 LTJ] jsclasses 2014-02-07 ベースにしました。
 % [2016-03-21 LTJ] Lua\TeX~beta-0.87.0 ではPDF出力時に|\mag|が使用できなくなったので,
 % ZRさんの|bxjscls|を参考に使わないように書き換えました。
 %
+% [2016-03-31 LTJ] |xreal|オプションを標準で有効にしました.
+%
 % \StopEventually{}
 %
 % 以下では実際のコードに即して説明します。
 % [2003-04-18] 12Qオプションを追加しました。
 %
 %    \begin{macrocode}
-\newdimen\ltjs@mpt \ltjs@mpt=1\p@
-\DeclareOption{slide}{\@slidetrue\ltjs@mpt=3.58318\p@\@landscapetrue\@titlepagetrue}
-\DeclareOption{8pt} {\ltjs@mpt=.83333\p@}% 1.2^(-1)
-\DeclareOption{9pt} {\ltjs@mpt=.91287\p@}% 1.2^(-0.5}
-\DeclareOption{10pt}{\ltjs@mpt=1\p@}
-\DeclareOption{11pt}{\ltjs@mpt=1.0954\p@}% 1.2^0.5
-\DeclareOption{12pt}{\ltjs@mpt=1.2\p@}
-\DeclareOption{14pt}{\ltjs@mpt=1.44\p@}
-\DeclareOption{17pt}{\ltjs@mpt=1.728\p@}
-\DeclareOption{20pt}{\ltjs@mpt=2\p@}
-\DeclareOption{21pt}{\ltjs@mpt=2.0736\p@}
-\DeclareOption{25pt}{\ltjs@mpt=2.48832\p@}
-\DeclareOption{30pt}{\ltjs@mpt=2.98598\p@}
-\DeclareOption{36pt}{\ltjs@mpt=3.58318\p@}
-\DeclareOption{43pt}{\ltjs@mpt=4.29982\p@}
-\DeclareOption{12Q} {\ltjs@mpt=.92308\p@}% 1pt*12Q/13Q
-\DeclareOption{14Q} {\ltjs@mpt=1.07692\p@}% 1pt*14Q/13Q
-\DeclareOption{10ptj}{\ltjs@mpt=1.08547\p@}% 1pt*10bp/13Q
-\DeclareOption{10.5ptj}{\ltjs@mpt=1.13974\p@}
-\DeclareOption{11ptj}{\ltjs@mpt=1.19402\p@}
-\DeclareOption{12ptj}{\ltjs@mpt=1.30256\p@}
+\def\ltjs@magscale{1}
+\DeclareOption{slide}{\@slidetrue\def\ltjs@magscale{3.583}\@landscapetrue\@titlepagetrue}
+\DeclareOption{8pt} {\def\ltjs@magscale{0.83}}% 1.2^(-1)
+\DeclareOption{9pt} {\def\ltjs@magscale{0.913}}% 1.2^(-0.5}
+\DeclareOption{10pt}{\def\ltjs@magscale{1}}
+\DeclareOption{11pt}{\def\ltjs@magscale{1.095}}% 1.2^0.5
+\DeclareOption{12pt}{\def\ltjs@magscale{1.200}}
+\DeclareOption{14pt}{\def\ltjs@magscale{1.440}}
+\DeclareOption{17pt}{\def\ltjs@magscale{1.728}}
+\DeclareOption{20pt}{\def\ltjs@magscale{2}}
+\DeclareOption{21pt}{\def\ltjs@magscale{2.074}}
+\DeclareOption{25pt}{\def\ltjs@magscale{2.488}}
+\DeclareOption{30pt}{\def\ltjs@magscale{2.986}}
+\DeclareOption{36pt}{\def\ltjs@magscale{3.583}}
+\DeclareOption{43pt}{\def\ltjs@magscale{4.300}}
+\DeclareOption{12Q} {\def\ltjs@magscale{0.923}}% 1pt*12Q/13Q
+\DeclareOption{14Q} {\def\ltjs@magscale{1.077}}% 1pt*14Q/13Q
+\DeclareOption{10ptj}{\def\ltjs@magscale{1.085}}% 1pt*10bp/13Q
+\DeclareOption{10.5ptj}{\def\ltjs@magscale{1.139}}
+\DeclareOption{11ptj}{\def\ltjs@magscale{1.194}}
+\DeclareOption{12ptj}{\def\ltjs@magscale{1.302}}
+%    \end{macrocode}
+%
+% \paragraph{オプティカルサイズの補正}
+% [2016-03-26 LTJ] |xreal|オプション指定時には,本文のフォントサイズが10pt以外の場合に
+% オプティカルサイズの補正を行うためにNFSSにパッチを当てます。
+% 現在の|ltjsclasses|ではこのパッチ当ては標準では行いませんが,
+% 将来どうなるかわからないので|real|, |noxreal|で無効化することができるようにしました。
+%
+% [2016-03-31 LTJ] |xreal|オプションを標準にしました.
+%    \begin{macrocode}
+\newif\if@ltjs@mag@xreal
+\@ltjs@mag@xrealtrue
+\DeclareOption{xreal}{\@ltjs@mag@xrealtrue}
+\DeclareOption{noxreal}{\@ltjs@mag@xrealfalse}
+\DeclareOption{real}{\@ltjs@mag@xrealfalse}
 %    \end{macrocode}
 %
+%
 % \paragraph{トンボオプション}
 %
 % トンボ(crop marks)を出力します。
 % \paragraph{papersizeスペシャルの利用}
 %
 % |ltjsclasses| では |papersize| オプションの有無に関わらず,
-% PDFのページサイズは適切に設定されます。
-%
-%    \begin{macrocode}
-\newif\ifpapersize
-\papersizefalse
-\DeclareOption{papersize}{\papersizetrue}
-%    \end{macrocode}
+% PDFのページサイズは適切に設定されるので,削除しました。
 %
 % \paragraph{英語化}
 %
 % \item |geometry| 側でオプション |mag| は使えません。
 % \end{itemize}
 %
-% [2016-03-21] |\mag| を使わないように全面的に書き換えました。
+% [2016-03-21 LTJ] |\mag| を使わないように全面的に書き換えました。
 % |\ltjs@mpt| に「拡大率だけ大きくしたpt」の値が格納されます。
 % |bxjscls| と同様に,|\@ptsize| は |10pt|,~|11pt|,~|12pt| オプションが指定された時だけ
 % 従来通り0,~1,~2と設定し,それ以外の場合は$-20$とすることにしました。
 % |\inv@mag| はもはや定義していません。
+%
+% [2016-03-26 LTJ] |\ltjs@magscale| に拡大率を格納した後,それを用いて |ltjs@mpt| を
+% 設定するようにしました。
 %    \begin{macrocode}
+%<*kiyou>
+\def\ltjs@magscale{0.977}
+%</kiyou>
+\newdimen\ltjs@mpt
+\ltjs@mpt=\ltjs@magscale\p@
 \ifdim\ltjs@mpt<.92\p@ % 8pt, 9pt 指定時
   \def\n@baseline{15}%
 \fi
 \ifdim\ltjs@mpt=1.0954\p@ \renewcommand{\@ptsize}{1}\else
 \ifdim\ltjs@mpt=1.2\p@    \renewcommand{\@ptsize}{2}\else
 \renewcommand{\@ptsize}{-20}\fi\fi
-%<*kiyou>
-\ltjs@mpt=0.9769230\p@
-%</kiyou>
 %    \end{macrocode}
 %
+% \paragraph{オプティカルサイズの補正}
+% \leavevmode\par
+% [2016-03-26 LTJ] |xreal|オプションの指定時には,|bxjscls|の|magstyle=xreal|
+% オプションのように,オプティカルの補正を行うためにNFSSにパッチを当てます。
+% パッチは,概ねmiscさんによる「js*.cls 同様の文字サイズ設定を
+% |\mag|によらずに行う方法:試案」
+% (\texttt{http://oku.edu.mie-u.ac.jp/\textasciitilde okumura/texfaq/qa/28416.html})の
+% 方法に沿っていますが,拡大/縮小するところの計算にはLuaを用いています。
+%
+% なお,\TeX 内部で長さはsp単位の整数倍で表現されているので,数spの誤差は仕方がないです。
+% そのため,事前に|type1cm|パッケージを読みこんでおきます。
+%
+% [2016-03-28 LTJ] |\luafunction|を使うようにし,また本文のフォントサイズが10ptのときには
+% (不要なので)パッチを当てないことにしました。
+%
+% [2016-04-04 LTJ] NFSSへのパッチを修正.
+%    \begin{macrocode}
+\if@ltjs@mag@xreal\RequirePackage{type1cm}
+\ifdim\ltjs@mpt=\p@\else
+  \expandafter\let\csname OT1/cmr/m/n/10\endcsname\relax
+  \expandafter\let\csname OMX/cmex/m/n/10\endcsname\relax
+  \newluafunction\ltjs@@magnify@font@calc
+  \begingroup\catcode`\%=12\relax
+  \directlua{
+    local getdimen, mpt=tex.getdimen, tex.getdimen('ltjs@mpt')/65536
+    local t = lua.get_functions_table()
+    t[\the\ltjs@@magnify@font@calc] = function()
+      tex.sprint(math.floor(0.5+mpt*getdimen('dimen@')))
+    end
+    function luatexja.ltjs_unmagnify_fsize(a)
+      local s = luatexja.print_scaled(math.floor(0.5+a/mpt*65536))
+      tex.sprint( (s:match('%.0$')) and s:sub(1,-3) or s )
+    end
+  }
+  \endgroup
+  \def\ltjs@magnify@external@font#1 at#2 at#3\@nil{%
+     \def\@tempa{#1}\def\@tempb{#2}%
+     \ifx\@tempb\@empty
+        \edef\@tempb{ scaled\directlua{%
+          tex.sprint(math.floor(0.5+\ltjs@magscale*1000))
+        }}%
+     \else
+        \dimen@\@tempb\relax
+        \edef\@tempb{ at\luafunction\ltjs@@magnify@font@calc sp}%
+     \fi
+     \edef\@tempa{\def\noexpand\external@font{\@tempa\@tempb}}%
+  }
+  \let\ltjs@orig@get@external@font=\get@external@font
+  \def\get@external@font{%
+    \edef\f@size{\directlua{luatexja.ltjs_unmagnify_fsize(\f@size)}}%
+    \ltjs@orig@get@external@font
+    \begingroup
+      \edef\@tempa{\external@font\space at\space at}%
+      \expandafter\ltjs@magnify@external@font\@tempa\@nil
+    \expandafter\endgroup\@tempa
+  }
+\fi\fi
+%    \end{macrocode}
+%
+%
 % \paragraph{PDFの用紙サイズの設定}
 %
 % \begin{macro}{\pdfpagewidth}
 %    \begin{macrocode}
 \renewcommand{\footnoterule}{%
   \kern-3\ltjs@mpt
-  \hrule width .4\columnwidth height \ltjs@mpt
+  \hrule width .4\columnwidth height .4\ltjs@mpt
   \kern 2.6\ltjs@mpt}
 %    \end{macrocode}
 % \end{macro}