summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/plain/pitex/sections.ptx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/plain/pitex/sections.ptx')
-rw-r--r--Master/texmf-dist/tex/plain/pitex/sections.ptx435
1 files changed, 275 insertions, 160 deletions
diff --git a/Master/texmf-dist/tex/plain/pitex/sections.ptx b/Master/texmf-dist/tex/plain/pitex/sections.ptx
index 1c56112bdac..a6d1f954319 100644
--- a/Master/texmf-dist/tex/plain/pitex/sections.ptx
+++ b/Master/texmf-dist/tex/plain/pitex/sections.ptx
@@ -1,144 +1,180 @@
-\def\ptx@bookmark_list{}
-\def\ptx@bookmark_stack{}
-\def\createbookmark{%
- \ifnextnospace[{\ptx@createbookmark}{\ptx@createbookmark[]}%
- }
-\def\ptx@createbookmark[#1]#2#3#4{%
- \passexpanded{\ptx@bookmark_add{#2}{{#3}{#4}{#1}}}\ptx@bookmark_stack
- }
-\bgroup
-\setcatcodes{\{\}=12,<=1,>=2}
-\gdef\ptx@leftbrace<{>
-\gdef\ptx@rightbrace<}>
-\egroup
-\newfor\ptx@bookmark_add{2}#3,{%
- \straightenif{ifdim}{#1pt>#3pt }
- {\eaddright\ptx@bookmark_list{#2\ptx@leftbrace}
- \retrieverest{\ptx@bookmark_addtostack{#1,#3,}}}
- {\eaddright\ptx@bookmark_list{\ptx@rightbrace,}}
- }[\eaddright\ptx@bookmark_list{#2\ptx@leftbrace}
- \ptx@bookmark_addtostack{#1,}{}]
-\def\ptx@bookmark_addtostack#1#2{\def\ptx@bookmark_stack{#1#2}}
-\newfor\ptx@bookmark_endlist#1,{%
- \eaddright\ptx@bookmark_list{\ptx@rightbrace,}%
- }
-\newfor\ptx@bookmark_process#1#2#3#4,{%
- \ptx@bookmark_subcount{0}{#1}{#2}{#3}{#4}%
- \reverse\iffemptystring{#4}{\ptx@bookmark_process{#4}}%
- }
-\newfor\ptx@bookmark_subcount{4}#5,{%
- \passarguments{#1+1}{#2}{#3}{#4}
- }[\def\ptx@bookmark_sign{-}%
-% \def\ptx@bookmark_options{}%
-% \ptx@option_launchloop{bookmark}{#4}%
- \pdfoutline attr {#4} goto name {#3} count \ptx@bookmark_sign\the\numexpr(#1) {#2}%
- ]
-\def\processbookmarks{%
- \reverse\iffemptycommand\ltr@bookmark_list{%
- \expandafter\ptx@bookmark_endlist\expandafter{\ptx@bookmark_stack}
- \bgroup
- \setcatcodes{_@=11}
- \scantokens\expandafter{\expandafter\gdef\expandafter\ptx@bookmark_list\expandafter{\ptx@bookmark_list}}%
- \egroup
- \expandafter\ptx@bookmark_process\expandafter{\ptx@bookmark_list}}
+\newcount\ptx@penalty
+\ptx@penalty=-10000
+
+\def\newbreakpenalty#1{%
+ \advance\ptx@penalty-1
+ \edef#1{\the\ptx@penalty\relax}
}
-%\let\ptx@end\end
-%\def\end{\processbookmarks\ptx@end}
-%
-\newcount\ptx@section_link
-\let\sectionaction\unbrace
-\def\tosection#1#2{%
- \reverse\iffcs{ptx@section_dest:#1}
- {\global\advance\ptx@section_link1
- \xdefcs{ptx@section_dest:#1}{\the\ptx@section_link}}%
- \sectionaction{\pdfstartlink attr {/Border [0 0 0]} goto name {ptx@section_link:\usecs{ptx@section_dest:#1}}#2\pdfendlink}%
+
+\newbreakpenalty\clearpagepenalty
+\def\clearpage{\vfil\penalty\clearpagepenalty}
+
+\newbreakpenalty\breakpagepenalty
+\def\breakpage{\vfil\penalty\breakpagepenalty}
+
+\def\whitepage{\clearpage\shipout\hbox{}\advancepageno}
+
+% TODO: Rewrite in Lua.
+\def\needspace#1{%
+ \par\penalty0
+ \ifdim\dimexpr\pagegoal-\pagetotal<\dimexpr#1\relax
+ \breakpage
+ \fi
+ }
+
+\def\iflines#1{%
+ \par\penalty0
+ \ifdim\dimexpr(\pagegoal-\pagetotal) < \numexpr(#1)\baselineskip
+ \expandafter\secondoftwo
+ \else
+ \expandafter\firstoftwo
+ \fi}
+
+\long\def\ignorepars#1{%
+ \ifxnextnospace\par
+ {\gobbleoneand{\ignorepars{#1}}}
+ {#1}%
}
-\newcount\ptx@section_skip % A count, since vertical skips are expressed in number of lines.
\def\sectioncommand#1#2#3{%
\ifnext[
{\ptx@sectioncommand{#1}{#2}{#3}}
- {\ptx@sectioncommand{#1}{#2}{#3}[ptx@noop]}%
+ {\ptx@sectioncommand{#1}{#2}{#3}[]}%
}
\def\ptx@sectioncommand#1#2#3[#4]{%
- \par\removelastskip\penalty0
- \ifvalue #1 : clear = true
- {\vfil\penalty-10000}% Clear the page...
- {% Or skip some lines. The "beforeskip" attribute is
- % the number of blank lines one wants before a section
- % title, afterskip is the same thing after,
- % and "minimum" is the minimum number of lines
- % one wants after the section title.
- \ifdim\dimexpr(\pagegoal-\pagetotal) < \numexpr(\usevalueor #1 : beforeskip 0+\usevalueor #1 : afterskip 0+\usevalueor #1 : minimum 0) \baselineskip
- \vfil\penalty-10000 % Not enough room.
- \else
- \vskip\usevalueor #1 : beforeskip 0 \baselineskip
- \fi}%
-%
-% Sections have an internal count, incremented here.
- \storevalueor\ptx@tempsectioncount #1 : internalcount {\def\ptx@tempsectioncount{0}}%
- \esetattribute #1 : internalcount = {\the\numexpr(\ptx@tempsectioncount+1)}
- \resetbelow{#1}% Resets all internal counts of sections which depend on the current one (i.e. "section" depends on "chapter", etc.).
-%
-%
- \ptx@attribute_set{section}%
- \ifvalue #1 : link = true {%
- \ifcs{ptx@section_dest:#4}
- {\edef\ptx@temp{ptx@section_link:\usecs{ptx@section_dest:#4}}}
- {\global\advance\ptx@section_link1
- \edef\ptx@temp{ptx@section_link:\the\ptx@section_link}%
- \reverse\iffstring{#4}{ptx@noop}{\xdefcs{ptx@section_dest:#4}{\the\ptx@section_link}}}%
- \pdfdest name {\ptx@temp} xyz
- \passexpanded{\createbookmark[\usevalue #1 : bookmarkstyle ]{\usevalueor #1 : bookmarklevel 0}{\detokenize{#2}}}{\ptx@temp}%
- }{}%
- \noindent
- \hskip\usevalueor #1 : indent {0pt}%
- \bgroup
- \ifattribute #1 : color {\pdfcolorstack0 push {\usevalueand #1 : color { rg}{} \usevalueand #1 : color { RG}{}}}{}%
- \usevalue #1 : font
- \ifvalue #1 : number = none {}{%
- \usevalue #1 : beforenumber
- \ifcasevalue #1 : number
- \val roman \makeroman
- \val arabic \unbrace
- \endval{\usevalue #1 : internalcount }%
- \usevalue #1 : afternumber
- }%
- #3%
- \ifattribute #1 : color {\pdfcolorstack0 pop}{}
- \egroup
- \ifvalue #1 : inline = true
- {}
- {\vskip\usevalueor #1:afterskip 0\baselineskip}%
- \ptx@attribute_unset{section}%
- }
-\newwhile\resetbelow1{}{%
- \ifattribute #1 : below
- {\storevalue\tempbelow #1 : below
- \esetattribute\tempbelow : internalcount = 0
- \passvalue{\changewhile} #1 : below
- }{\breakwhile{}}%
+ \Section execute {section}{#1}{#2}{#3}{#4}%
+ \ignorepars{}%
}
\def\makeroman#1{%
\uppercase\expandafter{\romannumeral#1\relax}%
}
+\newif\ifsectiontitle
+
+\luacode
+pitex.sections = { sections = {} }
+function pitex.sections.increment (type)
+ local n = type
+ type = pitex.sections.sections[type] or { num = 0 }
+ type.num = type.num + 1
+ local level = type.level
+ if level then
+ for name, tb in pairs(pitex.sections.sections) do
+ tb.num = tb.level > level and 0 or tb.num
+ end
+ end
+end
+function pitex.sections.counter (type)
+ type = pitex.sections.sections[type]
+ return type and type.num or -1
+end
+\luacode/
+
+\def\declaresection#1#2{%
+ \ptx@lua{pitex.sections.sections.#1 = {num = 0, level = #2}}%
+ }
+
+\def\incrementsection#1{%
+ \ptx@lua{pitex.sections.increment("#1")}%
+ }
+
+\def\getsectioncounter#1{%
+ \ptx@lua{tex.print(pitex.sections.counter ("#1"))}%
+ }
+
+%%% Gates in section %%%
+
+\gates new \Section {Section}
+\Section list {section} [4]
+ (section_break) [2]
+ . [section_vmode] [1] ?{conditional = \ifvalue #1 : vmode = true } {\par\removelastskip\penalty0 }
+ . [section_clearpage] [1] ?{conditional = \ifvalue #1 : clear = true } {\clearpage}
+ . [section_beforeskip] [2] ?{conditional = -\ifvalue #1 : clear = true }
+ {% Or skip some lines. The "beforeskip" attribute is
+ % the number of blank lines one wants before a section
+ % title, afterskip is the same thing after,
+ % and "minimum" is the minimum number of lines
+ % one wants after the section title.
+ \ifexpression{%
+ -\ifdim\dimexpr(\pagegoal-\pagetotal) < 0pt &
+ \ifdim\dimexpr(\pagegoal-\pagetotal) < \numexpr(\usevalueor #1 : beforeskip 0+\usevalueor #1 : afterskip 0+\usevalueor #1 : minimum 0) \baselineskip}
+ {\breakpage} % Not enough room.
+ {\passvaluenobracesand\vskip #1 : beforeskip \baselineskip{}}}
+%
+ [section_advance] [1] {\incrementsection{#1}}
+%
+ [section_bookmark] [4] ?{conditional = \ifvalue #1 : link = true } {%
+ \passvalueand{\outline[meta = #1bookmark]} #1 : bookmarklevel {[#4]{#3}}{}}
+%
+ [section_toc] [3] ?{conditional = \ifvalue #1 : toc = true } {%
+ \edef\ptx@temp{{#1}{\ifvalue #1 : number = none {}{\getsectioncounter{#1}}}{\unexpanded{\unexpanded{#3}}}{\the\pageno}}%
+ \expandafter\writeout\expandafter*\expandafter{\expandafter\noexpand\expandafter\ptx@toc\ptx@temp}}
+%
+ [section_pre] {%
+ \bgroup
+ \maintextfalse
+ \sectiontitletrue
+ \ptx@section_attribute=0\relax}
+%
+ (section_typeset) [2]
+ . [section_number] [2] {%
+ \ifvalue #1 : number = none
+ {\Section return3 {#1}{}{#2}}
+ {\Section return3
+ {#1}
+ {\usevalueor #1 : numbercommand \unbrace
+ {\usevalue #1 : beforenumber
+ \ifcasevalue #1 : number
+ \val roman \makeroman
+ \val arabic \unbrace
+ \endval{\getsectioncounter{#1}}%
+ \usevalue #1 : afternumber }}
+ {#2}}}
+%
+ . [section_heading] [3] {%
+ \Section return2 {#1}{#2\usevalueor #1 : function \unbrace{#3}\usevalue #1 : aftertitle }}
+%
+ . [section_addfont] [2] {\Section return {#1}{\usevalue #1 : font #2}}
+%
+ . [section_addcolor] [2] ?{conditional = \ifattribute #1 : color } {%
+ \Section return {#1}{\passvalueand\color #1 : color {{#2}}{}}}
+%
+ . [section_do] [2] {%
+ \noindent
+ \settovalue\hskip #1 : indent
+ #2%
+ \ifvalue #1 : inline = true {}{\settovalue\rightskip #1 :ragged \endgraf}}
+%
+ [section_post] {\egroup}
+%
+ [section_afterskip] [1] ?{conditional = -\ifvalue #1 : inline = true } {%
+ \vskip\usevalueor #1 : afterskip 0\baselineskip
+ \ifvalue #1 : removenextindent = true {\removenextindent}{}}
+
\setparameter metasection :
- clear = false
- minimum = 3
- inline = false
- number = arabic
- link = true
- afternumber = "\kern.3em"
+ clear = false
+ vmode = true
+ minimum = 3
+ inline = false
+ number = arabic
+ afternumber = "\kern.3em"
+ link = true
+ ragged = 0pt
+ toc = true
+ removenextindent = true
+
+\declaresection {chapter} 1
+\declaresection {section} 2
+\declaresection {subsection} 3
+\declaresection {paragraph} 4
-\setparameter chapter section subsection :
- meta = metasection
+\setparameter chapter section subsection paragraph:
+ meta = metasection
\setparameter chapter :
clear = true
number = arabic
- below = section
afterskip = 3
indent = "0pt plus 1fill"
beforenumber = "chapitre "
@@ -147,25 +183,66 @@
\setparameter section :
beforeskip = 2
- below = subsection
bookmarklevel = 2
-\setparameter subsection :
+\setparameter subsection paragraph:
font = \it
beforeskip = 1
- beforenumber = "\usevalue section:internalcount ."
+
+\setparameter subsection:
+ beforenumber = "\getsectioncounter{section}."
minimum = 3
bookmarklevel = 3
+\setparameter paragraph:
+ beforenumber = "\getsectioncounter{section}.\getsectioncounter{subsection}."
+ minimum = 2
+ inline = true
+ aftertitle = ".\hskip.333em"
+ bookmarklevel = 4
+
+\setparameter chapterbookmark sectionbookmark subsectionbookmark paragraphbookmark:
+ meta = navigator
+
\def\chaptertitle{}%
-\def\chapter#1{%
- \def\chaptertitle{#1}%
+\freedef\chapter{%
\sectioncommand{chapter}{#1}{#1}%
}
-\def\section#1{\sectioncommand{section}{#1}{#1}}
-\def\subsection#1{\sectioncommand{subsection}{#1}{#1}}
+\freedef\section{\sectioncommand{section}{#1}{#1}}
+\freedef\subsection{\sectioncommand{subsection}{#1}{#1}}
+\freedef\paragraph{\sectioncommand{paragraph}{#1}{#1}}
-\newattribute{section}
+\newif\ifptx@sectioninfile
+\def\sectioninfile{%
+ \ifnextnospace*
+ {\ptx@sectioninfilefalse
+ \gobbleoneand\ptx@sectioninfile}
+ {\ptx@sectioninfiletrue
+ \ptx@sectioninfile}%
+ }
+
+\freedef\ptx@sectioninfile{%
+ \ptx@sectioninfile_do{#1}%
+ }
+\def\ptx@sectioninfile_do#1 #2 #3 {%
+ \sectioncommand{#2}{#1}{#1}%
+ \ptx@section_getlabel{#3}%
+ \ifptx@sectioninfile
+ \input #3\relax
+ \fi
+ }
+\newstring/
+\newwhile\ptx@section_getlabel1{#1}{%
+ \ifcontains/{#1}%
+ {\splitstringat/{#1}{\gobbleoneand\changewhile}}
+ {\label{#1}\breakwhile}%
+ }
+\freedef\ptx@sectioninfile_gobble{%
+ \ptx@sectioninfile_gobblerest
+ }
+\def\ptx@sectioninfile_gobblerest#1 #2 #3 {}
+
+\newattribute\ptx@section_attribute
%
% Move pending titles if they happen. They shouldn't by themselves,
% but the next paragraph might want more room than available
@@ -177,41 +254,79 @@
% TeX-inserted (e.g. \baselineskip).
% This is probably totally insufficient.
%
-\directlua{%
- onelineskip = node.new(11)
- onelineskip.kern = tex.baselineskip.width
- move_pendingtitles = function (head)
- local item, first = node.slide(head), true
- while item do
- if node.has_attribute(item,\ptx@attribute_number{section}) then
- local nextitem = item.prev
- node.remove(head,item)
- if not ((item.id == 10 or item.id == 11) and first) then
- node.insert_before(tex.lists.contrib_head, tex.lists.contrib_head, item)
- tex.lists.contrib_head = item
- end
- if item.id == 0 then
- if first then
- first = false
- if not (tex.lists.contrib_head.next.id == 10 and tex.lists.contrib_head.next.subtype == 0) then
- node.insert_after(tex.lists.contrib_head, item, node.copy(onelineskip))
- lualog("A title has been moved from page " .. tex.count[0] ..
- " to page " .. tex.count[0]+1 .. ".")
- end
+\luacode
+onelineskip = node.new(11)
+onelineskip.kern = tex.baselineskip.width
+remove_pendingtitles = function (head)
+ local item, first = node.slide(head), true
+ while item do
+ if node.has_attribute(item,\attributenumber\ptx@section_attribute) then
+ local nextitem = item.prev
+ node.remove(head,item)
+ if not ((item.id == 10 or item.id == 11) and first) then
+ node.insert_before(tex.lists.contrib_head, tex.lists.contrib_head, item)
+ tex.lists.contrib_head = item
+ end
+ if item.id == 0 then
+ if first then
+ first = false
+ if not (tex.lists.contrib_head.next.id == 10 and tex.lists.contrib_head.next.subtype == 0) then
+ node.insert_after(tex.lists.contrib_head, item, node.copy(onelineskip))
+ lualog("A title has been moved from page " .. tex.count[0] ..
+ " to page " .. tex.count[0]+1 .. ".")
end
- else
end
- item = nextitem
else
- if item.id == 0 or item.id == 1 then
- item = nil
- else
- item = item.prev
- end
+ end
+ item = nextitem
+ else
+ if item.id == 0 or item.id == 1 then
+ item = nil
+ else
+ item = item.prev
end
end
end
- }
+end
+\luacode/
+
\def\removependingtitles{%
- \directlua{move_pendingtitles(tex.box[255].list)}%
- } \ No newline at end of file
+ \ptx@lua{remove_pendingtitles(tex.box[255].list)}%
+ }
+
+
+% ToC: this is an inefficient mess.
+
+\def\ptx@toc_tok{}
+\def\ptx@toc#1#2#3#4{%
+ \addright\ptx@toc_tok{%
+ \usecs{ptx@toc_item:#1}{#2}{#3}{#4}}%
+ }
+
+\def\tableofcontents{%
+ \bgroup
+ \parindent=0pt
+ \ifemptycommand\ptx@toc_tok
+ {\ptx@warn{No table of contents.}}
+ {\ptx@toc_tok}%
+ \egroup
+ }
+
+\long\def\ptx@def_tocitem#1#2#3#4{%
+ \defcs{ptx@toc_item:#1}##1##2##3{%
+ \edefcs{ptx@toc_current#1}{##1}%
+ \bgroup\par\quitvmode
+ \leftskip#2\relax
+ \rightskip=0pt plus 1fil
+ #3\reverse\iffemptystring{##1}{\llap{#4##1\kern1em}}%
+ ##2\leaders\hbox{. }\hfill\hbox to .8cm{\hfil##3}\par
+ \egroup}%
+ }
+
+\ptx@def_tocitem{chapter}{0pt}{\big\bf\sc}{}
+\ptx@def_tocitem{section}{1cm}{\sc}{}
+\ptx@def_tocitem{subsection}{2cm}{\it}
+ {\reverse\iffemptycs{ptx@toc_currentsection}{\usecs{ptx@toc_currentsection}.}}
+\ptx@def_tocitem{paragraph}{3cm}{}
+ {\reverse\iffemptycs{ptx@toc_currentsection}{\usecs{ptx@toc_currentsection}.}%
+ \reverse\iffemptycs{ptx@toc_currentsubsection}{\usecs{ptx@toc_currentsection}}.}