% This file is part of the CTAN package named plain-grid.
%
% plaingridM.tex: text
% and support for math and boxes in vertical mode
% Version 1.0, 05.05.2026
%
% Copyright (C) 2026 Udo Wermuth (author)
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see .
%
\input plaingridT.tex
{\toks255=\expandafter{\gridrestoreparams}%
\xdef\gridrestoreparams{\the\toks255
\abovedisplayskip=\the\abovedisplayskip
\belowdisplayskip=\the\belowdisplayskip
\abovedisplayshortskip=
\the\abovedisplayshortskip
\belowdisplayshortskip=
\the\belowdisplayshortskip
\predisplaypenalty=\the\predisplaypenalty
\postdisplaypenalty=
\the\postdisplaypenalty
\displaywidowpenalty=
\the\displaywidowpenalty
\everydisplay=\noexpand\grideverydisplay}}
\abovedisplayskip=0pt \belowdisplayskip=0pt
\abovedisplayshortskip=0pt
\belowdisplayshortskip=0pt
\predisplaypenalty=0 \postdisplaypenalty=0
\displaywidowpenalty=0
\outer\def\gridproclaim #1. #2\par{%
\GRIDmakeavailable3
\ifnum\GRIDfreelines=\GRIDlines%top of page
\line{\hfil}\kern-0.5\GRIDgrid% keep space
\else \gridskiphalfaline \fi
\noindent{\bf#1.\enspace}{\sl#2\par}%
\gridskiphalfaline}
\newcount\GRIDboxlines % see \GRIDboxheight
\def\GRIDboxheight#1(#2:#3){% create a vbox
% of a certain height; #1: vbox number; #2
\begingroup % and #3: skips surrounding #1
% store data needed in the reporting
\edef\GRIDnext{GRID line \the\inputlineno:
box (\the\ht#1+\the\dp#1)}%
{\setbox2=\vbox{#2\relax#3}\xdef\GRIDtmp
{[changed by (\the\ht2+\the\dp2)]}%
\global\GRIDboxlines=\ht2
\global\advance\GRIDboxlines by \dp2 }%
% transform ht+dp of vbox #1 into lines
\advance\GRIDboxlines by \ht#1\relax
\advance\GRIDboxlines by \dp#1\relax
\GRIDcnt=\GRIDboxlines % now compute the
\divide\GRIDcnt by \GRIDgrid % lines
\multiply\GRIDcnt by \GRIDgrid
\advance\GRIDcnt by -\GRIDboxlines
\ifnum\GRIDcnt<0 % need >0 lines
\advance\GRIDboxlines by \GRIDgrid
\fi \global % make \GRIDboxlines known
\divide\GRIDboxlines by \GRIDgrid
% final step: build vbox with \GRIDdim
\GRIDdim=\GRIDboxlines\GRIDgrid
\global\setbox#1=\vbox to \GRIDdim{%
#2\unvbox#1#3}%
\GRIDlog3{\GRIDnext\space\GRIDtmp\space
output as (\the\ht#1+\the\dp#1) in
\the\GRIDboxlines\space lines}%
\endgroup \ignorespaces}
\newtoks\grideverydisplay % \everydisplay
\grideverydisplay=\everydisplay % is saved
\everydisplay={\GRIDdisplay}% use next macro
\newbox\GRIDbox % box for a lot of macros
\newdimen\GRIDdisplaydimen % <>0pt: override
\def\GRIDdisplay#1$${% #1: delimited display
$$\vskip-\GRIDgrid \penalty0
\GRIDlinesavailable \begingroup
\setbox\GRIDbox=\vbox{\normalbaselines
\everydisplay=\grideverydisplay $$#1$$}%
\ifdim\GRIDdisplaydimen=0pt % compute ht
\GRIDboxheight\GRIDbox
(\vskip\jot\vfil:\vfil)% build grid vbox
\else\GRIDlog3{GRID line \the\inputlineno:
user's height \the\GRIDboxlines\space
lines or \the\GRIDdisplaydimen; top plus
\the\GRIDdim}\setbox\GRIDbox=\vbox
to \GRIDdisplaydimen{\vss \vskip
\GRIDdim \unvbox\GRIDbox \vss}%
\global\GRIDdisplaydimen=0pt %use it once
\fi \ifnum\GRIDboxlines>\GRIDfreelines
\GRIDlog0{GRID: unexpected page
ejection}\grideject \fi \box\GRIDbox
\endgroup \noindent \ignorespaces}
\def\griddisplay#1:#2$${%#1: number of lines
% #2: space added at top of display in \jot
\GRIDboxlines=#1\relax \GRIDdim=#2\jot
\GRIDdisplaydimen=\GRIDboxlines\GRIDgrid
$$}% start the display math mode
\def\gridskip1/#1{% set shift #1: 1,2,3,4
\def\GRIDinline{#1 }\GRIDshift
\ignorespaces}% is #1x\baselineskip
\def\GRIDshift{% output \kern
\edef\GRIDtmp{\noexpand\kern % comp
\ifcase\GRIDinline 0\or 1\or 0.5\or
0.33333\or 0.25\else 0\fi\GRIDgrid}%
\ifvmode\GRIDtmp\else\vadjust{\GRIDtmp}\fi}
\def\GRIDsmash#1{% #1: horizontal material
\setbox\GRIDbox=\hbox{#1}\dp\GRIDbox=0pt
\ht\GRIDbox=0pt \box\GRIDbox}% zero ht & dp
\def\gridinline#1$#2${% #1: new value for
% \GRIDinline (optional); #2: the math
\def\GRIDtmp{#1}\GRIDsmash{$#2$}%
\ifx\GRIDtmp\empty % keep the skip's value
\else \def\GRIDinline{#1 }\fi % a new value
\GRIDshift}% apply previous or new skip
\def\gridbeginbox{\par \GRIDprevgrid
\setbox\GRIDbox=\vbox\bgroup}
\def\gridendbox{\egroup % end the vbox
\GRIDboxheight\GRIDbox(\vfil:\vfil)%
\GRIDmakeavailable\GRIDboxlines % output on
\box\GRIDbox}% page with enough space