local id_pbox_w = node.id('hlist') + 513 -- cluster which consists of a whatsit
local sid_user = node.subtype('user_defined')
+local sid_start_link = node.subtype('pdf_start_link')
+local sid_start_thread = node.subtype('pdf_start_thread')
+local sid_end_link = node.subtype('pdf_end_link')
+local sid_end_thread = node.subtype('pdf_end_thread')
+
local ITALIC = 1
local PACKED = 2
local KINSOKU = 3
local function calc_np_pbox()
local uid = has_attr(lp, attr_uniqid)
- Np.first = lp; Np.id = id_pbox
+ Np.first = Np.first or lp; Np.id = id_pbox
lpa = KINSOKU -- dummy=
while lp~=last and lpa>=PACKED and lpa~=BOXBDD
and has_attr(lp, attr_uniqid) == uid do
local calc_np_auxtable = {
[id_glyph] = function()
- Np.first = lp
+ Np.first = Np.first or lp
if lp.font == has_attr(lp, attr_curjfnt) then
Np.id = id_jglyph
else
Np.id = id_glyph
end
- Np.first = lp; Np.nuc = lp; set_attr_icflag_processed(lp)
+ Np.nuc = lp; set_attr_icflag_processed(lp)
lp = node_next(lp); check_next_ickern(); return true
end,
[id_hlist] = function()
- Np.first = lp; Np.last = lp; Np.nuc = lp;
+ Np.first = Np.first or lp; Np.last = lp; Np.nuc = lp;
set_attr_icflag_processed(lp)
if lp.shift~=0 then
Np.id = id_box_like
lp = node_next(lp); return true
end,
[id_vlist] = function()
- Np.first = lp; Np.nuc = lp; Np.last = lp;
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
Np.id = id_box_like; set_attr_icflag_processed(lp);
lp = node_next(lp); return true
end,
[id_rule] = function()
- Np.first = lp; Np.nuc = lp; Np.last = lp;
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
Np.id = id_box_like; set_attr_icflag_processed(lp);
lp = node_next(lp); return true
end,
return false
end,
[id_disc] = function()
- Np.first = lp; Np.nuc = lp; set_attr_icflag_processed(lp);
+ Np.first = Np.first or lp;
+ Np.nuc = lp; set_attr_icflag_processed(lp);
Np.last = lp; Np.id = id_disc; lp = node_next(lp); return true
end,
[id_whatsit] = function()
end
end
else
+ -- we do special treatment for these whatsit nodes.
+ if lp.subtype == sid_start_link or lp.subtype == sid_start_thread then
+ Np.first = lp
+ elseif lp.subtype == sid_end_link or lp.subtype == sid_end_thread then
+ Nq.last = lp; Np.first = nil
+ end
set_attr_icflag_processed(lp); lp = node_next(lp)
end
return false
end,
[id_math] = function()
- Np.first = lp; Np.nuc = lp;
+ Np.first = Np.first or lp; Np.nuc = lp;
set_attr_icflag_processed(lp); lp = node_next(lp)
while lp.id~=id_math do
set_attr_icflag_processed(lp); lp = node_next(lp)
return true
end,
[id_glue] = function()
- Np.first = lp; Np.nuc = lp; set_attr_icflag_processed(lp);
+ Np.first = Np.first or lp; Np.nuc = lp; set_attr_icflag_processed(lp);
Np.last = lp; Np.id = id_glue; lp = node_next(lp); return true
end,
[id_kern] = function()
- Np.first = lp
+ Np.first = Np.first or lp
if lp.subtype==2 then
set_attr_icflag_processed(lp); lp = node_next(lp)
set_attr_icflag_processed(lp); lp = node_next(lp)
lp = node_next(lp); return false
end,
[13] = function()
- Np.first = lp; Np.nuc = lp; Np.last = lp;
+ Np.first = Np.first or lp; Np.nuc = lp; Np.last = lp;
Np.id = id_box_like; set_attr_icflag_processed(lp);
lp = node_next(lp); return true
end,
--- /dev/null
+%#!lualatex
+\documentclass{article}
+\usepackage{luatexja}
+\usepackage[pdfborder={0 0 0.1}]{hyperref}
+% \usepackage{hyperref,luatexja} ではなぜかダメ
+\def\dumplist#1{\par\noindent\leavevmode
+\hbox to 0.2\hsize{\copy#1\hss}%
+\vbox{\hsize=0.6\hsize\scriptsize\tt\baselineskip=7.2pt\let\\=\relax
+\directlua{luatexja.ext_show_node_list(tex.getbox(#1).head, '\\par ', tex.print)}\hrule}}
+
+\def\thesubsection{.}
+\def\thesubsubsection{あ}
+\DeclareFontShape{JY3}{mc}{h}{n}{<-> s*[0.962212] psft:GothicBBB-Medium:jfm=hang}{}
+\ltjsetparameter{xkanjiskip=10pt}% わざと大きくする
+\begin{document}
+\section{hoge}\label{hoge}
+
+\subsection{piyo}\label{piyo}
+
+\subsubsection{fuga}\label{fuga}
+
+\setbox0=\hbox{あ\ref{hoge}い}\dumplist0
+\setbox0=\hbox{)\ref{hoge}(}\dumplist0
+\setbox0=\hbox{\kanjiseries{h}\selectfont あ\ref{piyo}い}\dumplist0
+\setbox0=\hbox{あ\ref{piyo}い}\dumplist0
+\setbox0=\hbox{)\ref{hoge}\ref{fuga}}\dumplist0
+
+\end{document}