From 3e4f442d1ed8ac2a1395a7c1485740c3d2f66691 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Tue, 27 Mar 2018 21:21:56 +0000
Subject: novel (27mar18)

git-svn-id: svn://tug.org/texlive/trunk@47146 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/lualatex/novel/novel.cls | 722 ++++++++++++++-----------
 1 file changed, 393 insertions(+), 329 deletions(-)

(limited to 'Master/texmf-dist/tex/lualatex/novel/novel.cls')

diff --git a/Master/texmf-dist/tex/lualatex/novel/novel.cls b/Master/texmf-dist/tex/lualatex/novel/novel.cls
index 78bdd95fbc8..23989dc380b 100644
--- a/Master/texmf-dist/tex/lualatex/novel/novel.cls
+++ b/Master/texmf-dist/tex/lualatex/novel/novel.cls
@@ -1,10 +1,6 @@
 %%
-%% This is file `novel.cls', part of class `novel'.
-%% Copyright 2017 Robert Allgeyer.  Contact:  anytthree [at] gmail.com
-%% 
-%% Wanted: Replacement maintainer. The original creator wants to move on.
-%% AFAIK this code is tested and suitable for general use.
-%% Contact CTAN (and me) if interested in taking over the maintenance.
+%% This is file `novel.cls', LuaLaTeX `novel' document class.
+%% Copyright 2017-2018 Robert Allgeyer.  Contact:  anytthree [at] gmail.com
 %% 
 %% This file may be distributed and/or modified under the
 %% conditions of the LaTeX Project Public License, either version 1.3c
@@ -17,9 +13,10 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}[1995/12/01]
 % Actually needs LuaLaTeX, at least version 0.95 from TeXLive 2016.
-\ProvidesClass{novel}[2018/01/14 v1.46.2 LaTeX document class]
+\ProvidesClass{novel}[2018/03/28 v1.50 LaTeX document class]
 %%
-%% Version 1.46: Possibly final version.
+%% Version 1.50: Improved image handled, sandbox, scripts.
+%% Version 1.46.2: Now called "novel-old" version.
 %% Version 1.43: General cleanup of docs and code, for improved readbaility.
 %% Version 1.42: Greatly improved HTML documentation.
 %% Version 1.41: Improved HTML documentation.
@@ -38,7 +35,7 @@
 
 
 %% DESCRIPTION:
-%% -----------------------------------------------------------------------------
+%% ----------------------------------------------------------------------------
 %% Class `novel' is designed for print fiction: novels or short stories.
 %% It cannot be used for e-books or for journal publication.
 %% It is not suitable for most non-fiction, because routine academic features
@@ -63,25 +60,28 @@
 
 
 %% REQUIRE LUATEX and do some preliminary setup.
-%% -----------------------------------------------------------------------------
+%% ----------------------------------------------------------------------------
 %% These are not user settings.
 %
 \RequirePackage{ifluatex} % LuaTeX is required. Not XeTeX, dvips, or pdfTeX.
 \RequirePackage{ifxetex} % For occasional hacks (hiss, boo).
-\RequirePackage{luatex85} % Needed for compatibility when using LuaTeX 0.95 etc.
+\RequirePackage{luatex85} % Needed for compatibility with LuaTeX 0.95 etc.
 \RequirePackage{pdftexcmds} % compatibility
 \ifluatex
   % New with TeXlive 2016. Removes unnecessary File Data:
   \pdfvariable suppressoptionalinfo 511 % writes only ID to PDF Catalog
 \else
-  \ClassError{novel}{Must compile with LuaLaTeX 0.95+}{Sorry, LuaLaTeX only.%
-    No pdfTeX, dvips, or XeTeX.}
+  \ClassError{novel}{Must compile with LuaLaTeX 0.95+}%
+   {Sorry, LuaLaTeX only. No pdfTeX, dvips, or XeTeX.}
 \fi
+\pdfimageresolution=300 % default dpi if image does not say
 %
 \RequirePackage{etoolbox} % general good stuff
 \RequirePackage{xifthen} % improved ifthenelse handling
 \RequirePackage{xstring} % parses strings
 \RequirePackage{fp} % used everywhere for math calculations
+\RequirePackage{xfp} % more math calculations
+\RequirePackage{keyval} % used by drop cap
 \FPmessagesfalse % eliminates numerous friendly messages from the log
 %
 \pdfminorversion=3 % might be reset later, depending on settings
@@ -90,26 +90,23 @@
 \RequirePackage{silence} % Used here:
 % hyperref draft mode is always on, even when novel is not in draft mode:
 \WarningFilter{hyperref}{Draft mode on} % So, get rid of the hyperref warning.
-% Prevent complaints about no protrusion list for cmr, cmm, etc. in decimal pts:
+% Prevent complaints about no protrusion list for cmr, cmm, etc. in decimal pt:
 \WarningFilter{microtype}{I cannot find a protrusion list} % It's not there!
 %
 \WarningsOff[Fancyhdr,fancyhdr] % complains about headheight when no header
 \RequirePackage[relative]{textpos} % for inserting images
-\RequirePackage{noindentafter} % for unindented chapter and scene starts
 \RequirePackage{calc} % allows length expression calculations
-\RequirePackage{changepage} % provides block indents, etc. Do not use strict!
-\RequirePackage{atbegshi} % for one-page header changes. Also used by hyperref.
-\RequirePackage{letltxmacro} % for re-defining some macros
-\RequirePackage{magaz} % special treatment of first lines
+\RequirePackage{atbegshi} % in oberdiek bundle. For one-page header changes. Also used by hyperref.
+\RequirePackage{letltxmacro} % in oberdiek bundle. For re-defining some macros
 \RequirePackage{xparse} % for writing cool-looking commands
 %
-% In addition, the following packages are required, but they are not loaded now.
-% They must wait for something else to happen first. They will be loaded
-% with suitable arguments, when the time comes:
+% In addition, the following packages are required, but not loaded yet.
+% They must wait for something else to happen first. Then they will be loaded
+%   with suitable arguments, when the time comes:
 % fontspec -- in novel-LayoutSettings.sty
 % unicode-math -- in novel-LayoutSettings.sty
 % polyglossia -- in novel-LayoutSettings.sty
-% microtype -- in novel-FontDefaults.sty
+% microtype -- in novel-Fonts.sty
 % hyperref -- in novel-pdfx.sty
 % fancyhdr -- in novel.HeadFootStyles.sty
 % xcolor -- lower in this page
@@ -119,11 +116,28 @@
 %%
 
 
+\newlength\@tempLength % scratch length for local calculations
+\newif \if@tempTF % scratch boolean for local tests
+
+
+%% Global lengths are often passed around in `novel'.
+%% But \setlength is not always global in effect.
+%% This code defines a global command.
+%% Via Heiko Oberdiek at tex.stackexchange.com:
+\gdef\gsetlength#1#2{% #1 is the length command, #2 is the length value
+  \begingroup%
+    \setlength\skip@{#2}% Local assignment to a TeX scratch register.
+    \global#1=\skip@% Global assignment to #1
+  \endgroup% \skip@ is restored by end of group.
+}% end \gsetlength
+%%
+
+
 %% Process document class options.
-%% -----------------------------------------------------------------------------
+%% ----------------------------------------------------------------------------
 % Allowed option list:
-%   draft xml shademargins graytext greytext cropmarks cropview closecrop
-%   coverart unblock
+%   draft xml shademargins cropmarks cropview closecrop
+%   coverart sandbox unblock mtoff polyoff test
 % Yes, I realize that this could have been done another way, but I want
 %   to issue error messages from `novel' rather than (say) `keyval':
 \gdef\@mycol{\@classoptionslist}
@@ -132,8 +146,8 @@
 \StrDel{\@mycol}{draft}[\@mycol]
 \StrDel{\@mycol}{xml}[\@mycol]
 \StrDel{\@mycol}{shademargins}[\@mycol]
-\StrDel{\@mycol}{graytext}[\@mycol]
-\StrDel{\@mycol}{greytext}[\@mycol]
+\StrDel{\@mycol}{graytext}[\@mycol] % Obsolete. Now always allows graytext.
+\StrDel{\@mycol}{greytext}[\@mycol] % See above.
 \StrDel{\@mycol}{cropmarks}[\@mycol]
 \StrDel{\@mycol}{cropview}[\@mycol]
 \StrDel{\@mycol}{closecrop}[\@mycol]
@@ -141,65 +155,53 @@
 \StrDel{\@mycol}{unblock}[\@mycol]
 \StrDel{\@mycol}{mtoff}[\@mycol]
 \StrDel{\@mycol}{polyoff}[\@mycol]
+\StrDel{\@mycol}{test}[\@mycol]
+\StrDel{\@mycol}{sandbox}[\@mycol]
 %
 \ifthenelse{\equal{\@mycol}{}}{}{
-  \ClassWarning{novel}{Unrecognized class option: \@mycol^^J%
-   The unrecognized option was ignored!^^J%
-   If `debug' it is obsolete from v.1.40.^^J%
-   Note that font size, document size, and language^^J%
-   are not `novel' class options. See documentation.}%
+  \ClassWarning{novel}{^^JUnrecognized class option: \@mycol. ^^J%
+   The unrecognized option was ignored! ^^J%
+   If `debug' it is obsolete from v.1.40. ^^J%
+   Note that font size, document size, and language ^^J%
+   are not `novel' class options. See documentation. ^^J}%
 }
-%
 % If used, option `draft' shows overflow rule.
-\newif \if@useDraftMode
+% Prior to v. 1.46.1, the following was \if@useDraftMode.
+% Changed for possible compatibility with packages that detect draft mode.
+\newif \ifdraftdoc
 \setlength\overfullrule{0pt}
 \DeclareOption{draft}{
   \setlength\overfullrule{6pt}
-  \@useDraftModetrue
-  \ClassWarning{novel}{Compiled using draft mode. Not for final release!^^J}
+  \draftdoctrue
+  \ClassWarning{novel}{^^JCompiled with draft mode. Not for final release! ^^J}
 }
+\newif \ifmsdoc % manuscript, always false. Compatibility with other packages.
 % If used, option `xml' creates a file `\jobname-XMPasXML.xml` that contains
 % the XMP metadata with an xml declaration and comments at top.
 % Only works when \SetPDFX is not `off'. Note that you do not need to use
 % this option to get PDF/X. It is only for your own usage.
 \newif \if@wantXMPasXML
-\DeclareOption{xml}{
-  \@wantXMPasXMLtrue
-}
+\DeclareOption{xml}{\@wantXMPasXMLtrue}
 \DeclareOption{xmp}{ % in case you mis-type.
-  \ClassError{novel}{No class option `xmp'. Want `xml' ?^^J}%
-   {There is no class option named `xmp'. It is `xml'.^^J}
+  \ClassError{novel}{No class option `xmp'. Use `xml'}%
+   {There is no class option named `xmp'. It is `xml'.}
 }
 % Option `shademargins' does just that. Ignored unless in draft mode.
-% Does not matter if `graytext' option in use.
 \newif \if@shademargins
-\DeclareOption{shademargins}{
-  \@shademarginstrue
-}
-% Option `graytext' allows text in grayscale. Images unaffected.
-% If this option is not used, all text will be K black.
-\newif \if@graytext
-\DeclareOption{graytext}{
-  \@graytexttrue
-}
-% For the Brits:
-\DeclareOption{greytext}{
-  \@graytexttrue
-}
+\DeclareOption{shademargins}{\@shademarginstrue}
+%
+\newif \if@graytext % remains here for backwards compatibility
+\@graytexttrue % from v.1.50 always true, no longer an option.
+%
 % Usually you do NOT want crop (trim) marks!
-% Configurable by \SetCropMarks[]{}.
 \newif \if@cropmarks
-\DeclareOption{cropmarks}{
-  \@cropmarkstrue
-}
+\DeclareOption{cropmarks}{\@cropmarkstrue}
 % PDF viewers display CropBox, which normally is identical to MediaBox.
 % Option `cropview', sets CropBox to TrimBox instead, so that's all you see.
 % Only makes a difference when MediaBox is larger than TrimBox.
 % Ignored unless in draft mode.
 \newif \if@cropview
-\DeclareOption{cropview}{
-  \@cropviewtrue
-}
+\DeclareOption{cropview}{\@cropviewtrue}
 % With `closecrop', the TrimSize and margins are re-sized, to preserve the
 % live area, but with reduced margins on all sides (same for verso/recto).
 % This option is available only in draft mode, and disables shademargins.
@@ -207,53 +209,43 @@
 % so you can think about edits while traveling. It is NOT an e-book, since
 % it has no hyperlinks and is missing some features that an e-book should have.
 \newif \if@closecrop
-\DeclareOption{closecrop}{
-  \@cropviewtrue\@closecroptrue
-}
+\DeclareOption{closecrop}{\@cropviewtrue\@closecroptrue}
 % New in version 1.2: `coverart' option. See documentation.
 % This is used to create a 1-page file with no text, just an image.
 % Intended purpose is PDF/X for novel cover.
 \newif \if@coverart
-\DeclareOption{coverart}{
-  \@coverarttrue
-}
+\DeclareOption{coverart}{\@coverarttrue}
 % New in version 1.34: unblock option, for developer use only.
-% Normally, a number of packages known to be incompatible with this document class
+% Normally, a number of packages known to be incompatible with `novel'
 % are blocked from loading. If the user tries to get them via \usepackage
 % or \RequirePackage, or if they are called within some other loaded package,
 % then compile halts with an error. The `unblock' option turns off blocking,
 % and allows incompatible packages to load. Use only at own risk!
 \newif \if@novelunblock % For developer use.
-\DeclareOption{unblock}{
-  \@novelunblocktrue
-}
+\DeclareOption{unblock}{\@novelunblocktrue}
 % New in version 1.44: mtoff option, primarily for developer use.
 % With mtoff, the microtype package is not loaded.
 \newif \if@mtoff
-\DeclareOption{mtoff}{
-  \@mtofftrue
-}
+\DeclareOption{mtoff}{\@mtofftrue}
 % New in version 1.44: polyoff option, primarily for developer use.
 % With polyoff, the polyglossia package is not loaded.
 % You may need to load babel, or not, via \RequirePackage[options]{babel}.
 \newif \if@polyoff
-\DeclareOption{polyoff}{
-  \@polyofftrue
-}
+\DeclareOption{polyoff}{\@polyofftrue}
 % New in version 1.46: test option, primarily for developer use.
-% Throws error if Liberintus and Latin Modern Roman fonts are unavailable.
-% Throws error is file novel-testimage.png is not in same folder.
-% Lets \lettrine relax if `lettrine' package not loaded.
 \newif \if@testsuite
-\DeclareOption{test}{
-  \@testsuitetrue
-}
+\DeclareOption{test}{\@testsuitetrue}
+%
+% New in version 1.50: sandbox option, for artwork and tables. Max 4 pages.
+\newif \if@sandbox
+\DeclareOption{sandbox}{\@sandbox}
+%
 %% Note that document size and normal font size are not class options.
 %% They are set by commands in the Preamble, and have default values.
 %
 \ProcessOptions\relax
 % Disable some options, depending on compatibilities:
-\if@useDraftMode\else
+\ifdraftdoc\else
   \global\@shademarginsfalse
   \global\@cropviewfalse
   \global\@closecropfalse
@@ -270,64 +262,81 @@
 \fi
 %
 \if@coverart
-  \global\@useDraftModefalse
+  \global\draftdocfalse
   \global\@shademarginsfalse
   \global\@cropviewfalse
   \global\@closecropfalse
-  \global\@graytextfalse
+  \global\@sandboxfalse
+\fi
+%
+\if@sandbox
+  % Thanks to user Compholio at stackexchange.com:
+  \newcounter{sandboxcount}
+  \ifx\latex@outputpage\@undefined\relax%
+      \global\let\latex@outputpage\@outputpage%
+  \fi%
+  \gdef\@outputpage{%
+    \addtocounter{sandboxcount}{1}%
+    \ifnum\value{sandboxcount}>4\relax% no output after 4 pages
+    \else%
+      \latex@outputpage%
+    \fi%
+  }%
+  \AtEndPreamble{%
+    \gdef\@title{untitled interior artwork}%
+  }%
+  \AfterEndPreamble{%
+    \ifdraftdoc\else\thispagestyle{empty}\fi%
+  }%
 \fi
 %% end class options
 
 
+
+\RequirePackage{noindentafter} % for unindented chapter and scene starts
+\RequirePackage{changepage} % provides block indents, etc. Do not use strict!
+\RequirePackage{magaz} % special treatment of first lines
+
+
 %% Activate xcolor, adjustbox, and eso-pic:
-%% -----------------------------------------------------------------------------
-% The final book must be monochrome (black and white only) for all text,
-%   unless option `graytext' is used. Then, grayscale text is permitted.
-% Interior images must be raster monochrome or grayscale, whether or not
-%   the `graytext' option is used. See documentation.
+%% ----------------------------------------------------------------------------
+% The final book must be black/white and gray only, for all text.
+% Interior images must be raster black/white or grayscale. See documentation.
 %   Vector graphics are strongly discouraged, in any case.
 % In draft mode only, the `shademargins' option requires `grayscale',
 %   which will be temporarily enabled, even if not specifically requested.
-\newif \if@grayenabled
 %
-\if@useDraftMode
-  \RequirePackage[gray,hyperref]{xcolor} % allows some layout checks
-  \global\@grayenabledtrue
-\else
-  \if@graytext
-    \RequirePackage[gray,hyperref]{xcolor} % black/white book block
-    \global\@grayenabledtrue
-  \else
-    \RequirePackage[monochrome,hyperref]{xcolor} % black/white book block
-  \fi
-\fi
+\RequirePackage[gray,hyperref]{xcolor}
+%
 % adjustbox and eso-pic cannot precede xcolor.
 \RequirePackage{adjustbox} % for scaling and moving
 \RequirePackage{eso-pic} % background effects in draft mode
-%
+\RequirePackage{pdfpages} % only used for pdf pre-processed by novel-scripts
 %% end activate xcolor and adjustbox
 
 
-%% Temporary normal font size
-%% -----------------------------------------------------------------------------
+%% Temporary normal font size, baselineskip, and fontspec
+%% ----------------------------------------------------------------------------
 %% This normalsize is temporary, so that packages can load without complaint.
 %% It will be modified later, during layout calculations.
 %% Actual default font size will be 11pt-12pt, with 11.4pt average.
-%% But that is for typical book-weight fonts. The closest LMR eqivalent is 10pt.
-\def\Current@FontSizeNum{10}
-\def\Current@BaselineSkipNum{13}
+%% The small temporary size is to ensure that overly-large struts and skips
+%%   are not created prior to page layout calculation.
+\gdef\@TentativeEmN{10}
+\gdef\@TentativeBLSkipN{13}
 \renewcommand\normalsize{%
-  \@setfontsize\normalsize{\Current@FontSizeNum}{\Current@BaselineSkipNum}%
+  \@setfontsize\normalsize{\@TentativeEmN}{\@TentativeBLSkipN}%
 }
 \normalsize
-%
-\RequirePackage{lipsum} % generates dummy text for examples
-%
-%% end temporary normal point size and baselineskip
+\RequirePackage[no-math]{fontspec} % For LuaLaTeX. NOT package `fontenc'.
+% The `novel' class is not intended for math. But TeX assumes you do math,
+%   so it needs a math font, whether you like it or not.
+\RequirePackage{unicode-math}
+%% end temporary normal point size, baselineskip, and fontspec.
 
 
 %% Define commands used for File Data, including PDF/X Settings.
-%% -----------------------------------------------------------------------------
+%% ----------------------------------------------------------------------------
 %% As used here, `File Data' refers to PDF metadata as found in PDF/Info
 %% and in XMP. This class does not write it to the PDF Catalog.
 \RequirePackage{novel-FileData}
@@ -335,18 +344,39 @@
 
 
 %% Physical Layout Commands and Settings.
-%% -----------------------------------------------------------------------------
-%% Define user commands that over-ride the class option pre-configured settings.
+%% ----------------------------------------------------------------------------
+%% Define user commands that over-ride class option pre-configured settings.
 %% Also sets a variety of miscellaneous lengths:s \parsep, \parindent, etc.
 \RequirePackage{novel-LayoutSettings}
-%%
 
 
-%% Additional Preamble Settings and Commands.
-%% -----------------------------------------------------------------------------
+%% Polyglossia.
+%% ----------------------------------------------------------------------------
+% Language-specific settings:
+\if@polyoff % polyoff is new in v 1.44.
+  \ClassWarning{novel}{^^JYou chose the `polyoff' class option. ^^J%
+    So, the polyglossia package was not loaded. But like it or not, ^^J%
+    the babel package was loaded, with generic hyphenation. ^^J%
+    This behavior, or choice of language, cannot be changed. ^^J%
+    If you want a specific language, you will have to use polyglossia. ^^J}%
+\else
+  \RequirePackage{polyglossia} % loading order changed in v. 1.40.3.
+  \setdefaultlanguage[variant=american]{english} % may be changed by user
+\fi
+%% end polyglossia
+
+
+%% Additional Macros, Loaded in Preamble.
+%% ----------------------------------------------------------------------------
+\RequirePackage{novel-Fonts} % font settings and defaults
+\if@coverart\else\RequirePackage{lipsum}\fi % generates dummy text for examples
+%% New in version 1.50:
+\RequirePackage{novel-DropCap}
 % Macros for use in document body:
 \RequirePackage{novel-TextMacros}
 % Standard header footer styles, based on `fancyhdr':
+% Each pre-configured style will set these booleans true or false:
+\newif\if@HasHeader \newif\if@HasFooter
 \RequirePackage{novel-HeadFootStyles}
 % Chapter and Scene styles:
 \RequirePackage{novel-ChapterScene}
@@ -354,240 +384,274 @@
 \RequirePackage{novel-Images}
 % Footnotes and endnotes:
 \RequirePackage{novel-Footnotes}
+% Obsolete code. Do not use in new documents:
+\RequirePackage{novel-Obsolete}
+%%
+
+
+%% For convenience, from `article' class.
+%% ----------------------------------------------------------------------------
+\newenvironment{verse}{% Not very useful.
+  \let\\\@centercr
+  \list{}{%
+    \itemsep\z@
+    \itemindent -\parindent%
+    \listparindent\itemindent
+    \rightmargin \leftmargin
+    \advance\leftmargin \parindent%
+  }%
+  \item\relax%
+}{%
+  \endlist%
+}
+%%
+\newenvironment{quotation}{% Not very useful.
+  \list{}{%
+    \listparindent \parindent%
+    \itemindent \listparindent
+    \rightmargin \leftmargin
+    \parsep \z@%
+  }%
+  \item\relax%
+}{%
+  \endlist%
+}
 %%
+\newenvironment{quote}{% Not very useful.
+  \list{}{%
+    \rightmargin\leftmargin%
+  }%
+  \item\relax%
+}{%
+  \endlist%
+}
+%
+%% end convenience.
 
 
-%% Special features of test suite.
-%% -----------------------------------------------------------------------------
+
+%% Special features of test suite (for developers and error reporting)
+%% ----------------------------------------------------------------------------
+% Files `novel-testsuite.tex' and `novel-testimage.png' are within the novel
+%   documentation extras folder. To run the test suite, copy these files to
+%   a writeable location (such as your home directory) and compile there.
 \newcommand\testsuiteoops[1]{%
   \ClassError{novel}{#1 missing}{Install the necessary file(s).}%
 }
 \if@testsuite
-  \IfFontExistsTF{libertinusserif-regular.otf}{}{\testsuiteoops{`libertinus' fonts}}
+  \IfFontExistsTF{libertinusserif-regular.otf}{}{%
+    \testsuiteoops{`libertinus' fonts}%
+  }
   \IfFileExists{lmodern.sty}{}{\testsuiteoops{`lmodern' package}}
   \IfFileExists{novel-testimage.png}{}{\testsuiteoops{`novel-testimage.png'}}
   \NewFontFamily\mustbelibertinus{Libertinus Serif}
   \NewFontFamily\mustbelmodern{Latin Modern Roman}
 \fi
-\AtBeginDocument{\@ifpackageloaded{lettrine}{}%
-  {\DeclareDocumentCommand\lettrine{ O{} m m }{#2#3}}%
-}
 %% end special features of test suite.
 
 
-%% \AtEndPreamble sets defaults and calculates layout
-%% -----------------------------------------------------------------------------
+%% \AtEndPreamble sets defaults, calculates layout, and writes PDF/X
+%% ----------------------------------------------------------------------------
+% This is prior to \AtBeginDocument, and ensures that the results are available
+%   prior to any \AtBeginDocument routines from user macros or loaded packages. 
 \AtEndPreamble{
-  % New in v. 1.44. Sets default resolution for images without internal dpi:
-  \pdfimageresolution=\@novimgres % from \SetFlexResolution. Default 300.
-  % If user did not choose language, default is here. Sorry, Brits:
-  % Macro \xpg@main@language is gdef'd by \setdefaultlanguage in polyglossia.
-  \if@polyoff\else % polyoff v 1.44.
-    \@ifundefined{xpg@main@language}{\setdefaultlanguage[variant=american]{english}}{}
-  \fi
-  \RequirePackage{novel-CalculateLayout}
-  \RequirePackage{novel-FontDefaults}
-  \providecommand\textls[2][]{#2} % when mtoff option
-  \renewcommand\textls[2][]{#2} % nullifies this microtype command (problems)
-  \RequirePackage{novel-pdfx}%
+  \@ActivateFonts % in `novel-Fonts.sty'
+  \RequirePackage{novel-CalculateLayout} % may load novel-ChangeLayout.sty
+  \RequirePackage{novel-PostLayout} % calculates shademargins, cropmarks, etc.
+  \RequirePackage{novel-pdfx}% also provides an \AtBeginDocument macro
+  \AtEndDocument{%
+    \if@coverart\else%
+      \if@sandbox\else%
+        \cleartoend% adds 1 or 2 blanks, for final verso blank
+      \fi%
+    \fi%
+  }
+}%
+%% end AtEndPreamble
+
+
+%% Messages that may be issued by \AtBeginDocument routines:
+%% ----------------------------------------------------------------------------
+%
+%% Dealing with known incompatible packages:
+\gdef\really@no#1#2#3{ % cannot be used, even with unblock or sandbox
+  \@ifpackageloaded{#1}{%
+   \ClassError{novel}{Sorry, package `#1' cannot be used in `novel' class}%
+    {No exceptions. You are out of luck. ^^J%
+     Reason: `novel' has #2 ^^J%
+     See `novel' HTML documentation, section #3. ^^J%
+     Note: The offending package may have been loaded by another package.}%
+  }{}%
+} %
+%
+%% Command or environment native to LuaLaTeX, but banned except in sandbox:
+\gdef\@OnlySandbox#1{%
+  \ClassError{novel}{Use of `#1' page \thepage\space requires sandbox}%
+   {`novel' class prohibits command or environment `#1' ^^J%
+    unless you use class option `sandbox'. See documentation.}%
 }
-%%
+%
+%% Package can be used, but Alert:
+\gdef\alert@nodisp#1{%
+  \@ifpackageloaded{#1}{%
+  \typeout{^^JClass `novel' Alert: Beware of package #1. ^^J%
+   Commands from this package may cause mis-positioning in main text. ^^J%
+   Maybe, maybe not. Best if usage is confined to display pages. ^^J}%
+  }%
+}
+%
+%% Dealing with blocked packages, allowed with `unblock':
+\if@novelunblock
+  \gdef\sorry@no#1{} % no package-specific errors, when unblock
+  \ClassWarning{novel}{Using `unblock' class option, at your own risk. ^^J%
+    The `unblock' option is for developer use, not production documents. ^^J%
+    If the unblocked packages and commands cause problems, ^^J%
+    they are not bugs. Do not report them. You have been warned. ^^J%
+    Perhaps your document will compile without error, and perhaps the ^^J%
+    results are OK. But in other cases, unexpected typesetting results. ^^J}%
+\else % package-specific errors, when no unblock
+  \gdef\sorry@no#1{
+    \@ifpackageloaded{#1}{%
+     \ClassError{novel}{Sorry, package `#1' cannot be used in `novel' class}%
+      {See `novel' HTML documentation, regarding `sandbox' option. ^^J%
+       Note: The offending package may have been loaded by another package.}%
+    }{}%
+  } %
+\fi
+%% end messages.
 
 
 %% \AtBeginDocument finishes the setup
-%% -----------------------------------------------------------------------------
-\newlength\normalparindent
+%% ----------------------------------------------------------------------------
+%
+\gdef\@needsandboxmsg{%
+  \ClassError{novel}{Need `sandbox' for picture, figure, table environments}%
+   {You cannot use picture, figure, or table environments in `novel' unless ^^J%
+    you use the `sandbox' document class option. See docs.}%
+}
 \AtBeginDocument{ %
-  \@ifpackageloaded{lettrine}{%
-    \LettrineOnGridtrue%
-    \setlength\DiscardVskip{10\nbs}% effectively infinite
-    \global\DiscardVskip=\DiscardVskip%
-    \setlength\DefaultFindent{0.25em}% about one space
-    \global\DefaultFindent=\DefaultFindent%
-    \setlength\DefaultNindent{0em}% uniform gap
-    \global\DefaultNindent=\DefaultNindent%
-    \setcounter{DefaultLines}{3}% more likely than 2.
-  }{}%
-  % Find some useful measurements:
-  \setlength\normalparindent{\parindent}
-  \global\normalparindent=\parindent
-  \gdef\@normalxheight{\heightof{x}}
-  \setlength\normalxheight{\@normalxheight}
-  \global\normalxheight=\normalxheight
-  \gdef\@normalXheight{\heightof{X}}
-  \setlength\normalXheight{\@normalXheight}
-  \global\normalXheight=\normalXheight
-  \gdef\@normalscxheight{\heightof{\textsc{x}}}
-  \setlength\normalscxheight{\@normalscxheight}
-  \global\normalscxheight=\normalscxheight
-  \gdef\@normalAringheight{\heightof{Å}}
-  \setlength\normalAringheight{\@normalAringheight}
-  \global\normalAringheight=\normalAringheight
-  \gdef\@normaldescender{\depthof{gjpqy}}
-  \setlength\normaldescender{\@normaldescender}
-  \global\normaldescender=\normaldescender
-  % Activate user choice of whether or not to indent after scenebreak commands:
-  \if@indentAfterScenebreak\else
-    \NoIndentAfterCmd{\scenebreak}
-    \NoIndentAfterCmd{\sceneline}
-    \NoIndentAfterCmd{\scenestars}
-  \fi
+  %% Mostly involve settings defaults:
+  \@ActivateTextLengths % in `novel-TextMacros.sty'
+  \@ActivateDropCaps % in `novel-DropCaps.sty'
+  \@ActivateChapterScene % in `novel-ChapterScene.sty'
+  \@ActivateHeadFootStyles % in file `novel-HeadFootStyles.sty'
+  \@ActivatePDFInfo % in file `novel-pdfx.sty'
+  \@ActivateTextMacros % in `novel-TextMacros.sty'
+  \@ActivateFootnotes % in `novel-Footnotes.sty'
+  \@DisableFontSizes % in file `novel-LayoutSettings.sty'
+  \@DisableLayoutSettings % in file `novel-LayoutSettings.sty'
+  \@DisableFileDataSettings % in file `novel-FileData.sty'
+  \@DisableChapterSceneSettings % in file `novel-ChapterScene.sty'
+  \@DisableHeadFootSettings % in file `novel-HeadFootStyles.sty'
+  %% List of always-blocked packages (not exhaustive, since TeX has so many):
+  \really@no{geometry}{its own layout commands.}{4}
+  \really@no{pdfx}{built-in PDF/X capability.}{3.4}
+  \really@no{xmpincl}{built-in PDF/X capability.}{3.4}
+  \really@no{hyperxmp}{built-in PDF/X capability.}{3.4}
+  \really@no{pdfxmult}{built-in PDF/X capability.}{3.4}
+  \really@no{inputenc}{utf-8 encoding always.}{1.2.1}
+  \really@no{fontenc}{`fontspec' and utf-8 encoding always.}{1.2.1, 1.2.3}
+  \really@no{biblatex}{no bibiography capability.}{1.2.5}
+  \really@no{showkeys}{an incompatible layout method.}{1.2.5}
+  \really@no{booktabs}{no capability for this, due to printer specs.}{3.4}
+  \really@no{pax}{no capability for this, due to printer specs.}{3.4}
+  \really@no{bookmark}{focus on paper books, not e-books.}{(top of file)}
+  \really@no{endnotes}{limited, built-in endnote methods.}{6.5}
+  \really@no{acronym}{focus on paper books, not e-books.}{(top of file)}
+  \really@no{embedfile}{incompatible print requirements.}{(top of file)}
   %
-  \@activateHeadFootStyles % in file `novel-HeadFootStyles.sty'
-  \@novelPDFinfo % in file `novel-pdfx.sty'.
-  % Commands that cannot be used after Preamble:
-  \let\indentAfterScenebreak\relax
-  \let\title\relax
-  \let\author\relax
-  \let\subtitle\relax
-  % Dealing with known incompatible packages:
-  \if@novelunblock
-    \gdef\sorry@no#1{} % let them be used
-  \else % block them (default)
-    \gdef\sorry@no#1{\@ifpackageloaded{#1}{%
-      \ClassError{novel}{Sorry, package `#1' cannot be used}%
-      {The `novel' class does not allow use of package `#1'.^^J%
-      You must remove it from the Preamble, and also remove its commands^^J%
-        from the body of your document. In rare cases, the offending package^^J%
-        was loaded by some other package.^^J}%
-      }{}%
-    }
-  \fi
-  % List of blocked packages (not exhaustive, since TeX has so many):
-  \sorry@no{pdfx}
-  \sorry@no{xmpincl}
-  \sorry@no{hyperxmp}
-  \sorry@no{pdfxmult}
-  \sorry@no{inputenc}
-  \sorry@no{fontenc}
-  \sorry@no{showkeys}
-  \sorry@no{wrapfigure}
-  \sorry@no{wrapfig}
-  \sorry@no{float}
-  \sorry@no{morefloats}
-  \sorry@no{footmisc}
-  \sorry@no{footnote}
-  \sorry@no{manyfoot}
-  \sorry@no{caption}
-  \sorry@no{subcaption}
-  \sorry@no{multirow}
-  \sorry@no{tabu}
-  \sorry@no{tabularx}
-  \sorry@no{tabulary}
-  \sorry@no{array}
-  \sorry@no{booktabs}
-  \sorry@no{eqparbox}
-  \sorry@no{pdfpages}
-  \sorry@no{nth}
-  \sorry@no{engord}
-  \sorry@no{endnotes}
-  %%
-  %% Pertains to novel-LayoutSettings.sty:
-  \ifcsname pagenumberstyle\endcsname\else
-    \SetPageNumberStyle{\thepage}
-  \fi
+  \if@sandbox%
+    \RequirePackage{novel-Sandbox}%
+  \fi%
   %
-  \def\@setchapterstartOK{false}%
-  \ifthenelse{\equal{\@setchapterstart}{empty}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{plain}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{footer}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{fancyplain}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{fancy}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{forcenumber}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{dropfolioinside}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstart}{dropfoliobeneath}}{%
-    \def\@setchapterstartOK{true}%
-  }{}%
-  \ifthenelse{\equal{\@setchapterstartOK}{true}}{}{%
-    \ClassError{novel}{\string\SetChapterStartStyle\space bad argument}%
-    {\string\SetChapterStartStyle\space only allows certain choices.^^J}%
-  }%
-  %%
-  %% Pertains to novel-TextMacros.sty:
-  \setlength\forceparlength{\parindent}
-  \global\forceparlength=\forceparlength
-  \gdef\forceindent{\ifvmode\else\unskip\fi\stake\hspace{\forceparlength}}
-  \gdef\backindent{\ifvmode\else\unskip\fi\hspace{-\forceparlength}}
-  %%
-  %% Pertains to novel-footnotes.sty:
-  \gdef\SetFootnoteMarker#1{%
-    \typeout{^^JClass `novel' Alert: %
-    \string\SetFootnoteMarker\space ineffective after Preamble.^^J}%
-  }
-  % Must wait for \nbs to be calculated:
-  \setlength\footnotesep{0.8\nbs}
-  % Must wait for main font and its size to be active:
-  \newlength\@hoaring
-  \setlength\@hoaring{\heightof{Å}}
-  \global\@hoaring=\@hoaring
-  \newlength\@twast % tweaks asterisk
-  \setlength\@twast{\heightof{*}}
-  \addtolength\@twast{-\@hoaring}
-  \global\@twast=\@twast
-  \newlength\@twdag % tweaks dagger
-  \setlength\@twdag{\heightof{†}}
-  \addtolength\@twdag{-0.2\@twdag}
-  \addtolength\@twdag{-\@hoaring}
-  \global\@twdag=\@twdag
-  \newlength\@twdbldag % tweaks double dagger
-  \setlength\@twdbldag{\heightof{‡}}
-  \addtolength\@twdbldag{-0.2\@twdbldag}
-  \addtolength\@twdbldag{-\@hoaring}
-  \global\@twdbldag=\@twdbldag
-  \newlength\@twsect % tweaks section mark
-  \setlength\@twsect{\heightof{§}}
-  \addtolength\@twsect{-0.2\@twsect}
-  \addtolength\@twsect{-\@hoaring}
-  \global\@twsect=\@twsect
-  \newlength\@tweight % tweaks 8, reliably the tallest digit
-  \setlength\@tweight{\heightof{8}}%
-  \addtolength\@tweight{-0.2\@tweight}%
-  \addtolength\@tweight{-\@hoaring}%
-  \global\@tweight=\@tweight%
-  % Must wait to see how \SetFootnoteMarker was used:
-  \ifthenelse{\equal{\@myfnsymbols}{*}}{\setcounter{@maxfnsymbol}{8}}{}
-  \ifthenelse{\equal{\@myfnsymbols}{†}}{\setcounter{@maxfnsymbol}{6}}{}
-  %%
-}
-%% end AtBeginDocument
-
-
-%% New in version 1.2, coverart option. See documentation.
-\AfterEndPreamble{
-  \if@coverart
-    \AddToShipoutPictureBG{%
-      \AtPageUpperLeft{%
-        \InlineImage{\novelcoverimage}%
-      }%
-    }
-    \null% without this, page has no "content"
+  %% Potential problem packages, allowed in sandbox or with unblock:
+  \if@sandbox\else
+    % Related to floats:
+    \sorry@no{floatflt}
+    \sorry@no{floatfig}
+    \sorry@no{flafter}
+    \sorry@no{float}
+    \sorry@no{morefloats}
+    \sorry@no{endfloat}
+    \sorry@no{placeins}
+    % Related to footnotes and endnotes:
+    \sorry@no{footmisc}
+    \sorry@no{footnote}
+    \sorry@no{manyfoot}
+    % Related to tables:
+    \sorry@no{multirow}
+    \sorry@no{tabu}
+    \sorry@no{tabularx}
+    \sorry@no{tabulary}
+    \sorry@no{longtable}
+    % Related to lists:
+    \sorry@no{array}
+    \sorry@no{easylist}
+    \sorry@no{listings}
+    \sorry@no{numitem}
+    \sorry@no{tasks}
+    % Related to graphics or layout:
+    \sorry@no{pagegrid}
+    \sorry@no{subfig}
+    \sorry@no{lpic}
+    \sorry@no{pinlabel}
+    \sorry@no{overpic}
+    \sorry@no{caption}
+    \sorry@no{sidecap}
+    \sorry@no{subcaption}
+    \sorry@no{paracol}
+    \sorry@no{scrextend}
+    \sorry@no{exsheets}
+    \sorry@no{eqparbox}
+    \sorry@no{colortbl}
+    \sorry@no{tikz}
+    \sorry@no{pstricks}
+    \sorry@no{xypic}
+    \sorry@no{xfig}
+    \sorry@no{pgfcalendar}
+    \sorry@no{pgfpages}
+    \sorry@no{pst-pdf}
+    \sorry@no{auto-pst-pdf}
+    \sorry@no{epstopdf}
+    \sorry@no{pdftricks}
+    \sorry@no{pdftricks2}
+    \sorry@no{mpgraphics}
+    \sorry@no{pict2e}
+    \sorry@no{picman}
+    \sorry@no{scalerel}
+    \sorry@no{pmgraph}
+    \sorry@no{reflectgraphics}
+  \fi % end if sandbox.
+  %
+  %% Commands and environments, only allowed in sandbox:
+  \if@sandbox\else
+    \gdef\mplibcode{\@OnlySandbox{mplibcode}}
   \fi
-}
+  %
+  %% Alert packages, might cause minor layout problems, not enough to block:
+  \alert@nodisp{nth}
+  \alert@nodisp{engord}
+  \alert@nodisp{ulem}
+  \alert@nodisp{soul}
+  % end list of Alert packages.
+  %
+  %% Package `pagegrid' interacts with `shademargins' and `draft' options:
+  \@ifpackageloaded{pagegrid}{ % that is, if permitted by sandbox or unblock
+    \ifdraftdoc
+      \if@shademargins
+        \ClassWarning{novel}{^^JGrid from `pagegrid' is concealed. ^^J%
+         Document class option `shademargins' over-writes page grid. ^^J%
+         To see the grid, use `draft' but not `shademargins'. ^^J}
+      \else\fi
+    \else
+      \ClassError{novel}{Package `pagegrid' needs `draft' mode}%
+       {Package `pagegrid' only with document class option `draft'.}%
+    \fi
+  }{} % end if pagegrid
+}% end \AtBeginDocument
 %%
 
 
-%% AtBeginShipout occurs at the completion of each page layout, in document body.
-\AtBeginShipout{%
-  \gdef\@fnafter{}% Pertains to some standard LaTeX footnote code.
-  \stepcounter{runningpages}%
-  \global\@thispagestylesetfalse%
-}
-%%
-
 
 %%
 %% End of file `novel.cls'
-- 
cgit v1.2.3

