%% This is part of the OpTeX project, see http://petr.olsak.net/optex \_codedecl \margins {Macros for margins setting <2023-05-01>} % preloaded in format \_doc ---------------------------- \`\margins``/ (,,,)` takes its parameters, does calculation and sets `\hoffset`, `\voffset`, `\hsize` and `\vsize` registers. Note that \OpTeX/ sets the page origin at the top left corner of the paper, no at the obscure position 1\,in, 1\,in. It is much more comfortable for macro writers. \_cod ---------------------------- \_newdimen\_pgwidth \_newdimen\_pgheight \_pgwidth=0pt \_newdimen\_shiftoffset \_def\_margins/#1 #2 (#3,#4,#5,#6)#7 {\_def\_tmp{#7}% \_ifx\_tmp\_empty \_opwarning{\_string\_margins: missing unit, mm inserted}\_def\_tmp{mm}\_fi \_setpagedimens #2 % setting \_pgwidth, \_pgheight \_ifdim\_pgwidth=0pt \_else \_hoffset=0pt \_voffset=0pt \_if$#3$\_if$#4$\_hoffset =\_dimexpr (\_pgwidth -\_hsize)/2 \_relax \_else \_hoffset =\_dimexpr \_pgwidth -\_hsize - #4\_tmp \_relax % only right margin \_fi \_else \_if$#4$\_hoffset = #3\_tmp \_relax % only left margin \_else \_hsize =\_dimexpr \_pgwidth - #3\_tmp - #4\_tmp \_relax % left+right margin \_hoffset = #3\_tmp \_relax \_xhsize =\_hsize \_setxhsize % \_xhsize used by \output routine \_fi\_fi \_if$#5$\_if$#6$\_voffset =\_dimexpr (\_pgheight -\_vsize)/2 \_relax \_else \_voffset =\_dimexpr \_pgheight -\_vsize - #6\_tmp \_relax % only bottom margin \_fi \_else \_if$#6$\_voffset = #5\_tmp \_relax % only top margin \_else \_vsize=\_dimexpr \_pgheight - #5\_tmp - #6\_tmp \_relax % top+bottom margin \_voffset = #5\_tmp \_relax \_fi\_fi \_if 1#1\_shiftoffset=0pt \_def\_prepoffsets{}\_else \_if 2#1% double-page layout \_shiftoffset = \_dimexpr \_pgwidth -\_hsize -2\_hoffset \_relax \_def\_prepoffsets{\_ifodd\_pageno \_else \_advance\_hoffset \_shiftoffset \_fi \_setpagerightoffset}% \_else \_opwarning{use \_string\_margins/1 or \_string\_margins/2}% \_fi\_fi\_fi \_setpagerightoffset } \_def\_setpagedimens{\_isnextchar({\_setpagedimensB}{\_setpagedimensA}} \_def\_setpagedimensA#1 {\_ifcsname _pgs:#1\_endcsname \_ea\_ea\_ea\_setpagedimensB \_csname _pgs:#1\_ea\_endcsname\_space \_else \_opwarning{page specification "#1" is undefined}\_fi} \_def\_setpagedimensB (#1,#2)#3 {\_setpagedimensC\_pgwidth=#1:#3 \_setpagedimensC\_pgheight=#2:#3 \_pdfpagewidth=\_pgwidth \_pdfpageheight=\_pgheight } \_def\_setpagedimensC #1=#2:#3 {#1=#2\_ifx^#3^\_tmp\_else#3\_fi\_relax\_truedimen#1} \_public \margins ; \_doc ---------------------------- The common page dimensions are defined here. \_cod ---------------------------- \_sdef{_pgs:a3}{(297,420)mm} \_sdef{_pgs:a4}{(210,297)mm} \_sdef{_pgs:a5}{(148,210)mm} \_sdef{_pgs:a3l}{(420,297)mm} \_sdef{_pgs:a4l}{(297,210)mm} \_sdef{_pgs:a5l}{(210,148)mm} \_sdef{_pgs:b5}{(176,250)mm} \_sdef{_pgs:letter}{(8.5,11)in} \_doc ---------------------------- \`\magscale` `[]` does `\mag=` and recalculates page dimensions to their true values.\nl \`\_truedimen``` returns true value of regardless of `\mag`. \_cod ---------------------------- \_def\_trueunit{} \_def\_magscale[#1]{\_mag=#1\_def\_trueunit{true}% \_ifdim\_pgwidth=0pt \_else \_truedimen\_pgwidth \_truedimen\_pgheight \_fi \_truedimen\_pdfpagewidth \_truedimen\_pdfpageheight } \_def\_truedimen#1{\_ifx\_trueunit\_empty \_else#1=\_ea\_ignorept\_the#1truept \_fi} \_public \magscale ; \_doc ----------------------------- When left-to-right direction of typesetting is selected (default) then \"main vertical line" of the page has `\hoffset` distance from the left paper border and all lines at the page start here and run to the right side (exceptions can be done by `\moveleft` or `\moveright`, of course). When we have set right-to-left direction (using `\textdir TRT`, for example), then the \"main vertical line" cannot be at the same position because lines run to the left, i.e.\ they would be off paper. This is reason why the setting `\pagedir TRT` shifts the \"main vertical line" to an alternative position: it has `\pagerightoffset+1in` distance from the {\em right} paper border and thus right-to-left lines are visible on the paper. We have to set `\pagerightoffset` properly for such cases. This is done in the macro \`\_setpagerightoffset`. It must be called whenever `\hoffset` is changed. \_cod ----------------------------- \_def\_setpagerightoffset{% \_pagerightoffset=\_dimexpr\_pdfpagewidth-\_xhsize-\_hoffset-1in\_relax } \_setpagerightoffset % setting default value from default values \_doc ----------------------------- Page numbers and numbers of (sub)sections have to be printed in left-to-right mode even though the document mode is right-to-left. We print these numbers via \`\_numprint``{}` in \OpTeX/ macros. The `\_numprint` is `\_useit` by default (i.e.\ do nothing special) because we have left-to-right mode as default. But a user can define \begtt \_def\_numprint#1{{\_textdir TLT #1}} \endtt if the document is set to right-to-left mode. \_cod ----------------------------- \_let\_numprint=\_useit \_endcode % ----------------------------------------- 2023-05-01 \_numprint for page numbers, section numbers introduced 2023-04-29 \_setpagerightoffset for TRT typesetting introduced again 2021-03-15 \_setxhsize added 2020-03-14 released