% \iffalse (this is a meta-comment (so they say)) % $Id: tugboat.dtx 609 2024-10-29 21:17:26Z karl $ % tugboat.dtx - main source for LaTeX TUGboat classes. % % Copyright 1994-2024 TeX Users Group. % % This file is part of the tugboat package. % % 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. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2003/12/01 or later. % % \fi % % \section{Document preambles} % % \begin{macrocode} %\NeedsTeXFormat{LaTeX2e}[1994/12/01] %<*dtx> \ProvidesFile {tugboat.dtx} % %\ProvidesClass {ltugboat} %\ProvidesClass {ltugproc} %\ProvidesPackage{ltugboat} %\ProvidesPackage{ltugproc} % \ProvidesPackage{ltugcomn} [2024-10-29 v2.34 % TUGboat journal class% % TUG conference proceedings class% % TUG compatibility package% % TUGboat `common macros' package% %<*dtx> TUG macros source file% % ] % \end{macrocode} % % \iffalse % % The version control Id above relates to the number of times % the file has been checked-in, which relates to a development process % taking place on several machines, rather than the incidence of % significant change; the definitive version number is that in the % \Provides* things, while the $Id may provide a clue as to the latest % date the documentation was worked on % % Code to compile the thing using \LaTeXe. % % \begin{macrocode} %<*driver> \documentclass{ltxdoc} % \usepackage{ltugcomn} % generated using the .ins file % \usepackage{array,longtable} % \begin{document} \GetFileInfo{tugboat.dtx} \title{The \textsf{tugboat} package\thanks{This file has version number \fileversion, last revised \filedate}} \author{The \TUB{} team} \date{\filedate} \maketitle \tableofcontents \DocInput{tugboat.dtx} \end{document} % % \end{macrocode} % % \fi % % \section{Introduction} % % This file contains all the macros for typesetting \TUB{} with % both plain \TeX\ and \LaTeXe. % \subsection{Summary of control sequences} % % Abbreviations. Just a listing with indications of expansion where % that may not be obvious. For full definitions, see real code below % (Section~\ref{abbr-logo}). % % \begin{longtable}{lp{3in}} % |\AllTeX|& (\La)\TeX\\ % |\AMS|& American Mathematical Society\\ % |\AmSTeX|&\\ % |\aw|& \aw\ (abbreviation for Addison-Wesley)\\ % |\API|&\\ % |\AW|& Addison-Wesley\\ % |\BibTeX|&\\ % |\CandT|& Computers \& Typesetting\\ % |\ConTeXt|& \ConTeXt\\ % |\Cplusplus|& C++\\ % |\DTD|&\\ % |\DVD|&\\ % |\DVI|&\\ % |\DVIPDFMx|& \DVIPDFMx\\ % |\DVItoVDU|& DVItoVDU\\ % |\ECMA|&\\ % |\EPS|&\\ % |\eTeX|& \eTeX\\ % |\ExTeX|& \ExTeX\\ % |\Ghostscript|&\\ % |\Hawaii|& \Hawaii\\ % |\HTML|&\\ % |\ISBN|& ISBN\\ % |\ISO|&\\ % |\ISSN|& ISSN\\ % |\JTeX|&\\ % |\JoT|& The Joy of \TeX\\ % |\LaTeX|&\\ % |\LyX|&\\ % |\macOS|& mac OS\\ % |\MacOSX|& Mac OS X\\ % |\MathML|&\\ % |\Mc|& M with raised c\\ % |\MF|& \MF\\ % |\mf|& \textsc{Metafont}\\ % |\MFB|& The Metafontbook\\ % |\MP|& \MP\\ % |\mp|& MetaPost (in text only: still `\ensuremath{\mp}' in math)\\ % |\OMEGA|& Omega `logo' (\ensuremath{\Omega})\\ % |\OCP|& Omega compiled process\\ % |\OOXML|&\\ % |\OTP|& Omega translation process\\ % |\mtex|& multilingual \TeX\\ % |\NTS|& New Typesetting System\\ % |\pcMF|& pcMF\\ % |\PCTeX|&\\ % |\pcTeX|&\\ % |\Pas|& Pascal\\ % |\PiCTeX|&\\ % |\plain|& plain (in typewriter font)\\ % |\POBox|& P. O. Box\\ % |\PS|& PostScript (with hyphenation)\\ % |\SC|& Steering Committee\\ % |\SGML|& SGML\\ % |\SliTeX|&\\ % |\slMF|& Metafont, slanted: deprecated: use % \cs{textsl} instead \\ % |\stTeX|& \TeX{} for the Atari ST\\ % |\SVG|&\\ % |\TANGLE|&\\ % |\TB|& The \TeX book\\ % |\TeX|& (Although nearly every package defines this, % most, including plain, are missing the % spacefactor adjustment)\\ % |\TeXhax|&\\ % |\TeXMaG|& (defunct)\\ % |\TeXtures|&\\ % |\TeXXeT|&\\ % |\Thanh|&\\ % |\TFM|& \TFM\\ % |\TUB|& \TUB\\ % |\TUG|& \TeX{} Users Group\\ % |\UNIX|&\\ % |\VAX|&\\ % |\VnTeX|&\\ % |\VorTeX|&\\ % |\XeT|&\\ % |\XeTeX|& reflected and lowered first `E'\\ % |\XeLaTeX|& with extra space before `L'\\ % |\XML|&\\ % |\WEB|&\\ % |\WEAVE|&\\ % |\WYSIWYG|&\\ % \end{longtable} % % Macros for things that are slightly more significant. % % \begin{longtable}{lp{.6\textwidth}} % |\NoBlackBoxes|& turns off marginal rules marking overfull boxes\\ % |\BlackBoxes|& turns them back on\\ % |\newline|& horizontal glue plus a break\\ % |\ifundefined#1|& checks argument with |\csname| against |\relax|\\ % |\topsmash|& smashes above baseline (from AMSTeX)\\ % |\botsmash|& smashes below baseline (from AMSTeX)\\ % |\smash|& smashes both (from plain)\\ % |\ulap|& lap upwards\\ % |\dlap|& lap downwards\\ % |\xlap|& reference point at center horizontally; 0 width\\ % |\ylap|& reference point at center vertically; 0 height, depth\\ % |\zlap|& combination |\xlap| and |\ylap|\\ % |\basezero|& to avoid insertion of baselineskip and lineskip glue\\ % |\nullhrule|& empty |\hrule|\\ % |\nullvrule|& empty |\vrule|\\ % |\makestrut[#1;#2]|& ad hoc struts; |#1|=height, |#2|=depth\\ % |\today|& today's date\\ % |\SetTime|& converts |\time| to hours, minutes\\ % |\now|& displays time in hours and minutes\\ % |\Now|& shows current date and time\\ % |\ifPrelimDraft|& flag to indicate status as preliminary draft\\ % |\rtitlex|& \TUB{} volume and number info for running head\\ % |\midrtitle|& information for center of running head\\ % |\rtitlenexttopage|& next to page number in running head\\ % |\HorzR@gisterRule|& pieces of registration marks (`trimmarks')\\ % |\DownShortR@gisterRule|&\\ % |\UpShortR@gisterRule|&\\ % |\ttopregister|& top registration line with `T' in center\\ % |\tbotregister|& bottom registration line with inverted `T' in center\\ % |\topregister|& register actually used\\ % |\botregister|&\\ % |\raggedskip|& parameters used for ragged settings\\ % |\raggedstretch|&\\ % |\raggedparfill|&\\ % |\raggedspaces|&\\ % |\raggedright|&\\ % |\raggedleft|&\\ % |\raggedcenter|&\\ % |\normalspaces|&\\ % |\raggedbottom|&\\ % |\bull|& square bullet\\ % |\cents|& `cents' sign\\ % |\Dag|& superscripted dagger\\ % |\careof|& c/o\\ % |\sfrac|& slashed fraction (arguments optionally\\ % & separated by a slash)\\ % |\cs|& control sequence name\\ % & |\cs{name}|$\rightarrow$\cs{name}\\ % |\meta|& meta-argument name\\ % & |\meta{name}|$\rightarrow$\meta{name}\\ % |\dash|& en-dash surrounded by thinspaces; only breakable AFTER\\ % |\Dash|& em-dash, as above\\ % |\hyph|& permit automatic hyphenation after an actual hyphen\\ % |\slash|& `breakable' slash\\ % |\nth|& for obtaining `1\textsuperscript{st}', % `2\textsuperscript{nd}', 3\textsuperscript{rd}, % etc.\\ % |\tubissue|& gets |\TUB| followed by volume and issue numbers\\ % |\xEdNote|& Editor's Note:\\ % |\Review:|& Review: (for title of book review article)\\ % |\reviewitem|& begin data for item being reviewed\\ % |\revauth|& with one argument, author(s) of item being reviewed\\ % |\revtitle|& with one argument, title of \ldots \\ % |\revpubinfo|& with one argument, other info pertaining to \ldots \\ % |\endreviewitem|& end data for item being reviewed\\ % |\titleref|& one argument, format title as straight text % (slanted, frenchspacing) \\ % |\Input|& |\input| with some other bookkeeping for % case where multiple articles are put together\\ % |\TBremark|& reminder to \TUB{} editorial staff\\ % |\TBEnableRemarks|& enable \cs{TBremark}s (normally suppressed)\\ % |\pagexref|& used to write out page numbers to screen and\\ % |\pagexrefON|& external files\\ % |\pagexrefOFF|&\\ % |\xrefto|& used for symbolic cross-reference to other pages\\ % |\xreftoON|& in \TUB{}\\ % |\xreftoOFF|&\\ % |\TBdriver|& marks code which only takes effect when articles % are run together in a driver file\\ % \iffalse % these two were defined but never used! -- remove them % % from the documentation, at least (further research needed) % |\signatureat|& \\ % |\signaturepercent|&\\ % \fi % |\signaturemark|& items for signatures\\ % |\signaturewidth|&\\ % \end{longtable} % % \StopEventually{} % % \section{\LaTeXe{} \TUB{} class file} % % \subsection{Setup and options} % % Occasionally we need to do different things when running under % traditional (pdf)latex or a native Unicode engine. Since we don't need % any fancier distinctions, instead of reading the |iftex| or another % package, do the test directly. % % \begin{macrocode} %<*common> \newif\ifTBunicodeengine \ifx\Umathchardef\@thisisundefined % not (xetex|luatex) \TBunicodeenginefalse \else \TBunicodeenginetrue \fi % % \end{macrocode} % % Check for reloading. Hmmm\dots Does this happen with \LaTeXe\ % classes? Probably, in fact, as well that it doesn't, since the % \cs{tugstyinit} referenced here doesn't exist; however, it's % possible that we might need a similar mechanism in the future, so we % retain its skeleton, without fleshing out the \cs{tugstyinit} bones. % % \begin{macrocode} %<*ltugboatcls> \csname tugstyloaded@\endcsname \def\tugstyloaded@{\tugstyinit\endinput} % \end{macrocode} % % Acquire a name for this class if we don't already have one (by % virtue of having been loaded by |tugproc.cls|). This name will be % used in error messages and the like. % % \begin{macrocode} \providecommand{\@tugclass}{ltugboat} % \end{macrocode} % % Warnings/error messages/information messages\Dash if we're using % \LaTeXe{} we can use the \cs{Class*} commands: % % \begin{macrocode} \def\TBInfo{\ClassInfo{\@tugclass}} \def\TBError{\ClassError{\@tugclass}} \def\TBWarning{\ClassWarning{\@tugclass}} \def\TBWarningNL{\ClassWarningNoLine{\@tugclass}} % \end{macrocode} % % Class options: |draft| vs.\ |preprint| vs.\ |final|. % % \begin{macrocode} \DeclareOption{draft}{% [draft], the default % If the user loads hyperref, avoid passing on the global draft option % (which would remove all links in the pdf). \PassOptionsToPackage{final}{hyperref} % \AtEndOfClass{% \setcounter{page}{901}% \BlackBoxes \def\MakeRegistrationMarks{}% \PrelimDrafttrue }% } \newif\ifpreprint \def\preprint{\preprinttrue} % [preprint], hardly used \DeclareOption{preprint}{% \preprinttrue } \newif\iftubfinaloption % [final], manually inserted by us for processing \DeclareOption{final}{% \tubfinaloptiontrue \AtEndOfClass{% % Insert draft date into the header even with [final], if we are not % doing a production run. (|tugboat.dates| sets up page numbers % above 900 in such pseudo-draft mode.) We use [final] in the first % place for this case because draft vs. final can change page % layout, wrt registration marks, etc. (Not good, but too painful to % change at this late date.) \ifnum\value{page}>900 \PrelimDrafttrue \else \PrelimDraftfalse \fi \@tubrunningfull }% } % \end{macrocode} % % We want to use \texttt{hyperref}'s \cs{texorpdfstring}, e.g., in the % \texttt{draft} option above. If \texttt{hyperref} is not loaded, % define our own trivial fallback to expand to the \TeX\ (first) argument. % % Similarly, disable \acro and more if we have \texttt{hyperref}, % so section titles using them don't cause useless warnings. % % \begin{macrocode} \AtBeginDocument{% \ifx\undefined\texorpdfstring \DeclareRobustCommand{\texorpdfstring}[2]{#1}% \fi % \ifx\undefined\pdfstringdefDisableCommands\else \pdfstringdefDisableCommands{% \let\acro\relax \let\origDash=\Dash \def\Dash{\texorpdfstring{\origDash}{--}}% % lots more could/should be added. }% \fi } % \end{macrocode} % % \TUB\ uses only 10pt for the main text. % % \begin{macrocode} \DeclareOption{11pt}{% \TBWarning{The \@tugclass\space class only supports 10pt fonts: \MessageBreak option \CurrentOption\space ignored}% } \DeclareOption{12pt}{\csname ds@11pt\endcsname} % \end{macrocode} % % Similarly, ignore one/two-side options. % % \begin{macrocode} \DeclareOption{oneside}{\TBWarning{Option \CurrentOption\space ignored}} \DeclareOption{twoside}{\ds@oneside} % \end{macrocode} % % There are these people who seem to think |tugproc| is an option rather % than a class\dots{} (Note that it's already been filtered out if we % were calling from |ltugproc|.) % % \begin{macrocode} \DeclareOption{tugproc}{% \TBWarning{Option \CurrentOption\space ignored: use class ltugproc instead of \@tugclass}% } % \end{macrocode} % % Option |rawcite| (the default) specifies the default citation % mechanism (as built-in to \LaTeX); option |harvardcite| specifies % the author-date citation mechanism defined in % section~\ref{sec:citations} below. % % \begin{macrocode} \DeclareOption{rawcite}{\let\if@Harvardcite\iffalse} \DeclareOption{harvardcite}{\let\if@Harvardcite\iftrue} % \end{macrocode} % % Option |extralabel| (the default) specifies that the publication % years of two successive references with otherwise identical labels % will be tagged with distinguishing letters; option |noextralabel| % causes those letters to be suppressed. Note that (a) no two % references will in any case have the same labels in the default % (plain) |rawcite| setup, and that (b) the distinguishing letters % appear in the labels themselves; the reader can work out the % correspondence one with the other\dots % % \begin{macrocode} \DeclareOption{extralabel}{\let\UseExtraLabel\@firstofone} \DeclareOption{noextralabel}{\let\UseExtraLabel\@gobble} % \end{macrocode} % % The section-numbering style, so that we can allow the same heading % layout as in the plain macros. % % \begin{macrocode} \DeclareOption{numbersec}{\let\if@numbersec\iftrue} \DeclareOption{nonumber}{\let\if@numbersec\iffalse} % \end{macrocode} % % Minimal running headers/footers contain just the TUGboat volume/issue % identification and page numbers. `runningfull' is the default, and % includes title and author. `runningoff' makes both headers and % footers empty. % % \begin{macrocode} \DeclareOption{runningoff}{\AtEndOfClass{\@tubrunningoff}} \DeclareOption{runningminimal}{\AtEndOfClass{\@tubrunningminimal}} \DeclareOption{runningfull}{\AtEndOfClass{\@tubrunningfull}} % \end{macrocode} % % Usually we want to print the doi if [final], else not. % But sometimes we want to omit it even if [final], namely when we're % posting a review or other item early. % % \begin{macrocode} \newif\iftubomitdoioption \DeclareOption{omitdoi}{% \tubomitdoioptiontrue } % \end{macrocode} % % \begin{macro}{\if@tubtwocolumn} % Occasionally (|tb107jackowski|, and past conference preprints), we % need the option |onecolumn|. For alternative approaches to one-column % articles, see |tb92hagen-euler| and |tb78milo|. % % \begin{macrocode} \newif\if@tubtwocolumn \@tubtwocolumntrue \DeclareOption{onecolumn}{\@tubtwocolumnfalse} % \end{macrocode} % \end{macro} % % \begin{macro}{\ifsecondcolstart} % Occasionally, we need to start an article in the second column of a % page, due to splicing with a previous article. Let's try declaring that. % Then, before |\maketitle|, we'll force the move to the second column. % % And sometimes we need to add space at the top of that second column % (e.g., |tb136lettre|); there's no way to intervene in the article % source, so define a hook |\tubsecondcolstartextra|. % % \begin{macrocode} \newif\iftubsecondcolstart \DeclareOption{secondcolstart}{\tubsecondcolstarttrue} \let\tubsecondcolstartextra\relax % \end{macrocode} % \end{macro} % % Any other options, we pass on to |article.cls| before we load it: % % \begin{macrocode} \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} % \end{macrocode} % % Request default options (draft mode, standard citation, numbered % sections, etc.), process all options, and then get the base document % class on top of which we reside, namely |article|. Always call % |article| with the |twoside| option, since we want the ability to have % odd/even headers/footers. % % \begin{macrocode} \ExecuteOptions{draft,extralabel,numbersec,rawcite,runningminimal} \ProcessOptions \LoadClass[twoside]{article} % \end{macrocode} % % Various fonts used throughout. Some effort has been made to % suppress these things with explicit sizes in the macro name % (\cs{tensl} is an example below), but keeping in step with the % documentation is one thing that restricts such a move. % % \begin{macrocode} \def\sectitlefont{\fontfamily\sfdefault\fontseries{bx}\fontshape{n}% \fontsize\@xviipt\stbaselineskip\selectfont} \def\tensl{\fontseries{m}\fontshape{sl}\fontsize\@xpt\@xiipt \selectfont} % \end{macrocode} % % This font selection command is used \emph{only} for the `Editor's % Note' introduction to notes; sadly it makes explicit reference to % \textsc{cmr}, and Barbara Beeton has agreed that the reference may be % constructed to use the current family such that, if no upright % italic is defined, ordinary italics are used. A project for % later\dots % % \begin{macrocode} \ifTBunicodeengine % there is no "LM unslanted" in OpenType, so use the standard cmu % scaled for the current text size. Not worth more effort. \def\EdNoteFont{\font\ednotefont = cmu10 at 1em } \else % traditional engine: \def\EdNoteFont{\fontfamily{cmr}\fontseries{m}\fontshape{ui}\selectfont} \fi % % \end{macrocode} % % If Ulrik Vieth's |mflogo.sty| is around, we'll use it. Otherwise % (pro tem, at least) we'll warn the user and define the absolute % minimum of machinery that \TUB{} requires (that which was used % prior to the invention of \LaTeXe). % \begin{macrocode} %<*common> \IfFileExists{mflogo.sty}% {\RequirePackage{mflogo}}% % {\TBWarning % {\PackageWarning{ltugcomn} {Package mflogo.sty not available --\MessageBreak Proceeding to emulate mflogo.sty} \DeclareRobustCommand{\logofamily}{% \not@math@alphabet\logofamily\relax \fontencoding{U}\fontfamily{logo}\selectfont} \DeclareTextFontCommand{\textlogo}{\logofamily} \def\MF{\textlogo{META}\-\textlogo{FONT}\@} \def\MP{\textlogo{META}\-\textlogo{POST}\@} \DeclareFontFamily{U}{logo}{} \DeclareFontShape{U}{logo}{m}{n}{% <8><9>gen*logo% <10><10.95><12><14.4><17.28><20.74><24.88>logo10% }{} \DeclareFontShape{U}{logo}{m}{sl}{% <8><9>gen*logosl% <10><10.95><12><14.4><17.28><20.74><24.88>logosl10% }{} \DeclareFontShape{U}{logo}{m}{it}{% <->ssub*logo/m/sl% }{}% } % \end{macrocode} % % \subsection{Resetting at start of paper} % % \begin{macro}{\ResetCommands} % \begin{macro}{\AddToResetCommands} % \begin{macro}{\StartNewPaper} % We store a set of commands that should be executed at the start of % each paper, before any paper-specific customisation. These commands % (stored in the token register \cs{ResetCommands}) include things % such as resetting section and footnote numbers, re-establishing % default settings of typesetting parameters, and so on. The user (or % more typically, editor) may execute the commands by using the % command \cs{StartNewPaper}. Things I've not yet thought of may be % added to the list of commands, by % \begin{macrocode} \newtoks\ResetCommands \ResetCommands{% \setcounter{part}{0}% \setcounter{section}{0}% \setcounter{footnote}{0}% \authornumber\z@ } \newcommand{\AddToResetCommands}[1]{% \AddToResetCommands\expandafter{\AddToResetCommands#1}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Helpful shorthands (common code with Plain styles)} % % \cs{makeescape}, \dots, \cs{makecomment} allow users to change the % category code of a single character a little more easily. These % require that the character be addressed as a control sequence: % e.g., |\makeescape\/| will make `|/|' an escape character. % % \begin{macrocode} %<*!latex> \def\makeescape#1{\catcode`#1=0 } \def\makebgroup#1{\catcode`#1=1 } \def\makeegroup#1{\catcode`#1=2 } \def\makemath #1{\catcode`#1=3 } % %<*latex> \def\makeescape#1{\catcode`#1=\z@} \def\makebgroup#1{\catcode`#1=\@ne} \def\makeegroup#1{\catcode`#1=\tw@} \def\makemath #1{\catcode`#1=\thr@@} % \def\makealign #1{\catcode`#1=4 } \def\makeeol #1{\catcode`#1=5 } \def\makeparm #1{\catcode`#1=6 } \def\makesup #1{\catcode`#1=7 } \def\makesub #1{\catcode`#1=8 } \def\makeignore#1{\catcode`#1=9 } \def\makespace #1{\catcode`#1=10 } \def\makeletter#1{\catcode`#1=11 } \chardef\other=12 \let\makeother\@makeother \def\makeactive#1{\catcode`#1=13 } \def\makecomment#1{\catcode`#1=14 } % \end{macrocode} % |\savecat#1| and |\restorecat#1| will save and restore the category % of a given character. These are useful in cases where one doesn't % wish to localize the settings and therefore be required to globally % define or set things. % \begin{macrocode} \def\savecat#1{% \expandafter\xdef\csname\string#1savedcat\endcsname{\the\catcode`#1}} \def\restorecat#1{\catcode`#1=\csname\string#1savedcat\endcsname} %\savecat\@ %\makeletter\@ % \end{macrocode} % % |\SaveCS#1| and |\RestoreCS#1| save and restore `meanings' of control % sequences. Again this is useful in cases where one doesn't want to % localize or where global definitions clobber a control sequence which % is needed later with its `old' definition. % % \begin{macrocode} \def\SaveCS#1{\expandafter\let\csname saved@@#1\expandafter\endcsname \csname#1\endcsname} \def\RestoreCS#1{\expandafter\let\csname#1\expandafter\endcsname \csname saved@@#1\endcsname} % \end{macrocode} % To distinguish between macro files loaded % \begin{macrocode} \def\plaintubstyle{plain} \def\latextubstyle{latex} % \end{macrocode} % % Control sequences that were first defined in \LaTeXe{} of % 1995/06/01 (or later), but which we merrily use. Only define if % necessary: % % \begin{macrocode} \providecommand\hb@xt@{\hbox to} \providecommand\textsuperscript[1]{\ensuremath{\m@th ^{\mbox{\fontsize\sf@size\z@ \selectfont #1}}}} % \end{macrocode} % (Note that that definition of \cs{textsuperscript} isn't robust, but % probably doesn't need to be\dots What's more, it doesn't appear in % the mythical 2.09 version of the package.) % % We end up wanting this fairly often, and \LaTeX\ removed \cs{line}. % \begin{macrocode} \def\tubline{\hbox to \hsize} % \end{macrocode} % % \subsection{Abbreviations and logos} % \label{abbr-logo} % % Font used for the METAFONT logo, etc. % \begin{macrocode} \DeclareRobustCommand{\AllTeX}{% \texorpdfstring{(\La\kern-.075em)\kern-.05em\TeX}{(La)TeX}} \def\AMS{American Mathematical Society} \def\AmS{$\mathcal{A}$\kern-.1667em\lower.5ex\hbox {$\mathcal{M}$}\kern-.125em$\mathcal{S}$} \def\AmSLaTeX{\AmS-\LaTeX} \def\AmSTeX{\AmS-\TeX} \def\ANSI{\acro{ANSI}} \def\API{\acro{API}} \def\ASCII{\acro{ASCII}} \def\aw{\acro{A\kern.04em\raise.115ex\hbox{-}W}} \def\AW{Addison\kern.1em-\penalty\z@\hskip\z@skip Wesley} % % make \BibTeX work in slanted contexts too; it's common in titles, and % especially burdensome to hack in .bib files. \def\Bib{% \ifdim \fontdimen1\font>0pt B{\SMC\SMC IB}% \else B\textsc{ib}% \fi } \def\BibLaTeX{\Bib\kern.02em \LaTeX} \def\BibTeX{\Bib\kern-.08em \TeX} % no good way to determine bold font, and we want to lose the kern, too: % (we \let BibTeX to this in maketitle) \def\bfBibTeX{B{\SMC\SMC IB}\TeX} % \def\BSD{\acro{BSD}} \def\CandT{\textsl{Computers \& Typesetting}} % must not define \CJK, because the CJK package does. % \end{macrocode} % We place our \cs{kern} after \cs{-} so that it disappears if the % hyphenation is taken: % \begin{macrocode} \def\ConTeXt{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} \def\CMkIV{\ConTeXt\ \MkIV} \def\Cplusplus{C\plusplus} \def\plusplus{\raisebox{.7ex}{$_{++}$}} % consider rm vs. bold + tb139may-automata.ltx \def\CPU{\acro{CPU}} \def\CSczabbr{\ensuremath{\cal C}\kern-.1667em\lower.5ex\hbox{$\cal S$}} \def\CSS{\acro{CSS}} \def\CSTUG{\CSczabbr\kern.05em\acro{TUG}} \def\CSV{\acro{CSV}} \def\CTAN{\acro{CTAN}} \def\DTD{\acro{DTD}} \def\DTK{\acro{DTK}} \def\DVD{\acro{DVD}} \def\DVI{\acro{DVI}} \def\DVIPDFMx{\acro{DVIPDFM}$x$} \def\DVItoVDU{DVIto\kern-.12em VDU} \def\ECMA{\acro{ECMA}} \def\EPS{\acro{EPS}} % no line break at this hyphen please, and try to get a bold \varepsilon. \def\TUBdefaulteTeX{\ensuremath{\varepsilon}\mbox{-}\kern-.125em\TeX}% \DeclareRobustCommand{\eTeX}{% \ifx\f@series\bfseries@rm \ifx\boldsymbol\undefined % \boldsymbol is from amsmath; also support bm? \TUBdefaulteTeX \else \ensuremath{\boldsymbol{\varepsilon}}\mbox{-}\kern-.125em\TeX \fi \else \TUBdefaulteTeX \fi } \DeclareRobustCommand{\ExTeX}{% \ensuremath{\textstyle\varepsilon_{\kern-0.15em\cal{X}}}\kern-.2em\TeX} \def\FAQ{\acro{FAQ}} \def\FTP{\acro{FTP}} \def\Ghostscript{Ghost\-script} \def\GNU{\acro{GNU}} \def\GUI{\acro{GUI}} \DeclareRobustCommand{\HarfBuzz}{Harf\discretionary{-}{}{\kern.077em}Buzz} \def\Hawaii{Hawai`i} \def\HTML{\acro{HTML}} \def\HTTP{\acro{HTTP}} \def\HTTPS{\acro{HTTPS}} \def\iOS{i\acro{OS}} \def\IDE{\acro{IDE}} \def\IEEE{\acro{IEEE}} \def\ISBN{\acro{ISBN}} \def\ISO{\acro{ISO}} \def\ISSN{\acro{ISSN}} \def\JPEG{\acro{JPEG}} \def\JTeX{\leavevmode\hbox{\lower.5ex\hbox{J}\kern-.18em\TeX}} \def\JoT{\textsl{The Joy of \TeX}} \DeclareRobustCommand{\KOMAScript}{\textsf{K\kern.05em O\kern.05em% M\kern.05em A\kern.1em\hyph\kern.1em Script}} \def\LAMSTeX{L\raise.42ex\hbox{\kern-.3em $\m@th$\fontsize\sf@size\z@\selectfont $\m@th\mathcal{A}$}% \kern-.2em\lower.376ex\hbox{$\m@th\mathcal{M}$}\kern-.125em {$\m@th\mathcal{S}$}-\TeX} % This code % is hacked from its definition of \cs{LaTeX}; it allows slants (for % example) to propagate into the raised (small) `A': % \begin{macrocode} \DeclareRobustCommand{\La}% {L\kern-.36em {\setbox0\hbox{T}% \vbox to\ht0{\hbox{$\m@th$% \csname S@\f@size\endcsname \fontsize\sf@size\z@ \math@fontsfalse\selectfont A}% \vss}% }} % \end{macrocode} % % We started with the intention that we wouldn't redefine \cs{LaTeX} % when we're running under it, so as not to trample on an existing % definition. However, this proves less than satisfactory; a single % logo may be OK for the run of documents, but for \TUB{}, we find % that something noticeably better is necessary; see section % \ref{sec:latex-logo}. % % \begin{macrocode} %\def\LaTeX{\La\kern-.15em\TeX} \def\LMTX{\acro{LMTX}} \def\LuaHBTeX{Lua\acro{HB}\-\TeX}% \def\LuaHBLaTeX{Lua\acro{HB}\-\LaTeX}% \def\LuaLaTeX{Lua\-\LaTeX}% dtk-logos defines it and people like to use it \def\LuaTeX{Lua\-\TeX}% ditto \def\luatex{\LuaTeX}% ditto \def\LyX{L\kern-.1667em\lower.25em\hbox{Y}\kern-.125emX} \def\macOS{mac\acro{OS}} \def\MacOSX{Mac\,\acro{OS\,X}} \def\MathML{Math\acro{ML}} \def\Mc{\setbox\TestBox=\hbox{M}M\vbox to\ht\TestBox{\hbox{c}\vfil}} % for Robert McGaffey % \end{macrocode} % % If we're running under \LaTeXe, we use Ulrik Vieth's |mflogo.sty| if % it's present. Otherwise, we're using a short extract of Vieth's % stuff. Either way, we don't need to specify \cs{MF} or \cs{MP}. % % \begin{macrocode} \def\mf{\textsc{Metafont}} \def\MFB{\textsl{The \MF\kern.1em\-book}} \def\MkIV{Mk\acro{IV}} \let\TB@@mp\mp \DeclareRobustCommand{\mp}{\ifmmode\TB@@mp\else MetaPost\fi} \def\mtex{T\kern-.1667em\lower.424ex\hbox{\^E}\kern-.125emX\@} % % In order that the \cs{OMEGA} command will switch to using the TS1 % variant of the capital Omega character if \texttt{textcomp.sty} is % loaded, we define it in terms of the \cs{textohm} command. Note % that this requires us to interpose a level of indirection, rather % than to use \cs{let}\dots % Revised definition of \cs{NTS} based on that used by Phil Taylor. % % \begin{macrocode} \DeclareRobustCommand{\NTG}{\acro{NTG}} \DeclareRobustCommand{\NTS}{\ensuremath{\mathcal{N}\mkern-4mu \raisebox{-0.5ex}{$\mathcal{T}$}\mkern-2mu \mathcal{S}}} \DeclareTextSymbol{\textohm}{OT1}{'012} \DeclareTextSymbolDefault{\textohm}{OT1} \newcommand{\OMEGA}{\textohm} \DeclareRobustCommand{\OCP}{\OMEGA\acro{CP}} \DeclareRobustCommand{\OOXML}{\acro{OOXML}} \DeclareRobustCommand{\OTF}{\acro{OTF}} \DeclareRobustCommand{\OTP}{\OMEGA\acro{TP}} \DeclareRobustCommand{\OpTeX}{Op\kern-.05em\TeX} % \end{macrocode} % \begin{macrocode} \def\Pas{Pascal} \def\pcMF{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}MF\@} \def\PCTeX{PC\thinspace\TeX} \def\pcTeX{\leavevmode\raise.5ex\hbox{p\kern-.3\p@ c}\TeX} \def\pdfLaTeX{pdf\/\-\LaTeX}% dtk-logos \def\pdflatex{\pdfLatex} \def\pdfTeX{pdf\/\-\TeX}% dtk-logos \def\pdftex{\pdfTeX} \def\PDF{\acro{PDF}} \def\PGF{\acro{PGF}} \def\PHP{\acro{PHP}} \def\PiC{P\kern-.12em\lower.5ex\hbox{I}\kern-.075emC\@} \def\PiCTeX{\PiC\kern-.11em\TeX} \def\plain{\texttt{plain}} \def\PNG{\acro{PNG}} \def\POBox{P.\thinspace O.~Box } \def\PS{{Post\-Script}} \def\PSTricks{\acro{PST}ricks} \def\RIT{\acro{RIT}} \def\RTF{\acro{RTF}} \def\SC{Steering Committee} \def\SGML{\acro{SGML}} \def\SliTeX{\textrm{S\kern-.06em\textsc{l\kern-.035emi}% \kern-.06em\TeX}} \def\slMF{\textsl{\MF}} % should never be used \def\SQL{\acro{SQL}} \def\stTeX{\textsc{st}\kern-0.13em\TeX} \def\STIX{\acro{STIX}} \def\SVG{\acro{SVG}} \def\TANGLE{\texttt{TANGLE}\@} \def\TB{\textsl{The \TeX\-book}} \def\TIFF{\acro{TIFF}} \def\TP{\textsl{\TeX:\ The Program\/}} \DeclareRobustCommand{\TeX}{T\kern-.1667em\lower.424ex\hbox{E}\kern-.125emX\@} \def\TeXhax{\TeX hax} \def\TeXMaG{\TeX M\kern-.1667em\lower.5ex\hbox{A}% \kern-.2267emG\@} \def\TeXtures{\textit{Textures}} \let\Textures=\TeXtures \def\TeXworks{\TeX\kern-.07em works} \def\TeXXeT{\TeX-{}-\XeT} \def\TFM{\acro{TFM}} \ifTBunicodeengine \AtBeginDocument{% in case a different font is loaded % \iffontchar is from e-TeX; safe to use under Unicode engines. \iffontchar\font"1EBF \def\TBecircacute{\char"1EBF }% \else \def\TBecircacute{\^e\llap{\raise 0.5ex\hbox{\'{}}}}% \fi \def\Thanh{H\`an~Th\TBecircacute~Th\`anh}% }% \else % non-Unicode engine, use our traditional definition. \def\Thanh{H\`an~Th\^e\llap{\raise 0.5ex\hbox{\'{}}}~Th\`anh} % We could also go the other direction, and always use the Unicode % character, after: % \ifdefined\DeclareUnicodeCharacter % \DeclareUnicodeCharacter{1EBF}{\^e\llap{\raise 0.5ex\hbox{\'{}}}} % \fi % but let's make the smaller change. \fi \def\TikZ{Ti\/{\em k}Z} \def\ttn{\textsl{TTN}\@} \def\TTN{\textsl{\TeX{} and TUG News}} \def\TUB{\texttub{TUGboat}}\def\texttub{\textsl} % redefined in some situations \def\TUG{\TeX\ \UG} \def\tug{\acro{TUG}} \def\UG{Users Group} \def\UNIX{\acro{UNIX}} % Don't define \UTF, since other packages use it for Unicode character access. % On the other hand, we want a macro for UTF-8 that doesn't break at the -. \def\tbUTF{\acro{UTF}\futurelet\@nextchar\@tbUTFcheck} \def\@tbUTFcheck{\ifx\@nextchar-% \mbox{-}\let\next=\tbgobbledash \else \let\next=\empty \fi\next} \def\tbgobbledash-{} \def\VAX{V\kern-.12em A\kern-.1em X\@} \def\VnTeX{V\kern-.03em n\kern-.02em \TeX} \def\VorTeX{V\kern-2.7\p@\lower.5ex\hbox{O\kern-1.4\p@ R}\kern-2.6\p@\TeX} \def\XeT{X\kern-.125em\lower.424ex\hbox{E}\kern-.1667emT\@} \def\XML{\acro{XML}} \def\XMP{\acro{XMP}} \def\WEB{\texorpdfstring{\texttt{WEB}\@}{WEB}} \def\WEAVE{\texttt{WEAVE}\@} \def\WYSIWYG{\acro{WYSIWYG}} \def\YAML{\acro{YAML}} % \end{macrocode} % % Xe\TeX{} requires reflecting the first E, hence we complain if the % graphics package is not present. (For plain documents, this can be % loaded via \texttt{miniltx} or Eplain.) Also, at Barbara's % suggestion, if the current font is slanted, we rotate by 180 instead % of reflecting so there is a better chance to look ok. (The magic % values here seem more or less ok for \texttt{cmsl} and \texttt{cmti}.) % % \begin{macrocode} \def\tubreflect#1{% \@ifundefined{reflectbox}{% \TBError{A graphics package must be loaded to use \string\XeTeX} {Load graphicx or graphics.}% }{% \ifdim \fontdimen1\font>0pt \raise 1.75ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em \else \reflectbox{#1}% \fi }% } \def\tubhideheight#1{\setbox0=\hbox{#1}\ht0=0pt \dp0=0pt \box0 } \def\XekernbeforeE{-.125em} \def\XekernafterE{-.1667em} % From Max, mail of 13sep24: % hyperref is trying to expand \Xe to get a string for % the embedded PDF table of contents, but \Xe is unsafe in an % expansion-only context [even when defined with \DeclareRobustCommand, % for reasons unknown]. % An easy way to fix this is to replace \DeclareRobustCommand with % \NewDocumentCommand, which defines the macro as ``\protected'' instead % as ``\protect''ed. \NewDocumentCommand\tub@Xe{}{\leavevmode \tubhideheight{\hbox{X% \setbox0=\hbox{\TeX}\setbox1=\hbox{E}% \ifdim \fontdimen1\font>0pt % XeTeX logo needs tinkering when slanted/italic font, % so make kerns changeable \def\XekernbeforeE{-.11em}% \def\XekernafterE{-.16em}% \dp1=-.17ex \fi \lower\dp0\hbox{\raise\dp1\hbox{\kern\XekernbeforeE\tubreflect{E}}}% \kern\XekernafterE}}} % [But then,] For hyperref to be able to see the \texorpdfstring, it % needs to be inside of a non-protected macro, but we still want the % graphics commands to be protected, so we need to make a wrapper command: \newcommand\Xe{\texorpdfstring{\tub@Xe}{Xe}} \def\XeTeX{\texorpdfstring{\Xe\TeX}{XeTeX}} \def\XeLaTeX{\texorpdfstring{\Xe{\kern.11em \LaTeX}}{XeLaTeX}} % \def\XHTML{\acro{XHTML}} \def\XSL{\acro{XSL}} \def\XSLFO{\acro{XSL}\raise.08ex\hbox{-}\acro{FO}} \def\XSLT{\acro{XSLT}} % \end{macrocode} % % \subsection{General typesetting rules} % % \begin{macrocode} \newlinechar=`\^^J \normallineskiplimit=\p@ \clubpenalty=10000 \widowpenalty=10000 \def\NoParIndent{\parindent=\z@} \newdimen\normalparindent \normalparindent=20\p@ \def\NormalParIndent{\global\parindent=\normalparindent} \NormalParIndent \def\BlackBoxes{\overfullrule=5\p@} \def\NoBlackBoxes{\overfullrule=\z@} \def\newline{\hskip\z@\@plus\pagewd\break} % \end{macrocode} % % \begin{macro}{\tubsentencespace} % Occasionally, notably after citations that need to come after a % sentence-ending period, we want to tell \TeX\ that it's still at the % end of a sentence. As in: % |... whatever. \cite{foo}\tubsentencespace| % This happens when, e.g., the reference applies to more than the final % sentence. Also can be needed when \cs{@} cannot be used because the % sentence-ending punctuation itself occurs inside a control sequence % that prevents it. % % \begin{macrocode} \def\tubsentencespace{\spacefactor=3000{}\space\ignorespaces} % \end{macrocode} % \end{macro} % % \begin{macro}{\tubdots} % Latin Modern and many other fonts irritatingly make the Unicode % ellipsis character (U+2026) a single character's width, typically more % squashed together than three period characters. This just looks wrong. % It is too painful to try to redefine in general, but provide the % normal definition to reset in individual papers with, e.g.: % |\ifx\tubdots\undefined \else \let\dots\tubdots \let\ldots\tubdots \fi| % % \begin{macrocode} \DeclareRobustCommand{\tubdots}{\ifmmode\mathellipsis\else .\kern\fontdimen3\font .\kern\fontdimen3\font .\kern\fontdimen3\font\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\allowhyphens} % Hyphen control: first, we save (via \cs{edef}) the hyphenpenalties in % \cs{allowhyphens}. This allows us to permit hyphens temporarily in % things like \cs{netaddress}es, which typically occur when % \cs{raggedright} is set, but which need to be allowed to break at % their artificial discretionaries. % % \begin{macrocode} \edef\allowhyphens{\noexpand\hyphenpenalty\the\hyphenpenalty\relax \noexpand\exhyphenpenalty\the\exhyphenpenalty\relax} \def\nohyphens{\hyphenpenalty\@M\exhyphenpenalty\@M} % \end{macrocode} % \end{macro} % % \subsection{Utility registers and definitions} % % We define a few scratch registers (and the like) for transient use; % they're all paired: an internal one (\cs{T@st*}) and an external one % (\cs{Test*}). % % \begin{description} % \item[\emph{Comment:}] Exercise for an idle day: find whether all % these are necessary, or whether we can use the \LaTeX{} temporaries % for some (or all) of the \cs{T@st*} ones. % \item[\emph{Comment:}] (bb) All these registers are used in the % plain version, |tugboat.sty|. % \end{description} % % \begin{macrocode} \newbox\T@stBox \newbox\TestBox \newcount\T@stCount \newcount\TestCount \newdimen\T@stDimen \newdimen\TestDimen \newif\ifT@stIf \newif\ifTestIf % \end{macrocode} % % Control sequence existence test, stolen from \TeX book exercise 7.7 % (note that this provides functionality that in some sense duplicates % something within \LaTeX). % % \begin{macrocode} \def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax } % \end{macrocode} % % \LaTeX\ conventions which are also useful here. % % \begin{macrocode} %<*!latex> \let\@@input\input \def\iinput#1{\@@input#1 } \def\@inputcheck{\if\@nextchar\bgroup \expandafter\iinput\else\expandafter\@@input\fi} \def\input{\futurelet\@nextchar\@inputcheck} % % \end{macrocode} % % Smashes repeated from AMS-\TeX; plain \TeX{} implements only full % |\smash|. % % \begin{macrocode} \newif\iftop@ \newif\ifbot@ \def\topsmash{\top@true\bot@false\smash@} \def\botsmash{\top@false\bot@true\smash@} \def\smash{\top@true\bot@true\smash@} \def\smash@{\relax\ifmmode\def\next{\mathpalette\mathsm@sh}% \else\let\next\makesm@sh\fi \next } \def\finsm@sh{\iftop@\ht\z@\z@\fi\ifbot@\dp\z@\z@\fi\box\z@} % \end{macrocode} % % Vertical `laps'; cf.\ |\llap| and |\rlap| % % \begin{macrocode} \long\def\ulap#1{\vbox to \z@{\vss#1}} \long\def\dlap#1{\vbox to \z@{#1\vss}} % \end{macrocode} % And centered horizontal and vertical `laps' % \begin{macrocode} \def\xlap#1{\hb@xt@\z@{\hss#1\hss}} \long\def\ylap#1{\vbox to \z@{\vss#1\vss}} \long\def\zlap#1{\ylap{\xlap{#1}}} % \end{macrocode} % Avoid unwanted vertical glue when making up pages. % \begin{macrocode} \def\basezero{\baselineskip\z@skip \lineskip\z@skip} % \end{macrocode} % Empty rules for special occasions % \begin{macrocode} \def\nullhrule{\hrule \@height\z@ \@depth\z@ \@width\z@ } \def\nullvrule{\vrule \@height\z@ \@depth\z@ \@width\z@ } % \end{macrocode} % Support ad-hoc strut construction. % \begin{macrocode} \def\makestrut[#1;#2]{\vrule \@height#1 \@depth#2 \@width\z@ } % \end{macrocode} % Construct box for figure pasteup, etc.; % height = \#1, width = \#2, rule thickness = \#3 % \begin{macrocode} \def\drawoutlinebox[#1;#2;#3]{\T@stDimen=#3 \vbox to#1{\hrule \@height\T@stDimen \@depth\z@ \vss\hb@xt@#2{\vrule \@width\T@stDimen \hfil\makestrut[#1;\z@]% \vrule \@width\T@stDimen}\vss \hrule \@height\T@stDimen \@depth\z@}} % \end{macrocode} % Today's date, to be printed on drafts. Based on \TeX book, p.406. % \begin{macrocode} %<*!latex> \def\today{\number\day\space \ifcase\month\or Jan \or Feb \or Mar \or Apr \or May \or Jun \or Jul \or Aug \or Sep \or Oct \or Nov \or Dec \fi \number\year} % % \end{macrocode} % Current time; this may be system dependent! % \begin{macrocode} \newcount\hours \newcount\minutes \def\SetTime{\hours=\time \global\divide\hours by 60 \minutes=\hours \multiply\minutes by 60 \advance\minutes by-\time \global\multiply\minutes by-1 } \SetTime \def\now{\ifnum\hours<10 0\fi\number\hours:% \ifnum\minutes<10 0\fi\number\minutes} \def\Now{\today\ \now} \newif\ifPrelimDraft % true if ([draft] or [preprint] or pageno>900) \def\midrtitle{} % center of running heads \def\rtitlenexttopage{\ifPrelimDraft \textsl{\small draft: \Now}\fi} %\def\rtitlenexttopage{\ifnum\value{page}>900 \textsl{\small draft: \Now}\fi} % \end{macrocode} % % Sometimes we want to refer to the pages of another article in the same % issue. |tugboat.dates| makes the real definition; here we define a % placeholder so it won't be undefined when we send the source back to % the author. % \begin{macrocode} \let\thisissuepageref\empty % \end{macrocode} % % \subsection{Ragged right and friends} % % \begin{macro}{\raggedskip} % \begin{macro}{\raggedstretch} % \begin{macro}{\raggedparfill} % \begin{macro}{\raggedspaces} % Plain \TeX{}'s definition of |\raggedright| doesn't permit any % stretch, and results in too many overfull boxes. We also turn off % hyphenation. This code lies somewhere between that of Plain \TeX{} % and of \LaTeX{}. % \begin{macrocode} \newdimen\raggedskip \raggedskip=\z@ \newdimen\raggedstretch \raggedstretch=5em % ems of font set now (10pt) \newskip\raggedparfill \raggedparfill=\z@\@plus 1fil \def\raggedspaces{\spaceskip=.3333em \relax \xspaceskip=.5em \relax } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\raggedright} % \begin{macro}{\raggedleft} % \begin{macro}{\raggedcenter} % \begin{macro}{\normalspaces} % Some applications may have to add stretch, in order to avoid % all overfull boxes. We define the following uses of the above % skips, etc. % \begin{macrocode} \def\raggedright{% \nohyphens \raggedspaces \rightskip=\raggedskip\@plus\raggedstretch \parfillskip=\raggedparfill } \def\raggedleft{% \nohyphens \raggedspaces \leftskip=\raggedskip\@plus\raggedstretch \parfillskip=\z@skip \let\\ \@centercr % else tabulararray fails, % https://github.com/lvjr/tabularray/issues/348 } \def\raggedcenter{% \nohyphens \raggedspaces \leftskip=\raggedskip\@plus\raggedstretch \rightskip=\leftskip \parindent=\z@ \parfillskip=\z@skip } % % Undo |\raggedspaces|. \def\normalspaces{\spaceskip\z@skip \xspaceskip\z@skip} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\tubjustifiedpar} % Undo the \cs{raggedright} (or other such) settings, restoring normality. % \begin{macrocode} \def\tubjustifiedpar{\rightskip=0pt \parfillskip=0pt plus1fil \allowhyphens \normalspaces} % \end{macrocode} % \end{macro} % % \subsection{Assorted user-level markup} % % We provide a new definition of |~| by redefining \cs{\nobreakspace} % (\cs{DeclareRobustCommand} doesn't mind redefinition, fortunately). % This is based on the version in AMS-\TeX---the \LaTeXe{} version % (|ltspace.dtx|) has \cs{leavevmode} and does not do anything with the % surrounding space(s). Our version messes up with the \cs{pfill} used in % |doc|-generated indexes (\url{github.com/latex3/latex2e/issues/75}), % but later (2018++) versions of |doc| should protect against our redefinition. % % \begin{macrocode} \let\latexnobreakspace=\nobreakspace \DeclareRobustCommand{\nobreakspace}{\unskip\nobreak\ \ignorespaces} % \end{macrocode} % % Plain \TeX{} defines \cs{newbox} as \cs{outer}. We solemnly % preserve the following, which removes the \cs{outer}ness; of course, % we carefully exclude it from what we generate\dots{} (\cs{outer}ness is a % spawn of the devil, is it not? Barbara Beeton responded to the % previous sentence ``\cs{outer}ness has its place: it avoids register % buildup, hence running out of memory''. In another context, David % Carlisle remarked that an error control mechanism that causes more % confusing errors than it prevents is rather a poor one. This is % perhaps not the place to conduct a serious debate\dots) % % \begin{macrocode} \def\boxcs#1{\box\csname#1\endcsname} \def\setboxcs#1{\setbox\csname#1\endcsname} \def\newboxcs#1{\expandafter\newbox\csname#1\endcsname} \let\gobble\@gobble \def\vellipsis{% \leavevmode\kern0.5em \raise\p@\vbox{\baselineskip6\p@\vskip7\p@\hbox{.}\hbox{.}\hbox{.}} } % \bull doesn't work with tagging; requires ActualText using, e.g., % accsup, but the ActualText is ignored since it's just a rule. % (Lots of our other commands also are not properly tagged.) % https://github.com/latex3/tagging-project/pull/535 \def\bull{\vrule \@height 1ex \@width .8ex \@depth -.2ex } \DeclareRobustCommand{\cents}{\textcent} \def\tubcentsold{{\rm\raise.2ex\rlap{\kern.05em$\scriptstyle/$}c}} \def\careof{\leavevmode\hbox{\raise.75ex\hbox{c}\kern-.15em /\kern-.125em\smash{\lower.3ex\hbox{o}}} \ignorespaces} \def\Dag{\raise .6ex\hbox{$\scriptstyle\dagger$}} % \DeclareRobustCommand{\sfrac}[1]{\@ifnextchar/{\@sfrac{#1}}% {\@sfrac{#1}/}} \def\@sfrac#1/#2{\leavevmode\kern.1em\raise.5ex \hbox{$\m@th\mbox{\fontsize\sf@size\z@ \selectfont#1}$}\kern-.1em /\kern-.15em\lower.25ex \hbox{$\m@th\mbox{\fontsize\sf@size\z@ \selectfont#2}$}} % % don't stay bold in description items, bold italic is too weird. \DeclareRobustCommand\meta[1]{% \ensuremath{\langle}% \ifmmode \expandafter\mbox \fi % if in math {\it #1\/}% no typewriter italics, please \ensuremath{\rangle}% } % % Use \tt rather than \texttt because italic typewriter is just too strange % and upright works well enough in both italic and bold contexts. % Would be nice to change catcode of _ for \LaTeX3, but we don't. % % By the way, it would be possible to substitute typewriter slanted for % typewriter italic in general: % \url{https://tex.stackexchange.com/questions/692277}. % But it feels like that is too intrusive a change, even though in % practice we always prefer tt slanted. \DeclareRobustCommand{\cs}[1]{\texorpdfstring {{\tt \char`\\#1}\@}% {\textbackslash #1}% } % % This command was defined much later than the others around here, so % let's not conflict with any existing definitions that might be out there. % Don't allow hyphenations or other line breaks. \DeclareRobustCommand{\tubbraced}[1]{\texorpdfstring {\mbox{\texttt{\char`\{#1\char`\}}}}% {\textbraceleft #1\textbraceright}% } % % Literal text, such as class names, package names, filenames, etc, % Trying to define separate commands for each seems impossible and pointless. % Usually we don't want hyphenation or any other kind of break. \DeclareRobustCommand{\tbcode}[1]{\mbox{\texttt{#1}}} % % On the other hand, sometimes we need to break such code fragments. % If |hyperref| is loaded, we want |\nolinkurl|, else just |\url|. \AtBeginDocument{% \ifx\nolinkurl\undefined \DeclareRobustCommand{\tbcodebreak}{\url} \else \DeclareRobustCommand{\tbcodebreak}{\nolinkurl} \fi } % % Not sure why we ever want this instead of LaTeX's \, (using \kern), % but fine, just keeping it. \DeclareRobustCommand{\thinskip}{\hskip 0.16667em\relax} % % Ah, urls. Nowadays, we like the visible url to not have any protocol, % if it is \texttt{http://} or \texttt{https://}. But we need to include % the protocol if we are making live links, since a string like % \texttt{tug.org/whatever} will be taken as a local filename by % browsers and PDF readers. Since we need to check for % \texttt{hyperref}, make the definition \cs{AtBeginDocument}. In the % end, \cs{tbsurl}\tubbraced{foo} produces \texttt{https://foo} and % \cs{tbhurl}\tubbraced{foo} produces \texttt{http://foo}. \AtBeginDocument{% \ifx\hyper@normalise\undefined \ifx\url\undefined % define our own simplistic non-hyperref \url \def\url{\begingroup % might as well catch common special chars \catcode`\#=12 \catcode`\$=12 \catcode`\%=12 \catcode`\^=12 \catcode`\&=12 \catcode`\_=12 \catcode`\~=12 \finish@tub@url} \def\finish@tub@url#1{\tt #1\endgroup} \fi \let\tburl\url % no hyperref, so just \url is fine; \let\tbsurl\url % \let instead of \def so we can still \let\tbhurl\url % use \def\url{\tbsurl} without infloop. \else % This hyperref hook-in is due to Ulrike Fischer. % \url{https://github.com/latex3/hyperref/issues/125}. % \tb[sh]url@ are defined next. \DeclareRobustCommand*{\tburl}{\tbsurl}% \DeclareRobustCommand*{\tbsurl}{\hyper@normalise\tbsurl@}% \DeclareRobustCommand*{\tbhurl}{\hyper@normalise\tbhurl@} \fi } % % Outside \AtBeginDocument, back at the top level of the dtx, we % turn on expl syntax for the main definitions of \tb[sh]url. We want % to auto-remove an explicit protocol in case it % was given. % % Only the correct protocol is removed; if \verb|http://| is % given to \cs{tbsurl}, it is used (and printed) as-is. This is useful % so we can do \verb|\let\url\tbsurl| when printing bibliographies. % % Giving \verb|https://| to \cs{tbhurl}, on the other hand, generates an % invalid link; in practice there's no use for that so we don't bother % to check for it. % \ExplSyntaxOn \def\tbsurl@#1 % https { \str_set:Nn\l_tmpa_str{#1} \str_if_in:NnTF \l_tmpa_str {http://} { \tbhurl@{#1} % if http, redirect to remove protocol % this version prints the http, as we originally thought was better. % \expandafter\hyper@linkurl % \expandafter{\expandafter\Hurl\expandafter{\l_tmpa_str}}{\l_tmpa_str} } { \str_remove_once:Nn \l_tmpa_str {https://} \expandafter\hyper@linkurl \expandafter{\expandafter\Hurl\expandafter{\l_tmpa_str}} {https://\l_tmpa_str} } } \def\tbhurl@#1 % http { \str_set:Nn\l_tmpa_str{#1} \str_remove_once:Nn \l_tmpa_str {http://} \expandafter\hyper@linkurl\expandafter{\expandafter\Hurl\expandafter {\l_tmpa_str}}{http://\l_tmpa_str} } \ExplSyntaxOff % % Now let's use those macros for putting a url into a simple % ragged-right footnote. \def\tburlfootnote{\tbsurlfootnote} \def\tbsurlfootnote#1{\footnote{\raggedright\tbsurl{#1}}} \def\tbhurlfootnote#1{\footnote{\raggedright\tbhurl{#1}}} % % Close up space between footnote mark and punctuation (``pre-punctuation''). \DeclareRobustCommand{\tbppkernfoot}{\tubthinnerspace} % Make \! work in text mode, for older LaTeX. \DeclareRobustCommand{\!}{\ifmmode\mskip-\thinmuskip \else\kern-0.16667em \fi} % % Half a thinspace, positive and negative. Should have named these % \cs{tb} instead of \cs{tub}, but not worth changing now. \DeclareRobustCommand{\tubthinnerspace} {\ifmmode\mskip.5\thinmuskip \else\kern0.08333em \fi} \DeclareRobustCommand{\tubthinnerspaceneg} {\ifmmode\mskip-.5\thinmuskip \else\kern-0.08333em \fi} % % Half a smallskip. \DeclareRobustCommand{\tubsmallerskip} {\vskip 1.5pt plus .75pt minus .75pt\relax} % % \end{macrocode} % % We play a merry game with dashes, providing all conceivable options % of breakability before and after. % % \begin{macrocode} \def\endash{--} \def\emdash{\endash-} \def\d@sh#1#2{\unskip#1\thinskip#2\thinskip\ignorespaces} \def\dash{\d@sh\nobreak\endash} \def\Dash{\d@sh\nobreak\emdash} \def\ldash{\d@sh\empty{\hbox{\endash}\nobreak}} \def\rdash{\d@sh\nobreak\endash} \def\Ldash{\d@sh\empty{\hbox{\emdash}\nobreak}} \def\Rdash{\d@sh\nobreak\emdash} % \end{macrocode} % % Hacks to permit automatic hyphenation after an actual hyphen, or % after a slash. % % \begin{macrocode} \def\hyph{-\penalty\z@\hskip\z@skip } \def\slash{/\penalty\z@\hskip\z@skip } % \end{macrocode} % % Adapted from |comp.text.tex| posting by Donald Arseneau, 26 May 93. % \LaTeXe-isation added by Robin Fairbairns. Destroys both the % |TestCount|s. % % \begin{macrocode} \def\nth#1{% \def\reserved@a##1##2\@nil{\ifcat##1n% 0% \let\reserved@b\ensuremath \else##1##2% \let\reserved@b\relax \fi}% \TestCount=\reserved@a#1\@nil\relax \ifnum\TestCount <0 \multiply\TestCount by\m@ne \fi % subdue negatives \T@stCount=\TestCount \divide\T@stCount by 100 \multiply\T@stCount by 100 \advance\TestCount by-\T@stCount % n mod 100 \ifnum\TestCount >20 \T@stCount=\TestCount \divide\T@stCount by 10 \multiply\T@stCount by 10 \advance\TestCount by-\T@stCount % n mod 10 \fi \reserved@b{#1}% \textsuperscript{\ifcase\TestCount th% 0th \or st% 1st \or nd% 2nd \or rd% 3rd \else th% nth \fi}% } % \end{macrocode} % % \subsection{Reviews} % % Format information on reviewed items for book review articles. % For the \LaTeXe{} version, we follow Fairbairns' maxim, and define % something that can even look like a \LaTeX{} macro\dots % % \begin{macrocode} \def\Review{\@ifnextchar:{\@Review}{\@Review:}} \def\@Review:{\@ifnextchar[%] {\@Rev}% {\@Rev[Book review]}} \def\@Rev[#1]#2{{\ignorespaces#1\unskip:\enspace\ignorespaces \slshape\mdseries#2}} \def\reviewitem{\addvspace{\BelowTitleSkip}% \def\revauth##1{\def\therevauth{##1, }\ignorespaces}% \def\revtitle##1{\def\therevtitle{{\slshape##1}. }\ignorespaces}% \def\revpubinfo##1{\def\therevpubinfo{##1.}\ignorespaces}% } \def\endreviewitem{{\noindent\interlinepenalty=10000 \therevauth\therevtitle\therevpubinfo\endgraf}% \vskip\medskipamount } \def\titleref#1{{\slshape\frenchspacing#1\nocorr}} \let\booktitle=\titleref % older name % \end{macrocode} % % \subsection{Dates, volume and issue numbers, etc.} % % Dates and other items which identify the volume and issue. % \cs{issueseqno} is a sequential issue number starting from the % first issue published; volume 15,4 has \cs{issueseqno=45}. % % To use: \begin{tabular}{l} % |\vol 19, 1.|\\ % |\issdate March 1998.|\\ % |\issueseqno=58|\\ % \end{tabular} % % Starting with volume 23 (nominal 2002), we have \cs{issyear} instead % of \cs{issdate}, because issues don't have months any more. % % For production, these are set in a separate file, % |tugboat.dates|, which is issue-specific. % % \begin{macrocode} \newcount\issueseqno \issueseqno=-1 \def\v@lx{\gdef\volx{Volume~\volno~(\volyr), No.~\issno}} \def\volyr{} \def\volno{} \def\vol#1, #2.{% \gdef\volno{#1}% \gdef\issno{#2}% \setbox\TestBox=\hbox{\volyr}% \ifdim \wd\TestBox > .2em \v@lx \fi } \def\issyear#1.{% \gdef\issdt{#1}\gdef\volyr{#1}% \gdef\bigissdt{#1}% \setbox\TestBox=\hbox{\volno}% \ifdim \wd\TestBox > .2em \v@lx \fi } \def\issdate#1#2 #3.{% \gdef\issdt{#1#2 #3}\gdef\volyr{#3}% \gdef\bigissdt{#1{\smc\uppercase{#2}} #3}% \setbox\TestBox=\hbox{\volno}% \ifdim \wd\TestBox > .2em \v@lx \fi } % The \vol command must be invoked precisely like this, including spaces. % Since we are the only ones who write it, we can be strict. \vol 0, 0. \issdate Thermidor, 9999. % \end{macrocode} % % (The curious may like to know that \emph{Thermidor} was one of the French % revolutionary month names.) % % For \LaTeX{} use, define a version of the issue declaration that can % take or leave the old plain syntax % % \begin{macrocode} %\def\tubissue#1(#2)% %<*latex> \def\tubissue#1{\@ifnextchar(%) {\@tubissue@b{#1}} {\@tubissue@a{#1}}} \def\@tubissue@b#1(#2){\@tubissue@a{#1}{#2}} \def\@tubissue@a#1#2% % {\TUB~#1, no.~#2} % \end{macrocode} % % \TUB{} conventions include the sequential issue number in the file name. % Permit this to be incorporated into file names automatically. % If \(\mbox{issue number} = 11\), \cs{Input filnam} will read % |tb11filnam.tex| % % \begin{macrocode} \def\infil@{\jobname} \def\Input #1 {\ifnum\issueseqno<0 \def\infil@{#1}% \else \def\infil@{tb\number\issueseqno#1} \fi \edef\jobname{\infil@}\@readFLN \@@input \infil@\relax \if@RMKopen \immediate\closeout\@TBremarkfile\@RMKopenfalse \fi } % \end{macrocode} % % \cs{TBremark}s are things that need to be drawn to the attention of % the editors; the conscientious author will include such things in % the article file. By default, remarks are suppressed, but their % appearance may be enabled by the \cs{TBEnableRemarks} command, which % can be included in the configuration file |ltugboat.cfg| (or % |ltugproc.cfg|, if that's what we're at). % % \begin{macrocode} \newif\if@RMKopen \@RMKopenfalse \newwrite\@TBremarkfile \def\@TBremark#1{% \if@RMKopen \else \@RMKopentrue\immediate\openout\@TBremarkfile=\infil@.rmk \fi \toks@={#1}% \immediate\write\@TBremarkfile{^^J\the\toks@}% \immediate\write16{^^JTBremark:: \the\toks@^^J}% } % \end{macrocode} % % We initialise \cs{TBremark} to ignore its argument (this used to % involve a \cs{TBremarkOFF} which was cunningly defined exactly the % same as \cs{gobble}) % % \begin{macrocode} \let\TBremark=\gobble % \end{macrocode} % % \cs{TBEnableRemarks} simply involves setting \cs{TBremark} to use % the functional \cs{@TBremark} defined above. % % \begin{macrocode} \def\TBEnableRemarks{\let\TBremark\@TBremark} % \end{macrocode} % % For marking locations in articles that pertain to remarks % in another file of editorial comments % % \begin{macrocode} \def\TUBedit#1{} % \end{macrocode} % % For using different filenames in the production process than those % supplied by authors % % \begin{macrocode} \def\TUBfilename#1#2{\expandafter\def\csname file@@#1\endcsname{#2}} \newread\@altfilenames \def\@readFLN{\immediate\openin\@altfilenames=\jobname.fln \ifeof\@altfilenames\let\@result\relax\else \def\@result{\@@input\jobname.fln }\fi \immediate\closein\@altfilenames \@result} \@readFLN \everyjob=\expandafter{\the\everyjob\@readFLN} \InputIfFileExists{\jobname.fln}% {\TBInfo{Reading alternative file \jobname.fln}} {} % \end{macrocode} % % The following needs to work entirely in \TeX's mouth % \begin{macrocode} \def\@tubfilename#1{\expandafter\ifx\csname file@@#1\endcsname\relax #1\else\csname file@@#1\endcsname\fi} \def\fileinput#1{\@@input\@tubfilename{#1} } % \end{macrocode} % % Write out (both to a file and to the log) the starting page number % of an article, to be used for cross references and in contents. % |\pagexref| is used for articles fully processed in the \TUB{} % run. |\PageXref| is used for `extra' pages, where an item is % submitted as camera copy, and only running heads (at most) are run. % % \begin{macrocode} %<*!latex> \def\pagexrefON#1{% \write-1{\def\expandafter\noexpand\csname#1\endcsname{\number\pageno}}% \write\ppoutfile{% \def\expandafter\noexpand\csname#1\endcsname{\number\pageno}}% } \def\PageXrefON#1{% \immediate\write-1{\def\expandafter \noexpand\csname#1\endcsname{\number\pageno}}% \immediate\write\ppoutfile{\def\expandafter \noexpand\csname#1\endcsname{\number\pageno}}} % %<*latex> \def\pagexrefON#1{% \write-1{\def\expandafter\noexpand\csname#1\endcsname{\number\c@page}}% \write\ppoutfile{% \def\expandafter\noexpand\csname#1\endcsname{\number\c@page}}% } \def\PageXrefON#1{% \immediate\write-1{\def\expandafter \noexpand\csname#1\endcsname{\number\c@page}}% \immediate\write\ppoutfile{\def\expandafter \noexpand\csname#1\endcsname{\number\c@page}}} % \def\pagexrefOFF#1{} \let\pagexref=\pagexrefOFF \def\PageXrefOFF#1{} \let\PageXref=\PageXrefOFF \def\xreftoON#1{% \ifundefined{#1}% ???\TBremark{Need cross reference for #1.}% \else\csname#1\endcsname\fi} \def\xreftoOFF#1{???} \let\xrefto=\xreftoOFF % \end{macrocode} % % \cs{TBdriver} `marks code for use when articles are run together in % a driver file'. Since we don't yet have a definition of that % arrangement, we don't have a definition of \cs{TBdriver}. Its % argument (which one presumes was intended as the code for this % unusual state) is just gobbled. % % \begin{macrocode} \let\TBdriver\gobble % \end{macrocode} % % Hyphenation exceptions. We read our own full |ushyphex.tex| (generated % from |tb0hyf.tex|) if it's available. The additional exceptions are % nearly all included in the file, but keep defining them anyway, since % we have for many years. % % But do not define any exceptions if |\tubomithyphenations| is defined. % This is needed for the |hyf| articles themselves. % % \begin{macrocode} \ifx\tubomithyphenations\@thisisundefined \InputIfFileExists{ushyphex.tex}{}{} % ok if it's missing \hyphenation{Del-a-ware Dijk-stra Duane Eijk-hout Flor-i-da Free-BSD Ghost-script Hara-lam-bous Jac-kow-ski Ja-pa-nese Karls-ruhe Lua-Meta Mac-OS Math-Sci-Net Net-BSD Open-BSD Open-Office Pak-i-stan Post-Script Rich-ard Skoup South-all Vieth VM-ware Win-Edt acro-nym acro-nyms analy-sis ap-pen-di-ces ap-pen-dix asyn-chro-nous bib-lio-graph-i-cal bit-map bit-mapped bit-maps buf-fer buf-fers bool-ean col-umns com-put-able com-put-abil-ity data-base data-bases de-allo-cate de-allo-cates de-allo-cated de-allo-ca-tion de-riv-a-tive de-riv-a-tives de-riv-a-ble der-i-va-tion dis-trib-ut-able es-sence fall-ing half-way in-fra-struc-ture key-note long-est ma-gyar man-u-script man-u-scripts meta-table meta-tables mne-mon-ic mne-mon-ics mono-space mono-spaced name-space name-spaces off-line over-view pal-ettes par-a-digm par-a-dig-matic par-a-digms pipe-line pipe-lines plug-in plug-ins pres-ent-ly pro-gram-mable re-allo-cate re-allo-cates re-allo-cated re-printed set-ups se-vere-ly spell-ing spell-ings stand-alone strong-est sub-ex-pres-sion sub-tables sur-gery syn-chro-ni-city syn-chro-nous text-height text-length text-width time-stamp time-stamped time-stamps vis-ual vis-ual-ly which-ever white-space white-spaces wide-spread wrap-around } \fi %\restorecat\@ % %<*classtail> \PrelimDrafttrue % \end{macrocode} % \subsection{Page dimensions, glue, penalties, etc.} % \begin{macrocode} \textheight 54pc % 648pt = 645.58bp = 8.97in \textwidth 39pc % 468pt = 466.25bp = 6.48in \columnsep 1.5pc % 18pt = 17.93bp = .249in \columnwidth 18.75pc % 225pt = 224.16bp = 3.11in \hfuzz 1pt \parindent \normalparindent % 20pt \parskip \z@ % \@plus\p@ \leftmargini 2em \leftmarginv .5em \leftmarginvi .5em \oddsidemargin \z@ \evensidemargin \z@ \topmargin -2.5pc % 30pt = 29.89bp = .415in \headheight 12\p@ \headsep 20\p@ \marginparwidth 48\p@ \marginparsep 10\p@ \partopsep=\z@ \topsep=3\p@\@plus\p@\@minus\p@ \parsep=3\p@\@plus\p@\@minus\p@ \itemsep=\parsep % % The width of one column plus gutter (=243pt =242.09bp) is useful sometimes. \newdimen\tubcolwidthandgutter \tubcolwidthandgutter=\columnwidth \advance\tubcolwidthandgutter by \columnsep % % Ordinarily we typeset in two columns, but the onecolumn option % goes to one. In which case we want to center the text block on an % 8.5in width, given the default 72.27pt offset with margins of zero. % We are always in LaTeX's twoside mode because of how we load article, % and this is a good thing, since we want different headings. \if@tubtwocolumn \twocolumn \else \onecolumn \textwidth=34pc \oddsidemargin=30.8775pt \evensidemargin=\oddsidemargin \fi % \newdimen\pagewd \pagewd=\textwidth \newdimen\trimwd \trimwd=\pagewd \newdimen\trimlgt \trimlgt=11in \newdimen\headmargin \headmargin=3.5pc % \end{macrocode} % % Don't go to a float page so soon. Not all of these are relevant to all % articles, but we may as well set them all. % \begin{macrocode} \renewcommand{\topfraction}{.9} % don't go to a float page so soon \renewcommand{\dbltopfraction}{.9} \renewcommand{\bottomfraction}{.7} \renewcommand{\textfraction}{.1} \renewcommand{\floatpagefraction}{.8} \renewcommand{\dblfloatpagefraction}{.8} % the most common one used % \end{macrocode} % % \subsection{Messing about with the \LaTeX{} logo} % \label{sec:latex-logo} % % Barbara Beeton's pleas for \LaTeX{} logos that look right in any % font shape provoked me to generate the following stuff that is % configurable. % % Here's the command for the user to define a new version. The % arguments are font family, series and shape, and then the two kern % values used in placing the raised `A' of \LaTeX. % % \begin{macrocode} \newcommand{\DeclareLaTeXLogo}[5]{\expandafter\def \csname @LaTeX@#1/#2/#3\endcsname{{#4}{#5}}} % \end{macrocode} % % The default values are as used in the source of \LaTeX{} itself: % % \begin{macrocode} \def\@LaTeX@default{{.36}{.15}} % \end{macrocode} % % More are defined in the initial version, for bold CM sans (which is % used as \cs{SecTitleFont}), and CM italic medium and bold, and % Bitstream Charter (which Nelson Beebe likes to use). Duplicate for % Latin Modern. % % \begin{macrocode} \DeclareLaTeXLogo{cmss}{bx}{n}{.3}{.15} \DeclareLaTeXLogo{lmss}{bx}{n}{.3}{.15} % \DeclareLaTeXLogo{cmr}{m}{it}{.29}{.2} \DeclareLaTeXLogo{lmr}{m}{it}{.29}{.2} % \DeclareLaTeXLogo{cmr}{m}{sl}{.29}{.15} \DeclareLaTeXLogo{lmr}{m}{sl}{.29}{.15} % \DeclareLaTeXLogo{cmr}{bx}{it}{.29}{.2} \DeclareLaTeXLogo{lmr}{bx}{it}{.29}{.2} % \DeclareLaTeXLogo{cmr}{bx}{sl}{.29}{.2} \DeclareLaTeXLogo{lmr}{bx}{sl}{.29}{.2} % \DeclareLaTeXLogo{bch}{m}{n}{.2}{.08} \DeclareLaTeXLogo{bch}{m}{it}{.2}{.08} % \end{macrocode} % % Redefine \cs{LaTeX} to choose the parameters for the current font, % or to use the default value otherwise: % % \begin{macrocode} \DeclareRobustCommand{\LaTeX}{\expandafter\let\expandafter\reserved@a \csname @LaTeX@\f@family/\f@series/\f@shape\endcsname \ifx\reserved@a\relax\let\reserved@a\@LaTeX@default\fi \expandafter\@LaTeX\reserved@a} % \end{macrocode} % % Here's the body of what was originally \cs{LaTeX}, pulled out with its % roots dripping onto the smoking ruin of original \LaTeX, and then % bits stuck in on the side. % % \cs{@LaTeX@default} provides parameters as one finds in the % original; other versions are added as needed. % % \begin{macrocode} \newcommand{\@LaTeX}[2]{% %\wlog{latex logo family=\f@family/\f@series/\f@shape -> #1, #2.}% L\kern-#1em {\sbox\z@ T% \vbox to\ht0{\hbox{$\m@th$% \csname S@\f@size\endcsname \fontsize\sf@size\z@ \math@fontsfalse\selectfont A}% \vss}% }% \kern-#2em% \TeX} % \end{macrocode} % % \subsection{Authors, contributors, addresses, signatures} % % An article may have several authors (of course), so we permit an % \cs{author} command for each of them. The names are then stored in % a set of \cs{csname}s called \cs{author1}, \cs{author2}, \dots % Similarly, there are several \cs{address} and \cs{netaddress} % and \cs{PersonalURL} and \cs{ORCID} commands set up for each article. % % \begin{description} % \item[\emph{Comment:}] I would like to make provision for several % authors at the same address, but (short of preempting the |*| % marker, which it would be nice to retain so as to preserve % compatibility with the |plain| style) I'm not sure how one would % signal it. % \end{description} % \begin{macrocode} \def\theauthor#1{\csname theauthor#1\endcsname} \def\theaddress#1{\csname theaddress#1\endcsname} \def\thenetaddress#1{\csname thenetaddress#1\endcsname} \def\thePersonalURL#1{\csname thePersonalURL#1\endcsname} \def\theORCID#1{\csname theORCID#1\endcsname} % \end{macrocode} % % The standard way of listing authors is to iterate from 1 to % \cs{count@} and to pick the author names as we go. % % \begin{macrocode} %\newcount\@tempcnta \def\@defaultauthorlist{% \@getauthorlist\@firstofone } % \end{macrocode} % % \cs{@getauthorlist} processes the author list, passing every bit of % stuff that needs to be typeset to the macro specified as its argument. % \begin{macrocode} \def\@getauthorlist#1{% \count@\authornumber \advance\count@ by -2 \@tempcnta0 % \end{macrocode} % % Loop to output the first \ensuremath{n-2} of the \ensuremath{n} % authors (the loop does nothing if there are two or fewer authors) % % \begin{macrocode} \loop \ifnum\count@>0 \advance\@tempcnta by \@ne #1{\ignorespaces\theauthor{\number\@tempcnta}\unskip, }% \advance\count@ by \m@ne \repeat \count@\authornumber \advance\count@ by -\@tempcnta \ifnum\authornumber>0 % \end{macrocode} % % If there are two or more authors, we output the penultimate author's % name here, followed by `and' % % \begin{macrocode} \ifnum\count@>1 \count@\authornumber \advance\count@ by \m@ne #1{\ignorespaces\theauthor{\number\count@}\unskip\@tubauthorlastsep}% \fi % \end{macrocode} % % Finally (if there were any authors at all) output the last author's % name: % % \begin{macrocode} #1{\ignorespaces\theauthor{\number\authornumber}\unskip} \fi } % \def\@tubauthorlastsep{, }% until 2018, was: "\ and " % \end{macrocode} % % Signature blocks. The author can (in principle) define a different % sort of signature block using \cs{signature}, though this could well % cause the editorial group to have collective kittens (unless it had % been discussed in advance\dots) % % \begin{macrocode} \def\signature#1{\def\@signature{#1}} \def\@signature{\@defaultsignature} % \end{macrocode} % % \cs{@defaultsignature} loops through all the authors, outputting the % details we have about that author, or (if we're in a sub-article) % outputs the contributor's name and closes the group opened by % \cs{contributor}. It is (as its name implies) the default body for % \cs{makesignature} % % \begin{macrocode} \def\@defaultsignature{{% \let\thanks\@gobble \frenchspacing % \ifnum\authornumber<0 % \end{macrocode} % if \cs{authornumber}$<0$, we are in a contributor's section % \begin{macrocode} \medskip \signaturemark \theauthor{\number\authornumber}\\ \theaddress{\number\authornumber}\\ \allowhyphens \thenetaddress{\number\authornumber}\\ \thePersonalURL{\number\authornumber}\\ \theORCID{\number\authornumber}\\ \else % \end{macrocode} % \cs{authornumber}$\ge0$, so we are in the body of an ordinary % article % \begin{macrocode} \count@=0 \loop \ifnum\count@<\authornumber \medskip \advance\count@ by \@ne \signaturemark \theauthor{\number\count@}\\ \theaddress{\number\count@}\\ {% \allowhyphens \thenetaddress{\number\count@}\\ \thePersonalURL{\number\count@}\\ \theORCID{\number\count@}\\ }% \repeat \fi }% } \newdimen\signaturewidth \signaturewidth=12pc % \end{macrocode} % The optional argument to \cs{makesignature} is useful in some % circumstances (e.g., multi-contributor articles) % \begin{macrocode} \newcommand{\makesignature}[1][\medskipamount]{% % \end{macrocode} % % check the value the user has put in \cs{signaturewidth}: it may be % at most \verb|1.5pc| short of \cs{columnwidth} % \begin{macrocode} \@tempdima\signaturewidth \advance\@tempdima 1.5pc \ifdim \@tempdima>\columnwidth \signaturewidth \columnwidth \advance\signaturewidth -1.5pc \fi \par \penalty9000 \vspace{#1}% \rightline{% \vbox{\hsize\signaturewidth \ninepoint \raggedright \parindent \z@ \everypar={\hangindent 1pc }% \parskip \z@skip \def\|{\unskip\hfil\break}% \def\\{\endgraf}% \def\phone{\rm Phone: }% \def\tubmultipleaffilauthor{\unskip,\\\hspace*{1em}}% \rm\@signature}% }% \ifnum\authornumber<0 \endgroup\fi } \def\signaturemark{\leavevmode\llap{$\diamond$\enspace}} % \end{macrocode} % % The idea here is that if multiple authors share affiliation % information, we need only typeset the affiliation once. We separate by % commas for the \cs{maketitle}, and put on separate lines, also with commas, % in the \cs{makesignature}. % % Similarly, within \cs{netaddress}, |!tubmultipleaffilnet| separates % with a space before and after the % comma. (All this per bb.) See |tb122childs-trotter.ltx|, % |tb131sojka-czech.ltx| for examples. % % \begin{macrocode} \def\tubmultipleaffilauthor{\unskip,\ \ignorespaces}% \def\tubmultipleaffilnet{\unskip\textrm{\,,\ \ignorespaces}} % \end{macrocode} % % Now all the awful machinery of author definitions. % \cs{authornumber} records the number of authors we have recorded to % date. % % \begin{macrocode} \newcount\authornumber \authornumber=0 % \end{macrocode} % % \cs{author} `allocates' another author name (by bumping % \cs{authornumber}) and also sets up the address and netaddress for % this author to produce a warning and to prevent oddities if they're % invoked. This last assumes that invocation will be in the context % of \cs{signature} (|ltugboat.cls|) or \cs{maketitle} % (|ltugproc.cls|); in both cases, invocation is followed by a line % break (tabular line break |\\| in |ltugproc|, \cs{endgraf} in % \cs{makesignature} in |ltugboat|). % % \begin{macrocode} \def\author{% \global\advance\authornumber\@ne \TB@author } % \end{macrocode} % \cs{contributor} is for a small part of a multiple-part article; it % begins a group that will be ended in \cs{makesignature}. % \begin{macrocode} \def\contributor{% \begingroup \authornumber\m@ne \TB@author } % \end{macrocode} % % Both `types' of author fall through here to set up the author name % and to initialise author-related things. \cs{EDITORno*} commands % allow the editor to record that there's good reason for an % \emph{address} or \emph{netaddress} not to be there, but nowadays, we % consider all address information optional. % \begin{macrocode} \def\TB@author#1{% \expandafter\def\csname theauthor\number\authornumber\endcsname {\ignorespaces#1\unskip}% % \expandafter\def\csname theaddress\number\authornumber\endcsname % {\TBWarningNL{Address for #1\space missing}\@gobble}% % \expandafter\def\csname thenetaddress\number\authornumber\endcsname % {\TBWarningNL{Net address for #1\space missing}\@gobble}% \expandafter\let\csname thePersonalURL\number\authornumber\endcsname \@gobble \expandafter\let\csname theORCID\number\authornumber\endcsname \@gobble } \def\EDITORnoaddress{% \expandafter\let\csname theaddress\number\authornumber\endcsname \@gobble } \def\EDITORnonetaddress{% \expandafter\let\csname thenetaddress\number\authornumber\endcsname \@gobble } % \end{macrocode} % % \cs{address} copies its argument into the \cs{theaddress} % for this author. % % \begin{macrocode} \def\address#1{% \expandafter\def\csname theaddress\number\authornumber\endcsname {\leavevmode\ignorespaces#1\unskip}} % \end{macrocode} % % \cs{network} is for use within the optional argument of % \cs{netaddress}; it defines the \emph{name} of the network the user % is on. % % \begin{description} % \item[\emph{Comment:}] I think this is a fantasy, since everyone (in % practice, nowadays) quotes an internet address. In principle, there % are people who will quote |X.400| addresses (but they're few and far % between) and I have (during 1995!)\ seen an address with an |UUCP| % bang-path component on |comp.text.tex|, but \emph{really}! % \end{description} % % \begin{macrocode} \def\network#1{\def\@network{#1: }} % \end{macrocode} % % \cs{netaddress} begins a group, executes an optional argument (which % should not, presumably, contain global commands) and then relays to % \cs{@relay@netaddress} with both |@| and |%| made active (so that % they can be discretionary points in the address). If we're using % \LaTeXe, we use the default-argument form of \cs{newcommand}; % otherwise we write it out in all its horribleness. % % \begin{macrocode} \newcommand{\netaddress}[1][\relax]{% \begingroup \def\@network{}% % \end{macrocode} % % Unfortunately, because of the catcode hackery, we have still to do % one stage of relaying within our own code, even if we're using % \LaTeXe. % % \begin{macrocode} #1\@sanitize\makespace\ \makeactive\@% \makeescape! \makebgroup[ \makeegroup]% seems more useful than literals \makeactive\.\makeactive\%\@relay@netaddress}% % \end{macrocode} % % \cs{@relay@netaddress} finishes the job. It sets \cs{thenetaddress} % for this author to contain the network name followed by the address. % As a result of our kerfuffle above, |@| and |%| are active at the % point we're entered. We ensure they're active when % \cs{thenetaddress} gets expanded, too. (\textbf{\emph{WOT}?!}) % % \begin{macrocode} \def\@relay@netaddress#1{% \ProtectNetChars \expandafter\protected@xdef \csname thenetaddress\number\authornumber\endcsname {\protect\leavevmode\textrm{\@network}% {\protect\NetAddrChars\net \ignorespaces#1\unskip}}% \endgroup } % \end{macrocode} % % \cs{personalURL} is in essence the same as \cs{netaddress}, apart % from (1) the lack of the eccentric optional argument, and (2) the % activation of `|/|'. % % For general URLs, \texttt{url.sty} (with or without hyperref) suffices % and is recommended. % % \begin{macrocode} \def\personalURL{\begingroup \@sanitize\makespace\ \makeactive\@ \makeactive\.\makeactive\%\makeactive\/\@personalURL}% \def\@personalURL#1{% \ProtectNetChars \expandafter\protected@xdef \csname thePersonalURL\number\authornumber\endcsname{% \protect\leavevmode {% \protect\URLchars\net \ignorespaces#1\unskip }% }% \endgroup } % \end{macrocode} % % Define the activation mechanism for `|@|', `|%|', `|.|' and `|/|', for use % in the above. Note that, since the code has `|%|' active, we have % `|*|' as a comment character, which has a tendency to make things % look peculiar\dots % % \begin{macrocode} {% \makecomment\* \makeactive\@ \gdef\netaddrat{\makeactive\@* \def@{\discretionary{\char"40}{}{\char"40}}} \makeactive\% \gdef\netaddrpercent{\makeactive\%* \def%{\discretionary{\char"25}{}{\char"25}}} \makeactive\. \gdef\netaddrdot{\makeactive\.* \def.{\discretionary{\char"2E}{}{\char"2E}}} % \end{macrocode} % % \cs{NetAddrChars} is what \emph{we} use (we're constrained to retain % the old interface to this stuff, but it \emph{is} clunky\dots). % Since {\small URL}s are a new idea, we are at liberty not to define % a separate \cs{netaddrslash} command, and we only have % \cs{URLchars}. % % \begin{macrocode} \gdef\NetAddrChars{\netaddrat \netaddrpercent \netaddrdot} \makeactive\/ \gdef\URLchars{* \NetAddrChars \makeactive\/* \def/{\discretionary{\char"2F}{}{\char"2F}}} % \end{macrocode} % % \cs{ProtectNetChars} includes protecting `|/|', since this does no % harm in the case of net addresses (where it's not going to be % active) and we thereby gain by not having yet another csname. % % \begin{macrocode} \gdef\ProtectNetChars{* \def@{\protect@}* \def%{\protect%}* \def.{\protect.}* \def/{\protect/}* } } % \end{macrocode} % % \LaTeXe{} (in its wisdom) suppresses % \cs{DeclareOldFontCommand} when in compatibility mode, so that in % that circumstance we need to use a declaration copied from % |latex209.def| rather than the way we would normally do the thing % (using the command \LaTeXe{} defines for the job). % % \begin{macrocode} \if@compatibility \DeclareRobustCommand{\net}{\normalfont\ttfamily\mathgroup\symtypewriter} \else \DeclareOldFontCommand{\net}{\ttfamily\upshape\mdseries}{\mathtt} \fi \def\authorlist#1{\def\@author{#1}} \def\@author{\@defaultauthorlist} % \end{macrocode} % % \cs{ORCID} inserts `ORCID' and then argument into the \cs{theORCID} % for this author. Also, we want \cs{small} for this. % % \begin{macrocode} \def\ORCID#1{% \expandafter\def\csname theORCID\number\authornumber\endcsname {\leavevmode \ignorespaces {\SMC ORCID} #1\unskip}} % \end{macrocode} % % For the online re-publication (as of 2009) by Mathematical Sciences % Publishers |http://mathscipub.org|, lots and lots of metadata is % needed, much of it redundant with things we already do. They are % flexible enough to allow us to specify it in any reasonable way, so % let's make one command \cs{mspmetavar} which takes two arguments. % Example: |\mspmetavar{volumenumber}{30}|. For our purposes, it is % just a no-op. And this initiative never came to anything, so it is % not used at all. % % \begin{macro}{\mspmetavar} % \begin{macrocode} \def\mspmetavar#1#2{} % \end{macrocode} % \end{macro} % % \subsection{Article title} % % \begin{macro}{\if@articletitle} % \begin{macro}{\maketitle} % \begin{macro}{\@r@maketitle} % \cs{maketitle} takes an optional ``*''; if present, the operation is % not defining the title of a paper, merely that of a ``business'' % section (such as the participants at a meeting) that has no credited % author or other title. In this case, the command flushes out the % latest \cs{sectitle} (or whatever) but does nothing else. % % Provide machinery (|\PreTitleDrop| to skip extra space, even one or % more full columns, % above the top of an article to leave space to paste up a previous % article that has finished on the same page. This is a fall back to % accommodate the fact that multiple articles cannot be run together % easily. % % In addition, if the |secondcolstart| option was specified, do % |\null\newpage| to move over. This is separate from |\PreTitleDrop|, % for no particular reason. % % \begin{macrocode} \newif\if@articletitle \def\maketitle{\@ifstar {\@articletitlefalse\@r@maketitle}% {\@articletitletrue\@r@maketitle}% } \def\@r@maketitle{\par \iftubsecondcolstart \null\newpage\tubsecondcolstartextra \fi \ifdim\PreTitleDrop > \z@ \loop \ifdim \PreTitleDrop > \textheight \vbox{}\vfil\eject \advance\PreTitleDrop by -\textheight \repeat \vbox to \PreTitleDrop{\vfil}% \global\PreTitleDrop=\z@ \fi \begingroup \setcounter{footnote}{0} \global\@topnum\z@ % disallow floats above the title \def\thefootnote{\fnsymbol{footnote}} \@maketitle \@thanks \endgroup \setcounter{footnote}{0} \gdef\@thanks{} } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\title} % \begin{macro}{\TB@title} % We redefine the \cs{title} command, so as to set the \cs{rhTitle} % command at the same time. While we're at it, we redefine it to have % optional arguments for use as `short' versions, thus obviating the % need for users to use the \cs{shortTitle} command. % \begin{macrocode} \def\rhTitle{}% avoid error if no author or title \renewcommand{\title}{\@dblarg\TB@title} \def\TB@title[#1]#2{\gdef\@title{#2}% \bgroup \let\thanks\@gobble \def\\{\unskip\space\ignorespaces}% \protected@xdef\rhTitle{#1}% \egroup } % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\shortTitle} % \begin{macro}{\ifshortAuthor} % \begin{macro}{\shortAuthor} % The \cs{rh*} commands are versions to be used in the running head of % the article. Normally, they are the same things as the author and % title of the article, but in the case that there are confusions % therein, the text should provide substitutes, using the \cs{short*} % commands. % \begin{macrocode} \def\shortTitle #1{\def\rhTitle{#1}} \newif\ifshortAuthor \def\shortAuthor #1{\def\rhAuthor{#1}\shortAuthortrue} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \subsection{Section titles} % % The following macros are used to set the large \TUB{} section heads % (e.g.\ ``General Delivery'', ``Fonts'', etc.) % % Define the distance between articles which are run together: % % \begin{macrocode} \def\secsep{\vskip 5\baselineskip} % \end{macrocode} % % Note that \cs{stbaselineskip} is used in the definition of % \cs{sectitlefont}, in \LaTeXe, so that it has (at least) to be % defined before \cs{sectitlefont} is used (we do the whole job). % % \begin{macrocode} \newdimen\stbaselineskip \stbaselineskip=18\p@ \newdimen\stfontheight \settoheight{\stfontheight}{\sectitlefont O} % \end{macrocode} % % Declaring section titles; the conditional \cs{ifSecTitle} records % the occurence of a \cs{sectitle} command. If (when) a subsequent % \cs{maketitle} occurs, the section title box will get flushed out; % as a result of this, one could in principle have a set of % \cs{sectitle} commands in a semi-fixed steering file, and inclusions % of files inserted only as and when papers have appeared. Only the % last \cs{sectitle} will actually be executed. % % \begin{macrocode} \newif\ifWideSecTitle \newif\iftubtitlerulefullwidth \newif\ifSecTitle \SecTitlefalse \newcommand{\sectitle}{% \SecTitletrue \@ifstar {\WideSecTitletrue\def\s@ctitle}% {\WideSecTitlefalse\def\s@ctitle}% } % \end{macrocode} % % \cs{PreTitleDrop} records the amount of column-space we need to % eject before we start any given paper. It gets zeroed after that % ejection has happened. % % \begin{macrocode} \newdimen\PreTitleDrop \PreTitleDrop=\z@ % \end{macrocode} % % The other parameters used in \cs{@sectitle}; I don't think there's % the slightest requirement for them to be registers (since they're % constant values, AFAIK), but converting them to macros would remove % the essentially useless functionality of being able to change them % using assignment, which I'm not about to struggle with just now... % % \cs{AboveTitleSkip} is glue above the article title; % \cs{BelowTitleSkip} is glue below the authors in the title block. % \cs{strulethickness} is the value to use for \cs{fboxrule} when % setting the title, and for the rule above titles when there is no box. % % For \cs{BelowTitleSkip}, add some stretch and shrink since the first % column of an article often needs it; otherwise, a first column of all % text will come out underfull. Use |plus2pt| since that is the same % as the glue above sections, but |minus1pt| since we'd usually prefer % to shrink somewhere else if possible. % % \begin{macrocode} \newskip\AboveTitleSkip \AboveTitleSkip=12pt \newskip\BelowTitleSkip \BelowTitleSkip=8pt plus2pt minus1pt \newdimen\strulethickness \strulethickness=.6pt % \end{macrocode} % % \cs{@sectitle} actually generates the section title (in a rather % generous box). It gets called from \cs{maketitle} under conditional % \cs{ifSecTitle}; by the time \cs{@sectitle} takes control, we % already have \cs{SecTitlefalse}. This implementation uses \LaTeX's % \cs{framebox} command, on the grounds that one doesn't keep a dog % and bark for oneself\dots % % \begin{macrocode} \def\@sectitle #1{% \par \penalty-1000 % \end{macrocode} % % If we're setting a wide title, the stuff will be at the top of a % page (let alone a column) but inside a box, so that the separator % won't be discardable: so don't create the separator in this case. % % \begin{macrocode} \ifWideSecTitle\else\secsep\fi {% \fboxrule\strulethickness \fboxsep\z@ \noindent\framebox[\hsize]{% \vbox{% \raggedcenter \let\\\@sectitle@newline \sectitlefont \makestrut[2\stfontheight;\z@]% #1% \makestrut[\z@;\stfontheight]\endgraf }% }% }% \nobreak \vskip\baselineskip } % \end{macrocode} % % \begin{macro}{\@sectitle@newline} % For use inside \cs{sectitle} as |\\|. Works similarly to |\\| in % the ``real world''---uses an optional argument % \begin{macrocode} \newcommand{\@sectitle@newline}[1][\z@]{% \ifdim#1>\z@ \makestrut[\z@;#1]% \fi \unskip\break } % \end{macrocode} % \end{macro} % % We need to trigger the making of a section title in some cases where % we don't have a section title proper (for example, in material taken % over from %^^A \acro % {TTN}). % \begin{macrocode} \def\@makesectitle{\ifSecTitle \global\SecTitlefalse \ifWideSecTitle \twocolumn[\@sectitle{\s@ctitle}]% \global\WideSecTitlefalse \else \@sectitle{\s@ctitle}% \fi \else \vskip\AboveTitleSkip \kern\topskip \hrule \@height\z@ \@depth\z@ \@width 10\p@ \kern-\topskip \kern-\strulethickness \iftubtitlerulefullwidth \hrule \@height\strulethickness \@depth\z@ width\textwidth \else \hrule \@height\strulethickness \@depth\z@ \fi \kern\medskipamount \nobreak \fi } % \end{macrocode} % % \begin{macro}{\@maketitle} % Finally, the body of \cs{maketitle} itself. % \begin{macrocode} \def\@maketitle{% \@makesectitle \if@articletitle{% \nohyphens \interlinepenalty\@M \setbox0=\hbox{% \let\thanks\@gobble \let\\=\quad \let\and=\quad \ignorespaces\@author}% {% \noindent\bf\raggedright\ignorespaces\frenchspacing \let\BibTeX=\bfBibTeX % else LaTeX Font Warning: % Font shape `OT1/cmr/bx/sc' undefined \@title\endgraf }% \ifdim \wd0 < 5\p@ % omit if author is null \else % \end{macrocode} % Since we have \(\hbox{\cs{BelowTitleSkip}} + \mathtt{4pt} = % \hbox{\cs{baselineskip}}\), we skip by |4pt| here. However, an % all-text first column still comes out underfull, maybe because of the % top rule? Thus \cs{BelowTitleSkip} is given a little stretch and shrink. % \begin{macrocode} \nobreak \vskip 4\p@ {% \leftskip=\normalparindent \raggedright \def\and{\unskip\\}% \noindent\@author\endgraf }% \fi \nobreak \vskip\BelowTitleSkip }\fi% \global\@afterindentfalse \aftergroup\@afterheading } % \end{macrocode} % \end{macro} % % Dedications are ragged right, in italics. % % \begin{macrocode} \newenvironment{dedication}% {\raggedright\noindent\itshape\ignorespaces}% {\endgraf\medskip} % \end{macrocode} % % The |abstract| and |longabstract| environments both use \cs{section*}. % For one-column articles (or in |ltugproc| class), indent the % abstract. This is done in the usual bizarre \LaTeX\ way, by treating % it as a one-item list with an empty item marker. % % \begin{macrocode} \def\@tubonecolumnabstractstart{% \list{}{\listparindent\normalparindent \itemindent\z@ \leftmargin\@tubfullpageindent \rightmargin\leftmargin \parsep \z@}\item[]\ignorespaces } \def\@tubonecolumnabstractfinish{% \endlist } \renewenvironment{abstract}% {\begin{SafeSection}% \section*{% \if@tubtwocolumn\else \hspace*{\@tubfullpageindent}\fi Abstract}% \if@tubtwocolumn\else \@tubonecolumnabstractstart \fi }% {\if@tubtwocolumn\else \@tubonecolumnabstractfinish \fi \end{SafeSection}} \newenvironment{longabstract}% {\begin{SafeSection}% \section*{Abstract}% \bgroup\small }% {\endgraf\egroup \end{SafeSection}% \vspace{.25\baselineskip} \begin{center} {$--*--$} \end{center} \vspace{.5\baselineskip}} % \end{macrocode} % % \subsection{Section headings} % % Redefine style of section headings to match plain \TUB. % Negative beforeskip suppresses following parindent. (So % negate the stretch and shrink too). % % These macros are called \cs{*head} in the plain styles. % % Relaying via \cs{TB@startsection} detects inappropriate use of % \cs{section*}. Of course, if (when) \emph{we} use it, we need to % avoid that relaying; this can be done by \cs{let}ting % \cs{TB@startsection} to \cs{TB@safe@startsection}, within a group. % % First the version for use in the default case, when class option % \textsc{numbersec} is in effect. % % The \cs{tubsecfmt} macro defines our standard formatting for section % titles: ragged right, french spacing, no hyphenation. % The \cs{tubruninsecfmt} macro is the simpler form for run-in section % headings (when the afterskip is negative), with the afterskip glue % given by \cs{tubruninglue}. % The \cs{tubsechook} macro allows overriding the defaults. % % \begin{macrocode} \def\tubsechook{} \def\tubsecfmt{\normalsize\bf\raggedright\frenchspacing\nohyphens\tubsechook} \def\tubruninglue{-1em plus-2\fontdimen3\font minus-\fontdimen4\font} \def\tubruninsecfmt{\normalsize\bf\tubsechook} % \if@numbersec \def\section{\TB@startsection{% {section} % name of counter {1} % level {0pt} % indent {-8pt plus-2pt minus-2pt} % beforeskip; negative -> \noindent after {4pt} % afterskip; negative -> hspace for run-in {\tubsecfmt}}} % style % \def\subsection{\TB@startsection{% {subsection}% 2% \z@ {-8\p@ \@plus-2\p@ \@minus-2\p@}% {4\p@}% {\tubsecfmt}}} % \def\subsubsection{\TB@startsection{% {subsubsection}% 3% \z@ {-8\p@ \@plus-2\p@ \@minus-2\p@}% {4\p@}% {\tubsecfmt}}} % \def\paragraph{\TB@startsection{% {paragraph}% 4% \z@ {4\p@ \@plus1\p@ \@minus1\p@}% {\tubruninglue} {\tubruninsecfmt}}} % \end{macrocode} % % Now the version if class option \texttt{nonumber} is in effect, % i.e., if \cs{if@numbersec} is false. % % \begin{macrocode} \else \setcounter{secnumdepth}{0} \def\section{\TB@nolimelabel\TB@startsection{% {section}% same as numbeed 1% \z@ {-8\p@ \@plus-2\p@ \@minus-2\p@}% {4\p@}% {\tubsecfmt}}} % \def\subsection{\TB@nolimelabel\TB@startsection{% {subsection}% 2% \z@ {-8\p@ \@plus-2\p@ \@minus-2\p@}% {\tubruninglue} {\tubruninsecfmt}}} % \def\subsubsection{\TB@nolimelabel\TB@startsection{% {subsubsection}% 3% \parindent {-8\p@ \@plus-2\p@ \@minus-2\p@}% {\tubruninglue} {\tubruninsecfmt}}} \fi % \end{macrocode} % % \cs{TB@startsection} used to warn about \verb"*" versions of sectioning % commands when numbering wasn't in effect. But that eventually seemed % a useless complaint, since it can be useful to switch back and forth between % numbered and unnumbered can be useful during article development. % So now \cs{TB@startsection} is just a synonym for \cs{@startsection}. % % \begin{macrocode} \def\TB@startsection#1{\@startsection#1}% % \end{macrocode} % % \cs{TB@safe@startsection} is to be used where \cs{section*} (etc.)\ % appear in places where the request is OK (because it's built in to % some macro we don't fiddle with). % % \begin{macrocode} \def\TB@safe@startsection#1{\@startsection#1} % \end{macrocode} % % The \texttt{SafeSection} environment allows use of \texttt{*}-forms % of sectioning environments. It's not documented for the general % public: it's intended as an editor's facility. % % \begin{macrocode} \newenvironment{SafeSection}% {\let\TB@startsection\TB@safe@startsection}% {} % \end{macrocode} % % And now for the exciting sectioning commands that \LaTeX{} defines % but we don't have a definition for (whatever else, we don't want % Lamport's originals, which come out `like the blare of a bugle in a % lullaby'\footnote{Thurber, \emph{The Wonderful O}}). % % The three inappropriate ones are subparagraph (indistinguishable % from paragraph), and chapter and part. The last seemed almost to be % defined in an early version of these macros, since there was a % definition of \cs{l@part}. I've not got down to where that came % from (or why). If class option \textsc{nonumber} is in effect, we % also suppress \cs{paragraph}, since it has no parallel in the plain % style. % % \begin{macrocode} \if@numbersec \def\subparagraph{\TB@nosection\subparagraph\paragraph} \else \def\paragraph{\TB@nosection\paragraph\subsubsection} \def\subparagraph{\TB@nosection\subparagraph\subsubsection} \fi \def\chapter{\TB@nosection\chapter\section} \def\part{\TB@nosection\part\section} \def\TB@nosection#1#2{\TBWarning{class does not support \string#1, \string#2\space used instead}#2} % \end{macrocode} % % \cs{l@} is for table of contents (of an article). % We define new macros to allow easily changing the font used for toc % entries (for \TUB, we usually want roman, not bold), and the space % between entries. Nelson Beebe and Frank Mittelbach's articles % often have toc's (and few others). Also turn off microtype % protrusion after \tableofcontents, or leaders get messed up. % % \begin{macrocode} \def\TBtocsectionfont{\normalfont} \newskip\TBtocsectionspace \TBtocsectionspace=1.0ex\@plus\p@ % \end{macrocode} % % \begin{macrocode} % |#1| is both the section number and title, as in % |{\numberline {1}Introduction}|. % |#2| is the page number. % % Per Ulrike, the hook calls are for tagging, introduced with the % June 2023 \LaTeX. % qqq need to also do subsections like tb137carlisle to avoid hyphenation \def\l@section#1#2{% \addpenalty{\@secpenalty}% \addvspace{\TBtocsectionspace}% \@tempdima 1.5em \begingroup \parindent\z@ \rightskip=0pt plus2em \parfillskip\z@ \hyphenpenalty=10000 \TBtocsectionfont \leavevmode \advance\leftskip by \@tempdima % space between section number and text \hskip-\leftskip % \ifx\UseHookWithArguments\undefined\else % hook before number and text \UseHookWithArguments{contentsline/text/before}{4} {\toclevel@part}{#1}{#2}{\@contentsline@destination}% \fi % % don't worry if this cs is not defined, hence the \csname. % If it doesn't exist, we just typeset #1 as text. \csname contentsline@text@1@format\endcsname {#1% number and title \unskip % avoid extra space just in case \csname pdffakespace\endcsname % fake space if pdftex ~% ensure at least a word space between text and page number } % \ifx\UseHookWithArguments\undefined\else % hook after number and text \UseHookWithArguments{contentsline/text/after}{4} {\toclevel@part}{#1}{#2}{\@contentsline@destination}% \fi \nobreak\hfil \nobreak % page number \hb@xt@\@pnumwidth{\hfil \ifx\UseHookWithArguments\undefined\else \UseHookWithArguments{contentsline/page/before}{4} {\toclevel@part}{#1}{#2}{\@contentsline@destination}% \fi \tubtypesetpageno{#2}% \ifx\UseHookWithArguments\undefined\else \UseHookWithArguments{contentsline/page/after}{4} {\toclevel@part}{#1}{#2}{\@contentsline@destination}% \fi }\par \endgroup} % \end{macrocode} % % \subsection{Appendices} % % Appendices (which are really just another sort of section heading) % raise a problem: if the sections are unnumbered, we plainly need to % restore the section numbering, which in turn allows labelling of % section numbers again (\cs{TBnolimelabel} happens before the % \cs{refstepcounter}, so its effects get lost \dots~what a clever % piece of design that was). So here we go: % % \begin{macrocode} \renewcommand{\appendix}{\par \renewcommand{\thesection}{\@Alph\c@section}% \setcounter{section}{0}% \if@numbersec \else \setcounter{secnumdepth}{1}% \fi % \end{macrocode} % % Now: is this the start of an appendix environment? This can be % detected by looking at \cs{@currenvir}; if we are, we need to relay % to \cs{@appendix@env} to pick up the optional argument. % % \begin{macrocode} \def\@tempa{appendix} \ifx\@tempa\@currenvir \expandafter\@appendix@env \fi } % \end{macrocode} % % Here we deal with \cs{begin}|{appendix}|\oarg{app-name} % % \begin{macrocode} \newcommand{\app@prefix@section}{} \newcommand{\@appendix@env}[1][Appendix]{% \renewcommand{\@seccntformat}[1]{\csname app@prefix@##1\endcsname \csname the##1\endcsname\quad}% \renewcommand{\app@prefix@section}{#1 }% } % \end{macrocode} % % Ending an appendix environment is pretty trivial\dots % % \begin{macrocode} \let\endappendix\relax % \end{macrocode} % % % \subsection{References} % % If the sections aren't numbered, the natural tendency of the % author to cross-reference (which, after all, is one of the things % \LaTeX{} is for ever being advertised as being good at) can cause % headaches. % % The following command is used by each of the sectioning commands to % make a following \cs{ref} command bloop at the author. Even if the % author then ignores the complaint, the poor old editor may find the % offending \cs{label} rather more easily. % % (Note that macro name is to be read as ``\emph{noli me} label'' (I % don't know the medi\ae val Latin for `label'). % % \begin{description} % \item[\emph{Comment}] To come (perhaps): detection of the act of % labelling, and an analogue of \cs{ifG@refundefined} for this sort of % label % \end{description} % % \begin{macrocode} \def\TB@nolimelabel{% \def\@currentlabel{% \protect\TBWarning{% Invalid reference to numbered label on page \thepage \MessageBreak made% }% \textbf{?!?}% }% } % \end{macrocode} % % \subsection{Title references} % % This is a first cut at a mechanism for referencing by the title of a % section; it employs the delightfully simple idea Sebastian Rahtz has % in the \texttt{nameref} package (which is part of % \texttt{hyperref}). As it stands, it lacks some of the bells and % whistles of the original, but they could be added; this is merely % proof-of-concept. % % The name label comes from the moveable bit of the section argument; % we subvert the \cs{@sect} and \cs{@ssect} commands (the latter % deals with starred section commands) to grab the relevant argument. % % As of the June 2023 \LaTeX\ (or somewhat earlier, but this is good % enough), there are hooks that allow us to avoid redefinig % \cs{@sect} and \cs{@ssect}. % % \begin{macrocode} \@ifl@t@r\fmtversion{2023-06-01}{}{% \let\TB@@sect\@sect \let\TB@@ssect\@ssect \def\@sect#1#2#3#4#5#6[#7]#8{% \def\@currentlabelname{#7}% \TB@@sect{#1}{#2}{#3}{#4}{#5}{#6}[{#7}]{#8}% } \def\@ssect#1#2#3#4#5{% \def\@currentlabelname{#5}% \TB@@ssect{#1}{#2}{#3}{#4}{#5}% } } % LaTeX earlier than June 2023 % \end{macrocode} % % We output the name label as a second \cs{newlabel} command % in the \texttt{.aux} file. That way, packages such as |varioref| % which also read the \texttt{.aux} information can still work. % So we redefine \cs{label} to first call the standard \LaTeX\ % \cs{label} and then write our named label as |nr % \end{macrocode} % % \section{Plain \TeX\ styles} % \begin{macrocode} %<*tugboatsty> % err... % %<*tugprocsty> % err... % % \end{macrocode} % \section{The \LaTeXe\ compatibility-mode style files} % \begin{macrocode} %<*ltugboatsty> \@obsoletefile{ltugboat.cls}{ltugboat.sty} \LoadClass{ltugboat} % %<*ltugprocsty> \@obsoletefile{ltugproc.cls}{ltugproc.sty} \LoadClass{ltugproc} % % \end{macrocode} % % ^^A \addtolength{\premulticols}{5\baselineskip} % \clearpage % % \Finale % \endinput % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~}