%% This is file `novel-LayoutSettings.sty', part of `novel' document class. %% Copyright 2017-2024 Robert Allgeyer. %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, version 1.3c. %% License URL: https://www.latex-project.org/lppl/lppl-1-3c/ %% \ProvidesFile{novel-LayoutSettings.sty}% [2024/04/26 v2.2 LaTeX file (layout settings)] %% %% Note that nearly all layout settings are pre-configured based on Trim Size. %% In general, these user commands may be used to over-ride the presets. %% SIZE-RELATED COMMANDS AVAILABLE IN PREAMBLE. %% ---------------------------------------------------------------------------- %% Use if necessary for customization. %% If you like a class option that pre-sets these values, %% then you do not have to use any of these commands. % % Note: This class does not ask you to set the width/height of the textblock. % Instead, these values are automatically calculated from other dimensions. %% Trim Size is the finished width and height of the book (not thickness). % Books are (usually) manufactured to a small number of standard Trim Sizes. % The available choice of sizes will depend on your print service, % and may by limited by binding method, paper, or distribution channels. % These are NOT the usual TeX "paper size" choices, such as A4 or letterpaper. % In the U.S.A., 5.5in W x 8.5in H is very common for softcover fiction, % so it will (later) be set as default, unless you set your own. \newif \if@SetTrimSize % true if \SetTrimSize rather than defaults. \newlength\@TrimWidth \newlength\@TrimHeight \newcommand\SetTrimSize[2]{% width, height \global\@SetTrimSizetrue \gsetlength\@TrimWidth{#1} \gsetlength\@TrimHeight{#2} }% end set trimsize %% %% Margins are measured from Trim Size inwards, always positive. % If the Media Size is larger than Trim Size, then the area beyond % the Trim Size is NOT margins. It is discarded scrap paper. % However, word processors (in general) do not understand the difference % between Trim Size and Media Size. So, if you are ever asked to % lay out the book in a word processor, using a standard (A4 or letter) % physical paper size, then you will be asked to set the "margins" % very wide, because the word processor margins include both % the finished book margins, and the discarded scrap paper. % In certain circumstances, text or images may intrude into the margin area. % This is not always an error, because it may be intentional. % Margins at top and bottom are relative to: % top of header, or top of textblock if no header; % bottom of footer, or bottom of textblock if no footer. % Inner margin generally greater than Outer, due to gutter. % Standard margins command ("TOBI, or not TOBI, that is the question."): \newif \if@SetMargins % true if \SetMargins rather than defaults. \newlength\@TopMargin \newlength\@OuterMargin \newlength\@BottomMargin \newlength\@InnerMargin \newcommand\SetMargins[4]{ % top, outer, bottom, inner \global\@SetMarginstrue \gsetlength\@TopMargin{#1} \gsetlength\@OuterMargin{#2} \gsetlength\@BottomMargin{#3} \gsetlength\@InnerMargin{#4} }% end set margins \LetLtxMacro\SetMargin{\SetMargins}\relax % for those who mis-type %% %% Unsafe Zone (opposite of "safe area"). % This feature only applies with class options `draft,shademargins' % and does NOT apply in `coverart'. % The purpose of margins is to confine the main text (and header/footer). % In `novel' (unlike most other TeX document classes) there is no provision % for marginal notes, because they are not used in popular fiction. % Yet there may be circumstances where you intentionally or accidentally % have text, or part of an image, placed or overflowing into a margin. % In PDF, even PDF/X, that is not a problem. It cannot read your mind. % However, every print service specifies a "safe area." All text, and % all images without bleed, must remain within the safe area. % The limits of the safe area are typically 0.125in to 0.5in inside the % Trim Size, depending on technology. This defines how close you may % place anything near the page edges. % In `novel' the opposite of the safe area is the "unsafe zone" (UZ). % So, the UZ lies just inside the perimeter of the Trim Size. % Each margin is at least as wide as its corresponding UZ. % Some print services use "minimum margin" to mean the UZ. % When you are in draft mode with `shademargins' class option, % the UZ (if it is set) will be displayed in dark gray. % Then, you can inspect the PDF for any intrusion into the UZ. % If you intrude into the UZ, there is no warning or error. % The UZ is strictly for visualization. There is no default setting. % If you do not set the UZ yourself, then no UZ will be displayed. % In any case, the final PDF is unaffected. \newif \if@UnsafeZone % true if \SetUnsafeZone used \newlength\@TopUZWidth \newlength\@OuterUZWidth \newlength\@BottomUZWidth \newlength\@InnerUZWidth \newcommand\SetUnsafeZone[4]{% top, outer, bottom, inner. \global\@UnsafeZonetrue \gsetlength\@TopUZWidth{#1} \gsetlength\@OuterUZWidth{#2} \gsetlength\@BottomUZWidth{#3} \gsetlength\@InnerUZWidth{#4} } % end \SetUnsafeZone \LetLtxMacro\SetUnsafeZones{\SetUnsafeZone}\relax % for those who mis-type %% % PDF Media Size is already known to TeX as \paperwidth and \paperheight. % For this reason, there is no need to define additional lengths. % Sheet-fed printers use a small number of standard paper sizes. % Whether you use P.O.D. or print at home or office, your print job will % almost certainly be sheet-fed. After printing, the sheet is trimmed % to the specified Trim Size. Note that the sheet sizes used in % commercial printing are specialized for the purpose, and may be % different from the routine A4 and USletter sizes familiar to you. % In most cases (except for cover artwork), your PDF Media Size will be % exactly the same as the finished Trim Size. Placement of the Trim Size % onto a larger sheet of paper is done automatically at the print service, % a procedure known as "imposition." Several small Trim Sizes may be % printed onto a single sheet, in order to waste less paper in trimming. % In a few cases, the print service will ask you to provide a PDF that has % the Trim Size centered H/V within a larger Media Size. % Sometimes (especially for cover artwork), that's because you are % doing the imposition yourself. In other cases (especially for interiors) % it is because most of the files seen at the print service came from % word processors, where the writers (not knowing better) created layouts % on A4 or USletter with large "margins," rather than correct Trim Size. % Then, if you submit a file at actual Trim Size, it looks wrong, % not because it is wrong, but because it stands out from the crowd. % You may use \SetMediaSize to deal with this situation. % You do not need \SetMediaSize, if (as usual) it is identical to TrimSize. % Changing the Media Size does not affect Trim Size or internal page layout. % Class options `cropview' and `closecrop' (only in draft mode) % affect Media Size. See their descriptions below. % % \SetMediaSize{width}{height} usage: \newif \if@MediaSize % true if \SetMediaSize rather than default = Trim Size. \DeclareDocumentCommand\SetMediaSize { m m } {% width, height \@MediaSizetrue \gsetlength\paperwidth{#1} \gsetlength\paperheight{#2} }% end \SetMediaSize %% %% Lines Per Page refers to the main textblock, not including header or footer. % If you do not set it, a suitable default will be based on other settings. % The number of lines is contrained by Trim Height, Margins, and normal em. % This is because the minimum \baselineskip must be 1.2x normal em size, % to avoid crowding of the text and variable line heights. % The check for constraint is done in file novel-CalculateLayout.sty. % The same check also verifies that the number is an integer >=10. \newif \if@LinesPerPage % true if \SetLinesPerPage rather than default. \newcommand\SetLinesPerPage[1]{ \IfInteger{#1}{}{% \ClassError{novel}{\string\SetLinesPerPage\space must be integer >=10}% {Do not write period, comma, or space within \string\SetLinesPerPage.}% } \FPiflt{#1}{10} \ClassError{novel}{\string\SetLinesPerPage\ must be at least 10}% {LinesPerPage were set or calculated at less than 10.}% \fi \global\@LinesPerPagetrue \gdef\@LinesPerPage{#1} }% end set linesperpage %% %% \SetFontSize may be in any units, even decimals: 12.2pt, 11.5bp, etc. % Before external packages load, the font size is temporarily set to % 10pt at 13pt skip, so that moldy-oldie packages don't get confused. % Later, the size is changed to its actual value based on this command, % or on the defaults for Trim Size. \newif \if@FontSizeSet % true if \SetFontSize rather than default. \newlength\@SetFontSize \newcommand\SetFontSize[1]{ \global\@FontSizeSettrue \gsetlength\@SetFontSize{#1} }% end set font size %% %% MISCELLANOUS SETTINGS. Mostly remove "glue". Best to leave as-is. %% ---------------------------------------------------------------------------- % Standard TeX \hoffset and \voffset is not relative to the MediaBox, but is % relative to 1in from the top left corner of the MediaBox. Ouch. % When necessary, the 1in (72.27pt) is compensated in later calculations. \setlength\hoffset{0pt} % relative to 1in built-in offset at left \setlength\voffset{0pt} % relative to 1in built-in offset at top % \@twocolumnfalse \@twosidetrue \setlength\columnsep{12pt} % not needed, picked something at random \setlength\columnseprule{0pt} % \@mparswitchtrue % irrelevant \setlength\marginparwidth{0pt} % no marginal paragraphs allowed \setlength\marginparsep{0pt} \setlength\marginparpush{0pt} % \global\@topnum \z@ \setlength\abovedisplayskip{0pt} \setlength\abovedisplayshortskip{0pt} \setlength\belowdisplayshortskip{0pt} \setlength\belowdisplayskip{0pt} \setlength\smallskipamount{0pt} \setlength\medskipamount{0pt} \setlength\bigskipamount{0pt} % `novel' uses grid setting. However, to allow for roundoff errors in % vertical position calculations, there is a tiny amount of wiggle room: \setlength\topsep{0pt} \setlength\partopsep{0pt} \setlength\parsep{0pt} \setlength\parskip{0pt} \setlength\floatsep{0pt} \setlength\textfloatsep{0pt} \setlength\dbltextfloatsep{0pt} \setlength\intextsep{0pt} % \topskip will be set as normal baselineskip, which must first be calculated. % That is done in novel-CalculateLayout.sty. \setlength\lineskip{0pt} \setlength\normallineskip{0pt} \setlength\lineskiplimit{-2pt} % allows some limited vertical clash \renewcommand\baselinestretch{1} % multiplier \widowpenalty 150 % same as TeX default \clubpenalty 150 % same as TeX default \@lowpenalty 51 \@medpenalty 151 \@highpenalty 301 % Floats are limited, but just in case: \setcounter{topnumber}{2} \renewcommand\topfraction{.7} \setcounter{bottomnumber}{1} \renewcommand\bottomfraction{.3} \setcounter{totalnumber}{3} \renewcommand\textfraction{.2} \renewcommand\floatpagefraction{.5} \setcounter{dbltopnumber}{2} \renewcommand\dbltopfraction{.7} \renewcommand\dblfloatpagefraction{.5} % \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\normalfont\rmfamily} \DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\normalfont\sffamily} \DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\normalfont\ttfamily} \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\normalfont\bfseries} \DeclareOldFontCommand{\it}{\normalfont\itshape}{\normalfont\itshape} \DeclareOldFontCommand{\sl}{\normalfont\slshape}{\normalfont\slshape} \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\normalfont\scshape} % \pagestyle{empty} % will be over-ridden by fancyhead in separate file \pagenumbering{arabic} % may be over-ridden in document \flushbottom % best for continuous text % %% End miscellaneous settings. %% FRONTMATTER, MAINMATTER. BUT NO BACKMATTER! %% ---------------------------------------------------------------------------- % % See novel.cls for the AtBeginShipout routine. % % These do not have @ in name, so that they can be used in document body: \newif \ifWithinFrontmatter % true within frontmatter \newif \ifWithinMainmatter % true within mainmatter \def\frontmatter{ % starts page count and frontmatter count at 1. \ifWithinFrontmatter \ClassError{novel}{\string\frontmatter\ used more than once}% {You issued \string\frontmatter\ more than once.}% \fi \ifWithinMainmatter \ClassError{novel}{\string\frontmatter\ cannot follow \mainmatter}% {In order: \string\frontmatter\ \string\mainmatter ^^J% but you do not need both of them.}% \fi \global\WithinFrontmattertrue\global\WithinMainmatterfalse \clearpage \pagenumbering{roman} \setcounter{page}{1} } % \def\mainmatter{ % restarts page to 1, arabic numbers; freeze frontpagecount \ifWithinMainmatter \ClassError{novel}{\string\mainmatter\ used more than once}% {You issued \string\mainmatter\ more than once.}% \fi \cleartorecto \global\WithinFrontmatterfalse\global\WithinMainmattertrue \pagenumbering{arabic} \setcounter{page}{1} } % \def\backmatter{\@ifstar\@backmatterst\@backmatterns} \def\@backmatterns{% \cleartorecto% \typeout{^^JClass `novel' Alert: \string\backmatter\space merely % clears to recto. See docs. ^^J}% } \let\@backmatterst\@backmatterns %% end frontmatter, mainmatter. No backmatter! %% DISABLE OR NEUTRALIZE SOME STANDARD LATEX COMMANDS %% ---------------------------------------------------------------------------- % The `novel' class disallows these commands, or neutralizes them by simply % repeating their arguments. In some cases, they request functionality that's % not implemented in `novel'. In other cases, functionality is part of core, % but would interfere with the `novel' emphasis on constant line skip. % You may redefine the commands using your own Preamble code (discouraged). % %%%%%\gdef\null{\hbox{\strut}} % May be important! % % Standard LaTeX font sizes are ineffective: \gdef\@noSizeCommand#1{\ClassWarning{novel}{% Standard LaTeX font sizes are ineffective in `novel' class. ^^J% Your use of command `#1' was ignored. ^^J}% } \gdef\@DisableFontSizes{% called by `novel.cls' \AtBeginDocument \gdef\HUGE{\@noSizeCommand{HUGE}} \gdef\Huge{\@noSizeCommand{Huge}} \gdef\huge{\@noSizeCommand{huge}} \gdef\LARGE{\@noSizeCommand{LARGE}} \gdef\Large{\@noSizeCommand{Large}} \gdef\large{\@noSizeCommand{large}} \gdef\small{\@noSizeCommand{small}} \gdef\footnotesize{\@noSizeCommand{footnotesize}} \gdef\scriptsize{\@noSizeCommand{scriptsize}} \gdef\tiny{\@noSizeCommand{tiny}} } % % In `novel' there is no academic organization. % All these do is echo the argument, if any: \long\gdef\part#1{#1} \long\gdef\chapter#1{#1} \long\gdef\section#1{#1} \long\gdef\subsection#1{#1} \long\gdef\subsubsection#1{#1} \long\gdef\paragraph#1{#1} \long\gdef\subparagraph#1{#1} \long\gdef\appendix#1{#1} % In some situations, the use will be interrupted: \DeclareDocumentCommand\@nodocommand { O{} +m } {% \ClassError{novel}{No command or environment `#1' in this class}% {Many academic layout commands or environments are disabled in `novel'.}% } \DeclareDocumentCommand\@sandboxonly { m } {% \ClassError{novel}{ ^^J% Command or environment `#1' only allowed in `sandbox' mode. ^^J% See `novel' documentation 2.2. ^^J The offending command may have been called by another macro.}% {Fix your code. If you do not, then compile will fail or be unexpected.}% } % Here is the interruption list: \long\gdef\maketitle{\@nodocommand{maketitle}} \long\gdef\makeindex{\@nodocommand{makeindex}} \long\gdef\tableofcontents{\@nodocommand{tableofcontents}} \long\gdef\listoftables{\@nodocommand{listoftables}} \long\gdef\listoffigures{\@nodocommand{listoffigures}} \long\gdef\thebibliography{\@nodocommand{thebibliography}} \long\gdef\theindex{\@nodocommand{theindex}} \long\gdef\abstract{\@nodocommand{abstract}} \if@sandbox\else \DeclareDocumentCommand\caption{}{\@sandboxonly{caption}} \DeclareDocumentEnvironment{tabular}{s o +m}{\@sandboxonly{tabular}}{} \DeclareDocumentEnvironment{table}{s o}{\@sandboxonly{table}}{} \DeclareDocumentEnvironment{figure}{s o}{\@sandboxonly{figure}}{} \DeclareDocumentEnvironment{itemize}{s}{\@sandboxonly{itemize}}{} \DeclareDocumentEnvironment{enumerate}{s}{\@sandboxonly{enumerate}}{} \DeclareDocumentEnvironment{description}{s}{\@sandboxonly{description}}{} \DeclareDocumentEnvironment{labeling}{s}{\@sandboxonly{labeling}}{} \fi % \newif \if@OnTitlePage % not really useful \DeclareDocumentEnvironment{titlepage}{s}{% \clearpage \thispagestyle{empty} \global\@OnTitlePagetrue }{ \clearpage \global\@OnTitlePagefalse } %% end disable or neutralize. %% Neutralize settings commands: \gdef\@DisableLayoutSettings{% called by `novel.cls' \AtBeginDocument \LetLtxMacro\SetMediaSize\relax \LetLtxMacro\SetTrimSize\relax \LetLtxMacro\SetMargins\relax \LetLtxMacro\SetLinesPerPage\relax \LetLtxMacro\SetFontSize\relax \LetLtxMacro\SetUnsafeZone\relax }% end \@DisableLayoutSettings %% %% \endinput %% %% End of file `novel-LayoutSettings.sty'.