% This is piTeX, a set of macros I (Paul Isambert) use to
% typeset documentations for my packages (that's why it is
% archived on CTAN).
%
% Perhaps in the future, when this achieves some kind of
% format-like completude, it'll be publicly announced. In the
% meanwhile, a documentation exists (pitex-doc.pdf, also readable
% in a text editor as pitex-doc.txt).
%
%
% You can of course use those macros, but you are on your
% own, and the files will probably be modified without announcement.
% The file is supposed to be \input on plain TeX with LuaTeX, at least v.0.6.
%
%
% The files needed are:
%
% texapi.tex              (an independent package for programming)
% yax.tex                 (an independent package for key=value interface)
% gates.tex and gates.lua (an independant package for overall architecture)
% navigator.tex           (an independant package for PDF features)
% lua.ptx and base.ptxlua (Lua side)
% files.ptx               (file management)
% fonts.ptx, fonts.ptxlua and foundry-settings.lua
%                         (fonts, should be independant some day; actually
%                         fonts.ptxlua can be used independantly, but there is
%                         no doc)
% sections.ptx            (sectionning commands)
% blocks.ptx              (text blocks)
% references.ptx          (labels and references)
% verbatim.ptx            (typesetting verbatim)
% inserts.ptx             (footnotes and figures, a mess)
% output.ptx              (output routine)
%
% The file i-pitex.lua is needed only to typeset the documentation with the
% Interpreter package.
%
%
% Date: November 2011.
%
%
% User interface
\input yax % which itself \input's texapi
\input gates

\setcatcodes{\@\_=11}
\suppressoutererror=1

% MESSAGES
\def\ptx@error{\senderror{PiTeX}}
\def\ptx@log#1{%
  \immediate\write17{^^J#1^^J}%
  }
\def\ptx@warn#1{%
  \ptx@log{PiTeX warning: #1}%
  }

% ATTRIBUTES
\newcount\ptx@attribute_count
\ptx@attribute_count=100 % The first 100 attributes are scratch.
\def\newattribute#1{%
  \advance\ptx@attribute_count1
  \attributedef#1=\ptx@attribute_count
  \xdefcs{ptx@attribute:\commandtoname#1}{\the\ptx@attribute_count}%
  }
\def\unsetattribute#1{#1=-"7FFFFFFF\relax}
\def\attributenumber#1{\usecs{ptx@attribute:\commandtoname#1}}

% FREEDEF
\def\freedef#1{%
  \def#1{%
    \ifnextnospace"
           {\ptx@freedef_quote#1}
           {\ifnextnospace/
             {\ptx@freedef_slash#1}
             {\usecs{ptx@freedef_user:\commandtoname#1}}}%
    }%
  \defcs{ptx@freedef_user:\commandtoname#1}##1%
  }
\def\ptx@freedef_quote#1"#2"{%
  \usecs{ptx@freedef_user:\commandtoname#1}{#2}%
  }
\def\ptx@freedef_slash#1/#2/{%
  \usecs{ptx@freedef_user:\commandtoname#1}{#2}%
  }


\newbox\ptx@box_temp

\newif\ifmaintext
\maintexttrue

% CATCODE TABLES
\newcount\ptx@catcodetable_count
\ptx@catcodetable_count=100 % First 100 are scratch.
\def\newcatcodetable#1#2{%
  \global\advance\ptx@catcodetable_count1
  \chardef#1=\ptx@catcodetable_count
  \begingroup
    \setcatcodes{#2}%
    \savecatcodetable#1%
  \endgroup
  }

\newcatcodetable\texcatcodes{\@\_=12}

\def\inputpitexfile#1 {\input #1.ptx }

\inputpitexfile lua
\inputpitexfile files
\inputpitexfile fonts
\inputpitexfile sections
\inputpitexfile blocks
\inputpitexfile references
\inputpitexfile verbatim
\inputpitexfile inserts
\inputpitexfile output
\input navigator.tex

% AUXILIARY FILE
\iffile{\jobname.aux}{%
  \ptx@lua{%
    remove_conversion()
    tex.print("\luaescapestring{\noexpand\input\noexpand\jobname.aux}")
    }%
  \directlua{restore_conversion()}}
\immediate\openout\ptx@auxfile=\jobname.aux

% PDF SETTINGS
\restrictparameter document : author title pdftitle date pdfdate subject keywords mode layout version\par
\restrictattribute document : mode   outlines bookmarks thumbs thumbnails attachments files oc\par
\restrictattribute document : layout onepage onecolumn twopage twocolumn twopage* twocolumn*\par

\suppressoutererror=1
\let\ptx@bye\bye
\def\bye{%
  \passvalueand{\setattribute navigator : title = } document : pdftitle { }{}
  % The "date" attribute in the "document" parameter isn't supposed to hold a
  % PDF-date, as navigator expects.
  \deleteattribute document : date
  \passvalueand{\setattribute navigator : date  = } document : pdfdate { }{}
  \finishpdffile\ptx@bye
  }

\setattribute navigator : meta = document

% Turns a dimen into PostScript points, without the unit (as wanted by PDF).
\def\pdfpoint#1{%
  \directlua{%
    local d = "\the\dimexpr#1"
    d = string.gsub(d, "pt", "")
    tex.print(tostring(d * (72/72.27)))
    }}




% TEX SETTINGS
\long\def\ptx@tex_set#1#2#3{%
  \ifcs{#2}
    {\usecs{#2}=#3\relax}
    {\ptx@error{No TeX parameter `#2'}}
  }

\defactiveparameter tex {%
  \parameterloop #1 : \ptx@tex_set
  }

\frenchspacing
\maxdepth=\maxdimen

\def\antigobblespace{%
  \ifcatnext a{ }{\iffnext({ }}%
  }

\def\strut#1#2{%
  \vrule height#1 depth#2 width0pt
  }

\newdimen\extraboxspace
\newdimen\ptx@extraboxspace_top
\newdimen\ptx@extraboxspace_right
\newdimen\ptx@extraboxspace_bottom
\newdimen\ptx@extraboxspace_left

\newfornoempty\ptx@colorbox_loop{1}#2,{%
  \ifcase#1
    \ptx@extraboxspace_top    =#2
    \ptx@extraboxspace_right  =#2
    \ptx@extraboxspace_bottom =#2
    \ptx@extraboxspace_left   =#2
  \or
    \ptx@extraboxspace_right  =#2
    \ptx@extraboxspace_left   =#2
  \or
    \ptx@extraboxspace_bottom =#2
  \or
    \ptx@extraboxspace_left   =#2
  \fi
  \passarguments{\numexpr(#1+1)}%
  }
\def\colorbox{%
  \ifnextnospace[\ptx@colorbox_setborders
          {\ptx@extraboxspace_top    =\extraboxspace
           \ptx@extraboxspace_right  =\extraboxspace
           \ptx@extraboxspace_bottom =\extraboxspace
           \ptx@extraboxspace_left   =\extraboxspace
           \ptx@colorbox_do}%
  }
\def\ptx@colorbox_setborders[#1]{%
  \ptx@colorbox_loop{0}{#1,}%
  \ptx@colorbox_do
  }
{\setcatcodes{pt=12}
\gdef\noPT#1pt{#1 }}
\def\ptx@colorbox_do#1#2{%
  \bgroup
  \setbox\ptx@box_temp=\hbox{#2}%
  \hbox{%
    \pdfliteral{
      q #1 rg #1 RG
      -\expandafter\noPT\the\ptx@extraboxspace_left
       \expandafter\noPT\the\dimexpr(\ht\ptx@box_temp+\ptx@extraboxspace_top)\relax
       \expandafter\noPT\the\dimexpr(\wd\ptx@box_temp+\ptx@extraboxspace_left+\ptx@extraboxspace_right)\relax
      -\expandafter\noPT\the\dimexpr(\ht\ptx@box_temp+\ptx@extraboxspace_top+\dp\ptx@box_temp+\ptx@extraboxspace_bottom)\relax
      re f Q}%
    #2}%
  \egroup
  }

\def\og{\char"00AB~} \def\fg{~\char"00BB\antigobblespace}

\def\trace{\tracingcommands3 \tracingmacros2 }
\def\untrace{\tracingcommands0 \tracingmacros0 }

\restorecatcodes