%% This is part of the OpTeX project, see http://petr.olsak.net/optex

% This file is read from optex-doc.tex
% Use: optex optex-doc
% (three times) to create whole documentation including all references and the index.

\load [doc.opm]
\input primitives

\thisoutline {TECHNICAL DOCUMENTATION}

\chap Technical documentation

This documentation is written in the source files `*.opm` between
the `\_doc` and `\_cod` pairs or after the `\_endcode` command.
When the format is generated by
\begtt
luatex -ini optex.ini
\endtt
then the text of the documentation is ignored and the format `optex.fmt` is
generated. On the other hand, if you run
\begtt
optex optex-doc.tex
\endtt
then the same `*.opm` files are read when the second chapter of this
documentation is printed.

A knowledge about \TeX/ is expected from the reader.
You can see a short document
\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf]{\TeX/ in a Nutshell}
or more detail
\ulink[https://eijkhout.net/texbytopic/texbytopic.html]{\TeX/ by topic}.

Notices about hyperlinks.
If a control sequence is printed in red color in this documentation then
this denotes its \"main documentation point". Typically, the listing where
the control sequence is declared follows immediately. If a control sequence is
printed in the blue color in the listing or in the text
then it is an active link that points (usually) to the main documentation point.
The main documentation point can be an active link that points to a previous
text where the control sequence was
mentioned. Such occurrences are active links to the main documentation point.

\sec[init] The main initialization file

The `optex.ini` file is read as the main file when the format is generated.

{\everytt={\typosize[8/10]\_let\_printverbline=\_printcodeline \medskip}
 \def\docfile{optex.ini}

\verbinput (-4) optex.ini
%
Category codes are set first. Note that the `_` is set to category code
\"letter", it can be used as a part of control sequence names.
Other category codes are set as in plain \TeX/.

\verbinput (6-20) optex.ini
%
The \`\optexversion` and \`\fmtname` are defined.

\verbinput (22-26) optex.ini
%
We check if \LuaTeX/ engine is used at `-ini` state. And the `^^J` character
is set as `\newlinechar`.

\verbinput (28-37) optex.ini
%
The basic macros for macro file syntax is defined, i.\,e.\
`\_endcode`, `\_doc` and `\_cod`.
The `\_codedecl` will be re-defined later.

\verbinput (39-43) optex.ini
%
Individual `*.opm` macro files are read.

\verbinput (45-89) optex.ini
%
The file `optex.lua` is embedded into the format as byte-code.
It is documented in section~\ref[lua].

\verbinput (91-94) optex.ini

The `\everyjob` register is initialized and the format is saved by
the `\dump` command.

\verbinput (96-104) optex.ini

}

\printdoctail prefixed.opm
\secc The implementation of the namespaces and macros for macro-files
\printdoc prefixed.opm

\sec pdf\TeX/ initialization
\printdoctail luatex-ini.opm
\printdoc     luatex-ini.opm

\sec Basic macros
We define first bundle of basic macros.
\printdoc basic-macros.opm

\sec Allocators for \TeX/ registers
\printdoctail alloc.opm
\printdoc     alloc.opm

\sec If-macros, loops, is-macros, cases
\printdoc if-macros.opm

\sec Setting parameters
\printdoctail parameters.opm
\printdoc     parameters.opm

\sec More \OpTeX/ macros
The second bundle of \OpTeX/ macros is here.
\printdoc more-macros.opm

\sec Using key=value format in parameters
\printdoctail keyval.opm
\printdoc     keyval.opm

\sec[plain] Plain \TeX/ macros
All macros from plain \TeX/ are rewritten here.
Differences are mentioned in the documentation below.
\printdoc plain-macros.opm

\sec Preloaded fonts for text mode
\printdoctail fonts-preload.opm
\printdoc     fonts-preload.opm

\printdoctail fonts-resize.opm
\secc[fresize] Implementation of resizing
Only \"resizing" macros and \^`\initunifonts` are implemented here.
Other aspects of Font Selection System and their implementation are described in
section~\ref[fselect].
\printdoc     fonts-resize.opm

\printdoctail fonts-select.opm
\secc[fselect] Implementation of the Font Selection System
\printdoc     fonts-select.opm

\sec [math-preload] Preloaded fonts for math mode
\printdoctail math-preload.opm
\printdoc     math-preload.opm

\sec[math-macros] Math macros
\printdoc math-macros.opm

\sec Unicode-math fonts
\printdoctail unimath-macros.opm

\sec[opmac-fonts] Scaling fonts in document (high-level macros)
These macros are documented in section~\ref[sizes] from the user point of view.
\printdoc fonts-opmac.opm

\sec[output] Output routine
\printdoctail output.opm
\printdoc     output.opm

\sec Margins
The `\margins` macro is documented in the section~\ref[marg].
\printdoc margins.opm

\sec[colors] Colors
\printdoctail colors.opm
\printdoc     colors.opm

\sec[ref-file] The \code{.ref} file
\printdoctail ref-file.opm
\printdoc     ref-file.opm

\sec[references] References
\printdoctail references.opm
\printdoc     references.opm

\sec Hyperlinks
\printdoctail hyperlinks.opm
\printdoc     hyperlinks.opm

\sec[maketoc] Making table of contents
\printdoc     maketoc.opm

\sec PDF outlines
\secc Nesting PDF outlines
\printdoctail outlines.opm
\printdoc     outlines.opm
\secc Strings in PDF outlines
\printdoctail pdfuni-string.opm
\printdoc     pdfuni-string.opm

\sec[sections] Chapters, sections, subsections
\printdoc sections.opm

\sec[lists] Lists, items
\printdoc lists.opm

\sec Verbatim, listings
\secc[verb] Inline and \"display" verbatim
\printdoc verbatim.opm
\secc[hisyntax] Listings with syntax highlighting
\printdoctail hi-syntax.opm
\printdoc     hi-syntax.opm

\sec Graphics
\printdoctail graphics.opm
\printdoc     graphics.opm

\sec[table] The \code{\\table} macro, tables and rules
\printdoctail table.opm
\secc[table.impl] Implementation of the \code{\\table} macro and friends
\printdoc     table.opm

\sec Balanced multi-columns
\printdoc multicolumns.opm

\sec Citations, bibliography
\secc[bib] Macros for citations and bibliography preloaded in the format
\printdoc cite-bib.opm
\secc[usebib] The \code{\\usebib} command
\printdoctail usebib.opm
\secc The \code{usebib.opm} macro file loaded when \code{\\usebib} is used
\printdoc     usebib.opm

\secc[isobib] Usage of the \code{bib-iso690} style
{\everyintt={\catcode`\<=13 \visiblesp}
\printdoctail bib-iso690.opm }

\secc Implementation of the \code{bib-iso690} style
\printdoc     bib-iso690.opm

\sec[makeindex] Sorting and making Index
\printdoc makeindex.opm

\sec[fnotes] Footnotes and marginal notes
\printdoc fnotes.opm

\sec Styles
   \OpTeX/ provides three styles: `\report`, `\letter` and `\slides`.
   Their behavior is documented in user part of the manual in the section
   \ref[styles] and `\slides` style (for presentations) is documented in
   `op-slides.pdf` which is an example of the presentation.
\secc \code{\\report} and \code{\\letter} styles
\printdoc styles.opm
\secc[slides] \code{\\slides} style for presentations
\printdoc slides.opm

\sec Logos
\printdoc logos.opm

\sec Multilingual support
\secc Lowercase, uppercase codes
\printdoctail uni-lcuc.opm
%\printdoc     hyphen-lan.opm
%\printdoctail hyphen-lan.opm
\secc[langphrases] Multilingual phrases and quotation marks
\printdoc languages.opm
\secc[langdecl] Languages declaration
\printdoc lang-decl.opm

\sec[others] Other macros
Miscellaneous macros are here.
\printdoc others.opm

\sec[lua] Lua code embedded to the format

The file `optex.lua` is loaded into the format in `optex.ini` as byte-code
and initialized by `\everyjob`, see section~\ref[init].

The file implements part of the functionality from `luatexbase` namespace,
nowadays defined by \LaTeX/ kernel. `luatexbase` deals with modules,
allocators, and callback management. Callback management is a nice extension
and is actually used in \OpTeX/. Other functions are defined more or less just
to suit luaotfload's use.

The allocations are declared in subsection~\ref[lua-alloc], callbacks are
implemented in subsection~\ref[callbacks] and handling with colors can be
found in the subsection~\ref[lua-colors].

{\everytt={\typosize[8/10]\_let\_printverbline=\_printcodeline \_hfuzz=1em \medskip}
  \commentchars-- \def\docfile{optex.lua} \ttline=-1
  \_def\_printcomments{\_medskip
     {\_catcodetable0 \_typosize[10/12]\_everypar={}\_scantextokens\_ea{\_vcomments}\par}%
     \_bigskip
     \_ifx\_normalprintfilename\_undefined\_else \_let\_printfilename=\_normalprintfilename \_fi
   }

\verbinput \hisyntax{lua} (4-) optex.lua
}


\sec[doc] Printing documentation
\printdoctail doc.opm
\printdoc     doc.opm

\enddocument

