\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
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 しないとリストの整合性が崩れる……?
)
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
\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.
\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
\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{
% 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
\endgroup
%% internal macros are no longer effective
-
+%</atbegshi>-------------------------------------
+\fi
\endinput