summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/lualatex/novel/novel-TextMacros.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/lualatex/novel/novel-TextMacros.sty')
-rw-r--r--Master/texmf-dist/tex/lualatex/novel/novel-TextMacros.sty529
1 files changed, 529 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/novel/novel-TextMacros.sty b/Master/texmf-dist/tex/lualatex/novel/novel-TextMacros.sty
new file mode 100644
index 00000000000..613202fe5c4
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/novel/novel-TextMacros.sty
@@ -0,0 +1,529 @@
+%%
+%% This is file `novel-TextMacros.sty', part of class `novel'.
+%% Copyright 2017 Robert Allgeyer.
+%%
+%%
+%% This file may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3c
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3c or later is part of all distributions of LaTeX
+%% version 2005/12/01 or later.
+%%
+%%
+\ProvidesFile{novel-TextMacros.sty}%
+[2017/03/01 v1.0.6 LaTeX file (text macros usable within document body)]
+%%
+
+
+%% This file contains commands that are usable within the document body,
+%% for styling and otherwise manipulating text.
+%% These are not commands used in Preamble for setup, although a few of them
+%% can be used in Preamble for setup, then again in body for change.
+
+
+
+%% The following commands were defined in other files of `novel' class:
+%% -----------------------------------------------------------------------------
+% \thetitle or \theTitle returns string set by \title{} or \SetTitle{} -- See novel-LayoutSettings.sty.
+% \theauthor or \theAuthor returns string set by \author or \SetAuthor{} -- See novel-LayoutSettings.sty.
+% \normalFontSize length of main font setting. May be tweaked during rework. -- See novel-CalculateLayout.sty.
+% \normalBaselineSkip and \nbs (calculated) length of main baselineskip. -- See novel-CalculateLayout.sty.
+% \thesubtitle or \theSubtitle returns string set by \subtitle{} or \SetSubtitle{} -- See novel-LayoutSettings.sty.
+% \InlineImage, \BlockImage, \ClearImage -- See novel-Images.sty.
+% \scenebreak, \sceneline, \scenestars -- See novel-ChapterScene.sty.
+% ChapterDisplay, \ChapterTitle{}, \ChapterSubtitle{}, \ChapterDeco{}, \ChapterText -- See novel-ChapterScene.sty.
+% \DecoChapterTitle{}{}, \SideDecoChapterTitle{}, ModernChapterTitle[]{}{} -- See novel-ChapterScene.sty.
+% {\chapterfont text} and other pre-defined font selection commands -- See novel-LayoutSettings.sty.
+% \decoglyph{} and \acronym{} -- See novel-FontDefaults.sty.
+% \frontmatter, \mainmatter, \backmatter and variations -- See novel-LayoutSettings.sty.
+% \footnote[]{}, \endnote, \endnotetext[]{} -- See novel-Footnotes.sty.
+% \thispagestyle{choice} and \dropfolio -- See novel-HeadFootStyles.sty.
+% \NewVersoHeadText{}, \NewRectoHeadText{} Also \Set and \Renew forms. -- See novel-HeadFootStyles.sty.
+% \CreateFeature{substitutions}{feature code} fakes an Open Type feature -- See novel-LayoutSettings.sty.
+% \Epigraph[align,scale,width]{text} creates an Epigraph -- See novel-ChapterScene.sty.
+
+
+
+%% The following commands are defined on this page:
+%% -----------------------------------------------------------------------------
+% \memo{text} is a memo to yourself. Does not print, is not saved.
+% \forceindent and \backindent when \indent and \noindent fail.
+% \smcp{text} or \textsc{text} for lowercase to small caps.
+% \allsmcp{text} puts both caps and lowercase into small caps.
+% \charscale[scale,x,y]{text} for brief change of text size/position. No line wrap.
+% parascale environment for long change in text size. Will go off-grid.
+% toc environment for table of contents.
+% \tocitem[]{}{} and \tocitem*[]{}{} for one-line entries in toc.
+% legalese environment uses ragged right, disables hyphenation, and reduces microtype tweaks.
+% poem environment uses ragged right, disables hyphenation, parindent zero, and optional increased right margin.
+% \showlength[round]{length}{units} returns the length, re-calculated in units, rounded.
+% \supersub{raise}{scale}{text} alternative to superscript and subscript commands.
+% \sups{text}, \subs{text}, and \sinf{text} other alternatives to super/subscripts.
+% \bigemdash[raise,thickness] provides a raised rule of flexible length, a "big em dash."
+% \stake inserts zero-width rule, 1pt thick, as placeholder.
+% \color and \textcolor (from package xcolor) have been modified to ensure black, or grayscale when permitted.
+% \squeeze{} and \crush{} for emergency text adjustment.
+
+
+%% The following useful commands are from core code, or other pre-loaded packages.
+%% -----------------------------------------------------------------------------
+%% They are listed here as a reminder of their existence. Not a complete list.
+%% A description is only provided here, when it is brief and simple.
+%
+% {\centering text\par} centers text. Needs the \par to finish. May also use internal \\ or \par. Avoid center environment.
+% \makebox[length][alignment]{text}
+% \hspace{length}
+% \vspace{length} Caution: may disrupt text line grid!
+% \kern
+% \hfill and \dotfill
+% \vfill (use only with discretion)
+% \linebreak (use only with discretion)
+% \null inserts an empty line. See also the scene break commands.
+% \clearpage begins a new page. Two consecutive \clearpage does not make 2 pages (use \null if blank page desired).
+% \strut is useful for occupying the full line height.
+% \smash{text} allows its included text to overlay other content. Sometimes useful when text is too tall to fit the line grid.
+% \textwidth (length) is the width of the textblock.
+% adjustwidth environment (package: changepage) for block indents, etc.
+% \FirstLine{} (package: magaz) may be useful for first line of new chapter. Patched by me.
+% \textsuperscript{} and \textsubscript{} are re-defined.
+
+
+
+%% The following commands are available, but STRONGLY DISCOURAGED.
+%% -----------------------------------------------------------------------------
+%% Beware: Their usage is likely to disturb the line grid.
+%% That is less of an issue on pages where the line grid does not matter.
+%
+% Environments: center, minipage, sloppypar
+% \parbox
+% \framebox or \fbox
+% \raisebox BUT can be used inside \smash or \charscale.
+% \linespread
+% Anything involving math mode. Note that $ is a normal text character.
+
+
+%% The following commands are BANNED.
+%% -----------------------------------------------------------------------------
+% The `novel' class disallows these commands, or neutralizes them by simply
+% repeating their arguments. In some cases, they request functionality that is
+% not implemented in `novel'. In other cases, the functionality is part of core,
+% but would interfere with the `novel' emphasis on constant line skip.
+% You may re-define the commands using your own code in Preamble (discouraged).
+%
+%% Standard LaTeX font sizes are ineffective. Use novel's own methods.
+% If you write one of these size commands, it will silently be ignored:
+% \small, \footnotesize, \scriptsize, \tiny,
+% \large, \Large, \LARGE, \huge, \Huge, \HUGE.
+%
+%% Internal subdivisions are ineffective.
+% The command will merely echo its argument, without any functionality:
+% \part{}, \chapter{}, \section{}, \subsection{}, \subsubsection{}, \paragraph{}, \subparagraph{}
+%
+%% Certain commands will generate an error, so that you know they cannot be used:
+% \maketitle, \makeindex, \tableofcontents, \listoftables, \listoffigures
+%
+%% You cannot use \includepdf (package: pdfpages).
+%
+%% You cannot use \includegraphics. Instead use novel's own image commands.
+%
+%% Commands normally provided in other classes, pertaining to floats, figures, and tables,
+%% are not defined in `novel' class. If you attempt to use them, an error will result.
+
+
+
+%% AND NOW TO THE GOOD STUFF
+%% -----------------------------------------------------------------------------
+%
+%% \memo{} does not print or save its argument.
+% Useful when you wish to put a note to yourself in the *.tex document.
+% Not the same as % comment, because anything after the braces will print.
+\long\gdef\memo#1{}
+%
+\gdef\stake{\rule{0pt}{1pt}} % placeholder
+%
+% \forceindent and \backindent perform or remove indent, using \hspace{}.
+% Rationale: Sometimes \indent and \noindent are neutralized by another command.
+\newlength\forceparlength % holds default value, even when \parindent changed
+\AtBeginDocument{
+ \setlength\forceparlength{\parindent}
+ \global\forceparlength=\forceparlength
+ \gdef\forceindent{\ifvmode\else\unskip\fi\stake\hspace{\forceparlength}}
+ \gdef\backindent{\ifvmode\else\unskip\fi\hspace{-\forceparlength}}
+}
+%%
+% \smcp{} and \textsc{} small caps (Open Type) and \allsmcp{}:
+%
+\ExplSyntaxOn
+%
+\DeclareDocumentCommand \smcp { +m }
+ {%
+ {\AddFontFeature{Letters=SmallCaps}#1}%
+ }
+%
+\DeclareDocumentCommand \allsmcp { +m }
+ {%
+ \fontspec_if_feature:nTF {c2sc}{%
+ {\AddFontFeatures{Letters=UppercaseSmallCaps, Letters=SmallCaps}#1}%
+ }{%
+ {\AddFontFeature{Letters=SmallCaps}\MakeLowercase{#1}}%
+ }%
+ }
+%
+\ExplSyntaxOff
+%
+\let\textsc\smcp\relax % unified
+\let\oldscshape\scshape\relax % in case needed later
+\let\scshape\smcp\relax % unified
+%
+\providecommand\FirstLineFont{\smcp} % package `magaz'
+\renewcommand\FirstLineFont{\smcp}
+%%
+
+%% The `novel' class normally allows only black text on white paper.
+%% In draft mode, option `shademargins` provides light gray margins,
+%% but still black text on white paper.
+%% However, with option `graytext' (in any mode) then grayscale text
+%% is allowed. Images are always allowed grayscale.
+%% Just in case `xcolor' re-defines its internals, to prevent code bomb:
+\ProvideDocumentCommand\@declaredcolor { m } {}
+\ProvideDocumentCommand\@undeclaredcolor { o m } {}
+%%
+\if@graytext % and the usual colors, including black and white.
+ \definecolor[named]{gray1}{gray}{0.15} % ten percent gray, etc.
+ \definecolor[named]{gray2}{gray}{0.25}
+ \definecolor[named]{gray3}{gray}{0.33}
+ \definecolor[named]{gray4}{gray}{0.4}
+ \definecolor[named]{gray5}{gray}{0.5}
+ \definecolor[named]{gray6}{gray}{0.6}
+ \definecolor[named]{gray7}{gray}{0.68}
+ \definecolor[named]{gray8}{gray}{0.75}
+ \definecolor[named]{gray9}{gray}{0.87}
+\else
+ \let\my@color\color\relax
+ \let\color\relax
+ \DeclareDocumentCommand \color { o m }
+ {%
+ \ifthenelse{\equal{#1}{gray} \AND \equal{#2}{0.903215}}{\@undeclaredcolor[gray]{0.903215}}{}% shademargins
+ \ifthenelse{\equal{#2}{hingledingle}}{\@declaredcolor{white}}{}% hingledingle is internal alias for white
+ }
+\fi
+%%
+
+
+% This code is slightly modified from package `etextools' by Florent Chervet.
+% Its license: "This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3 of this
+% license or (at your option) any later version."
+% My rationale for not simply loading the package: Other parts of the package
+% generate warning messages, but the warnings do not apply. Also, I might
+% wish to hack the code at some point.
+\newcount\nov@ettl@fter
+\newrobustcmd\nov@AfterGroup{%
+ \@ifstar{\nov@ettl@AfterGroup\@firstofone}{\nov@ettl@AfterGroup\unexpanded}%
+}
+\newrobustcmd\nov@ettl@AfterGroup[2]{%
+ \csxdef{nov@ettl@fterGroup\number\numexpr\the\nov@ettl@fter+1}%
+ {\global\csundef{nov@ettl@fterGroup\number\numexpr\the\nov@ettl@fter+1}#1{#2}}%
+ \global\advance\nov@ettl@fter\@ne%
+ \expandafter\aftergroup\csname nov@ettl@fterGroup\the\nov@ettl@fter\endcsname%
+}
+% End code from `etextools`.
+
+
+
+
+
+%% \flexbox based on code by Werner at tex.stackexchange.com, CC-by-sa-3.0:
+% Optional first argument is minimum width of box.
+% Second argument is contents of box.
+% Box width will be the greater of #1 or the width of #2.
+\newlength\@mylen
+\newcommand{\flexbox}[2][\parindent]{%
+ \settowidth{\@mylen}{#2}%
+ \ifdim\@mylen < #1%
+ \makebox[#1][l]{#2}%
+ \else%
+ #2%
+ \fi%
+}
+%% \bigemdash inspired by code by RTBarnard at stackoverflow.com, CC-by-sa-3.0:
+% Allows a rule of variable length to fill available space at its right.
+% There must be a "right-hand limit" imposed by something, such as by enclosing
+% the rule in a \makebox of known width, or by an immediate \par.
+% Without this limit, rule will be missing (zero width) or excessively long,
+% or an error will result (referring to \leaders).
+% Takes a single optional argument: Comma-separated raise, line thickness.
+% If no argument or empty, defaults to [1,1].
+% Without comma, argument defaults to [argument,1].
+% First number: Scales the raise up or down. 1 = raise of emdash in typical fonts.
+% Second number: Scales the line thickness. 1 = thickness of emdash in typical fonts.
+% NOTE: Built-in TeX PDF viewer might show the line at slightly incorrect
+% width and height. Best seen in a "real" PDF viewer.
+\DeclareDocumentCommand \bigemdash { O{1,1} }
+ {%
+ \ifthenelse{\equal{#1}{}\OR\equal{#1}{\space}}{\def\@myargsi{1,1}}{\def\@myargsi{#1}}%
+ \StrDel{\@myargsi}{\space}[\@myargs]%
+ \StrCut{\@myargs}{,}{\@myraisei}{\@mythicki}%
+ \ifthenelse{\equal{\@myraisei}{}\OR\equal{\@myraisei}{\space}}{\def\@myraise{1}}{\def\@myraise{\@myraisei}}%
+ \ifthenelse{\equal{\@mythicki}{}\OR\equal{\@mythicki}{\space}}{\def\@mythick{1}}{\def\@mythick{\@mythicki}}%
+ \FPmul{\@myraise}{\@myraise}{0.56}% ex, typical font emdash raise
+ \FPmul{\@mythick}{\@mythick}{0.049}% em, typical font emdash thickness
+ {\leaders\hbox{\rule[\@myraise ex]{1pt}{\@mythick em}}\hfill\stake}%
+ }
+%%
+
+
+%%
+% \charscale[scale,x,y]{text} and starred version
+% This is an "in-line" means of adjusting font size
+% and position, without changing the baselineskip.
+% If the optional argument is unused or empty, then the text is not scaled
+% or moved, but equivalent to \stake\smash{text}.
+% Up to 3 arguments may be used in the single optional argument.
+% They are separated by commas. Spaces ignored.
+% First argument is scale. Number>=0.5. Default 1. Relative to what the size
+% would otherwise be. May multiply with an already-scaled font.
+% Second and third arguments are x-offset and y-offset, respectively.
+% Offsets are lengths, best measured in em or \nfs for x,
+% and em or \nfs or \nbs for y. Default 0pt. Can abbreviate as 0.
+% Posiive offsets are x right, y up.
+% Text is "smashed" and may go anywhere, even overlying other text or image.
+% The unstarred command occupies width equal to the scaled text,
+% thus leaving a "hole" where the text would have been.
+% The starred command occupies zero width, thus no hole. Consecutive starred
+% commands, without intervening space, displace from same origin.
+% The text must be on a single line, without break or wrap.
+% Do not use \\ or \par inside \charscale, but you sometimes need \par after it.
+% If the text is in a font other than usual, place the font command
+% outside \charscale, not inside.
+\ExplSyntaxOn
+\DeclareDocumentCommand \charscale { s O{1} m }
+ {
+ % Allows empty or blank to be used, and still provide default values:
+ \ifthenelse{\equal{#2}{}\OR\equal{#2}{\space}}{\def\@myargs{1}}{\def\@myargs{#2}}
+ \StrDel{\@myargs}{\space}[\@myargsns] % needs {\space} not { }
+ \StrCut{\@myargsns}{,}{\@myscalet}{\@mycoord}
+ \ifthenelse{\equal{\@myscalet}{}}{\def\@myscale{1}}{\def\@myscale{\@myscalet}}
+ \FPmax{\@myscale}{\@myscale}{0.5}% not permitted below this scale
+ \StrCut{\@mycoord}{,}{\@myxt}{\@myyt}
+ \ifthenelse{\equal{\@myxt}{}\OR\equal{\@myxt}{0}}{\def\@myx{0pt}}{\def\@myx{\@myxt}}
+ \ifthenelse{\equal{\@myyt}{}\OR\equal{\@myyt}{0}}{\def\@myy{0pt}}{\def\@myy{\@myyt}}
+ \IfBooleanTF{#1}
+ {% starred
+ \ifvmode\else\unskip\fi%
+ \stake\makebox[0pt][l]{\smash{\hspace{\@myx}\raisebox{\@myy}{\scalebox{\@myscale}{#3}}}}%
+ }{% unstarred
+ \stake\makebox[0pt][l]{\smash{\hspace{\@myx}\raisebox{\@myy}{\scalebox{\@myscale}{#3}}}}%
+ \smash{\phantom{\scalebox{\@myscale}{#3}}}%
+ }
+ }
+\ExplSyntaxOff
+%%
+
+
+
+
+%%
+% If you really must change the font size and baselineskip on a paragraph basis,
+% then use an environment. For example, the text on your Copyright page might
+% be smaller (and less baselineskip) than normal.
+% The following environment takes an optional argument, which is the scale
+% of font size and baselineskip, relative to normal. Note that both size
+% and skip are scaled together. The default is 1, meaning no change.
+% To get the rough equivalent of traditional \footnotesize, use 0.83 scale.
+% Example:
+% \begin{parascale}[0.83]
+% This text is like old footnotesize. It can go on for many lines.\par
+% Be sure to end with the paragraph ending.\par
+% You may need to manipulate whether anything indents.\par
+% \end{parascale}
+% Normally you should NOT use this environment within the main text,
+% as it will upset the baselineskip there. If you have to do that for
+% a special effect, then use \vspace{} before and after the environment,
+% so that the following normalsize text is re-aligned. You'll have to
+% do the calculations yourself.
+\newenvironment{parascale}[1][1]
+{\begingroup%
+\FPmax{\my@tempDetailsNum}{#1}{0.5}% must be at least half normal.
+\FPmul{\my@tempDetailsFontNum}{\my@tempDetailsNum}{\Current@FontSizeNum}%
+\FPround{\my@tempDetailsFontNum}{\my@tempDetailsFontNum}{2}%
+\FPmul{\my@tempDetailsSkipNum}{\my@tempDetailsNum}{\Current@BaselineSkipNum}%
+\FPround{\my@tempDetailsSkipNum}{\my@tempDetailsSkipNum}{2}%
+\fontsize{\my@tempDetailsFontNum pt}{\my@tempDetailsSkipNum pt}\selectfont}%
+{\endgroup}
+%
+%%
+% Environment toc (alternative table of contents):
+% optional argument: additional vspace after each \tocitem entry.
+% required: LR margin increase, to narrow the table (0pt = full textwidth).
+\newlength\@tocnumwid
+\newlength\@tocskip
+\newenvironment{toc}[2][0]%
+{%
+ \begin{adjustwidth}{#2}{#2}\begingroup%
+ \setlength\parindent{0pt}%
+ \setlength\@tocnumwid{\widthof{00.~}}%
+ \global\@tocnumwid=\@tocnumwid%
+ \setlength\@tocskip{#1\nbs}%
+ \global\@tocskip=\@tocskip%
+}{%
+ \endgroup\end{adjustwidth}\par%
+}%
+%% \tocitem[number]{description}{page} provides a one-line table entry in toc.
+% optional number might be chapter number. Can use ~ to offset.
+% unstarred: distance between description and page is not decorated.
+% starred (better): distance between description and page has dotted line.
+\newcommand\tocitem{\@ifstar\@tocitemst\@tocitemns}
+\newcommand\@tocitemst[3][]{%
+ \ifthenelse{\equal{#1}{}}{}{%
+ \ifthenelse{\equal{#1}{~}}{%
+ \makebox[\@tocnumwid][l]{~}%
+ }{%
+ \makebox[\@tocnumwid][l]{#1.}%
+ }%
+ }%
+ #2\,%
+ \dotfill%
+ \,#3\par\vspace{\@tocskip}%
+}%
+%
+\newcommand\@tocitemns[3][]{%
+ \ifthenelse{\equal{#1}{}}{}{%
+ \ifthenelse{\equal{#1}{~}}{%
+ \makebox[\@tocnumwid][l]{~}%
+ }{%
+ \makebox[\@tocnumwid][l]{#1.}%
+ }%
+ }%
+ #2%
+ \hfill%
+ #3\par\vspace{\@tocskip}%
+}%
+%% end toc and \tocitem.
+%%
+%% legalese environment. Certain info, such as Copyright page, customarily is
+% neither justified nor hyphenated. Can be used wherever desired, of course.
+\newenvironment{legalese}
+{\raggedright\hyphenpenalty=10000\exhyphenpenalty=10000}
+{}
+%% poem environment. Optional argument is left margin.
+\newenvironment{poem}[1][0pt]
+{\begin{adjustwidth}{#1}{0pt}%
+\raggedright\hyphenpenalty=10000\exhyphenpenalty=10000}
+{\end{adjustwidth}\par}
+%%
+\gdef\hangleft#1{% places content to left of usual position.
+ \newlength\@temphangl%
+ \setlength\@temphangl{\widthof{#1}}%
+ \stake\hspace{-\@temphangl}#1%
+}
+%%
+% \showlength[decimal places]{length}{units}
+% Returns the length as a string with the units, but does not change the length.
+% length is any existing length
+% units may be pt, bp, mm, cm, in
+% decimal places for rounding (0=integer, 1=one decimal point, etc.)
+% Example: \showlength[3]{17bp}{in} returns 0.236in
+\newlength{\temp@showlength}
+\newcommand\showlength[3][]{%
+ \setlength\temp@showlength{#2}%
+ \def\temp@lengthnum{\strip@pt\temp@showlength}%
+ \ifthenelse{\equal{#3}{bp}}{%
+ \FPmul{\temp@lengthnum}{\temp@lengthnum}{0.99626401}%
+ }{}%
+ \ifthenelse{\equal{#3}{mm}}{%
+ \FPmul{\temp@lengthnum}{\temp@lengthnum}{0.351459804}%
+ }{}%
+ \ifthenelse{\equal{#3}{cm}}{%
+ \FPmul{\temp@lengthnum}{\temp@lengthnum}{0.0351459804}%
+ }{}%
+ \ifthenelse{\equal{#3}{in}}{%
+ \FPmul{\temp@lengthnum}{\temp@lengthnum}{0.013837}%
+ }{}%
+ \ifthenelse{\equal{#1}{}}{}{\FPround{\temp@lengthnum}{\temp@lengthnum}{#1}}%
+ \temp@lengthnum#3%
+}
+%% end \showlength
+
+
+%% \squeeze{} and \crush{} slightly shrink the horizonal dimension of the
+% enclosed text. May span paragraphs. Emergency only! No compounding.
+\long\gdef\squeeze#1{{\AddFontFeature{FakeStretch=0.99}#1}}
+\long\gdef\crush#1{{\AddFontFeature{FakeStretch=0.98}#1}}
+%%
+
+
+%% \lnum for lining numbers.
+\gdef\lnum#1{{\AddFontFeature{Numbers=Lining}#1}}
+%%
+
+
+%% superscripts and subscripts
+\let\subs\relax
+\let\sups\relax
+\let\textsuperscript\relax
+\let\textsubscript\relax
+\newlength\@hoAhl % Measures the height of these characters in the current font.
+% Perhaps superscripts and subscripts (scientific) are in the font, or not.
+% Problem: The best fonts have these characters at size/weight designed
+% to mingle with normal size. But many fonts merely scaled characters,
+% which will be too light at the small size.
+% The unstarred version of these commands use the Open Type features when
+% they are present, then faking (auto scale/raise) if features not present.
+% The starred version just fakes, without regard for features.
+%
+
+% Note that the effect of these commands continues, not just one-shot:
+\gdef\realmarker{\toggletrue{@realmarker}} % anywhere in text
+\gdef\fakemarker{\togglefalse{@realmarker}} % anywhere in text
+%%
+\ExplSyntaxOn
+%
+\DeclareDocumentCommand \sups { m }
+ {%
+ \iftoggle{@realmarker}{%
+ \fontspec_if_feature:nTF {sups}{%
+ \ifvmode\else\unskip\fi{\AddFontFeature{VerticalPosition=Superior}\smash{#1}}%
+ }{%
+ \setlength\@hoAhl{\heightof{Ahl}}%
+ \ifvmode\else\unskip\fi\charscale[0.7,0pt,0.5\@hoAhl]{#1}%
+ }%
+ }{%
+ \setlength\@hoAhl{\heightof{Ahl}}%
+ \ifvmode\else\unskip\fi{\basefont\AddFontFeature{Numbers=Lining}\charscale[0.7,0pt,0.5\@hoAhl]{#1}}%
+ }%
+ }% end \sups
+%
+\DeclareDocumentCommand \subs { m }
+ {%
+ \iftoggle{@realmarker}{%
+ \fontspec_if_feature:nTF {sinf}{%
+ \ifvmode\else\unskip\fi{\AddFontFeature{VerticalPosition=ScientificInferior}\smash{#1}}%
+ }{%
+ \fontspec_if_feature:nTF {subs}{%
+ \ifvmode\else\unskip\fi{\AddFontFeature{VerticalPosition=Inferior}\smash{#1}}%
+ }{%
+ \setlength\@hoAhl{\heightof{Ahl}}%
+ \ifvmode\else\unskip\fi\charscale[0.7,0pt,-0.2\@hoAhl]{#1}%
+ }%
+ }%
+ }{%
+ \setlength\@hoAhl{\heightof{Ahl}}%
+ \ifvmode\else\unskip\fi{\basefont\AddFontFeature{Numbers=Lining}\charscale[0.7,0pt,-0.2\@hoAhl]{#1}}%
+ }%
+ }% end \subs
+%
+\ExplSyntaxOff
+%%
+\let\textsuperscipt\sups\relax
+\let\textsubscript\subs\relax
+%%
+
+
+
+%%
+%% End of file `novel-TextMacros.sty'.
+
+