OSDN Git Service

\shipout and its hooks
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Tue, 4 Aug 2020 03:03:21 +0000 (12:03 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Tue, 4 Aug 2020 03:03:21 +0000 (12:03 +0900)
src/ltj-base.sty
src/ltj-direction.lua
src/luatexja-core.sty
src/patches/lltjp-atbegshi.sty

index 605797f..622b387 100644 (file)
@@ -13,7 +13,7 @@
 
 \ifltj@in@latex                 %<*LaTeX>
   \NeedsTeXFormat{LaTeX2e}
-  \ProvidesPackage{ltj-base}[2020-07-27]
+  \ProvidesPackage{ltj-base}[2020-08-04]
 \fi                             %</LaTeX>
 
 %%------------------ Tiny helpers
 %! plain であるか.
 \ltj@csletcs{ifltj@in@plain}{iffalse}
 
-%% \ltj@require@package{<package>}{<date>}
-%! サブパッケージを読み込む. LaTeX では \RequirePackage、それ以外では
-%! \input を使う. <date> は必須だが空でもよい.
-\def\ltj@require@package#1#2{
-  \RequirePackage{#1}[#2]
-}
-
 %% \ltj@print{<message>}
 %! 端末への出力.
 \let\ltj@print\typeout
   \ltj@csletcs{ifltj@in@plain}{iffalse}
 \fi
 
-%% \ltj@require@package{<package>}{<date>}
-\def\ltj@require@package#1#2{
-  \input #1.sty\relax
-}
-
 %% \ltj@print{<message>}
 \def\ltj@print#1{
   \immediate\write16{#1}
 %% from Sonja Maus, ``Looking Ahead for a <box>'',
 %%      TUGBoat, 11, No. 4, 1990.
 \newbox\ltj@afbox
+\directlua{luatexja.afbox_number=\the\ltj@afbox}
 \protected\def\ltj@afterbox#1{%
   \def\ltj@afb@xarg{#1}%
   \afterassignment\ltj@afb@x
index 523397d..22285c4 100644 (file)
@@ -900,8 +900,7 @@ do
          local sd = to_direct(s)
          local box_dir = get_box_dir(sd, dir_yoko)
          if box_dir%dir_math_mod ~= list_dir then
-            setbox(
-               'ltj@afbox',
+            setbox('ltj@afbox',
                to_node(copy_list(make_dir_whatsit(sd, sd, list_dir, 'box_move')))
                -- copy_list しないとリストの整合性が崩れる……?
             )
@@ -1115,19 +1114,20 @@ do
          end
       end
    end
-   local getbox = tex.getbox
+   local getbox, shipout = tex.getbox, tex.shipout
    local setbox, copy = node.direct.setbox, node.direct.copy
    local lua_mem_kb = 0
-   function luatexja.direction.finalize()
-      local a = to_direct(tex.getbox("AtBeginShipoutBox"))
+   function luatexja.direction.shipout()
+      start_time_measure 'box_primitive_hook'
+      local a = to_direct(getbox 'ltj@afbox')
       local a_dir = get_box_dir(a, dir_yoko)
       if a_dir~=dir_yoko then
          local b = create_dir_node(a, a_dir, dir_yoko, false)
          setfield(b, 'head', a); a = b
       end
-      setfield(shipout_temp, 'head', a)
-      finalize_inner(shipout_temp)
-      setbox('global', "AtBeginShipoutBox", copy(getlist(shipout_temp)))
-      setfield(shipout_temp, 'head',nil)
+      setfield(shipout_temp, 'head', a); finalize_inner(shipout_temp)
+      setbox('ltj@afbox', copy(getlist(shipout_temp))); setfield(shipout_temp, 'head',nil)
+      shipout(luatexja.afbox_number)
+      stop_time_measure 'box_primitive_hook'
    end
 end
index 4acc74c..b5f13d5 100644 (file)
@@ -65,7 +65,7 @@
   \expandafter\let\csname ifltj@in@latex\expandafter\endcsname
     \csname iftrue\endcsname
   \NeedsTeXFormat{LaTeX2e}
-  \ProvidesPackage{luatexja-core}[2020-07-27 Core of LuaTeX-ja]
+  \ProvidesPackage{luatexja-core}[2020-08-04 Core of LuaTeX-ja]
 \fi                             %</LaTeX>
 
 %% Load prerequisite packages.
@@ -80,7 +80,6 @@
   \RequirePackage{xkeyval}    [2012/10/14] % v2.6b
   \RequirePackage{etoolbox}
   \RequirePackage{lltjp-atbegshi}
-  \AtBeginShipoutInit
   \IfFileExists{everyhook.sty}{\RequirePackage{everyhook}\ltj@everyhook@availtrue}{}
 \else                           %<*!LaTeX>
   \input luatexbase.sty
@@ -89,7 +88,6 @@
   \input pdftexcmds.sty
   \input xkeyval
   \input lltjp-atbegshi.sty
-  \AtBeginShipoutInit
 \fi                             %</LaTeX>
 \endlinechar=-1 %
 
 
 %%%% \hbox, \vbox, \vtop
 \setbox\z@\hbox{%
-  \primitive\everymath{}
+  \primitive\everymath{}%
   $\directlua{% This value depends on the version of LuaTeX.
      luatexja.stack.mmode = -tex.nest[tex.nest.ptr].mode
   }$%
 
 \protected\def\ltj@@reset@badness{\luafunction\ltj@@reset@badness@inner}
 
-\AtBeginShipout{\directlua{luatexja.direction.finalize()}}
-
 %%%% \raise, \lower, \moveleft, \moveright
 \newluafunction\ltj@@lua@raisebox@inner
 \directlua{
 %%%%\vsplit
 \let\ltj@@orig@vsplit=\vsplit
 \protected\def\vsplit{\directlua{luatexja.direction.vsplit()}}
+
 %%%% \vcenter
 \let\ltj@@orig@vcenter=\vcenter
 \protected\def\vcenter{\ltj@afterbox\ltj@@vcenter\vbox}
   \ltj@@lua@raisebox\ltj@@orig@vcenter{\box\ltj@afbox}%
 }
 
+%%%% \shipout
+\newluafunction\ltj@@lua@shipout@inner
+\directlua{
+  local t = lua.get_functions_table()
+  t[\the\ltj@@lua@shipout@inner]=luatexja.direction.shipout
+}
+\protected\luadef\ltj@@lua@shipout\ltj@@lua@shipout@inner
+\protected\def\ltj@shipout{\ltj@afterbox\ltj@@lua@shipout}
+\ifprimitive\shipout\let\shipout\ltj@shipout\fi
+\ifcsname tex_shipout:D\endcsname
+  \expandafter\let\csname tex_shipout:D\endcsname\ltj@shipout
+\fi
+\ifdefined\AtBeginShipoutOriginalShipout
+  \let\AtBeginShipoutOriginalShipout\ltj@shipout
+\fi
 %%%% \unhbox and \unvbox
 \newluafunction\ltj@@lua@unboxcheckdir@inner
 \directlua{
index ecdfd48..6666809 100644 (file)
@@ -2,23 +2,44 @@
 % lltjp-atbegshi.sty
 %
 
+\newif\ifltj@ltshipout@avail
 \ifdefined\NeedsTeXFormat
   \NeedsTeXFormat{LaTeX2e}
-  \ProvidesPackage{lltjp-atbegshi}[2020-07-30 Patch to atbegshi for LuaTeX-ja]
-  \RequirePackage{atbegshi}
+  \ProvidesPackage{lltjp-atbegshi}[2020-08-04 Patching \string\shipout\space hooks for LuaTeX-ja]
+  \@ifl@t@r\fmtversion{2020-10-01}{%
+    \ifnum\patch@level<0\relax \ifnum\patch@level<-6 \ltj@ltshipout@availtrue\fi
+    \else\ltj@ltshipout@availtrue\fi
+  }{}
+  \ifltj@ltshipout@avail\else\RequirePackage{atbegshi}\fi
 \else
   \input atbegshi.sty
 \fi
 
-%--------------------------------------
-% following codes are almost copied from
-%   pxatbegshi.sty 2019/09/07 v0.5 (in platex-tools bundle, by H. Yamashita).
+% concept: execute all hooks inside yoko direction \vbox
+
+\ifltj@ltshipout@avail
+%<*ltshipout>-----------------------------------
+%
+\RequirePackage{expl3}
+\ExplSyntaxOn\makeatletter
+\box_new:N \l__platex_shipout_dummy_box
+\pretocmd {\__shipout_execute_cont:}
+  {\tex_setbox:D \l__platex_shipout_dummy_box \tex_vbox:D \c_group_begin_token \yoko } {} {}
+\apptocmd {\__shipout_execute_cont:} {\c_group_end_token} {} {}
+\ExplSyntaxOff
+%</ltshipout>-----------------------------------
+
+\else
+\AtBeginShipoutInit
+%<*atbegshi>-------------------------------------
+% patching atbegshi.sty
+%%%  following codes are almost copied from
+%%%  pxatbegshi.sty 2019/09/07 v0.5 (in platex-tools bundle, by H. Yamashita).
 
 %% internal macros are locally effective
 \begingroup
 
-%--------------------------------------- helpers
-
+% helpers
 %% unique tokens
 \def\pxabgs@mark{\pxabgs@mark@}
 \def\pxabgs@fin{\pxabgs@fin@}
 \def\pxabgs@patch@cmd#1#2#3{%
   \ifx#1\relax\else
   \def\pxabgs@next##1#2##2\pxabgs@mark##3\pxabgs@fin{%
-    \ifx\pxabgs@mark##3\pxabgs@mark
-      \let#1\relax
+    \ifx\pxabgs@mark##3\pxabgs@mark\let#1\relax
     \else
-      \def\pxabgs@fragment{##2}%
-      \def#1{##1#3##2}%
+      \def\pxabgs@fragment{##2}\def#1{##1#3##2}%
     \fi}%
   \expandafter\pxabgs@next#1\pxabgs@mark#2\pxabgs@mark\pxabgs@fin
   \fi
 }
 
-%---------------------------------------
-
-% concept: execute all hooks inside yoko direction \vbox
-
 % prepare
-\let\pxabgs@AtBegShi@Output\AtBegShi@Output
+\ifdefined\AtBegShi@Output
+  \let\pxabgs@AtBegShi@Output\AtBegShi@Output
+\else\let\pxabgs@AtBegShi@Output\relax\fi
 % try first patch
 \pxabgs@patch@cmd\pxabgs@AtBegShi@Output
   {\let\AtBegShi@OrgProtect\protect}%
   {\setbox8\vbox\bgroup\yoko\let\AtBegShi@OrgProtect\protect}
 \pxabgs@patch@cmd\pxabgs@AtBegShi@Output
-    {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox}%
-    {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox\egroup}
+  {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox}%
+  {\AtBeginShipoutOriginalShipout\box\AtBeginShipoutBox\egroup}
 \pxabgs@patch@cmd\pxabgs@AtBegShi@Output
   {%
     \begingroup
@@ -75,5 +92,6 @@
 
 \endgroup
 %% internal macros are no longer effective
-
+%</atbegshi>-------------------------------------
+\fi
 \endinput