% \iffalse %% %% File: tocenter.dtx Copyright (C) 2002--2004 by Alexander I. Rozhenko %% %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{tocenter} % [2004/12/09 v1.1 Centering Page Layout (NCC)] % % \changes{v1.0}{2002/01/31}{This version was uploaded to CTAN} % \changes{v1.1}{2004/12/09}{Documentation was prepared} % %<*driver> \let\makeindex\relax \documentclass{ltxdoc} \usepackage{tocenter} \GetFileInfo{tocenter.sty} \begin{document} \title{The \textsf{tocenter} package\thanks{This file has version number \fileversion, last revised \filedate.}} \author{Alexander I. Rozhenko\\rozhenko@oapmg.sscc.ru} \date{\filedate} \maketitle \DocInput{tocenter.dtx} \end{document} % % \fi % % The package provides commands % customizing the layout parameters of a documents. % % \section{User Interface} % % \DescribeMacro{\ToCenter} % The |\ToCenter|\oarg{hfm}\marg{text-width}\marg{text-height} command % calculates margins in such a way to center the specified text area % together with header/footer/marginals areas on a sheet of paper. % The optional \meta{hfm} parameter specifies what additional areas take into % account while centering. It is a combination of three letters |h| (headers), % |f| (footers), and |m| (marginal notes). If this parameters is omitted, % additional areas are ignored while calculations. For example, % the following command % \begin{quote} % |\ToCenter[h]{\textwidth}{\textheight}| % \end{quote} % centers the text+header area on the page. The text height and wight % are not changed here. This command is useful in books without marginal % notes. % % \DescribeMacro{\FromMargins} % The |\FromMargins|\oarg{hfm}\marg{left}\marg{right}\marg{top}\marg{bottom} % command calculates the page layout parameters in the MS Word-like style. % It sets page margins to the values specified in the last four % parameters and calculates the width and % height of the text area in such a way to satisfy the requirements. % For example, the command % \begin{quote} % |\FromMargins[hf]{20mm}{10mm}{25mm}{15mm}| % \end{quote} % calculates the text area dimensions and margins in such a way to % provide 20~mm distance from the left edge of the page, 10~mm % distance from the right edge, 25~mm distance from the top edge, and % 15~mm distance from the bottom edge in assumption that header and % footer are in use. % % If twoside mode is turned on, the left and right margins specified % in the |\FromMargins| command are considered for odd pages. % For even pages, their values are swapped. % % If |m|-letter is specified in the optional parameter, the margins are % determined depending on two-side and two-column switches. In two-column mode, % marginal notes are posed on both sides of paper, but in one-column mode % the marginal notes are posed on the outer side of a page in two-side mode % and to the right of the text area in one-side mode. All these specifics % is taken into account while calculations of text margins. % The reverse margin mode is also supported. % % \DescribeMacro{\ToCenter*} % \DescribeMacro{\FromMargins*} % The star-forms of these commands % \begin{quote} % |\ToCenter*|\marg{text-width}\marg{text-height}\\ % |\FromMargins*|\marg{left}\marg{right}\marg{top}\marg{bottom} % \end{quote} % are intended for positioning of simple documents without headers, % footers, marginal notes, cross-references, and table of contents. % Additionally, the empty page style is set and the writing to aux-file % is suppressed. % % \textit{All mentioned commands are allowed in the preamble only.} % \StopEventually{} % % \section{The Implementation} % % \begin{macro}{\NCC@pos} % The |\NCC@pos|\marg{hfm} command parses the \meta{hfm} parameter % and prepares |\NCC@h|\marg{register}, |\NCC@f|\marg{register}, % and |\NCC@m|\marg{register} commands to adjust values of skip % registers. The |\NCC@pos| command is also useful in the |cropmark| package. % \begin{macrocode} %<*package> \def\NCC@pos#1{% \let\NCC@h\@gobble \let\NCC@f\@gobble \let\NCC@m\@gobble \@tfor\@tempa:=#1\do{% % \end{macrocode} % If |h|-letter appears, the |\NCC@h| hook will adjust the value of register % on the header height and separation: % \begin{macrocode} \if h\@tempa \def\NCC@h##1{\advance##1\headsep \advance##1\headheight}% \else % \end{macrocode} % If |f|-letter appears, the |\NCC@f| hook will adjust the value of register % on the footer skip distance: % \begin{macrocode} \if f\@tempa \def\NCC@f##1{\advance##1\footskip}% \else % \end{macrocode} % If |m|-letter appears, the |\NCC@m| hook will adjust the value of register % on the width and separation of marginal paragraphs: % \begin{macrocode} \if m\@tempa \def\NCC@m##1{\advance##1\marginparwidth \advance##1\marginparsep}% \fi \fi \fi }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\ToCenter} % The star-form of this command differs in the omitted % optional parameter, empty page style, and suppressed % writing to external files: % \begin{macrocode} \newcommand{\ToCenter}{% \@ifstar{\pagestyle{empty}\nofiles\NCC@center[]}{\NCC@center}% } \@onlypreamble\ToCenter % \end{macrocode} % At the first, we parse the \meta{hfm} parameter: % \begin{macrocode} \newcommand*{\NCC@center}[3][]{\NCC@pos{#1}% % \end{macrocode} % Start calculations from horizontal margins and width: % set text width and calculate in |\@tempdima| the % whole width of area to be centered. % \begin{macrocode} \setlength\textwidth{#2}% \@tempdima\textwidth \NCC@m\@tempdima % \end{macrocode} % In two-column mode, margins appear on both sides of text. % We must add the width of marginal area again to |\@tempdima|: % \begin{macrocode} \if@twocolumn \NCC@m\@tempdima % \end{macrocode} % In two-column mode, we set the odd and even side margins to % \begin{quote} % |\NCC@m{(\paperwidth-\@tempdima)/2}|: % \end{quote} % \begin{macrocode} \@tempdimb\paperwidth \advance\@tempdimb -\@tempdima \@tempdima .5\@tempdimb \NCC@m\@tempdima \oddsidemargin\@tempdima \evensidemargin\@tempdima % \end{macrocode} % In one-column mode with reverse margins, we set % \begin{quote} % |\evensidemargin:=(\paperwidth-\@tempdima)/2|\\ % |\oddsidemargin:=\NCC@m{(\paperwidth-\@tempdima)/2}| % \end{quote} % and, with normal margins, we set % \begin{quote} % |\oddsidemargin:=(\paperwidth-\@tempdima)/2|\\ % |\evensidemargin:=\NCC@m{(\paperwidth-\@tempdima)/2}| % \end{quote} % \begin{macrocode} \else \@tempdimb\paperwidth \advance\@tempdimb -\@tempdima \@tempdima .5\@tempdimb \if@reversemargin \evensidemargin\@tempdima \NCC@m\@tempdima \oddsidemargin\@tempdima \else \oddsidemargin\@tempdima \NCC@m\@tempdima \evensidemargin\@tempdima \fi \fi % \end{macrocode} % Now we calculate the vertical layout parameters. % Again, in the |\@tempdima| we calculate the full % height of useful areas and set the top margin to % \begin{quote} % |(\paperwidth-\@tempdima)/2| % \end{quote} % if headers are in use. % \begin{macrocode} \setlength\textheight{#3}% \@tempdima\textheight \NCC@h\@tempdima \NCC@f\@tempdima \@tempdimb\paperheight \advance\@tempdimb -\@tempdima \topmargin .5\@tempdimb % \end{macrocode} % Otherwise, we decrease the value of top margin on the height % and separation of header: % \begin{macrocode} \ifx\NCC@h\@gobble \advance\topmargin -\headsep \advance\topmargin -\headheight \fi % \end{macrocode} % Do final correction of all margins: decrease their values % on 1~inch. This compensates the default adjustment applied by % dvi drivers. % \begin{macrocode} \advance \oddsidemargin -1in \advance \evensidemargin -1in \advance \topmargin -1in } \@onlypreamble\NCC@center % \end{macrocode} % \end{macro} % % \begin{macro}{\FromMargins} % Finally, we implement the |\FromMargins| command. % \begin{macrocode} \newcommand{\FromMargins}{% \@ifstar{\pagestyle{empty}\nofiles\NCC@margin[]}{\NCC@margin}% } \@onlypreamble\FromMargins % \end{macrocode} % Again, start from parsing the \meta{hfm} parameter: % \begin{macrocode} \newcommand*{\NCC@margin}[5][]{\NCC@pos{#1}% % \end{macrocode} % Calculate horizontal parameters at first. % In two-side mode, the left margin is equal to the % |\oddsidemargin| and the right margin is equal to the % |\evensidemargin|. In one-side mode, the % |\oddsidemargin| is calculated in the same manner % and the |\evensidemargin| is useless. So, we need % not distinguish one-side and two-side modes here % and do all things as for two-side mode. % \begin{macrocode} \setlength\oddsidemargin{#2}% \setlength\evensidemargin{#3}% % \end{macrocode} % Calculate in |\@tempdima| the amount of space occupied % by horizontal margins and marginal notes. % \begin{macrocode} \@tempdima\oddsidemargin \advance\@tempdima\evensidemargin \NCC@m\@tempdima % \end{macrocode} % In two-column mode, marginal notes should be counted twice % and the values of odd and even margins must be adjusted % on the marginal width. % \begin{macrocode} \if@twocolumn \NCC@m\@tempdima \textwidth\paperwidth \advance\textwidth -\@tempdima \NCC@m\oddsidemargin \NCC@m\evensidemargin % \end{macrocode} % In one-column mode, we must adjust only one margin % depending on placement of marginal notes. % \begin{macrocode} \else \textwidth\paperwidth \advance\textwidth -\@tempdima \if@reversemargin \NCC@m\oddsidemargin \else \NCC@m\evensidemargin \fi \fi % \end{macrocode} % Now we calculate the vertical layout parameters. % We set the |\@tempdima| to the sum of % top margin, bottom margin, header, and footer. % \begin{macrocode} \setlength\topmargin{#4}% \setlength\@tempdima{#5}\advance\@tempdima\topmargin \NCC@h\@tempdima \NCC@f\@tempdima % \end{macrocode} % The rest of page is the text height: % \begin{macrocode} \textheight\paperheight \advance\textheight -\@tempdima % \end{macrocode} % We must decrease the |\topmargin| on the header separation % and height if headers are useless. % \begin{macrocode} \ifx\NCC@h\@gobble \advance\topmargin -\headsep \advance\topmargin -\headheight \fi % \end{macrocode} % Do final correction of all margins: % \begin{macrocode} \advance \oddsidemargin -1in \advance \evensidemargin -1in \advance \topmargin -1in } \@onlypreamble\NCC@margin % % \end{macrocode} % \end{macro} \endinput