diff options
Diffstat (limited to 'Master/texmf-dist/tex/plain/pitex/sections.ptx')
-rw-r--r-- | Master/texmf-dist/tex/plain/pitex/sections.ptx | 435 |
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}}.} |