diff options
Diffstat (limited to 'Master/texmf-dist/source/latex-dev/base')
122 files changed, 86797 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex-dev/base/alltt.dtx b/Master/texmf-dist/source/latex-dev/base/alltt.dtx new file mode 100644 index 00000000000..358a0599029 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/alltt.dtx @@ -0,0 +1,213 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%% +%% File `alltt.dtx'. +%% Copyright (C) 1987 by Leslie Lamport +%% Copyright (C) 1994--1997 LaTeX3 project, Johannes Braams +%% all rights reserved. +%% +%<*dtx> +\ProvidesFile{alltt.dtx} +%</dtx> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{alltt} +%<driver>\ProvidesFile{alltt.drv} +%\ProvidesFile{alltt.dtx} + [1997/06/16 v2.0g defines alltt environment] +% +%<*driver> +\documentclass{ltxdoc} +\begin{document} +\providecommand{\Lenv}[1]{\textsf{#1}} +\providecommand{\pkg}[1]{\texttt{#1}} +\providecommand{\file}[1]{\texttt{#1}} +\DocInput{alltt.dtx} +\end{document} +%</driver> +% \fi +% +% \changes{v2.0g}{1997/06/16}{A few documentation fixes (PR 2520)} +% \changes{v2.0d}{1995/04/02}{A few documentation fixes (PR 1517)} +% +% \GetFileInfo{alltt.dtx} +% \title{The \texttt{alltt} environment\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{Johannes Braams} +% \date{\filedate} +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \begin{abstract} +% This package defines the \Lenv{alltt} environment, which is like +% the \Lenv{verbatim} environment except that |\|, |{|, and |}| +% have their usual meanings. +% +% Thus, other commands and environments can appear within an +% \Lenv{alltt} environment. +% \end{abstract} +% +% \section{Introduction} +% +% \DescribeEnv{alltt} +% Here are some things you may want to do in an \Lenv{alltt} +% environment: +% \begin{itemize} +% \item Change fonts--e.g., by typing |{\em emphasized text\/}| +% +% \item Insert text from a file \file{foo.tex} by typing +% |\input{foo}|. Beware that each |<return>| starts a new line, so +% if \file{foo.tex} ends with a |<return>| you can wind up with an +% extra blank line if you're not careful. +% +% \item Insert a math formula. Note that |$| just produces a dollar +% sign, so you'll have to type |\(...\)| or |\[...\]|. Also, |^| +% and |_| just produce their characters; use |\sp| or |\sb| for +% super- and subscripts, as in |\(x\sp{2}\)|. +% \end{itemize} +% +% \StopEventually{} +% +% \section{The Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{environment}{alltt} +% The \Lenv{alltt} environment is similar to the \Lenv{verbatim} +% environment, except that |\|, |{| and |}| have their usual +% behaviour. +% \changes{v2.0b}{1994/10/29}{Added a missing \cs{dospecials}} +% \changes{v2.0c}{1995/01/27}{Reset \cs{dospecials} after its changed +% version is executed} +% \changes{v2.0e}{1995/05/13}{brought definition up to date with the +% verbatim environment} +% \changes{v2.0e}{1995/05/13}{Save and restore (in math mode) the +% definition of the \texttt{'} character} +% \begin{macrocode} +\begingroup +\lccode`\~=`\' +\lowercase{\endgroup +\newenvironment{alltt}{% + \trivlist + \item\relax + \if@minipage + \else + \vskip\parskip + \fi + \leftskip\@totalleftmargin + \rightskip\z@skip + \parindent\z@ + \parfillskip\@flushglue + \parskip\z@skip + \@@par + \@tempswafalse + \def\par{% + \if@tempswa + \leavevmode\null\@@par\penalty\interlinepenalty + \else + \@tempswatrue + \ifhmode\@@par\penalty\interlinepenalty\fi + \fi} + \obeylines + \verbatim@font + \let\org@prime~% + \@noligs +% \end{macrocode} +% \changes{v2.0f}{1995/07/24}{Added setting of the \cs{catcode} of the +% \texttt{'} character} +% \begin{macrocode} + \everymath\expandafter{\the\everymath + \catcode`\'=12 \let~\org@prime} + \everydisplay\expandafter{\the\everydisplay + \catcode`\'=12 \let~\org@prime} + \let\org@dospecials\dospecials + \g@remfrom@specials{\\} + \g@remfrom@specials{\{} + \g@remfrom@specials{\}} + \let\do\@makeother + \dospecials + \let\dospecials\org@dospecials + \frenchspacing\@vobeyspaces + \everypar \expandafter{\the\everypar \unpenalty}} +{\endtrivlist}} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\g@remfrom@specials} +% In the old implementation of the \pkg{alltt} package a fixed +% |\dospecials| was used. However nowadays the |\dospecials| +% command might contain more special characters at run-time then as +% was defined in the format. Therefore we remove the necessary +% special character from |\dospecials| at the start of the +% \Lenv{alltt} environment. For this we need a macro. Remember that +% the list of special characters in |\dospecials| contains the +% control sequence |\do| between the characters. We use that to +% check whether a character has to be removed. +% +% The macro |\g@remfrom@specials| takes one argument, the chracter +% to be removed from the list. +% \begin{macrocode} +\def\g@remfrom@specials#1{% +% \end{macrocode} +% We build up a new list in |\@new@speicals|. +% \begin{macrocode} + \def\@new@specials{} +% \end{macrocode} +% The command |\@remove| compares its argument with the argument of\\ +% |\g@remfrom@specials|. +% \begin{macrocode} + \def\@remove##1{% + \ifx##1#1\else +% \end{macrocode} +% When they are not the same the argument of |\@remove| is added +% (together with |\do|) to the new list. +% \begin{macrocode} + \g@addto@macro\@new@specials{\do ##1}\fi} +% \end{macrocode} +% Now we |\let| |\do| be equal to |\@remove| and execute +% |\dospecials|. +% \begin{macrocode} + \let\do\@remove\dospecials +% \end{macrocode} +% All that's left is to make |\dospecials| point to the new list. +% \begin{macrocode} + \let\dospecials\@new@specials + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/alltt.ins b/Master/texmf-dist/source/latex-dev/base/alltt.ins new file mode 100644 index 00000000000..73d2d0b420b --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/alltt.ins @@ -0,0 +1,87 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generateFile{alltt.sty}{t}{% + \from{alltt.dtx}{package}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/classes.dtx b/Master/texmf-dist/source/latex-dev/base/classes.dtx new file mode 100644 index 00000000000..a2dde6ade16 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/classes.dtx @@ -0,0 +1,4470 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +% \section{Identification} +% +% These document classes can only be used with \LaTeXe, so we make +% sure that an appropriate message is displayed when another \TeX{} +% format is used. +% \changes{v1.3p}{1995/11/30}{Added date of \LaTeX\ format to argument +% of \cs{NeedsTeXFormat}} +% \begin{macrocode} +%<article|report|book>\NeedsTeXFormat{LaTeX2e}[1995/12/01] +% \end{macrocode} +% +% Announce the Class name and its version: +% \begin{macrocode} +%<article>\ProvidesClass{article} +%<report>\ProvidesClass{report} +%<book>\ProvidesClass{book} +%<10pt&!bk>\ProvidesFile{size10.clo} +%<11pt&!bk>\ProvidesFile{size11.clo} +%<12pt&!bk>\ProvidesFile{size12.clo} +%<10pt&bk>\ProvidesFile{bk10.clo} +%<11pt&bk>\ProvidesFile{bk11.clo} +%<12pt&bk>\ProvidesFile{bk12.clo} +%<*driver> +\ProvidesFile{classes.drv} +%</driver> + [2018/09/03 v1.4i +%<article|report|book> Standard LaTeX document class] +%<10pt|11pt|12pt> Standard LaTeX file (size option)] +% \end{macrocode} +% +% \section{A driver for this document} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the +% {\sc docstrip} program. +% +% \changes{1.0f}{1993/12/07}{Use class ltxdoc document class} +% \changes{1.0r}{1994/02/28}{Moved driver code in order not to need a +% separate driver} +% \begin{macrocode} +%<*driver> +] +\documentclass{ltxdoc} +% \end{macrocode} +% +% We don't want everything to appear in the index +% \begin{macrocode} +\DoNotIndex{\',\.,\@M,\@@input,\@Alph,\@alph,\@addtoreset,\@arabic} +\DoNotIndex{\@badmath,\@centercr,\@cite} +\DoNotIndex{\@dotsep,\@empty,\@float,\@gobble,\@gobbletwo,\@ignoretrue} +\DoNotIndex{\@input,\@ixpt,\@m,\@minus,\@mkboth} +\DoNotIndex{\@ne,\@nil,\@nomath,\@plus,\roman,\@set@topoint} +\DoNotIndex{\@tempboxa,\@tempcnta,\@tempdima,\@tempdimb} +\DoNotIndex{\@tempswafalse,\@tempswatrue,\@viipt,\@viiipt,\@vipt} +\DoNotIndex{\@vpt,\@warning,\@xiipt,\@xipt,\@xivpt,\@xpt,\@xviipt} +\DoNotIndex{\@xxpt,\@xxvpt,\\,\ ,\addpenalty,\addtolength,\addvspace} +\DoNotIndex{\advance,\ast,\begin,\begingroup,\bfseries,\bgroup,\box} +\DoNotIndex{\bullet} +\DoNotIndex{\cdot,\cite,\CodelineIndex,\cr,\day,\DeclareOption} +\DoNotIndex{\def,\DisableCrossrefs,\divide,\DocInput,\documentclass} +\DoNotIndex{\DoNotIndex,\egroup,\ifdim,\else,\fi,\em,\endtrivlist} +\DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup} +\DoNotIndex{\endlist,\everycr,\everypar,\ExecuteOptions,\expandafter} +\DoNotIndex{\fbox} +\DoNotIndex{\filedate,\filename,\fileversion,\fontsize,\framebox,\gdef} +\DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule} +\DoNotIndex{\hsize,\hskip,\hspace,\hss,\if@tempswa,\ifcase,\or,\fi,\fi} +\DoNotIndex{\ifhmode,\ifvmode,\ifnum,\iftrue,\ifx,\fi,\fi,\fi,\fi,\fi} +\DoNotIndex{\input} +\DoNotIndex{\jobname,\kern,\leavevmode,\let,\leftmark} +\DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark,\markboth,\markright} +\DoNotIndex{\month,\newcommand,\newcounter,\newenvironment} +\DoNotIndex{\NeedsTeXFormat,\newdimen} +\DoNotIndex{\newlength,\newpage,\nobreak,\noindent,\null,\number} +\DoNotIndex{\numberline,\OldMakeindex,\OnlyDescription,\p@} +\DoNotIndex{\pagestyle,\par,\paragraph,\paragraphmark,\parfillskip} +\DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions} +\DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright} +\DoNotIndex{\refstepcounter,\relax,\renewcommand} +\DoNotIndex{\rightmargin,\rightmark,\rightskip,\rlap,\rmfamily} +\DoNotIndex{\secdef,\selectfont,\setbox,\setcounter,\setlength} +\DoNotIndex{\settowidth,\sfcode,\skip,\sloppy,\slshape,\space} +\DoNotIndex{\symbol,\the,\trivlist,\typeout,\tw@,\undefined,\uppercase} +\DoNotIndex{\usecounter,\usefont,\usepackage,\vfil,\vfill,\viiipt} +\DoNotIndex{\viipt,\vipt,\vskip,\vspace} +\DoNotIndex{\wd,\xiipt,\year,\z@} +% \end{macrocode} +% We do want an index, using linenumbers +% \begin{macrocode} +\EnableCrossrefs +\CodelineIndex +% \end{macrocode} +% We use so many \file{docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from the file. +% \begin{macrocode} +\GetFileInfo{classes.drv} +% \end{macrocode} +% Some commonly used abbreviations +% \changes{v1.2w}{1994/12/01}{Use \cs{newcommand*}} +% \begin{macrocode} +\newcommand*{\Lopt}[1]{\textsf {#1}} +\newcommand*{\file}[1]{\texttt {#1}} +\newcommand*{\Lcount}[1]{\textsl {\small#1}} +\newcommand*{\pstyle}[1]{\textsl {#1}} +% \end{macrocode} +% We also want the full details. +% \begin{macrocode} +\begin{document} +\DocInput{classes.dtx} +\PrintIndex +% ^^A\PrintChanges +\end{document} +%</driver> +% \end{macrocode} +% +% \fi +% +% \changes{v1.0d}{1993/11/30}{remove \cs{@in}, made option makeindex +% a synonym for option makeidx} +% \changes{v1.0d}{1993/11/30}{removed \cs{@minus}, \cs{@plus}, +% \cs{@settopoint}, \cs{@setfontsize}; they are now in the +% kernel} +% \changes{v1.0d}{1993/11/30}{Added use of \cs{NeedsTeXFormat}} +% \changes{v1.0d}{1993/11/30}{Replaced \cs{bf} with \cs{bfseries}; +% \cs{rm} with \cs{rmfamily}} +% \changes{v1.0d}{1993/11/30}{Made equation and eqnarray environments +% in the fleqn option up to date with latex.dtx} +% \changes{v1.0f}{1993/12/08}{Made all lines shorter than 72 characters} +% \changes{v1.0g}{1993/12/08}{Made change in eqnarray for the fleqn +% option, as suggested by Rainer.} +% \changes{v1.0h}{1993/12/18}{Made the definitions of the font- and +% size-changing commands use \cs{renew} rather than \cs{new}. +% Defined the float parameters with \cs{renewcommand} rather than +% \cs{newcommand}. Corrected some typos in the fleqn option. +% Replaced two occurrences of -\cs{@secpenalty} by +% \cs{@secpenalty}. ASAJ.} +% \changes{v1.0j}{1993/12/20}{Added \cs{ProvidesFile} to size files} +% \changes{v1.0j}{1993/12/10}{Use \cs{cmd} in change entries} +% \changes{v1.0k}{1994/01/09}{Removed some typos/bugs} +% \changes{v1.0l}{1994/01/11}{add the extension to the names of the +% files} +% \changes{v1.0l}{1994/01/10}{Changed version numbering; moved leqno +% and fleqn options to an external file.} +% \changes{v1.0n}{1994/01/19}{Removed code for makeidx option and made +% it a separate package; removed use of \cs{setlength} from list +% parameters.} +% \changes{v1.0o}{1994/01/31}{Small documentation changes} +% \changes{v1.0q}{1994/02/16}{Small documentation changes} +% \changes{v1.1a}{1994/03/12}{Removed \cs{typeout} messages} +% \changes{v1.1f}{1994/04/15}{Inserted forgotten line break} +% \changes{v1.2a}{1994/03/17}{Added openright option. (LL)} +% \changes{v1.2b}{1994/03/17}{Added the \ldots{}matter commands. (LL)} +% \changes{v1.2c}{1994/03/17}{Fixed page numbering in titlepage +% env. (LL)} +% \changes{v1.2d}{1994/04/11}{Checked the file for long lines and +% wrapped them when necessary; made a slight implementation +% modification to the openright and openany options.} +% \changes{v1.2i}{1994/04/28}{Use LaTeX instead of LaTeX2e in messages} +% \changes{v1.2j}{1994/05/01}{Removed the use of \cs{fileversion} +% c.s.} +% \changes{v1.2l}{1994/05/11}{changed some \cs{changes} entries} +% \changes{v1.2m}{1994/05/12}{Forgot a few entries} +% \changes{v1.2o}{1994/05/24}{Changed file information} +% \changes{v1.2p}{1994/05/27}{Moved identification and driver to the +% front of the file} +% \changes{v1.2t}{1994/06/22}{Refrased a few sentences to prevent +% overfull hboxes} +% \changes{v1.2v}{1994/12/01}{Made the oneside option work for the +% book class} +% \changes{v1.2w}{1994/12/01}{Use \cs{newcommand*} for commands with +% arguments} +% \changes{v1.2z}{1995/05/16}{Always use \cs{cs} in \cs{changes} +% entries} +% \changes{v1.3a}{1995/05/17}{Replaced all \cs{hbox to} by \cs{hb@xt@}} +% \changes{v1.3d}{1995/06/05}{Replaced all \cs{uppercase} by +% \cs{MakeUppercase}} +% \changes{v1.3l}{1995/10/20}{Disabled in compatibility mode all +% options that are new in \LaTeXe.} +% \changes{v1.3v}{1997/06/16}{Documentation fixes.} +% +% +% \title{Standard Document Classes for \LaTeX{} version 2e\thanks{This +% file has version number \fileversion, last revised \filedate.}} +% +% \author{% +% Copyright (C) 1992 by Leslie Lamport \and +% Copyright (C) 1994-97 by Frank Mittelbach \and Johannes Braams +% } +% \date{\filedate} +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% \tableofcontents +% +% \StopEventually{} ^^A +% +% \section{The {\sc docstrip} modules} +% +% The following modules are used in the implementation to direct +% {\sc docstrip} in generating the external files: +% \begin{center} +% \begin{tabular}{ll} +% article & produce the documentclass article\\ +% report & produce the documentclass report\\ +% size10 & produce the class option for 10pt\\ +% size11 & produce the class option for 11pt\\ +% size12 & produce the class option for 12pt\\ +% book & produce the documentclass book\\ +% bk10 & produce the book class option for 10pt\\ +% bk11 & produce the book class option for 11pt\\ +% bk12 & produce the book class option for 12pt\\ +% driver & produce a documentation driver file \\ +% \end{tabular} +% \end{center} +% +% \section{Initial Code} +% +% In this part we define a few commands that are used later on. +% +% \begin{macro}{\@ptsize} +% This control sequence is used to store the second digit of the +% pointsize we are typesetting in. So, normally, it's value is one +% of 0, 1 or 2. +% \begin{macrocode} +%<*article|report|book> +\newcommand\@ptsize{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@restonecol} +% When the document has to be printed in two columns, we sometimes +% have to temporarily switch to one column. This switch is used to +% remember to switch back. +% \begin{macrocode} +\newif\if@restonecol +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@titlepage} +% A switch to indicate if a titlepage has to be produced. For the +% article document class the default is not to make a separate +% titlepage. +% \begin{macrocode} +\newif\if@titlepage +%<article>\@titlepagefalse +%<!article>\@titlepagetrue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@openright} +% A switch to indicate if chapters must start on a right-hand page. +% The default for the report class is no; for the book class it's +% yes. +% \begin{macrocode} +%<!article>\newif\if@openright +% \end{macrocode} +% \end{macro} +% +% \changes{v1.3k}{1995/08/27}{Macro \cs{if@openbib} removed} +% +% \begin{macro}{\if@mainmatter} +% \changes{v1.2v}{1994/12/01}{Moved the allocation of +% \cs{if@mainmatter} here} +% +% The switch |\if@mainmatter|, only available in the document class +% book, indicates whether we are processing the main material in +% the book. +% \begin{macrocode} +%<book>\newif\if@mainmatter \@mainmattertrue +% \end{macrocode} +% \end{macro} +% +% \section{Declaration of Options} +% +% +% \subsection{Setting Paper Sizes} +% +% The variables |\paperwidth| and |\paperheight| should reflect the +% physical paper size after trimming. For desk printer output this +% is usually the real paper size since there is no post-processing. +% Classes for real book production will probably add other paper +% sizes and additionally the production of crop marks for trimming. +% In compatibility mode, these (and some of the subsequent) options +% are disabled, as they were not present in \LaTeX 2.09. +% \changes{v1.0g}{1993/12/09}{Removed typo, A4 is not 279 mm high} +% \begin{macrocode} +\if@compatibility\else +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5paper} + {\setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}} +\DeclareOption{b5paper} + {\setlength\paperheight {250mm}% + \setlength\paperwidth {176mm}} +\DeclareOption{letterpaper} + {\setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{legalpaper} + {\setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{executivepaper} + {\setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}} +% \end{macrocode} +% +% The option \Lopt{landscape} switches the values of |\paperheight| +% and |\paperwidth|, assuming the dimensions were given for portrait +% paper. +% \begin{macrocode} +\DeclareOption{landscape} + {\setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}} +\fi +% \end{macrocode} +% +% \subsection{Choosing the type size} +% +% The type size options are handled by defining |\@ptsize| to contain +% the last digit of the size in question and branching on |\ifcase| +% statements. This is done for historical reasons to stay compatible +% with other packages that use the |\@ptsize| variable to select +% special actions. It makes the declarations of size options less +% than 10pt difficult, although one can probably use \texttt{9} +% and \texttt{8} assuming that a class wont define both +% \Lopt{8pt} and \Lopt{18pt} options. +% +% \begin{macrocode} +\if@compatibility + \renewcommand\@ptsize{0} +\else +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\fi +\DeclareOption{11pt}{\renewcommand\@ptsize{1}} +\DeclareOption{12pt}{\renewcommand\@ptsize{2}} +% \end{macrocode} +% +% +% \subsection{Two-side or one-side printing} +% +% For two-sided printing we use the switch |\if@twoside|. In +% addition we have to set the |\if@mparswitch| to get any margin +% paragraphs into the outside margin. +% \begin{macrocode} +\if@compatibility\else +\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} +\fi +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +% \end{macrocode} +% +% +% \subsection{Draft option} +% +% If the user requests \Lopt{draft} we show any overfull boxes. +% We could probably add some more interesting stuff to this option. +% \begin{macrocode} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\if@compatibility\else +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\fi +% \end{macrocode} +% +% \subsection{Titlepage option} +% An article usually has no separate titlepage, but the user can +% request one. +% \begin{macrocode} +\DeclareOption{titlepage}{\@titlepagetrue} +\if@compatibility\else +\DeclareOption{notitlepage}{\@titlepagefalse} +\fi +% \end{macrocode} +% +% \subsection{openright option} +% This option determines whether or not a chapter must start on +% a right-hand page +% request one. +% \begin{macrocode} +%<!article>\if@compatibility +%<book>\@openrighttrue +%<!article>\else +%<!article>\DeclareOption{openright}{\@openrighttrue} +%<!article>\DeclareOption{openany}{\@openrightfalse} +%<!article>\fi +% \end{macrocode} +% +% \subsection{Twocolumn printing} +% +% Two-column and one-column printing is again realized via a switch. +% \begin{macrocode} +\if@compatibility\else +\DeclareOption{onecolumn}{\@twocolumnfalse} +\fi +\DeclareOption{twocolumn}{\@twocolumntrue} +% \end{macrocode} +% +% \subsection{Equation numbering on the left} +% +% The option \Lopt{leqno} can be used to get the equation numbers +% on the left side of the equation. It loads code which is generated +% automatically from the kernel files when the format is built. +% If the equation number does get a special formatting then instead +% of using the kernel file the class would need to provide the code +% explicitly. +% \begin{macrocode} +\DeclareOption{leqno}{\input{leqno.clo}} +% \end{macrocode} +% +% \subsection{Flush left displays} +% +% The option \Lopt{fleqn} redefines the displayed math environments +% in such a way that they come out flush left, with an indentation +% of |\mathindent| from the prevailing left margin. It loads +% code which is generated +% automatically from the kernel files when the format is built. +% \changes{v1.0h}{1993/12/18}{Corrected some typos. ASAJ.} +% \begin{macrocode} +\DeclareOption{fleqn}{\input{fleqn.clo}} +% \end{macrocode} +% +% \subsection{Open bibliography} +% +% The option \Lopt{openbib} produces the ``open'' bibliography +% style, in which each block starts on a new line, and succeeding +% lines in a block are indented by |\bibindent|. +% \changes{v1.3k}{1995/08/27}{openbib option reimplemented} +% \begin{macrocode} +\DeclareOption{openbib}{% +% \end{macrocode} +% First some hook into the bibliography environment is filled. +% \begin{macrocode} + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% +% \end{macrocode} +% In addition the definition of |\newblock| is overwritten. +% \begin{macrocode} + \renewcommand\newblock{\par}}% +} +% \end{macrocode} +% +% +% \section{Executing Options} +% +% Here we execute the default options to initialize certain +% variables. Note that the document class `book' always uses two +% sided printing. +% \begin{macrocode} +%<*article> +\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final} +%</article> +%<*report> +\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final,openany} +%</report> +%<*book> +\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright} +%</book> +% \end{macrocode} +% +% The |\ProcessOptions| command causes the execution of the code +% for every option \Lopt{FOO} +% which is declared and for which the user typed +% the \Lopt{FOO} option in his +% |\documentclass| command. For every option \Lopt{BAR} he typed, +% which is not declared, the option is assumed to be a global option. +% All options will be passed as document options to any +% |\usepackage| command in the document preamble. +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% Now that all the options have been executed we can load the +% chosen class option file that contains all size dependent code. +% \begin{macrocode} +%<!book>\input{size1\@ptsize.clo} +%<book>\input{bk1\@ptsize.clo} +%</article|report|book> +% \end{macrocode} +% +% \section{Loading Packages} +% +% The standard class files do not load additional packages. +% +% +% \section{Document Layout} +% \label{sec:classes:maincode} +% +% In this section we are finally dealing with the nasty typographical +% details. +% +% \subsection{Fonts} +% +% \LaTeX\ offers the user commands to change the size of the font, +% relative to the `main' size. Each relative size changing command +% |\size| executes the command +% |\@setfontsize||\size|\meta{font-size}\meta{baselineskip} where: +% +% \begin{description} +% \item[\meta{font-size}] The absolute size of the font to use from +% now on. +% +% \item[\meta{baselineskip}] The normal value of |\baselineskip| +% for the size of the font selected. (The actual value will be +% |\baselinestretch| * \meta{baselineskip}.) +% \end{description} +% +% A number of commands, defined in the \LaTeX{} kernel, shorten the +% following definitions and are used throughout. They are: +% \begin{center} +% \begin{tabular}{ll@{\qquad}ll@{\qquad}ll} +% \verb=\@vpt= & 5 & \verb=\@vipt= & 6 & \verb=\@viipt= & 7 \\ +% \verb=\@viiipt= & 8 & \verb=\@ixpt= & 9 & \verb=\@xpt= & 10 \\ +% \verb=\@xipt= & 10.95 & \verb=\@xiipt= & 12 & \verb=\@xivpt= & 14.4\\ +% ... +% \end{tabular} +% \end{center} +% +% \begin{macro}{\normalsize} +% \begin{macro}{\@normalsize} +% \changes{v1.0o}{1994/01/31}{\cs{@normalsize} now defined in the +% kernel} +% +% The user level command for the main size is |\normalsize|. +% Internally \LaTeX{} uses |\@normalsize| when it refers to the +% main size. |\@normalsize| will be defined to work like +% |\normalsize| if the latter is redefined from its default +% definition (that just issues an error message). Otherwise +% |\@normalsize| simply selects a 10pt/12pt size. +% +% The |\normalsize| macro also sets new values for\\ +% |\abovedisplayskip|, |\abovedisplayshortskip| and +% |\belowdisplayshortskip|. +% +% \changes{v1.0e}{1993/12/07}{\cs{normalsize} doesn't exist, so use +% \cs{newcommand}} +% \changes{v1.0h}{1993/12/18}{\cs{normalsize} is now defined in the +% kernel, so use \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +%<*10pt|11pt|12pt> +\renewcommand\normalsize{% +%<*10pt> + \@setfontsize\normalsize\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ +%</10pt> +%<*11pt> + \@setfontsize\normalsize\@xipt{13.6}% + \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ +%</11pt> +%<*12pt> + \@setfontsize\normalsize\@xiipt{14.5}% + \abovedisplayskip 12\p@ \@plus3\p@ \@minus7\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ +%</12pt> +% \end{macrocode} +% The |\belowdisplayskip| is always equal to the +% |\abovedisplayskip|. The parameters of the first level list are +% always given by |\@listI|. +% \begin{macrocode} + \belowdisplayskip \abovedisplayskip + \let\@listi\@listI} +% \end{macrocode} +% +% We initially choose the normalsize font. +% \begin{macrocode} +\normalsize +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\small} +% This is similar to |\normalsize|. +% \changes{v1.0h}{1993/12/18}{\cs{small} is now defined in the kernel, +% so use \cs{renewcommand}. ASAJ.} +% \changes{v1.2e}{1994/04/14}{\cs{small} is no longer defined in the +% kernel; use \cs{newcommand}} +% \begin{macrocode} +\newcommand\small{% +%<*10pt> + \@setfontsize\small\@ixpt{11}% + \abovedisplayskip 8.5\p@ \@plus3\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus2\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% +%</10pt> +%<*11pt> + \@setfontsize\small\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% +%</11pt> +%<*12pt> + \@setfontsize\small\@xipt{13.6}% + \abovedisplayskip 11\p@ \@plus3\p@ \@minus6\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6.5\p@ \@plus3.5\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 9\p@ \@plus3\p@ \@minus5\p@ + \parsep 4.5\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% +%</12pt> + \belowdisplayskip \abovedisplayskip +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotesize} +% This is similar to |\normalsize|. +% \changes{v1.0h}{1993/12/18}{\cs{footnotesize} is now defined in the +% kernel, so use \cs{renewcommand}. ASAJ.} +% \changes{v1.2e}{1994/04/14}{use \cs{newcommand} again} +% \begin{macrocode} +\newcommand\footnotesize{% +%<*10pt> + \@setfontsize\footnotesize\@viiipt{9.5}% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 3\p@ \@plus\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 3\p@ \@plus\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% +%</10pt> +%<*11pt> + \@setfontsize\footnotesize\@ixpt{11}% + \abovedisplayskip 8\p@ \@plus2\p@ \@minus4\p@ + \abovedisplayshortskip \z@ \@plus\p@ + \belowdisplayshortskip 4\p@ \@plus2\p@ \@minus2\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 4\p@ \@plus2\p@ \@minus2\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ + \itemsep \parsep}% +%</11pt> +%<*12pt> + \@setfontsize\footnotesize\@xpt\@xiipt + \abovedisplayskip 10\p@ \@plus2\p@ \@minus5\p@ + \abovedisplayshortskip \z@ \@plus3\p@ + \belowdisplayshortskip 6\p@ \@plus3\p@ \@minus3\p@ + \def\@listi{\leftmargin\leftmargini + \topsep 6\p@ \@plus2\p@ \@minus2\p@ + \parsep 3\p@ \@plus2\p@ \@minus\p@ + \itemsep \parsep}% +%</12pt> + \belowdisplayskip \abovedisplayskip +} +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\scriptsize} +% \begin{macro}{\tiny} +% \begin{macro}{\large} +% \begin{macro}{\Large} +% \begin{macro}{\LARGE} +% \begin{macro}{\huge} +% \begin{macro}{\Huge} +% These are all much simpler than the previous macros, they just +% select a new fontsize, but leave the parameters for displays and +% lists alone. +% \changes{v1.0h}{1993/12/18}{These are now defined in the kernel, +% so use \cs{renewcommand}. ASAJ.} +% \changes{v1.2e}{1994/04/14}{use \cs{newcommand} again} +% \begin{macrocode} +%<*10pt> +\newcommand\scriptsize{\@setfontsize\scriptsize\@viipt\@viiipt} +\newcommand\tiny{\@setfontsize\tiny\@vpt\@vipt} +\newcommand\large{\@setfontsize\large\@xiipt{14}} +\newcommand\Large{\@setfontsize\Large\@xivpt{18}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +%</10pt> +%<*11pt> +\newcommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}} +\newcommand\tiny{\@setfontsize\tiny\@vipt\@viipt} +\newcommand\large{\@setfontsize\large\@xiipt{14}} +\newcommand\Large{\@setfontsize\Large\@xivpt{18}} +\newcommand\LARGE{\@setfontsize\LARGE\@xviipt{22}} +\newcommand\huge{\@setfontsize\huge\@xxpt{25}} +\newcommand\Huge{\@setfontsize\Huge\@xxvpt{30}} +%</11pt> +%<*12pt> +\newcommand\scriptsize{\@setfontsize\scriptsize\@viiipt{9.5}} +\newcommand\tiny{\@setfontsize\tiny\@vipt\@viipt} +\newcommand\large{\@setfontsize\large\@xivpt{18}} +\newcommand\Large{\@setfontsize\Large\@xviipt{22}} +\newcommand\LARGE{\@setfontsize\LARGE\@xxpt{25}} +\newcommand\huge{\@setfontsize\huge\@xxvpt{30}} +\let\Huge=\huge +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsection{Paragraphing} +% +% \begin{macro}{\lineskip} +% \begin{macro}{\normallineskip} +% These parameters control \TeX's behaviour when two lines tend to +% come too close together. +% \begin{macrocode} +%<*article|report|book> +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\baselinestretch} +% This is used as a multiplier for |\baselineskip|. The default is +% to \emph{not} stretch the baselines. Note that if this command +% doesn't resolve to ``empty'' any \texttt{plus} or \texttt{minus} +% part in the specification of |\baselineskip| is ignored. +% \begin{macrocode} +\renewcommand\baselinestretch{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parskip} +% \begin{macro}{\parindent} +% |\parskip| gives extra vertical space between paragraphs and +% |\parindent| is the width of the paragraph indentation. The value +% of |\parindent| depends on whether we are in two column mode. +% \changes{v1.0m}{1994/01/12}{\cs{parindent} should be different, +% depending on the pointsize} +% \begin{macrocode} +\setlength\parskip{0\p@ \@plus \p@} +%</article|report|book> +%<*10pt|11pt|12pt> +\if@twocolumn + \setlength\parindent{1em} +\else +%<10pt> \setlength\parindent{15\p@} +%<11pt> \setlength\parindent{17\p@} +%<12pt> \setlength\parindent{1.5em} +\fi +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\smallskipamount} +% \begin{macro}{\medskipamount} +% \begin{macro}{\bigskipamount} +% The values for these three parameters are set in the \LaTeX\ +% kernel. They should perhaps vary, according to the size option +% specified. But as they have always had the same value regardless +% of the size option we do not change them to stay compatible with +% both \LaTeX~2.09 and older releases of \LaTeXe. +% \changes{v1.3n}{1995/10/29}{Added setting the values of +% \cs{...skipamount}} +% \begin{macrocode} +%<*10pt|11pt|12pt> +\setlength\smallskipamount{3\p@ \@plus 1\p@ \@minus 1\p@} +\setlength\medskipamount{6\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\bigskipamount{12\p@ \@plus 4\p@ \@minus 4\p@} +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@lowpenalty} +% \begin{macro}{\@medpenalty} +% \begin{macro}{\@highpenalty}% +% The commands |\nopagebreak| and |\nolinebreak| put in penalties +% to discourage these breaks at the point they are put in. +% They use |\@lowpenalty|, |\@medpenalty| or |\@highpenalty|, +% dependent on their argument. +% \begin{macrocode} +%<*article|report|book> +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\clubpenalty} +% \begin{macro}{\widowpenalty} +% These penalties are use to discourage club and widow lines. +% Because we use their default values we only show them here, +% commented out. +% \begin{macrocode} +% \clubpenalty 150 +% \widowpenalty 150 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\displaywidowpenalty} +% \begin{macro}{\predisplaypenalty} +% \begin{macro}{\postdisplaypenalty} +% Discourage (but not so much) widows in front of a math display +% and forbid breaking directly in front of a display. Allow break +% after a display without a penalty. Again the default values are +% used, therefore we only show them here. +% \begin{macrocode} +% \displaywidowpenalty 50 +% \predisplaypenalty 10000 +% \postdisplaypenalty 0 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\interlinepenalty} +% Allow the breaking of a page in the middle of a paragraph. +% \begin{macrocode} +% \interlinepenalty 0 +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\brokenpenalty} +% We allow the breaking of a page after a hyphenated line. +% \changes{v1.1a}{1994/03/12}{Show correct default which is 100} +% \begin{macrocode} +% \brokenpenalty 100 +%</article|report|book> +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Page Layout} +% +% All margin dimensions are measured from a point one inch from the +% top and lefthand side of the page. +% +% \subsubsection{Vertical spacing} +% +% \begin{macro}{\headheight} +% \begin{macro}{\headsep} +% \begin{macro}{\topskip} +% The |\headheight| is the height of the box that will contain the +% running head. The |\headsep| is the distance between the bottom +% of the running head and the top of the text. The |\topskip| is +% the |\baselineskip| for the first line on a page; \LaTeX's output +% routine will not work properly if it has the value 0pt, so do not +% do that! +% \begin{macrocode} +%<*10pt|11pt|12pt> +\setlength\headheight{12\p@} +%<!bk>\setlength\headsep {25\p@} +%<10pt&bk>\setlength\headsep {.25in} +%<11pt&bk>\setlength\headsep {.275in} +%<12pt&bk>\setlength\headsep {.275in} +%<10pt>\setlength\topskip {10\p@} +%<11pt>\setlength\topskip {11\p@} +%<12pt>\setlength\topskip {12\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footskip} +% The distance from the baseline of the box which contains the +% running footer to the baseline of last line of text is controlled +% by the |\footskip|. +% \begin{macrocode} +%<!bk>\setlength\footskip{30\p@} +%<10pt&bk>\setlength\footskip{.35in} +%<11pt&bk>\setlength\footskip{.38in} +%<12pt&bk>\setlength\footskip{30\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxdepth} +% \changes{v1.2k}{1994/05/06}{Added setting of \cs{maxdepth} and +% \cs{@maxdepth}} +% \changes{v1.3j}{1995/08/16}{Take setting of +% \cs{@maxdepth} out again} +% The \TeX\ primitive register |\maxdepth| has a function that is +% similar to that of |\topskip|. The register |\@maxdepth| should +% always contain a copy of |\maxdepth|. This is achieved by setting +% it internally at |\begin{document}|. In both plain \TeX\ and +% \LaTeX~2.09 |\maxdepth| had a fixed value of \texttt{4pt}; in +% native \LaTeX2e\ mode we let the value depend on the typesize. We +% set it so that |\maxdepth| $+$ |\topskip| $=$ typesize $\times +% 1.5$. As it happens, in these classes |\topskip| is equal to the +% typesize, therefore we set |\maxdepth| to half the value of +% |\topskip|. +% \begin{macrocode} +\if@compatibility \setlength\maxdepth{4\p@} \else +\setlength\maxdepth{.5\topskip} \fi +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The dimension of text} +% +% \begin{macro}{\textwidth} +% When we are in compatibility mode we have to make sure that the +% dimensions of the printed area are not different from what the +% user was used to see. +% +% \begin{macrocode} +\if@compatibility + \if@twocolumn + \setlength\textwidth{410\p@} + \else +%<10pt&!bk> \setlength\textwidth{345\p@} +%<11pt&!bk> \setlength\textwidth{360\p@} +%<12pt&!bk> \setlength\textwidth{390\p@} +%<10pt&bk> \setlength\textwidth{4.5in} +%<11pt&bk> \setlength\textwidth{5in} +%<12pt&bk> \setlength\textwidth{5in} + \fi +% \end{macrocode} +% When we are not in compatibility mode we can set some of the +% dimensions differently, taking into account the paper size for +% instance. +% \begin{macrocode} +\else +% \end{macrocode} +% First, we calculate the maximum |\textwidth|, which we will allow +% on the selected paper and store it in |\@tempdima|. Then we store +% the length of a line with approximately 60--70 characters in +% |\@tempdimb|. The values given are more or less suitable when +% Computer Modern fonts are used. +% \changes{v1.1a}{1994/03/12}{Have old values for width in native mode} +% \begin{macrocode} + \setlength\@tempdima{\paperwidth} + \addtolength\@tempdima{-2in} +%<10pt> \setlength\@tempdimb{345\p@} +%<11pt> \setlength\@tempdimb{360\p@} +%<12pt> \setlength\@tempdimb{390\p@} +% \end{macrocode} +% +% Now we can set the |\textwidth|, depending on whether we will be +% setting one or two columns. +% +% In two column mode each \emph{column} shouldn't be wider than +% |\@tempdimb| (which could happen on \textsc{a3} paper for +% instance). +% \begin{macrocode} + \if@twocolumn + \ifdim\@tempdima>2\@tempdimb\relax + \setlength\textwidth{2\@tempdimb} + \else + \setlength\textwidth{\@tempdima} + \fi +% \end{macrocode} +% +% In one column mode the text should not be wider than the minimum +% of the paperwidth (minus 2 inches for the margins) and the +% maximum length of a line as defined by the number of characters. +% \begin{macrocode} + \else + \ifdim\@tempdima>\@tempdimb\relax + \setlength\textwidth{\@tempdimb} + \else + \setlength\textwidth{\@tempdima} + \fi + \fi +\fi +% \end{macrocode} +% +% Here we modify the width of the text a little to be a whole +% number of points. +% \begin{macrocode} +\if@compatibility\else + \@settopoint\textwidth +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textheight} +% Now that we have computed the width of the text, we have to take +% care of the height. The |\textheight| is the height of text +% (including footnotes and figures, excluding running head and +% foot). +% +% First make sure that the compatibility mode gets the same +% dimensions as we had with \LaTeX2.09. The number of lines was +% calculated as the floor of the old |\textheight| minus +% |\topskip|, divided by |\baselineskip| for |\normalsize|. The +% old value of |\textheight| was 528pt. +% +% \begin{macrocode} +\if@compatibility +%<10pt&!bk> \setlength\textheight{43\baselineskip} +%<10pt&bk> \setlength\textheight{41\baselineskip} +%<11pt> \setlength\textheight{38\baselineskip} +%<12pt> \setlength\textheight{36\baselineskip} +% \end{macrocode} +% +% Again we compute this, depending on the papersize and depending +% on the baselineskip that is used, in order to have a whole number +% of lines on the page. +% \begin{macrocode} +\else + \setlength\@tempdima{\paperheight} +% \end{macrocode} +% +% We leave at least a 1 inch margin on the top and the bottom of +% the page. +% \begin{macrocode} + \addtolength\@tempdima{-2in} +% \end{macrocode} +% +% We also have to leave room for the running headers and footers. +% \begin{macrocode} + \addtolength\@tempdima{-1.5in} +% \end{macrocode} +% +% Then we divide the result by the current |\baselineskip| and +% store this in the count register |\@tempcnta|, which then +% contains the number of lines that fit on this page. +% \begin{macrocode} + \divide\@tempdima\baselineskip + \@tempcnta=\@tempdima +% \end{macrocode} +% +% From this we can calculate the height of the text. +% \begin{macrocode} + \setlength\textheight{\@tempcnta\baselineskip} +\fi +% \end{macrocode} +% +% The first line on the page has a height of |\topskip|. +% \begin{macrocode} +\addtolength\textheight{\topskip} +% \end{macrocode} +% \end{macro} +% +% +% +% \subsubsection{Margins} +% +% Most of the values of these parameters are now calculated, based +% on the papersize in use. In the calculations the |\marginparsep| +% needs to be taken into account so we give it its value first. +% +% \begin{macro}{\marginparsep} +% \begin{macro}{\marginparpush} +% The horizontal space between the main text and marginal notes is +% determined by |\marginparsep|, the minimum vertical separation +% between two marginal notes is controlled by |\marginparpush|. +% \begin{macrocode} +\if@twocolumn + \setlength\marginparsep {10\p@} +\else +%<10pt&!bk> \setlength\marginparsep{11\p@} +%<11pt&!bk> \setlength\marginparsep{10\p@} +%<12pt&!bk> \setlength\marginparsep{10\p@} +%<bk> \setlength\marginparsep{7\p@} +\fi +%<10pt|11pt>\setlength\marginparpush{5\p@} +%<12pt>\setlength\marginparpush{7\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Now we can give the values for the other margin parameters. For +% native \LaTeXe, these are calculated. +% \begin{macro}{\oddsidemargin} +% \begin{macro}{\evensidemargin} +% \begin{macro}{\marginparwidth} +% First we give the values for the compatibility mode. +% +% Values for two-sided printing: +% \begin{macrocode} +\if@compatibility +%<*bk> +%<10pt> \setlength\oddsidemargin {.5in} +%<11pt> \setlength\oddsidemargin {.25in} +%<12pt> \setlength\oddsidemargin {.25in} +%<10pt> \setlength\evensidemargin {1.5in} +%<11pt> \setlength\evensidemargin {1.25in} +%<12pt> \setlength\evensidemargin {1.25in} +%<10pt> \setlength\marginparwidth {.75in} +%<11pt> \setlength\marginparwidth {1in} +%<12pt> \setlength\marginparwidth {1in} +%</bk> +%<*!bk> + \if@twoside +%<10pt> \setlength\oddsidemargin {44\p@} +%<11pt> \setlength\oddsidemargin {36\p@} +%<12pt> \setlength\oddsidemargin {21\p@} +%<10pt> \setlength\evensidemargin {82\p@} +%<11pt> \setlength\evensidemargin {74\p@} +%<12pt> \setlength\evensidemargin {59\p@} +%<10pt> \setlength\marginparwidth {107\p@} +%<11pt> \setlength\marginparwidth {100\p@} +%<12pt> \setlength\marginparwidth {85\p@} +% \end{macrocode} +% Values for one-sided printing: +% \begin{macrocode} + \else +%<10pt> \setlength\oddsidemargin {63\p@} +%<11pt> \setlength\oddsidemargin {54\p@} +%<12pt> \setlength\oddsidemargin {39.5\p@} +%<10pt> \setlength\evensidemargin {63\p@} +%<11pt> \setlength\evensidemargin {54\p@} +%<12pt> \setlength\evensidemargin {39.5\p@} +%<10pt> \setlength\marginparwidth {90\p@} +%<11pt> \setlength\marginparwidth {83\p@} +%<12pt> \setlength\marginparwidth {68\p@} + \fi +%</!bk> +% \end{macrocode} +% And values for two column mode: +% \begin{macrocode} + \if@twocolumn + \setlength\oddsidemargin {30\p@} + \setlength\evensidemargin {30\p@} + \setlength\marginparwidth {48\p@} + \fi +% \end{macrocode} +% +% When we are not in compatibility mode we can take the dimensions +% of the selected paper into account. +% +% The values for |\oddsidemargin| and |\marginparwidth| will be set +% depending on the status of the |\if@twoside|. +% +% If |@twoside| is true (which is always the case for book) we make +% the inner margin smaller than the outer one. +% \begin{macrocode} +\else + \if@twoside + \setlength\@tempdima {\paperwidth} + \addtolength\@tempdima {-\textwidth} + \setlength\oddsidemargin {.4\@tempdima} + \addtolength\oddsidemargin {-1in} +% \end{macrocode} +% The width of the margin for text is set to the remainder of the +% width except for a `real margin' of white space of width 0.4in. +% A check should perhaps be built in to ensure that the (text) +% margin width does not get too small! +% +% \changes{v1.1a}{1994/03/12}{New algorithm for \cs{oddsidemargin}} +% \changes{v1.1a}{1994/03/12}{New algorithm for \cs{marginparwidth}} +% \changes{v1.2z}{1995/04/14}{Also take \cs{marginparsep} into account +% here} +% \begin{macrocode} + \setlength\marginparwidth {.6\@tempdima} + \addtolength\marginparwidth {-\marginparsep} + \addtolength\marginparwidth {-0.4in} +% \end{macrocode} +% For one-sided printing we center the text on the page, by +% calculating the difference between |\textwidth| and +% |\paperwidth|. Half of that difference is than used for +% the margin (thus |\oddsidemargin| is |1in| less). +% \begin{macrocode} + \else + \setlength\@tempdima {\paperwidth} + \addtolength\@tempdima {-\textwidth} + \setlength\oddsidemargin {.5\@tempdima} + \addtolength\oddsidemargin {-1in} + \setlength\marginparwidth {.5\@tempdima} + \addtolength\marginparwidth {-\marginparsep} + \addtolength\marginparwidth {-0.4in} + \addtolength\marginparwidth {-.4in} + \fi +% \end{macrocode} +% With the above algorithm the |\marginparwidth| can come out quite +% large which we may not want. +% \begin{macrocode} + \ifdim \marginparwidth >2in + \setlength\marginparwidth{2in} + \fi +% \end{macrocode} +% Having done these calculations we make them pt values. +% \begin{macrocode} + \@settopoint\oddsidemargin + \@settopoint\marginparwidth +% \end{macrocode} +% +% The |\evensidemargin| can now be computed from the values set +% above. +% \changes{v1.0l}{1994/01/11}{Computing of \cs{evensidemargin} +% should only occur in compatibility mode} +% \begin{macrocode} + \setlength\evensidemargin {\paperwidth} + \addtolength\evensidemargin{-2in} + \addtolength\evensidemargin{-\textwidth} + \addtolength\evensidemargin{-\oddsidemargin} +% \end{macrocode} +% Setting |\evensidemargin| to a full point value may produce a +% small error. However it will lie within the error range a +% doublesided printer of today's technology can accurately print. +% \begin{macrocode} + \@settopoint\evensidemargin +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\topmargin} +% The |\topmargin| is the distance between the top of `the +% printable area'---which is 1 inch below the top of the +% paper--and the top of the box which contains the running head. +% +% It can now be computed from the values set above. +% \begin{macrocode} +\if@compatibility +%<!bk> \setlength\topmargin{27pt} +%<10pt&bk> \setlength\topmargin{.75in} +%<11pt&bk> \setlength\topmargin{.73in} +%<12pt&bk> \setlength\topmargin{.73in} +\else + \setlength\topmargin{\paperheight} + \addtolength\topmargin{-2in} + \addtolength\topmargin{-\headheight} + \addtolength\topmargin{-\headsep} + \addtolength\topmargin{-\textheight} + \addtolength\topmargin{-\footskip} % this might be wrong! +% \end{macrocode} +% By changing the factor in the next line the complete page +% can be shifted vertically. +% \changes{v1.2u}{1994/07/13}{Moved rounding of \cs{topmargin} to +% native mode} +% \begin{macrocode} + \addtolength\topmargin{-.5\topmargin} + \@settopoint\topmargin +\fi +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Footnotes} +% +% \begin{macro}{\footnotesep} +% |\footnotesep| is the height of the strut placed at the beginning +% of every footnote. It equals the height of a normal +% |\footnotesize| strut in this +% class, thus no extra space occurs between footnotes. +% \begin{macrocode} +%<10pt>\setlength\footnotesep{6.65\p@} +%<11pt>\setlength\footnotesep{7.7\p@} +%<12pt>\setlength\footnotesep{8.4\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footins} +% |\skip\footins| is the space between the last line of the main +% text and the top of the first footnote. +% \begin{macrocode} +%<10pt>\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@} +%<11pt>\setlength{\skip\footins}{10\p@ \@plus 4\p@ \@minus 2\p@} +%<12pt>\setlength{\skip\footins}{10.8\p@ \@plus 4\p@ \@minus 2\p@} +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Float placement parameters} +% +% All float parameters are given default values in the \LaTeXe{} +% kernel. For this reason parameters that are not counters +% need to be set with |\renewcommand|. +% +% \paragraph{Limits for the placement of floating objects} +% +% \begin{macro}{\c@topnumber} +% The \Lcount{topnumber} counter holds the maximum number of +% floats that can appear on the top of a text page. +% \begin{macrocode} +%<*article|report|book> +\setcounter{topnumber}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\topfraction} +% This indicates the maximum part of a text page that can be +% occupied by floats at the top. +% \changes{v1.0h}{1993/12/18}{Replaced \cs{newcommand} with +% \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +\renewcommand\topfraction{.7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@bottomnumber} +% The \Lcount{bottomnumber} counter holds the maximum number of +% floats that can appear on the bottom of a text page. +% \begin{macrocode} +\setcounter{bottomnumber}{1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bottomfraction} +% This indicates the maximum part of a text page that can be +% occupied by floats at the bottom. +% \changes{v1.0h}{1993/12/18}{Replaced \cs{newcommand} with +% \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +\renewcommand\bottomfraction{.3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@totalnumber} +% This indicates the maximum number of floats that can appear on +% any text page. +% \begin{macrocode} +\setcounter{totalnumber}{3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textfraction} +% This indicates the minimum part of a text page that has to be +% occupied by text. +% \changes{v1.0h}{1993/12/18}{Replaced \cs{newcommand} with +% \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +\renewcommand\textfraction{.2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\floatpagefraction} +% This indicates the minimum part of a page that has to be +% occupied by floating objects before a `float page' is produced. +% \changes{v1.0h}{1993/12/18}{Replaced \cs{newcommand} with +% \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +\renewcommand\floatpagefraction{.5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@dbltopnumber} +% The \Lcount{dbltopnumber} counter holds the maximum number of +% two column floats that can appear on the top of a two column text +% page. +% \begin{macrocode} +\setcounter{dbltopnumber}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dbltopfraction} +% This indicates the maximum part of a two column text page that +% can be occupied by two column floats at the top. +% \changes{v1.0h}{1993/12/18}{Replaced \cs{newcommand} with +% \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +\renewcommand\dbltopfraction{.7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dblfloatpagefraction} +% This indicates the minimum part of a page that has to be +% occupied by two column wide floating objects before a `float +% page' is produced. +% \changes{v1.0h}{1993/12/18}{Replaced \cs{newcommand} with +% \cs{renewcommand}. ASAJ.} +% \begin{macrocode} +\renewcommand\dblfloatpagefraction{.5} +%</article|report|book> +% \end{macrocode} +% \end{macro} +% +% \paragraph{Floats on a text page} +% +% \begin{macro}{\floatsep} +% \begin{macro}{\textfloatsep} +% \begin{macro}{\intextsep} +% When a floating object is placed on a page with text, these +% parameters control the separation between the float and the other +% objects on the page. These parameters are used for both +% one-column mode and single-column floats in two-column mode. +% +% |\floatsep| is the space between adjacent floats that are moved +% to the top or bottom of the text page. +% +% |\textfloatsep| is the space between the main text and floats +% at the top or bottom of the page. +% +% |\intextsep| is the space between in-text floats and the text. +% \begin{macrocode} +%<*10pt> +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@} +%</10pt> +%<*11pt> +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@} +%</11pt> +%<*12pt> +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {14\p@ \@plus 4\p@ \@minus 4\p@} +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dblfloatsep} +% \begin{macro}{\dbltextfloatsep} +% When floating objects that span the whole |\textwidth| are placed +% on a text page when we are in twocolumn mode the separation +% between the float and the text is controlled by |\dblfloatsep| +% and |\dbltextfloatsep|. +% +% |\dblfloatsep| is the space between adjacent floats that are moved +% to the top or bottom of the text page. +% +% |\dbltextfloatsep| is the space between the main text and floats +% at the top or bottom of the page. +% +% \begin{macrocode} +%<*10pt> +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +%</10pt> +%<*11pt> +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +%</11pt> +%<*12pt> +\setlength\dblfloatsep {14\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{Floats on their own page or column} +% +% \begin{macro}{\@fptop} +% \begin{macro}{\@fpsep} +% \begin{macro}{\@fpbot} +% When floating objects are placed on separate pages the layout of +% such pages is controlled by these parameters. At the top of the +% page |\@fptop| amount of stretchable whitespace is inserted, at +% the bottom of the page we get an |\@fpbot| amount of stretchable +% whitespace. Between adjacent floats the |\@fpsep| is inserted. +% +% These parameters are used for the placement of floating objects +% in one column mode, or in single column floats in two column +% mode. +% +% Note that at least one of the two parameters |\@fptop| and +% |\@fpbot| should contain a |plus ...fil| to allow filling the +% remaining empty space. +% \begin{macrocode} +%<*10pt> +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{8\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +%</10pt> +%<*11pt> +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{8\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +%</11pt> +%<*12pt> +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{10\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +%</12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dblfptop} +% \begin{macro}{\@dblfpsep} +% \begin{macro}{\@dblfpbot} +% Double column floats in two column mode are handled with similar +% parameters. +% \begin{macrocode} +%<*10pt> +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{8\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +%</10pt> +%<*11pt> +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{8\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +%</11pt> +%<*12pt> +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{10\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +%</12pt> +%<*article|report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Page Styles} +% +% The page style \pstyle{foo} is defined by defining the command +% |\ps@foo|. This command should make only local definitions. +% There should be no stray spaces in the definition, since they +% could lead to mysterious extra spaces in the output (well, that's +% something that should be always avoided). +% +% \begin{macro}{\@evenhead} +% \begin{macro}{\@oddhead} +% \begin{macro}{\@evenfoot} +% \begin{macro}{\@oddfoot} +% The |\ps@...| command defines the macros |\@oddhead|, +% |\@oddfoot|, |\@evenhead|, and |\@evenfoot| to define the running +% heads and feet---e.g., |\@oddhead| is the macro to produce the +% contents of the heading box for odd-numbered pages. It is called +% inside an |\hbox| of width |\textwidth|. +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Marking conventions} +% +% To make headings determined by the sectioning commands, the page +% style defines the commands |\chaptermark|, |\sectionmark|, +% \ldots,\\ +% where |\chaptermark{|\meta{TEXT}|}| is called by +% |\chapter| to set a mark, and so on. +% +% The |\...mark| commands and the |\...head| macros are defined +% with the help of the following macros. (All the |\...mark| +% commands should be initialized to no-ops.) +% +% \LaTeX{} extends \TeX's |\mark| facility by producing two kinds +% of marks, a `left' and a `right' mark, using the following +% commands: +% \begin{flushleft} +% |\markboth{|\meta{LEFT}|}{|\meta{RIGHT}|}|: Adds both marks. +% +% |\markright{|\meta{RIGHT}|}|: Adds a `right' mark. +% +% |\leftmark|: Used in the |\@oddhead|, |\@oddfoot|, |\@evenhead| +% or |\@evenfoot| macros, it gets the current `left' +% mark. |\leftmark| works like \TeX's |\botmark| +% command. +% +% |\rightmark|: Used in the |\@oddhead|, |\@oddfoot|, |\@evenhead| +% or |\@evenfoot| macros, it gets the current +% `right' mark. |\rightmark| works like \TeX's +% |\firstmark| command. +% \end{flushleft} +% +% The marking commands work reasonably well for right marks +% `numbered within' left marks---e.g., the left mark is changed by a +% |\chapter| command and the right mark is changed by a |\section| +% command. However, it does produce somewhat anomalous results if +% two |\markboth|'s occur on the same page. +% +% +% Commands like |\tableofcontents| that should set the marks in some +% page styles use a |\@mkboth| command, which is |\let| by the +% pagestyle command (|\ps@...|) to |\markboth| for setting the +% heading or to |\@gobbletwo| to do nothing. +% +% +% \subsubsection{Defining the page styles} +% \label{sec:classes:pagestyle} +% +% The pagestyles \pstyle{empty} and \pstyle{plain} are defined in +% \file{latex.dtx}. +% +% \begin{macro}{\ps@headings} +% The definition of the page style \pstyle{headings} has to be +% different for two sided printing than it is for one sided +% printing. +% +% \begin{macrocode} +\if@twoside + \def\ps@headings{% +% \end{macrocode} +% The running feet are empty in this page style, the running head +% contains the page number and one of the marks. +% \begin{macrocode} + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% +% \end{macrocode} +% +% When using this page style, the contents of the running head is +% determined by the chapter and section titles. So we |\let| +% |\@mkboth| to |\markboth|. +% \begin{macrocode} + \let\@mkboth\markboth +% \end{macrocode} +% +% For the article document class we define |\sectionmark| to clear +% the right mark and put the number of the section (when it is +% numbered) and its title in the left mark. The rightmark is set by +% |\subsectionmark| to contain the subsection titles. +% +% Note the use of |##1| for the parameter of the |\sectionmark| +% command, which will be defined when |\ps@headings| is executed. +% +% \changes{v1.2z}{1995/04/03}{Removed extra dot after \cs{thesection} +% (PR 1519)} +% \changes{v1.3c}{1995/05/25}{Replace \cs{hskip} +% \texttt{1em}\cs{relax} with \cs{quad}} +% \begin{macrocode} +%<*article> + \def\sectionmark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection\quad + \fi + ##1}}{}}% + \def\subsectionmark##1{% + \markright {% + \ifnum \c@secnumdepth >\@ne + \thesubsection\quad + \fi + ##1}}} +%</article> +% \end{macrocode} +% +% In the report and book document classes we use the |\chaptermark| +% and |\sectionmark| macros to fill the running heads. +% +% Note the use of |##1| for the parameter of the |\chaptermark| +% command, which will be defined when |\ps@headings| is executed. +% +% \begin{macrocode} +%<*report|book> + \def\chaptermark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \@chapapp\ \thechapter. \ % +%<book> \fi + \fi + ##1}}{}}% + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection. \ % + \fi + ##1}}}} +%</report|book> +% \end{macrocode} +% +% The definition of |\ps@headings| for one sided printing can be +% much simpler, because we treat even and odd pages the same. +% Therefore we don't need to define |\@even...|. +% \begin{macrocode} +\else + \def\ps@headings{% + \let\@oddfoot\@empty + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth +% \end{macrocode} +% We use |\markright| now instead of |\markboth| as we did for two +% sided printing. +% \begin{macrocode} +%<*article> + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \thesection\quad + \fi + ##1}}}} +%</article> +% \end{macrocode} +% +% \begin{macrocode} +%<*report|book> + \def\chaptermark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \@chapapp\ \thechapter. \ % +%<book> \fi + \fi + ##1}}}} +%</report|book> +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@myheadings} +% The definition of the page style \pstyle{myheadings} is fairly +% simple because the user determines the contents of the running +% head himself by using the |\markboth| and |\markright| commands. +% +% \begin{macrocode} +\def\ps@myheadings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% +% \end{macrocode} +% +% We have to make sure that the marking commands that are used by +% the chapter and section headings are disabled. We do this +% |\let|ting them to a macro that gobbles its argument(s). +% \begin{macrocode} + \let\@mkboth\@gobbletwo +%<!article> \let\chaptermark\@gobble + \let\sectionmark\@gobble +%<article> \let\subsectionmark\@gobble + } +% \end{macrocode} +% \end{macro} +% +% \section{Document Markup} +% +% \subsection{The title} +% +% \begin{macro}{\title} +% \begin{macro}{\author} +% \begin{macro}{\date} +% These three macros are provided by \file{latex.dtx} to provide +% information about the title, author(s) and date of the document. +% The information is stored away in internal control sequences. +% It is the task of the |\maketitle| command to use the +% information provided. The definitions of these macros are shown +% here for information. +% \begin{macrocode} +% \newcommand*{\title}[1]{\gdef\@title{#1}} +% \newcommand*{\author}[1]{\gdef\@author{#1}} +% \newcommand*{\date}[1]{\gdef\@date{#1}} +% \end{macrocode} +% The |\date| macro gets today's date by default. +% \begin{macrocode} +% \date{\today} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\maketitle} +% The definition of |\maketitle| depends on whether a separate +% title page is made. This is the default for the report and book +% document classes, but for the article class it is optional. +% +% When we are making a title page, we locally redefine +% |\footnotesize| and |footnoterule| to change the appearance of +% the footnotes that are produced by the |\thanks| command; +% these changes affect all footnotes. +% \changes{v1.3o}{1995/11/02}{(CAR) Make \cs{footnote} always work in +% title, etc} +% \begin{macrocode} + \if@titlepage + \newcommand\maketitle{\begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \let \footnote \thanks +% \end{macrocode} +% We center the entire title vertically; the centering is set off a +% little by adding a |\vskip|. (In compatibility mode the pagenumber +% is set to 0 by the titlepage environment to keep the behaviour +% of \LaTeX\ 2.09 style files.) +% \changes{v1.0g}{1993/12/09}{Removed the setting of the page number, +% when not in compatibility mode} +% \changes{v1.2c}{1994/03/17}{Removed setting of page number, now done +% in titlepage environment} +% \begin{macrocode} + \null\vfil + \vskip 60\p@ +% \end{macrocode} +% Then we set the title, in a |\LARGE| font; leave a little space +% and set the author(s) in a |\large| font. We do this inside a +% tabular environment to get them in a single column. +% Before the date we leave a little whitespace again. +% \begin{macrocode} + \begin{center}% + {\LARGE \@title \par}% + \vskip 3em% + {\large + \lineskip .75em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1.5em% + {\large \@date \par}% % Set date in \large size. + \end{center}\par +% \end{macrocode} +% Then we call |\@thanks| to print the information that goes into +% the footnote and finish the page. +% \begin{macrocode} + \@thanks + \vfil\null + \end{titlepage}% +% \end{macrocode} +% We reset the \Lcount{footnote} counter, disable |\thanks| and +% |\maketitle| and save some storage space by emptying the internal +% information macros. +% \changes{v1.3j}{1995/08/16}{use \cs{let} to save space} +% \changes{v1.3n}{1995/10/29}{Empty \cs{@date} as well} +% \begin{macrocode} + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty +% \end{macrocode} +% After the title is set the declaration commands |\title|, etc.\ +% can vanish. +% The definition of |\and| makes only sense within the argument of +% |\author| so this can go as well. +% \changes{v1.3k}{1995/08/27}{Disable \cs{title} and similar decls} +% \begin{macrocode} + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax +} +% \end{macrocode} +% When the title is not on a page of its own, the layout of the +% title is a little different. We use symbols to mark the footnotes +% and we have to deal with two column documents. +% +% Therefore we first start a new group to keep changes local. Then +% we redefine |\thefootnote| to use |\fnsymbol|; and change +% |\@makefnmark| so that footnotemarks have zero width (to make the +% centering of the author names look better). +% \changes{v1.2s}{1994/06/02}{Reset \cs{@makefntext}} +% \changes{v1.3a}{1995/05/17}{Use \cs{@makefnmark} in definition of +% \cs{@makefntext}} +% \changes{v1.3g}{1995/06/26}{Fix definition of \cs{@makefnmark} and +% \cs{@makefntext} to a) work and b) without using math} +% \begin{macrocode} +\else +\newcommand\maketitle{\par + \begingroup + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hb@xt@1.8em{% + \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% +% \end{macrocode} +% If this is a twocolumn document we start a new page in twocolumn +% mode, with the title set to the full width of the text. The +% actual printing of the title information is left to +% |\@maketitle|. +% \changes{v1.2k}{1994/05/06}{Added check on number of columns in use +% locally} +% \begin{macrocode} + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else +% \end{macrocode} +% When this is not a twocolumn document we just start a new page, +% prevent floating objects from appearing on the top of this page +% and print the title information. +% \begin{macrocode} + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi +% \end{macrocode} +% This page gets a \pstyle{plain} layout. We call |\@thanks| to +% produce the footnotes. +% \begin{macrocode} + \thispagestyle{plain}\@thanks +% \end{macrocode} +% Now we can close the group, reset the \Lcount{footnote} counter, +% disable |\thanks|, |\maketitle| and |\@maketitle| and save some +% storage space by emptying the internal information macros. +% \changes{v1.3j}{1995/08/16}{use \cs{let} to save space} +% \changes{v1.3k}{1995/08/27}{Disable \cs{title} and similar decls} +% \changes{v1.3n}{1995/10/29}{Empty \cs{@date} as well} +% \begin{macrocode} + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@maketitle} +% This macro takes care of formatting the title information when we +% have no separate title page. +% +% We always start a new page, leave some white space and center the +% information. The title is set in a |\LARGE| font, the author +% names and the date in a |\large| font. +% \changes{v1.3o}{1995/11/02}{(CAR) Make \cs{footnote} always work in +% title, etc} +% \begin{macrocode} +\def\@maketitle{% + \newpage + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \end{center}% + \par + \vskip 1.5em} +\fi +% \end{macrocode} +% \end{macro} +% +% \subsection{Chapters and Sections} +% +% \subsubsection{Building blocks} The definitions in this part of the +% class file make use of two internal macros, |\@startsection| and +% |\secdef|. To understand +% what is going on here, we describe their syntax. +% +% The macro |\@startsection| has 6 required arguments, optionally +% followed by a $*$, an optional argument and a required argument: +% +% |\@startsection|\meta{name}\meta{level}\meta{indent}^^A +% \meta{beforeskip}\meta{afterskip}\meta{style} +% optional *\\ +% \null\hphantom{\bslash @startsection}^^A +% |[|\meta{altheading}|]|\meta{heading} +% +% It is a generic command to start a section, the arguments have +% the following meaning: +% +% \begin{description} +% \item[\meta{name}] The name of the user level command, e.g., +% `section'. +% \item[\meta{level}] A number, denoting the depth of the section +% -- e.g., chapter=1, section = 2, etc. A section number +% will be printed if and only if \meta{level} $<=$ the value +% of the \Lcount{secnumdepth} counter. +% \item[\meta{indent}] The indentation of the heading from the left +% margin +% \item[\meta{beforeskip}] The absolute value of this argument +% gives the skip to leave above the heading. If it is +% negative, then the paragraph indent of the text following +% the heading is suppressed. +% \item[\meta{afterskip}] If positive, this gives the skip to leave +% below the heading, else it gives the skip to leave to the +% right of a run-in heading. +% \item[\meta{style}] Commands to set the style of the heading. +% \item[$*$] When this is missing the heading is numbered and the +% corresponding counter is incremented. +% \item[\meta{altheading}] Gives an alternative heading to use in +% the table of contents and in the running heads. This should +% not be present when the $*$ form is used. +% \item[\meta{heading}] The heading of the new section. +% \end{description} +% A sectioning command is normally defined to |\@startsection| and +% its first six arguments. +% +% The macro |\secdef| can be used when a sectioning command is +% defined without using |\@startsection|. It has two arguments: +% +% |\secdef|\meta{unstarcmds}\meta{starcmds} +% +% \begin{description} +% \item[\meta{unstarcmds}] Used for the normal form of the +% sectioning command. +% \item[\meta{starcmds}] Used for the $*$-form of the +% sectioning command. +% \end{description} +% +% You can use |\secdef| as follows: +% \begin{verbatim} +% \def\chapter { ... \secdef \CMDA \CMDB } +% \def\CMDA [#1]#2{ ... } % Command to define +% % \chapter[...]{...} +% \def\CMDB #1{ ... } % Command to define +% % \chapter*{...} +% \end{verbatim} +% +% \subsubsection{Mark commands} +% +% \begin{macro}{\chaptermark} +% \begin{macro}{\sectionmark} +% \begin{macro}{\subsectionmark} +% \begin{macro}{\subsubsectionmark} +% \begin{macro}{\paragraphmark} +% \begin{macro}{\subparagraphmark} +% Default initializations of |\...mark| commands. These commands +% are used in the definition of the page styles (see +% section~\ref{sec:classes:pagestyle}) Most of them are already defined by +% \file{latex.dtx}, so they are only shown here. +% +% \begin{macrocode} +%<!article>\newcommand*\chaptermark[1]{} +% \newcommand*\sectionmark[1]{} +% \newcommand*\subsectionmark[1]{} +% \newcommand*\subsubsectionmark[1]{} +% \newcommand*\paragraphmark[1]{} +% \newcommand*\subparagraphmark[1]{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Define Counters} +% +% \begin{macro}{\c@secnumdepth} +% The value of the counter \Lcount{secnumdepth} gives the depth of +% the highest-level sectioning command that is to produce section +% numbers. +% \begin{macrocode} +%<article>\setcounter{secnumdepth}{3} +%<!article>\setcounter{secnumdepth}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@part} +% \begin{macro}{\c@chapter} +% \begin{macro}{\c@section} +% \begin{macro}{\c@subsection} +% \begin{macro}{\c@subsubsection} +% \begin{macro}{\c@paragraph} +% \begin{macro}{\c@subparagraph} +% These counters are used for the section numbers. The macro\\ +% |\newcounter{|\meta{newctr}|}[|\meta{oldctr}|]|\\ +% defines\meta{newctr} to be a counter, which is reset to zero when +% counter \meta{oldctr} is stepped. Counter \meta{oldctr} must +% already be defined. +% +% \begin{macrocode} +\newcounter {part} +%<article>\newcounter {section} +%<*report|book> +\newcounter {chapter} +\newcounter {section}[chapter] +%</report|book> +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\thepart} +% \begin{macro}{\thechapter} +% \begin{macro}{\thesection} +% \begin{macro}{\thesubsection} +% \begin{macro}{\thesubsubsection} +% \begin{macro}{\theparagraph} +% \begin{macro}{\thesubparagraph} +% For any counter \Lcount{CTR}, |\theCTR| is a macro that defines +% the printed version of counter \Lcount{CTR}. It is defined in +% terms of the following macros: +% +% |\arabic{|\Lcount{COUNTER}|}| prints the value of +% \Lcount{COUNTER} as an arabic numeral. +% +% |\roman{|\Lcount{COUNTER}|}| prints the value of +% \Lcount{COUNTER} as a lowercase roman numberal. +% +% |\Roman{|\Lcount{COUNTER}|}| prints the value of +% \Lcount{COUNTER} as an uppercase roman numberal. +% +% |\alph{|\Lcount{COUNTER}|}| prints the value of \Lcount{COUNTER} +% as a lowercase letter: $1 =$~a, $2 =$~ b, etc. +% +% |\Alph{|\Lcount{COUNTER}|}| prints the value of \Lcount{COUNTER} +% as an uppercase letter: $1 =$~A, $2 =$~B, etc. +% +% Actually to save space the internal counter repesentations +% and the commands operating on those are used. +% \begin{macrocode} +\renewcommand \thepart {\@Roman\c@part} +%<article>\renewcommand \thesection {\@arabic\c@section} +%<*report|book> +\renewcommand \thechapter {\@arabic\c@chapter} +\renewcommand \thesection {\thechapter.\@arabic\c@section} +%</report|book> +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection.\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@chapapp} +% |\@chapapp| is initially defined to be `|\chaptername|'. The +% |\appendix| command redefines it to be `|\appendixname|'. +% +% \begin{macrocode} +%<report|book>\newcommand\@chapapp{\chaptername} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Front Matter, Main Matter, and Back Matter} +% +% A book contains these three (logical) sections. The switch +% |\@mainmatter| is true iff we are processing Main Matter. When +% this switch is false, the |\chapter| command does not print +% chapter numbers. +% +% Here we define the commands that start these sections. +% \begin{macro}{\frontmatter} +% This command starts Roman page numbering and turns off chapter +% numbering. Since this restarts the page numbering from 1, it +% should also ensure that a recto page is used. +% \changes{v1.3r}{1996/05/26}{Make this command react to the option +% \texttt{openany}} +% \changes{v1.3y}{1998/05/05}{Two years on: Make this command not +% react to the option \texttt{openany} as this makes the +% verso/recto numbering wrong: see pr/2754 for discussion} +% \begin{macrocode} +%<*book> +\newcommand\frontmatter{% +% \if@openright + \cleardoublepage +% \else +% \clearpage +% \fi + \@mainmatterfalse + \pagenumbering{roman}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mainmatter} +% This command clears the page, starts arabic page numbering and +% turns on chapter numbering. Since this restarts the page numbering +% from 1, it should also ensure that a recto page is used. +% \changes{v1.3r}{1996/05/26}{Make this command react to the option +% \texttt{openany}} +% \changes{v1.3y}{1998/05/05}{Two years on: Make this command not +% react to the option \texttt{openany} as this makes the +% verso/recto numbering wrong: see pr/2754 for discussion} +% \begin{macrocode} +\newcommand\mainmatter{% +% \if@openright + \cleardoublepage +% \else +% \clearpage +% \fi + \@mainmattertrue + \pagenumbering{arabic}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\backmatter} +% This clears the page, turns off chapter numbering and leaves page +% numbering unchanged. +% \begin{macrocode} +\newcommand\backmatter{% + \if@openright + \cleardoublepage + \else + \clearpage + \fi + \@mainmatterfalse} +%</book> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Parts} +% +% \begin{macro}{\part} +% The command to start a new part of our document. +% +% In the article class the definition of |\part| is rather simple; +% we start a new paragraph, add a little white space, suppress the +% indentation of the first paragraph and make use of |\secdef|. +% As in other sectioning commands (cf.\ |\@startsection| in the +% {\LaTeXe} kernel), we need to check the |@noskipsec| switch and +% force horizontal mode if it is set. +% \changes{v1.4a}{1999/01/07}{Check \texttt{@noskipsec} switch and +% possibly force horizontal mode; see PR/2889.} +% \begin{macrocode} +%<*article> +\newcommand\part{% + \if@noskipsec \leavevmode \fi + \par + \addvspace{4ex}% + \@afterindentfalse + \secdef\@part\@spart} +%</article> +% \end{macrocode} +% +% For the report and book classes we things a bit different. +% +% We start a new (righthand) page and use the \pstyle{plain} +% pagestyle. +% \changes{v1.3r}{1996/05/26}{Make this command react to the option +% \texttt{openany}} +% \begin{macrocode} +%<*report|book> +\newcommand\part{% + \if@openright + \cleardoublepage + \else + \clearpage + \fi + \thispagestyle{plain}% +% \end{macrocode} +% When we are making a two column document, this will be a one +% column page. We use |@tempswa| to remember to switch back to two +% columns. +% \begin{macrocode} + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi +% \end{macrocode} +% We need an empty box to prevent the fil glue from disappearing. +% \changes{v1.3j}{1995/08/16}{Replace \cs{hbox} by \cs{null}} +% \begin{macrocode} + \null\vfil +% \end{macrocode} +% Here we use |\secdef| to indicate which commands to use to make +% the actual heading. +% \begin{macrocode} + \secdef\@part\@spart} +%</report|book> +% \end{macrocode} +% +% \begin{macro}{\@part} +% This macro does the actual formatting of the title of the part. +% Again the macro is differently defined for the article document +% class than for the document classes report and book. + +% When \Lcount{secnumdepth} is larger than $-1$ for the +% document class article, we have a numbered +% part, otherwise it is unnumbered. +% \begin{macrocode} +%<*article> +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >\m@ne + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi +% \end{macrocode} +% We print the title flush left in the article class. +% Also we prevent breaking between lines and reset the font. +% \changes{v1.3c}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}} +% \begin{macrocode} + {\parindent \z@ \raggedright + \interlinepenalty \@M + \normalfont +% \end{macrocode} +% When this is a numbered part we have to print the number and the +% title. The |\nobreak| should prevent a page break here. +% \changes{v1.4e}{2001/05/24}{Replaced tilde with \cs{nobreakspace} +% (pr/3310)} +% \begin{macrocode} + \ifnum \c@secnumdepth >\m@ne + \Large\bfseries \partname\nobreakspace\thepart + \par\nobreak + \fi + \huge \bfseries #2% +% \end{macrocode} +% Now we empty the mark registers, leave some white space and let +% |\@afterheading| take care of suppressing the indentation. +% \begin{macrocode} + \markboth{}{}\par}% + \nobreak + \vskip 3ex + \@afterheading} +%</article> +% \end{macrocode} +% +% When \Lcount{secnumdepth} is larger than $-2$ for the +% document class report and book, we have a numbered +% part, otherwise it is unnumbered. +% \begin{macrocode} +%<*report|book> +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi +% \end{macrocode} +% We empty the mark registers and center the title on the page in the +% report and book document classes. +% Also we prevent breaking between lines and reset the font. +% \changes{v1.3c}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}} +% \changes{v1.3j}{1995/08/16}{add missing percent} +% \begin{macrocode} + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont +% \end{macrocode} +% When this is a numbered part we have to print the number. +% \changes{v1.4e}{2001/05/24}{Replaced tilde with \cs{nobreakspace} +% (pr/3310)} +% \begin{macrocode} + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \partname\nobreakspace\thepart + \par +% \end{macrocode} +% We leave some space before we print the title and leave the +% finishing up to |\@endpart|. +% \begin{macrocode} + \vskip 20\p@ + \fi + \Huge \bfseries #2\par}% + \@endpart} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@spart} +% This macro does the actual formatting of the title of the part +% when the star form of the user command was used. In this case we +% \emph{never} print a number. Otherwise the formatting is the +% same. +% +% The differences between the definition of this macro in the +% article document class and in the report and book document +% classes are similar as they were for |\@part|. +% \changes{v1.3c}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}} +% \begin{macrocode} +%<*article> +\def\@spart#1{% + {\parindent \z@ \raggedright + \interlinepenalty \@M + \normalfont + \huge \bfseries #1\par}% + \nobreak + \vskip 3ex + \@afterheading} +%</article> +%<*report|book> +\def\@spart#1{% + {\centering + \interlinepenalty \@M + \normalfont + \Huge \bfseries #1\par}% + \@endpart} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@endpart} +% \changes{v1.3j}{1995/08/16}{move docstrip guard to avoid defining +% \cs{@endpart} in article} +% This macro finishes the part page, for both |\@part| and +% |\@spart|. +% +% First we fill the current page. +% \begin{macrocode} +%<*report|book> +\def\@endpart{\vfil\newpage +% \end{macrocode} +% Then, when we are in twosided mode and chapters are supposed to +% be on right hand sides, we produce a completely blank page. +% \changes{v1.4b}{2000/05/19}{Only add empty page after part if +% twoside and openright (pr/3155)} +% \begin{macrocode} + \if@twoside + \if@openright + \null + \thispagestyle{empty}% + \newpage + \fi + \fi +% \end{macrocode} +% When this was a two column document we have to switch back to two +% column mode. +% \begin{macrocode} + \if@tempswa + \twocolumn + \fi} +%</report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Chapters} +% +% \begin{macro}{\chapter} +% A chapter should always start on a new page therefore we start by +% calling |\clearpage| and setting the pagestyle for this page to +% \pstyle{plain}. +% \begin{macrocode} +%<*report|book> +\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi + \thispagestyle{plain}% +% \end{macrocode} +% Then we prevent floats from appearing at the top of this page +% because it looks weird to see a floating object above a chapter +% title. +% \begin{macrocode} + \global\@topnum\z@ +% \end{macrocode} +% Then we suppress the indentation of the first paragraph by +% setting the switch |\@afterindent| to |false|. We use |\secdef| +% to specify the macros to use for actually setting the chapter +% title. +% \begin{macrocode} + \@afterindentfalse + \secdef\@chapter\@schapter} +% \end{macrocode} +% +% \begin{macro}{\@chapter} +% This macro is called when we have a numbered chapter. When +% \Lcount{secnumdepth} is larger than $-1$ and, in the book +% class, |\@mainmatter| is true, we display the chapter +% number. We also inform the user that a new chapter is about to be +% typeset by writing a message to the terminal. +% \begin{macrocode} +\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% +%<*book> + \else + \addcontentsline{toc}{chapter}{#1}% + \fi +%</book> + \else + \addcontentsline{toc}{chapter}{#1}% + \fi +% \end{macrocode} +% After having written an entry to the table of contents we store +% the (alternative) title of this chapter with |\chaptermark| and +% add some white space to the lists of figures and tables. +% \begin{macrocode} + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% +% \end{macrocode} +% Then we call upon |\@makechapterhead| to format the actual +% chapter title. We have to do this in a special way when we are in +% twocolumn mode in order to have the chapter title use the entire +% |\textwidth|. In one column mode we call |\@afterheading| which +% takes care of suppressing the indentation. +% \begin{macrocode} + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +% \end{macrocode} +% +% \begin{macro}{\@makechapterhead} +% The macro above uses |\@makechapterhead|\meta{text} to format the +% heading of the chapter. +% +% We begin by leaving some white space. The we open a group in +% which we have a paragraph indent of 0pt, and in which we have the +% text set ragged right. We also reset the font. +% \changes{v1.3c}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}} +% \begin{macrocode} +\def\@makechapterhead#1{% + \vspace*{50\p@}% + {\parindent \z@ \raggedright \normalfont +% \end{macrocode} +% Then we check whether the number of the chapter has to be printed. +% If so we leave some whitespace between the chapternumber and its +% title. +% \changes{v1.2v}{1994/11/30}{Added a \cs{nobreak} to prevent a +% pagebreak between the chapternumber and the chaptertitle} +% \changes{v1.3j}{1995/08/16}{replace braces by \cs{space}} +% \begin{macrocode} + \ifnum \c@secnumdepth >\m@ne +%<book> \if@mainmatter + \huge\bfseries \@chapapp\space \thechapter + \par\nobreak + \vskip 20\p@ +%<book> \fi + \fi +% \end{macrocode} +% Now we set the title in a large bold font. We prevent a pagebreak +% from occurring in the middle of or after the title. Finally we +% leave some whitespace before the text begins. +% \changes{v1.2v}{1994/11/30}{Added \cs{interlinepenalty}\cs{@M} to +% prevent a pagebreak in the middle of a title} +% \begin{macrocode} + \interlinepenalty\@M + \Huge \bfseries #1\par\nobreak + \vskip 40\p@ + }} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@schapter} +% This macro is called when we have an unnumbered chapter. It is +% much simpler than |\@chapter| because it only needs to typeset +% the chapter title. +% \begin{macrocode} +\def\@schapter#1{\if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}% + \@afterheading + \fi} +% \end{macrocode} +% +% \begin{macro}{\@makeschapterhead} +% The macro above uses |\@makeschapterhead|\meta{text}to format +% the heading of the chapter. It is similar to |\@makechapterhead| +% except that it never has to print a chapter number. +% +% \changes{v1.2v}{1994/11/30}{Added \cs{interlinepenalty}\cs{@M} to +% prevent a pagebreak in the middle of a title} +% \changes{v1.3c}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}} +% \begin{macrocode} +\def\@makeschapterhead#1{% + \vspace*{50\p@}% + {\parindent \z@ \raggedright + \normalfont + \interlinepenalty\@M + \Huge \bfseries #1\par\nobreak + \vskip 40\p@ + }} +%</report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Lower level headings} +% +% These commands all make use of |\@startsection|. +% \begin{macro}{\section} +% This gives a normal heading with white space above and below the +% heading, the title set in |\Large\bfseries|, and no indentation +% on the first paragraph. +% \changes{v1.3c}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}} +% \begin{macrocode} +\newcommand\section{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\normalfont\Large\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subsection} +% This gives a normal heading with white space above and below the +% heading, the title set in |\large\bfseries|, and no indentation +% on the first paragraph. +% \begin{macrocode} +\newcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\large\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subsubsection} +% This gives a normal heading with white space above and below the +% heading, the title set in |\normalsize\bfseries|, and no +% indentation on the first paragraph. +% \begin{macrocode} +\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\paragraph} +% This gives a run-in heading with white space above and to the +% right of the heading, the title set in |\normalsize\bfseries|. +% \begin{macrocode} +\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\subparagraph} +% This gives an indented run-in heading with white space above and +% to the right of the heading, the title set in +% |\normalsize\bfseries|. +% \begin{macrocode} +\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Lists} +% +% \subsubsection{General List Parameters} +% +% The following commands are used to set the default values for the list +% environment's parameters. See the \LaTeX{} manual for an explanation +% of the meanings of the parameters. Defaults for the list +% environment are set as follows. First, |\rightmargin|, +% |\listparindent| and |\itemindent| are set to 0pt. Then, for a Kth +% level list, the command |\@listK| is called, where `K' denotes `i', +% '`i', ... , `vi'. (I.e., |\@listiii| is called for a third-level +% list.) By convention, |\@listK| should set |\leftmargin| to +% |\leftmarginK|. +% +% \begin{macro}{\leftmargin} +% \begin{macro}{\leftmargini} +% \begin{macro}{\leftmarginii} +% \begin{macro}{\leftmarginiii} +% \begin{macro}{\leftmarginiv} +% \begin{macro}{\leftmarginv} +% \begin{macro}{\leftmarginvi} +% \changes{v1.0m}{1994/01/12}{Use em instead of pt to remain +% compatible with old styles} +% \changes{v1.3q}{1995/12/20}{Temporary(?) fix: revert to setting +% \cs{leftmargin} at outer level} +% +% When we are in two column mode some of the margins are set somewhat +% smaller. +% \begin{macrocode} +\if@twocolumn + \setlength\leftmargini {2em} +\else + \setlength\leftmargini {2.5em} +\fi +% \end{macrocode} +% Until the whole of the parameter setting in these files is +% rationalised, we need to set the value of |\leftmargin| at this +% outer level. +% \begin{macrocode} +\leftmargin \leftmargini +% \end{macrocode} +% The following three are calculated so that they are larger than +% the sum of |\labelsep| and the width of the default labels (which +% are `(m)', `vii.' and `M.'). +% \begin{macrocode} +\setlength\leftmarginii {2.2em} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\if@twocolumn + \setlength\leftmarginv {.5em} + \setlength\leftmarginvi {.5em} +\else + \setlength\leftmarginv {1em} + \setlength\leftmarginvi {1em} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelsep} +% \begin{macro}{\labelwidth} +% \changes{v1.0m}{1994/01/12}{Use em instead of pt to remain +% compatible with old styles} +% |\labelsep| is the distance between the label and the text of an +% item; |\labelwidth| is the width of the label. +% \begin{macrocode} +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\partopsep} +% When the user leaves a blank line before the environment an extra +% vertical space of |\partopsep| is inserted, in addition to +% |\parskip| and |\topsep|. +% \changes{v1.0m}{1994/01/12}{\cs{partopsep} should be different, +% depending on the pointsize} +% \begin{macrocode} +%</article|report|book> +%<10pt>\setlength\partopsep{2\p@ \@plus 1\p@ \@minus 1\p@} +%<11pt>\setlength\partopsep{3\p@ \@plus 1\p@ \@minus 1\p@} +%<12pt>\setlength\partopsep{3\p@ \@plus 2\p@ \@minus 2\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@beginparpenalty} +% \begin{macro}{\@endparpenalty} +% These penalties are inserted before and after a list or paragraph +% environment. They are set to a bonus value to encourage page +% breaking at these points. +% \begin{macro}{\@itempenalty} +% This penalty is inserted between list items. +% \begin{macrocode} +%<*article|report|book> +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +%</article|report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listi} +% \begin{macro}{\@listI} +% |\@listi| defines the values of +% |\leftmargin|, |\parsep|, |\topsep|, |\itemsep|, etc.\ for the +% lists that appear on top-level. Its definition is modified by the +% font-size commands (eg within |\small| the list parameters get +% ``smaller'' values). +% +% For this reason \@listI is defined to hold a saved copy of \@listi +% so that |\normalsize| can switch all parameters back. +% +% \begin{macrocode} +%<*10pt|11pt|12pt> +\def\@listi{\leftmargin\leftmargini +%<*10pt> + \parsep 4\p@ \@plus2\p@ \@minus\p@ + \topsep 8\p@ \@plus2\p@ \@minus4\p@ + \itemsep4\p@ \@plus2\p@ \@minus\p@} +%</10pt> +%<*11pt> + \parsep 4.5\p@ \@plus2\p@ \@minus\p@ + \topsep 9\p@ \@plus3\p@ \@minus5\p@ + \itemsep4.5\p@ \@plus2\p@ \@minus\p@} +%</11pt> +%<*12pt> + \parsep 5\p@ \@plus2.5\p@ \@minus\p@ + \topsep 10\p@ \@plus4\p@ \@minus6\p@ + \itemsep5\p@ \@plus2.5\p@ \@minus\p@} +%</12pt> +\let\@listI\@listi +% \end{macrocode} +% We initialise the parameters although strictly speaking that +% is not necessary. +% \begin{macrocode} +\@listi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listii} +% \begin{macro}{\@listiii} +% \begin{macro}{\@listiv} +% \begin{macro}{\@listv} +% \begin{macro}{\@listvi} +% Here are the same macros for the higher level lists. Note that +% they don't have saved versions and are not modified by the font +% size commands. In other words this class assumes that nested +% lists only appear in |\normalsize|, i.e.\ the main document size. +% \begin{macrocode} +\def\@listii {\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep +%<*10pt> + \topsep 4\p@ \@plus2\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ +%</10pt> +%<*11pt> + \topsep 4.5\p@ \@plus2\p@ \@minus\p@ + \parsep 2\p@ \@plus\p@ \@minus\p@ +%</11pt> +%<*12pt> + \topsep 5\p@ \@plus2.5\p@ \@minus\p@ + \parsep 2.5\p@ \@plus\p@ \@minus\p@ +%</12pt> + \itemsep \parsep} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep +%<10pt> \topsep 2\p@ \@plus\p@\@minus\p@ +%<11pt> \topsep 2\p@ \@plus\p@\@minus\p@ +%<12pt> \topsep 2.5\p@\@plus\p@\@minus\p@ + \parsep \z@ + \partopsep \p@ \@plus\z@ \@minus\p@ + \itemsep \topsep} +\def\@listiv {\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv {\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi {\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +%</10pt|11pt|12pt> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Enumerate} +% +% The enumerate environment uses four counters: \Lcount{enumi}, +% \Lcount{enumii}, \Lcount{enumiii} and \Lcount{enumiv}, where +% \Lcount{enumN} controls the numbering of the Nth level +% enumeration. +% +% \begin{macro}{\theenumi} +% \begin{macro}{\theenumii} +% \begin{macro}{\theenumiii} +% \begin{macro}{\theenumiv} +% The counters are already defined in \file{latex.dtx}, but their +% representation is changed here. +% +% \begin{macrocode} +%<*article|report|book> +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelenumi} +% \begin{macro}{\labelenumii} +% \begin{macro}{\labelenumiii} +% \begin{macro}{\labelenumiv} +% The label for each item is generated by the commands\\ +% |\labelenumi| \ldots\ |\labelenumiv|. +% \begin{macrocode} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\p@enumii} +% \begin{macro}{\p@enumiii} +% \begin{macro}{\p@enumiv} +% The expansion of |\p@enumN||\theenumN| defines the output of a +% |\ref| command when referencing an item of the Nth level of an +% enumerated list. +% \begin{macrocode} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Itemize} +% +% \begin{macro}{\labelitemi} +% \begin{macro}{\labelitemii} +% \changes{v1.2k}{1994/05/06}{Inserted \cs{normalfont}} +% \changes{v1.3s}{1996/08/24}{Replaced -{}- with \cs{textendash}} +% \changes{v1.3u}{1996/10/31}{Changed to \cs{textbullet}, +% \cs{textasteriskcentered} and \cs{textperiodcentered}} +% \begin{macro}{\labelitemiii} +% \begin{macro}{\labelitemiv} +% Itemization is controlled by four commands: |\labelitemi|, +% |\labelitemii|, |\labelitemiii|, and |\labelitemiv|, which define +% the labels of thevarious itemization levels: the symbols used are +% bullet, bold en-dash, centered asterisk and centred dot. +% +% \begin{macrocode} +\newcommand\labelitemi{\textbullet} +\newcommand\labelitemii{\normalfont\bfseries \textendash} +\newcommand\labelitemiii{\textasteriskcentered} +\newcommand\labelitemiv{\textperiodcentered} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Description} +% +% \begin{environment}{description} +% The description environment is defined here -- while the itemize +% and enumerate environments are defined in \file{latex.dtx}. +% +% \begin{macrocode} +\newenvironment{description} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\descriptionlabel} +% To change the formatting of the label, you must redefine +% |\descriptionlabel|. +% +% \changes{v1.2k}{1994/05/06}{Inserted \cs{normalfont}} +% \changes{v1.2y}{1995/01/31}{made command short} +% \begin{macrocode} +\newcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} +% \end{macrocode} +% \end{macro} +% +% \subsection{Defining new environments} +% +% \subsubsection{Abstract} +% +% \begin{environment}{abstract} +% When we are producing a separate titlepage we also put the +% abstract on a page of its own. It will be centred vertically on +% the page. +% +% Note that this environment is not defined for books. +% \changes{v1.3e}{1995/06/19}{Added setting of \cs{@endparpenalty} +% to avoid page break after abstract heading.} +% \begin{macrocode} +% \changes{v1.3m}{1995/10/23}{Added setting of \cs{beginparpenalty} to +% discourage page break before abstract heading.} +%<*article|report> +\if@titlepage + \newenvironment{abstract}{% + \titlepage + \null\vfil + \@beginparpenalty\@lowpenalty + \begin{center}% + \bfseries \abstractname + \@endparpenalty\@M + \end{center}}% + {\par\vfil\null\endtitlepage} +% \end{macrocode} +% When we are not making a separate titlepage --the default for the +% article document class-- we have to check if we are in twocolumn +% mode. In that case the abstract is as a |\section*|, otherwise +% the quotation environment is used to typeset the abstract. +% \begin{macrocode} +\else + \newenvironment{abstract}{% + \if@twocolumn + \section*{\abstractname}% + \else + \small + \begin{center}% + {\bfseries \abstractname\vspace{-.5em}\vspace{\z@}}% + \end{center}% + \quotation + \fi} + {\if@twocolumn\else\endquotation\fi} +\fi +%</article|report> +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Verse} +% +% \begin{environment}{verse} +% The verse environment is defined by making clever use of the +% list environment's parameters. The user types |\\| to end a line. +% This is implemented by |\let|'ing |\\| equal |\@centercr|. +% +% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with +% \cs{relax}} +% \begin{macrocode} +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Quotation} +% +% \begin{environment}{quotation} +% The quotation environment is also defined by making clever use of +% the list environment's parameters. The lines in the environment +% are set smaller than |\textwidth|. The first line of a paragraph +% inside this environment is indented. +% +% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with +% \cs{relax}} +% \begin{macrocode} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Quote} +% +% \begin{environment}{quote} +% The quote environment is like the quotation environment except +% that paragraphs are not indented. +% +% \changes{v1.3j}{1995/08/16}{stop \cs{item} scanning for [ with +% \cs{relax}} +% \begin{macrocode} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Theorem} +% +% This document class does not define it's own theorem environments, +% the defaults, supplied by \file{latex.dtx} are available. +% +% \subsubsection{Titlepage} +% +% \begin{environment}{titlepage} +% In the normal environments, the titlepage environment does nothing +% but start and end a page, and inhibit page numbers. In the report +% style, it also resets the page number to one, and then sets it +% back to one at the end. In compatibility mode, it sets the +% page number to zero. This is incorrect since it results in using +% the page parameters for a right-hand page but it is the way it was. +% In two-column style, it still makes a +% one-column page. +% +% \changes{v1.0g}{1993/12/09}{Moved the setting of +% \cs{@restonecolfalse}} +% \changes{v1.2c}{1994/03/17}{page :!= 0 only in compatibility mode +% (LL)} +% \changes{v1.2d}{1994/04/11}{Moved \cs{cleardoublepage} inside +% definition of titlepage environment} +% \changes{v1.3i}{1995/08/08}{New implementation with support for +% twoside and openright option} +% +% First we do give the definition for compatibility mode. +% \begin{macrocode} +\if@compatibility +\newenvironment{titlepage} + {% +%<book> \cleardoublepage + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse\newpage + \fi + \thispagestyle{empty}% + \setcounter{page}\z@ + }% + {\if@restonecol\twocolumn \else \newpage \fi + } +% \end{macrocode} +% +% And here is the one for native \LaTeXe{}. +% \begin{macrocode} +\else +\newenvironment{titlepage} + {% +%<book> \cleardoublepage + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse\newpage + \fi + \thispagestyle{empty}% + \setcounter{page}\@ne + }% + {\if@restonecol\twocolumn \else \newpage \fi +% \end{macrocode} +% If we are not in two-side mode the first page after the title page +% should also get page number 1. +% \begin{macrocode} + \if@twoside\else + \setcounter{page}\@ne + \fi + } +\fi +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Appendix} +% +% \begin{macro}{\appendix} +% +% The |\appendix| command is not really an environment, it is a +% macro that makes some changes in the way things are done. +% +% In the article document class the |\appendix| command must do the +% following: +% \begin{itemize} +% \item reset the section and subsection counters to zero, +% \item redefine |\thesection| to produce alphabetic appendix +% numbers. This redefinition is done globally to ensure that it +% survives even if |\appendix| is issued within an environment such +% as \texttt{multicols}. +% \end{itemize} +% +% \changes{1.3z}{1998/09/19}{Redefine \cs{thesection} globally (pr/2862)} +% \begin{macrocode} +%<*article> +\newcommand\appendix{\par + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \gdef\thesection{\@Alph\c@section}} +%</article> +% \end{macrocode} +% +% In the report and book document classes the |\appendix| command +% must do the following: +% \begin{itemize} +% \item reset the chapter and section counters to zero, +% \item set |\@chapapp| to |\appendixname| (for messages), +% \item redefine the chapter counter to produce appendix numbers, +% \item possibly redefine the |\chapter| command if appendix titles +% and headings are to look different from chapter titles and +% headings. This redefinition is done globally to ensure that it +% survives even if |\appendix| is issued within an environment such +% as \texttt{multicols}. +% \end{itemize} +% +% \changes{1.3z}{1998/09/19}{Redefine \cs{thechapter} and +% \cs{@chapapp} globally (pr/2862)} +% \begin{macrocode} +%<*report|book> +\newcommand\appendix{\par + \setcounter{chapter}{0}% + \setcounter{section}{0}% + \gdef\@chapapp{\appendixname}% + \gdef\thechapter{\@Alph\c@chapter}} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \subsection{Setting parameters for existing environments} +% +% \subsubsection{Array and tabular} +% +% \begin{macro}{\arraycolsep} +% The columns in an array environment are separated by +% 2|\arraycolsep|. +% \begin{macrocode} +\setlength\arraycolsep{5\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabcolsep} +% The columns in an tabular environment are separated by +% 2|\tabcolsep|. +% \begin{macrocode} +\setlength\tabcolsep{6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arrayrulewidth} +% The width of rules in the array and tabular environments is given +% by\\ |\arrayrulewidth|. +% \begin{macrocode} +\setlength\arrayrulewidth{.4\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doublerulesep} +% The space between adjacent rules in the array and tabular +% environments is given by |\doublerulesep|. +% \begin{macrocode} +\setlength\doublerulesep{2\p@} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Tabbing} +% +% \begin{macro}{\tabbingsep} +% This controls the space that the |\'| command puts in. (See +% \LaTeX{} manual for an explanation.) +% \begin{macrocode} +\setlength\tabbingsep{\labelsep} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Minipage} +% +% \begin{macro}{\@minipagerestore} +% The macro |\@minipagerestore| is called upon entry to a minipage +% environment to set up things that are to be handled differently +% inside a minipage environment. In the current styles, it does +% nothing. +% \end{macro} +% +% \begin{macro}{\@mpfootins} +% Minipages have their own footnotes; |\skip||\@mpfootins| plays +% same r\^ole for footnotes in a minipage as |\skip||\footins| does +% for ordinary footnotes. +% +% \begin{macrocode} +\skip\@mpfootins = \skip\footins +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Framed boxes} +% +% \begin{macro}{\fboxsep} +% The space left by |\fbox| and |\framebox| between the box and the +% text in it. +% \begin{macro}{\fboxrule} +% The width of the rules in the box made by |\fbox| and |\framebox|. +% \begin{macrocode} +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Equation and eqnarray} +% +% \begin{macro}{\theequation} +% When within chapters, the equation counter will be reset at +% the beginning of a new chapter and the equation number will +% be prefixed by the chapter number. +% \changes{v1.3u}{1996/10/31}{Added test for non-zero chapter number} +% +% This code must follow the |\chapter| definition or, more exactly, +% the definition of the chapter counter. +% \begin{macrocode} +%<article>\renewcommand \theequation {\@arabic\c@equation} +%<*report|book> +\@addtoreset {equation}{chapter} +\renewcommand\theequation + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\jot} +% |\jot| is the extra space added between lines of an eqnarray +% environment. The default value is used. +% \begin{macrocode} +% \setlength\jot{3pt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@eqnnum} +% The macro |\@eqnnum| defines how equation numbers are to appear in +% equations. Again the default is used. +% +% \begin{macrocode} +% \def\@eqnnum{(\theequation)} +% \end{macrocode} +% \end{macro} +% +% \subsection{Floating objects} +% +% The file \file{latex.dtx} only defines a number of tools with +% which floating objects can be defined. This is done in the +% document class. It needs to define the following macros for each +% floating object of type \texttt{TYPE} (e.g., \texttt{TYPE} = +% figure). +% +% \begin{description} +% \item[\texttt{\bslash fps@TYPE}] +% The default placement specifier for floats of type +% \texttt{TYPE}. +% +% \item[\texttt{\bslash ftype@TYPE}] +% The type number for floats of type \texttt{TYPE}. Each +% \texttt{TYPE} has associated a unique positive \texttt +% {TYPE} number, which is a power of two. E.g., figures might +% have type number 1, tables type number 2, programs type +% number 4, etc. +% +% \item[\texttt{\bslash ext@TYPE}] +% The file extension indicating the file on which the contents +% list for float type \texttt{TYPE} is stored. For example, +% |\ext@figure| = `lof'. +% +% \item[\texttt{\bslash fnum@TYPE}] +% A macro to generate the figure number for a caption. For +% example, |\fnum@TYPE| == `Figure |\thefigure|'. +% +% \item[\texttt{\bslash @makecaption}{\meta{num}}{\meta{text}}] +% A macro to make a caption, with \meta{num} the value produced +% by |\fnum@...| and \meta{text} the text of the caption. It +% can assume it's in a |\parbox| of the appropriate width. +% This will be used for \emph{all} floating objects. +% +% \end{description} +% +% The actual environment that implements a floating object such as +% a figure is defined using the macros |\@float| and |\end@float|, +% which are defined in \file{latex.dtx}. +% +% An environment that implements a single column floating object is +% started with |\@float{|\texttt{TYPE}|}[|\meta{placement}|]| of type +% \texttt{TYPE} with \meta{placement} as the placement specifier. +% The default value of \meta{PLACEMENT} is defined by |\fps@TYPE|. +% +% The environment is ended by |\end@float|. E.g., |\figure| == +% |\@float|{figure}, |\endfigure| == |\end@float|. +% +% \subsubsection{Figure} +% +% Here is the implementation of the figure environment. +% +% \begin{macro}{\c@figure} +% First we have to allocate a counter to number the figures. +% +% In the report and book document classes figures within chapters are +% numbered per chapter. +% \changes{v1.3u}{1996/10/31}{Added test for non-zero chapter number} +% \begin{macrocode} +%<*article> +\newcounter{figure} +\renewcommand \thefigure {\@arabic\c@figure} +%</article> +%<*report|book> +\newcounter{figure}[chapter] +\renewcommand \thefigure + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@figure} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fps@figure} +% \begin{macro}{\ftype@figure} +% \begin{macro}{\ext@figure} +% \begin{macro}{\num@figure} +% Here are the parameters for the floating objects of type `figure'. +% \changes{v1.4e}{2001/05/24}{Replaced tilde with \cs{nobreakspace} +% (pr/3310)} +% \begin{macrocode} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename\nobreakspace\thefigure} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{figure} +% \begin{environment}{figure*} +% And the definition of the actual environment. The form with the +% |*| is used for double column figures. +% \begin{macrocode} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \subsubsection{Table} +% +% Here is the implementation of the table environment. It is very +% much the same as the figure environment. +% +% \begin{macro}{\c@table} +% First we have to allocate a counter to number the tables. +% +% In the report and book document classes tables within chapters are +% numbered per chapter. +% \changes{v1.3u}{1996/10/31}{Added test for non-zero chapter number} +% \begin{macrocode} +%<*article> +\newcounter{table} +\renewcommand\thetable{\@arabic\c@table} +%</article> +%<*report|book> +\newcounter{table}[chapter] +\renewcommand \thetable + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@table} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fps@table} +% \begin{macro}{\ftype@table} +% \begin{macro}{\ext@table} +% \begin{macro}{\num@table} +% Here are the parameters for the floating objects of type `table'. +% \changes{v1.4e}{2001/05/24}{Replaced tilde with \cs{nobreakspace} +% (pr/3310)} +% \begin{macrocode} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\nobreakspace\thetable} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{table} +% \begin{environment}{table*} +% And the definition of the actual environment. The form with the +% |*| is used for double column tables. +% \begin{macrocode} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \subsubsection{Captions} +% +% \begin{macro}{\@makecaption} +% The |\caption| command calls |\@makecaption| to format the +% caption of floating objects. It gets two arguments, +% \meta{number}, the number of the floating object and \meta{text}, +% the text of the caption. Usually \meta{number} contains a string +% such as `Figure 3.2'. The macro can assume it is called inside a +% |\parbox| of right width, with |\normalsize|. +% +% \begin{macro}{\abovecaptionskip} +% \begin{macro}{\belowcaptionskip} +% These lengths contain the amount of white space to leave above +% and below the caption. +% \begin{macrocode} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% The definition of this macro is |\long| in order to allow more +% then one paragraph in a caption. +% \begin{macrocode} +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip +% \end{macrocode} +% We want to see if the caption fits on one line on the page, +% therefore we first typeset it in a temporary box. +% \changes{v1.2q}{1994/05/29}{Use \cs{sbox}\cs{@tempboxa} instead of +% \cs{setbox}\cs{@tempboxa}\cs{hbox} to make this colour safe} +% \begin{macrocode} + \sbox\@tempboxa{#1: #2}% +% \end{macrocode} +% We can the measure its width. It that is larger than the current +% |\hsize| we typeset the caption as an ordinary paragraph. +% \begin{macrocode} + \ifdim \wd\@tempboxa >\hsize + #1: #2\par +% \end{macrocode} +% If the caption fits, we center it. Because this uses an |\hbox| +% directly in vertical mode, it does not execute the |\everypar| +% tokens; the only thing that could be needed here is resetting the +% `minipage flag' so we do this explicitly. +% \changes{v1.2x}{1994/12/09}{Due to a change in the way floats are +% handled we need to set the \cs{if@minipage} switch to false} +% \begin{macrocode} + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} +% \end{macrocode} +% \end{macro} +% +% \subsection{Font changing} +% +% Here we supply the declarative font changing commands that were +% common in \LaTeX\ version 2.09 and earlier. These commands work +% in text mode \emph{and} in math mode. They are provided for +% compatibility, but one should start using the |\text...| and +% |\math...| commands instead. These commands are defined using +% |\DeclareTextFontCommand|, a command with three arguments: the +% user command to be defined; \LaTeX\ commands to execute in text +% mode and \LaTeX\ commands to execute in math mode. +% +% \changes{v1.0g}{1993/12/12}{Distinguished between compatibility and +% `normal' mode for the font changing commands.} +% \changes{v1.0h}{1993/12/18}{These are now defined in the kernel, so +% use \cs{@renewfontswitch}. Compatibility mode defines +% \cs{@renewfontswitch} to do nothing, so we don't need to check +% for compatibility mode any more.} +% \changes{v1.0j}{1993/12/20}{Added \cs{normalfont} back in the +% definitions of \cs{rm} etc. as this should be the default +% behaviour} +% \changes{v1.2e}{1994/04/14}{\cs{@renewfontswitch} has become +% \cs{DeclareOldFontCommand}} +% +% \begin{macro}{\rm} +% \changes{v1.0f}{1993/12/08}{Macro added} +% \begin{macro}{\tt} +% \changes{v1.0f}{1993/12/08}{Macro added} +% \begin{macro}{\sf} +% \changes{v1.0f}{1993/12/08}{Macro added} +% +% The commands to change the family. When in compatibility mode we +% select the `default' font first, to get \LaTeX2.09 behaviour. +% \begin{macrocode} +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bf} +% \changes{v1.0f}{1993/12/08}{Macro added} +% The command to change to the bold series. One should use +% |\mdseries| to explicitly switch back to medium series. +% \begin{macrocode} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sl} +% \changes{v1.0f}{1993/12/08}{Macro added} +% \changes{v1.2g}{1994/04/24}{Added warning if used in math mode} +% \begin{macro}{\it} +% \changes{v1.0f}{1993/12/08}{Macro added} +% \begin{macro}{\sc} +% \changes{v1.0f}{1993/12/08}{Macro added} +% \changes{v1.2g}{1994/04/24}{Added warning if used in math mode} +% +% And the commands to change the shape of the font. The slanted and +% small caps shapes are not available by default as math alphabets, +% so those changes do nothing in math mode. However, we do warn the +% user that the selection will not have any effect.One should use +% |\upshape| to explicitly change back to the upright shape. +% \begin{macrocode} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cal} +% \changes{v1.0g}{1993/12/12}{Macro added} +% \begin{macro}{\mit} +% \changes{v1.0g}{1993/12/12}{Macro added} +% +% The commands |\cal| and |\mit| should only be used in math mode, +% outside math mode they have no effect. Currently the New Font +% Selection Scheme defines these commands to generate warning +% messages. Therefore we have to define them `by hand'. +% \changes{v1.2w}{1994/12/01}{Now define \cs{cal} and \cs{mit} using +% \cs{DeclareRobustCommand*}} +% \changes{v1.3j}{1995/08/16}{Remove surplus braces} +% \begin{macrocode} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \section{Cross Referencing} +% \subsection{Table of Contents, etc.} +% +% A |\section| command writes a +% |\contentsline{section}{|\meta{title}|}{|\meta{page}|}| command +% on the \file{.toc} file, where \meta{title} contains the +% contents of the entry and \meta{page} is the page number. If +% sections are being numbered, then \meta{title} will be of the +% form |\numberline{|\meta{num}|}{|\meta{heading}|}| where +% \meta{num} is the number produced by |\thesection|. Other +% sectioning commands work similarly. +% +% A |\caption| command in a `figure' environment writes +% +% |\contentsline{figure}{\numberline{|\meta{num}|}{|% +% \meta{caption}|}}{|\meta{page}|}| +% +% on the .\file{lof} file, where \meta{num} is the number produced +% by |\thefigure| and \meta{caption} is the figure caption. It +% works similarly for a `table' environment. +% +% The command |\contentsline{|\meta{name}|}| expands to +% |\l@|\meta{name}. So, to specify the table of contents, we must +% define |\l@chapter|, |\l@section|, |\l@subsection|, ... ; to +% specify the list of figures, we must define |\l@figure|; and so +% on. Most of these can be defined with the |\@dottedtocline| +% command, which works as follows. +% +% |\@dottedtocline{|\meta{level}|}{|\meta{indent}|}{|^^A +% \meta{numwidth}|}{|^^A +% \meta{title}|}{|\meta{page}|}| +% +% \begin{description} +% \item[\meta{level}] An entry is produced only if\meta{ level} +% $<=$ value of the \Lcount{tocdepth} counter. Note, +% |\chapter| is level 0, |\section| is level 1, etc. +% \item[\meta{indent}] The indentation from the outer left margin +% of the start of the contents line. +% \item[\meta{numwidth}] The width of a box in which the section +% number is to go, if \meta{title} includes a |\numberline| +% command. +% \end{description} +% +% \begin{macro}{\@pnumwidth} +% \begin{macro}{\@tocrmarg} +% \begin{macro}{\@dotsep} +% This command uses the following three parameters, which are set +% with a |\newcommand| (so em's can be used to make them depend upon +% the font). +% \begin{description} +% \item[\texttt{\bslash @pnumwidth}] The width of a box in which the +% page number is put. +% \changes{v1.2v}{1994/10/29}{Changed documentation from $!>$ or $!=$ to +% $\ge$} +% \item[\texttt{\bslash @tocrmarg}] The right margin for multiple +% line entries. One wants |\@tocrmarg| $\ge$ |\@pnumwidth| +% \item[\texttt{\bslash @dotsep}] Separation between dots, in mu +% units. Should be defined as a number like 2 or 1.7 +% \end{description} +% +% \begin{macrocode} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +%<article>\setcounter{tocdepth}{3} +%<!article>\setcounter{tocdepth}{2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Table of Contents} +% +% \begin{macro}{\tableofcontents} +% This macro is used to request that \LaTeX{} produces a table of +% contents. In the report and book document classes the tables of +% contents, figures etc. are always set in single-column style. +% +% \changes{v1.0g}{1993/12/09}{Moved the setting of +% \cs{@restonecolfalse}} +% \changes{v1.4h}{2007/10/19}{Explain why \cs{@mkboth} is inside the heading +% arg for \cs{tableofcontents} (pr/3285 and pr/3984)} +% \begin{macrocode} +\newcommand\tableofcontents{% +%<*report|book> + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi +% \end{macrocode} +% The title is set using the |\chapter*| command, making sure that +% the running head --if one is required-- contains the right +% information. +% \begin{macrocode} + \chapter*{\contentsname +%</report|book> +%<article> \section*{\contentsname +% \end{macrocode} +% The code for |\@mkboth| is placed inside the heading to avoid any +% influence on vertical spacing after the heading (in some cases). For +% other commands, such as |\listoffigures| below this has been changed from +% the \LaTeX{}2.09 version as it will produce a serious bug if used in +% two-column mode (see, pr/3285). However |\tableofcontents| is always +% typeset in one-column mode in these classes, therefore the somewhat +% inconsistent setting has been retained for compatibility reasons. +% \begin{macrocode} + \@mkboth{% + \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% +% \end{macrocode} +% The the actual table of contents is made by calling +% |\@starttoc{toc}|. After that we restore twocolumn mode if +% necessary. +% \begin{macrocode} + \@starttoc{toc}% +%<!article> \if@restonecol\twocolumn\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@part} +% Each sectioning command needs an additional macro to format its +% entry in the table of contents, as described above. The macro for +% the entry for parts is defined in a special way. +% +% First we make sure that if a pagebreak should occur, it occurs +% \emph{before} this entry. Also a little whitespace is added and a +% group begun to keep changes local. +% \changes{v1.0h}{1993/12/18}{Replaced -\cs{@secpenalty} by +% \cs{@secpenalty}. ASAJ.} +% \changes{v1.2i}{1994/04/28}{Don't print a toc line when the tocdepth +% counter is less then -1} +% \changes{v1.3b}{1995/05/23}{Added missing braces around argument +% to \cs{addpenalty}.} +% \changes{v1.3x}{1997/10/10}{Removed setting of \cs{@tempdima} as +% this macro does not use \cs{numberline} to set the toc line.} +% \changes{v1.4a}{1998/10/12}{we should use \cs{@tocrmarg}; see PR/2881.} +% \begin{macrocode} +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax +%<article> \addpenalty\@secpenalty +%<!article> \addpenalty{-\@highpenalty}% + \addvspace{2.25em \@plus\p@}% +% \end{macrocode} +% The macro |\numberline| requires that the width of the box that +% holds the part number is stored in \LaTeX's scratch register +% |\@tempdima|. Therefore we initialize it there even though we do +% not use |\numberline| internally---the value used is quite large +% so that something like |\numberline{VIII}| would still work. +% \changes{v1.4d}{2001/04/21}{Initialize \cs{@tempdima} to some +% sensible value (pr/3327)} +% \begin{macrocode} + \setlength\@tempdima{3em}% + \begingroup +% \end{macrocode} +% We set |\parindent| to 0pt and use |\rightskip| to leave +% enough room for the pagenumbers.\footnote{^^A +% We should really set \cs{rightskip} to \cs{@tocrmarg} instead +% of \cs{@pnumwidth} (no version of {\LaTeX} ever did this), +% otherwise the \cs{rightskip} is too small. +% Unfortunately this can't be changed in {\LaTeXe} as we don't +% want to create different versions of {\LaTeXe} which produce +% different typset output unless this is absolutely necessary; +% instead we suspend it for \LaTeX3.} +% To prevent overfull box messages the |\parfillskip| is set to a +% negative value. +% \begin{macrocode} + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth +% \end{macrocode} +% Now we can set the entry, in a large bold font. We make sure to +% leave vertical mode, set the part title and add the pagenumber, +% set flush right. +% \begin{macrocode} + {\leavevmode + \large \bfseries #1\hfil + \hb@xt@\@pnumwidth{\hss #2% +% \end{macrocode} +% +% \changes{v1.4i}{2018/09/03}{Prevent protrusion +% (\url{https://tex.stackexchange.com/q/172785/10109})} +% \begin{macrocode} + \kern-\p@\kern\p@}}\par +% \end{macrocode} +% Prevent a pagebreak immediately after this entry, but use +% |\everypar| to reset the |\if@nobreak| switch. Finally we close +% the group. +% \changes{v1.3j}{1995/08/16}{Add missing percent} +% \begin{macrocode} + \nobreak +%<article> \if@compatibility + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% +%<article> \fi + \endgroup + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@chapter} +% This macro formats the entries in the table of contents for +% chapters. It is very similar to |\l@part| +% +% First we make sure that if a pagebreak should occur, it occurs +% \emph{before} this entry. Also a little whitespace is added and a +% group begun to keep changes local. +% \changes{v1.2i}{1994/04/28}{Don't print a toc line when the tocdepth +% counter is less than 0} +% \changes{v1.3b}{1995/05/23}{Added missing braces around argument +% to \cs{addpenalty}.} +% \changes{v1.4a}{1998/10/12}{we should use \cs{@tocrmarg}; see PR/2881.} +% \begin{macrocode} +%<*report|book> +\newcommand*\l@chapter[2]{% + \ifnum \c@tocdepth >\m@ne + \addpenalty{-\@highpenalty}% + \vskip 1.0em \@plus\p@ +% \end{macrocode} +% +% The macro |\numberline| requires that the width of the box that +% holds the part number is stored in \LaTeX's scratch register +% |\@tempdima|. Therefore we initialize it there even though we do +% not use |\numberline| internally (the position as well as the +% values seems questionable but can't be changed without producing +% compatibility problems). We begin a group, and change +% some of the paragraph parameters (see also the remark at +% \cs{l@part} regarding \cs{rightskip}). +% \begin{macrocode} + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth +% \end{macrocode} +% Then we leave vertical mode and switch to a bold font. +% \begin{macrocode} + \leavevmode \bfseries +% \end{macrocode} +% Because we do not use |\numberline| here, we have do some fine +% tuning `by hand', before we can set the entry. We discourage but +% not disallow a pagebreak immediately after a chapter entry. +% \begin{macrocode} + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil + \nobreak\hb@xt@\@pnumwidth{\hss #2% +% \end{macrocode} +% +% \changes{v1.4i}{2018/09/03}{Prevent protrusion +% (\url{https://tex.stackexchange.com/q/172785/10109})} +% \begin{macrocode} + \kern-\p@\kern\p@}\par + \penalty\@highpenalty + \endgroup + \fi} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@section} +% In the article document class the entry in the table of contents +% for sections looks much like the chapter entries for the report +% and book document classes. +% +% First we make sure that if a pagebreak should occur, it occurs +% \emph{before} this entry. Also a little whitespace is added and a +% group begun to keep changes local. +% \changes{v1.0h}{1993/12/18}{Replaced -\cs{@secpenalty} by +% \cs{@secpenalty}. ASAJ.} +% \changes{v1.2i}{1994/04/28}{Don't print a toc line when the tocdepth +% counter is less than 1.} +% \changes{v1.4a}{1998/10/12}{we should use \cs{@tocrmarg}; see PR/2881.} +% \begin{macrocode} +%<*article> +\newcommand*\l@section[2]{% + \ifnum \c@tocdepth >\z@ + \addpenalty\@secpenalty + \addvspace{1.0em \@plus\p@}% +% \end{macrocode} +% +% The macro |\numberline| requires that the width of the box that +% holds the part number is stored in \LaTeX's scratch register +% |\@tempdima|. Therefore we put it there. We begin a group, and +% change some of the paragraph parameters (see also the remark at +% \cs{l@part} regarding \cs{rightskip}). +% \begin{macrocode} + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth +% \end{macrocode} +% Then we leave vertical mode and switch to a bold font. +% \begin{macrocode} + \leavevmode \bfseries +% \end{macrocode} +% Because we do not use |\numberline| here, we have do some fine +% tuning `by hand', before we can set the entry. We discourage but +% not disallow a pagebreak immediately after a chapter entry. +% \begin{macrocode} + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil + \nobreak\hb@xt@\@pnumwidth{\hss #2% +% \end{macrocode} +% +% \changes{v1.4i}{2018/09/03}{Prevent protrusion +% (\url{https://tex.stackexchange.com/q/172785/10109})} +% \begin{macrocode} + \kern-\p@\kern\p@}\par + \endgroup + \fi} +%</article> +% \end{macrocode} +% In the report and book document classes the definition for +% |\l@section| is much simpler. +% \begin{macrocode} +%<*report|book> +\newcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}} +%</report|book> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@subsection} +% \begin{macro}{\l@subsubsection} +% \begin{macro}{\l@paragraph} +% \begin{macro}{\l@subparagraph} +% All lower level entries are defined using the macro +% |\@dottedtocline| (see above). +% \begin{macrocode} +%<*article> +\newcommand*\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{10em}{5em}} +%</article> +%<*report|book> +\newcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}} +%</report|book> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{List of figures} +% +% \begin{macro}{\listoffigures} +% This macro is used to request that \LaTeX{} produces a list of +% figures. It is very similar to |\tableofcontents|. +% +% \changes{v1.0g}{1993/12/09}{Moved the setting of +% \cs{@restonecolfalse}} +% \changes{v1.4c}{2001/01/06}{Moved \cs{@mkboth} out of heading +% arg (pr/3285)} +% \begin{macrocode} +\newcommand\listoffigures{% +%<*report|book> + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \chapter*{\listfigurename}% +%</report|book> +%<article> \section*{\listfigurename}% + \@mkboth{\MakeUppercase\listfigurename}% + {\MakeUppercase\listfigurename}% + \@starttoc{lof}% +%<report|book> \if@restonecol\twocolumn\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@figure} +% This macro produces an entry in the list of figures. +% \begin{macrocode} +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{List of tables} +% +% \begin{macro}{\listoftables} +% This macro is used to request that \LaTeX{} produces a list of +% tables. It is very similar to |\tableofcontents|. +% +% \changes{v1.0g}{1993/12/09}{Moved the setting of +% \cs{@restonecolfalse}} +% \changes{v1.4c}{2001/01/06}{Moved \cs{@mkboth} out of heading +% arg (pr/3285)} +% \begin{macrocode} +\newcommand\listoftables{% +%<*report|book> + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \chapter*{\listtablename}% +%</report|book> +%<article> \section*{\listtablename}% + \@mkboth{% + \MakeUppercase\listtablename}% + {\MakeUppercase\listtablename}% + \@starttoc{lot}% +%<report|book> \if@restonecol\twocolumn\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\l@table} +% This macro produces an entry in the list of tables. +% \begin{macrocode} +\let\l@table\l@figure +% \end{macrocode} +% \end{macro} +% +% \subsection{Bibliography} +% +% \begin{macro}{\bibindent} +% The ``open'' bibliography format uses an indentation of +% |\bibindent|. +% \begin{macrocode} +\newdimen\bibindent +\setlength\bibindent{1.5em} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{thebibliography} +% The `thebibliography' environment executes the following +% commands: +% +% |\renewcommand{\newblock}{\hskip.11em \@plus.33em \@minus.07em}|\\ +% --- Defines the ``closed'' format, where the blocks (major units +% of information) of an entry run together. +% +% |\sloppy| --- Used because it's rather hard to do line breaks in +% bibliographies, +% +% |\sfcode`\.=1000\relax| --- +% Causes a `.' (period) not to produce an end-of-sentence space. +% +% The implementation of this environment is based on the generic +% list environment. It uses the \Lcount{enumiv} counter internally +% to generate the labels of the list. +% +% When an empty `thebibliography' environment is found, a warning +% is issued. +% +% \changes{v1.0i}{1993/12/19}{Corrected definition of thebibliography +% for article} +% \changes{v1.2z}{1995/05/09}{added a missing percent character} +% \changes{v1.3b}{1995/05/23}{Added missing braces in definition +% of thebibliography environment.} +% \changes{v1.3j}{1995/08/16}{remove surplus spaces} +% \changes{v1.3k}{1995/08/27}{Code for openbib changed} +% \changes{v1.3t}{1996/10/05}{Added setting value of \cs{@clubpenalty}} +% \begin{macrocode} +\newenvironment{thebibliography}[1] +%<*article> + {\section*{\refname}% +% \end{macrocode} +% The |\@mkboth| was moved out of the heading argument since at +% least in report and book (twocolumn option) there are definitions +% for |\chapter| which would swallow it otherwise. +% \changes{v1.4c}{2001/01/06}{Moved \cs{@mkboth} out of heading +% arg (pr/3285)} +% \begin{macrocode} + \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}% +%</article> +%<*!article> + {\chapter*{\bibname}% + \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}% +%</!article> + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy +% \end{macrocode} +% This is setting the normal (non-infinite) value of +% |\clubpenalty| for the whole of this environment, +% so we must reset its stored value also. (Why is there a |%| after +% the second 4000 below?) +% \begin{macrocode} + \clubpenalty4000 + \@clubpenalty \clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\newblock} +% The default definition for |\newblock| is to produce a small space. +% \changes{v1.3k}{1995/08/27}{Default changed.} +% \begin{macrocode} +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@openbib@code} +% The default definition for |\@openbib@code| is to do nothing. +% It will be changed by the \Lopt{openbib} option. +% \changes{v1.3k}{1995/08/27}{Macro added} +% \begin{macrocode} +\let\@openbib@code\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@biblabel} +% The label for a |\bibitem[...]| command is produced by this +% macro. The default from \file{latex.dtx} is used. +% \begin{macrocode} +% \renewcommand*{\@biblabel}[1]{[#1]\hfill} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cite} +% The output of the |\cite| command is produced by this macro. The +% default from \file{latex.dtx} is used. +% \begin{macrocode} +% \renewcommand*{\@cite}[1]{[#1]} +% \end{macrocode} +% \end{macro} +% +% \subsection{The index} +% +% \begin{environment}{theindex} +% The environment `theindex' can be used for indices. It makes an +% index with two columns, with each entry a separate paragraph. At +% the user level the commands |\item|, |\subitem| and |\subsubitem| +% are used to produce index entries of various levels. When a new +% letter of the alphabet is encountered an amount of |\indexspace| +% white space can be added. +% +% +% \changes{v1.0g}{1993/12/09}{Moved the setting of +% \cs{@restonecoltrue}} +% \begin{macrocode} +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi +%<article> \twocolumn[\section*{\indexname}]% +%<!article> \twocolumn[\@makeschapterhead{\indexname}]% + \@mkboth{\MakeUppercase\indexname}% + {\MakeUppercase\indexname}% + \thispagestyle{plain}\parindent\z@ +% \end{macrocode} +% Parameter changes to |\columnseprule| and |\columnsep| have to be +% done after |\twocolumn| has acted. Otherwise they can affect the +% last page before the index. +% \changes{ v1.4f}{2004/02/16}{Moved setting of \cs{columnsep} and +% \cs{columnseprule} later to avoid affecting the wrong page (pr/3616)} +% \begin{macrocode} + \parskip\z@ \@plus .3\p@\relax + \columnseprule \z@ + \columnsep 35\p@ + \let\item\@idxitem} +% \end{macrocode} +% When the document continues after the index and it was a one +% column document we have to switch back to one column after the +% index. +% \begin{macrocode} + {\if@restonecol\onecolumn\else\clearpage\fi} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\@idxitem} +% \begin{macro}{\subitem} +% \begin{macro}{\subsubitem} +% These macros are used to format the entries in the index. ^^AA ??? +% \changes{v1.3f}{1995/06/23}{Corrected error in definition of +% \cs{@idxitem}.} +% \changes{v1.3j}{1995/08/16}{use \cs{@idxitem} to save space} +% \begin{macrocode} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\indexspace} +% The amount of white space that is inserted between `letter +% blocks' in the index. +% \begin{macrocode} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} +% \end{macrocode} +% \end{macro} +% +% \subsection{Footnotes} +% +% \begin{macro}{\footnoterule} +% Usually, footnotes are separated from the main body of the text +% by a small rule. This rule is drawn by the macro |\footnoterule|. +% We have to make sure that the rule takes no vertical space (see +% \file{plain.tex}) so we compensate for the natural height of the +% rule of 0.4pt by adding the right amount of vertical skip. +% +% To prevent the rule from colliding with the footnote we first add +% a little negative vertical skip, then we put the rule and make +% sure we end up at the same point where we begun this operation. +% \changes{v1.3a}{1995/05/17}{use \cs{@width}} +% \begin{macrocode} +\renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.4\columnwidth + \kern2.6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@footnote} +% Footnotes are numbered within chapters in the report and book +% document styles. +% \begin{macrocode} +%<!article>\@addtoreset{footnote}{chapter} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext} +% The footnote mechanism of \LaTeX{} calls the macro |\@makefntext| +% to produce the actual footnote. The macro gets the text of the +% footnote as its argument and should use |\@thefnmark| as the mark +% of the footnote. The macro |\@makefntext|is called when +% effectively inside a |\parbox| of width |\columnwidth| (i.e., +% with |\hsize| = |\columnwidth|). +% +% An example of what can be achieved is given by the following piece +% of \TeX\ code. +% \begin{verbatim} +% \newcommand\@makefntext[1]{% +% \@setpar{\@@par +% \@tempdima = \hsize +% \advance\@tempdima-10pt +% \parshape \@ne 10pt \@tempdima}% +% \par +% \parindent 1em\noindent +% \hbox to \z@{\hss\@makefnmark}#1} +% \end{verbatim} +% The effect of this definition is that all lines of the footnote +% are indented by 10pt, while the first line of a new paragraph is +% indented by 1em. To change these dimensions, just substitute the +% desired value for `10pt' (in both places) or `1em'. The mark is +% flushright against the footnote. +% +% In these document classes we use a simpler macro, in which the +% footnote text is set like an ordinary text paragraph, with no +% indentation except on the first line of a paragraph, and the +% first line of the footnote. Thus, all the macro must do is set +% |\parindent| to the appropriate value for succeeding paragraphs +% and put the proper indentation before the mark. +% +% \changes{v1.1a}{1994/03/13}{Use \cs{@makefnmark} to generate +% footnote marker} +% \begin{macrocode} +\newcommand\@makefntext[1]{% + \parindent 1em% + \noindent + \hb@xt@1.8em{\hss\@makefnmark}#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefnmark} +% The footnote markers that are printed in the text to point to the +% footnotes should be produced by the macro |\@makefnmark|. We use +% the default definition for it. +% \begin{macrocode} +%\renewcommand\@makefnmark{\hbox{\@textsuperscript +% {\normalfont\@thefnmark}}} +% \end{macrocode} +% \end{macro} +% +% \section{Initialization} +% +% \subsection{Words} +% +% This document class is for documents prepared in the English language. +% To prepare a version for another language, various English words must +% be replaced. All the English words that require replacement are +% defined below in command names. These commands may be redefined in +% any class or package that is customising \LaTeX\ for use with +% non-English languages. +% \changes{v1.3h}{1995/07/20}{Split up to save save stack /1742} +% +% \begin{macro}{\contentsname} +% \begin{macro}{\listfigurename} +% \begin{macro}{\listtablename} +% \begin{macrocode} +\newcommand\contentsname{Contents} +\newcommand\listfigurename{List of Figures} +\newcommand\listtablename{List of Tables} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\refname} +% \begin{macro}{\bibname} +% \begin{macro}{\indexname} +% \begin{macrocode} +%<article>\newcommand\refname{References} +%<report|book>\newcommand\bibname{Bibliography} +\newcommand\indexname{Index} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\figurename} +% \begin{macro}{\tablename} +% \begin{macrocode} +\newcommand\figurename{Figure} +\newcommand\tablename{Table} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\partname} +% \begin{macro}{\chaptername} +% \begin{macro}{\appendixname} +% \begin{macro}{\abstractname} +% \begin{macrocode} +\newcommand\partname{Part} +%<report|book>\newcommand\chaptername{Chapter} +\newcommand\appendixname{Appendix} +%<!book>\newcommand\abstractname{Abstract} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Date} +% +% \begin{macro}{\today} +% This macro uses the \TeX\ primitives |\month|, |\day| and |\year| +% to provide the date of the \LaTeX-run. +% +% At |\begin{document}| this definition will be optimised +% so that the names of all the `wrong' months are not stored. +% This optimisation is not done here as that would `freeze' +% |\today| in any special purpose format made by loading the class +% file into the format file. +% \changes{v1.3j}{1995/08/16}{use \cs{edef} to save a lot of space} +% \changes{v1.3w}{1997/10/06}{use \cs{def} again, latex/2620} +% \begin{macrocode} +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +% \end{macrocode} +% \end{macro} +% +% \subsection{Two column mode} +% +% \begin{macro}{\columnsep} +% This gives the distance between two columns in two column mode. +% \begin{macrocode} +\setlength\columnsep{10\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\columnseprule} +% This gives the width of the rule between two columns in two +% column mode. We have no visible rule. +% \begin{macrocode} +\setlength\columnseprule{0\p@} +% \end{macrocode} +% \end{macro} +% +% \subsection{The page style} +% We have \pstyle{plain} pages in the document classes article and +% report unless the user specified otherwise. In the `book' +% document class we use the page style \pstyle{headings} by +% default. We use arabic pagenumbers. +% \begin{macrocode} +%<!book>\pagestyle{plain} +%<book>\pagestyle{headings} +\pagenumbering{arabic} +% \end{macrocode} +% +% \subsection{Single or double sided printing} +% +% +% \changes{v1.2v}{1994/11/10}{removed typo} +% When the \Lopt{twoside} option wasn't specified, we don't try to +% make each page as long as all the others. +% \begin{macrocode} +\if@twoside +\else + \raggedbottom +\fi +% \end{macrocode} +% When the \Lopt{twocolumn} option was specified we call +% |\twocolumn| to activate this mode. We try to make each column as +% long as the others, but call |sloppy| to make our life easier. +% \begin{macrocode} +\if@twocolumn + \twocolumn + \sloppy + \flushbottom +% \end{macrocode} +% Normally we call |\onecolumn| to initiate typesetting in one +% column. +% \begin{macrocode} +\else + \onecolumn +\fi +%</article|report|book> +% \end{macrocode} +% +% \changes{v1.3i}{1995/08/09}{Moved code for generic class options +% leqno and fleqn to kernel file} +% +% \Finale +% +\endinput + diff --git a/Master/texmf-dist/source/latex-dev/base/classes.ins b/Master/texmf-dist/source/latex-dev/base/classes.ins new file mode 100644 index 00000000000..b87115cee6b --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/classes.ins @@ -0,0 +1,121 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generate{\file{article.cls}{\from{classes.dtx}{article}} + \file{report.cls}{\from{classes.dtx}{report}} + \file{book.cls}{\from{classes.dtx}{book}} + \file{size10.clo}{\from{classes.dtx}{10pt}} + \file{size11.clo}{\from{classes.dtx}{11pt}} + \file{size12.clo}{\from{classes.dtx}{12pt}} + \file{bk10.clo}{\from{classes.dtx}{10pt,bk}} + \file{bk11.clo}{\from{classes.dtx}{11pt,bk}} + \file{bk12.clo}{\from{classes.dtx}{12pt,bk}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space article.cls} +\Msg{* \space\space report.cls} +\Msg{* \space\space book.cls} +\Msg{* \space\space size10.clo} +\Msg{* \space\space size11.clo} +\Msg{* \space\space size12.clo} +\Msg{* \space\space bk10.clo} +\Msg{* \space\space bk11.clo} +\Msg{* \space\space bk12.clo} +\Msg{* \space\space leqno.clo} +\Msg{* \space\space fleqn.clo} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile + diff --git a/Master/texmf-dist/source/latex-dev/base/cmextra.ins b/Master/texmf-dist/source/latex-dev/base/cmextra.ins new file mode 100644 index 00000000000..292bcd46d61 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/cmextra.ins @@ -0,0 +1,160 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2018 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2018 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +% Concrete font support removed: Use the contributed package available +% from ctan:macros/latex/contrib/supported/ccfonts. +% +% \Ask\answer{% +% ************************************************************** +% ^^J* +% ^^J* Do you have the Concrete Roman fonts installed on your system, +% ^^J* or do you intend to install them? +% ^^J* +% ^^J* If so please answer with `y' otherwise with `n' below. +% ^^J* +% ^^J* You can easily redo this installation later in case you +% ^^J* change your mind. +% ^^J**************************************************************} +% +% {\ifx\answer\y +% +% \Msg{*** Generating font defs for Cork encoded fonts ***} +% \Msg{*** Generating font defs for old TeX Text encoding ***} +% \Msg{*** Generating font defs for math italic encoding ***} +% +% \generate{% +% \file{t1ccr.fd}{\from{cmfonts.fdd}{fd,T1ccr}} +% \file{ot1ccr.fd}{\from{cmfonts.fdd}{fd,OT1ccr}} +% \file{omlccm.fd}{\from{cmfonts.fdd}{fd,OMLccm}}} +% +% \fi} + +\Ask\answer{% + ************************************************************** + ^^J* + ^^J* Do you have the cyrillic fonts from the University of + ^^J* Washington installed on your system, + ^^J* or do you intend to install them? + ^^J* + ^^J* If so please answer with `y' otherwise with `n' below. + ^^J* + ^^J* You can easily redo this installation later in case you + ^^J* change your mind. + ^^J* + ^^J* Normally it is better *not* to install these files, but use + ^^J* the support files provided in the cyrillic bundle instead!!! + ^^J* + ^^J* For that reason this installation file is no longer used + ^^J* when generating the run-time system. + ^^J* + ^^J**************************************************************} + +{\ifx\answer\y + +\Msg{*** Generating font defs for old TeX cyrillic text encoding ***} + +\generate{% + \file{ot2cmr.fd}{\from{cmfonts.fdd}{fd,OT2cmr}} + \file{ot2cmss.fd}{\from{cmfonts.fdd}{fd,OT2cmss}}} + +\fi} + + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd b/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd new file mode 100644 index 00000000000..1c83814ee5d --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/cmfonts.fdd @@ -0,0 +1,1301 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \CheckSum{295} +% +%\iffalse This is a META comment +% +% File `cmfonts.fdd'. +% Copyright (C) 1989-1999 Frank Mittelbach and Rainer Sch\"opf, +% all rights reserved. +% +%<OMLccm, >\ProvidesFile{omlccm.fd} +%<OMLcmm, >\ProvidesFile{omlcmm.fd} +%<OMLcmr, >\ProvidesFile{omlcmr.fd} +%<OMScmr, >\ProvidesFile{omscmr.fd} +%<OMScmsy, >\ProvidesFile{omscmsy.fd} +%<OMXcmex, >\ProvidesFile{omxcmex.fd} +%<OT1ccr, >\ProvidesFile{ot1ccr.fd} +%<OT1cmdh, >\ProvidesFile{ot1cmdh.fd} +%<OT1cmfib, >\ProvidesFile{ot1cmfib.fd} +%<OT1cmfr, >\ProvidesFile{ot1cmfr.fd} +%<OT1cmr, >\ProvidesFile{ot1cmr.fd} +%<OT1cmss, >\ProvidesFile{ot1cmss.fd} +%<OT1cmtt, >\ProvidesFile{ot1cmtt.fd} +%<OT1cmvtt, >\ProvidesFile{ot1cmvtt.fd} +%<OT2cmr, >\ProvidesFile{ot2cmr.fd} +%<OT2cmss, >\ProvidesFile{ot2cmss.fd} +%<T1ccr, >\ProvidesFile{t1ccr.fd} +%<T1cmdh, >\ProvidesFile{t1cmdh.fd} +%<T1cmfib, >\ProvidesFile{t1cmfib.fd} +%<T1cmfr, >\ProvidesFile{t1cmfr.fd} +%<T1cmr, >\ProvidesFile{t1cmr.fd} +%<T1cmss, >\ProvidesFile{t1cmss.fd} +%<T1cmtt, >\ProvidesFile{t1cmtt.fd} +%<T1cmvtt, >\ProvidesFile{t1cmvtt.fd} +%<TS1cmr, >\ProvidesFile{ts1cmr.fd} +%<TS1cmss, >\ProvidesFile{ts1cmss.fd} +%<TS1cmtt, >\ProvidesFile{ts1cmtt.fd} +%<TS1cmvtt, >\ProvidesFile{ts1cmvtt.fd} +%<Ucmr, >\ProvidesFile{ucmr.fd} +%<Ucmss, >\ProvidesFile{ucmss.fd} +%<Ucmtt, >\ProvidesFile{ucmtt.fd} +%<*driver, > + \ProvidesFile{cmfonts.drv} +%</driver, > + [2014/09/29 v2.5h Standard LaTeX font definitions] +% +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{cmfonts.drv} +\providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +\title{The file \texttt{cmfonts.fdd} for use with + \LaTeXe.\thanks{This file has version + number \fileversion, dated \filedate.}} +\date{\filedate}\author{Frank Mittelbach \and Rainer Sch\"opf} +\begin{document} +\MaintainedByLaTeXTeam{latex} +\maketitle + \DocInput{cmfonts.fdd} +\end{document} +%</driver> +% +%\fi +% +% +% +% \changes{v2.5e}{1997/06/16}{Replaced reference to DC-fonts by ec +% fonts.} +% \changes{v2.5c}{1997/05/26}{Removed spaces in and around arguments +% to \cs{DeclareFontShape} and \cs{EC@family}.} +% \changes{v2.4j}{1996/11/20}{lowercase filenames /1044} +% \changes{v2.4h}{1996/05/19}{Added CM variable typewriter family} +% \changes{v2.4g}{1996/05/17} +% {Force \cs{hyphenchar} of OT1 fonts to 45, in case +% \cs{defaulthyphenchar} has changed.} +% \changes{v2.4g}{1996/05/17} +% {Remove some spurious extra empty arguments to +% \cs{DeclareFontFamily} calls} +% \changes{v2.4d}{1995/12/01} +% {Documentation changes from Ulrik Vieth /1989} +% \changes{v2.4d}{1995/12/01} +% {Dont force T1 hyphenchar to 127. latex/1853} +% \changes{v2.4c}{1995/11/07}{Use decimal rather than octal character +% specification for \cs{hyphenchar} and \cs{skewchar} so that there is +% no problem with an active quote character.} +% \changes{v2.4a}{1995/10/22}{Added support for new (v1.2) DC fonts +% and text companion fonts (TS1 encoding).} +% \changes{v2.3d}{1994/11/02}{Added more font substitutions for +% \cs{pounds}.} +% \changes{v2.3d}{1994/10/30}{Added OMLcmr.fd and OMScmr.fd.} +% \changes{v2.3b}{1994/05/12}{Added \cs{ProvidesFile} commands} +% \changes{v2.3a}{1994/05/03}{Included definitions for +% AMS-supplied cm fonts.} +% \changes{v2.2f}{1994/02/07}{Added missing size 10.95 for +% cmr/b/n and cmr/m/ui.} +% \changes{v2.2e}{1994/02/02}{Corrected encoding scheme U.} +% \changes{v2.2d}{1994/01/27}{Replaced most ssub with sub} +% \changes{v2.2a}{1993/12/13}{Removed \cs{CodelineIndex} from the +% driver code.} +% +% \changes{v2.1a}{1993/10/17}{Shape u renamed to ui.} +% \changes{v2.1a}{1993/10/17}{File renamed to cmfonts.fdd.} +% +% +% +% \section{Introduction} +% +% This file contains the external font information needed to load +% the Computer Modern fonts designed by Don Knuth and distributed with +% \TeX. +% +% From this file all {\ttfamily.fd} files (font definition files) for +% the Computer Modern fonts, both with old encoding (|OT1|) and Cork +% encoding (|T1|) are generated. The Cork encoded fonts are known +% under the name ec fonts. +% +% \section{Customization} +% +% If you plan to install the AMS font package or if you have it +% already installed, please note that within this package there are +% additional sizes of the Computer Modern symbol and math italic +% fonts. With the release of \LaTeXe, these AMS `extracm' fonts have +% been included in the \LaTeX\ font set. Therefore, the math |.fd| files +% produced here assume the presence of these AMS extensions. +% +% For text fonts in \texttt{T1} encoding, the directive |new| selects +% the new (version 1.2) DC fonts. +% +% For the text fonts in \texttt{OT1} and \texttt{U} encoding, +% the optional \dst{} directive |ori| selects a conservatively +% generated set of font definition files, +% which means that only the basic font sizes coming with an old +% \LaTeX~2.09 installation are included into the |\DeclareFontShape| +% commands. However, on many installations, people have added missing +% sizes by scaling up or down available Metafont sources. For example, +% the Computer Modern Roman italic font |cmti| is only available in +% the sizes 7, 8, 9, and 10pt. Nevertheless one could generate it for +% the sizes 5, and 6pt by using the source from |cmti7| scaled +% downwards. The corresponding enlarged font set is generated if the +% \dst{} directive |ori| is not used. +% +% When you generate the |.fd| files using the installation script +% |cmfonts.ins| distributed with \LaTeXe, the enlarged font set is +% selected. +% If you want to select the conservative set of |.fd| files, you have to +% replace statements like +% \begin{verbatim} +% \generateFile{OT1cmr.fd}{t}{\from{cmfonts.fdd}{fd,OT1cmr}} +%\end{verbatim} +% with +% \begin{verbatim} +% \generateFile{OT1cmr.fd}{t}{\from{cmfonts.fdd}{fd,OT1cmr,ori}} +%\end{verbatim} +% in the installation script, or more exactly by copying the +% installation script to a file with a new name and change that copy. +% +% \StopEventually{} +% +% \section{The \texttt{docstrip} modules} +% +% The following modules are used to direct \texttt{docstrip} in +% generating external files: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% nowarn & produce |.fd| files that do not warn about substitutions\\ +% ori & make conservative |.fd| files\\ +% new & select version 1.2 DC fonts\\ +% ec & select EC fonts\\ +% fd & produce a font definition file (actually no longer used)\\[2pt] +% OMLccm & make Concrete Roman Math italic\\ +% OMLcmm & make Computer Modern Math italic\\ +% OMLcmr & make Computer Modern Roman (math italic encoding)\\ +% OMScmr & make Computer Modern Roman (math symbol encoding)\\ +% OMScmsy & make Computer Modern Symbols \\ +% OMXcmex & make Computer Modern large Symbols\\ +% OT1ccr & make Concrete Roman (old encoding) \\ +% OT1cmdh & make Computer Modern Dunhill (old encoding)\\ +% OT1cmfib & make Computer Modern Fibonacci (old encoding)\\ +% OT1cmfr & make Computer Modern Funny (old encoding)\\ +% OT1cmr & make Computer Modern Roman (old encoding)\\ +% OT1cmss & make Computer Modern Sans (old encoding)\\ +% OT1cmtt & make Computer Modern Typewriter (old encoding)\\ +% OT1cmvtt & make Computer Modern Variable Typewriter (old encoding)\\ +% OT2cmr & make Computer Modern Roman (old cyrillic encoding)\\ +% OT2cmss & make Computer Modern Sans (old cyrillic encoding)\\ +% T1ccr & make Concrete Roman (Cork encoding)\\ +% T1cmdh & make Computer Modern Dunhill (Cork encoding)\\ +% T1cmfib & make Computer Modern Fibonacci (Cork encoding)\\ +% T1cmfr & make Computer Modern Funny (Cork encoding)\\ +% T1cmr & make Computer Modern Roman (Cork encoding)\\ +% T1cmss & make Computer Modern Sans (Cork encoding)\\ +% T1cmtt & make Computer Modern Typewriter (Cork encoding)\\ +% T1cmvtt & make Computer Modern Variable Typewriter (Cork +% encoding)\\ +% TS1cmr & make Computer Modern Roman text companion fonts\\ +% TS1cmss & make Computer Modern Sans text companion fonts\\ +% TS1cmtt & make Computer Modern Typewriter text companion fonts\\ +% TS1cmvtt & make Computer Modern Variable Typewriter text +% companion fonts\\ +% Ucmr & make Computer Modern Roman (unknown encoding)\\ +% Ucmss & make Computer Modern Sans (unknown encoding)\\ +% Ucmtt & make Computer Modern Typewriter (unknown encoding)\\ +% \end{tabular} +% \end{center} +% A typical \texttt{docstrip} command file would then have entries like: +% \begin{verbatim} +%\generateFile{OT1cmr.fd}{t}{\from{cmfonts.fdd}{fd,OT1cmr}} +%\end{verbatim} +% +% +% \section{The font definition files} +% +% As always we begin by identifying the latest version of the files +% in the \textsf{log} file. The explicit spaces are necessary in an +% |.fd| file and the |\string| guards against situations where |`|, +% |<| or |>| is active. +% \changes{v2.2g}{1994/02/15}{Removed surplus \cs{string}} +% +% \subsection{Fonts with Cork encoding (\texttt{T1})} +% +% We start with the DC-fonts. These are Computer Modern fonts +% reimplemented originally by Norbert Schwarz, and since release~1.2 +% by J\"org Knappen. +% You can get them from \TeX{} +% archives and from \TeX{} organizations. We strongly recommend +% that you use them because they are encoded in the approved +% standard encoding for text fonts. +% +% \subsubsection{Commands for fonts with the `EC' naming scheme} +% Before the declarations for the individual fonts, first define +% some abbreviations that may be used as most of the fonts in the +% `new' dc font distribution come in the same range of sizes. +% The same is true for the ec fonts, with a somewhat enlarged font +% size range. +% \changes{v2.5f}{1998/01/10}{Added larger sizes for ec fonts only +% (thanks to Christian Cornelssen)} +% \begin{macrocode} +%<*new|ec> +%<*!tt> +\providecommand{\EC@family}[5]{% + \DeclareFontShape{#1}{#2}{#3}{#4}% + {<5><6><7><8><9><10><10.95><12><14.4>% +%<ec> <17.28><20.74><24.88><29.86><35.83>genb*#5}{}} +%<!ec> <17.28><20.74><24.88>genb*#5}{}} +%</!tt> +% \end{macrocode} +% For monospaced fonts, the normal interpolation breaks down below +% 8pt, so scale the 8pt fonts instead. +% \changes{v2.5f}{1998/01/10}{Added larger sizes for ec fonts only +% (thanks to Christian Cornelssen)} +% \begin{macrocode} +%<*tt> +\providecommand{\EC@ttfamily}[5]{% + \DeclareFontShape{#1}{#2}{#3}{#4}% + {<5><6><7><8>#50800% +%<ec> <9><10><10.95><12><14.4><17.28><20.74><24.88><29.86>% +%<ec> <35.83>genb*#5}{}} +%<!ec> <9><10><10.95><12><14.4><17.28><20.74><24.88>genb*#5}{}} +%</tt> +%</new|ec> +% \end{macrocode} +% +% \subsubsection{The Computer Modern Roman} +% +% This family is available in the shapes |n|, |sl|, |it|, |sc|, and +% |ui|. +% \begin{macrocode} +%<*T1cmr> +\DeclareFontFamily{T1}{cmr}{} +%<*!new&!ec> +\DeclareFontShape{T1}{cmr}{m}{n}{% + <5><6><7><8><9>gen*dcr% + <10><10.95>dcr10% + <12><14.4>dcr12% + <17.28><20.74><24.88>dcr17}{} +\DeclareFontShape{T1}{cmr}{m}{sl}{% + <5><6><7><8>dcsl8% + <9>dcsl9% + <10><10.95>dcsl10% + <12><14.4>dcsl12% + <17.28><20.74><24.88>dcsl17% + }{} +\DeclareFontShape{T1}{cmr}{m}{it}{% + <5><6>dcti7% + <7><8><9>gen*dcti% + <10><10.95>dcti10% + <12><14.4>dcti12% + <17.28><20.74><24.88>dcti17% + }{} +\DeclareFontShape{T1}{cmr}{m}{sc}{% + <5><6><7><8><9><10><10.95>dccsc10% + <12><14.4>dccsc12% + <17.28><20.74><24.88>dccsc17% + }{} +\DeclareFontShape{T1}{cmr}{m}{ui}{% + <5><6>dcu7% + <7><8><9>gen*dcu% + <10><10.95>dcu10% + <12><14.4>dcu12% + <17.28><20.74><24.88>dcu17% + }{} +% \end{macrocode} +% There is a bold `|b|' series, but unfortunately only the normal +% shape is available in this series. +% \begin{macrocode} +%<+T1cmr>%%%%%%% bold series +\DeclareFontShape{T1}{cmr}{b}{n}{% + <5><6><7><8><9>gen*dcb% + <10><10.95>dcb10% + <12><14.4>dcb12% + <17.28><20.74><24.88>dcb17% + }{} +% \end{macrocode} +% Finally there is a bold extended series `|bx|' with the shapes +% |n|, |sl|, and |it|. +% \begin{macrocode} +%<+T1cmr>%%%%%%%% bold extended series +\DeclareFontShape{T1}{cmr}{bx}{n}{% + <5><6><7><8><9>gen*dcbx% + <10><10.95>dcbx10% + <12><14.4><17.28><20.74><24.88>dcbx12% + }{} +\DeclareFontShape{T1}{cmr}{bx}{sl}{% + <5><6><7><8><9>gen*dcbxsl% + <10><10.95>dcbxsl10% + <12><14.4><17.28><20.74><24.88>dcbxsl12% + }{} +\DeclareFontShape{T1}{cmr}{bx}{it}{% + <5><6><7><8><9><10><10.95>dcbxti10% + <12><14.4>dcbxti12% + <17.28><20.74><24.88>dcbxti17% + }{} +%</!new&!ec> +% \end{macrocode} +% \changes{v2.4d}{1995/12/01} +% {Ulrik Vieth. Add ui shape /1989} +% \begin{macrocode} +%<*new> +\EC@family{T1}{cmr}{m}{n}{dcr} +\EC@family{T1}{cmr}{m}{sl}{dcsl} +\EC@family{T1}{cmr}{m}{it}{dcti} +\EC@family{T1}{cmr}{m}{sc}{dccc} +\EC@family{T1}{cmr}{bx}{n}{dcbx} +\EC@family{T1}{cmr}{b}{n}{dcb} +\EC@family{T1}{cmr}{bx}{it}{dcbi} +\EC@family{T1}{cmr}{bx}{sl}{dcbl} +\EC@family{T1}{cmr}{m}{ui}{dcu} +%</new> +% \end{macrocode} +% \changes{v2.5a}{1997/01/14} +% {EC fonts} +% \changes{v2.5d}{1997/06/02}{bold sc fonts latex/2497} +% \begin{macrocode} +%<*ec> +\EC@family{T1}{cmr}{m}{n}{ecrm} +\EC@family{T1}{cmr}{m}{sl}{ecsl} +\EC@family{T1}{cmr}{m}{it}{ecti} +\EC@family{T1}{cmr}{m}{sc}{eccc} +\EC@family{T1}{cmr}{bx}{n}{ecbx} +\EC@family{T1}{cmr}{b}{n}{ecrb} +\EC@family{T1}{cmr}{bx}{it}{ecbi} +\EC@family{T1}{cmr}{bx}{sl}{ecbl} +\EC@family{T1}{cmr}{bx}{sc}{ecxc} +\EC@family{T1}{cmr}{m}{ui}{ecui} +%</ec> +%</T1cmr> +% \end{macrocode} +% +% \subsubsection{Computer Modern Fibonacci} +% +% This family was created by Don Knuth as an experiment, supplying +% only Fibonacci numbers to the parameters of the Metafont sources +% of the Computer Modern Meta family. +% \begin{macrocode} +%<*T1cmfib> +\DeclareFontFamily{T1}{cmfib}{} +%<*!new&!ec> +\DeclareFontShape{T1}{cmfib}{m}{n}{% + <8><9><10><12>gen*dcfib% + }{} +%</!new&!ec> +% \end{macrocode} +% \changes{v2.4f}{1995/12/20} +% {Family name and external file name corrected Ulrik Vieth /2017} +% In fact these `dcfb' fonts are currently withdrawn as they generate +% metafont errors. +% \begin{macrocode} +%<*new> +\EC@family{T1}{cmfib}{m}{n}{dcfb} +%</new> +% \end{macrocode} +% \changes{v2.5a}{1997/01/14} +% {EC fonts, new slanted fibonacci} +% \begin{macrocode} +%<*ec> +\EC@family{T1}{cmfib}{m}{n}{ecfb} +\EC@family{T1}{cmfib}{m}{sl}{ecfs} +%</ec> +%</T1cmfib> +% \end{macrocode} +% +% \subsubsection{Computer Modern Funny (Roman)} +% +% This family was created by Don Knuth as another experiment. +% \begin{macrocode} +%<*T1cmfr> +\DeclareFontFamily{T1}{cmfr}{} +%<*!new&!ec> +\DeclareFontShape{T1}{cmfr}{m}{n}{% + <10>dcff10% + }{} +\DeclareFontShape{T1}{cmfr}{m}{it}{% + <10>dcfi10% + }{} +%</!new&!ec> +%<*new> +\EC@family{T1}{cmfr}{m}{n}{dcff} +\EC@family{T1}{cmfr}{m}{it}{dcfi} +%</new> +% \end{macrocode} +% \changes{v2.5a}{1997/01/14} +% {EC fonts} +% \begin{macrocode} +%<*ec> +\EC@family{T1}{cmfr}{m}{n}{ecff} +\EC@family{T1}{cmfr}{m}{it}{ecfi} +%</ec> +%</T1cmfr> +% \end{macrocode} +% +% \subsubsection{Computer Modern Sans} +% +% \begin{macrocode} +%<*T1cmss> +\DeclareFontFamily{T1}{cmss}{} +%<*!new&!ec> +\DeclareFontShape{T1}{cmss}{m}{n}{% + <5><6><7><8>dcss8% + <9>dcss9% + <10><10.95>dcss10% + <12><14.4>dcss12% + <17.28><20.74><24.88>dcss17% + }{} +\DeclareFontShape{T1}{cmss}{m}{it}% + {<->sub*cmss/m/sl}{} +\DeclareFontShape{T1}{cmss}{m}{sl}{% + <5><6><7><8>dcssi8% + <9>dcssi9% + <10><10.95>dcssi10% + <12><14.4>dcssi12% + <17.28><20.74><24.88>dcssi17% + }{} +%</!new&!ec> +%<*new> +\EC@family{T1}{cmss}{m}{n}{dcss} +\EC@family{T1}{cmss}{m}{sl}{dcsi} +\EC@family{T1}{cmss}{m}{it}{dcsi} +\EC@family{T1}{cmss}{bx}{n}{dcsx} +\EC@family{T1}{cmss}{bx}{it}{dcso} +\EC@family{T1}{cmss}{bx}{sl}{dcso} +%</new> +% \end{macrocode} +% \changes{v2.5a}{1997/01/14} +% {EC fonts} +% \begin{macrocode} +%<*ec> +\EC@family{T1}{cmss}{m}{n}{ecss} +\EC@family{T1}{cmss}{m}{sl}{ecsi} +\EC@family{T1}{cmss}{m}{it}{ecsi} +\EC@family{T1}{cmss}{bx}{n}{ecsx} +\EC@family{T1}{cmss}{bx}{it}{ecso} +\EC@family{T1}{cmss}{bx}{sl}{ecso} +%</ec> +% \end{macrocode} +% The next substitution is very questionable. +% \begin{macrocode} +%<+T1cmss>%%%%%% Font/shape undefined, therefore substituted +\DeclareFontShape{T1}{cmss}{m}{sc}% + {<->sub*cmr/m/sc}{} +% \end{macrocode} +% The next font group is quite attractive for display. +% \begin{macrocode} +%<+T1cmss>%%%%%%% semibold condensed series +\DeclareFontShape{T1}{cmss}{sbc}{n}{% + <5><6><7><8><9><10><10.95><12><14.4><17.28>% + <20.74><24.88>% +%<!ec>dcssdc10 +%<ec>ecssdc10 + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<*!new&!ec> +%<+T1cmss>%%%%%%%% bold extended series +\DeclareFontShape{T1}{cmss}{bx}{n}{% + <5><6><7><8><9><10><10.95><12><14.4><17.28>% + <20.74><24.88>dcssbx10% + }{} +% \end{macrocode} +% Another questionable substitution, but if we have the above +% we might as well have this one +% \changes{v2.5g}{1998/03/27}{Added subst for cmss/bx/sc (pr/2586)} +% \begin{macrocode} +%<+T1cmss>%%%%%% Font/shape undefined, therefore substituted +\DeclareFontShape{T1}{cmss}{bx}{sc}% + {<->sub*cmr/m/sc}{} +%</!new&!ec> +%</T1cmss> +% \end{macrocode} +% +% \subsubsection{Computer Modern Typewriter} +% +% Perhaps the best font in the Computer Modern suite. +% \begin{macrocode} +%<*T1cmtt> +\DeclareFontFamily{T1}{cmtt}{\hyphenchar \font\m@ne} +%<*!new&!ec> +\DeclareFontShape{T1}{cmtt}{m}{n}{% + <8><9>gen*dctt% + <10><10.95>dctt10% + <12><14.4><17.28><20.74><24.88>dctt12% + }{} +\DeclareFontShape{T1}{cmtt}{m}{it}{% + <8><9>gen*dcitt% + <10><10.95>dcitt10% + <12><14.4>dcitt12% + <17.28><20.74><24.88>dcitt17% + }{} +\DeclareFontShape{T1}{cmtt}{m}{sl}{% + <8><9>gen*dcsltt% + <10><10.95>dcsltt10% + <12><14.4><17.28><20.74><24.88>dcsltt12% + }{} +\DeclareFontShape{T1}{cmtt}{m}{sc}{% + <10><10.95>dctcsc10% + <12><14.4>dctcsc12% + <17.28><20.74><24.88>dctcsc17% + }{} +%</!new&!ec> +% \end{macrocode} +% \changes{v2.4e}{1995/12/04} +% {Ulrik Vieth. added dctc /1989} +% \begin{macrocode} +%<*new> +\EC@ttfamily{T1}{cmtt}{m}{n}{dctt} +\EC@ttfamily{T1}{cmtt}{m}{sl}{dcst} +\EC@ttfamily{T1}{cmtt}{m}{it}{dcit} +\EC@ttfamily{T1}{cmtt}{m}{sc}{dctc} +% \end{macrocode} +% \changes{v2.4i}{1996/09/26}{Added substitutions for T1 bold +% extended typewriter fonts (new version).} +% Finally, we define substitutions for the series |bx|. It comes +% with or without a warning. +% \begin{macrocode} +\DeclareFontShape{T1}{cmtt}{bx}{n}% +%<-nowarn> {<->sub*cmtt/m/n}{} +%<+nowarn> {<->ssub*cmtt/m/n}{} +\DeclareFontShape{T1}{cmtt}{bx}{it}% +%<-nowarn> {<->sub*cmtt/m/it}{} +%<+nowarn> {<->ssub*cmtt/m/it}{} +%</new> +% \end{macrocode} +% \changes{v2.5a}{1997/01/14} +% {EC fonts} +% \begin{macrocode} +%<*ec> +\EC@ttfamily{T1}{cmtt}{m}{n}{ectt} +\EC@ttfamily{T1}{cmtt}{m}{sl}{ecst} +\EC@ttfamily{T1}{cmtt}{m}{it}{ecit} +\EC@ttfamily{T1}{cmtt}{m}{sc}{ectc} +% \end{macrocode} +% \changes{v2.4i}{1996/09/26}{Added substitutions for T1 bold +% extended typewriter fonts (new version).} +% Finally, we define substitutions for the series |bx|. It comes +% with or without a warning. +% \begin{macrocode} +\DeclareFontShape{T1}{cmtt}{bx}{n}% +%<-nowarn> {<->sub*cmtt/m/n}{} +%<+nowarn> {<->ssub*cmtt/m/n}{} +\DeclareFontShape{T1}{cmtt}{bx}{it}% +%<-nowarn> {<->sub*cmtt/m/it}{} +%<+nowarn> {<->ssub*cmtt/m/it}{} +%</ec> +%</T1cmtt> +% \end{macrocode} +% +% +% \subsubsection{Computer Modern Variable Typewriter} +% +% The Computer Modern Variable Typewriter family is the +% proportional spaced version of the Computer Modern Typewriter +% family. It is implemented as a separate family to allow easy use +% in normal text, including changes of shape/series etc if available. +% This family also allows normal hyphenation. +% +% In the first implementations for the Cork encoding only the +% normal shape is available. Starting with release 1.3 italic will +% be provided as well. +% \begin{macrocode} +%<*T1cmvtt> +\DeclareFontFamily{T1}{cmvtt}{} +%<*!new&!ec> +\DeclareFontShape{T1}{cmvtt}{m}{n}{% + <8><9>gen*dcvtt% + <10><10.95>dcvtt10% + <12><14.4><17.28><20.74><24.88>dcvtt12% + }{} +%</!new&!ec> +% \end{macrocode} +% With release 1.3 there will be an italic shape as well. +% \begin{macrocode} +%<*new> +\EC@ttfamily{T1}{cmvtt}{m}{n}{dcvt} +\EC@ttfamily{T1}{cmvtt}{m}{it}{dcvi} +%</new> +%<*ec> +\EC@ttfamily{T1}{cmvtt}{m}{n}{ecvt} +\EC@ttfamily{T1}{cmvtt}{m}{it}{ecvi} +%</ec> +%</T1cmvtt> +% \end{macrocode} +% +% +% \subsubsection{Computer Modern Dunhill} +% +% The smoker's choice? Within the Cork encoding this font comes with +% a full size range by default but only with one series. +% \begin{macrocode} +%<*T1cmdh> +\DeclareFontFamily{T1}{cmdh}{} +%<*!new&!ec> +\DeclareFontShape{T1}{cmdh}{m}{n}{% + <5><6><7><8><9>gen*dcdunh% + <10><10.95>dcdunh10% + <12><14.4>dcdunh12% + <17.28><20.74><24.88>dcdunh17}{} +%</!new&!ec> +%<*new> +\EC@family{T1}{cmdh}{m}{n}{dcdh} +%</new> +%<*ec> +\EC@family{T1}{cmdh}{m}{n}{ecdh} +%</ec> +%</T1cmdh> +% \end{macrocode} +% +% \subsubsection{Concrete Roman} +% +% A font near to Computer Modern Typewriter designed to go with the +% Euler Math fonts. +% \begin{macrocode} +%<*T1ccr> +\DeclareFontFamily{T1}{ccr}{} +\DeclareFontShape{T1}{ccr}{m}{n}{% + <5><6><7><8><9><10><12>gen*dccr% + <10.95>dccr11 <14.4>dccr14% + <17.28><20.74><24.88>dccr17}{} +\DeclareFontShape{T1}{ccr}{m}{it}{% + <10><10.95><12>dcti10}{} +\DeclareFontShape{T1}{ccr}{m}{sc}{% + <10><10.95><12>dccsc10 }{} +% \end{macrocode} +% Note the condensed slanted variant (not used). +% \changes{v2.4d}{1995/12/01} +% {Ulrik Vieth. Removed dcslc9 (no such font...) /1989} +% \begin{macrocode} +%\DeclareFontShape{T1}{ccr}{c}{sl}{<9>dcslc9}{} +% \end{macrocode} +% Finally a few substitution fonts for combinations not available. +% As suggested by Leslie Lamport and several others the +% substitution should warn by default. We control this my a \dst{} +% module so that one can modify this behavior from the outside. +% \changes{v2.0f}{1993/09/24}{Added substitution fonts} +% \begin{macrocode} +\DeclareFontShape{T1}{ccr}{bx}{sl}{% +%<-nowarn> <->sub*cmr/bx/it +%<+nowarn> <->ssub*cmr/bx/it +}{} +\DeclareFontShape{T1}{ccr}{bx}{n}{% +%<-nowarn> <->sub*cmr/bx/n +%<+nowarn> <->ssub*cmr/bx/n +}{} +\DeclareFontShape{T1}{ccr}{bx}{it}{% +%<-nowarn> <->sub*cmr/bx/it +%<+nowarn> <->ssub*cmr/bx/it +}{} +%</T1ccr> +% \end{macrocode} +% +% +% \subsubsection{The text companion fonts for \texttt{T1} encoding} +% +% \changes{v2.4e}{1995/12/04} +% {Ulrik Vieth. added tcu /1989} +% \begin{macrocode} +%<*TS1cmr> +\DeclareFontFamily{TS1}{cmr}{\hyphenchar\font\m@ne} +%<!ec>\EC@family{TS1}{cmr}{m}{n}{tcr} +%<ec>\EC@family{TS1}{cmr}{m}{n}{tcrm} +\EC@family{TS1}{cmr}{m}{sl}{tcsl} +\EC@family{TS1}{cmr}{m}{it}{tcti} +\EC@family{TS1}{cmr}{bx}{n}{tcbx} +%<!ec>\EC@family{TS1}{cmr}{b}{n}{tcb} +%<ec>\EC@family{TS1}{cmr}{b}{n}{tcrb} +\EC@family{TS1}{cmr}{bx}{it}{tcbi} +\EC@family{TS1}{cmr}{bx}{sl}{tcbl} +%<!ec>\EC@family{TS1}{cmr}{m}{ui}{tcu} +%<ec>\EC@family{TS1}{cmr}{m}{ui}{tcui} +%</TS1cmr> +%<*TS1cmss> +\DeclareFontFamily{TS1}{cmss}{\hyphenchar\font\m@ne} +\EC@family{TS1}{cmss}{m}{n}{tcss} +\EC@family{TS1}{cmss}{m}{sl}{tcsi} +\EC@family{TS1}{cmss}{m}{it}{tcsi} +\EC@family{TS1}{cmss}{bx}{n}{tcsx} +\EC@family{TS1}{cmss}{bx}{it}{tcso} +\EC@family{TS1}{cmss}{bx}{sl}{tcso} +%</TS1cmss> +%<*TS1cmtt> +\DeclareFontFamily{TS1}{cmtt}{\hyphenchar\font\m@ne} +\EC@ttfamily{TS1}{cmtt}{m}{n}{tctt} +\EC@ttfamily{TS1}{cmtt}{m}{sl}{tcst} +\EC@ttfamily{TS1}{cmtt}{m}{it}{tcit} +%</TS1cmtt> +% \end{macrocode} +% Again the italic shape is only available with release 1.3. +% \begin{macrocode} +%<*TS1cmvtt> +\DeclareFontFamily{TS1}{cmvtt}{} +\EC@ttfamily{TS1}{cmvtt}{m}{n}{tcvt} +\EC@ttfamily{TS1}{cmvtt}{m}{it}{tcvi} +%</TS1cmvtt> +% \end{macrocode} +% +% \subsection{Fonts with the old \TeX{} text encoding (\texttt{OT1})} +% +% Note that in contrast to the Cork encoding, which is fully +% defined, the old \TeX{} text encoding isn't implemented consistent +% within all fonts. Most noticeably is that a dollar sign (\$) in +% some fonts is replaced by a pound symbol (\pounds) in others, +% which produced quite a number of bug fixes in the NFSS1. Also the +% typewriter fonts contain a few different characters which are not +% present in other fonts. +% +% If one would use the philosophy of NFSS2 consequently all these +% would therefore be different encodings and font mixing would +% therefore be nearly impossible with older fonts. Therefore such +% encodings are considered the same but one should be remember that +% in some situations this may cause problems. +% +% In other words, use |T1| encoding whenever possible, the |OT..| +% encodings will be removed in some future release. +% +% \subsubsection{Computer Modern Roman (\texttt{OT1})} +% +% Beside the |OT1| encoding we also define the same family as |U| +% encoded which is used for accepting old sources with stuff like +% |\newmathalphabet| in it. +% \begin{macrocode} +%<*OT1cmr,Ucmr> +%<+OT1cmr>\DeclareFontFamily{OT1}{cmr}{\hyphenchar\font45 } +%<+Ucmr>\DeclareFontFamily{U}{cmr}{\hyphenchar\font45 } +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{m}{n}% +%<+Ucmr>\DeclareFontShape{U}{cmr}{m}{n}% + {<5><6><7><8><9><10><12>gen*cmr% + <10.95>cmr10% + <14.4>cmr12% + <17.28><20.74><24.88>cmr17}{} +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{m}{sl}% +%<+Ucmr>\DeclareFontShape{U}{cmr}{m}{sl}% + {% +%<+ori> <5-8>sub*cmr/m/n% +%<-ori> <5><6><7>cmsl8% + <8><9>gen*cmsl% + <10><10.95>cmsl10% + <12><14.4><17.28><20.74><24.88>cmsl12% + }{} +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{m}{it}% +%<+Ucmr>\DeclareFontShape{U}{cmr}{m}{it}% + {% +%<+ori> <5-7>sub*cmr/m/n% +%<+ori> <7>cmti7% +%<-ori> <5><6><7>cmti7% + <8>cmti8% + <9>cmti9% + <10><10.95>cmti10% + <12><14.4><17.28><20.74><24.88>cmti12% + }{} +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{m}{sc}% +%<+Ucmr>\DeclareFontShape{U}{cmr}{m}{sc}% + {% +%<+ori> <5-8>sub*cmr/m/n% +%<+ori> <8><9><10><10.95><12>% +%<+ori> <14.4><17.28><20.74><24.88>cmcsc10% +%<-ori> <5><6><7><8><9><10><10.95><12>% +%<-ori> <14.4><17.28><20.74><24.88>cmcsc10% + }{} +% \end{macrocode} +% Here we try to cure the famous \$ $\to$ \pounds{} bug: +% \changes{v2.2c}{1994/01/18}{Corrected forgotten renaming of font +% shape u to ui in substitution.} +% \begin{macrocode} +%<+OT1cmr,Ucmr>% Warning: please note that the upright shape below is +%<+OT1cmr,Ucmr>% used for the \pounds symbol of LaTeX. So this +%<+OT1cmr,Ucmr>% font definition shouldn't be removed. +%<+OT1cmr,Ucmr>% +%<+ori>% If cmu below 10pt is not available we substitute +%<+ori>% cmti as far as possible (sizes 7, 8, 9). This is +%<+ori>% done because cmu is used mainly for producing the +%<+ori>% the \pound symbol and it is better to get a slanted +%<+ori>% (or bigger) pound then to get a $ sign in such +%<+ori>% situations. +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{m}{ui} +%<+Ucmr>\DeclareFontShape{U}{cmr}{m}{ui} + { +%<+ori> <7>subf*cmti7% +%<+ori> <8>subf*cmti8% +%<+ori> <9>subf*cmti9% +%<+ori> <10><10.95><12><14.4><17.28><20.74><24.88>cmu10% +%<-ori> <5><6><7><8><9><10><10.95><12>% +%<-ori> <14.4><17.28><20.74><24.88>cmu10% + }{} +%<+OT1cmr,Ucmr>%%%%%%% bold series +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{b}{n} +%<+Ucmr>\DeclareFontShape{U}{cmr}{b}{n}% + {% +%<+ori> <-10>sub*cmr/bx/n% +%<+ori> <10><10.95><12><14.4><17.28><20.74><24.88>cmb10% +%<-ori> <5><6><7><8><9><10><10.95><12>% +%<-ori> <14.4><17.28><20.74><24.88>cmb10% + }{} +%<+OT1cmr,Ucmr>%%%%%%%% bold extended series +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{bx}{n} +%<+Ucmr>\DeclareFontShape{U}{cmr}{bx}{n}% + {% + <5><6><7><8><9>gen*cmbx% + <10><10.95>cmbx10% + <12><14.4><17.28><20.74><24.88>cmbx12% + }{} +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{bx}{sl} +%<+Ucmr>\DeclareFontShape{U}{cmr}{bx}{sl}% + {% +%<+ori> <-10>sub*cmr/bx/n% +%<+ori> <10><10.95><12><14.4><17.28><20.74><24.88>cmbxsl10% +%<-ori> <5><6><7><8><9>% +%<-ori> <10><10.95><12><14.4><17.28><20.74><24.88>cmbxsl10% + }{} +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{bx}{it} +%<+Ucmr>\DeclareFontShape{U}{cmr}{bx}{it}% + {% +%<+ori> <-10>sub*cmr/bx/n% +%<+ori> <10><10.95><12><14.4><17.28><20.74><24.88>cmbxti10% +%<-ori> <5><6><7><8><9>% +%<-ori> <10><10.95><12><14.4><17.28><20.74><24.88>cmbxti10% + }{} +% \end{macrocode} +% \changes{v2.5h}{1999/05/09}{docstrip `nowarn' guard was the wrong way +% around (pr/3036)} +% \begin{macrocode} +%<+OT1cmr,Ucmr>% Again this is necessary for a correct \pounds symbol in +%<+OT1cmr,Ucmr>% the cmr fonts Hopefully the dc/ec font layout will take +%<+OT1cmr,Ucmr>% over soon. +%<+OT1cmr,Ucmr>% +%<+OT1cmr>\DeclareFontShape{OT1}{cmr}{bx}{ui} +%<+Ucmr>\DeclareFontShape{U}{cmr}{bx}{ui}% +%<-nowarn> {<->sub*cmr/m/ui}{} +%<+nowarn> {<->ssub*cmr/m/ui}{} +%</OT1cmr,Ucmr> +% \end{macrocode} +% +% \subsubsection{Computer Modern Sans (\texttt{OT1})} +% +% Same game for the Sans family. +% \begin{macrocode} +%<*OT1cmss,Ucmss> +%<+OT1cmss>\DeclareFontFamily{OT1}{cmss}{\hyphenchar\font45 } +%<+Ucmss>\DeclareFontFamily{U}{cmss}{\hyphenchar\font45 } +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{m}{n} +%<+Ucmss>\DeclareFontShape{U}{cmss}{m}{n}% + {% +%<+ori> <-8>sub*cmr/m/n% +%<+ori> <8>cmss8% +%<-ori> <5><6><7><8>cmss8% + <9>cmss9% + <10><10.95>cmss10% + <12><14.4>cmss12% + <17.28><20.74><24.88>cmss17% + }{} +%<+OT1cmss,Ucmss>% Font undefined, therefore substituted +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{m}{it} +%<+Ucmss>\DeclareFontShape{U}{cmss}{m}{it}% +%<-nowarn> {<->sub*cmss/m/sl}{} +%<+nowarn> {<->ssub*cmss/m/sl}{} +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{m}{sl} +%<+Ucmss>\DeclareFontShape{U}{cmss}{m}{sl}% + {% +%<+ori> <-8>sub*cmss/m/n% +%<+ori> <8><9>gen*cmssi% +%<-ori> <5><6><7><8>cmssi8<9>cmssi9% + <10><10.95>cmssi10% + <12><14.4>cmssi12% + <17.28><20.74><24.88>cmssi17% + }{} +%<+OT1cmss,Ucmss>%%%%%%% Font/shape undefined, therefore substituted +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{m}{sc} +%<+Ucmss>\DeclareFontShape{U}{cmss}{m}{sc}% + {<->sub*cmr/m/sc}{} +%<+OT1cmss,Ucmss>%%%%%%% Font/shape undefined, therefore substituted +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{m}{ui} +%<+Ucmss>\DeclareFontShape{U}{cmss}{m}{ui}% + {<->sub*cmr/m/ui}{} +%<+OT1cmss,Ucmss>%%%%%%%% semibold condensed series +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{sbc}{n} +%<+Ucmss>\DeclareFontShape{U}{cmss}{sbc}{n}% + {% +%<+ori> <-10>sub*cmss/m/n% +%<-ori> <5><6><7><8><9>cmssdc10% + <10><10.95><12><14.4><17.28><20.74><24.88>cmssdc10% + }{} + +%<+OT1cmss,Ucmss>%%%%%%%%% bold extended series +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{bx}{n} +%<+Ucmss>\DeclareFontShape{U}{cmss}{bx}{n}% + {% +%<+ori> <-10>sub*cmss/m/n% +%<-ori> <5><6><7><8><9>cmssbx10% + <10><10.95><12><14.4><17.28><20.74><24.88>cmssbx10% + }{} +%<+OT1cmss,Ucmss>%%%%%%% Font/shape undefined, therefore substituted +%<+OT1cmss>\DeclareFontShape{OT1}{cmss}{bx}{ui} +%<+Ucmss>\DeclareFontShape{U}{cmss}{bx}{ui}% + {<->sub*cmr/bx/ui}{} +%</OT1cmss,Ucmss> +% \end{macrocode} +% +% \subsubsection{Computer Modern Typewriter (\texttt{OT1})} +% +% Notice that this encoding is in fact quite different and we +% shouldn't therefore substitute some other font group if the +% correct size or shape isn't available. Otherwise, we may end with +% a |\verb| suddenly producing a lot of funny chars instead of the +% desired ones. +% \begin{macrocode} +%<*OT1cmtt,Ucmtt> +%<+OT1cmtt>\DeclareFontFamily{OT1}{cmtt}{\hyphenchar \font\m@ne} +%<+Ucmtt>\DeclareFontFamily{U}{cmtt}{\hyphenchar \font\m@ne} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{m}{n} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{m}{n}% + {% +% \end{macrocode} +% This substitution for |ori| is wrong and only in here because +% that was the way stuff has be set up in the old |lfonts.tex| file. +% \begin{macrocode} +%<+ori> <-8>sub*cmr/m/n% +%<+ori> <8><9>gen*cmtt% +%<-ori> <5><6><7><8>cmtt8<9>cmtt9% + <10><10.95>cmtt10% + <12><14.4><17.28><20.74><24.88>cmtt12% + }{} +%<+OT1cmtt,Ucmtt>%%%%%% make sure subst shapes are available +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{m}{it} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{m}{it}% + {% +% \end{macrocode} +% The following substitution however is okay since both fonts have +% the same encoding. +% \begin{macrocode} +%<+ori> <-10>sub*cmtt/m/n% +%<-ori> <5><6><7><8><9>% + <10><10.95><12><14.4><17.28><20.74><24.88>cmitt10% + }{} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{m}{sl} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{m}{sl}% + {% +%<+ori> <-10>sub*cmtt/m/n% +%<-ori> <5><6><7><8><9>% + <10><10.95><12><14.4><17.28><20.74><24.88>cmsltt10% + }{} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{m}{sc} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{m}{sc}% + {% +%<+ori> <-10>sub*cmtt/m/n% +%<-ori> <5><6><7><8><9>% + <10><10.95><12><14.4><17.28><20.74><24.88>cmtcsc10% + }{} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{m}{ui} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{m}{ui}% +%<-nowarn> {<->sub*cmtt/m/it}{} +%<+nowarn> {<->ssub*cmtt/m/it}{} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{bx}{n} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{bx}{n}% +%<-nowarn> {<->sub*cmtt/m/n}{} +%<+nowarn> {<->ssub*cmtt/m/n}{} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{bx}{it} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{bx}{it}% +%<-nowarn> {<->sub*cmtt/m/it}{} +%<+nowarn> {<->ssub*cmtt/m/it}{} +%<+OT1cmtt>\DeclareFontShape{OT1}{cmtt}{bx}{ui} +%<+Ucmtt>\DeclareFontShape{U}{cmtt}{bx}{ui}% +%<-nowarn> {<->sub*cmtt/m/it}{} +%<+nowarn> {<->ssub*cmtt/m/it}{} +%</OT1cmtt,Ucmtt> +% \end{macrocode} +% +% +% \subsubsection{Computer Modern Variable Typewriter (\texttt{OT1})} +% +% The Computer Modern Variable Typewriter family is the +% proportional spaced version of the Computer Modern Typewriter +% family. It is implemented as a separate family to allow easy use +% in normal text, including changes of shape/series etc if available. +% This family also allows normal hyphenation. +% \changes{v2.5b}{1997/02/25} +% {typo fixed in ot1cmvtt \cs{ProvidesFile} latex/2394} +% \begin{macrocode} +%<*OT1cmvtt> +\DeclareFontFamily{OT1}{cmvtt}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmvtt}{m}{n}% + {% + <5><6><7><8><9><10><10.95>% + <12><14.4><17.28><20.74><24.88>cmvtt10% + }{} +% \end{macrocode} +% This font is probably not available to everybody as it is not +% part of the standard distribution. One might find it in +% \texttt{.../systems/knuth/local} on CTAN. +% \begin{macrocode} +\DeclareFontShape{OT1}{cmvtt}{m}{it}% + {% + <5><6><7><8><9><10><10.95>% + <12><14.4><17.28><20.74><24.88>cmvtti10% + }{} +%</OT1cmvtt> +% \end{macrocode} +% +% +% \subsubsection{Computer Modern Funny (\texttt{OT1})} +% +% \begin{macrocode} +%<*OT1cmfr> +\DeclareFontFamily{OT1}{cmfr}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmfr}{m}{n}{% + <10>cmff10% + }{} +\DeclareFontShape{OT1}{cmfr}{m}{it}{% + <10>cmfi10% + }{} +%</OT1cmfr> +% \end{macrocode} +% +% \subsubsection{Computer Modern Dunhill (\texttt{OT1})} +% +% \begin{macrocode} +%<*OT1cmdh> +\DeclareFontFamily{OT1}{cmdh}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmdh}{m}{n}{% + <10>cmdunh10% + }{} +%</OT1cmdh> +% \end{macrocode} +% +% \subsubsection{Computer Modern Fibonacci (\texttt{OT1})} +% +% \begin{macrocode} +%<*OT1cmfib> +\DeclareFontFamily{OT1}{cmfib}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmfib}{m}{n}{% + <8>cmfib8% + }{} +%</OT1cmfib> +% \end{macrocode} +% +% \subsection{Math fonts} +% +% \subsubsection{Computer Modern Math italics} +% \changes{v2.0d}{1993/06/12}{OML/cmm/bx/it added for +% \cs{oldstylenums}} +% \changes{v2.3a}{1994/05/02}{Included font definitions for +% AMS-supplied cm fonts.} +% \begin{macrocode} +%<*OMLcmm> +\DeclareFontFamily{OML}{cmm}{\skewchar\font127 } +\DeclareFontShape{OML}{cmm}{m}{it}% + {<5><6><7><8><9>gen*cmmi% + <10><10.95>cmmi10% + <12><14.4><17.28><20.74><24.88>cmmi12% + }{} +\DeclareFontShape{OML}{cmm}{b}{it}{% + <5><6><7><8><9>gen*cmmib% + <10><10.95><12><14.4><17.28><20.74><24.88>cmmib10% + }{} +% \end{macrocode} +% This will allow the |\oldstylenums| command to work within +% |\textbf|. +% \begin{macrocode} +\DeclareFontShape{OML}{cmm}{bx}{it}% + {<->ssub*cmm/b/it}{} +%</OMLcmm> +% \end{macrocode} +% +% \subsubsection{Computer Modern Roman Math italics} +% +% \changes{v2.3d}{1994/10/30}{Added OMLcmr font substitutions pointing +% to OMLcmm. } +% \changes{v2.3f}{1995/04/22}{Corrected OMLcmr \cs{skewchar}} +% +% Some text symbols like `\t oo' and `$<$' are kept in the OML +% encoding, so we need font substititutions from OML/cmr to OML/cmm. +% \begin{macrocode} +%<*OMLcmr> +\DeclareFontFamily{OML}{cmr}{\skewchar\font127 } +\DeclareFontShape{OML}{cmr}{m}{n}% + {<->ssub*cmm/m/it}{} +\DeclareFontShape{OML}{cmr}{m}{it}% + {<->ssub*cmm/m/it}{} +\DeclareFontShape{OML}{cmr}{m}{sl}% + {<->ssub*cmm/m/it}{} +\DeclareFontShape{OML}{cmr}{m}{sc}% + {<->ssub*cmm/m/it}{} +\DeclareFontShape{OML}{cmr}{bx}{n}% + {<->ssub*cmm/b/it}{} +\DeclareFontShape{OML}{cmr}{bx}{it}% + {<->ssub*cmm/b/it}{} +\DeclareFontShape{OML}{cmr}{bx}{sl}% + {<->ssub*cmm/b/it}{} +\DeclareFontShape{OML}{cmr}{bx}{sc}% + {<->ssub*cmm/b/it}{} +%</OMLcmr> +% \end{macrocode} +% +% \subsubsection{Computer Modern Math symbols} +% +% \changes{v2.3a}{1994/05/02}{Included font definitions for +% AMS-supplied cm fonts.} +% \begin{macrocode} +%<*OMScmsy> +\DeclareFontFamily{OMS}{cmsy}{\skewchar\font48 } +\DeclareFontShape{OMS}{cmsy}{m}{n}{% + <5><6><7><8><9><10>gen*cmsy% + <10.95><12><14.4><17.28><20.74><24.88>cmsy10% + }{} +\DeclareFontShape{OMS}{cmsy}{b}{n}{% + <5><6><7><8><9>gen*cmbsy% + <10><10.95><12><14.4><17.28><20.74><24.88>cmbsy10% + }{} +%</OMScmsy> +% \end{macrocode} +% +% \subsubsection{Computer Modern Roman Math symbols} +% +% \changes{v2.3d}{1994/10/30}{Added OMScmr font substitutions pointing +% to OMScmm. } +% +% Some text symbols like `\P' and `\dag' are kept in the OMS encoding, +% so we need font substititutions from OMS/cmr to OMS/cmsy. +% \begin{macrocode} +%<*OMScmr> +\DeclareFontFamily{OMS}{cmr}{\skewchar\font48 } +\DeclareFontShape{OMS}{cmr}{m}{n}% + {<->ssub*cmsy/m/n}{} +\DeclareFontShape{OMS}{cmr}{m}{it}% + {<->ssub*cmsy/m/n}{} +\DeclareFontShape{OMS}{cmr}{m}{sl}% + {<->ssub*cmsy/m/n}{} +\DeclareFontShape{OMS}{cmr}{m}{sc}% + {<->ssub*cmsy/m/n}{} +\DeclareFontShape{OMS}{cmr}{bx}{n}% + {<->ssub*cmsy/b/n}{} +\DeclareFontShape{OMS}{cmr}{bx}{it}% + {<->ssub*cmsy/b/n}{} +\DeclareFontShape{OMS}{cmr}{bx}{sl}% + {<->ssub*cmsy/b/n}{} +\DeclareFontShape{OMS}{cmr}{bx}{sc}% + {<->ssub*cmsy/b/n}{} +%</OMScmr> +% \end{macrocode} +% +% \subsubsection{Computer Modern large symbols} +% +% \begin{macrocode} +%<*OMXcmex> +\DeclareFontFamily{OMX}{cmex}{} +\DeclareFontShape{OMX}{cmex}{m}{n}{% + <->sfixed*cmex10% + }{} +%</OMXcmex> +% \end{macrocode} +% +% +% \subsubsection{Concrete Roman} +% +% \changes{v2.3d}{1994/07/13}{Added new concrete shapes} +% \begin{macrocode} +%<*OT1ccr> +\DeclareFontFamily{OT1}{ccr}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{ccr}{m}{n}{% + <5><6><7><8><9><10>gen*ccr% + <10.95><12><14.4><17.28><20.74><24.88>ccr10}{} +\DeclareFontShape{OT1}{ccr}{m}{it}{% + <10><10.95><12>ccti10}{} +\DeclareFontShape{OT1}{ccr}{m}{sc}{% + <10><10.95><12>cccsc10}{} +\DeclareFontShape{OT1}{ccr}{m}{sl}{% + <9>ccsl9% + <10><10.95><12>ccsl10}{} +\DeclareFontShape{OT1}{ccr}{c}{sl}{<9>ccslc9}{} +% \end{macrocode} +% Finally a few substitution fonts for combinations not available. +% \changes{v2.0f}{1993/09/24}{Added substitution fonts} +% \begin{macrocode} +\DeclareFontShape{OT1}{ccr}{bx}{n}% + {<->sub*cmr/bx/n}{} +\DeclareFontShape{OT1}{ccr}{bx}{sl}% + {<->sub*cmr/bx/sl}{} +\DeclareFontShape{OT1}{ccr}{bx}{it}% + {<->sub*cmr/bx/it}{} +%</OT1ccr> +% \end{macrocode} +% +% \subsubsection{Concrete Roman math italic} +% +% \changes{v2.4d}{1995/12/01} +% {Ulrik Vieth. Add 10.95 and 12 size for ccmi10 /1989} +% \begin{macrocode} +%<*OMLccm> +\DeclareFontFamily{OML}{ccm}{\skewchar\font127 } +\DeclareFontShape{OML}{ccm}{m}{it}{% + <10><10.95><12>ccmi10}{} +%</OMLccm> +% \end{macrocode} +% +% \subsubsection{Computer Modern Roman in \texttt{OT2} encoding} +% +% These fonts are from the University of Washington. They do not +% belong into this file but at the moment there is no other place. +% \begin{macrocode} +%<*OT2cmr> +\DeclareFontFamily{OT2}{cmr}{\hyphenchar\font45 } +\DeclareFontShape{OT2}{cmr}{m}{n}{% + <5><6><7><8><9>gen*wncyr% + <10><10.95><12><14.4><17.28><20.74><24.88>wncyr10}{} +\DeclareFontShape{OT2}{cmr}{m}{it}{% + <5><6><7><8><9>gen*wncyi% + <10><10.95><12><14.4><17.28><20.74><24.88>wncyi10}{} +\DeclareFontShape{OT2}{cmr}{m}{sc}{% + <5><6><7><8><9><10><10.95><12><14.4>% + <17.28><20.74><24.88>wncysc10}{} +%<+OT2cmr>%%%%%%%%%%%%% bold series +\DeclareFontShape{OT2}{cmr}{b}{n}{% + <5><6><7><8><9>gen*wncyb% + <10><10.95><12><14.4><17.28><20.74><24.88>wncyb10}{} +%</OT2cmr> +% \end{macrocode} +% +% \subsubsection{Computer Modern Sans in \texttt{OT2} encoding} +% +% Some more fonts from the University of Washington. +% \begin{macrocode} +%<*OT2cmss> +\DeclareFontFamily{OT2}{cmss}{\hyphenchar\font45 } +\DeclareFontShape{OT2}{cmss}{m}{n}{% + <8><9>gen*wncyss% + <10><10.95><12><14.4><17.28><20.74><24.88>wncyss10}{} +%</OT2cmss> +% \end{macrocode} +% +% The next line goes into all files and in addition prevents \dst{} +% from adding any further code from the main source file (such as a +% character table. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/cmfonts.ins b/Master/texmf-dist/source/latex-dev/base/cmfonts.ins new file mode 100644 index 00000000000..79da8994dba --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/cmfonts.ins @@ -0,0 +1,124 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + + +\keepsilent +\usedir{tex/latex/base} + +\generate{\file{ot1cmss.fd}{\from{cmfonts.fdd}{OT1cmss}} + \file{ot1cmr.fd}{\from{cmfonts.fdd}{OT1cmr}} + \file{ot1cmtt.fd}{\from{cmfonts.fdd}{OT1cmtt,nowarn}} + \file{ot1cmvtt.fd}{\from{cmfonts.fdd}{OT1cmvtt}} + \file{ot1cmfib.fd}{\from{cmfonts.fdd}{OT1cmfib}} + \file{ot1cmfr.fd}{\from{cmfonts.fdd}{OT1cmfr}} + \file{ot1cmdh.fd}{\from{cmfonts.fdd}{OT1cmdh}}} + +\generate{\file{ucmr.fd}{\from{cmfonts.fdd}{Ucmr}} + \file{ucmss.fd}{\from{cmfonts.fdd}{Ucmss}} + \file{ucmtt.fd}{\from{cmfonts.fdd}{Ucmtt}} + \file{omlcmm.fd}{\from{cmfonts.fdd}{OMLcmm}} + \file{omscmsy.fd}{\from{cmfonts.fdd}{OMScmsy}} + \file{omxcmex.fd}{\from{cmfonts.fdd}{OMXcmex}} + \file{omlcmr.fd}{\from{cmfonts.fdd}{OMLcmr}} + \file{omscmr.fd}{\from{cmfonts.fdd}{OMScmr}} + } + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.fdd' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile + diff --git a/Master/texmf-dist/source/latex-dev/base/doc.dtx b/Master/texmf-dist/source/latex-dev/base/doc.dtx new file mode 100644 index 00000000000..aad15515431 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/doc.dtx @@ -0,0 +1,4941 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% ^^A -*-LaTeX-*- +% +% ^^A These shouldn't come out in .ist files, hence the module +% ^^A comments, or in the printed version, hence temporary comment +% ^^A category for `<' +%\catcode`\<=14 +%<+package|shortvrb>\NeedsTeXFormat{LaTeX2e}[1994/12/01] +%<+package> \ProvidesPackage{doc} +%<+shortvrb>\ProvidesPackage{shortvrb} +%<+package|shortvrb> [2018/09/25 v2.1i +%<+package|shortvrb> Standard LaTeX documentation package (FMi)] +%\catcode`\<=12 +% +%% +%\iffalse This is a METACOMMENT +% Everything up to the next `\ fi' (without a blank) will +% be ignored. This is necessary because `%' may no longer +% be a comment mark when this file is read in. +% +% +%% Package `doc' to use with LaTeX 2e +%% Copyright (C) 1989-1999 Frank Mittelbach, all rights reserved. +% +% +% Version: Date: Changes: +% +% 1.0a 5.5.88 This is nothing but a collection of tests and +% hacks. It is certainly going to be greatly +% changed. +% Better not to use it! +% 1.5a and earlier... are not longer recorded +% 1.5b and higher... are documented with the (undocumented) \changes +% feature. +%\fi +% \changes{v1.5f}{1989/04/29}{Thanks to Brian who documented the +% \cs{changes} macro feature.} +% \changes{v1.5g}{1989/05/07}{MacroTopsep now called MacrocodeTopsep and +% new MacroTopsep added} +% \changes{v1.5h}{1989/05/17}{All lines shortened to <72 characters} +% \changes{v1.5j}{1989/06/09}{Corrections by Ron Whitney added} +% \changes{v1.5q}{1989/11/03}{`\ldots{}Listing macros renamed to +% `\ldots{}Input. Suggested by R. Wonneberger} +% \changes{v1.5w}{1990/02/05}{Counter codelineno renamed to CodelineNo} +% \changes{v1.9a}{1993/12/02}{Upgrade for LaTeX2e} +% \changes{v1.9d}{1993/12/20}{Protected changes entry.} +% \changes{v1.0p}{1994/05/21}{Use new error commands} +% +% +% \hyphenation{make-index} +% +% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty} +% \DoNotIndex{\@flushglue,\@gobble,\@input} +% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle} +% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa} +% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue} +% \DoNotIndex{\@thanks,\@thefnmark,\@topnum} +% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin} +% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces} +% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup} +% \DoNotIndex{\mathcal,\csname,\def,\documentstyle,\dospecials,\edef} +% \DoNotIndex{\egroup} +% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist} +% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global} +% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn} +% \DoNotIndex{\ifcase} +% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item} +% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower} +% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing} +% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc} +% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut} +% \DoNotIndex{\strutbox} +% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt} +% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@} +% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim} +% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary} +% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle} +% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode} +% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip} +% \DoNotIndex{\nopagebreak} +% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle} +% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb} +% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar} +% \DoNotIndex{\[,\{,\},\]} +% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode} +% \DoNotIndex{\baselineskip,\begin,\tw@} +% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q} +% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H} +% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z} +% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0} +% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_} +% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother} +% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment} +% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined} +% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc} +% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar} +% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode} +% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting} +% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf} +% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse} +% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault} +% \DoNotIndex{\bfdefault} +% +% \MakeShortVerb{\"} +% \setcounter{StandardModuleDepth}{1} +% +% {\catcode`\p=12 \catcode`\t=12 ^^A hack used later on to print +% \gdef\dimenvalue#1pt{$#1$pt}} ^^A a register value with a - sign +% +% \newcommand{\DOC}{\texttt{doc}} +% +% \changes{v1.9t}{1995/05/11}{Use \cs{GetFileInfo}} +% \GetFileInfo{doc.sty} +% +% \CheckSum{2206} ^^A % keep the checksum in this file +% +% \title{The \DOC{} and \texttt{shortvrb} Packages\thanks +% {This file has version number \fileversion{} dated \filedate{}.}} +% \author{Frank Mittelbach\thanks{Further commentary added at Royal +% Military College of Science by B. Hamilton Kelly; English +% translation of parts of the original German commentary +% provided by Andrew Mills; fairly substantial additions, +% particularly from \texttt{newdoc}, and +% documentation of post-v1.5q features added at v1.7a by Dave +% Love (SERC Daresbury Lab). Extraction of \texttt{shortvrb} +% package added by Joachim Schrod (TU~Darmstadt).}} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \begin{abstract} +% This package contains the definitions that are necessary to +% format the documentation of package files. The package was +% developed in Mainz in cooperation with the Royal Military College +% of Science. This is an update which documents various changes +% and new features in \DOC{} and integrates the features of +% \textsf{newdoc}. +% \end{abstract} +% +% \newif\ifmulticols +% \IfFileExists{multicol.sty}{\multicolstrue}{} +% +% \ifmulticols +% \addtocontents{toc}{\protect\begin{multicols}{2}} +% \fi +% +% {\parskip 0pt ^^A We have to reset \parskip +% ^^A (bug in \LaTeX) +% \tableofcontents +% } +% +% \changes{v1.7a}{1992/02/25}{Miscellaneous small changes to the text} +% +% \ifmulticols +% \begin{multicols}{2}[\section*{Preface to version 1.7}] +% \else \section*{Preface to version 1.7} \fi +% +% This version of \texttt{doc.dtx} documents changes which have occurred +% since the last published version \cite{art:doc} but which have been +% present in distributed versions of \texttt{doc.sty} for some time. It +% also integrates the (undocumented) features of the distributed +% \texttt{newdoc.sty}. +% +% The following changes and additions have been made to the user +% interface since the published version~\cite{art:doc}. See +% \S\ref{sec:interface} for more details. +% \begin{description} +% \item[Driver mechanism] "\DocInput" is now used in the driver file +% to input possibly multiple independent \DOC{} files and \DOC{} no +% longer has to be the last package. "\IndexListing" is replaced +% by "\IndexInput"; +% \item[Indexing] is controlled by "\PageIndex" and "\CodelineIndex", +% one of which must be specified to produce an index---there is no +% longer a "\makeindex" in the default "\DocstyleParms"; +% \item[The \texttt{macro} environment] now takes as argument the +% macro name {\em with\/} the backslash; +% \item[Verbatim text] Newlines are now forbidden inside "\verb" and +% commands "\MakeShortVerb" and "\DeleteShortVerb" are provided for +% verbatim shorthand; +% \item[\texttt{\bslash par}] can now be used in "\DoNotIndex"; +% \item[Checksum/character table support] for ensuring the integrity +% of distributions is added; +% \item[\texttt{\bslash printindex}] becomes "\PrintIndex"; +% \item[\texttt{multicol.sty}] is no longer necessary to use \DOC{} or +% print the documentation (although it is recommended); +% \item[`Docstrip' modules] are recognised and formatted specially. +% \end{description} +% +% As well as adding some completely new stuff, +% the opportunity has been taken to add some commentary to the code +% formerly in \texttt{newdoc.sty} and that added after version 1.5k of +% \texttt{doc.sty}. Since (as noted in the sections concerned) this +% commentary wasn't written by Frank Mittelbach but the code was, it is +% probably {\em not\/} true in this case that ``if the code and +% comments disagree both are probably wrong''! +% +% \subsection*{Bugs} +% +% There are some known bugs in this version: +% \begin{itemize} +% \item The "\DoNotIndex" command doesn't work for some single +% character commands most noticeable "\%". +% \item The `General changes' glossary entry would come out after +% macro names with a leading "!" and possibly a leading |"|; +% \item If you have an old version of \textsf{makeindex} long "\changes" +% entries will come out strangely and you may find the section +% header amalgamated with the first changes entry. Try to get an +% up-to-date one (see p.~\pageref{makeindex:version}); +% \item Because the accompanying \textsf{makeindex} style files support +% the inconsistent attribute specifications of older and newer +% versions \textsf{makeindex} always complains about three `unknown +% specifier's when sorting the index and changes entries. +% \item If "\MakeShortVerb" and "\DeleteShortVerb" are used with +% single character arguments, e.g., "{|}" instead of "{\|}" chaos +% may happen. +% \end{itemize} +% (Some `features' are documented below.) +% +% \subsection*{Wish list} +% +% \begin{itemize} +% \item Hooks to allow "\DescribeMacro" and "\DescribeEnv" to write +% out to a special file information about the package's `exported' +% definitions which they describe. This could subsequently be +% included in the \texttt{docstrip}ped \texttt{.sty} file in a +% suitable form for use by smart editors in command completion, +% spelling checking etc., based on the packages used in a document. +% This would need agreement on a `suitable form'. \item Indexing of +% the modules used in \texttt{docstrip}'s "%<" directives. I'm not +% sure how to index directives containing module combinations; \item +% Writing out bibliographic information about the package; \item Allow +% turning off use of the special font for, say, the next guarded +% block. +% \end{itemize} +% +% \ifmulticols +% \end{multicols} +% +% \begin{multicols}{2}[\medskip \rule{\textwidth}{.3pt} +% \section{Introduction}] +% \else +% \section{Introduction} +% \fi +% +% The \TeX{} macros which are described here allow definitions and +% documentation to be held in one and the same file. This has the +% advantage that normally very complicated instructions are made +% simpler to understand by comments inside the definition. In addition +% to this, updates are easier and only one source file needs to be +% changed. On the other hand, because of this, the package files are +% considerably longer: thus \TeX{} takes longer to load them. If this +% is a problem, there is an easy remedy: one needs only to run the +% \texttt{docstrip.tex} program that removes nearly all lines that begin +% with a +% percent sign. +% +% The idea of integrated documentation was born with the development +% of the \TeX{} program; it was crystallized in Pascal with the \Web{} +% system. The advantages of this method are plain to see (it's easy +% to make comparisons \cite{art:Knuthliterat}). Since this +% development, systems similar to \Web{} have been developed for other +% programming languages. But for one of the most complicated +% programming languages (\TeX) the documentation has however been +% neglected. The \TeX{} world seems to be divided between:--- +% \begin{itemize} \item a couple of ``wizards'', who produce many +% lines of completely unreadable code ``off the cuff'', and \item many +% users who are amazed that it works just how they want it to do. Or +% rather, who despair that certain macros refuse to do what is +% expected of them.\end{itemize} +% +% I do not think that the \Web{} system is {\em the\/} reference work; +% on the contrary, it is a prototype which suffices for the +% development of programs within the \TeX{} world. It is sufficient, +% but not totally sufficient.\footnote{I know that this will be seen +% differently by a few people, but this product should not be seen as +% the finished product, at least as far as applications concerning +% \TeX{} are concerned. The long-standing debate over `multiple +% change files' shows this well.} As a result of \Web, new programming +% perspectives have been demonstrated; unfortunately, though, they +% haven't been developed further for other programming languages. +% +% The method of documentation of \TeX{} macros which I have introduced +% here should also only be taken as a first sketch. It is designed +% explicitly to run under \LaTeX{} alone. Not because I was of the +% opinion that this was the best starting point, but because from this +% starting point it was the quickest to develop.\footnote{This +% argument is a bad one, however, it is all too often trotted out.} As +% a result of this design decision, I had to move away from the +% concept of modularization; this was certainly a step backward. +% +% I would be happy if this article could spark off discussion over +% \TeX\ documentation. I can only advise anyone who thinks that they +% can cope without documentation to ``Stop Time'' until he or she +% completely understands the \AmSTeX{} source code. +% +% +% +% +% +% \subsection{Using the \DOC{} package} +% +% Just like any other package, invoke it by requesting it with a +% |\usepackage| command in the preamble. \textsf{Doc}'s use of +% |\reversemarginpars| may make it incompatible with some classes. +% \changes{v1.7a}{1992/02/25}{Altered usage info} +% +% +% \ifmulticols\end{multicols}\fi +% +% +% \section{The User Interface}\label{sec:interface} +% \subsection{The driver file} +% +% If one is going to document a set of macros with the \DOC{} +% package one has to prepare a special driver file which produces the +% formatted document. This driver file has the following +% characteristics: +% +% \noindent |\documentclass[|\meta{options}]^^A +% |{|\meta{document-class}|}|\\[1pt] +% |\usepackage{doc}|\\[3pt] +% \hspace*{10pt}\meta{preamble}\\[3pt] +% |\begin{document}|\\[3pt] +% \hspace*{10pt}\meta{special input commands}\\[3pt] +% |\end{document}| +% +% The \meta{document-class} might be any document class, I normally +% use \texttt{article}. +% +% In the \meta{preamble} one should place declarations which +% manipulate the behavior of the \DOC{} package like +% |\DisableCrossrefs| or |\OnlyDescription|. +% +% \DescribeMacro\DocInput \DescribeMacro\IndexInput +% Finally the \meta{special input commands} part should contain one or +% more |\DocInput|\meta{file name} and/or +% |\IndexInput|\meta{file name} commands. The +% |\DocInput| command is used for files prepared for the +% \DOC{} package whereas |\IndexInput| can be used for all kinds of +% macro files. See page \pageref{..Input} for more details of +% "\IndexInput". Multiple "\DocInput"s can be used with a +% number of included files which are each self-contained +% self-documenting packages---for instance, each containing +% "\maketitle". +% +% As an example, the driver file for the \DOC{} package itself is +% the following text surrounded by "%<*driver>" and "%</driver>". +% To produce the documentation you can simply run the \texttt{.dtx} +% file through \LaTeX{} in which case this code will be executed +% (loading the document class \texttt{ltxdoc}, etc.) or you can +% extract this into a separate file by using +% the \texttt{docstrip} program. +% The line numbers below are added by +% \DOC{}'s formatting. +% Note that the class \textsf{ltxdoc} has the \DOC{} package +% preloaded. +% \changes{v1.7a}{1992/03/06}{Added +% docstrip-derivable driver file as example.} +% \changes{v1.7c}{1992/04/01}{Expurgated ltugboat.sty from driver.} +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\EnableCrossrefs + %\DisableCrossrefs % Say \DisableCrossrefs if index is ready +\CodelineIndex +\RecordChanges % Gather update information + %\OnlyDescription % comment out for implementation details + %\OldMakeindex % use if your MakeIndex is pre-v2.9 +\setlength\hfuzz{15pt} % dont make so many +\hbadness=7000 % over and under full box warnings +\begin{document} + \DocInput{doc.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% +% \subsection{General conventions} +% +% A \TeX{} file prepared to be used with the `doc' package +% consists of `documentation parts' intermixed with `definition +% parts'. +% +% Every line of a `documentation part' starts with a percent sign +% (|%|) in column one. It may contain arbitrary \TeX{} or +% \LaTeX{} commands except that the character `|%|' cannot be +% used as a comment character. +% \SortIndex{\string^\string^A}{\string\verb\verbatimchar +% \string^\string^A\verbatimchar \encapchar usage} To allow user +% comments, the |^^A| character is defined as a comment character +% later on. Such `metacomments' may be also be included simply by +% surrounding them with "\iffalse" \ldots~"\fi". +% +% All other parts of the file are called `definition parts'. They +% contain fractions of the macros described in the `documentation +% parts'. +% +% If the file is used to define new macros (e.g.\ as a package file in +% the |\usepackage| macro), the `documentation parts' are +% bypassed at high speed and the macro definitions are pasted +% together, even if they are split into several `definition parts'. +% +% \DescribeEnv{macrocode} +% On the other hand, if the documentation of these macros is to be +% produced, the `definition parts' should be typeset verbatim. To +% achieve this, these parts are surrounded by the \textsf{macrocode} +% environment. +% More exactly: before a `definition part' there should be a line +% containing\\ +% \hspace*{\MacroIndent}\verb*+% \begin{macrocode}+\\ +% and after this part a line\\ +% \hspace*{\MacroIndent}\verb*+% \end{macrocode}+\\ +% There must be {\em exactly\/} four spaces between the |%| +% and |\end{macrocode}| --- \TeX{} is looking for this string +% and not for the macro while processing a `definition part'. +% +% Inside a `definition part' all \TeX{} commands are allowed; even the +% percent sign could be used to suppress unwanted spaces etc. +% +% \DescribeEnv{macrocode*} Instead of the \textsf{macrocode} +% environment one can also use the \textsf{macrocode$*$} environment +% which produces the same results except that spaces are printed as +% \nopagebreak\verb*+ + characters. +% +% +% +% \subsection{Describing the usage of new macros} +% +% \DescribeMacro\DescribeMacro +% When you describe a new macro you may use |\DescribeMacro| to +% indicate that at this point the usage of a specific macro is +% explained. It takes one argument which will be printed in the margin +% and also produces a special index entry. For example, I used +% |\DescribeMacro{\DescribeMacro}| to make clear that this is the +% point where the usage of |\DescribeMacro| is explained. +% +% \DescribeMacro\DescribeEnv +% An analogous macro |\DescribeEnv| should be used to indicate +% that a \LaTeX{} environment is explained. It will produce a somewhat +% different index entry. Below I used |\DescribeEnv{verbatim}|. +% +% \DescribeEnv{verbatim} +% It is often a good idea to include examples of the usage of new macros +% in the text. Because of the |%| sign in the first column of every +% row, the \textsf{verbatim} environment is slightly altered to suppress +% those +% characters.\footnote{These macros were written by Rainer +% Sch\"opf~\cite{art:verbatim}. He also +% provided a new \textsf{verbatim} environment +% which can be used inside of other macros.} +% \DescribeEnv{verbatim*} +% The \textsf{verbatim$*$} environment is changed in the same way. +% \changes{v1.7a}{1992/02/26}{Documented \cs{verb} change.} +% \DescribeMacro\verb +% The "\verb" command is re-implemented to give an error report if a +% newline appears in its argument. +% The \textsf{verbatim} and \textsf{verbatim$*$} environments set text +% in the style defined by "\MacroFont"~(\S\ref{sec:macrofont}). +% +% +% +% \subsection{Describing the definition of new macros} +% +% \DescribeEnv{macro} +% To describe the definition of a new macro we use the \textsf{macro} +% environment. It has one argument: the name of the new +% macro.\footnote{This is a change to the style design I described in +% ^^A \TUB ^^A removed in case ltugboat.sty not used +% \textsl{TUGboat\/}\ 10\#1 (Jan.~89). We finally decided +% that it would +% be better to use the macro name {\em with\/} the +% backslash as an argument.} +% This argument is also used to print the name in the margin and to +% produce an index entry. +% Actually the index entries for usage and definition are different to +% allow an easy reference. +% This environment might be nested. In this case the +% labels in the margin are placed under each other. +% \changes{v1.7a}{1992/02/26}{Note on need for some text in macro env.} +% There should be some text---even if it's just an empty +% "\mbox{}"---in this environment before "\begin{macrocode}" or the +% marginal label won't print in the right place. +% +% \DescribeMacro\MacrocodeTopsep +% \DescribeMacro\MacroTopsep +% There also exist four style parameters: |\MacrocodeTopsep| and +% |\MacroTopsep| are used to control the vertical spacing above +% and below the \textsf{macrocode} and the \textsf{macro} +% \DescribeMacro\MacroIndent +% environment, |\MacroIndent| is used to indent the lines of code +% and +% \DescribeMacro\MacroFont \label{sec:macrofont} +% |\MacroFont| holds the font and a possible size change command +% for the code lines, the "verbatim"["*"] environment and the macro +% names printed in the margin. If you want +% to change their default values in a +% class file (like \texttt{ltugboat.cls}) use the |\DocstyleParms| +% command described below. Starting with release 2.0a it can now +% be changed directly as long as the redefinition happens before +% the |\begin{document}|. +% +% +% +% +% \subsection{Formatting the margins} +% +% \DescribeMacro\PrintDescribeMacro +% \DescribeMacro\PrintDescribeEnv +% \DescribeMacro\PrintMacroName +% \DescribeMacro\PrintEnvName +% As mentioned earlier, some macros and the \textsf{macro} environment +% print their arguments in the margin. This is actually done by four +% macros which are user +% definable.\footnote{You may place the changed definitions in a +% separate package +% file or at the beginning of the documentation +% file. +% For example, if you don't like any names in the +% margin +% but want a fine index you can simply +% \texttt{\bslash let} +% these macros equal \texttt{\bslash @gobble}. +% The doc package won't redefine any existing +% definitions of these macros.} +% They are named |\PrintDescribeMacro|, |\PrintDescribeEnv|, +% |\PrintMacroName| (called by the \textsf{macro} environment) and +% |\PrintEnvName| (called by the \textsf{environment} environment). +% +% +% \subsection{Using a special escape character} +% +% \DescribeMacro\SpecialEscapechar +% If one defines complicated macros it is sometimes necessary to +% introduce a new escape character because the `|\|' has got a +% special |\catcode|. In this case one can use +% |\SpecialEscapechar| to indicate which character is actually +% used to play the r\^ole of the `|\|'. A scheme like this is +% needed because the \textsf{macrocode} environment and its counterpart +% \textsf{macrocode$*$} produce an index entry for every occurrence of a +% macro name. They would be very confused if you didn't tell them that +% you'd changed |\catcode|$\,$s. The argument to +% |\SpecialEscapechar| is a single-letter control sequence, that +% is, one has to use "\|" for example to denote that `\verb+|+' +% is used as an escape character. |\SpecialEscapechar| only +% changes the behavior of the next \textsf{macrocode} or +% \textsf{macrocode$*$} environment. +% +% The actual index entries created will all be printed with |\| +% rather than \verb+|+, but this probably reflects their usage, if not +% their definition, and anyway must be preferable to not having any +% entry at all. The entries {\em could\/} be formatted appropriately, +% but the effort is hardly worth it, and the resulting index might be +% more confusing (it would certainly be longer!). +% +% +% \subsection{Cross-referencing all macros used} +% +% \DescribeMacro\DisableCrossrefs \DescribeMacro\EnableCrossrefs As +% already mentioned, every new macro name used within a +% \textsf{macrocode} or \textsf{macrocode$*$} environment will produce +% an index entry. In this way one can easily find out where a specific +% macro is used. Since \TeX{} is considerably slower when it has to +% produce such a bulk of index entries one can turn off this feature +% by using |\DisableCrossrefs| in the driver file. To turn it on again +% just use |\EnableCrossrefs|.\footnote{Actually, \texttt{\bslash +% EnableCrossrefs} changes things more drastically; any following +% \texttt{\bslash DisableCrossrefs} which might be present in the +% source will be ignored.} +% +% +% \DescribeMacro\DoNotIndex +% But also finer control is provided. The |\DoNotIndex| macro +% takes a list of macro names separated by commas. Those names won't +% show up in the index. You might use several |\DoNotIndex| +% commands: their lists will be concatenated. In this article I used +% |\DoNotIndex| for +% all macros which are already defined in \LaTeX. +% +% All three above declarations are local to the current group. +% +% Production (or not) of the index (via the "\makeindex" commend) is +% controlled by using or omitting the following declarations in the +% driver file preamble; if neither is used, no index is produced. +% \DescribeMacro\PageIndex Using "\PageIndex" makes all index +% entries refer to their page number; with +% \DescribeMacro\CodelineIndex "\CodelineIndex", index entries +% produced by "\DescribeMacro" and "\DescribeEnv" refer to page number +% but those produced by the \textsf{macro} environment refer to the +% code lines, which will be numbered automatically.\footnote{The line +% number is actually that of the first line of the first +% \textsf{macrocode} environment in the \textsf{macro} environment.} +% \DescribeMacro\theCodelineNo +% The style of this numbering can be controlled by defining the macro +% "\theCodelineNo". Its default definition is to use scriptsize +% arabic numerals; a user-supplied definition won't be overwritten. +% +% \DescribeMacro\CodelineNumbered +% When you don't wish to get an index but want your code lines +% numbered use "\CodelineNumbered" instead of "\CodelineIndex". This +% prevents the generation of an unnecessary ".idx" file. +% +% +% \subsection{Producing the actual index entries} +% +% Several of the aforementioned macros will produce some sort of index +% entries. These entries have to be sorted by an external +% program---the current implementation assumes that the +% \textsf{makeindex} program by Chen~\cite{art:Chen} is used. +% +% But this isn't built in: one has only to redefine some of the +% following macros to be able to use any other index program. All +% macros which are installation +% dependent are defined in such a way that they won't overwrite a +% previous definition. Therefore it is safe to put the changed +% versions in a package file which might be read in before the doc +% package. +% +% To allow the user to change the specific characters recognized by +% his or her index program all characters which have special meaning +% in the \textsf{makeindex} program are given symbolic +% names.\footnote{I don't know if there exists a program which needs +% more command characters, but I hope not.} +% However, all characters used should be of |\catcode| other than +% `letter' (11). +% +% \DescribeMacro{\actualchar} +% The |\actualchar| is used to separate the `key' and the actual +% index entry. +% \DescribeMacro{\quotechar} +% The |\quotechar| is used before a special index program +% character to suppress its special meaning. +% \DescribeMacro{\encapchar} +% The |\encapchar| separates the indexing information from a +% letter string which \textsf{makeindex} uses as a \TeX{} command to +% format the page number associated with a special entry. It is used +% in this package to apply the |\main| and the |\usage| +% commands. +% \DescribeMacro{\levelchar} +% Additionally |\levelchar| is used to separate `item', +% `subitem' and `subsubitem' entries. +% +% It is a good idea to stick to these symbolic names even if you know +% which index program is used. In this way your files will be +% portable. +% +% \DescribeMacro\SpecialMainIndex +% \DescribeMacro\SpecialMainEnvIndex +% To produce a main index entry for a macro the +% |\SpecialMainIndex| macro\footnote{This macro is called by the +% \textsf{macro} environment.} may be used. It is called `special' +% because it has to print its argument verbatim. +% A similar macro, called |\SpecialMainEnvIndex| is used for indexing +% the main definition point of an +% environment.\footnote{This macro is called by the +% \textsf{environment} environment.} +% \DescribeMacro\SpecialIndex +% If you want a normal index entry for a macro name +% |\SpecialIndex| might be used.\footnote{This macro is called +% within the \textsf{macrocode} environment when encountering a macro +% name.} +% \DescribeMacro\SpecialUsageIndex +% \DescribeMacro\SpecialEnvIndex +% To index the usage of a macro or an environment +% |\SpecialUsageIndex| and |\SpecialEnvIndex| may be used. +% \DescribeMacro\SortIndex +% Additionally a |\SortIndex| command is provided. It takes two +% arguments---the sort key and the actual index entry. +% +% All these macros are normally used by other macros; you will need +% them only in an emergency. +% +% \DescribeMacro\verbatimchar +% But there is one characteristic worth mentioning: all macro names in +% the index are typeset with the |\verb*| command. Therefore one +% special character is needed to act as a delimiter for this command. +% To allow a change in this respect, again this character is +% referenced indirectly, by the macro |\verbatimchar|. It expands +% by default to \verb?+? but if your code lines contain macros with +% `\texttt{+}' characters in their names (e.g.\ when you use \verb?\+?) +% you will end up with an index entry containing \verb?\verb+\++? +% which will be typeset as `\verb+\++' and not as `\verb?\+?'. In this +% case you should redefine |\verbatimchar| globally or locally to +% overcome this problem. +% +% \DescribeMacro\* +% We also provide a |\*| macro. This is intended to be used for +% index entries like +% \begin{quote} +% index entries \\ +% \hspace*{30pt} Special macros for \* +% \end{quote} +% Such an entry might be produced with the line: +%\begin{verbatim} +% \index{index entries\levelchar Special macros for \*} +%\end{verbatim} +% +% \DescribeMacro\OldMakeindex +% Versions of \textsf{makeindex} prior to 2.9 had some bugs affecting +% \DOC{}. One of these, +% pertaining to the "%" character doesn't have a work-around +% appropriate for versions with and without the +% bug.\label{makeindex:version} If +% you have an old version, invoke "\OldMakeindex" in a +% package file or the driver file to prevent problems with index entries +% such as "\%", although you'll probably normally want to turn off +% indexing of "\%" anyway. Try to get an up-to-date \textsf{makeindex} +% from one of the \TeX{} repositories. +% +% +% \subsection{Setting the index entries} +% +% \changes{v1.7a}{1992/03/11}{Usage note on gind.ist.} After the first +% formatting pass through the \texttt{.dtx} file you need to sort the +% index entries written to the \texttt{.idx} file using +% \textsf{makeindex} or your favourite alternative. You need a +% suitable style file for \textsf{makeindex} (specified by the +% \texttt{-s} switch). A suitable one is supplied with \DOC{}, +% called \texttt{gind.ist}. +% +% \DescribeMacro\PrintIndex +% To read in and print the sorted index, just put the +% |\PrintIndex| command as the last (commented-out, and thus +% executed during the documentation pass through the file) command +% in your package file. Precede it by any bibliography commands +% necessary for your citations. +% Alternatively, it may be more convenient to put all such calls +% amongst the arguments of the |\StopEventually| macro, in +% which case a |\Finale| command should appear at the end of +% your file. +% +% \DescribeEnv{theindex} +% Contrary to standard \LaTeX, the index is typeset in three columns +% by default. This is controlled by the \LaTeX{} counter +% `\textsf{IndexColumns}' and can therefore be changed with a +% |\setcounter| declaration. Additionally one doesn't want to +% start a new page unnecessarily. Therefore the \textsf{theindex} +% environment is redefined. +% \DescribeMacro\IndexMin +% When the \textsf{theindex} environment starts it will measure how much +% space is left on the current page. If this is more than +% |\IndexMin| then the index will start on this page. Otherwise +% |\newpage| is called. +% +% Then a short introduction about the meaning of several index entries +% is typeset (still in onecolumn mode). Afterwards the actual index +% entries follow in multi-column mode. +% \DescribeMacro\IndexPrologue +% You can change this prologue with the help of the +% |\IndexPrologue| macro. Actually the section heading is also +% produced in this way, so you'd better write something like: +% \begin{verbatim} +% \IndexPrologue{\section*{Index} The index entries underlined ...} +%\end{verbatim} +% When the \textsf{theindex} environment is finished the last page will +% be reformatted to produce balanced columns. This improves the layout +% and allows the next article to start on the same page. +% \DescribeMacro\IndexParms +% Formatting of the index columns (values for |\columnssep| +% etc.)\ is controlled by the |\IndexParms| macro. It assigns the +% following values: +% \SpecialUsageIndex{\parindent}\SpecialUsageIndex{\columnsep}^^A +% \SpecialUsageIndex{\parskip}\SpecialUsageIndex{\rightskip}^^A +% \SpecialUsageIndex{\mathsurround}\SpecialUsageIndex{\parfillskip} +% \begin{center} +% \begin{tabular}{l@{\,=\,}ll@{\,=\,}l} +% |\parindent| & \IndexParms \the\parindent & +% |\columnsep| & \IndexParms \the\columnsep \\ +% |\parskip| & \IndexParms \the\parskip & +% |\rightskip| & \IndexParms +% \expandafter\dimenvalue\the\rightskip \\ +% |\mathsurround| & \IndexParms \the\mathsurround & +% |\parfillskip| & \IndexParms +% \expandafter\dimenvalue\the\parfillskip +% \end{tabular} +% \end{center} +% \DescribeMacro{\@idxitem} +% Additionally it defines |\@idxitem| (which will be used when an +% |\item| command is encountered) and selects |\small| size. +% If you want to change any of these values you have to define them +% all. +% +% \DescribeMacro\main +% \DescribeMacro\usage +% The page numbers for main index entries are encapsulated by the +% |\main| macro (underlining its argument) and the numbers +% denoting the description are encapsulated by the |\usage| macro +% (which produces {\em italics}). As usual these commands are user +% definable. +% +% +% \subsection{Changing the default values of style parameters} +% +% \DescribeMacro\DocstyleParms If you want to overwrite some default +% settings made by the \DOC{} package, you can either put your +% declarations in the driver file (that is after \texttt{doc.sty} is +% read in) or use a separate package file for doing this work. In the +% latter case you can define the macro |\DocstyleParms| to contain all +% assignments. This indirect approach is necessary if your package file +% might be read before the \texttt{doc.sty}, when some of the +% registers are not allocated. Its default definition is null. +% +% The doc package currently assigns values to the following +% registers: +% \SpecialUsageIndex{\IndexMin}\SpecialUsageIndex{\MacrocodeTopsep}^^A +% \SpecialUsageIndex{\MacroTopsep}^^A +% \SpecialUsageIndex{\MacroIndent}\SpecialUsageIndex{\marginparpush}^^A +% \SpecialUsageIndex{\marginparwidth}\SpecialUsageIndex{\tolerance} +% \begin{center} +% \begin{tabular}{l@{\,=\,}ll@{\,=\,}l} +% |\IndexMin| & \the\IndexMin & +% |\MacroTopsep| & \the\MacroTopsep \\ +% |\marginparwidth|& \the\marginparwidth & +% |\MacroIndent| & \the\MacroIndent \\ +% |\marginparpush| & \the\marginparpush & +% |\MacrocodeTopsep| & \the\MacrocodeTopsep \\ +% |\tolerance| & \the\tolerance +% \end{tabular} +% \end{center} +% +% +% \subsection{Short input of verbatim text pieces} +% +% \DescribeMacro\MakeShortVerb +% \DescribeMacro{\MakeShortVerb*} \DescribeMacro\DeleteShortVerb It is +% awkward to have to type, say, "\verb|"\ldots"|" continually when +% quoting +% verbatim bits (like macro names) in the text, so an abbreviation +% mechanism is provided. Pick a character \meta{c}---one which +% normally has catcode `other' unless you have very good reason not +% to---which you don't envisage using in the text, or not using often. +% (I like |"|, but you may prefer "|" if you have |"| active to do +% umlauts, for instance.) Then if you say +% "\MakeShortVerb{\"\meta{c}"}" you can subsequently use +% \meta{c}\meta{text}\meta{c} as the equivalent of +% "\verb"\meta{c}\meta{text}\meta{c}; analogously, the "*"-form +% "\MakeShortVerb*{\"\meta{c}"}" gives you the equivalent of +% "\verb*"\meta{c}\meta{text}\meta{c}. Use +% "\DeleteShortVerb{\"\meta{c}"}" if you subsequently want \meta{c} to +% revert to its previous meaning---you can always turn it on again +% after the unusual section. The `short verb' commands make global +% changes. The abbreviated "\verb" may not appear in the argument of +% another command just like "\verb". However the `short verb' +% character may be used freely in the \textsf{verbatim} and +% \textsf{macrocode} environments without ill effect. +% "\DeleteShortVerb" is silently ignored if its argument does not +% currently represent a short verb character. Both commands type a +% message to tell you the meaning of the character is being changed. +% +% Please remember that the command "\verb" cannot be used in arguments +% of other commands. Therefore abbreviation characters for "\verb" +% cannot be used there either. +% +% This feature is also available as a sole package, \texttt{shortvrb}. +% +% +% \subsection{Additional bells and whistles} +% +% We provide macros for logos such as \Web, \AmSTeX, \BibTeX, +% \SliTeX{} and \PlainTeX. Just type |\Web|, |\AmSTeX|, +% |\BibTeX|, |\SliTeX| or |\PlainTeX|, respectively. +% \LaTeX{} and \TeX{} are already defined in \texttt{latex.tex}. +% +% \DescribeMacro\meta +% Another useful macro is |\meta| which has one argument and +% produces something like \meta{dimen parameter}. +% +% \DescribeMacro\OnlyDescription +% \DescribeMacro\StopEventually +% You can use the |\OnlyDescription| declaration in the driver +% file to suppress the last part of your document (which presumably +% exhibits the code). To make this work +% you have to place the command |\StopEventually| at a suitable +% point in your file. This macro has one argument in which you put +% all information you want to see printed if your document ends at +% this point (for example a bibliography which is normally printed at +% the very end). When the |\OnlyDescription| declaration is +% missing the |\StopEventually| +% \DescribeMacro\Finale +% macro saves its argument in a macro called |\Finale| which can +% afterwards be used to get things back (usually at the very end). +% Such a scheme makes changes in two places unnecessary. +% +% Thus you can use this feature to produce a local guide for the +% \TeX{} users which describes only the usage of macros (most of them +% won't be interested in your definitions anyway). For the same +% reason the |\maketitle| \DescribeMacro\maketitle command is slightly +% changed to allow multiple titles in one document. So you can make +% one driver file reading in several articles at once. +% \DescribeMacro{\ps@titlepage} To avoid an unwanted +% \textsf{pagestyle} on the title page the |\maketitle| command issues +% a |\thispagestyle{titlepage}| declaration which produces a +% \textsf{plain} page if the \textsf{titlepage} page style is +% undefined. This allows class files like \textsf{ltugboat.cls} to +% define their own page styles for title pages. +% +% \DescribeMacro\AlsoImplementation +% Typesetting the whole document is the default. However, this default +% can also be explicitly selected using the declaration +% |\AlsoImplementation|. This overwrites any previous +% |\OnlyDescription| declaration. The \LaTeXe{} distribution, for +% example, is documented using the \texttt{ltxdoc} class which allows +% for a configuration file \texttt{ltxdoc.cfg}. In such a file one +% could then add the statement +% \begin{quote} +% |\AtBeginDocument{\AlsoImplementation}| +% \end{quote} +% to make sure that all documents will show the code part. +% +% \DescribeMacro\IndexInput \label{..Input} Last but not least I +% defined an |\IndexInput| macro which takes a file name as an +% argument and produces a verbatim listing of the file, indexing every +% command as it goes along. This might be handy, if you want to learn +% something about macros without enough documentation. I used this +% feature to cross-reference \texttt{latex.tex} getting a verbatim +% copy with about 15 pages index.\footnote{It took quite a long time +% and the resulting \texttt{.idx} file was longer than the +% \texttt{.dvi} file. Actually too long to be handled by the +% \textsf{makeindex} program directly (on our MicroVAX) but the final +% result was worth the trouble.} +% +% \changes{v2.1d}{2006/02/02}{Corrected description of \cs{changes} +% macro.} +% \DescribeMacro\changes +% To maintain a change history within the file, the |\changes| +% command may be placed amongst the description part of the changed +% code. It takes three arguments, thus: +% \begin{quote} +% |\changes{|\meta{version}|}{|\meta{date}|}{|^^A +% \meta{text}|}| +% \end{quote} +% The changes may be used to produce an auxiliary file (\LaTeX's +% |\glossary| mechanism is used for this) which may be printed +% after suitable formatting. The |\changes| macro generates the +% printed entry in such a change history; because old +% versions\footnote{Before 2.6.} of the \textsf{makeindex} +% program limit such fields to 64 characters, care should be taken +% not to exceed this limit when describing the change. The actual +% entry consists of the \meta{version}, the |\actualchar|, the current +% macro name, a colon, the |\levelchar|, and, finally, the \meta{text}. +% The result is a glossaryentry for the \meta{version}, with the name of +% the current macro as subitem. Outside the |macro| environment, the +% text |\generalname| is used instead of the macro name. When +% referring to macros in change descriptions it is conventional to use +% |\cs{|\meta{macroname}|}| rather than attempting to format it properly +% and using up valuable characters in the entry with old \textsf{makeindex} +% versions. +% +% \changes{v1.7a}{1992/02/26}{Description of \cs{RecordChanges} etc. +% added +% to interface section.} \DescribeMacro\RecordChanges To cause the +% change information to be written out, include "\RecordChanges" in +% the driver file. \DescribeMacro\PrintChanges To read in and print +% the sorted change history (in two columns), just put the +% |\PrintChanges| command as the last (commented-out, and thus +% executed during the documentation pass through the file) command in +% your package file. Alternatively, this command may form one of the +% arguments of the |\StopEventually| command, although a change +% history is probably {\em not\/} required if only the description is +% being printed. The command assumes that \textsf{makeindex} or some +% other program has processed the \texttt{.glo} file to generate a +% sorted \texttt{.gls} file. You need a special \textsf{makeindex} +% style file; a suitable one is supplied with \DOC{}, called +% \texttt{gglo.ist}. \DescribeMacro\GlossaryMin +% \DescribeMacro\GlossaryPrologue \DescribeMacro\GlossaryParms The +% "\GlossaryMin", "\GlossaryPrologue" and "\GlossaryParms" macros are +% analogous to the "\Index"\ldots\ versions. (The \LaTeX{} `glossary' +% mechanism is used for the change entries.) +% +% \label{sec:checksum} +% \DescribeMacro\CharacterTable +% \DescribeMacro\CheckSum +% To overcome some of the problems of sending files over the networks +% we developed two macros which should detect corrupted files. If one +% places the lines +% \begin{flushleft} +% \small\ttfamily ^^A \ttfamily to get the blanks between "..."s +% ^^A right +%"%%\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 "\verb=\"= +%" 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 \~}"\\ +%"%%" +%\end{flushleft} +% at the beginning of the file then character translation failures +% will be detected, provided of course, that the used \DOC{} +% package has a correct default table. The percent +% signs\footnote{There are two percent signs in each line. This has +% the effect that these lines are not removed by the +% \texttt{docstrip.tex} program.} at the beginning of the lines should +% be typed in, since only the \DOC{} package should look at this +% command. +% +% +% Another problem of mailing files is possible truncation. To detect +% these sort of errors we provide a |\CheckSum| macro. The check-sum +% of a file is simply the number of backslashes in the code, i.e.\ all +% lines between the \textsf{macrocode} environments. But don't be +% afraid: you don't have count the code-lines yourself; this is done +% by the \DOC{} package for you. You simply have add +% \begin{quote} +% |% \CheckSum{0}| +% \end{quote} +% near the beginning of the file and +% use +% the |\StopEventually| (which starts looking for backslashes) and the +% |\Finale| command. The latter will inform you either that your file +% has no check-sum (telling you the right number) or that your number +% is incorrect if you put in anything other than zero but guessed wrong (this time +% telling you both the correct and the +% incorrect one). Then you go to the top of your file again and change the +% line to the right number, i.e. +% line +% \begin{quote} +% |% \CheckSum{|\meta{number}|}| +% \end{quote} +% and that's all. +% +% While |\CharacterTable| and |\CheckSum| have been important features +% in the early days of the public internet when \DOC{} was written as +% the mail gateways back then were rather unreliable and often mangled +% files they are these days more a nuisance than any help. They are +% therefore now fully optional and no longer recommended for use with new files. +% +% +% \DescribeMacro\bslash +% From time to time, it is necessary to print a |\| without +% being able to use the |\verb| command because the +% |\catcode|$\,$s of the symbols are already firmly +% established. In this instance we can use the command +% |\bslash| presupposing, of course, that the actual font in +% use at this point contains a `backslash' as a symbol. Note that +% this definition of |\bslash| is expandable; it inserts a +% $"\"_{12}$. This means that you have to |\protect| +% it if it is used in `moving arguments'. +% +% \DescribeMacro\MakePrivateLetters +% \changes{v1.7a}{1992/02/26}{Documented \cs{MakePrivateLetters} in +% interface section}^^A +% If your macros "\catcode" anything other than "@" to `letter', you +% should redefine "\MakePrivateLetters" so that it also makes the +% relevant characters `letters' for the benefit of the indexing. The +% default definition is just "\makeatletter". +% +% \DescribeMacro\DontCheckModules \DescribeMacro\CheckModules +% \DescribeMacro\Module \DescribeMacro\AltMacroFont The `module' +% directives of the \textsf{docstrip} system \cite{art:docstrip} are +% normally recognised and invoke special formatting. This can be +% turned on and off in the \texttt{.dtx} file or the driver file using +% "\CheckModules" and "\DontCheckModules". If checking for module +% directives is on (the default) then code in the scope of the +% directives is set as determined by the hook "\AltMacroFont", which +% gives {\small\ttfamily\itshape small italic type\-writer\/} by +% default in the New Font Selection Scheme but just ordinary +% {\small\ttfamily small type\-writer} in the old one, where a font +% such as italic typewriter can't be used portably (plug for NFSS); +% you will need to override this if you don't have the italic +% typewriter font available. Code is in such a scope if it's on a +% line beginning with "%<" or is between lines starting with +% "%<*"\meta{name list}">" and "%</"\meta{name list}">". The +% directive is formatted by the macro "\Module" whose single argument +% is the text of the directive between, but not including, the angle +% brackets; this macro may be re-defined in the driver or package file +% and by default produces results like \Module{+foo\string|bar} with no +% following space. +% +% \DescribeMacro{StandardModuleDepth} Sometimes (as in this file) the +% whole code is surrounded by modules to produce several files from a +% single source. In this case it is clearly not appropriate to format +% all code lines in a special "\AltMacroFont". For this reason a +% counter "StandardModuleDepth" is provided which defines the level of +% module nesting which is still supposed to be formatted in +% "\MacroFont" rather then "\AltMacroFont". The default setting is +% "0", for this documentation it was set to +%\begin{verbatim} +% \setcounter{StandardModuleDepth}{1} +%\end{verbatim} +% at the beginning of the file. +% +% +% \subsection{Basic usage summary} +% \changes{v1.7a}{1992/03/11}{Added basic usage summary to spell +% it out.} +% +% To sum up, the basic structure of a \texttt{.dtx} file without any +% refinements is like this: +% \begin{verse}\small +% "% "\meta{waffle}\ldots\\ +% \quad\ldots \\ +% "% \DescribeMacro{\fred}"\\ +% "% "\meta{description of fred's use}\\ +% \quad\ldots\\ +% "% \StopEventually{"\meta{finale code}"}"\\ +% \quad\ldots\\ +% "% \begin{macro}{\fred}"\\ +% "% "\meta{commentary on macro fred}\\ +% \verb*+% \begin{macrocode}+\\ +% \meta{code for macro fred}\\ +% \verb*+% \end{macrocode}+\\ +% "% \end{macro}"\\ +% \quad\ldots\\ +% "% \Finale \PrintIndex \PrintChanges" +% \end{verse} +% For examples of the use of most---if not all---of the features +% described above consult the \texttt{doc.dtx} source itself. +% +% \subsection{Acknowledgements} +% +% I would like to thank all folks at Mainz and at the Royal Military +% College of Science for their help in this project. Especially Brian +% and Rainer who pushed everything with their suggestions, bug fixes, +% etc. +% +% A big thank you to David Love who brought the documentation +% up-to-date again, after I neglected this file for more than two +% years. This was most certainly a tough job as many features added to +% \texttt{doc.dtx} after its publication in \textsl{TUGboat\/} have +% been never properly described. Beside this splendid work he kindly +% provided additional code (like ``docstrip'' module formatting) which +% I think every \textsf{doc.dtx} user will be grateful for. +% +% +% \StopEventually{ +% \begin{thebibliography}{1} +% \bibitem{book:Buerger} \textsc{G. A. B\"urger}. +% \newblock Wunderbare Reisen zu Wasser und zu Lande, Feldz\"uge +% und lustige Abenteuer des Freyherrn v.\ M\"unchhausen. +% \newblock London, 1786 \& 1788. +% \bibitem{art:Knuthliterat} \textsc{D. E. Knuth}. +% \newblock Literate Programming. +% \newblock Computer Journal, Vol.~27, \textit{pp}.~97--111, +% May 1984. +% \bibitem{book:KnuthA} \textsc{D. E. Knuth}. +% \newblock Computers \& Typesetting (The \TeX book). +% \newblock Addison-Wesley, Vol. A, 1986. +% \bibitem{art:Chen} \textsc{L. Lamport}. +% \newblock MakeIndex: An Index Processor for \LaTeX. +% \newblock 17 February 1987. +% \newblock (Taken from the file \texttt{makeindex.tex} provided +% with +% the program source code.) +% \bibitem{art:doc} \textsc{Frank Mittelbach}. +% \newblock The \DOC{}-option. +% \newblock \textsl{TUGboat}, Vol.~10(2), \textit{pp}.~245--273, +% July 1989. +% \bibitem{art:docstrip} \textsc{Frank Mittelbach, Denys Duchier and +% Johannes Braams}. +% \newblock \texttt{docstrip.dtx} (to appear). +% \newblock The file is part of the DOC package. +% \bibitem{book:Raspe} \textsc{R. E. Raspe} (*1737, \dag 1797). +% \newblock Baron M\"unchhausens narrative of his marvellous +% travels and campaigns in Russia. +% \newblock Oxford, 1785. +% \bibitem{art:verbatim} \textsc{Rainer Sch\"opf}. +% \newblock A New Implementation of \LaTeX's \texttt{verbatim} and +% \texttt{verbatim*} Environments. +% \newblock File \texttt{verbatim.doc}, version 1.4i. +% \end{thebibliography} +% +% \ifmulticols +% \addtocontents{toc}{\protect\end{multicols}} +% \fi +% +% } ^^A end \StopEventually +% +% +% \section{The Description of Macros} +% +% Most of the following code is destined for \texttt{doc.sty} after +% processing with \texttt{docstrip} to include the module +% \textbf{style} indicated here. (All code in this file not +% appropriate to \texttt{doc.sty} has to be included explicitly by +% docstrip so that this \texttt{.dtx} file can be used as directly as +% a package file rather than the stripped version.) The usual font +% change for the conditionally-included lines between the +% \Module{*style} and \Module{/style} directives is suppressed since +% only the lines with an explicit directive are special in this file. +% \begin{macrocode} +%<*package> +% \end{macrocode} +% Under \LaTeXe{} the test to avoid reading +% \DOC{} in twice is normally unnecessary. It was kept to only to +% stay compatible with \LaTeX209 styles that |\input| \DOC{} +% directly. +% \changes{v1.5i}{1989/06/07}{Avoid reading the file twice.} +% \begin{macrocode} +\@ifundefined{macro@cnt}{}{\endinput} +% \end{macrocode} +% +% \DescribeMacro\fileversion +% \DescribeMacro\filedate +% \DescribeMacro\docdate +% As you can see I used macros like |\fileversion| to denote the +% version number and the date. They are defined at the very beginning +% of the package file (without a surrounding \textsf{macrocode} +% environment), so I don't have to search for this place here when I +% change the version number. You can see their actual outcome in a +% footnote to the title. +% +% +% The first thing that we do next is to get ourselves a new comment +% sign. Because all sensible signs are already occupied, we will +% choose one that can only be entered indirectly: +% {\DoNotIndex{\^}^^A avoid misinterpretation !!!!! VERIFY +% \begin{macrocode} +\catcode`\^^A=14 +% \end{macrocode} +% We repeat this statement at the beginning of the document in case +% the \texttt{inputenc} package is used disabling it again. +% \changes{v2.0b}{1998/05/19}{Init docs private comment char at begin +% of document again (pr2581)} +% \begin{macrocode} +\AtBeginDocument{\catcode`\^^A=14\relax} +% \end{macrocode} +% \SortIndex{\string^\string^A}{\string\verb\verbatimchar +% \string^\string^A\verbatimchar +% \encapchar main} +% } +% +% +% \subsection{Options supported by \DOC{}} +% +% Not options available at the moment +% +% \begin{macrocode} +% \end{macrocode} +% +% +% \subsection{Macros surrounding the `definition parts'} +% +% \begin{environment}{macrocode} +% Parts of the macro definition will be surrounded by the +% environment \textsf{macrocode}. Put more precisely, they will be +% enclosed by a macro whose argument (the text to be set +% `verbatim') is terminated by the string +% \verb*+% \end{macrocode}+. Carefully note the number of spaces. +% |\macrocode| is defined completely analogously to +% |\verbatim|, but because a few small changes were carried +% out, almost all internal macros have got new names. We start by +% calling the macro |\macro@code|, the macro which bears the +% brunt of most of the work, such as |\catcode| reassignments, +% etc. +% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)} +% \begin{macrocode} +\def\macrocode{\macro@code +% \end{macrocode} +% Then we take care that all spaces have the same width, and that +% they are not discarded. +% \begin{macrocode} + \frenchspacing \@vobeyspaces +% \end{macrocode} +% Before closing, we need to call |\xmacro@code|. It is this +% macro that expects an argument which is terminated by the above +% string. This way it is possible to keep the |\catcode| +% changes local. +% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)} +% \changes{v1.5t}{1989/11/07}{Common code moved to \cs{macro@code}.} +% \begin{macrocode} + \xmacro@code} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\macro@code} +% We will now begin with the macro that does the actual work: +% \begin{macrocode} +\def\macro@code{% +% \end{macrocode} +% In theory it should consist of a \textsf{trivlist} environment, but +% the empty space before and after the environment should not be +% too large. +% \begin{macrocode} + \topsep \MacrocodeTopsep +% \end{macrocode} +% The next parameter we set is |\@beginparpenalty|, in order +% to prevent a page break before such an environment. +% \begin{macrocode} + \@beginparpenalty \predisplaypenalty +% \end{macrocode} +% We then start a |\trivlist|, set |\parskip| back to +% zero and start an empty |\item|. +% \changes{v1.9b}{1993/12/03}{Forcing any label from macro env.} +% \begin{macrocode} + \if@inlabel\leavevmode\fi + \trivlist \parskip \z@ \item[]% +% \end{macrocode} +% Additionally, everything should be set in \texttt{typewriter} font. +% Some people might prefer it somewhat differently; because of this +% the font choice is +% macro-driven.\footnote{The font change has to be placed +% {\em after\/} +% the \texttt{\bslash item}. Otherwise a change to +% \texttt{\bslash baselineskip} will affect the +% paragraph above.} +% \begin{macrocode} + \macro@font +% \end{macrocode} +% Because |\item| sets various parameters, we have found it +% necessary to alter some of these retrospectively. +% \begin{macrocode} + \leftskip\@totalleftmargin \advance\leftskip\MacroIndent + \rightskip\z@ \parindent\z@ \parfillskip\@flushglue +% \end{macrocode} +% The next line consists of the \LaTeX{} definition of |\par| +% used in |\verbatim| and should result in blank lines being +% shown as blank lines. +% \changes{v1.5l}{1989/09/10}{Code line numbers supported.} +% \changes{v1.5t}{1989/11/07}{Call \cs{leavevmode} to get \cs{everypar} +% on blank lines.} +% \changes{v1.7c}{1992/03/24}{Added \cs{interlinepenalty} to +% \cs{par} from +% verbatim.sty} +% \begin{macrocode} + \blank@linefalse \def\par{\ifblank@line + \leavevmode\fi + \blank@linetrue\@@par + \penalty\interlinepenalty} +% \end{macrocode} +% What use is this definition of |\par|\,? We use the macro +% |\obeylines| of \cite{book:KnuthA} which changes all |^^M| +% to |\par| so that each can control its own indentation. +% Next we must also ensure that all special signs are normalized; +% that is, they must be given |\catcode| $12$. +% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim, +% which handles more ligatures.} +% \begin{macrocode} + \obeylines + \let\do\do@noligs \verbatim@nolig@list + \let\do\@makeother \dospecials +% \end{macrocode} +% \changes{v1.5t}{1989/11/07}{Common code added.} +% \changes{v1.5w}{1990/02/05}{Skip of \cs{@totalleftmargin} added.} If +% indexing by code lines is switched on the line number is incremented +% and set appropriately. We also check whether the start of the next +% line indicates a \texttt{docstrip} module directive and process it +% appropriately if so using "\check@module". +% \begin{macrocode} + \global\@newlistfalse + \global\@minipagefalse + \ifcodeline@index + \everypar{\global\advance\c@CodelineNo\@ne + \llap{\theCodelineNo\ \hskip\@totalleftmargin}% + \check@module}% + \else \everypar{\check@module}% + \fi +% \end{macrocode} +% We also initialize the cross-referencing feature by calling +% |\init@crossref|. This will start the scanning mechanism +% when encountering an escape character. +% \begin{macrocode} + \init@crossref} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ifblank@line} +% \begin{macro}{\blank@linetrue} +% \begin{macro}{\blank@linefalse} +% |\ifblank@line| is the switch used in the definition above. +% In the original \textsf{verbatim} environment the |\if@tempswa| +% switch is used. This is dangerous because its value may change +% while processing lines in the \textsf{macrocode} environment. +% \begin{macrocode} +\newif\ifblank@line +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\endmacrocode} +% Because we have begun a \textsf{trivlist} environment in the +% \textsf{macrocode} environment, we must also end it. We must +% also act on the value of the "pm@module" flag (see below) and +% empty "\everypar". +% \changes{v1.5r}{1989/11/04}{Support for code line no. (Undoc)} +% \begin{macrocode} +\def\endmacrocode{% + \ifpm@module \endgroup \pm@modulefalse \fi + \everypar{}% + \global\@inlabelfalse + \endtrivlist +% \end{macrocode} +% Additionally |\close@crossref| is used to do anything needed +% to end the cross-referencing mechanism. +% \begin{macrocode} + \close@crossref} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\MacroFont} +% Here is the default definition for the |\MacroFont| macro. +% With the new math font handling in NFSS2 it isn't any longer +% correct to suppress the math font setup since this is now handled +% differently. But to keep the font change fast we use only a +% single |\selectfont| (in |\small|) and do the rest by hand. +% \changes{v1.5x}{1990/02/17}{\cs{math@fontsfalse} added for NFSS.} +% \changes{v1.7a}{1992/03/13}{Added \cs{reset@font} for NFSS.} +% \changes{v1.8c}{1993/10/25}{NFSS standard} +% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different +% math setup /pr1622} +% \begin{macrocode} +\@ifundefined{MacroFont}{% + \if@compatibility +% \end{macrocode} +% Despite the above statement we will call |\small| first if +% somebody is using a \LaTeX2.09 document with doc. I wouldn't have +% bothered since doc-sources should be up-to-date but since the +% request came from someone called David Carlisle \ldots :-) +% \changes{v1.9y}{1996/01/26}{Support compat mode} +% \begin{macrocode} + \def\MacroFont{\small + \usefont\encodingdefault + \ttdefault + \mddefault + \updefault + }% + \else + \def\MacroFont{\fontencoding\encodingdefault + \fontfamily\ttdefault + \fontseries\mddefault + \fontshape\updefault + \small}% + \fi + }{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AltMacroFont} +% \begin{macro}{\macro@font} +% \changes{v1.7a}{1992/03/12}{Added to support distinction of modules.} +% \changes{v1.7c}{1992/03/26}{Altered font change for OFSS.} +% \changes{v1.7m}{1992/10/11}{Use sltt as default.} +% \changes{v1.8c}{1993/10/25}{NFSS standard} +% \changes{v1.9t}{1995/05/26}{Removed \cs{math@fontsfalse} (different +% math setup /pr1622} +% Although most of the macro code is set in "\MacroFont" we want to be +% able to switch to indicate module code set in "\AltMacroFont". +% "\macro@font" keeps track of which one we're using. We can't do the +% same thing sensibly in OFSS as in NFSS. +% \begin{macrocode} +\@ifundefined{AltMacroFont}{% + \if@compatibility +% \end{macrocode} +% Again have |\small| first if we are in compat mode. +% \changes{v1.9y}{1996/01/26}{Support compat mode} +% \begin{macrocode} + \def\AltMacroFont{\small + \usefont\encodingdefault + \ttdefault + \mddefault + \sldefault + }% + \else + \def\AltMacroFont{\fontencoding\encodingdefault + \fontfamily\ttdefault + \fontseries\mddefault + \fontshape\sldefault + \small + }% + \fi + }{} +% \end{macrocode} +% To allow changing the "\MacroFont" in the preamble we defer +% defining the internally used "\macro@font" until after the +% preamble. +% \changes{v2.0a}{1998/05/16}{Support changing \cs{MacroFont} in +% preamble} +% \begin{macrocode} +\AtBeginDocument{\let\macro@font\MacroFont} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\check@module} +% \begin{macro}{\ifpm@module} +% \changes{v1.7a}{1992/03/12}{Added.} +% This is inserted by "\everypar" at the start of each macrocode line to +% check whether it starts with module information. (Such information is +% of the form "%<"\meta{switch}">", where the "%" must be at the +% start of the line and \meta{switch} comprises names with various +% possible separators and a possible leading "+", "-", "*" or "/" +% \cite{art:docstrip}. All that concerns us here is what the first +% character of \meta{switch} is.) First it checks the "pm@module" +% flag in case the previous line had a non-block module +% directive i.e., not "%<*" or "%</"; if it did we need to close the +% group it started and unset the flag. "\check@module" looks ahead at +% the next token and then calls "\ch@percent" to take action depending +% on whether or not it's a "%"; we don't want to expand the token at +% this stage. This is all done conditionally so it can be turned off +% if it causes problems with code that wasn't designed to be +% \texttt{docstrip}ped. +% \begin{macrocode} +\def\check@module{% + \ifcheck@modules + \ifpm@module \endgroup \pm@modulefalse \fi + \expandafter\futurelet\expandafter\next\expandafter\ch@percent + \fi} +\newif\ifpm@module +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\DontCheckModules} +% \begin{macro}{\CheckModules} +% \changes{v1.7a}{1992/03/12}{Added.} +% \begin{macro}{\ifcheck@modules} +% Here are two driver-file interface macros for turning the module +% checking on and off using the "check@modules" switch. +% \begin{macrocode} +\def\DontCheckModules{\check@modulesfalse} +\def\CheckModules{\check@modulestrue} +\newif\ifcheck@modules \check@modulestrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\ch@percent} +% \changes{v1.7a}{1992/03/12}{Added.} +% If the lookahead token in "\next" is $"%"_{12}$ we go on to check +% whether the following one is "<" and otherwise do nothing. Note the +% "\expandafter" to get past the "\fi". +% \begin{macrocode} +\def\ch@percent{% + \if \percentchar\next + \expandafter\check@angle + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\check@angle} +% \changes{v1.7a}{1992/03/12}{Added.} +% Before looking ahead for the "<" the "%" is gobbled by the +% argument here. +% \begin{macrocode} +\def\check@angle#1{\futurelet\next\ch@angle} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ch@angle} +% \changes{v1.7a}{1992/03/12}{Added.} +% \changes{v1.9k}{1994/02/22}{Have \texttt{<} active} +% If the current lookahead token is "<" we are defined to be +% processing a module directive can go on to look for "+" etc.; +% otherwise we must put back the gobbled "%". With \LaTeXe{} +% \texttt{<} is active so we have to be a bit careful. +% \begin{macrocode} +\begingroup +\catcode`\<\active +\gdef\ch@angle{\ifx<\next + \expandafter\ch@plus@etc + \else \percentchar \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ch@plus@etc} +% \begin{macro}{\check@plus@etc} +% \changes{v1.7a}{1992/03/12}{Added.} +% We now have to decide what sort of a directive we're dealing with +% and do the right thing with it. +% \begin{macrocode} +\gdef\ch@plus@etc<{\futurelet\next\check@plus@etc} +\gdef\check@plus@etc{% + \if +\next + \let\next\pm@module + \else\if -\next + \let\next\pm@module + \else\if *\next + \let\next\star@module + \else\if /\next + \let\next\slash@module +% \end{macrocode} +% At some point in the past the \texttt{docstrip} program was +% partly rewritten and at that time it also got support for a very +% special directive of the form |%<<| followed by an arbitrary +% string. This is used for ``verbatim'' inclusion in case of +% certain problem. We do not really attempt to pretty print that +% case but we need at least account for it since otherwise we get +% an error message since this is the only case where we will not +% have a closing |>|. +% \changes{v2.0n}{2001/05/16}{Partly support docstrip's ``verbatim'' +% directive (pr/3331)} +% \begin{macrocode} + \else\ifx <\next + \percentchar + \else + \let\next\pm@module + \fi\fi\fi\fi\fi + \next} +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\pm@module} +% If we're not dealing with a block +% directive ("*" or "/") i.e., it's a single special line, we set +% everything up to the next ">" appropriately and then change to the +% special macro font inside a group which will be ended at the start +% of the next line. If the apparent module directive is missing the +% terminating ">" this will lose, but then so will the \texttt{docstrip} +% implementation. An alternative strategy would be to have +% "\pm@module" make ">" active and clear a flag set here to indicate +% processing the directive. Appropriate action could then be taken if +% the flag was found still to be set when processing the next line. +% \changes{v1.7a}{1992/03/12}{Added.} +% \changes{v1.7i}{1992/07/11}{Support for fonts depending on nesting.} +% \begin{macrocode} +\begingroup +\catcode`\~=\active +\lccode`\~=`\> +\lowercase{\gdef\pm@module#1~}{\pm@moduletrue + \Module{#1}\begingroup +% \end{macrocode} +% We switch to a special font as soon the nesting is higher than +% the current value of "\c@StandardModuleDepth". We do a local +% update to the "\guard@level" here which will be restored after +% the current input line. +% \begin{macrocode} + \advance\guard@level\@ne + \ifnum\guard@level>\c@StandardModuleDepth\AltMacroFont\fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\star@module} +% \begin{macro}{\slash@module} +% \changes{v1.7a}{1992/03/12}{Added.} +% \changes{v1.7f}{1992/05/16}{Take account of nested guards.} +% \changes{v1.7i}{1992/07/11}{Add counter to determine when to switch to +% special font.} +% If the start or end of a module {\em block\/} is indicated, after +% setting the guard we have to check whether a change in the macrocode +% font should be done. This will be the case if we are already inside +% a block or are ending the outermost block. If so, we globally +% toggle the font for subsequent macrocode sections between the normal +% and special form, switching to the new one immediately. +% \changes{v1.7i}{1992/07/17}{Support for fonts depending on module +% nesting} +% \begin{macrocode} +\lowercase{\gdef\star@module#1~}{% + \Module{#1}% + \global \advance \guard@level\@ne + \ifnum \guard@level>\c@StandardModuleDepth + \global\let\macro@font=\AltMacroFont \macro@font + \fi} +\catcode`\>=\active +\gdef\slash@module#1>{% + \Module{#1}% + \global \advance \guard@level\m@ne + \ifnum \guard@level=\c@StandardModuleDepth + \global\let\macro@font\MacroFont \macro@font + \fi +} +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\c@StandardModuleDepth} +% \changes{v1.7i}{1992/07/11}{Counter added.} +% Counter defining up to which level modules are considered part of +% the main code. If, for example, the whole code is surrounded by +% a |%<*package>| module we better set this counter to |1| to avoid +% getting the whole code be displayed in typewriter italic. +% \begin{macrocode} +\newcounter{StandardModuleDepth} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\guard@level} +% \changes{v1.7f}{1992/05/16}{Added.} +% We need a counter to keep track of the guard nesting. +% \begin{macrocode} +\newcount \guard@level +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Module} +% \changes{v1.7a}{1992/03/12}{Added.} +% \changes{v1.7d}{1992/04/25}{Use sans font for modules.} +% This provides a hook to determine the way the module directive is +% set. It gets as argument everything between the angle brackets. +% The default is to set the contents in sans serif text between +% $\langle\,\rangle$ with the special characters suitably "\mathcode"d +% by "\mod@math@codes". (You can't just set it in a sans text font +% because normally "|" will print as an em-dash.) This is done +% differently depending on whether we have the NFSS or the old one. In +% the latter case we can easily change "\fam" appropriately. +% \changes{v1.8c}{1993/10/25}{NFSS standard} +% \begin{macrocode} +\@ifundefined{Module}{% +% \end{macrocode} +% With NFSS what we probably {\em should\/} do is change to a new +% "\mathversion" but I (Dave Love) haven't spotted an easy way to +% do so correctly if the document uses a version other than +% "normal". (We need to know in what font to set the other +% groups.) This uses a new math alphabet rather than version and +% consequently has to worry about whether we're using +% \textsf{oldlfnt} or not. I expect there's a better +% way\ldots +% \begin{macrocode} + \def\Module#1{\mod@math@codes$\langle\mathsf{#1}\rangle$} + }{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mod@math@codes} +% \changes{v1.7c}{1992/03/26}{Added.} +% \changes{v2.1e}{2010/02/04}{Added mathcodes for +,-,:, and = (pr/4096)} +% As well as `words', the module +% directive text might contain any of the characters "*/+-,&|!()" +% for the current version of \textsf{docstrip}. We only need +% special action for two of them in the math code changing required +% above: "|" is changed to a "\mathop" (it's normally |"026A|) and +% "&" is also made a "\mathop", but in family 0. Remember that "&" +% will not have a special catcode when it's encountered. +% \begin{macrocode} +\def\mod@math@codes{\mathcode`\|="226A \mathcode`\&="2026 + \mathcode`\-="702D \mathcode`\+="702B + \mathcode`\:="703A \mathcode`\=="703D } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mathsf} +% \changes{v1.7c}{1992/03/26}{Added.} +% \changes{v1.7d}{1992/04/25}{Use sans font for modules.} +% \changes{v1.7n}{1993/02/21}{\cs{sfmath} Renamed to \cs{mathsf}.} +% \changes{v1.8c}{1993/10/25}{NFSS standard} +% If NFSS is in use we need a new math alphabet which uses a sans serif +% font. To support both the release one and two of NFSS the alphabet +% was renamed to "\mathsf" which is defined in NFSS2. +% \begin{macrocode} +%\ifx\selectfont\undefined +%\else +% \ifx\mathsf\undefined +% \newmathalphabet*{\mathsf}{\sfdefault}{m}{n}\fi +%\fi +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\MacrocodeTopsep} +% \begin{macro}{\MacroIndent} +% In the code above, we have used two registers. Therefore we have +% to allocate them. The default values might be overwritten with +% the help of the |\DocstyleParms| macro. +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \changes{v1.5y}{1990/02/24}{Default changed.} +% \changes{v1.6b}{1990/06/15}{\cs{rm} moved before \cs{scriptsize} to +% avoid unnecessary fontwarning.} +% \begin{macrocode} +\newskip\MacrocodeTopsep \MacrocodeTopsep = 3pt plus 1.2pt minus 1pt +\newdimen\MacroIndent +\settowidth\MacroIndent{\rmfamily\scriptsize 00\ } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% \begin{environment}{macrocode*} +% \begin{macro}{\endmacrocode*} +% Just as in the \textsf{verbatim} environment, there is also a +% `star' variant of the \textsf{macrocode} environment in which a +% space is shown by the symbol \verb*+ +. Until this moment, I +% have not yet used it (it will be used in the description of the +% definition of |\xmacro@code| below) but it's exactly on this one +% occasion {\em here\/} that you can't use it (cf.\ M\"unchhausens +% Marsh problem)\footnote{Karl Friedrich Hieronymus Frhr.\ v.\ +% M\"unchhausen (*1720, \dag1797). Several books were written +% about fantastic adventures supposedly told by him (see +% \cite{book:Raspe} or \cite{book:Buerger}). In one story he +% escaped from the marsh by pulling himself out by his hair.} +% directly. Because of this, on this one occasion we'll cheat +% around the problem with an additional comment character. But now +% back to |\macrocode*|. We start with the macro |\macro@code| +% which prepares everything and then call the macro |\sxmacro@code| +% whose argument is terminated by the string +%\verb*+% \end{macrocode*}+. +% \begin{macrocode} +\@namedef{macrocode*}{\macro@code\sxmacro@code} +% \end{macrocode} +% As we know, |\sxmacro@code| and then |\end{macrocode*}| +% (the macro, not the string), will be executed, so that for a +% happy ending we still need to define the macro +% |\endmacrocode*|. +% \begin{macrocode} +\expandafter\let\csname endmacrocode*\endcsname = \endmacrocode +% \end{macrocode} +% \end{macro} +% \end{environment} +% +% +% +% +% +% +% +% \begin{macro}{\xmacro@code} +\catcode`\!=\catcode`\% ^^A In this section there must not be + ^^A any exclamation marks. + ^^A +% As already mentioned, the macro |\xmacro@code| expects an +% argument delimited by the string \verb*+% \end{macrocode}+. At +% the moment that this macro is called, the |\catcode| of +% \TeX's special characters are 12 (`other') or 13 (`active'). +% Because of this we need to utilize a different escape character +% during the definition. This happens locally. +% \begin{macrocode*} +\begingroup +\catcode`\|=\z@ \catcode`\[=\@ne \catcode`\]=\tw@ +% \end{macrocode*} +% Additionally, we need to ensure that the symbols in the above +% string contain the |\catcode|$\,$s which are available +% within the \textsf{macrocode} environment. +% \begin{macrocode*} +\catcode`\{=12 \catcode`\}=12 +\catcode`\%=12 \catcode`\ =\active \catcode`\\=\active +!% \end{macrocode*} +! Next follows the actual definition of |\macro@code|; +! notice the +! use of the new escape character. We manage to get the argument +! surrounded by the string |\end{macrocode}|, but at the end +! however, in spite of the actual characters used during the +! definition of +! this macro, |\end| with the argument |{macrocode}| +! will be executed, to ensure a balanced environment. +! \begin{macrocode*} +|gdef|xmacro@code#1% \end{macrocode}[#1|end[macrocode]] +!% \end{macrocode*} +! \begin{macro}{\sxmacro@code} +! The definition of |\sxmacro@code| is completely analogous, +! only +! here a slightly different terminating string will be used. +! Note that the space is not active in this environment. +! \begin{macrocode} +|catcode`| =12 +|gdef|sxmacro@code#1% \end{macrocode*}[#1|end[macrocode*]] +!% \end{macrocode} +! because the |\catcode| changes have been made local by +! commencing a +! new group, there now follows the matching |\endgroup| +! in a rather +! unusual style of writing. +! \begin{macrocode} +|endgroup +!% \end{macrocode} +\catcode`\!=12 +% \end{macro} +% \end{macro} +% +% +% +% +% \subsection{Macros for the `documentation parts'} +% +% +% \begin{macro}{\DescribeMacro} +% \begin{macro}{\Describe@Macro} +% \changes{v1.5v}{1990/01/28}{Macro added.} +% \changes{v1.5j}{1989/06/09}{\cs{ignorespaces} added as a temporary +% fix} +% \begin{macro}{\DescribeEnv} +% \begin{macro}{\Describe@Env} +% \changes{v1.5v}{1990/01/28}{Macro added.} +% \changes{v1.5j}{1989/06/09}{\cs{ignorespaces} added as a temporary +% fix} +% The |\DescribeMacro| and |\DescribeEnv| macros should +% print their arguments in the margin and produce an index entry. +% We simply use |\marginpar| to get the desired result. This +% is however not the best solution because the labels might be +% slightly misplaced. One also might get a lot of `marginpar moved' +% messages which are hard-wired into the \LaTeX{} output +% routine.\footnote{It might be better to change these macros into +% environments like the \textsf{macro} environment.} First we change +% to horizontal mode if necessary. The \LaTeX{} macros +% |\@bsphack| and |\@esphack| are used to make those +% commands invisible (i.e.\ to normalize the surrounding space and +% to make the |\spacefactor| transparent). +% \changes{v1.5v}{1990/01/28}{\cs{MakePrivateLetters} added.} +% \begin{macrocode} +\def\DescribeMacro{\leavevmode\@bsphack +% \end{macrocode} +% When documenting the code for the \texttt{amstex.sty} option we +% encountered a bug: the |\catcode| of |@| was active and +% therefore couldn't be used in command names. So we first have to +% make sure that we get all |\catcode|s right by calling +% |\MakePrivateLetters| inside a group. Then we call +% |\Describe@Macro| to do the work. +% \changes{v2.0g}{1999/03/22}{Parse backslash as letter in argument +% to \cs{DescribeMacro}.} +% \changes{v2.0h}{1999/03/25}{Correct errors introduced in v2.0g.} +% \begin{macrocode} + \begingroup\MakePrivateLetters\Describe@Macro} +\def\Describe@Macro#1{\endgroup + \marginpar{\raggedleft\PrintDescribeMacro{#1}}% +% \end{macrocode} +% Note the use of |\raggedleft| to place the output flushed +% right. Finally we call a macro which produces the actual index +% entry and finish with |\@esphack| to leave no +% trace.\footnote{The whole mechanism won't work because +% of the \texttt{\bslash leavevmode} in front. +% As a temporary change \texttt{\bslash ignorespaces} +% is added.} +% \begin{macrocode} + \SpecialUsageIndex{#1}\@esphack\ignorespaces} +% \end{macrocode} +% The |\DescribeEnv| macro is completely analogous. +% \changes{v1.5v}{1990/01/28}{\cs{MakePrivateLetters} added.} +% \begin{macrocode} +\def\DescribeEnv{\leavevmode\@bsphack\begingroup\MakePrivateLetters + \Describe@Env} +\def\Describe@Env#1{\endgroup + \marginpar{\raggedleft\PrintDescribeEnv{#1}}% + \SpecialEnvIndex{#1}\@esphack\ignorespaces} +% \end{macrocode} +% To put the labels in the left margin we have to use the +% |\reversemarginpar| declaration. (This means that the +% \texttt{doc.sty} can't be used with all classes or packages.) +% We also +% make the |\marginparpush| zero and |\marginparwidth| suitably +% wide. +% \changes{v1.5d}{1989/04/28}{\cs{marginparwidth} setting added.} +% \begin{macrocode} +\reversemarginpar +\setlength\marginparpush{0pt} \setlength\marginparwidth{8pc} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bslash} +% \changes{v1.7a}{1992/02/26}{Moved \cs{bslash} documentation to `user +% interface' part} +% We start a new group in which to hide the alteration of +% |\catcode|$\,$s, and make \verb+|+ introduce commands, +% whilst |\| becomes an `other' character. +% +% \begin{macrocode} +{\catcode`\|=\z@ \catcode`\\=12 +% \end{macrocode} +% Now we are able to define |\bslash| (globally) to generate a +% backslash of |\catcode| `other'. We then close this group, +% restoring original |\catcode|$\,$s. +% \SpecialEscapechar{\|} +% \begin{macrocode} +|gdef|bslash{\}} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{environment}{verbatim} +% \begin{environment}{verbatim*} +% \changes{v1.7i}{1992/07/12}{Added changed definition for verbatim!*.} +% The \textsf{verbatim} environment holds no secrets; it consists of +% the normal \LaTeX{} environment. We also set the +% |\@beginparpenalty| and change to the font given by +% |\MacroFont|. +% \begin{macrocode} +\def\verbatim{\@beginparpenalty \predisplaypenalty \@verbatim + \MacroFont \frenchspacing \@vobeyspaces \@xverbatim} +% \end{macrocode} +% We deal in a similar way with the star form of this environment. +% \begin{macrocode} +\@namedef{verbatim*}{\@beginparpenalty \predisplaypenalty \@verbatim + \MacroFont \@sxverbatim} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% \begin{macro}{\@verbatim} +% Additionally we redefine the |\@verbatim| macro so that it +% suppresses |%| characters at the beginning of the line. The +% first lines are copied literally from \texttt{latex.tex}. +% \changes{v1.7i}{1992/07/12}{Added \cs{@@par} to clear possible +% \cs{parshape}.} +% \begin{macrocode} +\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi + \leftskip\@totalleftmargin\rightskip\z@ + \parindent\z@\parfillskip\@flushglue\parskip\z@ + \@@par + \@tempswafalse +% \end{macrocode} +% |\@verbatim| sets |^^M|, the end of line character, to +% be equal to |\par|. This control sequence is redefined +% here; |\@@par| is the paragraph primitive of \TeX. +% \changes{v1.7c}{1992/03/24}{Added \cs{interlinepenalty} to +% \cs{par} from verbatim.sty} +% \begin{macrocode} + \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par + \penalty\interlinepenalty +% \end{macrocode} +% We add a control sequence |\check@percent| to the definition +% of |\par| whose task it is to check for a percent character. +% \begin{macrocode} + \check@percent}% +% \end{macrocode} +% The rest is again copied literally from \texttt{latex.tex} (less +% "\tt"). +% \changes{v1.7a}{1992/02/26}{Removed redundant \cs{tt}.} +% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim, +% which handles more ligatures.} +% \begin{macrocode} + \obeylines + \let\do\do@noligs \verbatim@nolig@list + \let\do\@makeother \dospecials} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\check@percent} +% Finally we define |\check@percent|. Since this must compare a +% character with a percent sign we must first (locally) change +% percent's |\catcode| so that it is seen by \TeX. The definition +% itself is nearly trivial: grab the following character, check if +% it is a |%|, and insert it again if not. At the end of the +% \textsf{verbatim} environment this macro will peek at the next +% input line. In that case the argument to |\check@percent| might +% be a |\par| or a macro with arguments. Therefore we make the +% definition |\long| (|\par| allowed) and use the normal |\next| +% mechanism to reinsert the argument after the |\fi| if necessary. +% \changes{v1.5i}{1989/06/07}{Definition changed to `long'} +% \changes{v1.5i}{1989/06/07}{Macro \cs{next} used to guard against +% macro with arguments} +% There is a subtle problem here, the equal sign between +% |\next| and |#1| is actually necessary. Do you see why? +% The omission of this token once caused a funny error. +% \changes{v1.5u}{1989/11/14}{equal sign added.} +% \begin{macrocode} +{\catcode`\%=12 + \long\gdef\check@percent#1{\ifx #1%\let\next\@empty \else + \let\next=#1\fi \next}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verb} +% \changes{v1.7a}{1992/02/27}{Now warns about newlines (from +% newdoc with `@noligs added).} +% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX \cs{verb}} +% We re-define "\verb" to check for newlines in its argument since a +% missing delimiter is difficult to detect in \DOC{} source. +% The code is the same as in \texttt{latex.tex} of September 19, 1993. +% Perhaps there should be a font-changing +% hook rather than just using "\ttfamily", but if so it probably should be +% different from "\MacroFont" since that normally includes "\small" +% and would look wrong inline. +% \changes{v1.7a}{1992/02/28}{Added math mode check (from verbatim.sty)} +% \begin{macrocode} +\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi + \bgroup \let\do\do@noligs \verbatim@nolig@list + \ttfamily \verb@eol@error \let\do\@makeother \dospecials + \@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verb@balance@group} +% \begin{macro}{\verb@egroup} +% \begin{macro}{\verb@eol@error} +% \changes{v1.8b}{1993/09/21}{Renamed \cs{verb@err} to +% \cs{verb@eol@error}, as in new LaTeX verbatim.} +% \begin{macrocode} +\let\verb@balance@group\@empty + +\def\verb@egroup{\global\let\verb@balance@group\@empty\egroup} + +\begingroup + \obeylines% + \gdef\verb@eol@error{\obeylines% + \def^^M{\verb@egroup\@latex@error{% + Text for \noexpand\verb command ended by end of line}\@ehc}}% +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@sverb} +% \changes{v1.7a}{1992/02/27}{Added for \cs{verb} change.} +% \changes{v1.7a}{1992/02/28}{Now same as in verbatim.sty.} +% \changes{v1.8b}{1993/09/21}{Changed to conform to new LaTeX verbatim, +% which has better error trapping.} +% See \cite{art:verbatim} for commentary. +% \begin{macrocode} +\def\@sverb#1{% + \catcode`#1\active \lccode`\~`#1% + \gdef\verb@balance@group{\verb@egroup + \@latex@error{Illegal use of \noexpand\verb command}\@ehc}% + \aftergroup\verb@balance@group + \lowercase{\let~\verb@egroup}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\verbatim@nolig@list} +% \begin{macro}{\do@noligs} +% These macros replace the old "\@noligs" mechanism by an +% extensible version to allow more ligatures to be added. +% \begin{macrocode} +\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-} +\def\do@noligs#1{% + \catcode`#1\active + \begingroup + \lccode`\~=`#1\relax + \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\macro} +% \begin{macro}{\m@cro@} +% \changes{v1.5v}{1990/01/28}{\cs{macro@} renamed to \cs{m@cro@} +% since AmSTeX +% defines another macro of the same name.} +% \begin{macro}{\macro@cnt} +% \label{page:macro} The \textsf{macro} environment is implemented as +% a \textsf{trivlist} environment, whereby in order that the macro +% names can be placed under one another in the margin +% (corresponding to the macro's nesting depth), the macro +% |\makelabel| must be altered. In order to store the nesting +% depth, we use a counter. We also need a counter to count the +% number of nested \textsf{macro} environments. +% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.} +% \changes{v1.9k}{1994/02/22}{Fix probably no longer necessary} +% \begin{macrocode} +\newcount\macro@cnt \macro@cnt=0 +% \end{macrocode} +% The environment takes an argument---the macro name to be +% described. Since this name may contain special `letters' we have +% to re-|\catcode| them before scanning the argument. This is done +% by the |\MakePrivateLetters| macro. +% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.} +% \changes{v1.7a}{1992/02/26}{Catcode backslash to other (from newdoc).} +% \changes{v1.9k}{1994/02/22}{Don't omit extra group} +% \begin{macrocode} +\def\macro{\begingroup + \catcode`\\12 + \MakePrivateLetters \m@cro@ \iftrue} +% \end{macrocode} +% +% \begin{environment}{environment} +% \changes{v1.8c}{1993/10/25}{Environment added} +% The ``environment'' envrionment will be implemented just like the +% ``macro'' environment flagging any differences in the code by +% passing |\iffalse| or |\iftrue| to the |\m@cro@| environment +% doing the actual work. +% \begin{macrocode} +\def\environment{\begingroup + \catcode`\\12 + \MakePrivateLetters \m@cro@ \iffalse} +% \end{macrocode} +% \end{environment} +% +% After scanning the argument we close the group to get the normal +% |\catcode|$\,$s back. Then we assign a special value to +% |\topsep| and start a \textsf{trivlist} environment. +% \changes{v1.5f}{1989/05/07}{MacroTopsep parameter added.} +% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.} +% \changes{v1.8c}{1993/10/25}{Support ``environment'' env} +% \changes{v1.9k}{1994/02/22}{Remove \cs{macro@level}} +% \begin{macrocode} +\long\def\m@cro@#1#2{\endgroup \topsep\MacroTopsep \trivlist +% \end{macrocode} +% We also save the name being described in |\saved@macroname| for +% use in conjunction with the |\changes| macro. +% \begin{macrocode} + \edef\saved@macroname{\string#2}% + #1 +% \end{macrocode} +% If documenting an environment we put is name in |\saved@indexname| +% otherwise the name without the backslash. +% \changes{v2.1g}{2016/02/15}{Use \cs{saved@indexname}} +% \begin{macrocode} + \let\saved@indexname\saved@macroname + \else + \edef\saved@indexname{\expandafter\@gobble\string#2}% + \fi +% \end{macrocode} +% Now there follows a variation of |\makelabel| which is used +% should the environment not be nested, or should it lie between +% two successive |\begin{macro}| instructions or explanatory +% text. One can recognize this with the switch |\if@inlabel| +% which will be |true| in the case of successive |\item| +% commands. +% \begin{macrocode} + \def\makelabel##1{\llap{##1}}% +% \end{macrocode} +% If |@inlabel| is |true| and if $\verb=\macro@cnt= > 0$ +% then the above definition needs to be changed, because in this +% case \LaTeX{} would otherwise put the labels all on the same line +% and this would lead to them being overprinted on top of each +% other. Because of this |\makelabel| needs to be redefined +% in this case. +% \begin{macrocode} + \if@inlabel +% \end{macrocode} +% If |\macro@cnt| has the value $1$, then we redefine +% |\makelabel| so that the label will be positioned in the +% second line of the margin. As a result of this, two macro names +% appear correctly, one under the other. It's important whilst +% doing this that the generated label box is not allowed to have +% more depth than a normal line since otherwise the distance +% between the first two text lines of \TeX{} will be incorrectly +% calculated. The definition should then look like: +%\begin{verbatim} +% \def\makelabel##1{\llap{\vtop to \baselineskip +% {\hbox{\strut}\hbox{##1}\vss}}} +%\end{verbatim} +% Completely analogous to this is the case where labels need to be +% placed one under the other. The lines above are only an example +% typeset with the \textsf{verbatim} environment. To produce the real +% definition we save the value of |\macro@cnt| in +% |\count@| and empty the temp macro |\@tempa| for later +% use. +% \begin{macrocode} + \let\@tempa\@empty \count@\macro@cnt +% \end{macrocode} +% In the following loop we append for every already typeset label +% an |\hbox{\strut}| to the definition of |\@tempa|. +% \begin{macrocode} + \loop \ifnum\count@>\z@ + \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne \repeat +% \end{macrocode} +% Now be put the definition of |\makelabel| together. +% \changes{v1.5b}{1989/04/27}{vbox to vtop changed in makelabel (test)} +% \changes{v1.5e}{1989/04/28}{ht strutbox changed to baselineskip +% (test)} +% \begin{macrocode} + \edef\makelabel##1{\llap{\vtop to\baselineskip + {\@tempa\hbox{##1}\vss}}}% +% \end{macrocode} +% Next we increment the value of the nesting depth counter. This +% value inside the \textsf{macro} environment is always at least one +% after this point, but its toplevel definition is zero. Provided +% this environment has been used correctly, $|\macro@cnt|=0$ +% should not occur when |@inlabel|=\textsf{true}. It is +% however possible if this environment is used within other list +% environments (but this would have little point). +% \begin{macrocode} + \advance \macro@cnt \@ne +% \end{macrocode} +% If |@inlabel| is false we reset |\macro@cnt| assuming +% that there is enough room to print the macro name without +% shifting. +% \begin{macrocode} + \else \macro@cnt\@ne \fi +% \end{macrocode} +% Now the label will be produced using |\item|. The following +% line is only a hack saving the day until a better solution is +% implemented. We have to face two problems: the argument might be +% a |\par| which is forbidden in the argument of other macros +% if they are not defined as |\long|, or it is something like +% |\iffalse| or |\else|, i.e.\ something which will be +% misinterpreted when \TeX{} is skipping conditional text. In both +% cases |\item| will bomb, so we protect the argument by using +% |\string|. +% \begin{macrocode} + \edef\@tempa{\noexpand\item[% +% \end{macrocode} +% Depending on whether we are inside a ``macro'' or ``environment'' +% environment we use |\PrintMacroName| or |\PrintEnvName| to +% display the name. +% \begin{macrocode} + #1% + \noexpand\PrintMacroName + \else + \noexpand\PrintEnvName + \fi + {\string#2}]}% + \@tempa +% \end{macrocode} +% At this point we also produce an index entry. Because it is not +% known which index sorting program will be used, we do not use the +% command |\index|, but rather a command +% |\SpecialMainIndex| after advancing the counter for indexing +% by line number. This may be redefined by the user in +% order to generate an index entry which will be understood by the +% index program in use (note the definition of +% |\SpecialMainIndex| for our installation). +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \changes{v1.9u}{1995/08/06}{Removed brace group which +% killed \cs{DoNotIndex}} +% We advance the current codeline number and after producing an +% index entry revert to the original value +% \begin{macrocode} + \global\advance\c@CodelineNo\@ne +% \end{macrocode} +% Again the macro to call depends on the environment we are +% actually in. +% \begin{macrocode} + #1% + \SpecialMainIndex{#2}\nobreak + \DoNotIndex{#2}% + \else + \SpecialMainEnvIndex{#2}\nobreak + \fi + \global\advance\c@CodelineNo\m@ne +% \end{macrocode} +% The |\nobreak| is needed to prevent a page break after the +% |\write| produced by the |\SpecialMainIndex| macro. We +% exclude the new macro in the cross-referencing feature, to +% prevent spurious non-main entry references. Regarding possibly +% problematic arguments, the implementation takes +% care of |\par| and the conditionals are uncritical. +% \changes{v1.7a}{1992/03/02}{Removed redundant code checking for +% \cs{par}.}^^A +% +% Because the space symbol should be ignored between the +% |\begin{macro}{...}| and the following text we must take +% care of this with |\ignorespaces|. +% \begin{macrocode} + \ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\endmacro} +% \begin{macro}{\endenvironment} +% Older releases of this environment omit the |\endgroup| token, +% when being nested. This was done to avoid unnecessary stack usage. +% However it does not work if \textsf{macro} and +% \textsf{environment} environments are mixed, therefore we now +% use a simpler approach. +% \changes{v1.5k}{1989/08/17}{Fix for save stack problem.} +% \changes{v1.9k}{1994/02/22}{Don't checkfor nesting} +% \begin{macrocode} +\let\endmacro \endtrivlist +\let\endenvironment\endmacro +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\MacroTopsep} +% Here is the default value for the |\MacroTopsep| parameter +% used above. +% \begin{macrocode} +\newskip\MacroTopsep \MacroTopsep = 7pt plus 2pt minus 2pt +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \subsection{Formatting the margin} +% +% The following three macros should be user definable. +% Therefore we define those macros only if they have not already +% been defined. +% +% \begin{macro}{\PrintMacroName} +% \begin{macro}{\PrintEnvName} +% \begin{macro}{\PrintDescribeMacro} +% \begin{macro}{\PrintDescribeEnv} +% The formatting of the macro name in the left margin is done by +% these macros. We first set a |\strut| to get the height and +% depth of the normal lines. Then we change to the +% |\MacroFont| using |\string| to |\catcode| the +% argument to other (assuming that it is a macro name). Finally we +% print a space. The font change remains local since this macro +% will be called inside an |\hbox|. +% \begin{macrocode} +\@ifundefined{PrintMacroName} + {\def\PrintMacroName#1{\strut \MacroFont \string #1\ }}{} +% \end{macrocode} +% We use the same formatting conventions when describing a macro. +% \begin{macrocode} +\@ifundefined{PrintDescribeMacro} + {\def\PrintDescribeMacro#1{\strut \MacroFont \string #1\ }}{} +% \end{macrocode} +% To format the name of a new environment there is no need to use +% |\string|. +% \begin{macrocode} +\@ifundefined{PrintDescribeEnv} + {\def\PrintDescribeEnv#1{\strut \MacroFont #1\ }}{} +\@ifundefined{PrintEnvName} + {\def\PrintEnvName#1{\strut \MacroFont #1\ }}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \subsection{Creating index entries by scanning `macrocode'} +% +% The following macros ensure that index entries are created for each +% occurrence of a \TeX-like command (something starting with +% `|\|') providing indexing has been turned on with "\PageIndex" +% or "\CodelineIndex". With the default definitions of +% |\SpecialMainIndex|, etc., the index file generated is +% intended to be processed by Chen's \textsf{makeindex} program +% \cite{art:Chen}. +% +% +% Of course, in {\em this\/} package file itself we've sometimes had to +% make \verb+|+ take the r\^ole of \TeX's escape character to +% introduce command names at places where |\| has to belong to +% some other category. Therefore, we may also need to recognize +% \verb+|+ as the introducer for a command when setting the text +% inside the \textsf{macrocode} environment. Other users may have the +% need to make similar reassignments for their macros. +% +% +% \begin{macro}{\SpecialEscapechar}\label{sect:specialescapechar} +% \begin{macro}{\active@escape@char} +% \begin{macro}{\special@escape@char} +% The macro |\SpecialEscapechar| is used to denote a special escape +% character for the next \textsf{macrocode} environment. It has one +% argument---the new escape character given as a `single-letter' +% control sequence. Its main purpose is defining +% |\special@escape@char| to produce the chosen escape character +% |\catcode|$\,$d to 12 and |\active@escape@char| to produce the +% same character but with |\catcode| 13. +% +% The macro |\special@escape@char| is used to {\em print\/} +% the escape character while |\active@escape@char| is needed +% in the definition of |\init@crossref| to start the scanning +% mechanism. +% +% In the definition of |\SpecialEscapechar| we need an +% arbitrary character with |\catcode| 13. We use `\~{}' and +% ensure that it is active. The |\begingroup| is used to make +% a possible change local to the expansion of +% |\SpecialEscapechar|. +% \changes{v1.7g}{1992/06/19}{Making tilde active moved outside +% definition} +% \begin{macrocode} +\begingroup +\catcode`\~\active +\gdef\SpecialEscapechar#1{% + \begingroup +% \end{macrocode} +% Now we are ready for the definition of +% |\active@escape@char|. It's a little tricky: we first +% define locally the uppercase code of `\~{}' to be the new escape +% character. +% \begin{macrocode} + \uccode`\~`#1% +% \end{macrocode} +% Around the definition of |\active@escape@char| we place an +% |\uppercase| command. Recall that the expansion of +% |\uppercase| changes characters according to their +% |\uccode|, but leaves their |\catcode|$\,$s untouched +% (cf.\ \TeX{}book page 41). +% \begin{macrocode} + \uppercase{\gdef\active@escape@char{~}}% +% \end{macrocode} +% The definition of |\special@escape@char| is easier, we use +% |\string| to |\catcode| the argument of +% |\SpecialEscapechar| to 12 and suppress the preceding +% |\escapechar|. +% \begin{macrocode} + \escapechar\m@ne \xdef\special@escape@char{\string#1}% +% \end{macrocode} +% Now we close the group and end the definition: the value of +% |\escapechar| as well as the |\uccode| and +% |\catcode| of `\~{}' will be restored. +% \begin{macrocode} + \endgroup} +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% +% \begin{macro}{\init@crossref} +% The replacement text of |\init@crossref| should fulfill the +% following tasks: +% \begin{itemize} +% \parindent4em +% \item[1)] +% |\catcode| all characters used in macro names to +% 11 (i.e.\ `letter'). +% \item[2)] +% |\catcode| the `|\|' character to 13 +% (i.e.\ `active'). +% \item[3a)] +% |\let| the `|\|' equal |\scan@macro| +% (i.e.\ start the macro scanning mechanism) if there is +% no special escape character (i.e.\ the +% |\special@escape@char| is `|\|'). +% \item[3b)] +% Otherwise |\let| it equal |\bslash|, i.e.\ +% produce a printable |\|. +% \item[4)] +% Make the \meta{special escape character} active. +% \item[5)] +% |\let| the active version of the special escape +% character +% (i.e.\ the expansion of |\active@escape@char|) equal +% |\scan@macro|. +% \end{itemize} +% The reader might ask why we bother to |\catcode| the +% `|\|' first to 12 (at the end of |\macro@code|) then +% re-|\catcode| it to 13 in order to produce a $|\|_{12}$ +% in case 3b) above. This is done because we have to ensure that +% `|\|' has |\catcode| 13 within the \textsf{macrocode} +% environment. Otherwise the delimiter for the argument of +% |\xmacro@code| would not be found (parameter matching +% depends on |\catcode|$\,$s). +% +% Therefore we first re-|\catcode| some characters. +% \begin{macrocode} +\begingroup \catcode`\|=\z@ \catcode`\\=\active +% \end{macrocode} +% We carry out tasks 2) and 3b) first. +% \SpecialEscapechar{\|} +% \begin{macrocode} +|gdef|init@crossref{|catcode`|\|active |let\|bslash +% \end{macrocode} +% Because of the popularity of the `|@|' character as a +% `letter' in macros, we normally have to change its +% |\catcode| here, and thus fulfill task 1). But the macro +% designer might use other characters as private letters as well, +% so we use a macro to do the |\catcode| switching. +% \SpecialEscapechar\| +% \begin{macrocode} + |MakePrivateLetters +% \end{macrocode} +% Now we |\catcode| the special escape character to 13 and +% |\let| it equal |\scan@macro|, i.e.\ fulfill tasks 4) +% and 5). Note the use of |\expandafter| to insert the chosen +% escape character saved in |\special@escape@char| and +% |\active@escape@char|. +% \SpecialEscapechar\| +% \begin{macrocode} + |catcode|expandafter`|special@escape@char|active + |expandafter|let|active@escape@char|scan@macro} +|endgroup +% \end{macrocode} +% If there is no special escape character, i.e.\ if +% |\SpecialEscapechar| is |\\|, the second last line will +% overwrite the previous definition of $|\|_{13}$. In this +% way all tasks are fulfilled. +% +% For happy documenting we give default values to +% |\special@escape@char| and |\active@escape@char| with +% the following line: +% \begin{macrocode} +\SpecialEscapechar{\\} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\MakePrivateLetters} +% Here is the default definition of this command, which makes just +% the |@| into a letter. The user may change it if he/she +% needs more or other characters masquerading as letters. +% \begin{macrocode} +\@ifundefined{MakePrivateLetters} + {\let\MakePrivateLetters\makeatletter}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\close@crossref} +% At the end of a cross-referencing part we prepare ourselves for +% the next one by setting the escape character to `|\|'. +% \begin{macrocode} +\def\close@crossref{\SpecialEscapechar\\} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \subsection{Macros for scanning macro names} +% +% \begin{macro}{\scan@macro} +% \changes{v1.5k}{1989/09/04}{Support for checksum added.} +% \begin{macro}{\macro@namepart} +% The |\init@crossref| will have made |\active| our +% |\special@escape@char|, so that each +% |\active@escape@char| will invoke |\scan@macro| when +% within the \textsf{macrocode} environment. By this means, we can +% automatically add index entries for every \TeX-like command which +% is met whilst setting (in verbatim) the contents of +% \textsf{macrocode} environments. +% \begin{macrocode} +\def\scan@macro{% +% \end{macrocode} +% First we output the character which triggered this macro. Its +% version |\catcode|$\,$d to 12 is saved in +% |\special@escape@char|. We also call |\step@checksum| +% to generate later on a proper check-sum (see section +% \ref{sec:checksum} for details). +% \begin{macrocode} + \special@escape@char + \step@checksum +% \end{macrocode} +% If the \textsf{macrocode} environment contains, for example, the +% command |\\|, the second |\| should not start the +% scanning mechanism. Therefore we use a switch to decide if +% scanning of macro names is allowed. +% \begin{macrocode} + \ifscan@allowed +% \end{macrocode} +% The macro assembles the letters forming a \TeX\ command in +% |\macro@namepart| so this is initially cleared; we then set +% |\next| to the \textit{first\/} character following the +% |\| and call |\macro@switch| to determine whether that +% character is a letter or not. +% \begin{macrocode} + \let\macro@namepart\@empty + \def\next{\futurelet\next\macro@switch}% +% \end{macrocode} +% As you recognize, we actually did something else, because we have +% to defer the |\futurelet| call until after the final +% |\fi|. If, on the other hand, the scanning is disabled we +% simply |\let| |\next| equal `empty'. +% \begin{macrocode} + \else \let\next\@empty \fi +% \end{macrocode} +% Now we invoke |\next| to carry out what's needed. +% \begin{macrocode} + \next} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ifscan@allowed} +% \begin{macro}{\scan@allowedtrue} +% \begin{macro}{\scan@allowedfalse} +% |\ifscan@allowed| is the switch used above to determine if +% the |\active@escape@char|\SpecialIndex{\active@escape@char} +% should start the macro scanning mechanism. +% \begin{macrocode} +\newif\ifscan@allowed \scan@allowedtrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\EnableCrossrefs} +% \begin{macro}{\DisableCrossrefs} +% At this point we might define two macros which allow the user to +% disable or enable the cross-referencing mechanism. Processing of +% files will be faster if only main index entries are generated +% (i.e., if |\DisableCrossrefs| is in force). +% \begin{macrocode} +\def\DisableCrossrefs{\@bsphack\scan@allowedfalse\@esphack} +% \end{macrocode} +% The macro |\EnableCrossrefs| will also disable any +% |\DisableCrossrefs| command encountered afterwards. +% \begin{macrocode} +\def\EnableCrossrefs{\@bsphack\scan@allowedtrue + \def\DisableCrossrefs{\@bsphack\@esphack}\@esphack} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% \begin{macro}{\macro@switch} +% Now that we have the character which follows the escape character +% (in |\next|), we can determine whether it's a `letter' +% (which probably includes |@|). +% +% If it is, we let |\next| invoke a macro which assembles the +% full command name. +% \begin{macrocode} +\def\macro@switch{\ifcat\noexpand\next a% + \let\next\macro@name +% \end{macrocode} +% Otherwise, we have a `single-character' command name. For all +% those single-character names, we use |\short@macro| to +% process them into suitable index entries. +% \begin{macrocode} + \else \let\next\short@macro \fi +% \end{macrocode} +% Now that we know what macro to use to process the macro name, we +% invoke it~\ldots +% \begin{macrocode} + \next} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\short@macro} +% \changes{v1.5c}{1989/04/27}{Corrected bad bug by putting the +% scan@allowedfalse macro before printing +% the argument.} +% \changes{v1.7a}{1992/03/10}{Ensure character stored in +% \cs{macro@namepart} as `letter' so index exclusion works.} +% This macro will be invoked (with a single character as parameter) +% when a single-character macro name has been spotted whilst +% scanning within the \textsf{macrocode} environment. +% +% First we take a look at the |\index@excludelist| to see +% whether this macro name should produce an index entry. This is +% done by the |\ifnot@excluded| macro which assumes that the +% macro name is saved in |\macro@namepart|. The character +% mustn't be stored with a special category code or exclusion from +% the index won't work, so we employ the case-changing trick used +% elsewhere. Since the argument might be an active character, +% |\string| is used to normalize it. +% \changes{v2.0e}{1998/12/28}{Correctly use the case-changing trick.} +% \begin{macrocode} +\begingroup +\catcode`\&=12 +\gdef\short@macro#1{\begingroup + \uccode`\&=\expandafter`\string#1% + \uppercase{\def\x{\def\macro@namepart{&}}}% + \expandafter\endgroup\x + \ifnot@excluded +% \end{macrocode} +% If necessary the index entry is produced by the macro +% |\produce@index|. Depending on the actual character seen, +% this macro has to do different things, so we pass the character +% as an argument. +% \begin{macrocode} + \produce@index{#1}\fi +% \end{macrocode} +% Then we disable the cross-referencing mechanism with +% |\scan@allowedfalse| and print the actual character. The +% index entry was generated first to ensure that no page break +% intervenes (recall that a |^^M| will start a new line). +% \begin{macrocode} + \scan@allowedfalse#1% +% \end{macrocode} +% After typesetting the character we can safely enable the +% cross-referencing feature again. Note that this macro won't be +% called (since |\macro@switch| won't be called) if +% cross-referencing is globally disabled. +% \begin{macrocode} + \scan@allowedtrue } +\endgroup +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\produce@index} +% \changes{v1.4s}{1989/04/23}{Added noexpand to all +% \cs{if} tests +% to avoid garbage produced by new active chars} +% \changes{v1.4s}{1989/04/23}{Used \texttt{\protect\bslash string} for +% the same reason.} +% \changes{v1.5c}{1989/04/27}{Corrected bad bug by placing the +% scan@allowedfalse macro into short@macro} +% This macro is supposed to generate a suitable |\SortIndex| +% command for a given single-letter control sequence. We test +% first for the cases which involve active characters (i.e.\ the +% backslash, the special escape character (if any), the space and +% the |^^M|). Using the |\if| test (testing for +% character codes), we have to ensure that the argument isn't +% expanded. +% \begin{macrocode} +\def\produce@index#1{% + \if\noexpand#1\special@escape@char +% \end{macrocode} +% If the character is the special escape character (or the +% `|\|' in case there was none) the |\it@is@a| macro is +% used to produce the actual |\SortIndex| call. +% \begin{macrocode} + \scan@allowedfalse \it@is@a\special@escape@char \else +% \end{macrocode} +% Next comes the test for a `|\|' which must be the +% $|\|_{13}$ expanding to |\bslash|. +% \begin{macrocode} + \if\noexpand#1\bslash \it@is@a\bslash \else +% \end{macrocode} +% Another possibility is \verb*+ +$_{13}$. Recall that |\space| +% produces a \verb*+ +$_{10}$. +% \begin{macrocode} + \if\noexpand#1\space \it@is@a\space \else +% \end{macrocode} +% The last\footnote{Well, it isn't the last active character after +% all. I added \texttt{\bslash @noligs} some days ago and now +% \texttt{`} too is active. So we have to make sure that such +% characters don't get expanded in the index.} possibility of an +% active character is |^^M|\@. In this case we don't test for +% character codes, since it is easier to look if the character is +% equal to |\par|. (We are inside the \textsf{macrocode} +% environment.) +% \begin{macrocode} + \ifx#1\par +% \end{macrocode} +% If we end up here we have just scanned a |\^^M| or something +% similar. Since this will be treated like \verb*+\ + by \TeX{} we +% produce a corresponding index entry. +% \begin{macrocode} + \it@is@a\space \else +% \end{macrocode} +% If it is the token |\relax| we do nothing. This can't happen +% when the `doc' package is used in the way described here, but was +% added to allow extensions like the \texttt{idxverb} option. +% \changes{v1.5t}{1989/11/14}{Added \cs{relax} as a possible token to +% allow extensions.} +% \begin{macrocode} + \ifx#1\relax \else +% \end{macrocode} +% The next three branches are needed because of bugs in +% our \textsf{makeindex} program. You can't produce unbalanced index +% entries\footnote{This is possible for \TeX{} if you use +% \texttt{\string{$_{12}$ \rmfamily or +% \ttfamily\string}$_{12}$}, +% but \textsf{makeindex} will complain.} +% and you have to double a percent character. To get around these +% restrictions we use special macros to produce the |\index| +% calls.\footnote{Brian \textsc{Hamilton Kelly} has written fixes for +% all three +% bugs. When they've found their way through all +% installations, +% the lines above will be removed. See +% page~\pageref{bug:fixes} if you already have them. +% (I'm not sure which versions incorporate these, but +% 2.11 is OK. See also +% \pageref{makeindex:version}.)} +% \begin{macrocode} + \if\noexpand#1\bgroup \LeftBraceIndex \else + \if\noexpand#1\egroup \RightBraceIndex \else + \if\noexpand#1\percentchar \PercentIndex \else +% \end{macrocode} +% All remaining characters are used directly to produce their index +% entries. This is possible even for the characters which have +% special meanings in the index program, provided we quote the +% characters. (This is correctly done in |\it@is@a|.) +% \begin{macrocode} + \it@is@a{\string#1}% +% \end{macrocode} +% We now need a whole pile of |\fi|$\,$s to match up with +% the |\if|$\,$s. +% \begin{macrocode} + \fi \fi \fi \fi \fi \fi \fi \fi} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\macro@name} +% We now come to the macro which assembles command names which +% consist of one or more `letters' (which might well include +% |@| symbols, or anything else which has a |\catcode| of +% 11). +% +% To do this we add the `letter' to the existing definition of +% |\macro@namepart| (which you will recall was originally set +% to |\@empty|). +% \begin{macrocode} +\def\macro@name#1{\edef\macro@namepart{\macro@namepart#1}% +% \end{macrocode} +% Then we grab hold of the {\em next\/} single character and let +% |\more@macroname| determine whether it belongs to the letter +% string forming the command name or is a `non-letter'. +% \begin{macrocode} + \futurelet\next\more@macroname} +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \begin{macro}{\more@macroname} +% +% This causes another call of |\macro@name| to add in the next +% character, if it is indeed a `letter'. +% \begin{macrocode} +\def\more@macroname{\ifcat\noexpand\next a% + \let\next\macro@name +% \end{macrocode} +% Otherwise, it finishes off the index entry by invoking +% |\macro@finish|. +% \begin{macrocode} + \else \let\next\macro@finish \fi +% \end{macrocode} +% Here's where we invoke whatever macro was |\let| equal to +% |\next|. +% \begin{macrocode} + \next} +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \begin{macro}{\macro@finish} +% When we've assembled the full `letter'-string which forms the +% command name, we set the characters forming the entire command +% name, and generate an appropriate |\index| command (provided +% the command name is not on the list of exclusions). The +% `|\|' is already typeset; therefore we only have to output +% all `letters' saved in |\macro@namepart|. +% \begin{macrocode} +\def\macro@finish{% + \macro@namepart +% \end{macrocode} +% Then we call |\ifnot@excluded| to decide whether we have to +% produce an index entry. The construction with |\@tempa| is +% needed because we want the expansion of |\macro@namepart| in +% the |\index| command.\footnote{The \texttt{\bslash index} +% command will expand its argument in the \texttt{\bslash output} +% routine. At this time \texttt{\bslash macro@namepart} might have a +% new value.} +% \begin{macrocode} + \ifnot@excluded + \edef\@tempa{\noexpand\SpecialIndex{\bslash\macro@namepart}}% + \@tempa \fi} +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \subsection[The index exclude list]{The index exclude +% list\footnotemark} +% \footnotetext{Warning: the incomplete commentary on +% \texttt{\bslash DoNotIndex} and the macros it calls +% was written by Dave Love.} +% +% The internal form of the index exclude list is +% \begin{quote} +% \meta{macro name}|,|\meta{macro name}|,| +% \ldots|,| +% \end{quote} +% where \meta{macro name} is a macro name like +% $"\"_{12}"p"{_{11}}"@"_{11}$ or $"\"_{12}"$"_{11}$. Note that the "\" +% has category `other' and the other characters in the name are all +% `letter', regardless of their normal category. +% +% \begin{macro}{\DoNotIndex} +% This macro is used to suppress macro names in the index. It +% starts off with a new group because we have to change the +% |\catcode|$\,$s of all characters which belong to `letters' +% while macros are defined. +% \begin{macrocode} +\def\DoNotIndex{\begingroup \MakePrivateLetters + \catcode`\\12 +% \end{macrocode} +% Then we call the macro which actually reads the argument given by +% the user. +% \begin{macrocode} + \do@not@index} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\do@not@index} +% We make the |\do@not@index| macro |\long| +% since the user might want to exclude the |\par| +% macro. +% \begin{macrocode} +\long\def\do@not@index#1{% +% \end{macrocode} +% It just adds to a token list after finishing the group in which +% the catcodes were changed. +% \changes{v1.7a}{1992/02/26}{Replaced with newdoc version.} +% \begin{macrocode} + \endgroup + \addto@hook\index@excludelist{#1,}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addto@hook} +% The code for adding tokens (the second argument) to a token list +% (the first argument) is taken from~\cite{art:verbatim}, but it needs +% to be "\long" in case "\par" is amongst the tokens. +% \begin{macrocode} +\long\def\addto@hook#1#2{#1\expandafter{\the#1#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\index@excludelist} +% We need an initially-empty register for the excluded list. +% \begin{macrocode} +\newtoks\index@excludelist +\index@excludelist{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifnot@excluded} +% \changes{v1.7a}{1992/02/26}{Replaced with newdoc version.} +% \begin{macro}{\expanded@notin} +% Now we take a look at the |\index@excludelist| to see +% whether a macro name saved in |\macro@namepart| should +% produce an index entry. This macro is a pseudo |\if|; it +% should expand to |\iftrue| or |\iffalse| depending on +% the contents of |\index@excludelist|. +% \begin{macrocode} +\begingroup +% \end{macrocode} +% First we change "\catcode"s so that "\" is `other' and "|" a +% temporary for the escape character. This is necessary since our +% macro names are stored that way in the "\index@excludelist". +% \begin{macrocode} +\catcode`\|=0% +\catcode`\\=12 +% \end{macrocode} +% Then we define "\ifnot@excluded" to call "\expanded@notin" with +% two arguments: the first is the string "\" followed by the +% contents of "\macro@namepart" followed by a "," and the second is +% "\the" followed by "\index@excludelist". To achieve the expansion +% of "\macro@namepart", i.e.\ to pass its contents, we need a +% suitable number of "\expandafter"s. +% \SpecialEscapechar{\|} +% \begin{macrocode} +|gdef|ifnot@excluded{|expandafter + |expanded@notin|expandafter{|expandafter + \|macro@namepart,}{|the|index@excludelist}} +|endgroup +% \end{macrocode} +% The macro "\expanded@notin" now does the dirty work. It first +% defines a macro "\in@@" with a very special parameter text. If +% you look closely "\in@@" has three arguments, the first one is +% delimited by the first argument of "\expanded@notin" (i.e.\ by +% the string starting with a "\" and ending with a "," above), the +% second is undelimited (which means that it will get the next +% token after our string, and the third is delimited again and will +% get the rest up to the token "\in@@". In other words the token +% "\in@@" is also used as a delimiter. +% \begin{macrocode} +\def\expanded@notin#1#2{% + \def\in@@##1#1##2##3\in@@{% +% \end{macrocode} +% Now the replacement text simply compares the second argument +% (i.e.\ the undelimited one after our string) to the token +% "\expanded@notin". This is an unclosed "\ifx" statement which +% means that this macro behaves similar to a normal \TeX{} +% conditional. +% \begin{macrocode} + \ifx\expanded@notin##2}% +% \end{macrocode} +% After all these preparations we call "\in@@". First we expand the +% token after "\in@@" (which is "\the" from the second argument to +% "\expanded@notin"). As a result we get the contents of the +% "\index@excludelist" inserted after "\in@@". After this contents +% we add once more the string we are looking for, then the token +% "\expanded@notin" and finally the token "\in@@". +% \begin{macrocode} + \expandafter\in@@#2#1\expanded@notin\in@@} +% \end{macrocode} +% Now what happens when the macro "\in@@" above gets called? The +% first argument to "\in@@" is delimited by our string. In other +% words it will get everything from the contents of +% "\index@excludelist" before this string. If the string is not in +% "\index@excludelist" then it gets the whole contents, since after +% it we had inserted the string one more. In this case the next +% token is "\expanded@notin" which gets assigned to the second +% argument and the third argument will be empty. If, on the other +% hand, the string was inside "\index@excludelist" then the second +% argument will not be the token "\expanded@notin" and the third +% argument will be all the garbage up to "\in@@". Therefore testing +% the seconded argument, as done in the definition of "\in@@" will +% tell us whether or not the string is in "\index@includelist" and +% this was exactly what we wanted. (Deep breath.) You got +% that?\footnote{\TeX{}book page 125. The code described above is +% originally due to Michael Spivak who used a similar method within +% the \AmSTeX{} macros.} +% \end{macro} +% \end{macro} +% +% +% +% +% +% +% +% \subsection{Macros for generating index entries} +% +% Here we provide default definitions for the macros invoked to create +% index entries; these are either invoked explicitly, or automatically +% by |\scan@macro|. As already mentioned, the definitions given +% here presuppose that the |.idx| file will be processed by +% Chen's \textsf{makeindex} program --- they may be redefined for use +% with the user's favourite such program. +% +% To assist the reader in locating items in the index, all such +% entries are sorted alphabetically {\em ignoring\/} the initial +% `|\|'; this is achieved by issuing an |\index| command which +% contains the `actual' operator for \textsf{makeindex}. The default +% value for the latter operator is `|@|', but the latter character is +% so popular in \LaTeX\ package files that it is necessary to substitute +% another character. This is indicated to \textsf{makeindex} by means +% of an `index style file'; the character selected for this function +% is |=|, and therefore this character too must be specially treated +% when it is met in a \TeX\ command. A suitable index style file is +% provided amongst the supporting files for this style file in +% \texttt{gind.ist} and is generated from this source by processing +% with \texttt{docstrip} to extract the module \textbf{gind}. A +% similar style file \texttt{gglo.ist} is supplied for sorting the +% change information in the glossary file and is extracted as module +% \textbf{gglo}. First of all we add some information to the front of +% the \texttt{.ist} files. \changes{v1.7a}{1992/03/11}{glo.ist and +% gind.ist now derivable from doc.dtx with docstrip.} +% \begin{macrocode} +%</package> +%<+gind|gglo>%% This is a MAKEINDEX style file which should be used to +%<+gind>%% generate the formatted index for use with the doc +%<+gglo>%% generate the formatted change history for use with the doc +%<+gind|gglo>%% package. The TeX commands used below are defined in +%<+gind|gglo>%% doc.sty. The commands for MAKEINDEX like `level' +%<+gind|gglo>%% `item_x1' are described in `` Makeindex, A General +%<+gind|gglo>%% Purpose, Formatter-Independent Index Processor'' by +%<+gind|gglo>%% Pehong Chen. +%<+gind|gglo> +% \end{macrocode} +% +% \begin{macro}{\actualchar} +% \begin{macro}{\quotechar} +% \begin{macro}{\levelchar} +% First come the definitions of |\actualchar|, +% |\quotechar| and |\levelchar|. Note, that our defaults +% are not the ones used by the \textsf{makeindex} program without a +% style file. +% \begin{macrocode} +%<*package> +\@ifundefined{actualchar}{\def\actualchar{=}}{} +\@ifundefined{quotechar}{\def\quotechar{!}}{} +\@ifundefined{levelchar}{\def\levelchar{>}}{} +%</package> +%<+gind|gglo>actual '=' +%<+gind|gglo>quote '!' +%<+gind|gglo>level '>' +%<*package> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\encapchar} +% The \textsf{makeindex} default for the |\encapchar| isn't +% changed. +% \begin{macrocode} +\@ifundefined{encapchar}{\def\encapchar{|}}{} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\verbatimchar} +% We also need a special character to be used as a delimiter for +% the |\verb*| command used in the definitions below. +% \begin{macrocode} +\@ifundefined{verbatimchar}{\def\verbatimchar{+}}{} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\SpecialIndex} +% The |\SpecialIndex| command creates index entries for +% macros. If the argument is |\|$xyz$, the command produces +% \verb|\indexentry{|$xyz$\verb|=\verb!*+\|$xyz$\verb|+}{|$n$\verb|}| +% given the above defined defaults for |\actualchar|, +% |\quotechar| and |\verbatimchar|. We first remove the +% initial `|\|' to get a better index. +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \begin{macrocode} +\def\SpecialIndex#1{\@bsphack\special@index{\expandafter\@gobble + \string#1\actualchar +% \end{macrocode} +% Then follows the actual entry. A |\quotechar| is placed +% before the |*| to allow its use as a special \textsf{makeindex} +% character. Again |\@bsphack| and |\@esphack| are used +% to make the macros invisible. +% \begin{macrocode} + \string\verb\quotechar*\verbatimchar\string#1\verbatimchar}% + \@esphack} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\SpecialMainIndex} +% \begin{macro}{\SpecialMainEnvIndex} +% \begin{macro}{\SpecialUsageIndex} +% The |\SpecialMainIndex| macro is used to cross-reference the +% names introduced by the \textsf{macro} environment. The action is +% as for |\SpecialIndex|, except that \textsf{makeindex} is +% instructed to `encap'sulate the entry with the string +% \verb=|main= to cause it to generate a call of the |\main| +% macro. +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \changes{v2.0c}{1998/08/22}{Correctly handle single character +% control sequences like \cs{<}.} +% +% |\SpecialMainIndex| passes the macro name to be indexed on to the +% macro |\SpecialIndex@|. +% \begin{macrocode} +\def\SpecialMainIndex#1{\@bsphack\SpecialIndex@{#1}{\encapchar main}% + \@esphack} +% \end{macrocode} +% +% \begin{macro}{\SpecialIndex@} +% \changes{v2.0c}{1998/08/22}{Macro added.} +% \changes{v2.0f}{1999/02/27}{Temp fix to allow strange code in arg 1 +% (PR 2968)} +% The macro |\SpecialIndex@| does the real work for |\SpecialMainIndex| +% and |\SpecialUsageIndex|. It takes two arguments: the macro to be +% indexed (as a control sequence or list of character tokens) and the +% additional text for the index. +% \changes{v2.0g}{1999/03/22}{Correct so-called temp fix. I'm not going to +% explain this.} +% \begin{macrocode} +\begingroup + \catcode`\|=0 + \catcode`\\=12 + |gdef|@SpecialIndexHelper@#1#2|@nil{% + |if |noexpand#1\% + |gdef|@gtempa{#2}% + |else + |begingroup + |escapechar|m@ne + |expandafter|gdef|expandafter|@gtempa|expandafter{|string#1#2}% + |endgroup + |fi} +|endgroup +\def\SpecialIndex@#1#2{% +% \end{macrocode} +% The first thing it does is to convert the macro into a list of +% characters. Note that a character token list remains (mostly) unchanged. +% \begin{macrocode} + \@SpecialIndexHelper@#1\@nil +% \end{macrocode} +% The macro name \verb*|\ | has to handled in a special way. The reason +% is that the space token is skipped when \TeX\ is scanning macro +% parameters, so that the trick used below will not work. +% So, we check whether the replacement text of |\@tempa| starts with +% a space token and write the appropriate index entry. +% \begin{macrocode} + \def\@tempb{ }% + \ifcat \@tempb\@gtempa + \special@index{\quotechar\space\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar\bslash\quotechar\space\verbatimchar#2}% + \else +% \end{macrocode} +% Having handled this special case we have to distinguish control +% sequences consisting of one or more +% letters and those that consists of exactly one nonletter. As character +% tokens in the replacement text of the macro |\@gtempa| have all +% category code $12$ (other), this is difficult. For simplicity, we treat +% all single character control sequences alike, irregardless of whether +% the character is a letter or not. This has the advantage that it works +% even for strange settings of the category codes. +% +% We define a utility macro |\@tempb| with two arguments, the second +% delimited by |\relax|. +% It will be called later so that the first argument is the first character +% of the macro name, and the second argument receives the rest of the +% characters. So we distinguish the two cases above by checking whether +% the second argument is empty. +% \begin{macrocode} + \def\@tempb##1##2\relax{\ifx\relax##2\relax +% \end{macrocode} +% If so, we define the helper macro |\@tempc| in a way that it +% adds quotechars in critical places. +% \begin{macrocode} + \def\@tempc{\special@index{\quotechar##1\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar\bslash\quotechar##1\verbatimchar#2}}% +% \end{macrocode} +% Otherwise we write the characters as in |\SpecialIndex|. +% \begin{macrocode} + \else + \def\@tempc{\special@index{##1##2\actualchar + \string\verb\quotechar*\verbatimchar + \bslash##1##2\verbatimchar#2}}% + \fi}% +% \end{macrocode} +% Now pass the list of characters to \@tempb and call \@tempc to do the +% work. +% \begin{macrocode} + \expandafter\@tempb\@gtempa\relax + \@tempc + \fi} +% \end{macrocode} +% \end{macro} +% +% Slightly simpler is the main entry for environments +% \changes{v1.9e}{1994/02/03}{use \cs{ttfamily} with \cs{string}} +% \changes{v1.9f}{1994/02/07}{should have used \cs{noexpand}, sigh} +% \changes{v1.9i}{1994/02/11}{should have used \cs{protect}} +% \changes{v1.9j}{1994/02/16}{Back to string:-)} +% \changes{v1.9s}{1994/10/14}{Added missing percent and changed to +% \cs{ttfamily}} +% \changes{v2.0d}{1998/12/20}{Correctly handle second index entry +% by using \cs{special@index} not \cs{index} (PR/2928).} +% \changes{v2.0e}{1998/12/28}{Use \cs{string}, not \cs{protect} in argument to +% \cs{special@index}.} +% \changes{v2.1c}{2004/07/23}{environment names incorrectly sorted in +% index (pr/3615)} +% \begin{macrocode} +\def\SpecialMainEnvIndex#1{\@bsphack\special@index{% + #1\actualchar + {\string\ttfamily\space#1} + (environment)% + \encapchar main}% + \special@index{environments:\levelchar#1\actualchar{% + \string\ttfamily\space#1}\encapchar + main}\@esphack} +% \end{macrocode} +% The |\SpecialUsageIndex| is similar to |\SpecialMainIndex|, except +% that it uses the standard |\index| command. +% \texttt{usage} instead of \texttt{main}. +% \begin{macrocode} +\def\SpecialUsageIndex#1{\@bsphack + {\let\special@index\index\SpecialIndex@{#1}{\encapchar usage}}% + \@esphack} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% +% \begin{macro}{\SpecialEnvIndex} +% Indexing environments is done a little bit differently; we produce +% two index entries with the |\SpecialEnvIndex| macro: +% \changes{v1.9e}{1994/02/03}{The index needs protecting} +% \changes{v1.9g}{1994/02/08}{should have used \cs{noexpand}, sigh} +% \changes{v1.9i}{1994/02/11}{should have used \cs{protect}} +% \begin{macrocode} +\def\SpecialEnvIndex#1{\@bsphack +% \end{macrocode} +% First we sort the environment under its own name stating in the +% actual entry that this is an environment. +% \begin{macrocode} + \index{#1\actualchar{\protect\ttfamily#1} + (environment)\encapchar usage}% +% \end{macrocode} +% The second entry is sorted as a subitem under the key +% `environments:'. +% \changes{v2.1b}{2004/02/09}{environment names incorrectly sorted in +% index (pr/3615)} +% \begin{macrocode} + \index{environments:\levelchar#1\actualchar + {\protect\ttfamily#1}\encapchar usage}\@esphack} +% \end{macrocode} +% Because both entries correspond to `descriptions' of the +% environment, we encapsulate the page numbers with the +% |\usage| macro. +% \end{macro} +% +% +% +% \begin{macro}{\SortIndex} +% This macro is used to generate the index entries for any +% single-character command that |\scan@macro| encounters. The +% first parameter specifies the lexical order for the character, +% whilst the second gives the actual characters to be printed in +% the entry. It can also be used directly to generate index entries +% which differ in sort key and actual entry. +% \begin{macrocode} +\def\SortIndex#1#2{\index{#1\actualchar#2}} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\it@is@a} +% This macro is supposed to produce a correct |\SortIndex| +% entry for a given character. Since this character might be +% recognised as a `command' character by the index program used, +% all characters are quoted with the |\quotechar|. +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \begin{macrocode} +\def\it@is@a#1{\special@index{\quotechar #1\actualchar + \string\verb\quotechar*\verbatimchar + \quotechar\bslash\quotechar#1\verbatimchar}} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\LeftBraceIndex} +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \begin{macro}{\RightBraceIndex} +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} These +% two macros fix the problems with \textsf{makeindex}. Note the +% `hack' with |\iffalse}\fi| to satisfy both \TeX{} and the +% \textsf{makeindex} program. When this is written to the +% \texttt{.idx} file \TeX{} will see both braces (so we get a +% balanced text). \textsf{makeindex} will also see balanced braces +% but when the actual index entry is again processed by \TeX{} the +% brace in between |\iffalse| |\fi| will vanish. +% \begin{macrocode} +\@ifundefined{LeftBraceIndex}{\def\LeftBraceIndex{% + \special@index{\bgroup\actualchar\string\verb\quotechar*\verbatimchar + \quotechar\bslash{\verbatimchar\string\iffalse}\string\fi}}}{} + +\@ifundefined{RightBraceIndex}{\def\RightBraceIndex{% + \special@index{\egroup\actualchar\string\iffalse{\string\fi\string\verb + \quotechar*\verbatimchar\quotechar\bslash}\verbatimchar}}}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\PercentIndex} +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \changes{v1.7c}{1992/03/25}{Default now for bug-fixed makeindex} +% By default we assume a version of \textsf{makeindex} without the +% percent bug is being used. +% \begin{macrocode} +\@ifundefined{PercentIndex} + {\def\PercentIndex{\it@is@a\percentchar}}{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\OldMakeindex} +% \changes{v1.7c}{1992/03/26}{Replaced \cs{NewMakeIndex}.} +% \begin{macro}{\percentchar} +% Here is one solution for the percent bug in \textsf{makeindex}. +% The macro |\percentchar| denotes a |%|$_{12}$. Calling this from +% a package or the driver file sets things up +% appropriately.\label{bug:fixes} +% \begin{macrocode} +\def\OldMakeindex{\def\PercentIndex{% + \special@index{\quotechar\percentchar\actualchar\string\verb + \quotechar*\verbatimchar\quotechar\bslash + \percentchar\percentchar\verbatimchar}}} +{\catcode`\%=12 \gdef\percentchar{%}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% +% +% \subsection{Redefining the \textsf{index} environment} +% +%\changes{v1.4r}{1989/04/22}{twocols env. placed into separate file} +%\changes{v1.4?}{1989/04/19}{use DEK's algorithm and implement +% a twocols env.} +%\changes{v1.4?}{1989/04/16}{changes to the index env.} +%\changes{v1.5a}{1989/04/26}{Now input multicol.sty instead of +% multcols.sty} +% \begin{macro}{\ifhave@multicol} +% \changes{v1.7a}{1992/03/04}{Added to support avoiding multicol.sty} By +% default the index is set in three columns, and will start on the +% same page as, and underneath, the last part of the text of the +% documented package file, if possible. The last page will be +% reformatted with balanced columns. This requires the +% \textsf{multicols} environment which is described elsewhere. So +% that \DOC{} can be run independently of +% \texttt{multicol.sty} we first check for its existence and set +% the "have@multicol" flag appropriately for use below. +% \changes{v1.9a}{1993/12/02}{Use \cs{IfFileExists}} +% \changes{v1.9m}{1994/04/28}{Use \cs{RequirePackage} to load multicol} +% \begin{macrocode} +\newif\ifhave@multicol +% \end{macrocode} +% If we found \texttt{multicol.sty} we use it. It would be nice to +% delay this (and the re-definition of "theindex") until we knew +% whether an index was actually required \ldots +% \begin{macrocode} +\IfFileExists{multicol.sty}{\have@multicoltrue + \RequirePackage{multicol}% + }{} +% \end{macrocode} +% \end{macro} + +% +% \begin{macro}{\IndexMin} +% \begin{macro}{\c@IndexColumns} +% \changes{v1.4t}{1989/04/24}{Counter added.} +% If \texttt{multicol} is in use, +% when the index is started we compute the remaining space on the +% current page; if it is greater than |\IndexMin|, the first +% part of the index will then be placed in the available space. +% The number of columns set is controlled by the counter +% |\c@IndexColumns| which can be changed with a +% |\setcounter| declaration. +% \begin{macrocode} +\newdimen\IndexMin \IndexMin = 80pt +\newcount\c@IndexColumns \c@IndexColumns = 3 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{environment}{theindex} +% Now we start the multi-column mechanism, if appropriate. We use the +% \LaTeX{} counter |\c@IndexColumns| declared above to denote +% the number of columns and insert the `index prologue' text (which +% might contain a |\section| call, etc.). See the default +% definition for an example. +% \changes{v1.4t}{1989/04/24}{Incorporated new multicols env.} +% \changes{v1.5a}{1989/04/26}{Call multicols first} +% \changes{v1.6e}{1991/04/03}{Turned into env definition.} +% \changes{v1.7a}{1992/03/04}{Include test for multicols.} +% \begin{macrocode} +\ifhave@multicol + \renewenvironment{theindex} + {\begin{multicols}\c@IndexColumns[\index@prologue][\IndexMin]% +% \end{macrocode} +% Then we make a few last minute assignments to read the individual +% index |\item|$\,$s and finish off by ignoring any initial +% space. +% \begin{macrocode} + \IndexParms \let\item\@idxitem \ignorespaces}% +% \end{macrocode} +% +% \begin{macro}{\endtheindex} +% \changes{v1.4t}{1989/04/24}{Incorporated new multicols env.} +% At the end of the index, we have only to end the \textsf{multicols} +% environment. +% \begin{macrocode} + {\end{multicols}} +% \end{macrocode} +% If we can't use \textsf{multicols} we warn the user and use an +% environment that's basically the one from \texttt{article.sty}. +% \begin{macrocode} +\else + \typeout{Can't find multicol.sty -- will use normal index layout if + necessary.} + \def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi + \columnseprule \z@ \columnsep 35\p@ + \twocolumn[\index@prologue]% + \IndexParms \let\item\@idxitem \ignorespaces} + \def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi} +\fi +% \end{macrocode} +% \end{macro} +% \end{environment} +% +% Here are the necessary \textsf{makeindex} declarations. We disable +% scanning of macro names inside the index with "\scan@allowedfalse\n" +% to avoid recursion. +% \begin{macrocode} +%</package> +%<+gind>preamble +%<+gind>"\n \\begin{theindex} \n \\makeatletter\\scan@allowedfalse\n" +%<+gind>postamble +%<+gind>"\n\n \\end{theindex}\n" +%<*package> +% \end{macrocode} +% +% +% \begin{macro}{\IndexPrologue} +% \begin{macro}{\index@prologue} +% \changes{v1.9w}{1995/12/27}{Text changed} +% \changes{v1.9x}{1996/01/11}{Text depends on code lines used} +% The |\IndexPrologue| macro is used to place a short message +% into the document above the index. It is implemented by +% redefining |\index@prologue|, a macro which holds the +% default text. We'd better make it a |\long| macro to allow +% |\par| commands in its argument. +% \begin{macrocode} +\long\def\IndexPrologue#1{\@bsphack\def\index@prologue{#1}\@esphack} +% \end{macrocode} +% Now we test whether the default is already defined by another +% package file. If not we define it. +% \changes{v2.0j}{2000/05/22}{Less obscure wording? (CAR pr/3202)} +% \begin{macrocode} +\@ifundefined{index@prologue} + {\def\index@prologue{\section*{Index}% + \markboth{Index}{Index}% + Numbers written in italic refer to the page + where the corresponding entry is described; + numbers underlined refer to the + \ifcodeline@index + code line of the + \fi + definition; numbers in roman refer to the + \ifcodeline@index + code lines + \else + pages + \fi + where the entry is used. + }}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\IndexParms} +% These are some last-minute assignments for formatting the index +% entries. They are defined in a separate macro so that a user can +% substitute different definitions. We start by defining the +% various parameters controlling leading and the separation between +% the two columns. The entire index is set in |\small| size. +% \begin{macrocode} +\@ifundefined{IndexParms} + {\def\IndexParms{% + \parindent \z@ + \columnsep 15pt + \parskip 0pt plus 1pt + \rightskip 15pt + \mathsurround \z@ + \parfillskip=-15pt + \small +% \end{macrocode} +% \begin{macro}{\@idxitem} +% \begin{macro}{\subitem} +% \begin{macro}{\subsubitem} +% Index items are formatted with hanging indentation for any items +% which may require more than one line. +% \begin{macrocode} + \def\@idxitem{\par\hangindent 30pt}% +% \end{macrocode} +% Any sub-item in the index is formatted with a 15pt indentation +% under its main heading. +% \begin{macrocode} + \def\subitem{\@idxitem\hspace*{15pt}}% +% \end{macrocode} +% Whilst sub-sub-items go in a further 10pt. +% \begin{macrocode} + \def\subsubitem{\@idxitem\hspace*{25pt}}% +% \end{macrocode} +% \begin{macro}{\indexspace} +% The \textsf{makeindex} program generates an |\indexspace| +% before each new alphabetic section commences. After this final +% definition we end the |\@ifundefined| and the definition of +% |\IndexParms|. +% \begin{macrocode} + \def\indexspace{\par\vspace{10pt plus 2pt minus 3pt}}% + }}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\efill} +% This definition of |\efill| is intended to be used after index +% items which have no following text (for example, ``\textit{ +% see\/}'' entries). It just ensures that the current line is +% filled, preventing ``|Underfull \hbox|'' messages. +% \begin{macrocode} +\def\efill{\hfill\nopagebreak}% +%</package> +%<+gind|gglo>item_x1 "\\efill \n \\subitem " +%<+gglo>item_x2 "\\ " +%<+gind>item_x2 "\\efill \n \\subsubitem " +%<*package> +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\pfill} +% \begin{macro}{\dotfil} +% \begin{macro}{\dotfill} +% The following definitions provide the |\pfill| command; if +% this is specified in the index style file to \textsf{makeindex} as +% the delimiter to appear after index items, then the intervening +% space before the referenced page numbers will be filled with +% dots, with a little white space interpolated at each end of the +% dots. If the line is broken the dots will show up on both lines. +% \changes{v2.1i}{2018/09/25}{Guard against following \cs{unskip} (git/23)} +% \begin{macrocode} +\def\dotfill{\leaders\hbox to.6em{\hss .\hss}\hskip\z@ plus 1fill\kern\z@}% +\def\dotfil{\leaders\hbox to.6em{\hss .\hss}\hfil\kern\z@}% +\def\pfill{\unskip~\dotfill\penalty500\strut\nobreak + \dotfil~\ignorespaces}% +%</package> +%<+gind|gglo>delim_0 "\\pfill " +%<+gind|gglo>delim_1 "\\pfill " +%<+gind|gglo>delim_2 "\\pfill " +%<*package> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\*} +% Here is the definition for the |\*| macro. It isn't used in +% this set of macros. +% \begin{macrocode} +\def\*{\leavevmode\lower.8ex\hbox{$\,\widetilde{\ }\,$}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\main} +% The \textit{defining\/} entry for a macro name is flagged with +% the string \texttt{\encapchar main}\footnote{With the current +% definition of \texttt{\bslash encapchar} substituted for +% \texttt{\encapchar}} in the |\index| command; \textsf{makeindex} +% processes this so that the |\main| macro will be invoked to +% underline the page number(s) on which the {\em definition\/} of +% the macro will be found. +% \begin{macrocode} +\@ifundefined{main}{\def\main#1{\underline{#1}}}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\usage} +% The |\usage| macro is used to indicate entries describing +% the usage of a macro. The corresponding page number(s) will be +% set in \textit{italics}. +% \begin{macrocode} +\@ifundefined{usage}{\def\usage#1{\textit{#1}}}{} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\PrintIndex} +% \changes{v1.5k}{1989/09/04}{\cs{printindex} changed to +% \cs{PrintIndex}} +% \changes{v1.7a}{1992/02/26}{Documentation moved to interface section.} +% \changes{v1.9h}{1994/02/10}{Use \cs{@input@} instead of \cs{@input}.} +% \changes{v1.9w}{1995/12/29}{Turn the cmd into a noop after use.} +% This is the same as "\printindex" in the \textsf{makeidx} package. +% \begin{macrocode} +\def\PrintIndex{\@input@{\jobname.ind}% + \global\let\PrintIndex\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\printindex} +% Since the above macro was called |\printindex| in older versions +% of \texttt{doc.sty} the following definition was provided up to +% version 1.9y. +% \changes{v1.9z}{1996/04/17}{Commented out} +% \begin{macrocode} +%\def\printindex{\typeout{\string\printindex\space is obsolete!}% +% \typeout{Please use \string\PrintIndex\space +% if you are a macro implementor^^J +% or get a newer version of the documented +% software if you are a user}% +% \PrintIndex} +% \end{macrocode} +% \end{macro} +% +% We want headings in the index (and changes list) according to the +% initial character of the next block of entries and have to instruct +% \textsf{makeindex} appropriately. Unfortunately the specification +% for this changed sometime between versions 2.4 and 2.11 of +% \textsf{makeindex}. We provide both ways of doing it but +% unfortunately this will always produce a warning message from +% \textsf{makeindex}. This is for older versions: +% \changes{v1.7h}{1992/07/01}{Turn off headings in gls file} +% \begin{macrocode} +%</package> +%<+gind,gglo>% The next lines will produce some warnings when +%<+gind,gglo>% running Makeindex as they try to cover two different +%<+gind,gglo>% versions of the program: +%<+gind,gglo>lethead_prefix "{\\bfseries\\hfil " +%<+gind,gglo>lethead_suffix "\\hfil}\\nopagebreak\n" +%<+gind>lethead_flag 1 +%<+gglo>lethead_flag 0 +% \end{macrocode} +% This works for newer ones: +% \begin{macrocode} +%<+gind,gglo>heading_prefix "{\\bfseries\\hfil " +%<+gind,gglo>heading_suffix "\\hfil}\\nopagebreak\n" +%<+gind>headings_flag 1 +%<+gglo>headings_flag 0 +%<*package> +% \end{macrocode} +% +% +% +% \subsection[Dealing with the change history] +% {Dealing with the change history\footnotemark} +% \footnotetext{The whole section was proposed by Brian \textsc{Hamilton +% Kelly}. He also documented and debugged the macros as +% well as many other parts of this package.} +% +% To provide a change history log, the |\changes| command has +% been introduced. This takes three arguments, respectively, the +% version number of the file, the date of the change, and some detail +% regarding what change has been made. The second of these arguments +% is otherwise ignored, but the others are written out and may be used +% to generate a history of changes, to be printed at the end of the +% document. However, note that older versions of Chen's standard +% \textsf{makeindex} +% program limit any textual field to just 64 characters; therefore, +% is important that the number of characters in the second and third +% parameters should not exceed 61 altogether (to allow for the +% parentheses placed around the date). +% +% \begin{macro}{\changes} +% \changes{BHK}{1989/04/26}{Documented \texttt{\protect\bslash changes} +% command.} +% \changes{BHK}{1989/04/26}{Changed definition of +% \texttt{\protect\bslash protect}.} The output of the |\changes| +% command goes into the \meta{Glossary\_File} and therefore uses +% the normal |\glossaryentry| commands.\footnote{Note that a recent +% change in \LaTeX{} 2.09 changed the command name in the +% \texttt{.glo} file from \texttt{\bslash indexentry} to +% \texttt{\bslash glossaryentry}. It is therefore necessary to +% have a special \textsf{makeindex} style file called +% \texttt{gglo.ist} to process this file correctly.} Thus +% \textsf{makeindex} or a similar program can be used to process +% the output into a sorted ``glossary''. The |\changes| command +% commences by taking the usual measures to hide its spacing, and +% then redefines |\protect| for use within the argument of the +% generated |\indexentry| command. +% +% We re-code nearly all chars found in |\sanitize| to letter +% since the use of special package which make some characters +% active might upset the |\changes| command when writing its +% entries to the file. However we have to leave |%| as comment +% and \verb*+ + as \meta{space} otherwise chaos will happen. +% And, of course the |\| should be available as escape +% character. +% \changes{v1.5v}{1990/01/28}{`Re-code a lot of chars.} +% \changes{v1.5m}{1989/09/20}{\cs{actualchar} in second level removed.} +% \changes{v1.5o}{1989/09/24}{New sorting.} +% \changes{v1.6c}{1990/06/29}{Again new sorting.} +% \changes{v1.9u}{1995/08/06}{Use \cs{protected@edef}} +% \begin{macrocode} +\def\changes{\@bsphack\begingroup\@sanitize + \catcode`\\\z@ \catcode`\ 10 \MakePercentIgnore + \changes@} +\def\changes@#1#2#3{% + \protected@edef\@tempa{\noexpand\glossary{#1\levelchar +% \end{macrocode} +% \changes{v1.9u}{1995/08/06}{Use value of \cs{saved@macroname} to +% find out about change entries at outer level} +% If the macro "\saved@macroname" doesn't contain any macro name +% (ie is empty) the current changes entry was done at top-level. +% In this case we precede it by "\generalname". +% \begin{macrocode} + \ifx\saved@macroname\@empty + \space + \actualchar + \generalname + \else +% \end{macrocode} +% \changes{v2.1g}{2016/02/15}{Use \cs{saved@indexname}} +% \begin{macrocode} + \saved@indexname + \actualchar + \string\verb\quotechar*% + \verbatimchar\saved@macroname + \verbatimchar + \fi + :\levelchar #3}}% + \@tempa\endgroup\@esphack} +% \end{macrocode} +% +% \begin{macro}{\saved@macroname} +% \changes{BHK}{1989/04/26}{Provided for sorting outside \textsf{macro} +% environment} The entries are sorted for convenience by the name +% of the most recently introduced macroname (i.e., that in the most +% recent |\begin{macro}| command). We therefore provide +% |\saved@macroname| to record that argument, and provide a default +% definition in case |\changes| is used outside a \textsf{macro} +% environment. (This is a {\em wicked\/} hack to get such entries +% at the beginning of the sorted list! It works providing no macro +% names start with "!" or |"|.) \changes{v1.7a}{1992/03/02}{Changed +% string used for better sorting.} +% \changes{v1.9u}{1995/08/06}{Now empty by default} +% \begin{macrocode} +\def\saved@macroname{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\saved@indexname} +% \changes{v2.1g}{2016/02/15}{Use \cs{saved@indexname}} +% The macroname being document without a backslash for the index +% (or the environment name which doesn't have one in the first place). +% \begin{macrocode} +\def\saved@indexname{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\generalname} +% \changes{v1.9u}{1995/08/06}{Macro added} +% This macro holds the string placed before changes entries on +% top-level. +% \begin{macrocode} +\def\generalname{General} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\RecordChanges} +% \changes{BHK}{1989/04/26}{Renames former \texttt{\protect\bslash +% PrintChanges} command.} +% To cause the changes to be written (to a \texttt{.glo}) file, we +% define |\RecordChanges| to invoke \LaTeX's usual +% |\makeglossary| command. +% \begin{macrocode} +\let\RecordChanges\makeglossary +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\GlossaryMin} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% \begin{macro}{\c@GlossaryColumns} +% \changes{BHK}{1989/04/26}{Added to support \texttt{\protect\bslash +% changes}.} The remaining macros are all analogues of those used +% for the \textsf{theindex} environment. When the glossary is +% started we compute the space which remains at the bottom of the +% current page; if this is greater than |\GlossaryMin| then the +% first part of the glossary will be placed in the available space. +% The number of columns set are controlled by the counter +% |\c@GlossaryColumns| which can be changed with a |\setcounter| +% declaration. +% \begin{macrocode} +\newdimen\GlossaryMin \GlossaryMin = 80pt +\newcount\c@GlossaryColumns \c@GlossaryColumns = 2 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{environment}{theglossary} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% \changes{v1.5p}{1989/09/28}{Now call \cs{multicols} first.} +% \changes{v1.6e}{1991/04/03}{Turned into env definition.} +% \changes{v1.7a}{1992/03/10}{Changed to work without multicols if +% necessary.} +% \begin{macro}{\endglossary} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% The environment \textsf{theglossary} is defined in the same manner +% as the \textsf{theindex} environment. +% \begin{macrocode} +\ifhave@multicol + \newenvironment{theglossary}{% + \begin{multicols}\c@GlossaryColumns + [\glossary@prologue][\GlossaryMin]% + \GlossaryParms \let\item\@idxitem \ignorespaces}% + {\end{multicols}} +\else + \newenvironment{theglossary}{% + \@restonecoltrue\if@twocolumn\@restonecolfalse\fi + \columnseprule \z@ \columnsep 35\p@ + \twocolumn[\glossary@prologue]% + \GlossaryParms \let\item\@idxitem \ignorespaces} + {\if@restonecol\onecolumn\else\clearpage\fi} +\fi +% \end{macrocode} +% \end{macro} +% \end{environment} +% +% Here are the necessary \textsf{makeindex} declarations with scanning +% disabled as for the index. +% \begin{macrocode} +%</package> +%<+gglo>preamble +%<+gglo>"\n \\begin{theglossary} \n +%<+gglo> \\makeatletter\\scan@allowedfalse\n" +%<+gglo>postamble +%<+gglo>"\n\n \\end{theglossary}\n" +% \end{macrocode} +% This difference from \texttt{gind.ist} is necessary if you have an +% up-to-date \LaTeX. +% \begin{macrocode} +%<+gglo>keyword "\\glossaryentry" +%<*package> +% \end{macrocode} +% +% +% \begin{macro}{\GlossaryPrologue} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% \begin{macro}{\glossary@prologue} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% The |\GlossaryPrologue| macro is used to place a short +% message above the glossary into the document. It is implemented +% by redefining |\glossary@prologue|, a macro which holds the +% default text. We better make it a long macro to allow +% |\par| commands in its argument. +% \begin{macrocode} +\long\def\GlossaryPrologue#1{\@bsphack + \def\glossary@prologue{#1}% + \@esphack} +% \end{macrocode} +% Now we test whether the default is already defined by another +% package file. If not we define it. +% \begin{macrocode} +\@ifundefined{glossary@prologue} + {\def\glossary@prologue{\section*{{Change History}}% + \markboth{{Change History}}{{Change History}}% + }}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\GlossaryParms} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% Unless the user specifies otherwise, we set the change history +% using the same parameters as for the index except that we make it sort +% of ragged right as it contains text that often doesn't break nicely in +% small columns. +% \changes{v2.1g}{2016/02/15}{Use ragged setting by default} +% \begin{macrocode} +\@ifundefined{GlossaryParms}{\let\GlossaryParms\IndexParms + \expandafter\def\expandafter\GlossaryParms\expandafter{\GlossaryParms + \rightskip 15pt plus 1fil + \parfillskip -15pt plus -1fil\relax} +}{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PrintChanges} +% \changes{BHK}{1989/04/26}{Added to support +% \texttt{\protect\bslash changes}.} +% To read in and print the sorted change history, just put the +% |\PrintChanges| command as the last (commented-out, and thus +% executed during the documentation pass through the file) command +% in your package file. Alternatively, this command may form one of +% the arguments of the |\StopEventually| command, although a +% change history is probably {\em not\/} required if only the +% description is being printed. +% +% The command assumes that \textsf{makeindex} or some other program +% has processed the \texttt{.glo} file to generate a sorted +% \texttt{.gls} file. +% \changes{v1.9h}{1994/02/10}{Use \cs{@input@} instead of \cs{@input}.} +% \changes{v1.9w}{1995/12/29}{Turn the cmd into a noop after use.} +% \begin{macrocode} +\def\PrintChanges{\@input@{\jobname.gls}% + \global\let\PrintChanges\@empty} +% \end{macrocode} +% \end{macro} +% +% +% +% +% +% \subsection{Bells and whistles} +% +% \begin{macro}{\StopEventually} +% \changes{v1.5k}{1989/09/04}{Support for checksum.} +% \begin{macro}{\Finale} +% \changes{v1.5k}{1989/09/04}{Support for checksum.} +% \changes{v1.5z}{1990/04/22}{Define \cs{Finale} globally.} +% \begin{macro}{\AlsoImplementation} +% \changes{v1.9w}{1995/12/27}{Macro added} +% \begin{macro}{\OnlyDescription} +% If |\AlsoImplementation| is in force the whole documentation +% including the code part will be typeset. This is the default. +% \begin{macrocode} +\newcommand\AlsoImplementation{% +% \end{macrocode} +% To make this happen we have to define +% |\StopEventually| in a way that its argument is typeset at the +% very end or more exactly at |\Finale|. For this we +% save its argument in the macro |\Finale|. +% \begin{macrocode} + \long\def\StopEventually##1{\@bsphack\gdef\Finale{##1% +% \end{macrocode} +% But |\Finale| will be called at the very end of a file. This +% is exactly the point were we want to know if the file is +% uncorrupted. Therefore we also call |\check@checksum| at this +% point. +% \begin{macrocode} + \check@checksum}% +% \end{macrocode} +% On the other hand: |\StopEventually| is more or less a +% dividing point between description and code. So we start to look +% for the check-sum of the documented file by calling +% |\init@checksum|. +% \begin{macrocode} + \init@checksum + \@esphack}% + } +% \end{macrocode} +% +% Since |\AlsoImplementation| should be the default we execute it +% and thus |\StopEventually| gets the desired meaning. +% \begin{macrocode} +\AlsoImplementation +% \end{macrocode} +% When the user places an |\OnlyDescription| declaration in +% the driver file the document should only be typeset up to +% |\StopEventually|. We therefore have to redefine this macro. +% \begin{macrocode} +\def\OnlyDescription{\@bsphack\long\def\StopEventually##1{% +% \end{macrocode} +% In this case the argument of |\StopEventually| should be set +% and afterwards \TeX{} should stop reading from this file. +% Therefore we finish this macro with +% \begin{macrocode} + ##1\endinput}\@esphack} +% \end{macrocode} +% If no |\StopEventually| command is given we silently ignore a +% |\Finale| issued. +% \changes{v1.9n}{1994/04/28}{Ignore \cs{Finale} if no +% \cs{StopEventually} is given} +% \begin{macrocode} +\let\Finale\relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\meta} +% \changes{v1.4t}{1989/04/24}{Macro added.} +% \changes{v1.5w}{1990/02/03}{Breaks at space allowed.} +% \changes{v1.6a}{1990/05/24}{Extra space bug corrected.} +% The |\meta| macro is a bit tricky. We want to allow line +% breaks at blanks in the argument but we don't want a break +% in between. In the past this was done by defining |\meta| in a way that a +% \verb*+ + is active when the argument is scanned. Words are then +% scanned into |\hbox|es. The active \verb*+ + will end the +% preceding |\hbox| add an ordinary space and open a new +% |\hbox|. In this way breaks are only possible at spaces. The +% disadvantage of this method was that |\meta| was neither robust +% nor could it be |\protect|ed. The new implementation fixes this +% problem by defining |\meta| in a radically different way: we +% prevent hyphenation by defining a |\language| which has no +% patterns associated with it and use this to typeset the words +% within the angle brackets. +% \changes{v2.0i}{2000/05/21}{New implementation (pr/3170)} +% \begin{macrocode} +\ifx\l@nohyphenation\undefined + \newlanguage\l@nohyphenation +\fi +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand\meta[1]{% +% \end{macrocode} +% Since the old implementation of |\meta| could be used in math we +% better ensure that this is possible with the new one as +% well. So we use |\ensuremath| around |\langle| and +% |\rangle|. However this is not enough: if |\meta@font@select| +% below expands to |\itshape| it will fail if used in math +% mode. For this reason we hide the whole thing inside an +% |\nfss@text| box in that case. +% \changes{v2.0l}{2000/06/10}{Fixing changes for (pr/3170)} +% \begin{macrocode} + \ensuremath\langle + \ifmmode \expandafter \nfss@text \fi + {% + \meta@font@select +% \end{macrocode} +% Need to keep track of what we changed just in case the user +% changes font inside the argument so we store the font explicitly. +% \changes{v2.0m}{2000/07/04}{More fixing changes for (pr/3170)} +% \begin{macrocode} + \edef\meta@hyphen@restore + {\hyphenchar\the\font\the\hyphenchar\font}% + \hyphenchar\font\m@ne + \language\l@nohyphenation + #1\/% + \meta@hyphen@restore + }\ensuremath\rangle +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\meta@font@select} +% \changes{v2.0k}{2000/05/26}{Macro added (pr/3170)} +% Maske font used inside |\meta| customizable. +% \begin{macrocode} +\def\meta@font@select{\itshape} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\IndexInput} +% This next macro may be used to read in a separate file (possibly +% a package file that is {\em not\/} documented by this means) and +% set it verbatim, whilst scanning for macro names and indexing the +% latter. This could be a useful first pass in preparing to +% generate documentation for the file read. +% \begin{macrocode} +\def\IndexInput#1{% +% \end{macrocode} +% We commence by setting up a group, and initializing a +% |\trivlist| as is normally done by a +% |\begin{macrocode}| command. +% \begin{macrocode} + \begingroup \macro@code +% \end{macrocode} +% We also make spacing behave as in the \textsf{macrocode} +% environment, because otherwise all the spaces will be shown +% explicitly. +% \begin{macrocode} + \frenchspacing \@vobeyspaces +% \end{macrocode} +% Then it only remains to read in the specified file, and finish +% off the |\trivlist|. +% \changes{v1.5t}{1989/11/07}{Call \cs{endmacrocode} instead +% of \cs{endtrivlist}.} +% \begin{macrocode} + \input{#1}\endmacrocode +% \end{macrocode} +% Of course, we need to finish off the group as well. +% \begin{macrocode} + \endgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\maketitle} +% The macro to generate titles is easily altered in order that it +% can be used more than once (an article with many titles). In the +% original, diverse macros were concealed after use with +% |\relax|. We must cancel anything that may have been put +% into |\@thanks|, etc., otherwise {\em all\/} titles will +% carry forward any earlier such setting! +% \changes{v1.5j}{1989/06/09}{thispagestyle plain removed} +% \changes{v1.9r}{1994/06/09}{Added new definitions of +% \cs{@makefnmark} and \cs{@makefntext}} +% \begin{macrocode} +\def\maketitle{\par + \begingroup \def \thefootnote {\fnsymbol {footnote}}% + \setcounter {footnote}\z@ + \def\@makefnmark{\hbox to\z@{$\m@th^{\@thefnmark}$\hss}}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hbox to1.8em{\hss$\m@th^{\@thefnmark}$}##1}% + \if@twocolumn \twocolumn [\@maketitle ]% + \else \newpage \global \@topnum \z@ \@maketitle \fi +% \end{macrocode} +% \changes{v1.5k}{1989/09/04}{Added \cs{ps@titlepage}} +% For special formatting requirements (such as in TUGboat), we use +% pagestyle |titlepage| for this; this is later defined to be +% |plain|, unless already defined, as, for example, by +% |ltugboat.sty|. +% \begin{macrocode} + \thispagestyle{titlepage}\@thanks \endgroup +% \end{macrocode} +% If the driver file documents many files, we don't want parts of a +% title of one to propagate to the next, so we have to cancel +% these: +% \begin{macrocode} + \setcounter {footnote}\z@ + \gdef\@date{\today}\gdef\@thanks{}% + \gdef\@author{}\gdef\@title{}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ps@titlepage} +% \changes{v1.5k}{1989/09/04}{Added \texttt{\protect\bslash +% ps@titlepage}} When a number of articles are concatenated into a +% journal, for example, it is not usual for the title pages of such +% documents to be formatted differently. Therefore, a class +% such as \textsf{ltugboat} can define this macro in advance. +% However, if no such definition exists, we use pagestyle +% \texttt{plain} for title pages. +% \begin{macrocode} +\@ifundefined{ps@titlepage} + {\let\ps@titlepage=\ps@plain}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MakeShortVerb} +% \changes{v1.7a}{1992/02/27}{Added (from newdoc but now alters +% \cs{dospecials}, \cs{@sanitize}).} +% This arranges an abbreviation for "\verb" such that if you say +% "\MakeShortVerb{\"\meta{c}"}" subsequently using +% \meta{c}\meta{text}\meta{c} is equivalent to +% "\verb"\meta{c}\meta{text}\meta{c}.\footnote{Warning: +% the commentary in the rest of this section was written by Dave +% Love.} In addition, the fact +% that \meta{c} is made active is recorded for the benefit of the +% \textsf{verbatim} and \textsf{macrocode} environments. +% Note particularly that the definitions below are global. +% The first thing we do (it needn't be first) is to record +% the---presumably new---special character in "\dospecials" and +% "\@sanitize" using "\add@special". +% +% \changes{v1.9e.2}{1994/02/07}{-js: Check if \protect\meta{c} is +% already an +% abbreviation for \cs{verb}.} +% Some unwary user might issue "\MakeShortVerb" for a second time, we +% better protect against this. We assume that this happened if a +% control sequence "\cc\"\meta{c} is bound, the probability that this +% name is used by another module is low. We will output a warning +% below, so that a possible error might be noticed by the programmer +% if he reads the "LOG" file. (Should have used module internal names, +% 'though.) +% +% \begin{macro}{\MakeShortVerb*} +% \changes{v2.1a}{2003/12/09}{(HjG) Added \texttt{*} form} +% This arranges an abbreviation for "\verb*" such that if you say +% "\MakeShortVerb*{\"\meta{c}"}" subsequently using +% \meta{c}\meta{text}\meta{c} is equivalent to +% "\verb*"\meta{c}\meta{text}\meta{c}. +% \begin{macrocode} +%</package> +%<*package|shortvrb> +\def\MakeShortVerb{% + \@ifstar + {\def\@shortvrbdef{\verb*}\@MakeShortVerb}% + {\def\@shortvrbdef{\verb}\@MakeShortVerb}} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\@MakeShortVerb#1{% + \expandafter\ifx\csname cc\string#1\endcsname\relax +% \end{macrocode} +% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}} +% \begin{macrocode} + \@shortvrbinfo{Made }{#1}\@shortvrbdef + \add@special{#1}% +% \end{macrocode} +% Then the character's current catcode is stored in "\cc\"\meta{c}. +% \begin{macrocode} + \expandafter + \xdef\csname cc\string#1\endcsname{\the\catcode`#1}% +% \end{macrocode} +% The character is spliced into the definition using the same trick as +% used in "\verb" (for instance), having activated "~" in a group. +% \begin{macrocode} + \begingroup + \catcode`\~\active \lccode`\~`#1% + \lowercase{% +% \end{macrocode} +% The character's old meaning is recorded in "\ac\"\meta{c} prior to +% assigning it a new one. +% \begin{macrocode} + \global\expandafter\let + \csname ac\string#1\endcsname~% + \expandafter\gdef\expandafter~\expandafter{\@shortvrbdef~}}% + \endgroup +% \end{macrocode} +% Finally the character is made active. +% \begin{macrocode} + \global\catcode`#1\active +% \end{macrocode} +% If we suspect that \meta{c} is already a short reference, we tell +% the user. Now he or she is responsible if anything goes wrong\,\dots +% \begin{macrocode} + \else +% \end{macrocode} +% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}} +% \begin{macrocode} + \@shortvrbinfo\@empty{#1 already}{\@empty\verb(*)}% + \fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\DeleteShortVerb} +% \changes{v1.7a}{1992/02/27}{Added (from newdoc but now alters +% \cs{dospecials}, \cs{@sanitize}).} +% Here's the means of undoing a "\MakeShortVerb", for instance in a +% region where you need to use the character outside a verbatim +% environment. It arranges for "\dospecials" and "\@sanitize" to be +% altered appropriately, restores the saved catcode and, if necessary, +% the character's meaning (as stored by +% "\MakeShortVerb"). If the catcode wasn't stored in +% "\cc\"\meta{c} (by "\MakeShortVerb") the command is silently +% ignored. +% \changes{v1.7a}{1992/02/28}{Check for previous matched +% \cs{MakeShortVerb} +% to avoid error.} +% \begin{macrocode} +\def\DeleteShortVerb#1{% + \expandafter\ifx\csname cc\string#1\endcsname\relax +% \end{macrocode} +% \changes{v2.1a}{2003/12/10}{(HjG) Notify user +% if it's not a short verb character} +% \begin{macrocode} + \@shortvrbinfo\@empty{#1 not}{\@empty\verb(*)}% + \else +% \end{macrocode} +% \changes{v1.9v}{1995/11/03}{(DPC) Use \cs{@shortvrbinfo}} +% \begin{macrocode} + \@shortvrbinfo{Deleted }{#1 as}{\@empty\verb(*)}% + \rem@special{#1}% + \global\catcode`#1\csname cc\string#1\endcsname +% \end{macrocode} +% \changes{v1.9e.2}{1994/02/07}{-js: Reset `cc`\protect\meta{c} in +% in \cs{DeleteShortVerb}} +% We must not forget to reset "\cc\"\meta{c}, otherwise the check in +% "\MakeShortVerb" for a repeated definition will not work. +% \begin{macrocode} + \global \expandafter\let \csname cc\string#1\endcsname \relax + \ifnum\catcode`#1=\active + \begingroup + \catcode`\~\active \lccode`\~`#1% + \lowercase{% + \global\expandafter\let\expandafter~% + \csname ac\string#1\endcsname}% + \endgroup \fi \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@shortvrbinfo} +% \changes{v1.9v}{1995/11/03}{(DPC) Macro added} +% \changes{v2.1a}{2003/12/10}{(HjG) Third argument added +% on behalf of \cmd{\MakeShortVerb*}} +% Helper function for info messages. +% \begin{macrocode} +\def\@shortvrbinfo#1#2#3{% +%<shortvrb> \PackageInfo{shortvrb}{% +%<!shortvrb> \PackageInfo{doc}{% + #1\expandafter\@gobble\string#2 a short reference + for \expandafter\string#3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\add@special} +% \changes{v1.7a}{1992/02/27}{Added for short verb facility.} +% This helper macro adds its argument to the +% "\dospecials" macro which is conventionally used by verbatim macros +% to alter the catcodes of the currently active characters. We need +% to add "\do\"\meta{c} to the expansion of "\dospecials" after +% removing the character if it was already there to avoid multiple +% copies building up should "\MakeShortVerb" not be balanced by +% "\DeleteShortVerb" (in case anything that uses "\dospecials" cares +% about repetitions). +% \begin{macrocode} +\def\add@special#1{% + \rem@special{#1}% + \expandafter\gdef\expandafter\dospecials\expandafter + {\dospecials \do #1}% +% \end{macrocode} +% Similarly we have to add "\@makeother\"\meta{c} to "\@sanitize" +% (which is used in things like "\index" to re-catcode all special +% characters except braces). +% \begin{macrocode} + \expandafter\gdef\expandafter\@sanitize\expandafter + {\@sanitize \@makeother #1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\rem@special} +% \changes{v1.7a}{1992/02/27}{Added for short verb facility.} +% The inverse of "\add@special" is slightly trickier. "\do" is +% re-defined to expand to nothing if its argument is the character of +% interest, otherwise to expand simply to the argument. We can then +% re-define "\dospecials" to be the expansion of itself. The space +% after "=`##1" prevents an expansion to "\relax"! +% \begin{macrocode} +\def\rem@special#1{% + \def\do##1{% + \ifnum`#1=`##1 \else \noexpand\do\noexpand##1\fi}% + \xdef\dospecials{\dospecials}% +% \end{macrocode} +% Fixing "\@sanitize" is the same except that we need to re-define +% "\@makeother" which obviously needs to be done in a group. +% \begin{macrocode} + \begingroup + \def\@makeother##1{% + \ifnum`#1=`##1 \else \noexpand\@makeother\noexpand##1\fi}% + \xdef\@sanitize{\@sanitize}% + \endgroup} +%</package|shortvrb> +%<*package> +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MakeShortverb} +% \begin{macro}{\DeleteShortverb} +% \changes{v1.7a}{1992/02/27}{Added (from newdoc).} +% These commands from \textsf{newdoc} are now obsolete. +% \begin{macrocode} +\def\MakeShortverb{\typeout{*** Switch to \noexpand\MakeShortVerb + syntax, this is obsolete ***}\MakeShortVerb} +\def\DeleteShortverb{\typeout{*** Switch to \noexpand\DeleteShortVerb + syntax, this is obsolete ***}\DeleteShortVerb} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \subsection[Providing a checksum and character table] +% {Providing a checksum and character table\footnotemark} +% \footnotetext{Warning: the commentary in this section was +% written by Dave Love. } +% +% +% \begin{macro}{\init@checksum} +% The checksum mechanism works by counting backslashes in the +% macrocode. This initialises the count (when called from +% "\StopEventually"). +% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.} +% \begin{macrocode} +\def\init@checksum{\relax + \global\bslash@cnt\z@} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\check@checksum} +% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.} +% This reports the sum compared with the value ("\bslash@cnt") the +% file advertises. It's called from "\Finale" (if that hasn't been +% re-defined). +% \changes{v2.1f}{2016/02/12}{Suppress \cs{CheckSum} check if no checksum +% is specified in the file} +% \begin{macrocode} +\def\check@checksum{\relax + \ifnum\check@sum>\m@ne +% \end{macrocode} +% We do nothing if the checksum in the file is negative (or not given as +% it is initialized with -1). +% \begin{macrocode} + \ifnum\check@sum=\z@ + \typeout{**********************************}% + \typeout{* This macro file has no checksum!}% + \typeout{* The checksum should be \the\bslash@cnt!}% + \typeout{**********************************}% + \else + \ifnum\check@sum=\bslash@cnt + \typeout{*******************}% + \typeout{* Checksum passed *}% + \typeout{*******************}% + \else + \PackageError{doc}{Checksum not passed + (\the\check@sum<>\the\bslash@cnt)}% + {The file currently documented seems to be wrong.^^J% + Try to get a correct version.}% + \fi + \fi + \fi + \global\check@sum\m@ne} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\check@sum} +% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.} +% \begin{macro}{\bslash@cnt} +% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.} +% We need to define counters, "\bslash@cnt" for the number of +% backslashes counted and "\check@sum" for the value advertised by the +% file if any. A negative value means there is no checksum checking which is the default. +% \changes{v2.1f}{2016/02/12}{Suppress \cs{CheckSum} check if no checksum +% is specified in the file} +% \begin{macrocode} +\newcount\check@sum \check@sum = \m@ne +\newcount\bslash@cnt \bslash@cnt = \z@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\CheckSum} +% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.} +% This is the interface to setting "\check@sum". +% \begin{macrocode} +\def\CheckSum#1{\@bsphack\global\check@sum#1\relax\@esphack} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\step@checksum} +% \changes{v1.5k}{1989/09/04}{Macro added to support checksum.} +% This advances the count when a backslash is encountered in the +% macrocode. +% \begin{macrocode} +\def\step@checksum{\global\advance\bslash@cnt\@ne} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CharacterTable} +% The user interface to the character table-checking does some +% "\catcode"ing and then compares the following table with the +% stored version. We need to have "@" of type ``other'' within the +% table since this is the way it is usually returned when reading +% in a normal document. To nevertheless have a private letter we +% use "~" for this purpose. "~" does no harm as a ``letter'' as it +% comes last in the table and therefore will not gobble following +% space. +% \changes{v1.5m}{1989/09/20}{Macro added to check character translation +% problems.} +% \changes{v1.5q}{1989/11/01}{Made character table more readable.} +% \changes{v1.5t}{1989/11/07}{Make \string\~{} letter in chartable +% macros.} +% \changes{v1.5u}{1989/11/14}{Made @ other in default table.} +% \begin{macrocode} +\def\CharacterTable{\begingroup \CharTableChanges \character@table} +% \end{macrocode} +% \end{macro} +% \def\MakePrivateLetters{\catcode`\~=11\makeatletter} +% \begin{macro}{\character@table} +% This does the work of comparing the tables and reporting the result. +% Note that the following code is enclosed in a group +% with "~" catcoded to letter. +% \begin{macrocode} +\begingroup + \catcode`\~=11 + \gdef\character@table#1{\def\used~table{#1}% + \ifx\used~table\default~table + \typeout{***************************}% + \typeout{* Character table correct *}% + \typeout{***************************}% + \else + \PackageError{doc}{Character table corrupted} + {\the\wrong@table} + \show\default~table + \show\used~table + \fi + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CharTableChanges} +% When the character table is read in we need to scan it with a +% fixed set of "\catcode"s. The reference table below was defined by +% assuming the normal "\catcode"s of \TeX{}, i.e.\ "@" is of type +% other and the only token of type ``letter'' are the usual letters +% of the alphabet. If, for some reason, other characters are made +% ``letters'' then their "\catcode"s need to be restored before +% checking the table. Otherwise spaces in the table are gobbled and +% we get the information that the tables are different, even if +% they are actually equal. For this reason "\CharTableChanges" can +% be set up to locally restore the "\catcode"s of such ``letters'' +% to ``other''. +% \begin{macrocode} + \global\let\CharTableChanges\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\default~table} +% Here's what the table {\em should\/} look like (modulo spaces). +% \begin{macrocode} + \makeatother + \gdef\default~table + {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 \~} +\endgroup +% \end{macrocode} +% \end{macro} +% \let\MakePrivateLetters=\makeatletter +% +% \begin{macro}{\wrong@table} +% \changes{v1.7a}{1992/02/28}{Moved to where the catcodes are right +% so it works.} +% We need a help message in case of problems. +% \begin{macrocode} + \newhelp\wrong@table{Some of the ASCII characters are corrupted.^^J + I now \string\show\space you both tables for comparison.} +% \end{macrocode} +% \end{macro} +% +% +% \subsection[Attaching line numbers to code lines] +% {Attaching line numbers to code lines\footnotemark} +% \footnotetext{Warning: the commentary was written by Dave +% Love.} +% +% +% The code in this section allows index entries to refer to code line +% numbers---the number of the first line of macrocode in the +% \textsf{macro} environment. +% +% +% \begin{macro}{\codeline@index} +% Indexing by code line is controlled by the "codeline@index" switch. +% \changes{v1.5s}{1989/11/05}{Support for code line no. (Undoc)} +% \changes{v1.7a}{1992/02/24}{Documented code line no. support.} +% \begin{macro}{\CodelineNumbered} +% \changes{v1.8a}{1993/05/19}{Macro added} +% \begin{macrocode} +\newif\ifcodeline@index \codeline@indexfalse +\let\CodelineNumbered\codeline@indextrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\codeline@wrindex} +% The code index entries are written out by "\special@index". If +% indexing is by code line this is "\let" to "\codeline@wrindex"; +% if indexing is by page it is just "\index". However, if +% "\nofiles" is given, we omit writing such an index entry at all. +% \changes{v1.7j}{1992/08/14}{Added \cs{if@filesw}.} +% \begin{macrocode} +\def\codeline@wrindex#1{\if@filesw + \immediate\write\@indexfile + {\string\indexentry{#1}% + {\number\c@CodelineNo}}\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\special@index} +% By default no index entries are written out. +% \begin{macrocode} +\let\special@index = \@gobble +% \end{macrocode} +% \end{macro} +% \begin{macro}{\CodelineIndex} +% \changes{v1.5u}{1989/11/14}{Added \cs{PageIndex} and +% \cs{CodelineIndex} (Undoc)} +% This switches on use of the index file with "\makeindex", sets the +% switch to indicate code line numbering and defines "\special@index" +% appropriately. +% \begin{macrocode} +\def\CodelineIndex{\makeindex + \codeline@indextrue + \let\special@index\codeline@wrindex} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PageIndex} +% "\PageIndex" is similar. +% \begin{macrocode} +\def\PageIndex{\makeindex + \codeline@indexfalse + \let\special@index\index} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\c@CodelineNo} +% \changes{v1.5l}{1989/09/10}{Counter added to support code line +% numbers} +% \changes{v1.5y}{1990/02/24}{Default changed.} +% \changes{v1.6b}{1990/06/15}{\cs{rm} moved before \cs{scriptsize} to +% avoid unnecessary fontwarning.} +% We need a counter to keep track of the line number. +% \begin{macrocode} +\newcount\c@CodelineNo \c@CodelineNo\z@ +% \end{macrocode} +% \end{macro} +% \begin{macro}{\theCodelineNo} +% \changes{v1.7a}{1992/02/25}{Existing definition not overwritten.} +% \changes{v1.7a}{1992/03/12}{Use \cs{reset@font} for NFSS.} +% This provides a hook to control the format of line numbers which may +% be defined in a class file. +% \begin{macrocode} +\@ifundefined{theCodelineNo} + {\ifx\selectfont\undefined + \def\theCodelineNo{\rmfamily\scriptsize\arabic{CodelineNo}}% + \else + \def\theCodelineNo{\reset@font\scriptsize\arabic{CodelineNo}}% + \fi} + {} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \subsection{Layout Parameters for documenting package files} +% +% \begin{macro}{\tolerance} +% People documenting package files would probably rather have things +% ``sticking out'' in overfull |\hbox|es and poorish spacing, +% because they probably don't want to spend a lot of time on making +% all the line breaks perfect! +% \begin{macrocode} + \tolerance=1000\relax +% \end{macrocode} +% \end{macro} +% +% \DeleteShortVerb{\"} +% +% The following |\mathcode| definitions allow the characters +% `|\|' +% and `\texttt{@}' to appear in |\ttfamily| font when invoked in math +% mode;\footnote{You may wonder why the definitions state that both +% characters belong to the {\em variable family\/} +% (i.e.\ the number 7 in front). The reason is this: +% Originally the \texttt{\bslash mathcode} of +% \texttt{\bslash} was defined to be \texttt{"075C}, +% i.e.\ ordinary character number 92 (hex 5C) in +% math family number 7 which is the typewriter family in +% standard \LaTeX. +% But this file should not depend on this specific +% setting, so I changed these +% \texttt{\bslash mathcode}$\,$s +% to work with any family assignments. For an example +% see the article about the new font selection scheme.} +% particularly for something like $|\@abc|=1$. +% +% If an {\em old\/} version of the \textsf{german} package is in +% force, then the `|"|' character is active and would upset the +% definition of the \meta{16-bit number} quantities below, therefore +% we change the |\catcode| of |"| inside a group, and use +% |\global|. +% \begin{macrocode} +{ \catcode`\"=12 + \global\mathcode`\\="705C \global\mathcode`\@="7040 } +% \end{macrocode} +% \MakeShortVerb{\"} +% +% \begin{macro}{\DocstyleParms} +% This macro can be used, for example, to assign new values to +% |\MacrocodeTopsep| and |\MacroIndent| and some other internal +% registers. If it is already defined, the default definition +% won't be carried out. Note that it is necessary to assign new +% values via this macro if it should be done in a class file (like +% \texttt{ltugboat.cls} for example) since the registers are +% undefined before \texttt{doc.sty} is read in. The default values +% for the internal registers are scattered over this file. +% \changes{v1.5u}{1989/11/14}{\cs{DocStyleParms} now empty} +% \changes{v2.1h}{2018/02/01}{Only use\cs{DocStyleParms} if defined +% (previously the test defined it)} +% \begin{macrocode} +\@ifundefined{DocstyleParms}{}{\DocstyleParms} +% \end{macrocode} +% Clear out |\DocstyleParms| after use (or non-use). +% \begin{macrocode} + \let\DocstyleParms\relax +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\AmSTeX} +% \changes{v1.5j}{1989/06/09}{Macro AmsTeX renamed to AmSTeX} +% \begin{macro}{\BibTeX} +% \begin{macro}{\SliTeX} +% Here are a few definitions which can usefully be employed when +% documenting package files: now we can readily refer to \AmSTeX, +% \BibTeX\ and \SliTeX, as well as the usual \TeX\ and \LaTeX. +% \begin{macrocode} +\@ifundefined{AmSTeX} + {\def\AmSTeX{\leavevmode\hbox{$\mathcal A\kern-.2em\lower.376ex% + \hbox{$\mathcal M$}\kern-.2em\mathcal S$-\TeX}}}{} +\@ifundefined{BibTeX} + {\def\BibTeX{{\rmfamily B\kern-.05em% + \textsc{i\kern-.025em b}\kern-.08em% + T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}}{} +\@ifundefined{SliTeX} + {\def\SliTeX{{\rmfamily S\kern-.06emL\kern-.18em\raise.32ex\hbox + {\scshape i}\kern -.03em\TeX}}}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\PlainTeX} +% \changes{v1.5g}{1989/05/07}{space between plain and TeX changed.} +% \begin{macro}{\Web} +% There's even a \PlainTeX{} and a \Web. +% \begin{macrocode} +\@ifundefined{PlainTeX}{\def\PlainTeX{\textsc{Plain}\kern2pt\TeX}}{} +\@ifundefined{Web}{\def\Web{\textsc{Web}}}{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Changing the \texttt{\protect\bslash catcode} of \%} +% +% \begin{macro}{\MakePercentIgnore} +% \begin{macro}{\MakePercentComment} +% And finally the most important bit: we change the |\catcode| +% of `|%|' so that it is ignored (which is how we are able to +% produce this document!). We provide two commands to do the actual +% switching. +%^^A The |\MakePercentIgnore| is then called as the +%^^A last command in this file. +% \begin{macrocode} +\def\MakePercentIgnore{\catcode`\%9\relax} +\def\MakePercentComment{\catcode`\%14\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\DocInput} +% The two macros above are now used to define the |\DocInput| macro +% which was introduced in version v1.5l (or so) of the \DOC{} +% package. In older versions |\MakePercentIgnore| was placed +% at the very end of \texttt{doc.sty}. +% \begin{macrocode} +\def\DocInput#1{\MakePercentIgnore\input{#1}\MakePercentComment} +% \end{macrocode} +% \end{macro} +% +% \subsection{GetFileInfo} +% +% \begin{macro}{\GetFileInfo} +% \changes{v1.9o}{1994/05/08}{Macro added} +% \changes{v1.9z}{1997/02/05}{Missing percent latex/2404} +% Define |\filedate| and friends from info in the +% |\ProvidesPackage| etc.\ commands. +% \begin{macrocode} +\def\GetFileInfo#1{% + \def\filename{#1}% + \def\@tempb##1 ##2 ##3\relax##4\relax{% + \def\filedate{##1}% + \def\fileversion{##2}% + \def\fileinfo{##3}}% + \edef\@tempa{\csname ver@#1\endcsname}% + \expandafter\@tempb\@tempa\relax? ? \relax\relax} +% \end{macrocode} +% \end{macro} +% +% We can now finish the \texttt{docstrip} main module. +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% +% \Finale +% \PrintIndex \PrintChanges +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/docstrip.dtx b/Master/texmf-dist/source/latex-dev/base/docstrip.dtx new file mode 100644 index 00000000000..be3dda6d32d --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/docstrip.dtx @@ -0,0 +1,4370 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +\catcode`\{=1 +\catcode`\}=2 +\def\filename{docstrip.dtx} +\def\fileversion{2.5g} +\def\filedate{2018/05/03} +\def\docdate {2018/05/03} +%% +% +%\iffalse +% +%% The docstrip program for use with TeX. +%% Copyright (C) 1989-1991 Frank Mittelbach +%% Copyright (C) 1992-1995 Johannes Braams, Denys Duchier, +%% Frank Mittelbach +%% Copyright (C) 1995 Marcin Woli\'nski +%% Copyright (C) 1996-1997 Mark Wooding, Marcin Woli\'nski +%% Copyright (C) 1998-2003 LaTeX3 project and the above authors +%% All rights are reserved. +%% +% +% \fi +% +% \changes{2.0b}{1991/05/29}{Added bugfix from Denys} +% \changes{2.0c}{1991/05/29}{Allow almost all characters in guard (DD)} +% \changes{2.0d}{1991/05/31}{Started merging in some of Franks code} +% \changes{2.0j}{1992/03/05}{Wrote introduction} +% \changes{2.0m}{1992/04/21}{Renamed all macros that deal with the +% parsing of boolean expressions} +% \changes{2.0m}{1992/04/25}{Removed dependency from ltugboat, +% incorporated driver file into source.} +% \changes{2.0m}{1992/04/25}{Added some missing percents; corrected some +% typos} +% \changes{2.0m-DL}{1992/05/08}{Various small corrections to English and +% typos} +% \changes{2.0q}{1992/07/01}{Changed all dates to yy/mm/dd for better +% sorting} +% \changes{2.2a}{1993/12/02}{Update for LaTeX2e} +% \changes{2.2c}{1993/12/17}{Renamed texsys.tex to texsys.cfg.} +% \changes{2.3a}{1995/08/17}{Swapped Primary with Secondary since +% expressions are generally described bottom-up} +% \changes{2.3b}{1995/08/22}{Completely changed expressions parser} +% \changes{2.3b}{1995/08/23}{Removed mechanism for checking if previous +% one-line guard is same as current (\cs{testOption}, +% \cs{closeOption})---this is not a common +% case and testing complicates things unnecessarily} +% \changes{2.3c}{1995/08/24}{When file is multiply listed in \cs{file} +% clause it \emph{is} multiply read} +% \changes{2.3c}{1995/09/04}{Changed some dirty tricks to be +% less/more dirty---all uses of \cs{afterfi}} +% \changes{2.3e}{1995/09/25}{Directories support} +% \changes{2.3e}{1995/10/24}{added \cs{makepathname} to support +% systems with bizzare pathnames} +% \changes{2.3e}{1995/10/25}{batch files work by \cs{input}} +% \changes{2.3e}{1996/10/02}{Introduced ``open lists''} +% \changes{2.4a}{1996/06/06}{Add stream limits (MDW)} +% \changes{2.4c}{1996/06/11}{Add initex support (DPC)} +% +% \DoNotIndex{\#,\$,\%,\&,\@,\\,\{,\},\^,\_,\~,\ } +% \DoNotIndex{\@ne} +% \DoNotIndex{\advance,\begingroup,\catcode,\closein,\closeout} +% \DoNotIndex{\day,\def,\edef,\else,\empty,\endgroup,\errmessage} +% \DoNotIndex{\expandafter,\fi,\futurelet,\gdef,\global,\if,\ifeof} +% \DoNotIndex{\ifx,\immediate,\let,\loop,\m@ne,\message,\month} +% \DoNotIndex{\newcount} +% \DoNotIndex{\newif,\newlinechar,\newread,\newtoks,\newwrite} +% \DoNotIndex{\noexpand,\openin,\openout,\par,\read,\relax,\repeat} +% \DoNotIndex{\space,\the,\undefined,\write,\xdef,\year,\z@} +% +% ^^A some definitions for this documentation +% +% \newcommand{\ds}{\textsf{DocStrip}} ^^A maybe? +% \newcommand{\bsl}{\protect\bslash} +% \newcommand{\note}[1]{\marginpar{\textbf{#1}}} +% \newcommand{\netaddress}[1]{\texttt{#1}} +% +% ^^A override the default in doc.sty +% \makeatletter +% \renewenvironment{theglossary}{% +% \glossary@prologue% +% \GlossaryParms \let\item\@idxitem \ignorespaces}% +% {} +% \makeatother +% +% +% \changes{2.1c}{1993/02/25}{Added a setting for StandardModuleDepth} +% \setcounter{StandardModuleDepth}{1} +% +% \title{The \ds{} program% +% \thanks{This file has version number \fileversion, +% last revised \filedate, +% documentation dated \docdate.}} +% +% \changes{2.1b}{1993/02/23}{modified mailaddress of Johannes} +% \changes{2.4i}{1998/01/18}{removed mail addresses as it is hopeless +% to keep them uptodate} +% \author{% +% Frank Mittelbach +% \and +% Denys Duchier +% \and +% Johannes Braams +% \and +% Marcin Woli\'nski +% \and +% Mark Wooding +% } +% +% \date{Printed \today} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \begin{abstract} +% This document describes the implementation of the \ds{} program. +% The original version of this program was developed by Frank +% Mittelbach to accompany his \texttt{doc.sty} which enables literate +% programming in \LaTeX\@. Denys Duchier rewrote it to run either +% with \TeX\ or with \LaTeX, and to allow full boolean expressions in +% conditional guards instead of just comma-separated lists. +% Johannes Braams re-united the two implementations, documented and +% debugged the code. +% +% In September 1995 Marcin Woli\'nski changed many parts of the +% program to make use of \TeX's ability to write to multiple files +% at the same time to avoid re-reading sources. The performance +% improvement of version~2.3 came at a price of compatibility with +% some more obscure operating systems which limit the number of +% files a process can keep open. This was corrected in September +% 1996 by Mark Wooding and his changes were ``creatively merged'' +% by Marcin Woli\'nski who made at the same time changes in batch +% files processing, handling of preambles and introduced ``verbatim +% mode''. After all that, David Carlisle merged the new version into +% the \LaTeX\ sources, and made a few other changes, principally +% making \ds{} work under initex, and removing the need for +% batch files to say \verb|\def\batchfile{...}|. +% \end{abstract} +% +% \section{Introduction} +% +% \subsection{Why the \ds{} program?} When Frank Mittelbach created +% the \texttt{doc} package, he invented a way to combine \TeX\ code +% and its documentation. From then on it was more or less possible +% to do literate programming in \TeX. +% +% This way of writing \TeX\ programs obviously has great +% advantages, especially when the program becomes larger than a +% couple of macros. There is one drawback however, and that is +% that such programs may take longer than expected to run because +% \TeX\ is an interpreter and has to decide for each line of the +% program file what it has to do with it. Therefore, \TeX\ programs +% may be sped up by removing all comments from them. +% +% By removing the comments from a \TeX\ program a new problem is +% introduced. We now have two versions of the program and both of +% them {\em have\/} to be maintained. Therefore it would be nice to +% have a possibility to remove the comments automatically, instead +% of doing it by hand. So we need a program to remove comments from +% \TeX\ programs. This could be programmed in any high level +% language, but maybe not everybody has the right compiler to +% compile the program. Everybody who wants to remove comments from +% \TeX\ programs has \TeX\@. Therefore the \ds{} program is +% implemented entirely in \TeX. +% +% \subsection{Functions of the \ds{} program} +% +% Having created the \ds{} program to remove comment lines from +% \TeX\ programs\footnote{Note that only comment lines, that is +% lines that start with a single \texttt{\%} character, are removed; +% all other comments stay in the code.} it became feasible to do more +% than just strip comments.\\ Wouldn't it be nice to have a way to +% include parts of the code only when some condition is set true? +% Wouldn't it be as nice to have the possibility to split the +% source of a \TeX\ program into several smaller files and combine +% them later into one `executable'?\\ Both these wishes have been +% implemented in the \ds{} program. +% +% \section{How to use the \ds{} program} +% A number of ways exist to use the \ds{} program: +% \begin{enumerate} +% \item The usual way to use \ds{} is to write a \emph{batch file} +% in such a way that it can be directly processed by \TeX{}. +% The batch file should contain the commands described below for +% controlling the \ds{} program. +% This allows you to set up a distribution where you can instruct +% the user to simply run +% \begin{quote} +% \texttt{TEX} \meta{batch file} +% \end{quote} +% to generate the executable versions of your files from the +% distribution sources. +% Most of the \LaTeX\ distribution is packaged this way. +% To produce such a batch file include a statement in your +% `batch file' that +% instructs \TeX\ to read \texttt{docstrip.tex}. +% The beginning of such a file would look like: +%\begin{verbatim} +% \input docstrip +% ... +%\end{verbatim} +% By convention the batch file should have extension |.ins|. But +% these days \ds{} in fact work with any extension. +% +% \item Alternatively you can instruct \TeX\ to read the file +% \texttt{docstrip.tex} and to see what happens. \TeX\ will ask +% you a few questions about the file you would like to be +% processed. When you have answered these questions it does +% its job and strips the comments from your \TeX\ code. +% \end{enumerate} +% +% \section{Configuring \ds} +% \subsection{Selecting output directories} +% \changes{2.3e}{1996/09/19}{Added documentation} +% Inspired by a desire to simplify reinstallations of \LaTeXe{} and +% to support operating systems which have an upper limit on the +% number of files allowed in a directory, \ds\ now allows +% installation scripts to specify output directories for files it +% creates. We suggest using TDS (\TeX\ directory structure) names +% of directories relative to \texttt{texmf} here. However these +% names should be thought of as a labels rather than actual names +% of directories. They get translated to actual system-dependent +% pathnames according to commands contained in a configuration file +% named \texttt{docstrip.cfg}. +% +% The configuration file is read by \ds{} just before it starts to +% process any batch file commands. +% +% If this file is not present \ds{} uses some default settings which +% ensure that files are only written to the current directory. +% However by use of this configuration file, a site maintainer can +% `enable' features of \ds{} that allow files to be written to +% alternative directories. +% +% \DescribeMacro{\usedir} +% Using this macro package author can tell where a file should be +% installed. All |\file|s generated in the scope of that +% declaration are written to a directory specified by its one +% argument. For example in \LaTeXe{} installation following +% declarations are used: +%\begin{verbatim} +% \usedir{tex/latex/base} +% \usedir{makeindex} +%\end{verbatim} +% And standard packages use +%\begin{verbatim} +% \usedir{tex/latex/tools} +% \usedir{tex/latex/babel} +%\end{verbatim} +% etc. +% +% \DescribeMacro{\showdirectory} +% Used to display directory names in messages. If some label is not +% defined it expands to |UNDEFINED (label is ...)| otherwise to a +% directory name. It is probably a good idea for every installation +% script to display at startup list of all directories that would +% be used and asking user to confirm that. +% +% The above macros are used by package/installation script +% author. The following macros are used in a configuration file, +% |docstrip.cfg|, by a system administrator to +% describe her/his local directory structure. +% +% \DescribeMacro{\BaseDirectory} This macro is administrator's way of +% saying ``yes, I want to use that directories support of +% yours''. \ds{} will write only to current directory unless your +% config has a call to this macro. (This means \ds{} won't write to +% random directories unless you tell it to, which is nice.) Using +% this macro you can specify a base directory for \TeX-related +% stuff. E.g., for many Unix systems that would be +%\begin{verbatim} +% \BaseDirectory{/usr/local/lib/texmf} +%\end{verbatim} +% and for standard em\TeX{} installation +%\begin{verbatim} +% \BaseDirectory{c:/emtex} +%\end{verbatim} +% +% \DescribeMacro{\DeclareDir} +% Having specified the base directory you should tell \ds{} how to +% interpret labels used in |\usedir| commands. This is done with +% |\DeclareDir| with two arguments. The first is the label and the +% second is actual name of directory relative to base +% directory. For example to teach \ds{} using standard em\TeX{} +% directories one would say: +%\begin{verbatim} +% \BaseDirectory{c:/emtex} +% \DeclareDir{tex/latex/base}{texinput/latex2e} +% \DeclareDir{tex/latex/tools}{texinput/tools} +% \DeclareDir{makeindex}{idxstyle} +%\end{verbatim} +% This will cause base latex files and font descriptions to be +% written to directory |c:\emtex\texinput\latex2e|, files of the +% \texttt{tools} package to be written to |c:\emtex\texinput\tools| +% and makeindex files to |c:\emtex\idxstyle|. +% +% Sometimes it is desirable to put some files outside of the base +% directory. For that reason |\DeclareDir| has a star form +% specifying absolute pathname. For example one could say +%\begin{verbatim} +% \DeclareDir*{makeindex}{d:/tools/texindex/styles} +%\end{verbatim} +% +% \DescribeMacro{\UseTDS} +% Users of systems conforming to TDS may well ask here ``do I +% really need to put a dozen of lines like +%\begin{verbatim} +% \DeclareDir{tex/latex/base}{tex/latex/base} +%\end{verbatim} +% in my config file''. The answer is |\UseTDS|. This macro causes +% \ds{} to use labels themselves for any directory you haven't +% overridden with |\DeclareDir|. The default behaviour is to raise +% an error on undefined labels because some users may want to know +% exactly where files go and not to allow \ds{} to write to random +% places. However I (MW) think this is pretty cool and my +% config says just (I'm running te\TeX{} under Linux) +%\begin{verbatim} +% \BaseDirectory{/usr/local/teTeX/texmf} +% \UseTDS +%\end{verbatim} +% +% The important thing to note here is that it is impossible to create +% a new directory from inside \TeX{}. So however you configure +% \ds, you need to create all needed directories before running +% the installation. Authors may want to begin +% every installation script by displaying a list of directories +% that will be used and asking user if he's sure all of them +% exist. +% +% Since file name syntax is OS specific \ds{} tries to guess it +% from the current directory syntax. It should succeed for Unix, +% MSDOS, Macintosh and VMS. However \ds{} will only initially +% know the current directory syntax if it is used with \LaTeX. +% If used with plain\TeX\ or initex it will not have this +% information\footnote{Except when processing the main +% \texttt{unpack.ins} batch file for the \LaTeX\ distribution, which +% takes special measures so that initex can learn the directory +% syntax.}. +% If you often use \ds{} with formats other than \LaTeX\ you should +% \emph{start} the file |docstrip.cfg| with a definition of +% |\WriteToDir|. E.g., +% |\def\WriteToDir{./}| on MSDOS/Unix, +% |\def\WriteToDir{:}| on Macintosh, +% |\def\WriteToDir{[]}| on VMS. +% +% If your system requires something +% completely different you can define in |docstrip.cfg| macros +% |\dirsep| and |\makepathname|. Check for their definition in the +% implementation part. If you want some substantially different +% scheme of translating |\usedir| labels into directory names try +% redefining macro |\usedir|. +% +% \subsection{Setting maximum numbers of streams} +% +% \DescribeMacro{\maxfiles} +% In support of some of the more obscure operating systems, there's +% a limit on the number of files a program can have open. This can +% be expressed to \ds\ through the |\maxfiles| macro. If the number +% of streams \ds\ is allowed to open is $n$, your configuration file +% can say |\maxfiles{|$n$|}|, and \ds\ won't try to open more files +% than this. Note that this limit won't include files which are +% already open. There'll usually be two of these: the installation +% script which you started, and the file |docstrip.tex| which it +% included; you must bear these in mind yourself. \ds\ assumes +% that it can open at least four files before it hits some kind of +% maximum: if this isn't the case, you have real problems. +% +% \DescribeMacro{\maxoutfiles} +% Maybe instead of having a limit on the number of files \TeX\ can +% have open, there's a limit on the number of files it can write +% to (e.g., \TeX\ itself imposes a limit of 16~files being written +% at a time). This can be expressed by saying |\maxoutfiles{|$m$|}| +% in a configuration file. You must be able to have at least one +% output file open at a time; otherwise \ds\ can't do anything at +% all. +% +% Both these options would typically be put in the |docstrip.cfg| +% file. +% +% +% \section{The user interface} +% +% \subsection{The main program} +% \DescribeMacro{\processbatchFile} The `main program' starts with +% trying to process a batch file, this is accomplished by calling +% the macro |\processbatchFile|. It counts the number of batch +% files it processes, so that when the number of files processed is +% still zero after the call to |\processbatchFile| appropriate +% action can be taken. +% +% \DescribeMacro{\interactive} When no batch files have been processed +% the macro |\interactive| is called. It prompts the user for +% information. First the extensions of the input and output files +% is determined. Then a question about optional code is asked and +% finally the user can give a list of files that have to be +% processed. +% +% \DescribeMacro{\ReportTotals} When the \texttt{stats} option is +% included in the \ds{}-program it keeps a record of the number of +% files and lines that are processed. Also the number of comments +% removed and passed as well as the number of code lines that were +% passed to the output are accounted. The macro |\ReportTotals| +% shows a summary of this information. +% +% \subsection{Batchfile commands} +% +% The commands described in this section are available to build a +% batch file for \TeX. +% +% \DescribeMacro{\input} +% All \ds{} batch files should start with the line: |\input docstrip| +% +% Do not use the \LaTeX\ syntax |\input{docstrip}| as batch files may +% be used with plain~\TeX\ or ini\TeX. +% You may find that old batch files always have a line +% |\def\batchfile{|\meta{filename}|}| +% just before the input. +% Such usage is still supported but is now discouraged, as it causes +% \TeX\ to re-input the same file, using up one of its limited number +% of input streams. +% +% \DescribeMacro{\endbatchfile} +% All batch files should end with this command. Any lines after this +% in the file are ignored. In old files that start +% |\def\batchfile{|\ldots\ this command is optional, but is a good +% idea anyway. If this command is omitted from a batchfile then +% normally \TeX\ will go to its interactive |*| prompt, so you may +% stop \ds{} by typing |\endbatchfile| to this prompt. +% +% \DescribeMacro{\generate} +% \DescribeMacro{\file} +% \DescribeMacro{\from} +% The main reason for constructing a \ds{} command file is to +% describe what files should be generated, from what sources and +% what optional (`guarded') pieces of code should be included. The +% macro |\generate| is used to give \TeX\ this information. Its +% syntax is: +% \begin{quote} +% |\generate{|[|\file{|\meta{output}|}{|[|\from{|^^A +% \meta{input}|}{|\meta{optionlist}|}|]*|}|]*|}| +% \end{quote} +% The \meta{output} and \meta{input} are normal file specifications +% as are appropriate for your computer system. The +% \meta{optionlist} is a comma separated list of `options' that +% specify which optional code fragments in \meta{input} should be +% included in \meta{output}. Argument to |\generate| may contain +% some local declarations (e.g., the |\use...| commands described +% below) that will apply to all |\file|s after them. Argument to +% |\generate| is executed inside a group, so all local declarations +% are undone when |\generate| concludes. +% +% It is possible to specify multiple input files, each with its own +% \meta{optionlist}. This is indicated by the notation [\ldots]*. +% Moreover there can be many |\file| specifications in one +% |\generate| clause. This means that all these \meta{output} files +% should be generated while reading each of \meta{input} files +% once. Input files are read in order of first appearance in this +% clause. E.g. +%\begin{verbatim} +% \generate{\file{p1.sty}{\from{s1.dtx}{foo,bar}} +% \file{p2.sty}{\from{s2.dtx}{baz} +% \from{s3.dtx}{baz}} +% \file{p3.sty}{\from{s1.dtx}{zip} +% \from{s2.dtx}{zip}} +% } +%\end{verbatim} +% will cause \ds{} to read files \texttt{s1.dtx}, \texttt{s2.dtx}, +% \texttt{s3.dtx} (in that order) and produce files +% \texttt{p1.sty}, \texttt{p2.sty}, \texttt{p3.sty}. +% +% The restriction to at most 16 output streams open in a while +% does not mean that you can produce at most 16 files with one +% |\generate|. In the example above only 2 streams are needed, +% since while \texttt{s1.dtx} is processed only \texttt{p1.sty} and +% \texttt{p3.sty} are being generated; while reading +% \texttt{s2.dtx} only \texttt{p2.sty} and \texttt{p3.sty}; and +% while reading \texttt{s3.dtx} file \texttt{p2.sty} . However +% example below needs 3 streams: +%\begin{verbatim} +% \generate{\file{p1.sty}{\from{s1.dtx}{foo,bar}} +% \file{p2.sty}{\from{s2.dtx}{baz} +% \from{s3.dtx}{baz}} +% \file{p3.sty}{\from{s1.dtx}{zip} +% \from{s3.dtx}{zip}} +% } +%\end{verbatim} +% Although while reading \texttt{s2.dtx} file \texttt{p3.sty} is +% not written it must remain open since some parts of +% \texttt{s3.dtx} will go to it later. +% +% Sometimes it is not possible to create a file by reading all +% sources once. Consider the following example: +%\begin{verbatim} +% \generate{\file{p1.sty}{\from{s1.dtx}{head} +% \from{s2.dtx}{foo} +% \from{s1.dtx}{tail}} +% \file{s1.drv}{\from{s1.dtx}{driver}} +% } +%\end{verbatim} +% To generate \texttt{p1.sty} file \texttt{s1.dtx} must be read +% twice: first time with option \texttt{head}, then file +% \texttt{s2.dtx} is read and then \texttt{s1.dtx} again this time +% with option \texttt{tail}. \ds{} handles this case correctly: if +% inside one |\file| declaration there are multiple |\from|es with +% the same input file this file \emph{is} read multiple times. +% +% If the order of |\from|s specified in one of your |\file| +% specifications does not match the order of input files +% established by previous |\file|s, \ds{} will raise an error and +% abort. Then you may either read one of next sections or give up +% and put that file in separate |\generate| (but then sources will +% be read again just for that file). +% +% \paragraph{For impatient.} Try following algorithm: Find +% file that is generated from largest number of sources, start +% writing |\generate| clause with this file and its sources in +% proper order. Take other files that are to be generated and add +% them checking if they don't contradict order of sources for the +% first one. If this doesn't work read next sections. +% +% \paragraph{For mathematicians.} Relation ``file $A$ must be +% read before file $B$'' is a partial order on the set of all your +% source files. Each |\from| clause adds a chain to this order. +% What you have to do is to perform a topological sort i.e. to +% extend partial order to linear one. When you have done it just +% list your source files in |\generate| in such a way that order of +% their first appearance in the clause matches linear order. If +% this cannot be achieved read next paragraph. (Maybe future +% versions of \ds{} will perform this sort automatically, so all +% these troubles will disappear.) +% +% \paragraph{For that who must know that all.} There is a +% diverse case when it's not possible to achieve proper order of +% reading source files. Suppose you have to generate two files, +% first from \texttt{s1.dtx} and \texttt{s3.dtx} (in that order) +% and second from \texttt{s2.dtx} and \texttt{s3.dtx}. Whatever +% way you specify this the files will be read in either as +% \texttt{s1 s3 s2} or \texttt{s2 s3 s1}. The key to solution is +% magical macro |\needed| that marks a file as needed to be input +% but not directing any output from it to current |\file|. In our +% example proper specification is: +%\begin{verbatim} +% \generate{\file{p1.sty}{\from{s1.dtx}{foo} +% \needed{s2.dtx} +% \from{s3.dtx}{bar}} +% \file{p2.sty}{\from{s2.dtx}{zip} +% \from{s3.dtx}{zap}} +% } +%\end{verbatim} +% +% +% \DescribeMacro{\askforoverwritetrue} +% \DescribeMacro{\askforoverwritefalse} +% These macros specify what should happen if a file that is to be +% generated already exists. If |\askforoverwritetrue| is active +% (the default) the user is asked whether the file should be +% overwritten. If however |\askforoverwritefalse| was issued +% existing files will be overwritten silently. These switches are +% local and can be issued in any place in the file even inside +% |\generate| clause (between |\file|s however). +% +% \DescribeMacro{\askonceonly} +% You might not want to set |\askforoverwritefalse| in a batch file +% as that says that it us always all right to overwrite other people's +% files. However for large installations, such as the base \LaTeX\ +% distribution, being asked individually about hundreds of files +% is not very helpful either. A batchfile may therefore specify +% |\askonceonly|. This means that after the first time the batchfile +% asks the user a question, the user is given an option of to change +% the behaviour so that `yes' will be automatically assumed for all +% future questions. This applies to any use of the \ds{} command +% |\Ask| including, but not restricted to, the file overwrite +% questions controlled by |\askforoverwritetrue|. +% +% \DescribeMacro{\preamble} +% \DescribeMacro{\endpreamble} +% \DescribeMacro{\postamble} +% \DescribeMacro{\endpostamble} +% It is possible to add a number of lines to the output of the +% \ds{} program. The information you want to add to the start of +% the output file should be listed between the |\preamble| and +% |\endpreamble| commands; the lines you want to add to the end of +% the output file should be listed between the |\postamble| and +% |\endpostamble| commands. Everything that \ds{} finds for both +% the pre- and postamble it writes to the output file, but preceded +% with value of |\MetaPrefix| (default is two \%-characters). If +% you include a |^^J| character in one of these lines, everything +% that follows it on the same line is written to a new line in the +% output file. This `feature' can be used to add a |\typeout| or +% |\message| to the stripped file. +% +% \DescribeMacro{\declarepreamble} +% \DescribeMacro{\declarepostamble} +% \DescribeMacro{\usepreamble} +% \DescribeMacro{\usepostamble} +% \DescribeMacro{\nopreamble} +% \DescribeMacro{\nopostamble} +% Sometimes it is desirable to have different preambles for different +% files of a larger package (e.g., because some of them are +% customisable configuration files and they should be marked as +% such). In such a case one can say |\declarepreamble\somename|, +% then type in his/her preamble, end it with |\endpreamble|, +% and later on |\usepreamble\somename| to switch to this +% preamble. +% If no preamble should be used you can deploy the |\nopreamble| +% command. This command is equivalent to saying |\usepreamble\empty|. +% The same mechanism works for postambles, |\use...| +% declarations are local and can appear inside |\generate|. +% +% Commands |\preamble| and |\postamble| define and activate +% pre(post)ambles named |\defaultpreamble| and |\defaultpostamble|. +% +% \DescribeMacro{\batchinput} +% The batch file commands can be put into several batch files which +% are then executed from a master batch file. This is, for example, +% useful if a distribution consists of several distinct parts. You +% can then write individual batch files for every part and in +% addition a master file that simply calls the batch files for the +% parts. For this, call the individual batch files from the master +% file with the command |\batchinput{|\meta{file}|}|. Don't use +% |\input| for this purpose, this command +% should be used only for calling the \ds{} program as explained +% above and is ignored when used for any other purpose. +% +% \DescribeMacro{\ifToplevel} +% When batch files are nested you may want to suppress certain +% commands in the lower-level batch files such as terminal +% messages. For this purpose you can use the |\ifToplevel| command +% which executes its argument only if the current batch file is the +% outermost one. Make sure that you put the opening brace of the +% argument into the same line as the command itself, otherwise the +% \ds{} program will get confused. +% +% \DescribeMacro{\showprogress} +% \DescribeMacro{\keepsilent} +% When the option \texttt{stats} is included in \ds{} it can +% write message to the terminal as each line of the input file(s) is +% processed. This message consists of a single character, indicating +% kind of that particular line. We use the +% following characters: +% \begin{itemize} +% \item[\texttt{\%}] Whenever an input line is a comment +% \texttt{\%}-character is written to the terminal. +% \item[\texttt{.}] Whenever a code line is encountered +% a \texttt{.}-character is written on the terminal. +% \item[\texttt{/}] When a number of empty lines appear in a row in the +% input file, at most one of them is retained. The \ds{} +% program signals the removal of an empty line with the +% \texttt{/}-character. +% \item[\texttt{<}] When a `guard line' is found in the input and it +% starts a block of optionally included code, this is signalled +% on the terminal by showing the \texttt{<}-character, together +% with the boolean expression of the guard. +% \item[\texttt{>}] The end of a conditionally included block of code is +% indicated by showing the \texttt{>}-character. +% \end{itemize} +% This feature is turned on by default when the option +% \texttt{stats} is included, otherwise it is turned off. The +% feature can be toggled with the commands |\showprogress| and +% |\keepsilent|. +% +% +% \subsubsection{Supporting old interface} +% +% \DescribeMacro{\generateFile} +% Here is the old syntax for specifying what files are to be +% generated. It allows specification of just one output file. +% \begin{quote} +% |\generateFile{|\meta{output}|}{|\meta{ask}|}{|[|\from{|^^A +% \meta{input}|}{|\meta{optionlist}|}|]*|}| +% \end{quote} +% The meaning of \meta{output}, \meta{input} and +% \meta{optionslist} is just as for |\generate|. With +% \meta{ask} you can instruct \TeX\ to either silently overwrite a +% previously existing file (|f|) or to issue a warning and ask you +% if it should overwrite the existing file (|t|) (it overrides the +% |\askforoverwrite| setting). +% +% \DescribeMacro{\include} +% \DescribeMacro{\processFile} +% The earlier version of the \ds{} program supported a +% different kind of command to tell \TeX\ what to do. This command +% is less powerful than |\generateFile|; it can be used when +% \meta{output} is created from one \meta{input}. The syntax is: +% \begin{quote} +% |\include{|\meta{optionlist}|}| +% +% |\processFile{|\meta{name}|}{|\meta{inext}^^A +% |}{|\meta{outext}^^A +% |}{|\meta{ask}|}| +% \end{quote} +% This command is based on environments where filenames are +% constructed of two parts, the name and the extension, separated +% with a dot. The syntax of this command assumes that the +% \meta{input} and \meta{output} share the same name and only +% differ in their extension. This command is retained to be +% backwards compatible with the older version of \ds{}, but its use +% is not encouraged. +% +% \section{Conditional inclusion of code} +% +% When you use the \ds{} program to strip comments out of +% \TeX\ macro files you have the possibility to make more than one +% stripped macro file from one documented file. This is achieved by +% the support for optional code. The optional code is marked +% in the documented file with a `guard'. +% +% A guard is a boolean expression that is enclosed in |<| and |>|. +% It also {\em has\/} to follow the |%| at the beginning of the line. +% For example: +%\begin{verbatim} +% ... +% %<bool>\TeX code +% ... +%\end{verbatim} +% In this example the line of code will be included in \meta{output} +% if the option \texttt{bool} is present in the \meta{optionlist} of +% the |\generateFile| command. +% +% The syntax for the boolean expressions is: +% +%\DeleteShortVerb\| +% \begin{tabular}{lcl} +% \meta{Expression} & $::=$ & \meta{Secondary} +% [\{\texttt{|}, \texttt{,}\} +% \meta{Secondary}]*\\ +% \meta{Secondary} & $::=$ & +% \meta{Primary} [\texttt{\&} +% \meta{Primary}]*\\ +% \meta{Primary} & $::=$ & +% \meta{Terminal} $|$ \texttt{!}\meta{Primary} +% $|$ \texttt{(}\meta{Expression}\texttt{)}\\ +% \end{tabular} +% +% The \texttt{|} stands for disjunction, the \texttt{\&} stands for +% conjunction and the \texttt{!}\ stands for negation. The +% \meta{Terminal} is any sequence of letters and evaluates to +% \meta{true} iff\footnote{iff stands for `if and only if'} it +% occurs in the list of options that have to be included. +%\MakeShortVerb\| +% +% Two kinds of optional code are supported: one can either have +% optional code that `fits' on one line of text, like the example +% above, or one can have blocks of optional code. +% +% To distinguish both kinds of optional code the `guard modifier' +% has been introduced. The `guard modifier' is one character that +% immediately follows the |<| of the guard. It can be either |*| +% for the beginning of a block of code, or |/| for the end of a +% block of code\footnote{To be compatible with the earlier version +% of \ds{} also \texttt{+} and \texttt{-} are supported as `guard +% modifiers'. However, there is an incompatibility with the +% earlier version since a line with a \texttt{+}-modified guard is +% not included inside a block with a guard that evaluates to false, +% in contrast to the previous behaviour.}. The beginning and +% ending guards for a block of code have to be on a line by +% themselves. +% +% When a block of code is {\em not\/} included, any guards that occur +% within that block are {\em not\/} evaluated. +% +% \section{Those other languages} +% Since \TeX\ is an open system some of \TeX\ packages include +% non-\TeX\ files. Some authors use \ds\ to generate PostScript +% headers, shell scripts or programs in other languages. For them +% the comments-stripping activity of \ds\ may cause some +% trouble. This section describes how to produce non-\TeX\ files +% with \ds\ effectively. +% +% \subsection{Stuff \ds\ puts in every file} +% First problem when producing files in ``other'' languages is that +% \ds\ adds some bits to the beginning and end of every generated +% file that may not fit with the syntax of the language in +% question. So we'll study carefully what exactly goes where. +% +% The whole text put on beginning of file is kept in a macro defined +% by |\declarepreamble|. Every line of input presented to +% |\declarepreamble| is prepended with current value of +% |\MetaPrefix|. Standard \ds\ header is inserted before your text, +% and macros |\inFileName|, |\outFileName| and |\ReferenceLines| +% are used as placeholders for information which will be filled in +% later (specifically for each output file). Don't try to redefine +% these macros. After +%\begin{verbatim} +% \declarepreamble\foo +% ____________________________ +% Package FOO for use with TeX +% \endpreamble +%\end{verbatim} +% macro |\foo| is defined as +%\begin{verbatim} +% %%^^J +% %% This is file `\outFileName ',^^J +% %% generated with the docstrip utility.^^J +% \ReferenceLines^^J +% %% ____________________________^^J +% %% Package FOO for use with TeX. +%\end{verbatim} +% You can play with it freely or even define it from scratch. To +% embed the preamble in Adobe structured comments just use |\edef|: +%\begin{verbatim} +% \edef\foo{\perCent!PS-Adobe-3.0^^J% +% \DoubleperCent\space Title: \outFileName^^J% +% \foo^^J% +% \DoubleperCent\space EndComments} +%\end{verbatim} +% After that use |\usepreamble\foo| to select your new preamble. +% Everything above works as well for postambles. +% +% You may also prevent \ds\ from adding anything to your file, and +% put any language specific invocations directly in your code: +%\begin{verbatim} +% \generate{\usepreamble\empty +% \usepostamble\empty +% \file{foo.ps}{\from{mypackage.dtx}{ps}}} +%\end{verbatim} +% or alternatively |\nopreamble| and |\nopostamble|. +% +% \subsection{Meta comments} +% You can change the prefix used for putting meta comments to +% output files by redefining |\MetaPrefix|. Its default value is +% |\DoubleperCent|. The preamble uses value of |\MetaPrefix| +% current at time of |\declarepreamble| while meta comments in the +% source file use value current at time of |\generate|. Note that +% this means that you cannot produce concurrently two files using +% different |\MetaPrefix|es. +% +% \subsection{Verbatim mode} +% If your programming language uses some construct that can +% interferes badly with \ds\ (e.g., percent in column one) you may +% need a way for preventing it from being stripped off. For that +% purpose \ds\ features `verbatim mode'. +% +% A `Guard expression' of the form |%<<|\meta{END-TAG} marks +% the start of a section that will be copied verbatim upto a line +% containing only a percent in column 1 followed by \meta{END-TAG}. +% You can select any \meta{END-TAG} you want, but note that spaces +% count here. Example: +%\begin{verbatim} +% %<*myblock> +% some stupid() +% #computer<program> +% %<<COMMENT +% % These two lines are copied verbatim (including percents +% %% even if \MetaPrefix is something different than %%). +% %COMMENT +% using*strange@programming<language> +% %</myblock> +%\end{verbatim} +% And the output is (when stripped with \texttt{myblock} defined): +%\begin{verbatim} +% some stupid() +% #computer<program> +% % These two lines are copied verbatim (including percents +% %% even if \MetaPrefix is something different than %%). +% using*strange@programming<language> +%\end{verbatim} +% +%\StopEventually{% +%^^A \section{Conclusion} +% \PrintIndex +% \PrintChanges +%^^A \makesignature +% } +% +% \section{Producing the documentation} +% +% We provide a short driver file that can be extracted by the +% \ds{} program using the conditional `\textsf{driver}'. To +% allow the use of \texttt{docstrip.dtx} as a program at Ini\TeX{} +% time (e.g., to strip +% off its own comments) we need to add a bit of primitive code. +% With this extra checking it is still possible to process this +% file with \LaTeXe{} to typeset the documentation. +% \changes{2.1b}{1993/02/23}{Added fontdefinitions for doc to the driver +% file, in order to get the layout of the code +% right; also added the layout definitions +% that are in effect in \texttt{doc.drv}} +% \changes{2.1c}{1993/02/23}{Remove definitions for fonts again} +% \changes{2.2f}{1994/02/26}{Allow direct processing of source} +% \begin{macrocode} +%<*driver> +% \end{macrocode} +% If |\documentclass| is undefined, e.g., if Ini\TeX{} or plain +% \TeX{} is used for formatting, we bypass the driver file. +% +% \changes{2.3a}{1995/08/20}{Changed driver} +% We use some trickery to avoid issuing |\end{document}| when +% the |\ifx| construction is unfinished. If condition below is +% true a |\fi| is constructed on the fly, the |\ifx| is completed, +% and the real |\fi| will never be seen as it comes after +% |\end{document}|. On the other hand if condition is false +% \TeX\ skips over |\csname fi\endcsname| having no idea that +% this could stand for |\fi|, driver is skipped and only then +% the condition completed. +% +% Additional guard |gobble| prevents \ds\ from extracting +% these tricks to real driver file. +% \begin{macrocode} +%<*gobble> +\ifx\jobname\relax\let\documentclass\undefined\fi +\ifx\documentclass\undefined +\else \csname fi\endcsname +%</gobble> +% \end{macrocode} +% Otherwise we process the following lines which will result in +% formatting the documentation. +% \begin{macrocode} + \documentclass{ltxdoc} + \EnableCrossrefs + % \DisableCrossrefs + % use \DisableCrossrefs if the + % index is ready + \RecordChanges + % \OnlyDescription + \typeout{Expect some Under- and overfull boxes} + \begin{document} + \DocInput{docstrip.dtx} + \end{document} +%<*gobble> +\fi +%</gobble> +%</driver> +% \end{macrocode} +% +% +% \section{The implementation} +% +% \subsection{Initex initializations} +% Allow this program to run with |initex|. +% The |Z| trickery saves the need to worry about |\outer| stuff in +% plain \TeX. +% \begin{macrocode} +%<*initex> +\catcode`\Z=\catcode`\% +\ifnum13=\catcode`\~{\egroup\else + \catcode`\Z=9 +Z +Z \catcode`\{=1 \catcode`\}=2 +Z \catcode`\#=6 \catcode`\^=7 +Z \catcode`\@=11 \catcode`\^^L=13 +Z \let\bgroup={ \let\egroup=} +Z +Z \dimendef\z@=10 \z@=0pt \chardef\@ne=1 \countdef\m@ne=22 \m@ne=-1 +Z \countdef\count@=255 +Z +Z \def\wlog{\immediate\write\m@ne} \def\space{ } +Z +Z \count10=22 % allocates \count registers 23, 24, ... +Z \count15=9 % allocates \toks registers 10, 11, ... +Z \count16=-1 % allocates input streams 0, 1, ... +Z \count17=-1 % allocates output streams 0, 1, ... +Z +Z \def\alloc@#1#2#3{\advance\count1#1\@ne#2#3\count1#1\relax} +Z +Z \def\newcount{\alloc@0\countdef} \def\newtoks{\alloc@5\toksdef} +Z \def\newread{\alloc@6\chardef} \def\newwrite{\alloc@7\chardef} +Z +Z \def\newif#1{% +Z \count@\escapechar \escapechar\m@ne +Z \let#1\iffalse +Z \@if#1\iftrue +Z \@if#1\iffalse +Z \escapechar\count@} +Z \def\@if#1#2{% +Z \expandafter\def\csname\expandafter\@gobbletwo\string#1% +Z \expandafter\@gobbletwo\string#2\endcsname +Z {\let#1#2}} +Z +Z \def\@gobbletwo#1#2{} +Z \def\@gobblethree#1#2#3{} +Z +Z \def\loop#1\repeat{\def\body{#1}\iterate} +Z \def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +Z \let\repeat\fi +Z +Z \def\empty{} +Z +Z \def\tracingall{\tracingcommands2 \tracingstats2 +Z \tracingpages1 \tracingoutput1 \tracinglostchars1 +Z \tracingmacros2 \tracingparagraphs1 \tracingrestores1 +Z \showboxbreadth 10000 \showboxdepth 10000 \errorstopmode +Z \errorcontextlines 10000 \tracingonline1 } +Z +\bgroup}\fi\catcode`\Z=11 +\let\bgroup={ \let\egroup=} +%</initex> +% \end{macrocode} +% +% \subsection{Declarations and initializations} +% +% In order to be able to include the \texttt{@}-sign in control +% sequences its category code is changed to \meta{letter}. The +% `program' guard here allows most of the code to be excluded when +% extracting the driver file. +% \begin{macrocode} +%<*program> +\catcode`\@=11 +% \end{macrocode} +% +% When we want to write multiple lines to the terminal with one +% statement, we need a character that tells \TeX\ to break the lines. +% We use \verb=^^J= for this purpose. +% \begin{macrocode} +\newlinechar=`\^^J +% \end{macrocode} +% +% \changes{2.58}{2018/05/03}{Read 8bit raw to leave high bits in the +% .ins files unchanged} +% Reset the catcodes of 8-bit characters so that processing a \texttt{.ins} +% file with plain \TeX\ or \LaTeX\ both work. +% \begin{macrocode} +\count@=128\relax +\loop + \catcode\count@ 12\relax +\ifnum\count@ <255\relax + \advance\count@\@ne +\repeat +% \end{macrocode} +% +% \subsubsection{Switches} +% \begin{macro}{\ifGenerate} +% The program will check if a +% file of the same name as the file it would be creating already +% exists. The switch |\ifGenerate| is used to indicate if the +% stripped file has to be generated. +% \begin{macrocode} +\newif\ifGenerate +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifContinue} +% The switch |\ifContinue| is used in various places in the +% program to indicate if a |\loop| has to end. +% \begin{macrocode} +\newif\ifContinue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifForlist} +% \changes{2.0g}{1991/06/05}{Macro added.} +% The program contains an implementation of a for-loop, based on +% plain \TeX{}'s |\loop| macros. The implementation needs a +% switch to terminate the loop. +% \begin{macrocode} +\newif\ifForlist +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifDefault} +% The switch |\ifDefault| is used to indicate whether the +% default batch file has to be used. +% \changes{2.0f}{1991/06/04}{Macro added.} +% \begin{macrocode} +\newif\ifDefault +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifMoreFiles} +% The switch |\ifMoreFiles| is used to decide if the user +% wants more files to be processed. It is used only in interactive +% mode; initially it evaluates to \meta{true}. +% \changes{2.0h}{1991/06/19}{Macro added.} +% \begin{macrocode} +\newif\ifMoreFiles \MoreFilestrue +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ifaskforoverwrite} +% The switch |\askforoverwrite| is used to decide if the user +% should be asked when a file is to be overwritten. +% \begin{macrocode} +\newif\ifaskforoverwrite \askforoverwritetrue +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Count registers} +% \begin{macro}{\blockLevel} +% Optionally included blocks of code can be nested. The counter +% |\blockLevel| will be used to keep track of the level of +% nesting. Its initial value is zero. +% \begin{macrocode} +\newcount\blockLevel \blockLevel\z@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\emptyLines} +% The count register |\emptyLines| is used to count the number +% of consecutive empty input lines. Only the first will be copied +% to the output file. +% \changes{2.0i}{1990/06/27}{Macro added} +% \begin{macrocode} +\newcount\emptyLines \emptyLines \z@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\processedLines} +% \begin{macro}{\commentsRemoved} +% \begin{macro}{\commentsPassed} +% \begin{macro}{\codeLinesPassed} +% To be able to provide the user with some statistics about the +% stripping process four counters are allocated if the statistics +% have been included when this program was \ds{}ped. The number of +% lines processed is stored in the counter |\processedLines|. +% The number of lines containing comments that are not written on +% the output file is stored in the counter |\commentsRemoved|; +% the number of comments copied to the output file is stored in the +% counter |\commentsPassed|. The number of lines containing +% macro code that are copied to the output file is stored in the +% counter |\codeLinesPassed|. +% \begin{macrocode} +%<*stats> +\newcount\processedLines \processedLines \z@ +\newcount\commentsRemoved \commentsRemoved \z@ +\newcount\commentsPassed \commentsPassed \z@ +\newcount\codeLinesPassed \codeLinesPassed \z@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{2.0e}{1991/05/31}{Added counter allocation for the processing +% of multiple files} +% \begin{macro}{\TotalprocessedLines} +% \begin{macro}{\TotalcommentsRemoved} +% \begin{macro}{\TotalcommentsPassed} +% \begin{macro}{\TotalcodeLinesPassed} +% When more than one file is processed and when statistics have +% been included we provide the user also with information about the +% total amount of lines processed. For this purpose four more count +% registers are allocated here. +% \begin{macrocode} +\newcount\TotalprocessedLines \TotalprocessedLines \z@ +\newcount\TotalcommentsRemoved \TotalcommentsRemoved \z@ +\newcount\TotalcommentsPassed \TotalcommentsPassed \z@ +\newcount\TotalcodeLinesPassed \TotalcodeLinesPassed \z@ +%</stats> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\NumberOfFiles} +% When more than one file is processed, the number of files is +% stored in the count register |\NumberOfFiles|. +% \changes{2.4h}{1997/07/07}{Declare counter always pr/2429} +% \begin{macrocode} +\newcount\NumberOfFiles \NumberOfFiles\z@ +% \end{macrocode} +% \end{macro} +% +% \subsubsection{I/O streams} +% \begin{macro}{\inFile} +% For reading the file with documented \TeX-code, an input stream +% |\inFile| is allocated. +% \begin{macrocode} +\newread\inFile +% \end{macrocode} +% \end{macro} +% +% \changes{2.3a}{1995/08/18}{No allocated streams for console} +% \begin{macro}{\ttyin} +% \begin{macro}{\ttyout} +% Communication with the user goes through (nonexistent) stream 16. +% \begin{macrocode} +\chardef\ttyin16 +\chardef\ttyout16 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\inputcheck} +% This stream is only used for checking for existence of files. +% \begin{macrocode} +\newread\inputcheck +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifToplevel} +% Execute the argument if current batch file is the outermost one. +% Otherwise suppress it. +% \begin{macrocode} +\newif\iftopbatchfile \topbatchfiletrue +\def\ifToplevel{\relax\iftopbatchfile + \expandafter\iden \else \expandafter\@gobble\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\batchinput} +% \changes{2.0n}{1992/04/26}{Added macro} +% \changes{2.1a}{1993/02/22}{Completely redefined (so that it works)} +% +% When the file \texttt{docstrip.tex} is read because of an +% |\input| statement in a batch file we have to prevent an +% endless loop (well, limited by \TeX's stack). Therefore we save +% the original primitive |\input| and define a new macro with +% an argument delimited by \verb*= = (i.e.\ a space) that just +% gobbles the argument. Since the end-of-line character is +% converted by \TeX{} to a space. This means that |\input| is not +% available as a command within batch files. +% +% \begin{macro}{\@@input} +% \changes{2.1a}{1993/02/22}{Macro added} +% We therefore keep a copy of the original under the name +% |\@@input| for internal use. If \ds{} runs under \LaTeX{} this +% command is already defined, so we make a quick test. +% \begin{macrocode} +\ifx\undefined\@@input \let\@@input\input\fi +% \end{macrocode} +% \end{macro} +% +% To allow the nesting of batch files the |\batchinput| command is +% provided it takes one argument, the name of the batch file to +% switch to. +% \begin{macrocode} +\def\batchinput#1{% +% \end{macrocode} +% We start a new group and locally redefine |\batchFile| to hold +% the new batch file name. We toggle the |\iftopbatchfile| switch +% since this definitely is not top batch file. +% \begin{macrocode} + \begingroup + \def\batchfile{#1}% + \topbatchfilefalse + \Defaultfalse + \usepreamble\org@preamble + \usepostamble\org@postamble + \let\destdir\WriteToDir +% \end{macrocode} +% After this we can simply call |\processbatchFile| which will +% open the new batch file and read it until it +% is exhausted. Note that if the batch file is not available, or +% misspelled this routine will produce a warning and return. +% \begin{macrocode} + \processbatchFile +% \end{macrocode} +% The value of |\batchfile| as well as local definitions of +% preambles, directories etc. will be restored +% at this closing |\endgroup|, so that further processing +% continues in the calling batch file. +% \begin{macrocode} + \endgroup +} +% \end{macrocode} +% \begin{macro}{\skip@input} +% \changes{2.0j}{1992/03/03}{Added macro} +% \changes{2.0n}{1992/04/26}{Argument delimited by space not \cs{relax}} +% \changes{2.0n}{1992/04/26}{Macro renamed from \cs{skipinput}} +% And here is the promised redefinition of |\input|: +% \begin{macrocode} +\def\skip@input#1 {} +\let\input\skip@input +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Empty macros and macros that expand to a string} +% \begin{macro}{\guardStack} +% \changes{2.0k}{1992/04/06}{Renamed from \texttt{\bsl blockStack}} +% Because blocks of code that will conditionally be included in the +% output can be nested, a stack is maintained to keep track of +% these blocks. The main reason for this is that we want to be able +% to check if the blocks are properly nested. The stack itself is +% stored in |\guardStack|. +% \begin{macrocode} +\def\guardStack{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\blockHead} +% The macro |\blockHead| is used for storing and retrieving +% the boolean expression that starts a block. +% \begin{macrocode} +\def\blockHead{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\yes} +% \begin{macro}{\y} +% When the user is asked a question that he has to answer with either +% \meta{yes} or \meta{no}, his response has to be evaluated. For this +% reason the macros |\yes| and |\y| are defined. +% \begin{macrocode} +\def\yes{yes} +\def\y{y} +% \end{macrocode} +% \begin{macro}{\n} +% We also define |\n| for use in \ds{} command files. +% \changes{2.1e}{1993/03/09}{Macro added} +% \begin{macrocode} +\def\n{n} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Defaultbatchile} +% \changes{2.0f}{1991/06/04}{Macro added.} +% When the \ds{} program has to process a batch file it +% can look for a batch file with a default name. This name +% is stored in |\DefaultbatchFile|. +% \begin{macrocode} +\def\DefaultbatchFile{docstrip.cmd} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\perCent} +% \begin{macro}{\DoubleperCent} +% \begin{macro}{\MetaPrefix} +% To be able to display percent-signs on the terminal, a +% \texttt{\%} with category code 12 is stored in |\perCent| and +% |\DoubleperCent|. The macro |\MetaPrefix| is put on beginning of +% every meta-comment line. It is defined indirect way since some +% applications need redefining it. +% \begin{macrocode} +{\catcode`\%=12 + \gdef\perCent{%} + \gdef\DoubleperCent{%%} +} +\let\MetaPrefix\DoubleperCent +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% In order to allow formfeeds in the input we define a one-character +% control sequence \verb=^^L=. +% \begin{macrocode} +\def^^L{ } +% \end{macrocode} +% +% The only result of using |\Name| is slowing down execution since +% its typical use (e.g., |\Name\def{foo bar}...|) has exactly the +% same number of tokens as its expansion. However I think that it's +% easier to read. The meaning of |\Name| as a black box is: +% ``construct a name from second parameter and then pass it to your +% first parameter as a parameter''. +% +% |\@stripstring| is used to get tokens building name of a macro +% without leading backslash. +% \begin{macrocode} +\def\Name#1#2{\expandafter#1\csname#2\endcsname} +\def\@stripstring{\expandafter\@gobble\string} +% \end{macrocode} +% +% \subsubsection{Miscellaneous variables} +% \begin{macro}{\sourceFileName} +% The macro |\sourceFileName| is used to store the name of the +% current input file. +% \end{macro} +% \begin{macro}{\batchfile} +% The macro |\batchfile| is used to store the name of the +% batch file. +% \end{macro} +% \begin{macro}{\inLine} +% The macro |\inLine| is used to store the lines, read from +% the input file, before further processing. +% \end{macro} +% \begin{macro}{\answer} +% When some interaction with the user is needed the macro +% |\answer| is used to store his response. +% \end{macro} +% \begin{macro}{\tmp} +% Sometimes something has to be temporarily stored in a control +% sequence. For these purposes the control sequence |\tmp| is +% used. +% \end{macro} +% +% \subsection{Support macros} +% \subsubsection{The stack mechanism} +% +% It is possible to have `nested guards'. This means that within a +% block of optionally included code a subgroup is only included +% when an additional option is specified. To keep track of the +% nesting of the guards the currently `open' guard can be pushed on +% the stack |\guardStack| and later popped off the stack again. The +% macros that implement this stack mechanism are loosely based on +% code that is developed in the context of the \LaTeX3 project. +% +% To be able to implement a stack mechanism we need a couple of +% support macros. +% \begin{macro}{\eltStart} +% \changes{2.0k}{1992/04/06}{Macro added} +% \begin{macro}{\eltEnd} +% \changes{2.0k}{1992/04/06}{Macro added} +% The macros |\eltStart| and |\eltEnd| are used to delimit a stack +% element. They are both empty. +% \begin{macrocode} +\def\eltStart{} +\def\eltEnd{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\qStop} +% \changes{2.0k}{1992/04/06}{Macro added} +% The macro |\qStop| is a so-called `quark', a macro that expands to +% itself\footnote{The concept of `quarks' is developed for the +% \LaTeX3 project.}. +% \begin{macrocode} +\def\qStop{\qStop} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pop} +% \changes{2.0k}{1992/04/06}{Macro added} The macro +% |\pop|\meta{stack}\meta{cs} `pops' the top element from the +% stack. It assigns the value of the top element to \meta{cs} and +% removes it from \meta{stack}. When \meta{stack} is empty a +% warning is issued and \meta{cs} is assigned an empty value. +% \begin{macrocode} +\def\pop#1#2{% + \ifx#1\empty + \Msg{Warning: Found end guard without matching begin}% + \let#2\empty + \else +% \end{macrocode} +% To be able to `peel' off the first guard we use an extra macro +% |\popX| that receives both the expanded and the unexpanded stack +% in its arguments. The expanded stack is delimited with the quark +% |\qStop|. +% \begin{macrocode} + \def\tmp{\expandafter\popX #1\qStop #1#2}% + \expandafter\tmp\fi} +% \end{macrocode} +% \begin{macro}{\popX} +% \changes{2.0k}{1992/04/06}{Macro added} When the stack is expanded +% the elements are surrounded with |\eltStart| and |\eltEnd|. The +% first element of the stack is assigned to |#4|. +% \begin{macrocode} +\def\popX\eltStart #1\eltEnd #2\qStop #3#4{\def#3{#2}\def#4{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\push} +% \changes{2.0k}{1992/04/06}{Macro added} +% Guards can be pushed on the stack using the macro +% |\push|\meta{stack}\meta{guard}. Again we need a secondary macro +% (|\pushX|) that has both the expanded and the unexpanded stack as +% arguments. +% \begin{macrocode} +\def\push#1#2{\expandafter\pushX #1\qStop #1{\eltStart #2\eltEnd}} +% \end{macrocode} +% \begin{macro}{\pushX} +% \changes{2.0k}{1992/04/06}{Macro added} +% The macro |\pushX| picks up the complete expansion of the stack as +% its first argument and places the guard in |#3| on the `top'. +% \begin{macrocode} +\def\pushX #1\qStop #2#3{\def #2{#3#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Programming structures} +% +% \begin{macro}{\forlist} +% \changes{2.0g}{1991/06/05}{Macro added.} +% When the program is used in interactive mode the +% user can supply a list of files that have to be processed. +% In order to process this list a for-loop is needed. This +% implementation of such a programming construct is based on the +% use of the \verb=\loop{=\meta{body}\verb=}\repeat= macro that +% is defined in plain \TeX\@. The syntax for this loop is: +% \begin{flushleft} +% |\for|\meta{control sequence} |:=| \meta{list} +% |\do|\\ +% \meta{body}\\ +% |\od| +% \end{flushleft} +% The \meta{list} should be a comma separated list. +% +% The first actions that have to be taken are to set the switch +% |\ifForlist| to \meta{true} and to store the loop condition +% in the macro |\ListCondition|. This is done using an +% |\edef| to allow for a control sequence that contains a +% \meta{list}. +% \begin{macrocode} +\def\forlist#1:=#2\do#3\od{% + \edef\ListCondition{#2}% + \Forlisttrue +% \end{macrocode} +% Then we start the loop. +% We store the first element from the |\ListCondition| in the +% macro that was supplied as the first argument to |\forlist|. +% This element is then removed from the |\ListCondition|. +% \begin{macrocode} + \loop + \edef#1{\expandafter\FirstElt\ListCondition,\empty.}% + \edef\ListCondition{\expandafter\OtherElts\ListCondition,\empty.}% +% \end{macrocode} +% When the first element from the \meta{list} is empty, we are done +% processing, so we switch |\ifForlist| to \meta{false}. +% When it is not empty we execute the third argument that should +% contain \TeX\ commands to execute. +% \begin{macrocode} + \ifx#1\empty \Forlistfalse \else#3\fi +% \end{macrocode} +% Finally we test the switch |\ifForlist| to decide whether the +% loop has to be continued. +% \begin{macrocode} + \ifForlist + \repeat} +% \end{macrocode} +% \begin{macro}{\FirstElt} +% \changes{2.0g}{1991/06/05}{Macro added.} +% The macro |\FirstElt| is used to get the first element from a +% comma-separated list. +% \begin{macrocode} +\def\FirstElt#1,#2.{#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\OtherElts} +% \changes{2.0g}{1991/06/05}{Macro added.} +% The macro |\OtherElts| is used to get all elements {\em but\/} +% the first element from a comma-separated list. +% \begin{macrocode} +\def\OtherElts#1,#2.{#2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\whileswitch} +% \changes{2.0h}{1991/06/19}{Macro added.} When the program is used in +% interactive mode the user might want to process several files +% with different options or extensions. This goal could be reached +% by running the program several times, but it is more +% user-friendly to ask if he would like to process more files when +% we are done processing his last request. To accomplish this we +% need the implementation of a \texttt{while}-loop. Again plain +% \TeX's \verb=\loop{=\meta{body}\verb=}\repeat= is used to +% implement this programming structure. +% +% The syntax for this loop is: +% \begin{flushleft} +% |\whileswitch|\meta{switch} \verb|\fi| \meta{list} +% \verb={=\meta{body}\verb=}=\\ +% \end{flushleft} +% The first argument to this macro has to be a switch, defined +% using |\newif|; the second argument contains the statements +% to execute while the switch evaluates to \meta{true}. +% \begin{macrocode} +\def\whileswitch#1\fi#2{#1\loop#2#1\repeat\fi} +% \end{macrocode} +% \end{macro} +% +% \changes{2.3a}{1995/08/18}{New mechanism: output streams allocation} +% +% \subsubsection{Output streams allocator} +% +% For each of sixteen output streams available we have a macro +% named |\s@0| through |\s@15| saying if the stream is assigned to a +% file~(1) or not~(0). Initially all streams are not assigned. +% +% We also declare 16 counters which will be needed by the conditional +% code inclusion algorithm. +% +% \begin{macrocode} +\ifx\@tempcnta\undefined \newcount\@tempcnta \fi +\@tempcnta=0 +\loop +\Name\chardef{s@\number\@tempcnta}=0 +\csname newcount\expandafter\endcsname% + \csname off@\number\@tempcnta\endcsname +\advance\@tempcnta1 +\ifnum\@tempcnta<16\repeat +% \end{macrocode} +% +% We will use \emph{The \TeX book} style list to search through streams. +% +% \begin{macrocode} +\let\s@do\relax +\edef\@outputstreams{% + \s@do\Name\noexpand{s@0}\s@do\Name\noexpand{s@1}% + \s@do\Name\noexpand{s@2}\s@do\Name\noexpand{s@3}% + \s@do\Name\noexpand{s@4}\s@do\Name\noexpand{s@5}% + \s@do\Name\noexpand{s@6}\s@do\Name\noexpand{s@7}% + \s@do\Name\noexpand{s@8}\s@do\Name\noexpand{s@9}% + \s@do\Name\noexpand{s@10}\s@do\Name\noexpand{s@11}% + \s@do\Name\noexpand{s@12}\s@do\Name\noexpand{s@13}% + \s@do\Name\noexpand{s@14}\s@do\Name\noexpand{s@15}% + \noexpand\@nostreamerror + } +% \end{macrocode} +% +% \begin{macro}{\@nostreamerror}\begin{macro}{\@streamfound} +% When |\@outputstreams| is executed |\s@do| is defined to do +% something on condition of some test. If condition +% always fails macro |\@nostreamerror| on the end of the list +% causes an error. When condition succeeds |\@streamfound| is +% called, which gobbles rest of the list including the ending +% |\@nostreamerror|. It also gobbles |\fi| ending the condition, so +% the |\fi| is reinserted. +% +% \begin{macrocode} +\def\@nostreamerror{\errmessage{No more output streams!}} +\def\@streamfound#1\@nostreamerror{\fi} +% \end{macrocode} +% \end{macro}\end{macro} +% +% |\@stripstr| is auxiliary macro eating characters |\s@| +% (backslash,s,@). It is defined in somewhat strange way since |\s@| +% must have all category code 12 (other). This macro is used to +% extract stream numbers from stream names. +% +% \begin{macrocode} +\bgroup\edef\x{\egroup + \def\noexpand\@stripstr\string\s@{}} +\x +% \end{macrocode} +% +% \begin{macro}{\StreamOpen}\begin{macro}{\StreamPut} +% \begin{macro}{\StreamClose} +% Here is stream opening operator. Its parameter should be a macro +% named the same as the external file being opened. E.g., to +% write to file |foo.tex| use |\StreamOpen\foo|, then +% |\StreamPut\foo| and |\StreamClose\foo|. +% +% \begin{macrocode} +\chardef\stream@closed=16 +\def\StreamOpen#1{% + \chardef#1=\stream@closed + \def\s@do##1{\ifnum##1=0 + \chardef#1=\expandafter\@stripstr\string##1 % + \global\chardef##1=1 % + \immediate\openout#1=\csname pth@\@stripstring#1\endcsname % + \@streamfound + \fi} + \@outputstreams + } +\def\StreamClose#1{% + \immediate\closeout#1% + \def\s@do##1{\ifnum#1=\expandafter\@stripstr\string##1 % + \global\chardef##1=0 % + \@streamfound + \fi} + \@outputstreams + \chardef#1=\stream@closed + } +\def\StreamPut{\immediate\write} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \subsubsection{Input and Output} +% +% \begin{macro}{\maybeMsg} +% \begin{macro}{\showprogress} +% \begin{macro}{\keepsilent} +% When this program is used it can optionally show its progress on +% the terminal. In that case it will write a special character to +% the terminal (and the transcript file) for each input line. This +% option is on by default when statistics are included in +% \texttt{docstrip.tex}. It is off when statistics are excluded. The +% commands |\showprogress| and |\keepsilent| can be used +% to choose otherwise. +% \begin{macrocode} +\def\showprogress{\let\maybeMsg\message} +\def\keepsilent{\let\maybeMsg\@gobble} +%<*stats> +\showprogress +%</stats> +%<-stats>\keepsilent +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\Msg} +% For displaying messages on the terminal the macro |\Msg| is +% defined to write {\em immediately\/} to |\ttyout|. +% \begin{macrocode} +\def\Msg{\immediate\write\ttyout} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Ask} +% The macro +% \verb=\Ask{=\meta{cs}\verb=}{=\meta{string}\verb=}= is a +% slightly modified copy of the \LaTeX\ macro |\typein|. It is +% used to ask the user a question. The \meta{string} will be +% displayed on his terminal and the response will be stored in the +% \meta{cs}. The trailing space left over from the carriage return +% is stripped off by the macro |\strip|. If the user just +% types a carriage return, the result will be an empty macro. +% \changes{2.0i}{1991/06/27}{Added check for just \protect\meta{CR}} +% \begin{macrocode} +\def\iden#1{#1} +\def\strip#1#2 \@gobble{\def #1{#2}} +\def\@defpar{\par} +\def\Ask#1#2{% + \message{#2}\read\ttyin to #1\ifx#1\@defpar\def#1{}\else + \iden{\expandafter\strip + \expandafter#1#1\@gobble\@gobble} \@gobble\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\OriginalAsk} +% \changes{2.4e}{1996/10/24}{macro added (was in unpack.ins) (DPC)} +% \begin{macrocode} +\let\OriginalAsk=\Ask +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\askonceonly} +% \changes{2.4e}{1996/10/22} +% {macro added (essentially from unpack.ins) (DPC)} +% \begin{macrocode} +\def\askonceonly{% + \def\Ask##1##2{% + \OriginalAsk{##1}{##2}% + \global\let\Ask\OriginalAsk + \Ask\noprompt{% + By default you will be asked this question for every file.^^J% + If you enter `y' now,^^J% + I will assume `y' for all future questions^^J% + without prompting.}% + \ifx\y\noprompt\let\noprompt\yes\fi + \ifx\yes\noprompt\gdef\Ask####1####2{\def####1{y}}\fi}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Miscellaneous} +% +% \begin{macro}{\@gobble} +% \changes{2.0a}{1991/05/25}{Macro added.} +% A macro that has an argument and puts it in the bitbucket. +% \begin{macrocode} +\def\@gobble#1{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Endinput} +% \changes{2.0f}{1991/06/04}{Macro added.} When a \texttt{doc} file +% contains a \verb+\endinput+ on a line by itself this normally +% means that anything following in this file should be ignored. +% Therefore we need a macro containing |\endinput| as its +% replacement text to check this against |\inLine| (the +% current line from the current input file). Of course the +% backslash has to have the correct |\catcode|. One way of +% doing this is feeding \verb=\\= to the |\string| operation +% and afterwards removing one of the |\| characters. +% \begin{macrocode} +\edef\Endinput{\expandafter\@gobble\string\\endinput} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makeOther} +% During the process of reading a file with \TeX\ code the category +% code of all special characters has to be changed to \meta{other}. +% The macro |\makeOther| serves this purpose. +% \begin{macrocode} +\def\makeOther#1{\catcode`#1=12\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end} +% \changes{2.0h}{1991/06/19}{Macro added.} For now we want the \ds{} +% program to be compatible with both plain \TeX\ and \LaTeX\@. +% \LaTeX\ hides plain \TeX{}'s |\end| command and +% calls it |\@@end|. We unhide it here. +% \begin{macrocode} +\ifx\undefined\@@end\else\let\end\@@end\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addto} +% A macro extending macro's definition. The trick with |\csname| +% is necessary to get around |\newtoks| being outer in plain \TeX{} +% and \LaTeX\ version 2.09. +% \begin{macrocode} +\ifx\@temptokena\undefined \csname newtoks\endcsname\@temptokena\fi +% \end{macrocode} +% +% \begin{macrocode} +\def\@addto#1#2{% + \@temptokena\expandafter{#1}% + \edef#1{\the\@temptokena#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifpresent} +% This macro checks if its first argument is present on a +% list passed as the second argument. Depending on the result +% it executes either its third or fourth argument. +% +% \begin{macrocode} +\def\@ifpresent#1#2#3#4{% + \def\tmp##1#1##2\qStop{\ifx!##2!}% + \expandafter\tmp#2#1\qStop #4\else #3\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tospaces} +% This macro converts its argument delimited with |\secapsot| to +% appropriate number of spaces. We need this for smart displaying +% messages on the screen. +% +% |\@spaces| are used when we need many spaces in a row. +% \begin{macrocode} +\def\tospaces#1{% + \ifx#1\secapsot\secapsot\fi\space\tospaces} +\def\secapsot\fi\space\tospaces{\fi} +\def\@spaces{\space\space\space\space\space} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\uptospace} +% \changes{2.3c}{1995/08/24}{Macro added} +% This macro extracts from its argument delimited with |\qStop| +% part up to first occurrence of space. +% \begin{macrocode} +\def\uptospace#1 #2\qStop{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\afterfi} +% \changes{2.3c}{1995/09/04}{Macro added} +% This macro can be used in conditionals to perform some actions +% (its first parameter) after the condition is completed (i.e. +% after reading the matching |\fi|. Second parameter is used to +% gobble the rest of |\if ... \fi| construction (some |\else| +% maybe). Note that this won't work in nested |\if|s! +% \begin{macrocode} +\def\afterfi#1#2\fi{\fi#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@ifnextchar} +% \changes{2.3e}{1995/09/25}{Macro added} +% This is one of \LaTeX's macros not defined by plain. My +% devious definition differs from the standard one but +% functionality is the same. +% \begin{macrocode} +\def\@ifnextchar#1#2#3{\bgroup + \def\reserved@a{\ifx\reserved@c #1 \aftergroup\@firstoftwo + \else \aftergroup\@secondoftwo\fi\egroup + {#2}{#3}}% + \futurelet\reserved@c\@ifnch + } +\def\@ifnch{\ifx \reserved@c \@sptoken \expandafter\@xifnch + \else \expandafter\reserved@a + \fi} +\def\@firstoftwo#1#2{#1} +\def\@secondoftwo#1#2{#2} +\iden{\let\@sptoken= } % +\iden{\def\@xifnch} {\futurelet\reserved@c\@ifnch} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\kernel@ifnextchar} +% \changes{v2.5d}{2005/07/29}{Added macro} +% The 2003/12/01 release of \LaTeX\ incorporated this macro to avoid +% problems with \texttt{amsmath} but this also means that we have to +% perform the same trick here when people use \LaTeX\ on a +% installation file containing |\ProvidesFile|. +% \begin{macrocode} +\let\kernel@ifnextchar\@ifnextchar +% \end{macrocode} +% \end{macro} +% +% +% \subsection{The evaluation of boolean expressions} +% +% For clarity we repeat here the syntax for the boolean expressions +% in a somewhat changed but equivalent way: +% +% \DeleteShortVerb\| +% \begin{tabular}{lcl} +% \meta{Expression} & $::=$ & \meta{Secondary} $|$ +% \meta{Secondary} \{\texttt{|}, \texttt{,}\} +% \meta{Expression}\\ +% \meta{Secondary} & $::=$ & \meta{Primary} $|$ +% \meta{Primary} \texttt{\&} +% \meta{Secondary}\\ +% \meta{Primary} & $::=$ & +% \meta{Terminal} $|$ \texttt{!}\meta{Primary} +% $|$ +% \texttt{(}\meta{Expression}\texttt{)}\\ +% \end{tabular} +% +% The \texttt{|} stands for disjunction, the \texttt{\&} stands for +% conjunction and the \texttt{!}\ stands for negation. The +% \meta{Terminal} is any sequence of letters and evaluates to +% \meta{true} iff it occurs in the list of options that have to be +% included. +% \MakeShortVerb\| +% +% Since we can generate multiple output files from one input, +% same guard expressions can be computed several times with +% different options. For that reason we first ``compile'' the +% expression to the form of one parameter macro |\Expr| +% expanding to nested |\if|s that when given current list of +% options produces 1 or 0 as a result. The idea is to say +% |\if1\Expr{|\meta{current set of options}|}...\fi| for all +% output files. +% +% Here is a table recursively defining translations for right +% sides of the grammar. $\tau(X)$ denotes translation of~$X$. +% +% \DeleteShortVerb\| +% \MakeShortVerb\" +% \begingroup +% \addtolength\arraycolsep{-2.1pt} +% \begin{eqnarray*} +% \tau(\meta{Terminal})&=&"\t@<Terminal>,#1,<Terminal>,\qStop"\\ +% \tau(!\meta{Primary})&=&"\if1"\,\tau(\meta{Primary})\,"0\else1\fi"\\ +% \tau(\mbox{\texttt{(}\meta{Expression}\texttt{)}}) +% &=&\tau(\meta{Expression})\\ +% \tau(\mbox{\meta{Primary}\texttt{\&}\meta{Secondary}}) +% &=&"\if0"\,\tau(\meta{Primary})\,"0\else" +% \,\tau(\meta{Secondary})\,"\fi"\\ +% \tau(\mbox{\meta{Secondary}\texttt{|}\meta{Expression}}) +% &=&"\if1"\,\tau(\meta{Secondary})\,"1\else" +% \,\tau(\meta{Expression})\,"\fi" +% \end{eqnarray*} +% \endgroup +% \DeleteShortVerb\" +% \MakeShortVerb\| +% |\t@<Terminal>| denotes macro with name constructed from |t@| +% with appended tokens of terminal. E.g., for terminal |foo| the +% translation would be +%\begin{verbatim} +% \t@foo,#1,foo,\qStop +%\end{verbatim} +% This will end up in definition of |\Expr|, so |#1| here will +% be substituted by current list of options when |\Expr| is +% called. Macro |\t@foo| would be defined as +%\begin{verbatim} +% \def\t@foo#1,foo,#2\qStop{\ifx>#2>0\else1\fi} +%\end{verbatim} +% When called as above this will expand to |1| if |foo| is +% present on current list of options and to |0| otherwise. +% +% Macros below work in ``almost expand-only'' mode i.e. +% expression is analyzed only by expansion but we have to define +% some macros on the way (e.g., |\Expr| and |\t@foo|). +% +% The first parameter of each of these macros is +% ``continuation'' (in the sense similar to the language +% \textsc{Scheme}). Continuation is a function of at least one +% argument (parameter) being the value of previous steps of +% computation. For example macro |\Primary| constructs +% translation of \meta{Primary} expression. When it decides that +% expression is completed it calls its continuation (its first +% argument) passing to it whole constructed translation. +% Continuation may expect more arguments if it wants to see what +% comes next on the input. +% +% We will perform recursive descent parse, but definitions will +% be presented in bottom-up order. +% +% \begin{macro}{\Terminal} +% +% \meta{Terminal}s are recognized by macro |\Terminal|. The +% proper way of calling it is |\Terminal{|\meta{current +% continuation}|}{}|. Parameters are: continuation, +% \meta{Terminal} so far and next character from the input. +% Macro checks if |#3| is one of terminal-ending characters and +% then takes appropriate actions. Since there are 7 ending +% chars and probably one |\csname| costs less than 7 nested +% |\if|s we construct a name and check if it is defined. +% +% We must expand |\ifx| completely before taking next actions so +% we use |\afterfi|. +% \begin{macrocode} +\def\Terminal#1#2#3{% + \expandafter\ifx\csname eT@#3\endcsname\relax +% \end{macrocode} +% If condition is true |#3| belongs to current \meta{Terminal} +% so we append it to \meta{Terminal}-so-far and call |\Terminal| +% again. +% \begin{macrocode} + \afterfi{\Terminal{#1}{#2#3}}\else +% \end{macrocode} +% When condition is false it's time to end the \meta{Terminal} +% so we call macro |\TerminalX|. Next character is reinserted to +% the input. +% +% In both cases continuation is passed unchanged. +% \begin{macrocode} + \afterfi{\TerminalX{#1}{#2}#3}\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\eT@} +% Here we define macros marking characters that cannot appear +% inside terminal. The value is not important as long as it is +% different from |\relax|. +% \begin{macrocode} +\Name\let{eT@>}=1 +\Name\let{eT@&}=1 \Name\let{eT@!}=1 +\Name\let{eT@|}=1 \Name\let{eT@,}=1 +\Name\let{eT@(}=1 \Name\let{eT@)}=1 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TerminalX} +% This macro should end scanning of \meta{Terminal}. Parameters +% are continuation and gathered tokens of \meta{Terminal}. +% +% Macro starts by issuing an error message if \meta{Terminal} is +% empty. +% \begin{macrocode} +\def\TerminalX#1#2{% + \ifx>#2> \errmessage{Error in expression: empty terminal}\fi +% \end{macrocode} +% Then a macro is constructed for checking presence of +% \meta{Terminal} in options list. +% \begin{macrocode} + \Name\def{t@#2}##1,#2,##2\qStop{\ifx>##2>0\else1\fi}% +% \end{macrocode} +% And then current continuation is called with translation of +% \meta{Terminal} according to formula +% $$\tau(\meta{Terminal})=|\t@<Terminal>,#1,<Terminal>,\qStop|$$ +% \begin{macrocode} + #1{\Name\noexpand{t@#2},##1,#2,\noexpand\qStop}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Primary} +% Parameters are continuation and next character from the input. +% +% According to the syntax \meta{Primari}es can have three forms. +% This makes us use even more dirty tricks than usual. Note the +% |\space| after a series of |\ifx|s. This series produces an +% one digit number of case to be executed. The number is given +% to |\ifcase| and |\space| stops \TeX{} scanning for a +% \meta{number}. Use of |\ifcase| gives possibility to have one +% of three actions selected without placing them in nested +% |\if|s and so to use |\afterfi|. +% \begin{macrocode} +\def\Primary#1#2{% + \ifcase \ifx!#20\else\ifx(#21\else2\fi\fi\space +% \end{macrocode} +% First case is for |!| i.e. negated \meta{Primary}. In this +% case we call |\Primary| recursively but we create new +% continuation: macro |\NPrimary| that will negate result +% passed by |\Primary| and pass it to current continuation +% (|#1|). +% \begin{macrocode} + \afterfi{\Primary{\NPrimary{#1}}}\or +% \end{macrocode} +% When next character is |(| we call |\Expression| giving it as +% continuation macro |\PExpression| which will just pass the +% result up but ensuring first that a |)| comes next. +% \begin{macrocode} + \afterfi{\Expression{\PExpression{#1}}}\or +% \end{macrocode} +% Otherwise we start a \meta{Terminal}. |#2| is not passed as +% \meta{Terminal}-so-far but reinserted to input since we didn't +% check if it can appear in a \meta{Terminal}. +% \begin{macrocode} + \afterfi{\Terminal{#1}{}#2}\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NPrimary} +% Parameters are continuation and previously computed +% \meta{Primary}. +% +% This macro negates result of previous computations according +% to the rule +% $$\tau(!\meta{Primary}) +% =|\if1|\,\tau(\meta{Primary})\,|0\else1\fi|$$ +% \begin{macrocode} +\def\NPrimary#1#2{% + #1{\noexpand\if1#20\noexpand\else1\noexpand\fi}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PExpression} +% Parameters: continuation, \meta{Expression}, next character +% from input. We are checking if character is |)| and then pass +% unchanged result to our continuation. +% \begin{macrocode} +\def\PExpression#1#2#3{% + \ifx)#3\else + \errmessage{Error in expression: expected right parenthesis}\fi + #1{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Secondary} +% Each \meta{Secondary} expression starts with \meta{Primary}. +% Next checks will be performed by |\SecondaryX|. +% \begin{macrocode} +\def\Secondary#1{% + \Primary{\SecondaryX{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SecondaryX} +% Parameters: continuation, translation of \meta{Primary}, next +% character. We start by checking if next character is |&|. +% \begin{macrocode} +\bgroup\catcode`\&=12 +\gdef\SecondaryX#1#2#3{% + \ifx% +% \end{macrocode} +% If it is we should parse next \meta{Secondary} and then +% combine it with results so far. Note that |\SecondaryXX| will +% have 3 parameters. +% \begin{macrocode} + \afterfi{\Secondary{\SecondaryXX{#1}{#2}}}\else +% \end{macrocode} +% Otherwise \meta{Secondary} turned out to be just +% \meta{Primary}. We call continuation passing to it translation +% of that \meta{Primary} not forgetting to reinsert |#3| to the +% input as it does not belong here. +% \begin{macrocode} + \afterfi{#1{#2}#3}\fi + } +\egroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SecondaryXX} +% Parameters: continuation, translation of \meta{Primary}, +% translation of \meta{Secondary}. We construct translation of +% whole construction according to the rule: +% $$\tau(\mbox{\meta{Primary}\texttt{\&}\meta{Secondary}}) +% =|\if0|\,\tau(\meta{Primary})\,|0\else| +% \,\tau(\meta{Secondary})\,|\fi| $$ +% and pass it to our continuation. +% \begin{macrocode} +\def\SecondaryXX#1#2#3{% + #1{\noexpand\if0#20\noexpand\else#3\noexpand\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Expression} +% Every \meta{Expression} starts with \meta{Secondary}. We +% construct new continuation and pass it to |\Secondary|. +% \begin{macrocode} +\def\Expression#1{% + \Secondary{\ExpressionX{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ExpressionX} +% Parameters: continuation, translation of \meta{Secondary}, +% next character. We perform check if character is +% \texttt{\char`\|} or |,|. +% \begin{macrocode} +\def\ExpressionX#1#2#3{% + \if0\ifx|#31\else\ifx,#31\fi\fi0 +% \end{macrocode} +% If it is not \meta{Expression} is just a \meta{Secondary}. We +% pass its translation to continuation and reinsert |#3|. +% \begin{macrocode} + \afterfi{#1{#2}#3}\else +% \end{macrocode} +% If we are dealing with complex \meta{Expression} we should +% parse another |\Expression| now. +% \begin{macrocode} + \afterfi{\Expression{\ExpressionXX{#1}{#2}}}\fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ExpressionXX} +% Parameters: continuation, translation of \meta{Secondary}, +% translation of \meta{Expression}. +% We finish up translating of \meta{Expression} according to +% the formula: +% $$\tau(\mbox{\meta{Secondary}\texttt{\char`\|}\meta{Expression}}) +% =|\if1|\,\tau(\meta{Secondary})\,|1\else| +% \,\tau(\meta{Expression})\,|\fi|$$ +% \begin{macrocode} +\def\ExpressionXX#1#2#3{% + #1{\noexpand\if1#21\noexpand\else#3\noexpand\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\StopParse} +% Here is initial continuation for whole parse process. It will +% be used by |\Evaluate|. Note that we assume that expression +% has |>| on its end. This macro eventually defines |\Expr|. +% Parameters: translation of whole \meta{Expression} and next +% character from input. +% \begin{macrocode} +\def\StopParse#1#2{% + \ifx>#2 \else\errmessage{Error in expression: spurious #2}\fi + \edef\Expr##1{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Evaluate} +% This macro is used to start parsing. We call |\Expression| +% with continuation defined above. On end of expression we +% append a |>|. +% \begin{macrocode} +\def\Evaluate#1{% + \Expression\StopParse#1>} +% \end{macrocode} +% \end{macro} +% +% \subsection{Processing the input lines} +% +% \begin{macro}{\normalLine} +% The macro |\normalLine| writes its argument (which has to be +% delimited with |\endLine|) on all active output files i.e. +% those with off-counters equal to zero. +% If statistics are included, the counter +% |\codeLinesPassed| is incremented by $1$. +% \begin{macrocode} +\def\normalLine#1\endLine{% +%<*stats> + \advance\codeLinesPassed\@ne +%</stats> + \maybeMsg{.}% + \def\inLine{#1}% + \let\do\putline@do + \activefiles + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\putline@do} +% \changes{2.3b}{1995/08/22}{Change for pre-constructed +% off-counters' names} +% This is a value for |\do| when copying line to output files. +% \begin{macrocode} +\def\putline@do#1#2#3{% + \StreamPut#1{\inLine}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\removeComment} +% The macro |\removeComment| throws its argument (which has to be +% delimited with |\endLine|) away. When statistics are included +% in the program the removed comment is counted. +% \begin{macrocode} +% +\def\removeComment#1\endLine{% +%<*stats> + \advance\commentsRemoved\@ne +%</stats> + \maybeMsg{\perCent}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\putMetaComment} +% \changes{2.3e}{1996/09/16}{Introduced \cs{MetaPrefix}} +% If a line starts with two consecutive percent signs, it is +% considered to be a {\em MetaComment\/}. Such a comment line is +% passed on to the output file unmodified. +% \begin{macrocode} +\bgroup\catcode`\%=12 +\iden{\egroup +\def\putMetaComment%}#1\endLine{% +% \end{macrocode} +% If statistics are included the line is counted. +% \begin{macrocode} +%<*stats> + \advance\commentsPassed\@ne +%</stats> +% \end{macrocode} +% The macro |\putMetaComment| has one argument, delimited with +% |\endLine|. It brings the source line with |%%| stripped. We +% prepend to it |\MetaPrefix| (which can be different from |%%|) +% and send the line to all active files. +% \begin{macrocode} + \edef\inLine{\MetaPrefix#1}% + \let\do\putline@do + \activefiles + } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\processLine} +% \changes{2.3a}{1995/08/18}{Adaptation for concurrent version} +% \changes{2.3a}{1995/08/20}{Trying to avoid assignments} +% Each line that is read from the input stream has to be processed +% to see if it has to be written on the output stream. This task +% is performed by calling the macro |\processLine|. +% In order to do +% that, it needs to check whether the line starts with a +% `\texttt{\%}'. Therefore the macro is globally defined within a +% group. Within this group the category code of `\texttt{\%}' is +% changed to 12 (other). Because a comment character is needed, +% the category code of `\texttt{*}' is changed to 14 (comment +% character). +% +% The macro increments counter |\processedLines| by $1$ if +% statistics are included. We cannot include this line with +% |%<*stats>| since the category of \texttt{\%} is changed and the +% file must be loadable unstripped. So the whole definition is +% repeated embedded in guards. +% +% The next token from the input stream is passed in |#1|. If it is +% a `\texttt{\%}' further processing has to be done by +% |\processLineX|; otherwise this is normal (not commented out) +% line. +% +% In either case the character read is reinserted to the input +% as it may have to be written out. +% +% \begin{macrocode} +%<*!stats> +\begingroup +\catcode`\%=12 \catcode`\*=14 +\gdef\processLine#1{* + \ifx%#1 + \expandafter\processLineX + \else + \expandafter\normalLine + \fi + #1} +\endgroup +%</!stats> +%<*stats> +\begingroup +\catcode`\%=12 \catcode`\*=14 +\gdef\processLine#1{* + \advance\processedLines\@ne + \ifx%#1 + \expandafter\processLineX + \else + \expandafter\normalLine + \fi + #1} +\endgroup +%</stats> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\processLineX} +% \changes{2.3a}{1995/08/20}{Trying to avoid assignments} +% This macro is also defined within a group, +% because it also has to check if the next +% token in the input stream is a `\texttt{\%}' character. +% +% If the second token in the current line happens to be a +% `\texttt{\%}', a \meta{MetaComment} has been found. This has to +% be copied in its entirety to the output. Another possible second +% character is `\texttt{<}', which introduces a guard expression. +% The processing of such an expression is started by calling +% |\checkOption|. +% +% When the token was neither a `\texttt{\%}' nor a `\texttt{<}', +% the line contains a normal comment that has to be removed. +% +% We express conditions in such a way that all actions appear +% on first nesting level of |\if|s. In such conditions just one +% expandafter pushes us outside whole construction. A thing to +% watch here is |\relax|. It stops search for numeric constant. +% If it wasn't here \TeX\ would expand the first case of |\ifcase| +% before knowing the value. +% +% \begin{macrocode} +\begingroup +\catcode`\%=12 \catcode`\*=14 +\gdef\processLineX%#1{* + \ifcase\ifx%#10\else + \ifx<#11\else 2\fi\fi\relax + \expandafter\putMetaComment\or + \expandafter\checkOption\or + \expandafter\removeComment\fi + #1} +\endgroup +% \end{macrocode} +% \end{macro} +% +% \subsection{The handling of options} +% +% \begin{macro}{\checkOption} +% \changes{2.3a}{1995/08/18}{Adapted to concurrent version} +% \changes{2.3a}{1995/08/20}{Trying to avoid assignments} +% \changes{2.3e}{1996/09/16}{Verbatim mode} +% When the macros that process a line have found that the line +% starts with `\texttt{\%<}', a guard line has been encountered. +% The first character of a guard can be an asterisk (\texttt{*}), a +% slash (\texttt{/}) a plus (\texttt{+}), a minus (\texttt{-}), a +% less-than sign (\texttt{<}) starting verbatim mode or +% any other character that can be found in an option name. This +% means that we have to peek at the next token and +% decide what kind of guard we have. +% +% We reinsert |#1| as it may be needed by |\doOption|. +% \begin{macrocode} +\def\checkOption<#1{% + \ifcase + \ifx*#10\else \ifx/#11\else + \ifx+#12\else \ifx-#13\else + \ifx<#14\else 5\fi\fi\fi\fi\fi\relax + \expandafter\starOption\or + \expandafter\slashOption\or + \expandafter\plusOption\or + \expandafter\minusOption\or + \expandafter\verbOption\or + \expandafter\doOption\fi + #1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doOption} +% When no guard modifier is found by |\checkOptions|, the +% macro |\doOption| is called. It evaluates a boolean +% expression. The result of this evaluation is stored in +% |\Expr|. The guard only affects the current +% line, so |\do| is defined in such a way that depending on the +% result of the test |\if1\Expr{|\meta{options}|}|, the current +% line is either copied to the output stream or removed. Then +% the test is computed for all active output files. +% \begin{macrocode} +\def\doOption#1>#2\endLine{% + \maybeMsg{<#1 . >}% + \Evaluate{#1}% + \def\do##1##2##3{% + \if1\Expr{##2}\StreamPut##1{#2}\fi + }% + \activefiles + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\plusOption} +% When a `\texttt{+}' is found as a guard modifier, +% |\plusOption| is called. This macro is very similar to +% |\doOption|, the only difference being that displayed +% message now contains `\texttt{+}'. +% \begin{macrocode} +\def\plusOption+#1>#2\endLine{% + \maybeMsg{<+#1 . >}% + \Evaluate{#1}% + \def\do##1##2##3{% + \if1\Expr{##2}\StreamPut##1{#2}\fi + }% + \activefiles + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\minusOption} +% When a `\texttt{-}' is found as a guard modifier, +% |\minusOption| is called. This macro is very similar to +% |\plusOption|, the difference is that condition is negated. +% \begin{macrocode} +\def\minusOption-#1>#2\endLine{% + \maybeMsg{<-#1 . >}% + \Evaluate{#1}% + \def\do##1##2##3{% + \if1\Expr{##2}\else \StreamPut##1{#2}\fi + }% + \activefiles + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\starOption} +% \changes{2.3a}{1995/08/18}{Adapted to concurrent version} +% When a `\texttt{*}' is found as a guard modifier, +% |\starOption| is called. In this case a block of code will +% be included in the output on the condition that the guard +% expression evaluates to \meta{true}. +% +% The current line is gobbled as |#2|, because it only contains +% the guard and possibly a comment. +% +% \begin{macrocode} +\def\starOption*#1>#2\endLine{% +% \end{macrocode} +% First we optionally write +% a message to the terminal to indicate that a new option starts +% here. +% \begin{macrocode} + \maybeMsg{<*#1}% +% \end{macrocode} +% Then we push the current contents of |\blockHead| on the +% stack of blocks, |\guardStack| and increment the counter +% |\blockLevel| to indicate that we are now one level of +% nesting deeper. +% \changes{2.0k}{1992/04/06}{Use new stack mechanism} +% \changes{2.0k}{1992/04/09}{The macro that holds the guard needs to be +% expanded} +% \begin{macrocode} + \expandafter\push\expandafter\guardStack\expandafter{\blockHead}% + \advance\blockLevel\@ne +% \end{macrocode} +% The guard for this block of code is now stored in +% |\blockHead|. +% \begin{macrocode} + \def\blockHead{#1}% +% \end{macrocode} +% Now we evaluate guard expression for all output files +% updating off-counters. Then we create new list of active +% output files. Only files that were active in the outer block +% can remain active now. +% \begin{macrocode} + \Evaluate{#1}% + \let\do\checkguard@do + \outputfiles + \let\do\findactive@do + \edef\activefiles{\activefiles} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\checkguard@do} +% \changes{2.3b}{1995/08/22}{Change for pre-constructed +% off-counters' names} +% This form of |\do| updates off-counts according to the value of +% guard expression. +% \begin{macrocode} +\def\checkguard@do#1#2#3{% +% \end{macrocode} +% If this block of code occurs inside another block of code that is +% {\em not\/} included in the output, we increment the off counter. +% In that case the guard expression will not be +% evaluated, because a block inside another block that is excluded +% from the output will also be excluded, regardless of the +% evaluation of its guard. +% \begin{macrocode} + \ifnum#3>0 + \advance#3\@ne +% \end{macrocode} +% When the off count has value 0, we have +% to evaluate the guard expression. If the result is \meta{false} +% we increase the off-counter. +% \begin{macrocode} + \else + \if1\Expr{#2}\else + \advance#3\@ne\fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\findactive@do} +% \changes{2.3b}{1995/08/22}{Change for pre-constructed +% off-counters' names} +% This form of |\do| picks elements of output files list which +% have off-counters equal to zero. +% \begin{macrocode} +\def\findactive@do#1#2#3{% + \ifnum#3=0 + \noexpand\do#1{#2}#3\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\slashOption} +% \changes{2.3a}{1995/08/18}{Adapted for concurrent version} +% The macro |\slashOption| is the counterpart to +% |\starOption|. It indicates the end of a block of +% conditionally included code. We store the argument in the +% temporary control sequence |\tmp|. +% \begin{macrocode} +\def\slashOption/#1>#2\endLine{% + \def\tmp{#1}% +% \end{macrocode} +% When the counter |\blockLevel| has a value less than $1$, +% this `end-of-block' line has no corresponding `start-of-block'. +% Therefore we signal an error and ignore this end of block. +% \begin{macrocode} + \ifnum\blockLevel<\@ne + \errmessage{Spurious end block </\tmp> ignored}% +% \end{macrocode} +% Next we compare the contents of |\tmp| with the contents +% of |\blockHead|. The latter macro contains the last guard for +% a block of code that was encountered. If the contents match, we +% pop the previous guard from the stack. +% \changes{2.0k}{1992/04/06}{Use new stack mechanism} +% \begin{macrocode} + \else + \ifx\tmp\blockHead + \pop\guardStack\blockHead +% \end{macrocode} +% When the contents of the two macros don't match something is +% amiss. We signal this to the user, but accept the `end-of-block'. +%\note{Is this the desired behaviour??} +% \begin{macrocode} + \else + \errmessage{Found </\tmp> instead of </\blockHead>}% + \fi +% \end{macrocode} +% When the end of a block of optionally included code is encountered +% we optionally signal this on the terminal and decrement the counter +% |\blockLevel|. +% \begin{macrocode} + \maybeMsg{>}% + \advance\blockLevel\m@ne +% \end{macrocode} +% The last thing that has to be done is to decrement off-counters and +% make new list of active files. Now whole list of output files has +% to be searched since some inactive files could have been +% reactivated. +% \begin{macrocode} + \let\do\closeguard@do + \outputfiles + \let\do\findactive@do + \edef\activefiles{\outputfiles} + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\closeguard@do} +% \changes{2.3b}{1995/08/22}{Change for pre-constructed +% off-counters' names} +% This macro decrements non-zero off-counters. +% \begin{macrocode} +\def\closeguard@do#1#2#3{% + \ifnum#3>0 + \advance#3\m@ne + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\verbOption} +% \changes{2.3e}{1996/09/16}{Macro added} +% \changes{2.4g}{1996/12/13}{Reset \cs{putline@do} for /2340} +% This macro is called when a line starts with |%<<|. It reads a +% bunch of lines in verbatim mode: the lines are passed unchanged +% to the output without even checking for starting |%|. This way of +% processing ends when a line containing only a percent sign +% followed by stop mark given on the |%<<| line is found. +% \begin{macrocode} +\def\verbOption<#1\endLine{{% + \edef\verbStop{\perCent#1}\maybeMsg{<<<}% + \let\do\putline@do + \loop + \ifeof\inFile\errmessage{Source file ended while in verbatim + mode!}\fi + \read\inFile to \inLine + \if 1\ifx\inLine\verbStop 0\fi 1% if not inLine==verbStop + \activefiles + \maybeMsg{.}% + \repeat + \maybeMsg{>}% + }} +% \end{macrocode} +% \end{macro} +% +% \subsection{Batchfile commands} +% \changes{2.3e}{1996/10/02}{Added doc} +% \ds{} keeps information needed to control inclusion of sources in +% several list structures. Lists are macros expanding to a series +% of calls to macro |\do| with two or three parameters. +% Subsequently |\do| is redefined in various ways and list +% macros sometimes are executed to perform some action on every +% element, and sometimes are used inside an |\edef| to make new +% list of elements having some properties. For every input file +% \meta{infile} the following lists are kept: +% \begin{itemize} +% \item[\cs{b@}\meta{infile}] the ``open list''---names of all output +% files such that their generation should start with +% reading of \meta{infile}, +% \item[\cs{o@}\meta{infile}] the ``output list''---names of all +% output files generated from that source together with +% suitable sets of options (guards), +% \item[\cs{e@}\meta{infile}] the ``close list''---names of all +% output files that should be closed when this source is +% read. +% \end{itemize} +% +% For every output file name \meta{outfile} \ds{} keeps following +% information: +% \begin{itemize} +% \item[\cs{pth@}\meta{outfile}] full pathname (including file name), +% \item[\cs{ref@}\meta{outfile}] reference lines for the file, +% \item[\cs{in@}\meta{outfile}] names of all source files separated +% with spaces (needed by \cs{InFileName}), +% \item[\cs{pre@}\meta{outfile}] preamble template (as defined with +% |\declarepreamble|), +% \item[\cs{post@}\meta{outfile}] postamble template. +% \end{itemize} +% +% \begin{macro}{\generate} +% \changes{2.3a}{1995/08/20}{Messages changed} +% \changes{2.4a}{1996/06/06}{Repeat processing of files until all +% done (MDW)} +% This macro executes its argument in a group. |\inputfiles| is +% a list of files to be read, |\filestogenerate| list of names +% of output files (needed for the message below). |\file|s +% contained in |#1| define |\inputfiles| in such a way that all +% that has to be done when the parameter is executed is to call +% this macro. |\inputfiles| command is called over and over again +% until no output files had to be postponed. +% \begin{macrocode} +\def\generate#1{\begingroup + \let\inputfiles\empty \let\filestogenerate\empty + \let\file\@file + #1 + \ifx\filestogenerate\empty\else + \Msg{^^JGenerating file(s) \filestogenerate}\fi + \def\inFileName{\csname in@\outFileName\endcsname}% + \def\ReferenceLines{\csname ref@\outFileName\endcsname}% + \processinputfiles + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\processinputfiles} +% \changes{2.4a}{1996/10/02}{Macro added (MW)} +% This is a recurrent function which processes input files until +% they are all gone. +% \begin{macrocode} +\def\processinputfiles{% + \let\newinputfiles\empty + \inputfiles + \let\inputfiles\newinputfiles + \ifx\inputfiles\empty\else + \expandafter\processinputfiles + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\file} +% The first argument is the file to produce, the second +% argument contains the list of input files. Each entry should have +% the format +% \verb=\from{=\meta{filename.ext}\verb=}{=\meta{options}\verb=}=. +% +% \changes{2.3a}{1995/08/20}{Messages changed} +% ^^A The macro starts by displaying a message on the terminal to +% ^^A indicate which file is going to be made. +% The switch |\ifGenerate| is initially set to \meta{true}. +% \begin{macrocode} +\def\file#1#2{\errmessage{Command `\string\file' only allowed in + argument to `\string\generate'}} +\def\@file#1{% + \Generatetrue +% \end{macrocode} +% Next we construct full path name for output file and check if we +% have to be careful about overwriting existing files. If the user +% specified |\askforoverwritetrue| we will ask him if he wants to +% overwrite an existing file. Otherwise we simply go ahead. +% \begin{macrocode} + \makepathname{#1}% + \ifaskforoverwrite +% \end{macrocode} +% We try to open a file with the name of the output file for +% reading. If this succeeds the file exists and we ask the user if +% he wants to overwrite the file. +% \changes{2.0p}{1992/06/26}{Added \cs{WriteToDir} (FMi).} +% \changes{2.3a}{1995/08/18}{Changed \cs{@empty} (which was undefined) +% to \cs{empty}} +% \changes{2.3e}{1995/09/25}{Changed \cs{WriteToDir} to \cs{destdir}} +% \begin{macrocode} + \immediate\openin\inFile\@pathname\relax + \ifeof\inFile\else + \Ask\answer{File \@pathname\space already exists + \ifx\empty\destdir somewhere \fi + on the system.^^J% + Overwrite it% + \ifx\empty\destdir\space if necessary\fi + ? [y/n]}% +% \end{macrocode} +% We set the switch |\ifGenerate| according to his answer. We +% allow for both ``\texttt{y}'' and ``\texttt{yes}''. +% \begin{macrocode} + \ifx\y \answer \else + \ifx\yes\answer \else + \Generatefalse\fi\fi\fi +% \end{macrocode} +% Don't forget to close the file just opened as we want to write +% to it. +% \begin{macrocode} + \closein\inFile + \fi +% \end{macrocode} +% \changes{2.3e}{1995/09/25}{Destination directory handling} +% If file is to be generated we save its destination pathname and +% pass control to macro |\@fileX|. +% Note that file name is turned into control sequence and |\else| +% branch is skipped before calling |\@fileX|. +% \begin{macrocode} + \ifGenerate + \Name\let{pth@#1}\@pathname + \@addto\filestogenerate{\@pathname\space}% + \Name\@fileX{#1\expandafter}% + \else +% \end{macrocode} +% In case we were not allowed to overwrite an existing file +% we inform the user that we are {\em not\/} generating his file +% and we gobble |\from| specifications. +% \begin{macrocode} + \Msg{Not generating file \@pathname^^J}% + \expandafter\@gobble + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fileX} +% We put name of current output file in |\curout| and initialize +% |\curinfiles| (the list of source files for this output file) +% to empty---these will be needed by |\from|. Then we start +% defining preamble for the current file. +% \begin{macrocode} +\def\@fileX#1#2{% + \chardef#1=\stream@closed + \def\curout{#1}% + \let\curinfiles\empty + \let\curinnames\empty + \def\curref{\MetaPrefix ^^J% + \MetaPrefix\space The original source files were:^^J% + \MetaPrefix ^^J}% +% \end{macrocode} +% Next we execute second parameter. |\from|s will add reference +% lines to the preamble. +% \begin{macrocode} + \let\from\@from \let\needed\@needed + #2% + \let\from\err@from \let\needed\err@needed +% \end{macrocode} +% We check order of input files. +% \begin{macrocode} + \checkorder +% \end{macrocode} +% Each |\from| clause defines |\curin| to be its first parameter. +% So now |\curin| holds name of last input file for current output +% file. This means that current output file should be closed after +% processing |\curin|. We add |#1| to proper `close list'. +% \begin{macrocode} + \Name\@addto{e@\curin}{\noexpand\closeoutput{#1}}% +% \end{macrocode} +% Last we save all the interesting information about current file. +% \begin{macrocode} + \Name\let{pre@\@stripstring#1\expandafter}\currentpreamble + \Name\let{post@\@stripstring#1\expandafter}\currentpostamble + \Name\edef{in@\@stripstring#1}{\expandafter\iden\curinnames} + \Name\edef{ref@\@stripstring#1}{\curref} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\checkorder} +% This macro checks if the order of files in |\curinfiles| +% agrees with that of |\inputfiles|. The coding is somewhat +% clumsy. +% \begin{macrocode} +\def\checkorder{% + \expandafter\expandafter\expandafter + \checkorderX\expandafter\curinfiles + \expandafter\qStop\inputfiles\qStop + } +\def\checkorderX(#1)#2\qStop#3\qStop{% + \def\tmp##1\readsource(#1)##2\qStop{% + \ifx!##2! \order@error + \else\ifx!#2!\else + \checkorderXX##2% + \fi\fi}% + \def\checkorderXX##1\readsource(#1)\fi\fi{\fi\fi + \checkorderX#2\qStop##1\qStop}% + \tmp#3\readsource(#1)\qStop + } +\def\order@error#1\fi\fi{\fi + \errmessage{DOCSTRIP error: Incompatible order of input + files specified for file + `\iden{\expandafter\uptospace\curin} \qStop'.^^J + Read DOCSTRIP documentation for explanation.^^J + This is a serious problem, I'm exiting}\end + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\needed} +% \changes{2.3c}{1995/08/24}{Macro added} +% \changes{2.3e}{1996/09/12}{Forced expansion of argument to fix a bug +% with filenames containing macros} +% \begin{macro}{\@needed} +% This macro uniquizes name of an input file passed as a +% parameter and marks it as needed to be input. It is used +% internally by |\from|, but can also be issued in argument to +% |\file| to influence the order in which files are read. +% \begin{macrocode} +\def\needed#1{\errmessage{\string\needed\space can only be used in + argument to \string\file}} +\let\err@needed\needed +\def\@needed#1{% + \edef\reserved@a{#1}% + \expandafter\@need@d\expandafter{\reserved@a}} +\def\@need@d#1{% + \@ifpresent{(#1)}\curinfiles +% \end{macrocode} +% If |#1| is present on list of input files for current output +% file we add a space on end of its name and try again. The idea +% is to construct a name that will look different for \TeX\ but +% will lead to the same file when seen by operating system. +% \begin{macrocode} + {\@need@d{#1 }}% +% \end{macrocode} +% When it is not we check if |#1| is present in the list of +% files to be processed. If not we add it and initialize list of +% output files for that input and list of output files that +% should be closed when this file closes. We also add +% constructed name to |\curinfiles| and define |\curin| to be +% able to access constructed name from |\@from|. +% \begin{macrocode} + {\@ifpresent{\readsource(#1)}\inputfiles + {}{\@addto\inputfiles{\noexpand\readsource(#1)}% + \Name\let{b@#1}\empty + \Name\let{o@#1}\empty + \Name\let{e@#1}\empty}% + \@addto\curinfiles{(#1)}% + \def\curin{#1}}% + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\from} +% \changes{2.3c}{1995/08/24}{part of code moved to \cs{needed}} +% |\from| starts by adding a line to preamble for output file. +% \begin{macrocode} +\def\from#1#2{\errmessage{Command `\string\from' only allowed in + argument to `\string\file'}} +\let\err@from\from +\def\@from#1#2{% + \@addto\curref{\MetaPrefix\space #1 \if>#2>\else + \space (with options: `#2')\fi^^J}% +% \end{macrocode} +% Then we mark the file as needed input file. +% \begin{macrocode} + \needed{#1}% +% \end{macrocode} +% \changes{2.3e}{1996/10/02}{Introduced ``open list''} +% If this is the first |\from| in current |\file| (i.e. if the +% |\curinnames| so far is empty) the file name is added to the +% ``open list'' for the current input file. +% And |\do|\meta{current output}|{|\meta{options}|}| is appended +% to the list of output files for current input file. +% \begin{macrocode} + \ifx\curinnames\empty + \Name\@addto{b@\curin}{\noexpand\openoutput\curout}% + \fi + \@addto\curinnames{ #1}% + \Name\@addto{o@\curin}{\noexpand\do\curout{#2}}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\readsource} +% \changes{2.4a}{1996/06/06}{Extensively hacked to honour stream +% limits (MDW)} +% \changes{2.3a}{1995/08/18}{Renamed to \cs{readsource}; adaptation for +% concurrent version} +% \changes{2.0f}{1991/06/04}{Added check for lines with \texttt{\bsl +% endinput}} This macro is called for each input file that +% is to be processed. +% +% \begin{macrocode} +\def\readsource(#1){% +% \end{macrocode} +% We try to open the input file. If this doesn't succeed, we +% tell the user so and nothing else happens. +% \begin{macrocode} + \immediate\openin\inFile\uptospace#1 \qStop\relax + \ifeof\inFile + \errmessage{Cannot find file \uptospace#1 \qStop}% + \else +% \end{macrocode} +% If statistics are included we nullify line counters +% \begin{macrocode} +%<*stats> + \processedLines\z@ + \commentsRemoved\z@ + \commentsPassed\z@ + \codeLinesPassed\z@ +%</stats> +% \end{macrocode} +% \changes{2.3b}{1995/08/22}{Change for pre-constructed +% off-counters' names} +% \changes{2.3e}{1996/10/02}{Introduced ``open list''} +% When the input file was successfully opened, we try to open all +% needed output files by executing the ``open list''. +% If any of files couldn't be opened because of number of streams +% limits, their names are put into |\refusedfiles| list. This list +% subsequently becomes the open list for the next pass. +% \begin{macrocode} + \let\refusedfiles\empty + \csname b@#1\endcsname + \Name\let{b@#1}\refusedfiles +% \end{macrocode} +% Now all output files that could be opened are open. So we go +% through the ``output list'' and for every open file we display a +% message and zero the off-counter, while closed files are appended +% to |\refusedfiles|. +% \begin{macrocode} + \Msg{} \def\@msg{Processing file \uptospace#1 \qStop} + \def\change@msg{% + \edef\@msg{\@spaces\@spaces\@spaces\space + \expandafter\tospaces\uptospace#1 \qStop\secapsot} + \let\change@msg\relax} + \let\do\showfiles@do + \let\refusedfiles\empty + \csname o@#1\endcsname +% \end{macrocode} +% If |\refusedfiles| is nonempty current source file needs reread, +% so we append it to |\newinputfiles|. +% \begin{macrocode} + \ifx\refusedfiles\empty\else + \@addto\newinputfiles{\noexpand\readsource(#1)} + \fi +% \end{macrocode} +% Finally we define |\outputfiles| and construct off-counters +% names. Now |\do|s will have 3 parameters! All output files become +% active. +% \begin{macrocode} + \let\do\makeoutlist@do + \edef\outputfiles{\csname o@#1\endcsname}% + \let\activefiles\outputfiles + \Name\let{o@#1}\refusedfiles +% \end{macrocode} +% Now we change the category code of a lot of characters to +% \meta{other} and make sure that no extra spaces appear in the +% lines read by setting the |\endlinechar| to $-1$. +% \begin{macrocode} + \makeOther\ \makeOther\\\makeOther\$% + \makeOther\#\makeOther\^\makeOther\^^K% + \makeOther\_\makeOther\^^A\makeOther\%% + \makeOther\~\makeOther\{\makeOther\}\makeOther\&% + \endlinechar-1\relax +% \end{macrocode} +% To avoid any UTF-8 handling of characters we set code points +% 128--255 to other. +% \changes{2.5f}{2018/04/10}{Read 8bit raw to leave high bits in the +% code to unchanged without utf8 handling (issue 34)} +% \begin{macrocode} + \@tempcnta=128\relax + \loop + \catcode\@tempcnta 12\relax + \ifnum\@tempcnta <255\relax + \advance\@tempcnta\@ne + \repeat +% \end{macrocode} +% Then we start a loop to process the lines in the file one by one. +% \begin{macrocode} + \loop + \read\inFile to\inLine +% \end{macrocode} +% The first thing we check is whether the current line +% contains an |\endinput|. To allow also real |\endinput| +% commands in the source file, |\endinput| is only recognized +% when it occurs directly at the beginning of a line. +% \begin{macrocode} + \ifx\inLine\Endinput +% \end{macrocode} +% In this case we output a message to inform the programmer (in +% case this was a mistake) and end the loop immediately by setting +% \verb=Continue= to \meta{false}. Note that |\endinput| is +% not placed into the output file. This is important in cases where +% the output file is generated from several \texttt{doc} files. +% \begin{macrocode} + \Msg{File #1 ended by \string\endinput.}% + \Continuefalse + \else +% \end{macrocode} +% \changes{2.0j}{1992/03/03}{First check for end of file before check +% for empty lines} When the end of the file is found we have to +% interrupt the loop. +% \begin{macrocode} + \ifeof\inFile + \Continuefalse +% \end{macrocode} +% \changes{2.0i}{1991/06/27}{Added check for consecutive empty lines} +% If the file did not end we check if the input line is empty. +% If it is, the counter |\emptyLines| is incremented. +% \begin{macrocode} + \else + \Continuetrue + \ifx\inLine\empty + \advance\emptyLines\@ne + \else + \emptyLines\z@ + \fi +% \end{macrocode} +% When the number of empty lines seen so far exceeds 1, we skip them. +% If it doesn't, the expansion of |\inLine| is fed to |\processLine| +% with |\endLine| appended to indicate the end of the line. +% \begin{macrocode} + \ifnum \emptyLines<2 + \expandafter\processLine\inLine\endLine + \else + \maybeMsg{/}% + \fi + \fi + \fi +% \end{macrocode} +% When the processing of the line is finished, we check if there is +% more to do, in which case we repeat the loop. +% \begin{macrocode} + \ifContinue + \repeat +% \end{macrocode} +% The input file is closed. +% \begin{macrocode} + \closein\inFile +% \end{macrocode} +% We close output files for which this was the last input file. +% \begin{macrocode} + \csname e@#1\endcsname +% \end{macrocode} +% If the user was interested in statistics, we inform him of the +% number of lines processed, the number of comments that were +% either removed or passed and the number of codelines that were +% written to the output file. Also the totals are updated. +% \begin{macrocode} +%<*stats> + \Msg{Lines \space processed: \the\processedLines^^J% + Comments removed: \the\commentsRemoved^^J% + Comments \space passed: \the\commentsPassed^^J% + Codelines passed: \the\codeLinesPassed^^J}% + \global\advance\TotalprocessedLines by \processedLines + \global\advance\TotalcommentsRemoved by \commentsRemoved + \global\advance\TotalcommentsPassed by \commentsPassed + \global\advance\TotalcodeLinesPassed by \codeLinesPassed +%</stats> +% \end{macrocode} +% The |\NumberOfFiles| need to be known even if no statistics are +% gathered so we update it always. +% \changes{2.4h}{1997/07/07}{update \cs{NumberOfFiles} even if stats are +% not gathered pr/2429} +% \begin{macrocode} + \global\advance\NumberOfFiles by \@ne + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\showfiles@do} +% \changes{2.4a}{1996/10/02}{Macro added (MW)} +% A message is displayed on the terminal telling the user what we +% are about to do. For each open output file we display one line +% saying what options it is generated with and the off-counter +% associated with the file is zeroed. First line contains also name +% of input file. +% Names of output files that are closed are appended to +% |\refusedfiles|. +% \begin{macrocode} +\def\showfiles@do#1#2{% + \ifnum#1=\stream@closed + \@addto\refusedfiles{\noexpand\do#1{#2}}% + \else + \Msg{\@msg + \ifx>#2>\else\space(#2)\fi + \space -> \@stripstring#1} + \change@msg + \csname off@\number#1\endcsname=\z@ + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makeoutlist@do} +% \changes{2.3b}{1995/08/22}{Macro added --- pre-constructed +% off-counters' names} +% This macro selects only open output files and constructs names for +% off-counters. +% \begin{macrocode} +\def\makeoutlist@do#1#2{% + \ifnum#1=\stream@closed\else + \noexpand\do#1{#2}\csname off@\number#1\endcsname + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\openoutput} +% \changes{2.3e}{1996/10/02}{Change for ``open lists'' -- renamed from +% \cs{ensureopen@do}} +% \changes{2.4a}{1996/06/06}{Check whether there are streams left (MDW)} +% This macro opens output streams if possible. +% \begin{macrocode} +\def\openoutput#1{% +% \end{macrocode} +% If both maxfile counters are non-zero\dots +% \begin{macrocode} + \if 1\ifnum\@maxfiles=\z@ 0\fi + \ifnum\@maxoutfiles=\z@ 0\fi1% +% \end{macrocode} +% \dots the stream may be opened and counters decremented. But if +% that cannot be done\dots +% \begin{macrocode} + \advance\@maxfiles\m@ne + \advance\@maxoutfiles\m@ne + \StreamOpen#1% + \WritePreamble#1% + \else +% \end{macrocode} +% \dots the file is added to the ``refuse list''. +% \begin{macrocode} + \@addto\refusedfiles{\noexpand\openoutput#1}% + \fi + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\closeoutput} +% \changes{2.4a}{1996/06/06} +% {Don't close the file if it's not open (MDW)} +% This macro closes open output stream when it is no longer +% needed and increments maxfiles counters. +% \begin{macrocode} +\def\closeoutput#1{% + \ifnum#1=\stream@closed\else + \WritePostamble#1% + \StreamClose#1% + \advance\@maxfiles\@ne + \advance\@maxoutfiles\@ne + \fi} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Preamble and postamble} +% +% \begin{macro}{\ds@heading} +% \changes{2.3e}{1996/09/16}{Macro added.} +% This is a couple of lines, stating what file is being written and +% how it was created. +% \begin{macrocode} +\def\ds@heading{% + \MetaPrefix ^^J% + \MetaPrefix\space This is file `\outFileName',^^J% + \MetaPrefix\space generated with the docstrip utility.^^J% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AddGenerationDate} +% \changes{2.3d}{1995/11/17}{(DPC) Macro added.} +% Older versions of \ds{} added the date that any file was generated +% and the version number of \ds{}. This confused some people as they +% mistook this for the version/date of the file that was being +% written. So now this information is not normally written, but +% a batch file may call this to get an old style header. +% \begin{macrocode} +\def\AddGenerationDate{% + \def\ds@heading{% + \MetaPrefix ^^J% + \MetaPrefix\space This is file `\outFileName', generated % + on <\the\year/\the\month/\the\day> ^^J% + \MetaPrefix\space with the docstrip utility (\fileversion).^^J% + }} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\declarepreamble} +% \changes{2.3a}{1995/08/18}{renamed from \cs{preamble}; +% interface changed} +% \changes{2.0e}{1991/06/01}{Macro added.} +% \changes{2.3e}{1995/09/25} +% {Change for batchfiles working by \cs{input}} +% \changes{2.3e}{1996/09/16}{Change to allow customization.} +% When a batch file is used the +% user can specify a preamble of his own that will be written to +% each file that is created. This can be useful to include an extra +% copyright notice in the stripped version of a file. Also a +% warning that both versions of a file should {\em always\/} be +% distributed together could be written to a stripped file by +% including it in such a preamble. +% +% Every line that is written to |\outFile| that belongs to the +% preamble is preceded by two percent characters. This will prevent +% \ds{} from stripping these lines off the file. +% +% The preamble should be started with the macro +% |\declarepreamble|; it is ended by |\endpreamble|. All +% processing is done within a group in order to be able to locally +% change some values. +% +% |\ReferenceLines| is let equal |\relax| to be unexpandable. +% \begin{macrocode} +\let\inFileName\relax +\let\outFileName\relax +\let\ReferenceLines\relax +\def\declarepreamble{\begingroup +\catcode`\^^M=13 \catcode`\ =12 % +\declarepreambleX} +{\catcode`\^^M=13 % +\gdef\declarepreambleX#1#2 +\endpreamble{\endgroup% + \def^^M{^^J\MetaPrefix\space}% + \edef#1{\ds@heading% + \ReferenceLines% + \MetaPrefix\space\checkeoln#2\empty}}% +\gdef\checkeoln#1{\ifx^^M#1\else\expandafter#1\fi}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\declarepostamble} +% \changes{2.0e}{1991/06/01}{Macro added.} +% \changes{2.3e}{1995/09/25} +% {Change for batchfiles working by \cs{input}} +% Just as a preamble can be +% specified in a batch file, the same can be done for a {\em +% post\/}amble. +% +% The definition of |\declarepostamble| is very much like the +% definition above of |\declarepreamble|. +% \begin{macrocode} +\def\declarepostamble{\begingroup +\catcode`\ =12 \catcode`\^^M=13 +\declarepostambleX} +{\catcode`\^^M=13 % +\gdef\declarepostambleX#1#2 +\endpostamble{\endgroup% + \def^^M{^^J\MetaPrefix\space}% + \edef#1{\MetaPrefix\space\checkeoln#2\empty^^J% + \MetaPrefix ^^J% + \MetaPrefix\space End of file `\outFileName'.% + }}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\usepreamble} +% \begin{macro}{\usepostamble} +% Macros for selecting [pre/post]amble to be used. +% \begin{macrocode} +\def\usepreamble#1{\def\currentpreamble{#1}} +\def\usepostamble#1{\def\currentpostamble{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\nopreamble} +% \changes{2.4i}{1998/01/18}{Macro added. pr/2726} +% \begin{macro}{\nopostamble} +% \changes{2.4i}{1998/01/18}{Macro added. pr/2726} +% Shortcuts for disabling the writing of [pre/post]ambles. +% This is not done by disabling |\WritePreamble| or |\WritePostamble| +% since that wouldn't +% revertable afterwards. Instead the empty [pre/post]ambles are handled +% specially in those macros. +% \begin{macrocode} +\def\nopreamble{\usepreamble\empty} +\def\nopostamble{\usepostamble\empty} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\preamble} +% \changes{2.3c}{1995/08/28}{Bug fixed: default preamble is now selected +% not only defined} +% \begin{macro}{\postamble} +% \changes{2.3c}{1995/08/28}{As for \cs{preamble}} +% For backward compatibility we provide these macros defining +% default preamble and postamble. +% \begin{macrocode} +\def\preamble{\usepreamble\defaultpreamble + \declarepreamble\defaultpreamble} +\def\postamble{\usepostamble\defaultpostamble + \declarepostamble\defaultpostamble} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\org@preamble} +% \changes{2.3a}{1995/08/18}{Macro added} +% \changes{2.3c}{1995/11/16}{With \cs{inFileName} again} +% \begin{macro}{\org@postamble} +% \changes{2.3a}{1995/08/18}{Macro added} +% Default values to use if nothing different is provided. +% \changes{2.2j}{1995/08/06}{Updated default preamble} +% \changes{2.5a}{1998/04/03}{Updated default preamble} +% \begin{macrocode} +\declarepreamble\org@preamble + +IMPORTANT NOTICE: + +For the copyright see the source file. + +Any modified versions of this file must be renamed +with new filenames distinct from \outFileName. + +For distribution of the original source see the terms +for copying and modification in the file \inFileName. + +This generated file may be distributed as long as the +original source files, as listed above, are part of the +same distribution. (The sources need not necessarily be +in the same archive or directory.) +\endpreamble +% \end{macrocode} +% +% \begin{macrocode} +\edef\org@postamble{\string\endinput^^J% + \MetaPrefix ^^J% + \MetaPrefix\space End of file `\outFileName'.% + } +% \end{macrocode} +% +% \begin{macrocode} +\let\defaultpreamble\org@preamble +\let\defaultpostamble\org@postamble +% \end{macrocode} +% +% \begin{macrocode} +\usepreamble\defaultpreamble +\usepostamble\defaultpostamble +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\originaldefault} +% \changes{2.5a}{1998/04/03}{Macro added} +% \changes{2.5b}{1998/04/28}{Macro renamed from \cs{orginaldefault} +% to \cs{originaldefault}} +% The default preamble header changed in v2.5 to allow distribution +% of generated files as long as source also distributed. If you need +% the original default, not allowing distribution of generated files +% add |\usepreamble\originaldefault| to your .ins files. +% Note then that your file can not be included in most TeX distributions +% on CD which are distributed `pre-installed' with all \LaTeX\ files +% extracted form the documented sources and moved to a suitable +% directory in \TeX's search path. +% \begin{macrocode} +\declarepreamble\originaldefault + +IMPORTANT NOTICE: + +For the copyright see the source file. + +You are *not* allowed to modify this file. + +You are *not* allowed to distribute this file. +For distribution of the original source see the terms +for copying and modification in the file \inFileName. + +\endpreamble +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\WritePreamble} +% \changes{2.0e}{1991/06/01}{Macro added.} +% \changes{2.3c}{1995/11/16}{Added definitions of \cs{inFileName} and +% \cs{outFileName}} +% \changes{2.3d}{1995/11/17}{(DPC) Macro added.} +% \changes{2.4i}{1998/01/18}{Test for \cs{empty} postamble and +% don't write it out. pr/2726} +% \begin{macrocode} +\def\WritePreamble#1{% +% \end{macrocode} +% We write out only non-empty preambles. +% \begin{macrocode} + \expandafter\ifx\csname pre@\@stripstring#1\endcsname\empty + \else + \edef\outFileName{\@stripstring#1}% +% \end{macrocode} +% Then the reference lines that tell from what source file(s) the +% stripped file was created and user supplied preamble. +% \begin{macrocode} + \StreamPut#1{\csname pre@\@stripstring#1\endcsname}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\WritePostamble} +% \changes{2.0e}{1991/06/01}{Macro added.} +% \changes{2.3c}{1995/11/16}{Added defs of \cs{inFileName} and +% \cs{outFileName}} +% \changes{2.4i}{1998/01/18}{Test for \cs{empty} postamble and +% don't write it out. pr/2726} +% Postamble attributed to |#1| is written out. The +% last line written identifies the file again. +% \begin{macrocode} +\def\WritePostamble#1{% +% \end{macrocode} +% We write out only non-empty postambles. +% \begin{macrocode} + \expandafter\ifx\csname post@\@stripstring#1\endcsname\empty + \else + \edef\outFileName{\@stripstring#1}% + \StreamPut#1{\csname post@\@stripstring#1\endcsname}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \subsection{Support for writing to specified directories} +% +% As we've seen before every output file is written to directory +% specified by the value of |\destdir| current at the moment of +% this file's |\file| declaration. +% +% \begin{macro}{\usedir} +% \changes{2.3e}{1995/09/15}{Macro added} +% This macro when called should translate its one argument into a +% directory name and define |\destdir| to that value. The default +% for |\usedir| is to ignore its argument and return name of +% current directory (if known). This can be changed by commands +% from |docstrip.cfg| file. +% +% |\showdirectory| is used just to display directory name for +% user's information. +% \begin{macrocode} +\def\usedir#1{\edef\destdir{\WriteToDir}} +\def\showdirectory#1{\WriteToDir} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\BaseDirectory} +% \changes{2.3e}{1995/09/15}{Macro added} +% \changes{2.4e}{1996/10/22}{\cs{@setwritetodir} added (DPC)} +% This is config file command for specifying root directory of the +% \TeX{} hierarchy. It enables the whole directory +% selecting mechanism by redefining |\usedir|. +% First make sure that the directory syntax commands have been set +% up by calling |\@setwritedir|, so that the value of |\dirsep| +% used by the |\edef| is (hopefully) correct. +% \begin{macrocode} +\def\BaseDirectory#1{% + \@setwritetodir + \let\usedir\alt@usedir + \let\showdirectory\showalt@directory + \edef\basedir{#1\dirsep}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\convsep} +% \changes{2.3e}{1995/09/15}{Macro added} +% This macro loops through slashes in its argument replacing them +% with current |\dirsep|. It should be called +% |\convsep some/directory/name/\qStop| (with slash on the end). +% \begin{macrocode} +\def\convsep#1/#2\qStop{% + #1\ifx\qStop#2\qStop \pesvnoc\fi\convsep\dirsep#2\qStop} +\def\pesvnoc#1\qStop{\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\alt@usedir} +% \changes{2.3e}{1995/09/15}{Macro added} +% Directory name construction macro enabling writing to various +% directories. +% \begin{macrocode} +\def\alt@usedir#1{% + \Name\ifx{dir@#1}\relax + \undefined@directory{#1}% + \else + \edef\destdir{\csname dir@#1\endcsname}% + \fi} +\def\showalt@directory#1{% + \Name\ifx{dir@#1}\relax + \showundef@directory{#1}% + \else\csname dir@#1\endcsname\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\undefined@directory} +% \changes{2.4a}{1996/10/04}{Macro added (MW)} +% \changes{2.4e}{1996/10/22}{Help text added (DPC)} +% This macro comes into action when undefined label is spotted. The +% action is to raise an error and define |\destdir| to point to the +% current directory. +% \begin{macrocode} +\def\undefined@directory#1{% + \errhelp{docstrip.cfg should specify a target directory for^^J% + #1 using \DeclareDir or \UseTDS.}% + \errmessage{You haven't defined the output directory for `#1'.^^J% + Subsequent files will be written to the current directory}% + \let\destdir\WriteToDir + } +\def\showundef@directory#1{UNDEFINED (label is #1)} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\undefined@TDSdirectory} +% \changes{2.4a}{1996/10/04}{Macro added (MW)} +% This happens when label is undefined while using TDS. The label +% is converted to use proper separators and appended to base +% directory name. +% \begin{macrocode} +\def\undefined@TDSdirectory#1{% + \edef\destdir{% + \basedir\convsep#1/\qStop + }} +\def\showundef@TDSdirectory#1{\basedir\convsep#1/\qStop} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\UseTDS} +% \changes{2.4a}{1996/10/04}{Macro added (MW)} +% \changes{2.4e}{1996/10/22}{\cs{@setwritetodir} added (DPC)} +% Change of behaviour for undefined labels is done simply: +% \begin{macrocode} +\def\UseTDS{% + \@setwritetodir + \let\undefined@directory\undefined@TDSdirectory + \let\showundef@directory\showundef@TDSdirectory + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareDir} +% \changes{2.3e}{1995/09/15}{Macro added} +% \changes{2.4e}{1996/10/22}{\cs{@setwritetodir} added (DPC)} +% This macro remaps some directory name to another. +% \begin{macrocode} +\def\DeclareDir{\@ifnextchar*{\DeclareDirX}{\DeclareDirX\basedir*}} +\def\DeclareDirX#1*#2#3{% + \@setwritetodir + \Name\edef{dir@#2}{#1#3}} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Compatibility with older versions} +% +% \begin{macro}{\generateFile} +% Main macro of previous versions of \ds. +% \begin{macrocode} +\def\generateFile#1#2#3{{% + \ifx t#2\askforoverwritetrue + \else\askforoverwritefalse\fi + \generate{\file{#1}{#3}}% + }} +% \end{macrocode} +% \end{macro} +% +% To support command files that were written for the first version +% of \ds{} the commands |\include| and |\processFile| +% are defined here. The use of this interface is not recommended +% as it may be removed in a future release of \ds{}. +% +% \begin{macro}{\include} +% \changes{2.0f}{1991/06/04}{Macro added} To provide the \ds{} program +% with a list of options that should be included in the output the +% command \verb=\include{=\meta{Options}\verb=}= can be used. This +% macro is meant to be used in conjunction with the +% |\processFile| command. +% \begin{macrocode} +\def\include#1{\def\Options{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\processFile} +% \changes{2.0f}{1991/06/04}{Supply \texttt{\bsl generateFile} with +% \texttt{\bsl Options}} +%\DeleteShortVerb\| +% The macro +% \verb=\processFile{=\meta{filename}\verb=}{=\meta{inext}\verb=}{=% +%\unskip\meta{outext}\verb=}{=\meta{t{\fontshape{n}\ttfamily|}f}\verb=}= +% can be used when a single input file is used to produce +% a single output file. The macro is also used in the interactive +% mode of the \ds{} program. +%\MakeShortVerb\| +% +% The arguments \meta{inext} and \meta{outext} denote the +% extensions of the input and output files respectively. The fourth +% argument can be used to specify if an existing file should be +% overwritten without asking. If \meta{t} is specified the program +% will ask for permission before overwriting an existing file. +% +% This macro is defined using the more generic macro |\generateFile|. +% \begin{macrocode} +\def\processFile#1#2#3#4{% + \generateFile{#1.#3}{#4}{\from{#1.#2}{\Options}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\processfile} +% \begin{macro}{\generatefile} +% \changes{2.0m}{1991/04/23}{Now issue a warning when \cs{processfile} +% or \cs{generatefile} are used} +% Early +% versions of \ds{} defined |\processfile| and +% |\generatefile| instead of the commands as they are defined in +% this version. To remain upwards compatible, we still provide +% these commands, but issue a warning when they are used. +% \begin{macrocode} +\def\processfile{\Msg{% + ^^Jplease use \string\processFile\space instead of + \string\processfile!^^J}% + \processFile} +\def\generatefile{\Msg{% + ^^Jplease use \string\generateFile\space instead of + \string\generatefile!^^J}% + \generateFile} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Limiting open file streams} +% +% (This section was written by Mark Wooding) +% +% \begin{macro}{\maxfiles} +% \changes{2.4a}{1996/06/06}{Macro added (MDW)} +% Some operating systems with duff libraries or other restrictions +% can't cope with all the files which \ds\ tries to output at once. +% A configuration file can say |\maxfiles{|\meta{number}|}| to +% describe the maximum limit for the environment. +% +% I'll need a counter for this value, so I'd better allocate one. +% +% \begin{macrocode} +\newcount\@maxfiles +% \end{macrocode} +% +% The configuration command |\maxfiles| is just slightly prettier than +% an assignment, for \LaTeX\ people. It also gives me an opportunity +% to check that the limit is vaguely sensible. I need at least 4 +% streams: +% \begin{enumerate} +% \item A batch file. +% \item A sub batch file, which \LaTeX's installation utility uses. +% \item An input stream for reading an unstripped file. +% \item An output stream for writing a stripped file. +% \end{enumerate} +% +% \begin{macrocode} +\def\maxfiles#1{% + \@maxfiles#1\relax + \ifnum\@maxfiles<4 + \errhelp{I'm not a magician. I need at least four^^J% + streams to be able to work properly, but^^J% + you've only let me use \the\@maxfiles.}% + \errmessage{\noexpand\maxfiles limit is too strict.}% + \@maxfiles4 + \fi +} +% \end{macrocode} +% +% \changes{2.4a}{1996/10/03}{No default limit since batchfiles are now +% \cs{input} (MW)} +% Since batchfiles are now |\input|ed there should be no default limit +% here. I'll just use some abstract large number. +% \begin{macrocode} +\maxfiles{1972} % year of my birth (MW) +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\maxoutfiles} +% \changes{2.4a}{1996/06/06}{Macro added (MDW)} +% +% Maybe there's a restriction on just output streams. (Well, there is: +% I know, because \TeX\ only allows 16.) I may as well allow the +% configuration to set this up. +% +% Again, I need a counter. +% +% \begin{macrocode} +\newcount\@maxoutfiles +% \end{macrocode} +% +% And now the macro. I need at least one output stream which I think is +% reasonable. +% +% \begin{macrocode} +\def\maxoutfiles#1{% + \@maxoutfiles=#1\relax + \ifnum\@maxoutfiles<1 + \@maxoutfiles1 + \errhelp{I'm not a magician. I need at least one output^^J% + stream to be able to do anything useful at all.^^J% + Please be reasonable.}% + \errmessage{\noexpand\maxoutfiles limit is insane}% + \fi +} +% \end{macrocode} +% +% The default limit is 16, because that's what \TeX\ says. +% +% \begin{macrocode} +\maxoutfiles{16} +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\checkfilelimit} +% +% This checks the file limit when a new batch file is started. If +% there's fewer than two files left here, we're not going to be able +% to strip any files. The file limit counter is local to the group +% which is set up around |\batchinput|, so that's all pretty cool. +% +% \begin{macrocode} +\def\checkfilelimit{% + \advance\@maxfiles\m@ne + \ifnum\@maxfiles<2 % + \errhelp{There aren't enough streams left to do any unpacking.^^J% + I can't do anything about this, so complain at the^^J% + person who made such a complicated installation.}% + \errmessage{Too few streams left.}% + \end + \fi +} +% \end{macrocode} +% +% \end{macro} +% +% \subsection{Interaction with the user} +% +% \begin{macro}{\strip@meaning} +% Throw away the first part of |\meaning| output. +% \changes{2.4c}{1996/06/11}{Macro added (DPC)} +% \begin{macrocode} +\def\strip@meaning#1>{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\processbatchFile} +% \changes{2.0f}{1991/06/04}{Macro added.} +% \changes{2.3e}{1995/09/25}{Batch file is \cs{input}ed not \cs{read}} +% When \ds{} is run it always tries to use a batch file. +% +% For this purpose it calls the macro |\processbatchFile|. +% +% \changes{2.4a}{1996/06/06} +% {Added check for file limits (MDW)} +% \changes{2.4c}{1996/06/11} +% {Add \cs{jobname} checks (DPC)} +% \changes{2.4d}{1996/06/17} +% {Move \cs{jobname} checks to top level (DPC)} +% The first thing is to check if there are any input streams left. +% \begin{macrocode} +\def\processbatchFile{% + \checkfilelimit + \let\next\relax +% \end{macrocode} +% Now we try to open the batch file for reading. +% \begin{macrocode} + \openin\inputcheck \batchfile\relax + \ifeof\inputcheck +% \end{macrocode} +% If we didn't succeed in opening the file, we assume that it does +% not exist. If we tried the default filename, we silently +% continue; the \ds{} program will switch to interactive mode in +% this case. +% \begin{macrocode} + \ifDefault + \else +% \end{macrocode} +% \changes{2.4d}{1996/10/17}{Missing batchfile an error (DPC)} +% If we failed to open the user-supplied file, something is wrong +% and we warn him about it. This will also result in a switch to +% interactive mode. +% \begin{macrocode} + \errhelp + {A batchfile specified in \batchinput could not be found.}% + \errmessage{^^J% + **************************************************^^J% + * Could not find your \string\batchfile=\batchfile.^^J% + **************************************************}% + \fi + \else +% \end{macrocode} +% When we were successful in opening a file, we again have to check +% whether it was the default file. In that case we tell the user +% we found that file and ask him if he wants to use it. +% \begin{macrocode} + \ifDefault + \Msg{**************************************************^^J% + * Batchfile \DefaultbatchFile\space found Use it? (y/n)?}% + \Ask\answer{% + **************************************************}% + \else +% \end{macrocode} +% When it was the user-supplied file we can safely assume he wants +% to use it so we set |\answer| to \texttt{y}. +% \begin{macrocode} + \let\answer\y + \fi +% \end{macrocode} +% If the macro |\answer| contains a \texttt{y} we can read in the +% batchfile. We do it in an indirect way---after completing |\if|s. +% \begin{macrocode} + \ifx\answer\y + \closein\inputcheck + \def\next{\@@input\batchfile\relax}% + \fi + \fi + \next} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ReportTotals} +% \changes{2.0g}{1991/06/05}{Macro added.} The macro +% |\ReportTotals| can be used to report total statistics for +% all files processed. This code is only included in the program if +% the option \texttt{stats} is included. +% \begin{macrocode} +%<*stats> +\def\ReportTotals{% + \ifnum\NumberOfFiles>\@ne + \Msg{Overall statistics:^^J% + Files \space processed: \the\NumberOfFiles^^J% + Lines \space processed: \the\TotalprocessedLines^^J% + Comments removed: \the\TotalcommentsRemoved^^J% + Comments \space passed: \the\TotalcommentsPassed^^J% + Codelines passed: \the\TotalcodeLinesPassed}% + \fi} +%</stats> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetFileNames} +% The macro |\SetFileNames| is used when the program runs in +% interactive mode and the user was asked to supply extensions and +% a list of filenames. +% \begin{macrocode} +\def\SetFileNames{% + \edef\sourceFileName{\MainFileName.\infileext}% + \edef\destFileName{\MainFileName.\outfileext}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CheckFileNames} +% In interactive mode, the user gets asked for the extensions for +% the input and output files. Also the name or names of the input +% files (without extension) is asked for. Then the names of the +% input and output files are constructed from this information by +% |\SetFileNames|. This assumes that the name of the input file is +% the same as the name of the output file. But we should not write +% to the same file we're reading from so the extensions should +% differ. +% +% The macro |\CheckFileNames| makes sure that the output goes to a +% different file to the one where the input comes from. +% \begin{macrocode} +\def\CheckFileNames{% + \ifx\sourceFileName\destFileName +% \end{macrocode} +% If input and output files are the same we signal an error and stop +% processing. +% \begin{macrocode} + \Msg{^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% + ! It is not possible to read from and write to the same file !^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% + \Continuefalse + \else +% \end{macrocode} +% If they are not the same we check if the input file exists by +% trying to open it for reading. +% \begin{macrocode} + \Continuetrue + \immediate\openin\inFile \sourceFileName\relax + \ifeof\inFile +% \end{macrocode} +% If an end of file was found, the file couldn't be opened, so we +% signal an error and stop processing. +% \begin{macrocode} + \Msg{^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% + ! Your input file `\sourceFileName' was not found !^^J% + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% + \Continuefalse + \else +% \end{macrocode} +% The last check we have to make is if the output file already +% exists. Therefore we try to open it for reading. +% As a precaution we first close the input stream. +% \changes{2.0p}{1992/06/26}{Added \cs{WriteToDir} (FMi).} +% \changes{2.0r}{1992/08/17}{Use \cs{inFile} for reading} +% \changes{2.0r}{1992/08/17}{Moved \cs{closein} statements} +% \begin{macrocode} + \immediate\closein\inFile + \immediate\openin\inFile\destdir \destFileName\relax + \ifeof\inFile +% \end{macrocode} +% If this fails, it didn't exist and all is well. +% \begin{macrocode} + \Continuetrue + \else +% \end{macrocode} +% If opening of the output file for reading succeeded we have to +% ask the user if he wants to overwrite it. We assume he doesn't +% want to overwrite it, so the switch |\ifContinue| is initially +% set to \meta{false}. Only if he answers the question positively +% with `\texttt{y}' or `\texttt{yes}' we set the switch back to +% \meta{true}. +% \changes{2.0p}{1992/06/26}{Changed question about overwriting.} +% \begin{macrocode} + \Continuefalse + \Ask\answer{File \destdir\destFileName\space already + exists + \ifx\empty\destdir somewhere \fi + on the system.^^J% + Overwrite it% + \ifx\empty\destdir\space if necessary\fi + ? [y/n]}% + \ifx\y \answer \Continuetrue \else + \ifx\yes\answer \Continuetrue \else + \fi\fi + \fi +% \end{macrocode} +% All checks have been performed now, so we can close any file that +% was opened just for this purpose. +% \begin{macrocode} + \fi + \fi + \closein\inFile} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\interactive} +% The macro |\interactive| implements the interactive mode of the +% \ds{} program. The macro is implemented using the +% \meta{while} construction. While the switch |\ifMoreFiles| remains +% true, we continue processing. +% \begin{macrocode} +\def\interactive{% + \whileswitch\ifMoreFiles\fi% +% \end{macrocode} +% To keep macro redefinitions local we start a group and ask the +% user some questions about what he wants us to do. +% \begin{macrocode} + {\begingroup + \AskQuestions +% \end{macrocode} +% The names of the files that have to be processed are stored as a +% comma-separated list in the macro |\filelist| by |\AskQuestions|. +% We use a \meta{for} loop to process the files one by one. +% \begin{macrocode} + \forlist\MainFileName:=\filelist + \do +% \end{macrocode} +% First the names of the input and output files are constructed +% and a check is made if all filename information is correct. +% \begin{macrocode} + \SetFileNames + \CheckFileNames + \ifContinue +% \end{macrocode} +% If everything was well, produce output file. +% \changes{2.0q}{1992/07/01}{Preceded filename by \cs{WriteToDir}} +% \begin{macrocode} + \generateFile{\destFileName}{f}% + {\from{\sourceFileName}{\Options}} + \fi% +% \end{macrocode} +% This process is repeated until |\filelist| is exhausted. +% \begin{macrocode} + \od + \endgroup +% \end{macrocode} +% Maybe the user wants more files to be processed, possibly with +% another set of options, so we give him the opportunity. +% \begin{macrocode} + \Ask\answer{More files to process (y/n)?}% + \ifx\y \answer\MoreFilestrue \else + \ifx\yes\answer\MoreFilestrue \else +% \end{macrocode} +% If he didn't want to process any more files, the switch +% |\ifMoreFiles| is set to \meta{false} in order to interrupt the +% \meta{while} loop. +% \begin{macrocode} + \MoreFilesfalse\fi\fi + }} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AskQuestions} +% \changes{2.0e}{1991/06/01}{Macro added.} +% The macro |\AskQuestions| is called by |\interactive| to get +% some information from the user concerning the files that need +% to be processed. +% \begin{macrocode} +\def\AskQuestions{% + \Msg{^^J% + ****************************************************}% +% \end{macrocode} +% We want to know the extension of the input files, +% \begin{macrocode} + \Ask\infileext{% + * First type the extension of your input file(s): \space *}% + \Msg{****************************************************^^J^^J% + ****************************************************}% +% \end{macrocode} +% the extension of the output files, +% \begin{macrocode} + \Ask\outfileext{% + * Now type the extension of your output file(s) \space: *}% + \Msg{****************************************************^^J^^J% + ****************************************************}% +% \end{macrocode} +% if options are to be included and +% \begin{macrocode} + \Ask\Options{% + * Now type the name(s) of option(s) to include \space\space: *}% + \Msg{****************************************************^^J^^J% + ****************************************************^^J% + * Finally give the list of input file(s) without \space\space*}% +% \end{macrocode} +% the name of the input file or a list of names, separated by commas. +% \changes{2.5e}{2014/09/29}{Typo in \cs{Ask} argument fixed} +% \begin{macrocode} + \Ask\filelist{% + * extension separated by commas if necessary % + \space\space\space\space: *}% + \Msg{****************************************************^^J}}% +% \end{macrocode} +% \end{macro} +% +% \subsection{The main program} +% When \TeX\ processes the \ds{} program it displays +% a message about the version of the program and its function +% on the terminal. +% \begin{macrocode} +\Msg{Utility: `docstrip' \fileversion\space <\filedate>^^J% + English documentation \space\space\space <\docdate>}% +\Msg{^^J% + **********************************************************^^J% + * This program converts documented macro-files into fast *^^J% + * loadable files by stripping off (nearly) all comments! *^^J% + **********************************************************^^J}% +% \end{macrocode} +% +% +% \begin{macro}{\WriteToDir} +% Macro |\WriteToDir| is either empty or holds the prefix +% necessary to read a file from the current directory. Under UNIX +% this is |./| but a lot of other systems addopted this concept. +% This macro is a default value for |\destdir|. +% +% The definition of this macro is now delayed until |\@setwritedir| +% is called. +% \changes{2.0p}{1992/06/26}{Macro added (FMi).} +% \changes{2.2a}{1993/12/02}{check texsys file} +% \changes{2.2d}{1994/01/20}{do not read dircheck/texsys file} +% \changes{2.4e}{1996/10/22}{set in \cs{@setwritedir} (DPC)} +% \end{macro} +% +% \begin{macro}{\makepathname} +% \changes{2.3e}{1995/10/24}{Macro added} +% \changes{2.4e}{1996/10/22}{set in \cs{@setwritedir} (DPC)} +% This macro should define |\@pathname| to full path name made by +% combining current value of |\destdir| with its one argument being +% a file name. Its default value defined here is suitable for +% \textsc{unix, ms-dos} and Macintosh, but for some systems it may +% be needed to redefine this in \texttt{docstrip.cfg} file. We +% provide such redefinition for VMS here. +% +% Macro |\dirsep| holds directory separator specific for a +% system. Default value suitable for UNIX and DOS is slash. It +% comes in action when |\usedir| labels are used directly. +% +% The definition of this macro is now delayed until |\@setwritedir| +% is called. +% \end{macro} +% +% \begin{macro}{\@setwritedir} +% \changes{2.4e}{1996/10/22}{macro added (DPC)} +% The following tests try to automatically set the macros |\WriteToDir|, +% |\dirname| and |\makepathname| in Unix, Mac, or VMS style. +% The tests are not run at the top level but held in this macro +% so that a configuration file has a chance to define |\WriteToDir| +% which allows the other two to be set automatically. The tests could +% more simply be run after the configuration file is read, but the +% configuration commands like |\BaseDirectory| need (at least at +% present) to have |\dirsep| correctly defined. It does not define +% any command that is already defined, so by defining these commands +% a configuration file can produce different effects for special needs. +% So this command is called by |BaseDirectory|, |\UseTDS|, +% |\DeclareDir| and finally at the top level after the cfg is run. +% It begins by redefining itself to be a no-op so it effectively is +% only called once. +% \begin{macrocode} +\def\@setwritetodir{% + \let\setwritetodir\relax +% \end{macrocode} +% +% \begin{macrocode} + \ifx\WriteToDir\@undefined + \ifx\@currdir\@undefined + \def\WriteToDir{}% + \else + \let\WriteToDir\@currdir + \fi + \fi +% \end{macrocode} +% +% \begin{macrocode} + \let\destdir\WriteToDir +% \end{macrocode} +% +% VMS Style. +% \begin{macrocode} + \def\tmp{[]}% + \ifx\tmp\WriteToDir + \ifx\dirsep\@undefined + \def\dirsep{.}% + \fi + \ifx\makepathname\@undefined + \def\makepathname##1{% + \edef\@pathname{\ifx\WriteToDir\destdir + \WriteToDir\else[\destdir]\fi##1}}% + \fi + \fi +% \end{macrocode} +% +% Unix and Mac styles. +% \begin{macrocode} + \ifx\dirsep\@undefined + \def\dirsep{/}% + \def\tmp{:}% + \ifx\tmp\WriteToDir + \def\dirsep{:}% + \fi + \fi +% \end{macrocode} +% +% \begin{macrocode} + \ifx\makepathname\@undefined + \def\makepathname##1{% + \edef\@pathname{\destdir\ifx\empty\destdir\else + \ifx\WriteToDir\destdir\else\dirsep\fi\fi##1}}% + \fi} +% \end{macrocode} +% \end{macro} +% +% +% If the user has a |docstrip.cfg| file, use it now. +% \changes{2.4d}{1995/10/17}{Move config file test to outer level (DPC)} +% This macro tries to read \texttt{docstrip.cfg} file. If this +% succeeds executes its first argument, otherwise the second. +% \begin{macrocode} +\immediate\openin\inputcheck=docstrip.cfg\relax +\ifeof\inputcheck + \Msg{% + ********************************************************^^J% + * No Configuration file found, using default settings. *^^J% + ********************************************************^^J}% +\else + \Msg{% + ******************************************^^J% + * Using Configuration file docstrip.cfg. *^^J% + ******************************************^^J}% + \closein\inputcheck + \afterfi{\@@input docstrip.cfg\relax} +\fi +% \end{macrocode} +% +% Now run |\@setwritedir| in case it has not already been run +% by a command in a configuration file. +% \begin{macrocode} +\@setwritetodir +% \end{macrocode} +% +% \begin{macro}{\process@first@batchfile} +% \changes{2.4d}{1996/10/17} +% {Macro added (DPC)} +% Process the batch file, and then terminate cleanly. +% This may be set to |\relax| for `new style' batch files that +% do not start with |\def\batchfile{|\ldots +% \begin{macrocode} +\def\process@first@batchfile{% + \processbatchFile + \ifnum\NumberOfFiles=\z@ + \interactive + \fi + \endbatchfile} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endbatchfile} +% \changes{2.4d}{1996/10/17} +% {Macro added (DPC)} +% User level command to end batch file processing. +% At the top level, returns totals and then stops \TeX. +% At nested levels just does |\endinput|. +% \begin{macrocode} +\def\endbatchfile{% + \iftopbatchfile +%<*stats> + \ReportTotals +%</stats> + \expandafter\end + \else + \endinput + \fi} +% \end{macrocode} +% \end{macro} +% +% Now we see whether to process a batch file. +% \changes{2.4d}{1996/10/17} +% {Move default batchfile check to outer level (DPC)} +% +% +% \begin{macro}{\@jobname} +% \changes{2.4d}{1996/10/17} +% {Macro added (DPC)} +% Jobname (catcode 12) +% \begin{macrocode} +\edef\@jobname{\lowercase{\def\noexpand\@jobname{\jobname}}}% +\@jobname +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@docstrip} +% \changes{2.4d}{1996/10/17} +% {Macro added (DPC)} +% docstrip (catcode 12) +% \begin{macrocode} +\def\@docstrip{docstrip}% +\edef\@docstrip{\expandafter\strip@meaning\meaning\@docstrip} +% \end{macrocode} +% \end{macro} +% +% First check whether the user has +% defined the control sequence |\batchfile|. If he did, it should +% contain the name of the file to process. +% If he didn't, try the current file, unless that is |docstrip.tex| +% in which case a default name is tried. +% Whether or not the default batch file is used is +% remembered by setting the switch |\ifDefault| to \meta{true} or +% \meta{false}. +% \begin{macrocode} +\Defaultfalse +% \end{macrocode} +% +% \begin{macrocode} +\ifx\undefined\batchfile +% \end{macrocode} +% |\@jobname| is lowercase jobname (catcode 12)\\ +% |\@docstrip| is docstrip (catcode 12) +% \begin{macrocode} + \ifx\@jobname\@docstrip +% \end{macrocode} +% Set the batchfile to the default +% \begin{macrocode} + \let\batchfile\DefaultbatchFile + \Defaulttrue +% \end{macrocode} +% Else don't process a new batchfile, just carry on with past the end +% of this file. In this case processing will move to the initial +% batchfile which \emph{must} then be terminated by |\endbatchfile| or +% \TeX\ will fall to the star prompt. +% \begin{macrocode} + \else + \let\process@first@batchfile\relax + \fi +\fi +\process@first@batchfile +% \end{macrocode} +% +% \begin{macrocode} +%</program> +% \end{macrocode} +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/docstrip.ins b/Master/texmf-dist/source/latex-dev/base/docstrip.ins new file mode 100644 index 00000000000..61a9343af62 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/docstrip.ins @@ -0,0 +1,135 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% +% If the top level file is docstrip.ins, most TeXs set \jobname to +% docstrip which would make docstrip program think it should run +% in interactive mode. So redefine \jobname in this install file. + +\let\jobname\relax +\input docstrip.dtx + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + + + +\declarepostamble\istpost +\endpostamble + +\keepsilent + +% programs and packages + +\usedir{tex/latex/base} + +\generate{\file{docstrip.tex}{\from{docstrip.dtx}{initex,program,stats}} + } + + +\generate{\file{ltxdoc.cls}{\from{ltxdoc.dtx}{class}} + } + +\generate{\file{doc.sty}{\from{doc.dtx}{package}} + \file{shortvrb.sty}{\from{doc.dtx}{shortvrb}} + \usepostamble\istpost + \usedir{makeindex/latex} + \file{gind.ist}{\from{doc.dtx}{gind}} + \file{gglo.ist}{\from{doc.dtx}{gglo}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space doc.sty} +\Msg{* \space\space shortvrb.sty} +\Msg{* \space\space docstrip.tex} +\Msg{*} +\Msg{* Also move the following files into a directory searched} +\Msg{* by MakeIndex:} +\Msg{*} +\Msg{* \space\space gind.ist} +\Msg{* \space\space gglo.ist} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/ec.ins b/Master/texmf-dist/source/latex-dev/base/ec.ins new file mode 100644 index 00000000000..c6115089819 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ec.ins @@ -0,0 +1,141 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\Msg{*** Generating font defs for Cork encoded + and Text Companion fonts ***} + +\generate{ + \file{t1cmfib.fd}{ + \from{cmfonts.fdd}{fd,T1cmfib,ec}} + \file{t1cmfr.fd}{ + \from{cmfonts.fdd}{fd,T1cmfr,ec}} + \file{t1cmdh.fd}{ + \from{cmfonts.fdd}{fd,T1cmdh,ec}} + \file{t1cmr.fd}{ + \from{cmfonts.fdd}{fd,T1cmr,ec}} + \file{t1cmss.fd}{ + \from{cmfonts.fdd}{fd,T1cmss,ec}} + \file{t1cmtt.fd}{ + \from{cmfonts.fdd}{fd,T1cmtt,tt,ec,nowarn}} + \file{t1cmvtt.fd}{ + \from{cmfonts.fdd}{fd,T1cmvtt,tt,ec}} + \file{ts1cmr.fd}{ + \from{cmfonts.fdd}{fd,TS1cmr,ec}} + \file{ts1cmss.fd}{ + \from{cmfonts.fdd}{fd,TS1cmss,ec}} + \file{ts1cmtt.fd}{ + \from{cmfonts.fdd}{fd,TS1cmtt,ec,tt}} + \file{ts1cmvtt.fd}{ + \from{cmfonts.fdd}{fd,TS1cmvtt,ec,tt}} +} + + +\generate{ + \file{t1lcmss.fd}{ + \from{slifonts.fdd}{lcmss,fd,ec}} + \file{t1lcmtt.fd}{ + \from{slifonts.fdd}{lcmtt,fd,ec}} + } + + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.fdd' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/exscale.dtx b/Master/texmf-dist/source/latex-dev/base/exscale.dtx new file mode 100644 index 00000000000..49e53ca5f87 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/exscale.dtx @@ -0,0 +1,202 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% File: exscale.dtx +%% Copyright (C) 1992-1997,2007 Frank Mittelbach and Rainer Sch\"opf, +%% all rights reserved. +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{exscale} +%<fd, >\ProvidesFile{OMXcmex.fd} +%<package,fd> [2018/09/24 v2.1i +%<package> Standard LaTeX package exscale] +%<fd, > exscale package font definitions] +%<*driver> +\documentclass{ltxdoc} +\usepackage{exscale} +\GetFileInfo{exscale.sty} +\begin{document} +\title{The \texttt{exscale} package\thanks + {This file has version number \fileversion, dated \filedate.}\\ + for use with \LaTeX2e} +\author{Frank Mittelbach \and Rainer Sch\"opf} +\date{\filedate} +\MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{exscale.dtx} +\end{document} +%</driver> +% \fi +% +% +% \changes{v2.1g}{1997/06/16}{Documentation fix.} +% \changes{v2.1d}{1994/05/09}{Added setting \cs{big}... sizes.} +% \changes{v2.1c}{1994/05/08}{Changed to new documentation standards.} +% \changes{v2.1a}{1993/12/12}{Update for \LaTeXe} +% +% \def\MF{\textsf{Metafont}} +% \def\dst{{\normalfont\scshape docstrip}} +% +% +% \section{Introduction} +% +% On popular request, this package implements scaling of the +% math extension font `cmex'. If this package is used the site needs +% scaled versions of the \texttt{cmex10} in the sizes 10.95pt, 12pt, +% 14.4pt , 17.28pt, 20.74pt, and 24.88pt which corresponds to standard +% magsteps using |\magstephalf|, and |\magstep1| through |\magstep5|. +% Additionally `cmex' variants for the sizes 7pt to 9pt are necessary. +% These fonts are part of the AMS font package and can be found on +% many servers. +% +% We don't think that using a scalable `cmex' font improves the +% appearance of the document very much because the linear scaling of +% the font introduces changes to font dimen parameters of the font +% that are used all over the place in \TeX's math placement routines +% and definitely shouldn't be scaled linearly. As a positive result, +% however, symbols from this font will come out in approximately the +% right size when used with a large basis font size. +% +% We therefore strongly recommend the generation of designed fonts for +% the larger sizes and hope that the corresponding \MF{} sources will +% be available in the near future. +% +% +% \section{Usage} +% +% This file can be used either as a package by placing its name +% in the argument of +% |\usepackage|, or by generating from it a |.fd| file which then +% replaces the normally used |.fd| file |OMXcmex.fd|. +% +% For the second solution you should prepare a small \dst{} command +% file containing the following statements: +% \begin{quote} +% |\def\batchfile{|\meta{name-of-your-command-file}|}| \\ +% |\input docstrip.tex| \\ +% |\generateFile{OMXcmex.fd}{t}{\from{exscale.dtx}{fd}}| +% \end{quote} +% and then run this file through \LaTeX. +% This would mean however, that your documents may look different if +% they are printed on another installation whereas when using the +% package file they would come out the same on both sites. +% +% \StopEventually{} +% +% +% \section{Implementation} +% +% +% In case this should produce a font definition file we write +% a message to the transcript file only. +% The explicit spaces are necessary in an +% |.fd| file and the |\string| guards against situations where |`|, +% |<| or |>| is active. +% \changes{v2.1f}{1995/11/27}{Use \cs{ProvidesFile}} +% \begin{macrocode} +%\ProvidesFile{OMXcmex.fd}[]% moved to top of the file +% \end{macrocode} +% +% We now define to which external fonts the font/shape Computer Modern +% Extension Medium Normal. For the sizes 7--10pt we use fonts that are +% designed for the corresponding size and for the higher sizes we use +% scaled versions of the 10pt font since for these sizes no designed +% fonts are easily available. +% \begin{macrocode} +%<*fd|package> +\DeclareFontShape{OMX}{cmex}{m}{n}{% +% \end{macrocode} +% According to Michael Downes `cmex5' and `cmex6' are not +% distributed currently. Therefore we use `cmex7' in those size but +% we omit a warning. +% \begin{macrocode} + <-8>sfixed * cmex7 + <8> cmex8 + <9> cmex9 + <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88>cmex10 + }{} +%</fd|package> +% \end{macrocode} +% +% We also redeclare the symbol font for large symbols. This is +% already done when the base format also uses CM math fonts, but it +% doesn't hurt either. +% \begin{macrocode} +%<*package> +\DeclareSymbolFont{largesymbols}{OMX}{cmex}{m}{n} +% \end{macrocode} +% +% Finally we redefine the primitive commands |\big|, |\Big|, |\bigg| +% and |\Bigg| to change size with main size changes. To this end we +% need a new dimen register |\big@size|. +% \begin{macrocode} +\newdimen\big@size +% \end{macrocode} +% This dimen is set with every size change to $1.2$ times the height +% of a left parenthesis. +% \changes{v2.1e}{1994/11/06}{Renamed \cs{every@size} to +% \cs{every@math@size}} +% \changes{v2.1e}{1994/11/06}{Update \cs{big@size} globally} +% \changes{v2.1h}{2001/10/29}{Use box 0 within group to avoid changing this +% scratch register} +% \begin{macrocode} +\addto@hook\every@math@size{% + \begingroup + \setbox\z@\vbox{\hbox{$($}\kern\z@}% + \global\big@size 1.2\ht\z@ + \endgroup} +% \end{macrocode} +% Now we can define the macros. Note: |\n@space| sets the internal +% variables |\nulldelimiterspace| and |\mathsurround| to zero length. +% +% Older kernels (e.g in roll back didn't have LR-mode with the +% these commands) so we test for the support comment. This only works +% if the rollback request is before loading this package but that is +% where it should be. +% \changes{v2.1i}{2018/09/24}{Start LR-mode if necessary (git/49)} +% \begin{macrocode} +\ifx\leavevmode@ifvmode\@undefined +\def\bBigg@#1#2{% + {\hbox{$\left#2\vcenter to#1\big@size{}\right.\n@space$}}} +\else +\def\bBigg@#1#2{\leavevmode@ifvmode + {\hbox{$\left#2\vcenter to#1\big@size{}\right.\n@space$}}} +\fi +\def\big{\bBigg@\@ne} +\def\Big{\bBigg@{1.5}} +\def\bigg{\bBigg@\tw@} +\def\Bigg{\bBigg@{2.5}} +% \end{macrocode} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/exscale.ins b/Master/texmf-dist/source/latex-dev/base/exscale.ins new file mode 100644 index 00000000000..4e4a36996de --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/exscale.ins @@ -0,0 +1,103 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generateFile{exscale.sty}{t}{% + \from{exscale.dtx}{package}} + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space exscale.sty} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX2e.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx b/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx new file mode 100644 index 00000000000..b4311efa3c3 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/fix-cm.dtx @@ -0,0 +1,829 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +% +%<*dtx> + \ProvidesFile{fix-cm.dtx} +%</dtx> +%<fix-cm>\NeedsTeXFormat{LaTeX2e} +%<fix-cm>\ProvidesPackage{fix-cm} +%<driver>\ProvidesFile{fix-cm.drv} +% \fi +% \ProvidesFile{fix-cm.dtx} + [2015/01/14 v1.1t fixes to LaTeX] +% +% \iffalse +%<*driver> + \documentclass{ltxdoc} + \newcommand\Lopt[1]{\textsf{#1}} + \let\Lpack\Lopt + \providecommand{\file}[1]{\texttt{#1}} + \providecommand{\MF}{\textsf{Metafont}} + \providecommand{\danger}{\marginpar[\hfill\protect\Huge!!]{\protect\Huge!!\hfill}} + \begin{document} + \DocInput{fix-cm.dtx} + \end{document} +%</driver> +% \fi +% +% +% +% +% +% \let\package\textsf +% +% +% \GetFileInfo{fix-cm.dtx} +% +% \title{The \Lpack{fix-cm} package\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{Frank Mittelbach, David Carlisle, Chris Rowley, Walter +% Schmidt\thanks{Walter wrote \Lpack{fix-cm}}} +% \date{\filedate} +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \begin{abstract} +%\Lpack{fix-cm} improves the definitions of the Computer Modern +% font families. +% \end{abstract} +% +% \tableofcontents +% +% \newpage +% +% \section{Introduction} +% +% +% \begin{sloppypar} +% To use the \Lpack{fix-cm} package, +% load \danger it \emph{before} \cmd{\documentclass}, +% and use the command \cmd{\RequirePackage} to do so, rather than the +% normal \cmd{\usepackage}: +% \end{sloppypar} +% \begin{verse} +% |\RequirePackage{fix-cm}|\\ +% |\documentclass| \dots +% \end{verse} +% +% +% \section{Using EC fonts (T1 encoding) makes my documents look +% different} +% +% No I'm not trying to collect any cites from the news group +% discussion on this topic. In a nutshell, if one adds +%\begin{verbatim} +%\usepackage[T1]{fontenc} +%\end{verbatim} +% to a document that uses the Computer Modern typefaces, +% then not only the T1 encoding is used but the fonts +% used in the document look noticeably different. This is due to the fact +% that the EC fonts have more font series designs, e.g.\ a 14.4\,pt bold +% etc and those get used in the standard \texttt{.fd} files, while +% with Computer Modern (in OT1 encoding) such sizes were scaled +% versions of smaller sizes---with a noticeable different look and +% feel. +% +% So we provide a package \Lpack{fix-cm} to ensure that comparable +% definitions are used. In addition to that, the package +% \Lpack{fix-cm} also enables continuous scaling of the CM fonts. +% This package was written by Walter Schmidt. +% +%% +%^^A The documentation in this section was prepared by Walter Schmidt. +% +% +% +% \subsection{What \Lpack{fix-cm} does} +% + +% Loading the package \Lpack{fix-cm} changes the font definitions of the +% Computer Modern fonts, in order to achieve the following effects: +% \begin{itemize} +% \item +% The appearance of the T1 and TS1 encoded CM fonts (aka `EC') is +% made as similar as possible to the traditional (OT1 encoded) ones. +% Particularly, a number of broken or ugly design sizes are no +% longer used, the look of the bold sans serif typeface at large +% sizes is considerably improved, and mismatches between the text +% fonts and the corresponding math fonts are avoided. As a side +% effect, PostScript and PDF documents may become smaller, because +% fewer fonts need to be embedded. +% \item +% The Computer Modern fonts are made available with arbitrary sizes. +% \item +% Only those design sizes of the fonts will be used, that are +% normally available in Type1 format, too. You need not load the +% extra package \Lpack{cmmib57} for this purpose. +% \end{itemize} +% The package acts on the following font families: +% \begin{itemize} +% \item +% The text font families \file{cmr}, \file{cmss}, \file{cmtt} and +% \file{cmvtt} with OT1, T1 and TS1 encoding. +% \item +% The default math fonts used by \LaTeX, i.e., the font families +% \file{cmm} with encoding OML and \file{cms} with encoding OMS. +% \item +% The symbols used by the package \Lpack{latexsym}, i.e., the font +% family \file{lasy}. +% \end{itemize} +% Note that the package does \emph{not} act on: +% \begin{itemize} +% \item Font families such as CM~Fibonacci, CM~Dunhill etc., +% which are provided for experimental purposes or for fun only. +% \item +% CM text fonts with character sets other than Latin, e.g., +% Cyrillic. Loading of the required font and encoding definitions +% while the fonts are not actually used, would not be a good idea. +% This should be addressed by particular packages or by changing the +% standard FDs of these fonts. +% \item +% Extra math fonts such as the AMS symbol fonts. While +% they match the style of Computer Modern, they are frequently used +% in conjunction with other font families, too. Thus, +% \Lpack{fix-cm} is obviously not the right place to make sure that +% they can be scaled continuously. Ask the maintainers of these +% fonts to provide this feature, which is badly needed! +% \item +% The math extension font \file{cmex}. Whether or not this font +% should be scaled is a question of its own, and there are other +% packages (\Lpack{exscale}, \Lpack{amsmath}, \Lpack{amsfonts}) to +% take care of it. +% \end{itemize} +% +% \subsection{How to load the package} +% \begin{sloppypar} +% The package should be loaded \danger \emph{before} \cmd{\documentclass}, +% using the command |\RequirePackage{fix-cm}|, rather than the +% normal \cmd{\usepackage}. +% Rationale: +% If the package is loaded in the preamble, a preceding package or +% even the code of the document class may have used any of the CM +% fonts already. However, the definitions of those fonts, that are +% already in use, cannot be changed any more. +% \end{sloppypar} +% +% \subsection{Usage notes} +% In contrast to what you may expect, \Lpack{fix-cm} does \emph{not} +% ensure that line and page breaks stay the same, when you switch an +% existing document from OT1 to T1 encoding. The package does not +% turn off all of the additional design sizes in the EC fonts +% collection: Those, that contribute considerably to the typographical +% quality and do not conflict with the math fonts, +% are---indeed---used. +% +% Be careful when using arbitrary, non-standard font sizes with +% applications that need bitmap fonts: You may end up \danger with +% lots of possibly huge \file{.pk} files. Also, \MF{} chokes +% sometimes on extremely small or large sizes, because of arithmetic +% problems. +% +% \Lpack{fix-cm} supersedes the experimental packages \Lpack{cmsd} and +% \Lpack{fix-ec}, which are no longer distributed. +% +% The packages \Lpack{type1cm} and \Lpack{type1ec} must not be loaded +% additionally; they enable only continuous scaling. +% +% +% +% +% \StopEventually{} +% +% \section{Implementation} +% +% \subsection{Preliminaries} +% The \LaTeX{} kernel does not declare the font encoding TS1. +% However, we are going to set up font definitions for this encoding, +% so we have to declare it now. +% \begin{macrocode} +%<*fix-cm> +\input{ts1enc.def} +% \end{macrocode} +% +% In case the package is loaded in the preamble, any of the CM fonts may +% have been used already and cannot be redefined. Yet we try to +% intercept at least the problem that is most likely to occur, i.e., +% a hidden \cmd{\normalfont}. Most of the standard definitions +% are ok, but those for T1 encoding and 10.95\,pt need to be removed: +% \begin{macrocode} +\expandafter \let \csname T1/cmr/m/n/10.95\endcsname \relax +\expandafter \let \csname T1/cmss/m/n/10.95\endcsname \relax +\expandafter \let \csname T1/cmtt/m/n/10.95\endcsname \relax +\expandafter \let \csname T1/cmvtt/m/n/10.95\endcsname \relax +% \end{macrocode} +% +% \Lpack{fix-cm} may still fail, if the EC fonts are preloaded in the +% \LaTeX{} format file. This situation is, however, very unlikely and could occur +% only with a customized format. +% +% The remainder of the package is enclosed in a group, where the catcodes +% are guaranteed to be appropriate for the processing of font definitions. +% \begin{macrocode} +\begingroup +\nfss@catcodes +% \end{macrocode} +% +% \subsection{T1 encoding} +% +% \paragraph{CM Roman} +% \begin{macrocode} +\DeclareFontFamily{T1}{cmr}{} +\DeclareFontShape{T1}{cmr}{m}{n}{ + <-6> ecrm0500 + <6-7> ecrm0600 + <7-8> ecrm0700 + <8-9> ecrm0800 + <9-10> ecrm0900 + <10-12> ecrm1000 + <12-17> ecrm1200 + <17-> ecrm1728 + }{} +\DeclareFontShape{T1}{cmr}{m}{sl}{ + <-6> ecsl0500 + <6-7> ecsl0600 + <7-8> ecsl0700 + <8-9> ecsl0800 + <9-10> ecsl0900 + <10-12> ecsl1000 + <12-17> ecsl1200 + <17-> ecsl1728 + }{} +\DeclareFontShape{T1}{cmr}{m}{it}{ + <-8> ecti0700 + <8-9> ecti0800 + <9-10> ecti0900 + <10-12> ecti1000 + <12-17> ecti1200 + <17-> ecti1728 + }{} +\DeclareFontShape{T1}{cmr}{m}{sc}{ + <-6> eccc0500 + <6-7> eccc0600 + <7-8> eccc0700 + <8-9> eccc0800 + <9-10> eccc0900 + <10-12> eccc1000 + <12-17> eccc1200 + <17-> eccc1728 + }{} +\DeclareFontShape{T1}{cmr}{m}{ui}{ + <-8> ecui0700 + <8-9> ecui0800 + <9-10> ecui0900 + <10-12> ecui1000 + <12-17> ecui1200 + <17-> ecui1728 + }{} +\DeclareFontShape{T1}{cmr}{b}{n}{ + <-6> ecrb0500 + <6-7> ecrb0600 + <7-8> ecrb0700 + <8-9> ecrb0800 + <9-10> ecrb0900 + <10-12> ecrb1000 + <12-17> ecrb1200 + <17-> ecrb1728 + }{} +\DeclareFontShape{T1}{cmr}{bx}{n}{ + <-6> ecbx0500 + <6-7> ecbx0600 + <7-8> ecbx0700 + <8-9> ecbx0800 + <9-10> ecbx0900 + <10-12> ecbx1000 + <12-> ecbx1200 + }{} +\DeclareFontShape{T1}{cmr}{bx}{sl}{ + <-6> ecbl0500 + <6-7> ecbl0600 + <7-8> ecbl0700 + <8-9> ecbl0800 + <9-10> ecbl0900 + <10-12> ecbl1000 + <12-> ecbl1200 + }{} +\DeclareFontShape{T1}{cmr}{bx}{it}{ + <-8> ecbi0700 + <8-9> ecbi0800 + <9-10> ecbi0900 + <10-12> ecbi1000 + <12-> ecbi1200 + }{} +\DeclareFontShape{T1}{cmr}{bx}{sc}{ + <-6> ecxc0500 + <6-7> ecxc0600 + <7-8> ecxc0700 + <8-9> ecxc0800 + <9-10> ecxc0900 + <10-12> ecxc1000 + <12-> ecxc1200 + }{} +% +% \end{macrocode} +% +% \paragraph{CM Sans} +% \begin{macrocode} +\DeclareFontFamily{T1}{cmss}{} +\DeclareFontShape{T1}{cmss}{m}{n}{ + <-9> ecss0800 + <9-10> ecss0900 + <10-12> ecss1000 + <12-17> ecss1200 + <17-> ecss1728 + }{} +\DeclareFontShape{T1}{cmss}{m}{sl}{ + <-9> ecsi0800 + <9-10> ecsi0900 + <10-12> ecsi1000 + <12-17> ecsi1200 + <17-> ecsi1728 + }{} +\DeclareFontShape{T1}{cmss}{m}{it} + {<->ssub*cmss/m/sl}{} +\DeclareFontShape{T1}{cmss}{m}{sc} + {<->sub*cmr/m/sc}{} +\DeclareFontShape{T1}{cmss}{sbc}{n}{ + <-> ecssdc10 + }{} +\DeclareFontShape{T1}{cmss}{bx}{n}{ + <-10> ecsx0900 + <10-> ecsx1000 + }{} +\DeclareFontShape{T1}{cmss}{bx}{sl}{ + <-10> ecso0900 + <10-> ecso1000 + }{} +\DeclareFontShape{T1}{cmss}{bx}{it} + {<->ssub*cmss/bx/sl}{} +% \end{macrocode} +% The following substitutions are not provided in the default +% \file{.fd} files. I have included them, so that you can +% easily use the EC fonts with the default bold series being +% \file{b} rather than \file{bx}. +% \begin{macrocode} +\DeclareFontShape{T1}{cmss}{b}{n} + {<->ssub*cmss/bx/n}{} +\DeclareFontShape{T1}{cmss}{b}{sl} + {<->ssub*cmss/bx/sl}{} +\DeclareFontShape{T1}{cmss}{b}{it} + {<->ssub*cmss/bx/sl}{} +% \end{macrocode} +% +% \paragraph{CM Typewriter} +% \begin{macrocode} +\DeclareFontFamily{T1}{cmtt}{\hyphenchar \font\m@ne} +\DeclareFontShape{T1}{cmtt}{m}{n}{ + <-9> ectt0800 + <9-10> ectt0900 + <10-12> ectt1000 + <12-17> ectt1200 + <17-> ectt1728 + }{} +\DeclareFontShape{T1}{cmtt}{m}{it}{ + <-9> ecit0800 + <9-10> ecit0900 + <10-12> ecit1000 + <12-17> ecit1200 + <17-> ecit1728 + }{} +\DeclareFontShape{T1}{cmtt}{m}{sl}{ + <-9> ecst0800 + <9-10> ecst0900 + <10-12> ecst1000 + <12-17> ecst1200 + <17-> ecst1728 + }{} +\DeclareFontShape{T1}{cmtt}{m}{sc}{ + <-9> ectc0800 + <9-10> ectc0900 + <10-12> ectc1000 + <12-17> ectc1200 + <17-> ectc1728 + }{} +\DeclareFontShape{T1}{cmtt}{bx}{n} + {<->sub * cmtt/m/n}{} +\DeclareFontShape{T1}{cmtt}{bx}{it} + {<->sub * cmtt/m/it}{} +\DeclareFontShape{T1}{cmtt}{bx}{sl} + {<->sub * cmtt/m/sl}{} +% \end{macrocode} +% Substitutions not provided in the default \file{.fd} files: +% \begin{macrocode} +\DeclareFontShape{T1}{cmtt}{b}{n} + {<->sub * cmtt/m/n}{} +\DeclareFontShape{T1}{cmtt}{b}{it} + {<->sub * cmtt/m/it}{} +\DeclareFontShape{T1}{cmtt}{b}{sl} + {<->sub * cmtt/m/sl}{} +% \end{macrocode} +% +% \paragraph{CM Typewiter (var.)} +% \begin{macrocode} +\DeclareFontFamily{T1}{cmvtt}{} +\DeclareFontShape{T1}{cmvtt}{m}{n}{ + <-9> ecvt0800 + <9-10> ecvt0900 + <10-12> ecvt1000 + <12-17> ecvt1200 + <17-> ecvt1728 + }{} +\DeclareFontShape{T1}{cmvtt}{m}{it}{ + <-9> ecvi0800 + <9-10> ecvi0900 + <10-12> ecvi1000 + <12-17> ecvi1200 + <17-> ecvi1728 + }{} +% \end{macrocode} +% +% \subsection{TS1 encoding} +% +% \paragraph{CM Roman} +% \begin{macrocode} +\DeclareFontFamily{TS1}{cmr}{\hyphenchar\font\m@ne} +\DeclareFontShape{TS1}{cmr}{m}{n}{ + <-6> tcrm0500 + <6-7> tcrm0600 + <7-8> tcrm0700 + <8-9> tcrm0800 + <9-10> tcrm0900 + <10-12> tcrm1000 + <12-17> tcrm1200 + <17-> tcrm1728 + }{} +\DeclareFontShape{TS1}{cmr}{m}{sl}{ + <-6> tcsl0500 + <6-7> tcsl0600 + <7-8> tcsl0700 + <8-9> tcsl0800 + <9-10> tcsl0900 + <10-12> tcsl1000 + <12-17> tcsl1200 + <17-> tcsl1728 + }{} +\DeclareFontShape{TS1}{cmr}{m}{it}{ + <-8> tcti0700 + <8-9> tcti0800 + <9-10> tcti0900 + <10-12> tcti1000 + <12-17> tcti1200 + <17-> tcti1728 + }{} +\DeclareFontShape{TS1}{cmr}{m}{ui}{ + <-8> tcui0700 + <8-9> tcui0800 + <9-10> tcui0900 + <10-12> tcui1000 + <12-17> tcui1200 + <17-> tcui1728 + }{} +\DeclareFontShape{TS1}{cmr}{b}{n}{ + <-6> tcrb0500 + <6-7> tcrb0600 + <7-8> tcrb0700 + <8-9> tcrb0800 + <9-10> tcrb0900 + <10-12> tcrb1000 + <12-17> tcrb1200 + <17-> tcrb1728 + }{} +\DeclareFontShape{TS1}{cmr}{bx}{n}{ + <-6> tcbx0500 + <6-7> tcbx0600 + <7-8> tcbx0700 + <8-9> tcbx0800 + <9-10> tcbx0900 + <10-12> tcbx1000 + <12-> tcbx1200 + }{} +\DeclareFontShape{TS1}{cmr}{bx}{sl}{ + <-6> tcbl0500 + <6-7> tcbl0600 + <7-8> tcbl0700 + <8-9> tcbl0800 + <9-10> tcbl0900 + <10-12> tcbl1000 + <12-> tcbl1200 + }{} +\DeclareFontShape{TS1}{cmr}{bx}{it}{ + <-8> tcbi0700 + <8-9> tcbi0800 + <9-10> tcbi0900 + <10-12> tcbi1000 + <12-> tcbi1200 + }{} +% \end{macrocode} +% +% \paragraph{CM Sans} +% \begin{macrocode} +\DeclareFontFamily{TS1}{cmss}{\hyphenchar\font\m@ne} +\DeclareFontShape{TS1}{cmss}{m}{n}{ + <-9> tcss0800 + <9-10> tcss0900 + <10-12> tcss1000 + <12-17> tcss1200 + <17-> tcss1728 + }{} +\DeclareFontShape{TS1}{cmss}{m}{it} + {<->ssub*cmss/m/sl}{} +\DeclareFontShape{TS1}{cmss}{m}{sl}{ + <-9> tcsi0800 + <9-10> tcsi0900 + <10-12> tcsi1000 + <12-17> tcsi1200 + <17-> tcsi1728 + }{} +\DeclareFontShape{TS1}{cmss}{sbc}{n}{ + <-> tcssdc10 + }{} +\DeclareFontShape{TS1}{cmss}{bx}{n}{ + <-10> tcsx0900 + <10-> tcsx1000 + }{} +\DeclareFontShape{TS1}{cmss}{bx}{sl}{ + <-10> tcso0900 + <10-> tcso1000 + }{} +\DeclareFontShape{TS1}{cmss}{bx}{it} + {<->ssub*cmss/bx/sl}{} +% \end{macrocode} +% Substitutions not provided in the default \file{.fd} files: +% \begin{macrocode} +\DeclareFontShape{TS1}{cmss}{b}{n} + {<->ssub*cmss/bx/n}{} +\DeclareFontShape{TS1}{cmss}{b}{sl} + {<->ssub*cmss/bx/sl}{} +\DeclareFontShape{TS1}{cmss}{b}{it} + {<->ssub*cmss/bx/sl}{} +% \end{macrocode} +% +% \paragraph{CM Typewriter} +% \begin{macrocode} +\DeclareFontFamily{TS1}{cmtt}{\hyphenchar \font\m@ne} +\DeclareFontShape{TS1}{cmtt}{m}{n}{ + <-9> tctt0800 + <9-10> tctt0900 + <10-12> tctt1000 + <12-17> tctt1200 + <17-> tctt1728 + }{} +\DeclareFontShape{TS1}{cmtt}{m}{it}{ + <-9> tcit0800 + <9-10> tcit0900 + <10-12> tcit1000 + <12-17> tcit1200 + <17-> tcit1728 + }{} +\DeclareFontShape{TS1}{cmtt}{m}{sl}{ + <-9> tcst0800 + <9-10> tcst0900 + <10-12> tcst1000 + <12-17> tcst1200 + <17-> tcst1728 + }{} +\DeclareFontShape{TS1}{cmtt}{bx}{n} + {<->sub * cmtt/m/n}{} +\DeclareFontShape{TS1}{cmtt}{bx}{it} + {<->sub * cmtt/m/it}{} +\DeclareFontShape{TS1}{cmtt}{bx}{sl} + {<->sub * cmtt/m/sl}{} +% \end{macrocode} +% Substitutions not provided in the default \file{.fd} files: +% \begin{macrocode} +\DeclareFontShape{TS1}{cmtt}{b}{n} + {<->sub * cmtt/m/n}{} +\DeclareFontShape{TS1}{cmtt}{b}{it} + {<->sub * cmtt/m/it}{} +\DeclareFontShape{TS1}{cmtt}{b}{sl} + {<->sub * cmtt/m/sl}{} +% \end{macrocode} +% +% \paragraph{CM Typewriter (var.)} +% \begin{macrocode} +\DeclareFontFamily{TS1}{cmvtt}{} +\DeclareFontShape{TS1}{cmvtt}{m}{n}{ + <-9> tcvt0800 + <9-10> tcvt0900 + <10-12> tcvt1000 + <12-17> tcvt1200 + <17-> tcvi1728 + }{} +\DeclareFontShape{TS1}{cmvtt}{m}{it}{ + <-9> tcvi0800 + <9-10> tcvi0900 + <10-12> tcvi1000 + <12-17> tcvi1200 + <17-> tcvi1728 + }{} +% \end{macrocode} +% +% \subsection{OT1 encoding} +% +% \paragraph{CM Roman} +% \begin{macrocode} +\DeclareFontFamily{OT1}{cmr}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmr}{m}{n}{ + <-6> cmr5 + <6-7> cmr6 + <7-8> cmr7 + <8-9> cmr8 + <9-10> cmr9 + <10-12> cmr10 + <12-17> cmr12 + <17-> cmr17 + }{} +\DeclareFontShape{OT1}{cmr}{m}{sl}{ + <-9> cmsl8 + <9-10> cmsl9 + <10-12> cmsl10 + <12-> cmsl12 + }{} +\DeclareFontShape{OT1}{cmr}{m}{it}{ + <-8> cmti7 + <8-9> cmti8 + <9-10> cmti9 + <10-12> cmti10 + <12-> cmti12 + }{} +\DeclareFontShape{OT1}{cmr}{m}{sc}{ + <-> cmcsc10 + }{} +\DeclareFontShape{OT1}{cmr}{m}{ui}{ + <-> cmu10 + }{} +\DeclareFontShape{OT1}{cmr}{b}{n}{ + <-> cmb10 + }{} +\DeclareFontShape{OT1}{cmr}{bx}{n}{ + <-6> cmbx5 + <6-7> cmbx6 + <7-8> cmbx7 + <8-9> cmbx8 + <9-10> cmbx9 + <10-12> cmbx10 + <12-> cmbx12 + }{} +\DeclareFontShape{OT1}{cmr}{bx}{sl}{ + <-> cmbxsl10 + }{} +\DeclareFontShape{OT1}{cmr}{bx}{it}{ + <-> cmbxti10 + }{} +\DeclareFontShape{OT1}{cmr}{bx}{ui} + {<->sub*cmr/m/ui}{} +% \end{macrocode} +% +% \paragraph{CM Sans} +% \begin{macrocode} +\DeclareFontFamily{OT1}{cmss}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmss}{m}{n}{ + <-9> cmss8 + <9-10> cmss9 + <10-12> cmss10 + <12-17> cmss12 + <17-> cmss17 + }{} +\DeclareFontShape{OT1}{cmss}{m}{it} + {<->sub*cmss/m/sl}{} +\DeclareFontShape{OT1}{cmss}{m}{sl}{ + <-9> cmssi8 + <9-10> cmssi9 + <10-12> cmssi10 + <12-17> cmssi12 + <17-> cmssi17 + }{} +\DeclareFontShape{OT1}{cmss}{m}{sc} + {<->sub*cmr/m/sc}{} +\DeclareFontShape{OT1}{cmss}{m}{ui} + {<->sub*cmr/m/ui}{} +\DeclareFontShape{OT1}{cmss}{sbc}{n}{ + <-> cmssdc10 + }{} +\DeclareFontShape{OT1}{cmss}{bx}{n}{ + <-> cmssbx10 + }{} +\DeclareFontShape{OT1}{cmss}{bx}{ui} + {<->sub*cmr/bx/ui}{} +% \end{macrocode} +% +% \paragraph{CM Typewriter} +% \begin{macrocode} +\DeclareFontFamily{OT1}{cmtt}{\hyphenchar \font\m@ne} +\DeclareFontShape{OT1}{cmtt}{m}{n}{ + <-9> cmtt8 + <9-10> cmtt9 + <10-12> cmtt10 + <12-> cmtt12 + }{} +\DeclareFontShape{OT1}{cmtt}{m}{it}{ + <-> cmitt10 + }{} +\DeclareFontShape{OT1}{cmtt}{m}{sl}{ + <-> cmsltt10 + }{} +\DeclareFontShape{OT1}{cmtt}{m}{sc}{ + <-> cmtcsc10 + }{} +\DeclareFontShape{OT1}{cmtt}{m}{ui} + {<->ssub*cmtt/m/it}{} +\DeclareFontShape{OT1}{cmtt}{bx}{n} + {<->ssub*cmtt/m/n}{} +\DeclareFontShape{OT1}{cmtt}{bx}{it} + {<->ssub*cmtt/m/it}{} +\DeclareFontShape{OT1}{cmtt}{bx}{ui} + {<->ssub*cmtt/m/it}{} +% \end{macrocode} +% +% \paragraph{CM Typewriter (var.)} +% \begin{macrocode} +\DeclareFontFamily{OT1}{cmvtt}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{cmvtt}{m}{n}{ + <-> cmvtt10 + }{} +\DeclareFontShape{OT1}{cmvtt}{m}{it}{ + <-> cmvtti10 + }{} +% \end{macrocode} +% +% \subsection{OML and OMS encoded math fonts} +% \begin{macrocode} +\DeclareFontFamily{OML}{cmm}{\skewchar\font127 } +\DeclareFontShape{OML}{cmm}{m}{it}{ + <-6> cmmi5 + <6-7> cmmi6 + <7-8> cmmi7 + <8-9> cmmi8 + <9-10> cmmi9 + <10-12> cmmi10 + <12-> cmmi12 + }{} +\DeclareFontShape{OML}{cmm}{b}{it}{<-6>cmmib5<6-8>cmmib7<8->cmmib10}{} +\DeclareFontShape{OML}{cmm}{bx}{it} + {<->ssub*cmm/b/it}{} +% \end{macrocode} +% \begin{macrocode} +\DeclareFontFamily{OMS}{cmsy}{\skewchar\font48 } +\DeclareFontShape{OMS}{cmsy}{m}{n}{ + <-6> cmsy5 + <6-7> cmsy6 + <7-8> cmsy7 + <8-9> cmsy8 + <9-10> cmsy9 + <10-> cmsy10 + }{} +\DeclareFontShape{OMS}{cmsy}{b}{n}{<-6>cmbsy5<6-8>cmbsy7<8->cmbsy10}{} +% \end{macrocode} +% +% \subsection{\LaTeX{} symbols} +% \begin{macrocode} +\DeclareFontFamily{U}{lasy}{} +\DeclareFontShape{U}{lasy}{m}{n}{ + <-6> lasy5 + <6-7> lasy6 + <7-8> lasy7 + <8-9> lasy8 + <9-10> lasy9 + <10-> lasy10 + }{} +\DeclareFontShape{U}{lasy}{b}{n}{ + <-10> ssub * lasy/m/n + <10-> lasyb10 + }{} +% \end{macrocode} +% \begin{macrocode} +\endgroup +%</fix-cm> +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/fix-cm.ins b/Master/texmf-dist/source/latex-dev/base/fix-cm.ins new file mode 100644 index 00000000000..56a7923a133 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/fix-cm.ins @@ -0,0 +1,88 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + + +\generateFile{fix-cm.sty}{t}{% + \from{fix-cm.dtx}{fix-cm}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/fontdef.dtx b/Master/texmf-dist/source/latex-dev/base/fontdef.dtx new file mode 100644 index 00000000000..36a31ef19bf --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/fontdef.dtx @@ -0,0 +1,1413 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: fontdef.dtx +%<*dtx> + \ProvidesFile{fontdef.dtx} +%</dtx> +%<text, >\ProvidesFile{fonttext.ltx} +%<math, >\ProvidesFile{fontmath.ltx} +%<+cfgtext>\ProvidesFile{fonttext.cfg} +%<+cfgmath>\ProvidesFile{fontmath.cfg} +%<+cfgprel>\ProvidesFile{preload.cfg} +%<driver, >\ProvidesFile{fontdef.drv} +% \fi +% \ProvidesFile{fontdef.dtx} +%<-latexrelease> [2018/09/24 v3.0b LaTeX Kernel +% \iftrue (\else +%<text, >(Text +%<math, >(Math +%<+cfgtext>(Uncustomised text +%<+cfgmath>(Uncustomised math +%<+cfgprel>(Uncustomised preload +% \fi +%<-latexrelease> font setup)] +% +% +%\iffalse This is a META comment +% +% File `fontdef.dtx'. +% Copyright (C) 1989-1999 Frank Mittelbach and Rainer Sch\"opf, +% All rights reserved. +% +%\fi +% +% \changes{v2.1a}{1993/12/01}{Update for LaTeX2e} +% \changes{v2.2a}{1994/10/14}{New coding} +% \changes{v2.2i}{1994/12/02}{Commented out \cs{ldots}. ASAJ.} +% \changes{v2.2j}{1995/05/11}{Updates to some plain macros} +% \changes{v2.2l}{1995/10/03}{\cs{@@sqrt} from patch file for /1701} +% \changes{v2.2o}{1996/05/17}{\cs{@@sqrt} removed, at last} +% \changes{v2.2p}{1996/11/20}{lowercase fd and enc.def file names /1044} +% \changes{v2.2x}{1999/01/05}{Need special protection for character +% \texttt{\char62} in \cs{changes} entry.} +% +% \title{The \texttt{fontdef.dtx} file\thanks +% {This file has version number \fileversion, dated \filedate}} +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% \def\dst{{\normalfont\scshape docstrip}} +% \setcounter{StandardModuleDepth}{1} +% +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% +% This file is used to generate the files \texttt{fonttext.ltx} (text +% font declarations) and \texttt{fontmath.ltx} (math font +% declarations), which are used during the format generation. It +% contains the declaration of the standard text encodings used at the +% site as well as a minimal subset of font shape groups that NFSS will +% look at to ensure that the specified encodings are valid. +% +% The math part contains the setup for math encodings as well as the +% default math symbol declarations that belong to the encoding. +% +% It is possible to change this setup (by using other fonts, or +% defaults) without losing the ability to +% process documents written at other sites. Portability in this sense +% means that a document will compile without errors. It does not mean, +% however, that identical output will be produced. For this it is +% necessary that the distributed setup is used at both installations. +% +% \section{Customization} +% +% You are not allowed to change this source file! If you want to +% change the default encodings and/or the font shape groups preloaded +% you should should create a copy of \texttt{fonttext.ltx} +% under the name \texttt{fonttext.cfg} and change this copy. If +% \LaTeXe{} finds a file of this name it will use it, otherwise it +% uses the standard file which is \texttt{fontdef.ltx}. +% +% If you don't plan to use Computer Modern much or at all, it might +% (!) be a good idea to make your own \texttt{fonttext.cfg}. Look at +% the comments below (docstrip module `text') to see what should +% should go into such a file. +% +% To change the math font setup use a copy of \texttt{fontmath.ltx} +% under the name \texttt{fontmath.cfg} and change this copy. However, +% dealing with this interface is even more a job for an expert than +% changing the text font setup --- in short, we don't encourage either. +% +% \begin{quote} +% \textbf{Warning:} please note that we don't support customised +% \LaTeX{} versions. Thus, before sending in a bug report please try +% your test file with a \LaTeX{} format which is not customised and +% send in the log from that version (unless the problem goes away). +% \end{quote} +% +% Please note: the following standard encodings have to +% be defined in all local variants of \texttt{font....cfg} to guarantee +% that all \LaTeX{} installations behave in the same way. +% \begin{center} +% \begin{tabular}{ll} +% |T1| & Cork \TeX{} text encoding \\ +% |OT1| & old \TeX{} text encoding \\ +% |U| & unknown encoding \\ +% |OML| & old \TeX{} math letters encoding \\ +% |OMS| & old \TeX{} math symbols encoding \\ +% |OMX| & old \TeX{} math extension symbols encoding\\ +% |TU| & Unicode +% \end{tabular} +% \end{center} +% Notice that some of these encodings are `old' in the sense that we +% hope that they will be superseded soon by encoding standards defined +% by the \TeX{} user community. Therefore this set of default encodings +% may change in the future. +% +% The first candidate is |OT1| which will soon be replaced by |T1|, the +% official \TeX{} text encoding. +% +% \begin{quote}\textbf{Warning:} +% If you add additional encodings to this file there is no guarantee +% any longer that files processable at your installation will also be +% processable at other installations. Thus, if you make use of +% such an encoding in your document, e.g.~if you intend to typeset in +% Cyrillic (|OT2| encoding), you need to specify this encoding in the +% preamble of your document prior to sending it to another +% installation. Once the encoding is specified in that place in your +% document, the document is processable at all \LaTeX{} installations +% (provided they have suitable fonts installed). +% +% For this reason we suggest that you define a short package file that +% sets up an additional encoding used at your site (rather than +% putting the encoding into this file) since this package can easily +% be shipped with your document. +% \end{quote} +% +% +% \StopEventually{} +% +% \section{The \texttt{docstrip} modules} +% +% The following modules are used to direct \texttt{docstrip} in +% generating external files: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% text & produce the file \texttt{fonttext.ltx}\\ +% math & produce the file \texttt{fontmath.ltx}\\ +% cfgtext & produce a dummy \texttt{fonttext.cfg} file\\ +% cfgmath & produce a dummy \texttt{fontmath.cfg} file\\ +% \end{tabular} +% \end{center} +% A typical \texttt{docstrip} command file would then have entries like: +% \begin{verbatim} +%\generateFile{fonttext.ltx}{t}{\from{fontdef.dtx}{text}} +%\end{verbatim} +% +% +% \section{A driver for this document} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e.~the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the +% \dst{} program. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{fontdef.dtx} +\begin{document} + \DocInput{fontdef.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% +% +% \section{The \texttt{fonttext.ltx} file} +% +% The identification is done earlier on with a |\ProvidesFile| +% declaration. +% \begin{macrocode} +%<*text> +\typeout{=== Don't modify this file, use a .cfg file instead ===^^J} +% \end{macrocode} +% +% \subsection{Encodings} +% +% This file declares the standard encodings for text and math +% fonts. All others should be declared in packages or in the +% documents directly. +% +% For every text encoding there are normally a number of encoding +% specific commands, e.g.~accents, special characters, etc. (The +% definition for such a command might have to change when the +% encoding is changed, because the character is in a different +% position, or not available at all, or the accent is produced in a +% different way.) This is handled by a general mechanism which is +% described in \texttt{ltoutenc.dtx}. +% +% By convention, text encoding specific declarations, including the +% declaration |\DeclareFontEncoding|, are kept in separate file of +% the form \meta{enc}\texttt{enc.def}, e.g.~\texttt{ot1enc.def}. This +% allows other applications to make use of the declarations as +% well. +% +% Similar to the default encoding, the loading of the encoding +% files for the two major text encodings shouldn't be changed. +% In particular, the \texttt{inputenc} package depends on this. +% \changes{v2.2s}{1997/12/20}{Added documentation} +% +% \changes{v2.1d}{1994/01/05}{Removed nf prefix from file names.} +% \changes{v2.1f}{1994/05/14}{Removed .def files.} +% \changes{v2.1g}{1994/05/16}{Removed \cs{DeclareFontEncoding} for ot1 +% and t1 and input .def files instead} +% \changes{v2.2c}{1994/10/25}{Added OMSenc.def} +% \changes{v2.2d}{1994/10/31}{Added OMLenc.def ...} +% \changes{v2.2e}{1994/10/31}{... and moved further down} +% \changes{v2.2f}{1994/11/07}{(DPC) Updated to use \cs{ProvidesFile}} +% \changes{v2.2h}{1994/11/16}{(DPC) Removed \cmd\{ and \cmd\}} +% \changes{v3.0a}{2016/12/03}{(DPC) Default to TU encoding for Unicode TeX engines} +% \begin{macrocode} +\input {omlenc.def} +\input {t1enc.def} +\input {ot1enc.def} % <- should come after T1 for speed +\input {omsenc.def} +% \end{macrocode} +% \changes{v3.0a}{2016/12/03}{(DPC) Default to TU encoding for Unicode TeX engines} +% \begin{macrocode} +\ifx\Umathchar\@undefined +% \end{macrocode} +% +% We then set set the default text font encoding. This will +% hopefully change some day to |T1|. This setting should \emph{not} +% be changed to produce a portable format. +% \begin{macrocode} +\fontencoding{OT1} +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% Unicode. +% \begin{macrocode} +\input {tuenc.def} +\fontencoding{TU} +\DeclareFontSubstitution{TU}{lmr}{m}{n} +\begingroup +\nfss@catcodes +\input {tulmr.fd} +\input {tulmss.fd} +\input {tulmtt.fd} +\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontSubstitution{TU}{lmr}{m}{n} +% \end{macrocode} +% End of Unicode branch. +% \begin{macrocode} +\fi +% \end{macrocode} +% +% If different encodings for text fonts are in use one could put +% the common setup into |\DeclareFontEncodingDefaults|. There is +% now a better mechanism so using this interface is discouraged! +% \begin{macrocode} +\DeclareFontEncodingDefaults{}{} +% \end{macrocode} +% +% Then we define the default substitution for every encoding. +% This release of \LaTeXe{} assumes that the ec fonts are +% available. It is possible to change this to point to some other +% font family (e.g., Times with the appropriate encoding if it is +% available) without making documents non-portable. However, in +% such a case documents will produce different page breaks at other +% sites. The substitution defaults can all be changed without +% losing portability as long as there are font shape definitions +% for the selected substitutions. +% \begin{macrocode} +\DeclareFontSubstitution{T1}{cmr}{m}{n} +\DeclareFontSubstitution{OT1}{cmr}{m}{n} +% \end{macrocode} +% +% For every encoding declaration, \LaTeXe{} will try to verify that +% the given substitution information makes sense, i.e.~that it is +% impossible to go into an endless loop if font substitution +% happens. This is done at the moment the |\begin{document}| is +% encountered. \LaTeXe{} will then check that for every encoding the +% substitution defaults form a valid font shape group, which means +% that it will check if there is a |\DeclareFontShape| declaration +% for this combination. We will therefore load the corresponding +% |.fd| files now. If we don't do this they would be loaded at +% verification time (i.e.~at |\begin{document}| which would delay +% processing unnecessarily. +% +% \begin{quote} +% \textbf{Warning:} Please note that this means that you have to +% regenerate the format whenever you change any of these +% \texttt{.fd} files since \LaTeXe{} will not read \texttt{.fd} +% files if it already knows about the encoding/family +% combination. +% \end{quote} +% +% \changes{v2.2m}{1995/11/01}{add \cs{nfss@catcodes} for internal/1932} +% The |\nfss@catcodes| ensures that white space is ignored in any +% definitions made in the fd files. +% \begin{macrocode} +\begingroup +\nfss@catcodes +\input {t1cmr.fd} +\input {ot1cmr.fd} +\endgroup +% \end{macrocode} +% +% We also load some other font definition files which are normally +% needed in a document. This is only done for processing speed and +% you can comment the next two lines out to save some memory. If +% necessary these files are then loaded when your document is +% processed. (Loading |.fd| files is a less drastic step compared +% to preloading fonts because the number of fonts is limited 255 at +% (nearly) every \TeX{} installation, while the amount of main memory +% is not a limiting factor at most installations.) +% +% \begin{macrocode} +\begingroup +\nfss@catcodes +\input {ot1cmss.fd} +\input {ot1cmtt.fd} +\endgroup +% \end{macrocode} +% +% Even with all the precautions it is still possible that NFSS will +% run into problems, for example, when a |.fd| file contains +% corrupted data. To guard against such cases NFSS has a very +% low-level fallback font that is installed with the following line. +% \begin{macrocode} +\DeclareErrorFont{OT1}{cmr}{m}{n}{10} +% \end{macrocode} +% This means, ``if everything else fails use Computer Modern Roman +% normal shape at 10pt in the old text encoding''. +% You can change the font used but the encoding should be the same +% as the one specified with |\fontencoding| above. +% +% +% \subsection{Defaults} +% +% To allow the use of |\rmfamily|, |\sffamily|, etc.\ in documents +% even if non-standard families are used we provide nine macros +% which hold the name of the corresponding families, series, and so +% on. This makes it easy to use other font families (like Times +% Roman, etc.). One simply has to redefine these defaults. +% +% All these hooks have to be defined in this file but you can +% change their meaning (except for |\encodingdefault|) without +% making documents non-portable. +% +% +% \begin{macro}{\encodingdefault} +% \begin{macro}{\rmdefault} +% \begin{macro}{\sfdefault} +% \begin{macro}{\ttdefault} +% The following three definitions set up the meaning for +% |\rmfamily|, |\sffamily|, and |\ttfamily|. +% \begin{macrocode} +\ifx\Umathchar\@undefined +\newcommand\encodingdefault{OT1} +\newcommand\rmdefault{cmr} +\newcommand\sfdefault{cmss} +\newcommand\ttdefault{cmtt} +\else +\newcommand\encodingdefault{TU} +\newcommand\rmdefault{lmr} +\fontfamily{\rmdefault} +\newcommand\sfdefault{lmss} +\newcommand\ttdefault{lmtt} +\fi +%</text> +%<latexrelease>\IncludeInRelease{2017/01/01}% +%<latexrelease> {\encodingdefault}{TU encoding default}% +%<latexrelease>\ifx\Umathchar\@undefined +%<latexrelease>\renewcommand\encodingdefault{OT1} +%<latexrelease>\fontencoding{\encodingdefault} +%<latexrelease>\renewcommand\rmdefault{cmr} +%<latexrelease>\fontfamily{\rmdefault} +%<latexrelease>\renewcommand\sfdefault{cmss} +%<latexrelease>\renewcommand\ttdefault{cmtt} +%<latexrelease>\else +%<latexrelease>\renewcommand\encodingdefault{TU} +%<latexrelease>%done in everyjob\fontencoding{\encodingdefault} +%<latexrelease>\renewcommand\rmdefault{lmr} +%<latexrelease>\fontfamily{\rmdefault} +%<latexrelease>\renewcommand\sfdefault{lmss} +%<latexrelease>\renewcommand\ttdefault{lmtt} +%<latexrelease>\fi +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\encodingdefault}{TU encoding default}% +%<latexrelease>\fontencoding{OT1} +%<latexrelease>\renewcommand\encodingdefault{OT1} +%<latexrelease>\fontencoding{\encodingdefault} +%<latexrelease>\renewcommand\rmdefault{cmr} +%<latexrelease>\fontfamily{\rmdefault} +%<latexrelease>\renewcommand\sfdefault{cmss} +%<latexrelease>\renewcommand\ttdefault{cmtt} +%<latexrelease>\EndIncludeInRelease +%<*text> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bfdefault} +% \begin{macro}{\mddefault} +% Series changing commands are influenced by the following hooks. +% \begin{macrocode} +\newcommand\bfdefault{bx} +\newcommand\mddefault{m} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\itdefault} +% \begin{macro}{\sldefault} +% \begin{macro}{\scdefault} +% \begin{macro}{\updefault} +% Shape changing commands use the following hooks. +% \begin{macrocode} +\newcommand\itdefault{it} +\newcommand\sldefault{sl} +\newcommand\scdefault{sc} +\newcommand\updefault{n} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\familydefault} +% \begin{macro}{\seriesdefault} +% \begin{macro}{\shapedefault} +% Finally we have the hooks that describe the behaviour of +% the |\normalfont| command. To stay portable, the definition of +% |\encodingdefault| should \emph{not} be changed and should match +% the setting above for |\fontencoding|. All other values can be +% set according to your taste. +% \changes{v3.0a}{2016/12/03}{(DPC) Default to TU encoding for Unicode TeX engines} +% \begin{macrocode} +\newcommand\familydefault{\rmdefault} +\newcommand\seriesdefault{\mddefault} +\newcommand\shapedefault{\updefault} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% This finishes the low-level setup in \texttt{fonttext.ltx}. +% \begin{macrocode} +%</text> +% \end{macrocode} +% +% +% +% +% \section{The \texttt{fontmath.ltx} file} +% +% The identification is done earlier on with a |\ProvidesFile| +% declaration. +% \begin{macrocode} +%<*math> +\typeout{=== Don't modify this file, use a .cfg file instead ===^^J} +% \end{macrocode} +% +% \subsection{The font encodings used} +% +% \begin{macrocode} +\DeclareFontEncoding{OML}{}{} +\DeclareFontEncoding{OMS}{}{} +\DeclareFontEncoding{OMX}{}{} +% \end{macrocode} +% Finally a declaration for |U| encoding which serves for all fonts +% that do not fit standard encodings. For math this sets up +% |\noaccents@| providing for AMS-\LaTeX{}. This macro is used +% therein to handle accented characters if they are not supported +% by the font. In other words, if fonts with |U| encoding are used +% in math, all accents (like from |\breve|) are obtained from some +% other font that has them. +% \begin{macrocode} +\DeclareFontEncoding{U}{}{\noaccents@} +% \end{macrocode} +% The encodings for math are next: +% \begin{macrocode} +\DeclareFontSubstitution{OML}{cmm}{m}{it} +\DeclareFontSubstitution{OMS}{cmsy}{m}{n} +\DeclareFontSubstitution{OMX}{cmex}{m}{n} +\DeclareFontSubstitution{U}{cmr}{m}{n} +% \end{macrocode} +% +% \begin{macrocode} +\begingroup +\nfss@catcodes +\input {omlcmm.fd} +\input {omscmsy.fd} +\input {omxcmex.fd} +\input {ucmr.fd} +\endgroup +% \end{macrocode} +% +% \subsubsection{Symbolfont and Alphabet declarations} +% +% We now define the basic symbol fonts used by \LaTeX{}. +% These four symbol fonts must be defined by this file. +% +% It is possible to make the symbol fonts point to other external +% fonts without losing the ability to process documents written +% at other sites, as long as one defines the same symbol font names +% with the same encodings, e.g.~|operators| with |OT1| etc. +% If other encodings are used documents become non-portable. +% Such a change should therefore be done in a package file. +% +% \changes{v2.1e}{1994/01/19}{Added missing setting for symbols in +% bold version.} +% \begin{macrocode} +\DeclareSymbolFont{operators} {OT1}{cmr} {m}{n} +\DeclareSymbolFont{letters} {OML}{cmm} {m}{it} +\DeclareSymbolFont{symbols} {OMS}{cmsy}{m}{n} +\DeclareSymbolFont{largesymbols}{OMX}{cmex}{m}{n} +% \end{macrocode} +% +% \begin{macrocode} +\SetSymbolFont{operators}{bold}{OT1}{cmr} {bx}{n} +\SetSymbolFont{letters} {bold}{OML}{cmm} {b}{it} +\SetSymbolFont{symbols} {bold}{OMS}{cmsy}{b}{n} +% \end{macrocode} +% +% Below are the seven math alphabets which are defined by NFSS. +% Again they must be defined by this file. +% However, as before you can change the fonts used without losing +% portability, but you should be careful when changing the encoding +% since that may make documents come out wrong. +% \begin{macrocode} +\DeclareSymbolFontAlphabet{\mathrm} {operators} +\DeclareSymbolFontAlphabet{\mathnormal}{letters} +\DeclareSymbolFontAlphabet{\mathcal} {symbols} +\DeclareMathAlphabet {\mathbf}{OT1}{cmr}{bx}{n} +\DeclareMathAlphabet {\mathsf}{OT1}{cmss}{m}{n} +\DeclareMathAlphabet {\mathit}{OT1}{cmr}{m}{it} +\DeclareMathAlphabet {\mathtt}{OT1}{cmtt}{m}{n} +% \end{macrocode} +% Given the currently available fonts we cannot bold-en |\mathbf| +% and |\mathtt| but in principle one could use `ultra bold' or +% something. The alphabets defined via |\DeclareSymbolFontAlphabet| +% will change automatically in a new math version if the +% corresponding symbol font changes. +% \begin{macrocode} +\SetMathAlphabet\mathsf{bold}{OT1}{cmss}{bx}{n} +\SetMathAlphabet\mathit{bold}{OT1}{cmr}{bx}{it} +% \end{macrocode} +% +% +% \subsection{Math font sizes} +% \changes{v2.2f}{1994/11/07} +% {(DPC) Add \cs{DeclareMathSizes} declarations} +% +% The declarations below declare the text, script and scriptscript +% size to be used for each text font size. +% +% All occurrences of sizes longer than a single character are replaced +% with the macro name that holds them, saving a number of +% tokens (but losing a bit of speed, so this may not stay this way). +% \begin{macrocode} + \DeclareMathSizes{5}{5}{5}{5} + \DeclareMathSizes{6}{6}{5}{5} + \DeclareMathSizes{7}{7}{5}{5} + \DeclareMathSizes{8}{8}{6}{5} + \DeclareMathSizes{9}{9}{6}{5} + \DeclareMathSizes{\@xpt}{\@xpt}{7}{5} + \DeclareMathSizes{\@xipt}{\@xipt}{8}{6} + \DeclareMathSizes{\@xiipt}{\@xiipt}{8}{6} + \DeclareMathSizes{\@xivpt}{\@xivpt}{\@xpt}{7} + \DeclareMathSizes{\@xviipt}{\@xviipt}{\@xiipt}{\@xpt} + \DeclareMathSizes{\@xxpt}{\@xxpt}{\@xivpt}{\@xiipt} + \DeclareMathSizes{\@xxvpt}{\@xxvpt}{\@xxpt}{\@xviipt} +% \end{macrocode} +% +% \subsection{The math symbol assignments} +% +% We start by setting up math codes for most of the characters +% typed in directly from the keyboard. Most of them are normally +% already setup up in the same way by Ini\TeX{}. However, we repeat +% them here to have a complete setup which can be exchanged with +% another if desired. +% +% \subsubsection{The letters} +% \begin{macrocode} +\DeclareMathSymbol{a}{\mathalpha}{letters}{`a} +\DeclareMathSymbol{b}{\mathalpha}{letters}{`b} +\DeclareMathSymbol{c}{\mathalpha}{letters}{`c} +\DeclareMathSymbol{d}{\mathalpha}{letters}{`d} +\DeclareMathSymbol{e}{\mathalpha}{letters}{`e} +\DeclareMathSymbol{f}{\mathalpha}{letters}{`f} +\DeclareMathSymbol{g}{\mathalpha}{letters}{`g} +\DeclareMathSymbol{h}{\mathalpha}{letters}{`h} +\DeclareMathSymbol{i}{\mathalpha}{letters}{`i} +\DeclareMathSymbol{j}{\mathalpha}{letters}{`j} +\DeclareMathSymbol{k}{\mathalpha}{letters}{`k} +\DeclareMathSymbol{l}{\mathalpha}{letters}{`l} +\DeclareMathSymbol{m}{\mathalpha}{letters}{`m} +\DeclareMathSymbol{n}{\mathalpha}{letters}{`n} +\DeclareMathSymbol{o}{\mathalpha}{letters}{`o} +\DeclareMathSymbol{p}{\mathalpha}{letters}{`p} +\DeclareMathSymbol{q}{\mathalpha}{letters}{`q} +\DeclareMathSymbol{r}{\mathalpha}{letters}{`r} +\DeclareMathSymbol{s}{\mathalpha}{letters}{`s} +\DeclareMathSymbol{t}{\mathalpha}{letters}{`t} +\DeclareMathSymbol{u}{\mathalpha}{letters}{`u} +\DeclareMathSymbol{v}{\mathalpha}{letters}{`v} +\DeclareMathSymbol{w}{\mathalpha}{letters}{`w} +\DeclareMathSymbol{x}{\mathalpha}{letters}{`x} +\DeclareMathSymbol{y}{\mathalpha}{letters}{`y} +\DeclareMathSymbol{z}{\mathalpha}{letters}{`z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareMathSymbol{A}{\mathalpha}{letters}{`A} +\DeclareMathSymbol{B}{\mathalpha}{letters}{`B} +\DeclareMathSymbol{C}{\mathalpha}{letters}{`C} +\DeclareMathSymbol{D}{\mathalpha}{letters}{`D} +\DeclareMathSymbol{E}{\mathalpha}{letters}{`E} +\DeclareMathSymbol{F}{\mathalpha}{letters}{`F} +\DeclareMathSymbol{G}{\mathalpha}{letters}{`G} +\DeclareMathSymbol{H}{\mathalpha}{letters}{`H} +\DeclareMathSymbol{I}{\mathalpha}{letters}{`I} +\DeclareMathSymbol{J}{\mathalpha}{letters}{`J} +\DeclareMathSymbol{K}{\mathalpha}{letters}{`K} +\DeclareMathSymbol{L}{\mathalpha}{letters}{`L} +\DeclareMathSymbol{M}{\mathalpha}{letters}{`M} +\DeclareMathSymbol{N}{\mathalpha}{letters}{`N} +\DeclareMathSymbol{O}{\mathalpha}{letters}{`O} +\DeclareMathSymbol{P}{\mathalpha}{letters}{`P} +\DeclareMathSymbol{Q}{\mathalpha}{letters}{`Q} +\DeclareMathSymbol{R}{\mathalpha}{letters}{`R} +\DeclareMathSymbol{S}{\mathalpha}{letters}{`S} +\DeclareMathSymbol{T}{\mathalpha}{letters}{`T} +\DeclareMathSymbol{U}{\mathalpha}{letters}{`U} +\DeclareMathSymbol{V}{\mathalpha}{letters}{`V} +\DeclareMathSymbol{W}{\mathalpha}{letters}{`W} +\DeclareMathSymbol{X}{\mathalpha}{letters}{`X} +\DeclareMathSymbol{Y}{\mathalpha}{letters}{`Y} +\DeclareMathSymbol{Z}{\mathalpha}{letters}{`Z} +% \end{macrocode} +% +% \subsubsection{The digits} +% +% \begin{macrocode} +\DeclareMathSymbol{0}{\mathalpha}{operators}{`0} +\DeclareMathSymbol{1}{\mathalpha}{operators}{`1} +\DeclareMathSymbol{2}{\mathalpha}{operators}{`2} +\DeclareMathSymbol{3}{\mathalpha}{operators}{`3} +\DeclareMathSymbol{4}{\mathalpha}{operators}{`4} +\DeclareMathSymbol{5}{\mathalpha}{operators}{`5} +\DeclareMathSymbol{6}{\mathalpha}{operators}{`6} +\DeclareMathSymbol{7}{\mathalpha}{operators}{`7} +\DeclareMathSymbol{8}{\mathalpha}{operators}{`8} +\DeclareMathSymbol{9}{\mathalpha}{operators}{`9} +% \end{macrocode} +% +% +% \subsubsection{Punctuation, brace, etc. keys} +% +% \begin{macrocode} +\DeclareMathSymbol{!}{\mathclose}{operators}{"21} +\DeclareMathSymbol{*}{\mathbin}{symbols}{"03} % \ast +\DeclareMathSymbol{+}{\mathbin}{operators}{"2B} +\DeclareMathSymbol{,}{\mathpunct}{letters}{"3B} +\DeclareMathSymbol{-}{\mathbin}{symbols}{"00} +\DeclareMathSymbol{.}{\mathord}{letters}{"3A} +\DeclareMathSymbol{:}{\mathrel}{operators}{"3A} +\DeclareMathSymbol{;}{\mathpunct}{operators}{"3B} +\DeclareMathSymbol{=}{\mathrel}{operators}{"3D} +\DeclareMathSymbol{?}{\mathclose}{operators}{"3F} +% \end{macrocode} +% The following symbols are defined as delimiters below +% which automatically defines them as math symbols. +% \begin{macrocode} +%\DeclareMathSymbol{(}{\mathopen}{operators}{"28} +%\DeclareMathSymbol{)}{\mathclose}{operators}{"29} +%\DeclareMathSymbol{/}{\mathord}{letters}{"3D} +%\DeclareMathSymbol{[}{\mathopen}{operators}{"5B} +%\DeclareMathSymbol{]}{\mathclose}{operators}{"5D} +%\DeclareMathSymbol{|}{\mathord}{symbols}{"6A} +%\DeclareMathSymbol{<}{\mathrel}{letters}{"3C} +%\DeclareMathSymbol{>}{\mathrel}{letters}{"3E} +% \end{macrocode} +% +% Should all of the following being activated by default? Probably +% not. +% \begin{macrocode} +%\DeclareMathSymbol{`\{}{\mathopen}{symbols}{"66} +%\DeclareMathSymbol{`\}}{\mathclose}{symbols}{"67} +%\DeclareMathSymbol{`\\}{\mathord}{symbols}{"6E} % \backslash +\mathcode`\ ="8000 % \space +\mathcode`\'="8000 % ^\prime +\mathcode`\_="8000 % \_ +% \end{macrocode} +% +% +% \subsubsection{Delimitercodes for characters} +% \changes{v2.2q}{1997/01/08} +% {Use \cs{DeclareMathDelimiter} to set delimiter codes} +% \changes{v2.2u}{1998/04/15} +% {Use new syntax for \cs{DeclareMathDelimiter}} +% [to be completed] +% +% Finally, Ini\TeX{} sets all |\delcode| values to -1, except +% |\delcode`.=0| +% \begin{macrocode} +\DeclareMathDelimiter{(}{\mathopen} {operators}{"28}{largesymbols}{"00} +\DeclareMathDelimiter{)}{\mathclose}{operators}{"29}{largesymbols}{"01} +\DeclareMathDelimiter{[}{\mathopen} {operators}{"5B}{largesymbols}{"02} +\DeclareMathDelimiter{]}{\mathclose}{operators}{"5D}{largesymbols}{"03} +% \end{macrocode} +% +% The next two are considered to be relations when not used in the context +% of a delimiter! And worse, they do even represent different glyphs when +% being used as delimiter and not as delimiter. This is a user level syntax +% inherited from plain \TeX{}. Therefore we explicitly redefine the math +% symbol definitions for these symbols afterwards. +% \changes{v2.2v}{1998/04/17} +% {Reinsert symbol defs for \texttt{<} and \texttt{\char62} chars.} +% \begin{macrocode} +\DeclareMathDelimiter{<}{\mathopen}{symbols}{"68}{largesymbols}{"0A} +\DeclareMathDelimiter{>}{\mathclose}{symbols}{"69}{largesymbols}{"0B} +\DeclareMathSymbol{<}{\mathrel}{letters}{"3C} +\DeclareMathSymbol{>}{\mathrel}{letters}{"3E} +% \end{macrocode} +% And here is another case where the non-delimiter version produces a +% glyph different from the delimiter version. +% \changes{v2.2w}{1998/04/18} +% {Reinsert symbol def for \texttt{/} char.} +% \begin{macrocode} +\DeclareMathDelimiter{/}{\mathord}{operators}{"2F}{largesymbols}{"0E} +\DeclareMathSymbol{/}{\mathord}{letters}{"3D} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareMathDelimiter{|}{\mathord}{symbols}{"6A}{largesymbols}{"0C} +% \end{macrocode} +% +% \begin{macrocode} +\expandafter\DeclareMathDelimiter\@backslashchar + {\mathord}{symbols}{"6E}{largesymbols}{"0F} +% \end{macrocode} +% N.B. |{| and |}| should NOT get delcodes; +% otherwise parameter grouping fails! +% +% +% \subsection{Symbols accessed via control sequences} +% +% \subsubsection{Greek letters} +% +% \begin{macrocode} +\DeclareMathSymbol{\alpha}{\mathord}{letters}{"0B} +\DeclareMathSymbol{\beta}{\mathord}{letters}{"0C} +\DeclareMathSymbol{\gamma}{\mathord}{letters}{"0D} +\DeclareMathSymbol{\delta}{\mathord}{letters}{"0E} +\DeclareMathSymbol{\epsilon}{\mathord}{letters}{"0F} +\DeclareMathSymbol{\zeta}{\mathord}{letters}{"10} +\DeclareMathSymbol{\eta}{\mathord}{letters}{"11} +\DeclareMathSymbol{\theta}{\mathord}{letters}{"12} +\DeclareMathSymbol{\iota}{\mathord}{letters}{"13} +\DeclareMathSymbol{\kappa}{\mathord}{letters}{"14} +\DeclareMathSymbol{\lambda}{\mathord}{letters}{"15} +\DeclareMathSymbol{\mu}{\mathord}{letters}{"16} +\DeclareMathSymbol{\nu}{\mathord}{letters}{"17} +\DeclareMathSymbol{\xi}{\mathord}{letters}{"18} +\DeclareMathSymbol{\pi}{\mathord}{letters}{"19} +\DeclareMathSymbol{\rho}{\mathord}{letters}{"1A} +\DeclareMathSymbol{\sigma}{\mathord}{letters}{"1B} +\DeclareMathSymbol{\tau}{\mathord}{letters}{"1C} +\DeclareMathSymbol{\upsilon}{\mathord}{letters}{"1D} +\DeclareMathSymbol{\phi}{\mathord}{letters}{"1E} +\DeclareMathSymbol{\chi}{\mathord}{letters}{"1F} +\DeclareMathSymbol{\psi}{\mathord}{letters}{"20} +\DeclareMathSymbol{\omega}{\mathord}{letters}{"21} +\DeclareMathSymbol{\varepsilon}{\mathord}{letters}{"22} +\DeclareMathSymbol{\vartheta}{\mathord}{letters}{"23} +\DeclareMathSymbol{\varpi}{\mathord}{letters}{"24} +\DeclareMathSymbol{\varrho}{\mathord}{letters}{"25} +\DeclareMathSymbol{\varsigma}{\mathord}{letters}{"26} +\DeclareMathSymbol{\varphi}{\mathord}{letters}{"27} +\DeclareMathSymbol{\Gamma}{\mathalpha}{operators}{"00} +\DeclareMathSymbol{\Delta}{\mathalpha}{operators}{"01} +\DeclareMathSymbol{\Theta}{\mathalpha}{operators}{"02} +\DeclareMathSymbol{\Lambda}{\mathalpha}{operators}{"03} +\DeclareMathSymbol{\Xi}{\mathalpha}{operators}{"04} +\DeclareMathSymbol{\Pi}{\mathalpha}{operators}{"05} +\DeclareMathSymbol{\Sigma}{\mathalpha}{operators}{"06} +\DeclareMathSymbol{\Upsilon}{\mathalpha}{operators}{"07} +\DeclareMathSymbol{\Phi}{\mathalpha}{operators}{"08} +\DeclareMathSymbol{\Psi}{\mathalpha}{operators}{"09} +\DeclareMathSymbol{\Omega}{\mathalpha}{operators}{"0A} +% \end{macrocode} +% +% +% \subsubsection{Ordinary symbols} +% +% \begin{macrocode} +\DeclareMathSymbol{\aleph}{\mathord}{symbols}{"40} +\def\hbar{{\mathchar'26\mkern-9muh}} +\DeclareMathSymbol{\imath}{\mathord}{letters}{"7B} +\DeclareMathSymbol{\jmath}{\mathord}{letters}{"7C} +\DeclareMathSymbol{\ell}{\mathord}{letters}{"60} +\DeclareMathSymbol{\wp}{\mathord}{letters}{"7D} +\DeclareMathSymbol{\Re}{\mathord}{symbols}{"3C} +\DeclareMathSymbol{\Im}{\mathord}{symbols}{"3D} +\DeclareMathSymbol{\partial}{\mathord}{letters}{"40} +\DeclareMathSymbol{\infty}{\mathord}{symbols}{"31} +\DeclareMathSymbol{\prime}{\mathord}{symbols}{"30} +\DeclareMathSymbol{\emptyset}{\mathord}{symbols}{"3B} +\DeclareMathSymbol{\nabla}{\mathord}{symbols}{"72} +\def\surd{{\mathchar"1270}} +\DeclareMathSymbol{\top}{\mathord}{symbols}{"3E} +\DeclareMathSymbol{\bot}{\mathord}{symbols}{"3F} +\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr + \not\mathrel{\mkern14mu}\crcr + \noalign{\nointerlineskip} + \mkern2.5mu\leaders\hrule \@height.34pt\hfill\mkern2.5mu\crcr}}}} +\DeclareMathSymbol{\triangle}{\mathord}{symbols}{"34} +\DeclareMathSymbol{\forall}{\mathord}{symbols}{"38} +\DeclareMathSymbol{\exists}{\mathord}{symbols}{"39} +\DeclareMathSymbol{\neg}{\mathord}{symbols}{"3A} + \let\lnot=\neg +\DeclareMathSymbol{\flat}{\mathord}{letters}{"5B} +\DeclareMathSymbol{\natural}{\mathord}{letters}{"5C} +\DeclareMathSymbol{\sharp}{\mathord}{letters}{"5D} +\DeclareMathSymbol{\clubsuit}{\mathord}{symbols}{"7C} +\DeclareMathSymbol{\diamondsuit}{\mathord}{symbols}{"7D} +\DeclareMathSymbol{\heartsuit}{\mathord}{symbols}{"7E} +\DeclareMathSymbol{\spadesuit}{\mathord}{symbols}{"7F} +% \end{macrocode} +% +% +% \subsubsection{Large Operators} +% +% \begin{macrocode} +\DeclareMathSymbol{\coprod}{\mathop}{largesymbols}{"60} +\DeclareMathSymbol{\bigvee}{\mathop}{largesymbols}{"57} +\DeclareMathSymbol{\bigwedge}{\mathop}{largesymbols}{"56} +\DeclareMathSymbol{\biguplus}{\mathop}{largesymbols}{"55} +\DeclareMathSymbol{\bigcap}{\mathop}{largesymbols}{"54} +\DeclareMathSymbol{\bigcup}{\mathop}{largesymbols}{"53} +\DeclareMathSymbol{\intop}{\mathop}{largesymbols}{"52} + \def\int{\intop\nolimits} +\DeclareMathSymbol{\prod}{\mathop}{largesymbols}{"51} +\DeclareMathSymbol{\sum}{\mathop}{largesymbols}{"50} +\DeclareMathSymbol{\bigotimes}{\mathop}{largesymbols}{"4E} +\DeclareMathSymbol{\bigoplus}{\mathop}{largesymbols}{"4C} +\DeclareMathSymbol{\bigodot}{\mathop}{largesymbols}{"4A} +\DeclareMathSymbol{\ointop}{\mathop}{largesymbols}{"48} + \def\oint{\ointop\nolimits} +\DeclareMathSymbol{\bigsqcup}{\mathop}{largesymbols}{"46} +\DeclareMathSymbol{\smallint}{\mathop}{symbols}{"73} +% \end{macrocode} +% +% +% \subsubsection{Binary symbols} +% +% \changes{v2.3a}{2004/02/04} +% {Added bigtriangle synonyms for stmaryrd} +% \begin{macrocode} +\DeclareMathSymbol{\triangleleft}{\mathbin}{letters}{"2F} +\DeclareMathSymbol{\triangleright}{\mathbin}{letters}{"2E} +\DeclareMathSymbol{\bigtriangleup}{\mathbin}{symbols}{"34} +\DeclareMathSymbol{\bigtriangledown}{\mathbin}{symbols}{"35} + \let \varbigtriangledown \bigtriangledown + \let \varbigtriangleup \bigtriangleup +% \end{macrocode} +% +% These last two synonyms are needed because the \textsf{stamryrd} +% package redefines them as Operators. +% +% \begin{macrocode} +\DeclareMathSymbol{\wedge}{\mathbin}{symbols}{"5E} + \let\land=\wedge +\DeclareMathSymbol{\vee}{\mathbin}{symbols}{"5F} + \let\lor=\vee +\DeclareMathSymbol{\cap}{\mathbin}{symbols}{"5C} +\DeclareMathSymbol{\cup}{\mathbin}{symbols}{"5B} +\DeclareMathSymbol{\ddagger}{\mathbin}{symbols}{"7A} +\DeclareMathSymbol{\dagger}{\mathbin}{symbols}{"79} +\DeclareMathSymbol{\sqcap}{\mathbin}{symbols}{"75} +\DeclareMathSymbol{\sqcup}{\mathbin}{symbols}{"74} +\DeclareMathSymbol{\uplus}{\mathbin}{symbols}{"5D} +\DeclareMathSymbol{\amalg}{\mathbin}{symbols}{"71} +\DeclareMathSymbol{\diamond}{\mathbin}{symbols}{"05} +\DeclareMathSymbol{\bullet}{\mathbin}{symbols}{"0F} +\DeclareMathSymbol{\wr}{\mathbin}{symbols}{"6F} +\DeclareMathSymbol{\div}{\mathbin}{symbols}{"04} +\DeclareMathSymbol{\odot}{\mathbin}{symbols}{"0C} +\DeclareMathSymbol{\oslash}{\mathbin}{symbols}{"0B} +\DeclareMathSymbol{\otimes}{\mathbin}{symbols}{"0A} +\DeclareMathSymbol{\ominus}{\mathbin}{symbols}{"09} +\DeclareMathSymbol{\oplus}{\mathbin}{symbols}{"08} +\DeclareMathSymbol{\mp}{\mathbin}{symbols}{"07} +\DeclareMathSymbol{\pm}{\mathbin}{symbols}{"06} +\DeclareMathSymbol{\circ}{\mathbin}{symbols}{"0E} +\DeclareMathSymbol{\bigcirc}{\mathbin}{symbols}{"0D} +\DeclareMathSymbol{\setminus}{\mathbin}{symbols}{"6E} +\DeclareMathSymbol{\cdot}{\mathbin}{symbols}{"01} +\DeclareMathSymbol{\ast}{\mathbin}{symbols}{"03} +\DeclareMathSymbol{\times}{\mathbin}{symbols}{"02} +\DeclareMathSymbol{\star}{\mathbin}{letters}{"3F} +% \end{macrocode} +% +% +% \subsubsection{Relations} +% +% \begin{macrocode} +\DeclareMathSymbol{\propto}{\mathrel}{symbols}{"2F} +\DeclareMathSymbol{\sqsubseteq}{\mathrel}{symbols}{"76} +\DeclareMathSymbol{\sqsupseteq}{\mathrel}{symbols}{"77} +\DeclareMathSymbol{\parallel}{\mathrel}{symbols}{"6B} +\DeclareMathSymbol{\mid}{\mathrel}{symbols}{"6A} +\DeclareMathSymbol{\dashv}{\mathrel}{symbols}{"61} +\DeclareMathSymbol{\vdash}{\mathrel}{symbols}{"60} +\DeclareMathSymbol{\nearrow}{\mathrel}{symbols}{"25} +\DeclareMathSymbol{\searrow}{\mathrel}{symbols}{"26} +\DeclareMathSymbol{\nwarrow}{\mathrel}{symbols}{"2D} +\DeclareMathSymbol{\swarrow}{\mathrel}{symbols}{"2E} +\DeclareMathSymbol{\Leftrightarrow}{\mathrel}{symbols}{"2C} +\DeclareMathSymbol{\Leftarrow}{\mathrel}{symbols}{"28} +\DeclareMathSymbol{\Rightarrow}{\mathrel}{symbols}{"29} +\def\neq{\not=} \let\ne=\neq +\DeclareMathSymbol{\leq}{\mathrel}{symbols}{"14} + \let\le=\leq +\DeclareMathSymbol{\geq}{\mathrel}{symbols}{"15} + \let\ge=\geq +\DeclareMathSymbol{\succ}{\mathrel}{symbols}{"1F} +\DeclareMathSymbol{\prec}{\mathrel}{symbols}{"1E} +\DeclareMathSymbol{\approx}{\mathrel}{symbols}{"19} +\DeclareMathSymbol{\succeq}{\mathrel}{symbols}{"17} +\DeclareMathSymbol{\preceq}{\mathrel}{symbols}{"16} +\DeclareMathSymbol{\supset}{\mathrel}{symbols}{"1B} +\DeclareMathSymbol{\subset}{\mathrel}{symbols}{"1A} +\DeclareMathSymbol{\supseteq}{\mathrel}{symbols}{"13} +\DeclareMathSymbol{\subseteq}{\mathrel}{symbols}{"12} +\DeclareMathSymbol{\in}{\mathrel}{symbols}{"32} +\DeclareMathSymbol{\ni}{\mathrel}{symbols}{"33} + \let\owns=\ni +\DeclareMathSymbol{\gg}{\mathrel}{symbols}{"1D} +\DeclareMathSymbol{\ll}{\mathrel}{symbols}{"1C} +\DeclareMathSymbol{\not}{\mathrel}{symbols}{"36} +\DeclareMathSymbol{\leftrightarrow}{\mathrel}{symbols}{"24} +\DeclareMathSymbol{\leftarrow}{\mathrel}{symbols}{"20} + \let\gets=\leftarrow +\DeclareMathSymbol{\rightarrow}{\mathrel}{symbols}{"21} + \let\to=\rightarrow +\DeclareMathSymbol{\mapstochar}{\mathrel}{symbols}{"37} + \def\mapsto{\mapstochar\rightarrow} +\DeclareMathSymbol{\sim}{\mathrel}{symbols}{"18} +\DeclareMathSymbol{\simeq}{\mathrel}{symbols}{"27} +\DeclareMathSymbol{\perp}{\mathrel}{symbols}{"3F} +\DeclareMathSymbol{\equiv}{\mathrel}{symbols}{"11} +\DeclareMathSymbol{\asymp}{\mathrel}{symbols}{"10} +\DeclareMathSymbol{\smile}{\mathrel}{letters}{"5E} +\DeclareMathSymbol{\frown}{\mathrel}{letters}{"5F} +\DeclareMathSymbol{\leftharpoonup}{\mathrel}{letters}{"28} +\DeclareMathSymbol{\leftharpoondown}{\mathrel}{letters}{"29} +\DeclareMathSymbol{\rightharpoonup}{\mathrel}{letters}{"2A} +\DeclareMathSymbol{\rightharpoondown}{\mathrel}{letters}{"2B} +% \end{macrocode} +% +% Here cometh much profligate robustification of math constructs. +% Warning: some of these commands may become non-robust if an +% AMS package is loaded. +% +% Further potential problems: some math font packages may make +% unfortunate assumptions about some of these definitions that are +% not true of the robust versions we need. +% \changes{v2.3}{2004/02/02} +% {Many things from here on made robust} +% \begin{macrocode} +\DeclareRobustCommand + \cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign +\def\@vereq#1#2{\lower.5\p@\vbox{\lineskiplimit\maxdimen\lineskip-.5\p@ + \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}} +\DeclareRobustCommand + \notin{\mathrel{\m@th\mathpalette\c@ncel\in}} +\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} +\DeclareRobustCommand + \rightleftharpoons{\mathrel{\mathpalette\rlh@{}}} +\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt + \hbox{$#1\rightharpoonup$}\crcr + $#1\leftharpoondown$}}}} +\DeclareRobustCommand + \doteq{\buildrel\textstyle.\over=} +% \end{macrocode} +% +% \subsubsection{Arrows} +% +% \begin{macrocode} +\DeclareRobustCommand + \joinrel{\mathrel{\mkern-3mu}} +\DeclareRobustCommand + \relbar{\mathrel{\smash-}} % \smash, because - + % has the same height as + +% \end{macrocode} +% In contrast to \texttt{plain.tex} |\Relbar| got braces around the +% equal sign to guard against it being ``math active'' expanding to +% |\futurelet...|. This might be the case when packages are +% implementing shorthands for math, e.g. |=>| meaning |\Rightarrow| +% etc. It would actually be better not to use |=| in such +% definitions but instead define something like |\mathequalsign| +% and use this. However we can't do this now as it would break +% other math layouts where characters are in different places +% (since those wouldn't know about the need for a new command name). +% \changes{v2.2z}{2001/06/04}{Guard against math active equal sign in +% \cs{Relbar} (pr/3333)} +% \begin{macrocode} +\DeclareRobustCommand + \Relbar{\mathrel{=}} +\DeclareMathSymbol{\lhook}{\mathrel}{letters}{"2C} + \def\hookrightarrow{\lhook\joinrel\rightarrow} +\DeclareMathSymbol{\rhook}{\mathrel}{letters}{"2D} + \def\hookleftarrow{\leftarrow\joinrel\rhook} +\DeclareRobustCommand + \bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft} +% \end{macrocode} +% +% \changes{v2.2z}{2001/06/04}{Guard against math active equal and pipe +% sign in \cs{models} (pr/3333)} +% \begin{macrocode} +\DeclareRobustCommand + \models{\mathrel{|}\joinrel\Relbar} +\DeclareRobustCommand + \Longrightarrow{\Relbar\joinrel\Rightarrow} +% \end{macrocode} +% +% LaTeX Change: |\longrightarrow| and |\longleftarrow| redefined to make +% then robust. +% \begin{macrocode} +\DeclareRobustCommand\longrightarrow + {\relbar\joinrel\rightarrow} +\DeclareRobustCommand\longleftarrow + {\leftarrow\joinrel\relbar} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand + \Longleftarrow{\Leftarrow\joinrel\Relbar} +\DeclareRobustCommand + \longmapsto{\mapstochar\longrightarrow} +\DeclareRobustCommand + \longleftrightarrow{\leftarrow\joinrel\rightarrow} +\DeclareRobustCommand + \Longleftrightarrow{\Leftarrow\joinrel\Rightarrow} +\DeclareRobustCommand + \iff{\;\Longleftrightarrow\;} +% \end{macrocode} +% +% +% \subsubsection{Punctuation symbols} +% +% \begin{macrocode} +\DeclareMathSymbol{\ldotp}{\mathpunct}{letters}{"3A} +\DeclareMathSymbol{\cdotp}{\mathpunct}{symbols}{"01} +\DeclareMathSymbol{\colon}{\mathpunct}{operators}{"3A} +% \end{macrocode} +% +% +% This is commented out, since |\ldots| is now defined in ltoutenc.dtx. +% \begin{macrocode} +%\def\@ldots{\mathinner{\ldotp\ldotp\ldotp}} +%\DeclareRobustCommand\ldots +% {\relax\ifmmode\@ldots\else\mbox{$\m@th\@ldots\,$}\fi} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand + \cdots{\mathinner{\cdotp\cdotp\cdotp}} +\DeclareRobustCommand + \vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ + \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +\DeclareRobustCommand + \ddots{\mathinner{\mkern1mu\raise7\p@ + \vbox{\kern7\p@\hbox{.}}\mkern2mu + \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}} +% \end{macrocode} +% +% +% \subsubsection{Math accents} +% +% \begin{macrocode} +\DeclareMathAccent{\acute}{\mathalpha}{operators}{"13} +\DeclareMathAccent{\grave}{\mathalpha}{operators}{"12} +\DeclareMathAccent{\ddot}{\mathalpha}{operators}{"7F} +\DeclareMathAccent{\tilde}{\mathalpha}{operators}{"7E} +\DeclareMathAccent{\bar}{\mathalpha}{operators}{"16} +\DeclareMathAccent{\breve}{\mathalpha}{operators}{"15} +\DeclareMathAccent{\check}{\mathalpha}{operators}{"14} +\DeclareMathAccent{\hat}{\mathalpha}{operators}{"5E} +\DeclareMathAccent{\vec}{\mathord}{letters}{"7E} +\DeclareMathAccent{\dot}{\mathalpha}{operators}{"5F} +\DeclareMathAccent{\widetilde}{\mathord}{largesymbols}{"65} +\DeclareMathAccent{\widehat}{\mathord}{largesymbols}{"62} +% \end{macrocode} +% For some reason plain \TeX{} never bothered to provide +% a ring accent in math (although it is available in the fonts), +% but since we got a request for it here we go: +% \changes{v2.2t}{1998/04/11}{Added \cs{mathring} accent (pr2785)} +% \begin{macrocode} +\DeclareMathAccent{\mathring}{\mathalpha}{operators}{"17} +% \end{macrocode} +% +% +% \subsubsection{Radicals} +% +% \changes{v2.2o}{1996/05/17}{\cs{@@sqrt} removed, at last} +% \begin{macrocode} +\DeclareMathRadical{\sqrtsign}{symbols}{"70}{largesymbols}{"70} +% \end{macrocode} +% +% +% \subsubsection{Over and under something, etc} +% +% \begin{macrocode} +\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr + \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr + \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}% + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}% + \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}% + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr + $\hfil\displaystyle{#1}\hfil$\crcr + \noalign{\kern3\p@\nointerlineskip}% + \upbracefill\crcr\noalign{\kern3\p@}}}}\limits} +% \end{macrocode} +% (quite a waste of tokens, IMHO --- Frank) +% \begin{macrocode} +\def\skew#1#2#3{{\muskip\z@#1mu\divide\muskip\z@\tw@ \mkern\muskip\z@ + #2{\mkern-\muskip\z@{#3}\mkern\muskip\z@}\mkern-\muskip\z@}{}} +% \end{macrocode} +% +% \changes{v2.2n}{1995/11/21}{Incorporate changed figures, +% as in plain.tex} +% \begin{macrocode} +\def\rightarrowfill{$\m@th\smash-\mkern-7mu% + \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill + \mkern-7mu\mathord\rightarrow$} +\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-7mu% + \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill + \mkern-7mu\smash-$} +\DeclareMathSymbol{\braceld}{\mathord}{largesymbols}{"7A} +\DeclareMathSymbol{\bracerd}{\mathord}{largesymbols}{"7B} +\DeclareMathSymbol{\bracelu}{\mathord}{largesymbols}{"7C} +\DeclareMathSymbol{\braceru}{\mathord}{largesymbols}{"7D} +\def\downbracefill{$\m@th \setbox\z@\hbox{$\braceld$}% + \braceld\leaders\vrule \@height\ht\z@ \@depth\z@\hfill\braceru + \bracelu\leaders\vrule \@height\ht\z@ \@depth\z@\hfill\bracerd$} +\def\upbracefill{$\m@th \setbox\z@\hbox{$\braceld$}% + \bracelu\leaders\vrule \@height\ht\z@ \@depth\z@\hfill\bracerd + \braceld\leaders\vrule \@height\ht\z@ \@depth\z@\hfill\braceru$} +% \end{macrocode} +% +% \subsubsection{Delimiters} +% +% \begin{macrocode} +\DeclareMathDelimiter{\lmoustache} % top from (, bottom from ) + {\mathopen}{largesymbols}{"7A}{largesymbols}{"40} +\DeclareMathDelimiter{\rmoustache} % top from ), bottom from ( + {\mathclose}{largesymbols}{"7B}{largesymbols}{"41} +\DeclareMathDelimiter{\arrowvert} % arrow without arrowheads + {\mathord}{symbols}{"6A}{largesymbols}{"3C} +\DeclareMathDelimiter{\Arrowvert} % double arrow without arrowheads + {\mathord}{symbols}{"6B}{largesymbols}{"3D} +\DeclareMathDelimiter{\Vert} + {\mathord}{symbols}{"6B}{largesymbols}{"0D} +\let\|=\Vert +\DeclareMathDelimiter{\vert} + {\mathord}{symbols}{"6A}{largesymbols}{"0C} +\DeclareMathDelimiter{\uparrow} + {\mathrel}{symbols}{"22}{largesymbols}{"78} +\DeclareMathDelimiter{\downarrow} + {\mathrel}{symbols}{"23}{largesymbols}{"79} +\DeclareMathDelimiter{\updownarrow} + {\mathrel}{symbols}{"6C}{largesymbols}{"3F} +\DeclareMathDelimiter{\Uparrow} + {\mathrel}{symbols}{"2A}{largesymbols}{"7E} +\DeclareMathDelimiter{\Downarrow} + {\mathrel}{symbols}{"2B}{largesymbols}{"7F} +\DeclareMathDelimiter{\Updownarrow} + {\mathrel}{symbols}{"6D}{largesymbols}{"77} +\DeclareMathDelimiter{\backslash} % for double coset G\backslash H + {\mathord}{symbols}{"6E}{largesymbols}{"0F} +\DeclareMathDelimiter{\rangle} + {\mathclose}{symbols}{"69}{largesymbols}{"0B} +\DeclareMathDelimiter{\langle} + {\mathopen}{symbols}{"68}{largesymbols}{"0A} +\DeclareMathDelimiter{\rbrace} + {\mathclose}{symbols}{"67}{largesymbols}{"09} +\DeclareMathDelimiter{\lbrace} + {\mathopen}{symbols}{"66}{largesymbols}{"08} +\DeclareMathDelimiter{\rceil} + {\mathclose}{symbols}{"65}{largesymbols}{"07} +\DeclareMathDelimiter{\lceil} + {\mathopen}{symbols}{"64}{largesymbols}{"06} +\DeclareMathDelimiter{\rfloor} + {\mathclose}{symbols}{"63}{largesymbols}{"05} +\DeclareMathDelimiter{\lfloor} + {\mathopen}{symbols}{"62}{largesymbols}{"04} +% \end{macrocode} +% +% \begin{macro}{\lgroup} +% \begin{macro}{\rgroup} +% \begin{macro}{\bracevert} +% There are three plain \TeX{} delimiters which are not fully +% supported by NFSS, since they partly point into a bold cmr font. +% Allocating a full symbol font, just to have three delimiters +% seems a bit too much given the limited space available. For this +% reason only the extensible sizes are supported. If this is not +% desired one can use, without losing portability, define |\mathbf| +% and |\mathtt| as font symbol alphabet (setting up +% \texttt{cmr/bx/n} and \texttt{cmtt/m/n} as symbol fonts first) +% and modify the delimiter declarations to point with their +% small variant to those symbol fonts. (This is done in +% \texttt{oldlfont.dtx} so look there for examples.) +% \begin{macrocode} +\DeclareMathDelimiter{\lgroup} % extensible ( with sharper tips + {\mathopen}{largesymbols}{"3A}{largesymbols}{"3A} +\DeclareMathDelimiter{\rgroup} % extensible ) with sharper tips + {\mathclose}{largesymbols}{"3B}{largesymbols}{"3B} +\DeclareMathDelimiter{\bracevert} % the vertical bar that extends braces + {\mathord}{largesymbols}{"3E}{largesymbols}{"3E} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Math versions of text commands} +% +% \changes{v2.2k}{1995/06/05}{Moved math commands from ltoutenc.dtx.} +% +% The |\mathunderscore| here is really a text definition, so it has +% been put back into |ltoutenc.dtx| (by Chris, 30/04/97) and should +% be removed from here. +% +% These symbols are the math versions of text commands such as |\P|, +% |\$|, etc. +% \begin{macro}{\mathparagraph} +% \changes{v2.2q}{1997/01/08} +% {Define using \cs{DeclareMathSymbol}} +% \begin{macro}{\mathsection} +% \begin{macro}{\mathdollar} +% \begin{macro}{\mathsterling} +% \begin{macro}{\mathunderscore} +% These math symbols are not in plain \TeX. +% \begin{macrocode} +\DeclareMathSymbol{\mathparagraph}{\mathord}{symbols}{"7B} +\DeclareMathSymbol{\mathsection}{\mathord}{symbols}{"78} +\DeclareMathSymbol{\mathdollar}{\mathord}{operators}{"24} +% \end{macrocode} +% +% \begin{macrocode} +\def\mathsterling{\mathit{\mathchar"7024}} +\def\mathunderscore{\kern.06em\vbox{\hrule\@width.3em}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mathellipsis} +% This is plain \TeX's |\ldots|. +% \begin{macrocode} +\def\mathellipsis{\mathinner{\ldotp\ldotp\ldotp}}% +% \end{macrocode} +% \end{macro} +% +% \subsection{Other special functions and parameters} +% +% \subsubsection{Biggggg} +% +% \changes{v3.0b}{2018/09/24}{Start LR-mode if necessary (git/49)} +% \begin{macrocode} +%</math> +%<*math|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\Big}{Start LR-mode}% +\def\big#1{\leavevmode@ifvmode + {\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}} +\def\Big#1{\leavevmode@ifvmode + {\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}} +\def\bigg#1{\leavevmode@ifvmode + {\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}} +\def\Bigg#1{\leavevmode@ifvmode + {\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}} +%</math|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\Big}{Start LR-mode}% +%<latexrelease>\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}} +%<latexrelease>\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}} +%<latexrelease>\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}} +%<latexrelease>\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}} +%<latexrelease>\EndIncludeInRelease +%<*math> +% \end{macrocode} +% +% \begin{macrocode} +\def\n@space{\nulldelimiterspace\z@ \m@th} +% \end{macrocode} +% +% +% +% \subsubsection{The log-like functions} +% +% \begin{macro}{\operator@font} +% The |\operator@font| determines the symbol font used for log-like +% functions. +% \begin{macrocode} +\def\operator@font{\mathgroup\symoperators} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Parameters} +% +% \begin{macrocode} +\thinmuskip=3mu +\medmuskip=4mu plus 2mu minus 4mu +\thickmuskip=5mu plus 5mu +% \end{macrocode} +% +% +% This finishes the low-level setup in \texttt{fontmath.ltx}. +% \begin{macrocode} +%</math> +% \end{macrocode} +% +% +% \section{Default cfg files} +% +% We provide default \texttt{cfg} files here to ensure that +% on installations that search large file trees we do not pick up +% some strange customisation files from somewhere. +% \changes{v2.2y}{2001/06/02}{Provide default cfg files (pr/3264)} +% \begin{macrocode} +%<*cfgtext|cfgmath|cfgprel> +%% +%% +%% +%% Load the standard setup: +%% +%<+cfgtext>\input{fonttext.ltx} +%<+cfgmath>\input{fontmath.ltx} +%<+cfgprel>\input{preload.ltx} +%% +%% Small changes could go here; see documentation in cfgguide.tex for +%% allowed modifications. +%% +%% In particular it is not allowed to misuse this configuration file +%% to modify internal LaTeX commands! +%% +%% If you use this file as the basis for configuration please change +%% the \ProvidesFile lines to clearly identify your modification, e.g., +%% +%<+cfgtext>%% \ProvidesFile{fonttext.cfg}[2001/06/01 +%<+cfgmath>%% \ProvidesFile{fonttext.cfg}[2001/06/01 +%<+cfgprel>%% \ProvidesFile{preload.cfg}[2001/06/01 +%% Customised local font setup] +%% +%% +%</cfgtext|cfgmath|cfgprel> +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/format.ins b/Master/texmf-dist/source/latex-dev/base/format.ins new file mode 100644 index 00000000000..3a7782a06e0 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/format.ins @@ -0,0 +1,267 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2018 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% +\input docstrip +\keepsilent + +\declarepreamble\mainpreamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2018 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\def\MetaPrefix{--} +\declarepreamble\luapreamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 2015 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble +\let\MetaPrefix\DoubleperCent + +\declarepreamble\cfgpreamble + +This is a generated file. + +Copyright 1993-2018 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +Details of how to use a configuration file to modify this part of +the system are in the document `cfgguide.tex'. + + +\endpreamble + + +\usepreamble\mainpreamble +\usedir{tex/latex/base} + +\generate{% + \file{latex.ltx}{% + \from{ltdirchk.dtx}{initex,2ekernel,dircheck} + \from{ltplain.dtx}{2ekernel} + \from{ltvers.dtx}{2ekernel} + \from{ltdefns.dtx}{2ekernel} + \from{ltalloc.dtx}{2ekernel} + \from{ltcntrl.dtx}{2ekernel} + \from{lterror.dtx}{2ekernel} + \from{ltpar.dtx}{2ekernel} + \from{ltspace.dtx}{2ekernel} + \from{ltlogos.dtx}{2ekernel} + \from{ltfiles.dtx}{2ekernel} + \from{ltoutenc.dtx}{2ekernel} + \from{ltcounts.dtx}{2ekernel} + \from{ltlength.dtx}{2ekernel} + \from{ltfssbas.dtx}{2ekernel} + \from{ltfsstrc.dtx}{2ekernel} +% \from{ltfsscmp.dtx}{compat,2ekernel} + \from{ltfssdcl.dtx}{compat,2ekernel} + \from{ltfssini.dtx}{compat,2ekernel} + \from{ltfntcmd.dtx}{2ekernel} + \from{ltpageno.dtx}{2ekernel} + \from{ltxref.dtx}{2ekernel} + \from{ltmiscen.dtx}{2ekernel} + \from{ltmath.dtx}{2ekernel} + \from{ltlists.dtx}{2ekernel} + \from{ltboxes.dtx}{2ekernel} + \from{lttab.dtx}{2ekernel} + \from{ltpictur.dtx}{2ekernel} + \from{ltthm.dtx}{2ekernel} + \from{ltsect.dtx}{2ekernel} + \from{ltfloat.dtx}{2ekernel} + \from{ltidxglo.dtx}{2ekernel} + \from{ltbibl.dtx}{2ekernel} + \from{ltpage.dtx}{2ekernel} + \from{ltoutput.dtx}{2ekernel} + \from{ltclass.dtx}{2ekernel,tracerollback} + \from{ltluatex.dtx}{2ekernel} + \from{ltfinal.dtx}{2ekernel}} + \file{tracefnt.sty}{% + \from{ltfsstrc.dtx}{package,trace}} + \file{flafter.sty}{% + \from{ltoutput.dtx}{flafter,trace}} + \file{fltrace.sty}{% + \from{ltoutput.dtx}{fltrace,trace}} +%%% generate general option files modifying the kernel behavior + \file{fleqn.clo}{% + \from{ltmath.dtx}{fleqn}} + \file{leqno.clo}{% + \from{ltmath.dtx}{leqno}} + } + + + + +\generateFile{oldlfont.sty}{t}{% + \from{oldlfont.dtx}{package} +} + +\generateFile{newlfont.sty}{t}{% + \from{newlfont.dtx}{package} +} + +% luatex support (TeX part) + +\generate{\file{ltluatex.tex}{\from{ltluatex.dtx}{tex,plain}}} + +%%%%%%%%%%%%%%%%% CUSTOMISABLE FILES + +\usedir{tex/latex/base} + +\usepreamble\cfgpreamble + +\generateFile{hyphen.ltx}{t}{% + \from{lthyphen.dtx}{default} +} + + +\generate{ + \file{fonttext.ltx}{ + \from{fontdef.dtx}{text}} + \file{fontmath.ltx}{ + \from{fontdef.dtx}{math}} + \file{fonttext.cfg}{ + \from{fontdef.dtx}{cfgtext}} + \file{fontmath.cfg}{ + \from{fontdef.dtx}{cfgmath}} + \file{preload.cfg}{ + \from{fontdef.dtx}{cfgprel}} + } + +\generateFile{preload.ltx}{t}{% + \from{preload.dtx}{preload,cm,xpt,tex}} + +%%%%%%%%%%%%%%%%% Lua code + +% This is at the end as the prefix/postamble requirements are +% different to everything else + +\def\MetaPrefix{--} +\usepreamble\luapreamble +\nopostamble +\generate{\file{ltluatex.lua}{\from{ltluatex.dtx}{lua}}} + +\endbatchfile + + + diff --git a/Master/texmf-dist/source/latex-dev/base/graphpap.dtx b/Master/texmf-dist/source/latex-dev/base/graphpap.dtx new file mode 100644 index 00000000000..5442c287cc8 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/graphpap.dtx @@ -0,0 +1,195 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%% +%% File `graphpap.dtx'. +%% Copyright (C) 1994 by Leslie Lamport +%% all rights reserved. +%% +% +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{graphpap} +%<package> [1994/08/09 v1.0c Standard LaTeX graphpap package (LL)] +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{graphpap} +\GetFileInfo{graphpap.sty} +\begin{document} +\title{The \textsf{graphpap} package\thanks{This file + has version number \fileversion, last + revised \filedate.}} +\author{Leslie Lamport} +\date{\filedate} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{graphpap.dtx} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0b}{1994/04/28}{(DPC) convert to doc format} +% +% +% |\graphpaper|\oarg{N}\parg{X,Y}\parg{DX,DY} +% Makes a grid with left-hand corner at \parg{X,Y}, extending +% \parg{DX,DY} units in the X and Y directions, where the lines are +% \emph{N} units apart. Every fifth line is thick and is numbered. +% The default value of \emph{N} is 10. +% The arguments must all be integers. +% +% \StopEventually +% +% First, we define three counters. The first two are defined +% as raw TeX counters since multiplication and division must be +% performed in them. +% +% \changes{v1.0b}{1994/04/28}{(DPC) Remove allocations.} +% \begin{macrocode} +%<*package> +% \newcount\@gridx% now (\@tempcnta) +% \newcount\@gridy% now (\@tempcntb) +% \newcounter{@grid} +\let\c@@grid\count@ +% \end{macrocode} +% +% Next we define the following commands to draw vertical and horizontal +% grids. The ``nonum'' commands just draw the grids; the other commands +% also print numbers. All the arguments must be integers. +% +% VERTICAL GRIDS +% +% \noindent +% |\@vgrid|\parg{xpos,ypos}\marg{xincrement}\\ +% | |\marg{number-of-lines}\marg{length-of-lines} +% +% \noindent +% |\@nonumvgrid|\parg{xpos,ypos}\marg{xincrement}\\ +% | |\marg{number-of-lines} \marg{length-of-lines} +% +% HORIZONTAL GRIDS +% +% \noindent +% |\@hgrid|\parg{xpos,ypos}\marg{yincrement}\\ +% | |\marg{number-of-lines}\marg{length-of-lines} +% +% \noindent +% |\@nonumhgrid| same as |\@hgrid| but no numbers drawn +% +% \begin{macrocode} +\def\@vgrid(#1,#2)#3#4#5{% + \setcounter{@grid}{#1}% + \multiput(#1,#2)(#3,0){#4}{\line(0,1){#5}}% + \multiput(#1,#2)(#3,0){#4}{\@vgridnumber{#3}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@vgridnumber#1{% + \makebox(0,0)[t]{% + \shortstack{\rule{0pt}{10pt}\\\arabic{@grid}}}% + \addtocounter{@grid}{#1}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@nonumvgrid(#1,#2)#3#4#5{% + \multiput(#1,#2)(#3,0){#4}{\line(0,1){#5}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@hgrid(#1,#2)#3#4#5{% + \setcounter{@grid}{#2}% + \multiput(#1,#2)(0,#3){#4}{\line(1,0){#5}}% + \multiput(#1,#2)(0,#3){#4}{\@hgridnumber{#3}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@hgridnumber#1{% + \makebox(0,0)[r]{\arabic{@grid}\hspace{10pt}}% + \addtocounter{@grid}{#1}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@nonumhgrid(#1,#2)#3#4#5{% + \multiput(#1,#2)(0,#3){#4}{\line(1,0){#5}}} +% \end{macrocode} +% +% Finally, |\graphpaper| is defined in a straightforward way in terms of +% the commands above. +% +% \begin{macro}{\graphpaper} +% \changes{v1.0c}{1994/08/09}{(DPC) add \cs{leavevmode}} +% \begin{macrocode} +\newcommand\graphpaper[1][10]{\leavevmode\@grid{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@grid} +% +% \changes{v1.0b}{1994/04/28} +% {(DPC) convert ignore spaces between arguments} +% \begin{macrocode} +\def\@grid#1(#2,#3)#4{\@grid@i{#1}{#2}{#3}(} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@grid@i} +% +% \changes{v1.0b}{1994/04/28} +% {(DPC) macro introduced} +% \begin{macrocode} +\def\@grid@i#1#2#3(#4,#5){% + \@tempcnta=#4\relax + \divide\@tempcnta#1\relax + \advance\@tempcnta1\relax + {\thinlines\@nonumvgrid(#2,#3){#1}{\@tempcnta}{#5} + \@tempcnta#4\relax + \divide\@tempcnta5\relax + \divide\@tempcnta#1\relax + \advance\@tempcnta1\relax + \@tempcntb5\relax + \multiply\@tempcntb#1\relax + \thicklines\@vgrid(#2,#3){\@tempcntb}{\@tempcnta}{#5} + \@tempcnta#5\relax + \divide\@tempcnta #1\relax + \advance\@tempcnta1\relax + \thinlines\@nonumhgrid(#2,#3){#1}{\@tempcnta}{#4} + \@tempcnta#5\relax + \divide\@tempcnta5\relax + \divide\@tempcnta#1\relax + \advance\@tempcnta1\relax + \thicklines\@hgrid(#2,#3){\@tempcntb}{\@tempcnta}{#4}}% + \ignorespaces} +%</package> +% \end{macrocode} +% \end{macro} +% +% \Finale +% + diff --git a/Master/texmf-dist/source/latex-dev/base/graphpap.ins b/Master/texmf-dist/source/latex-dev/base/graphpap.ins new file mode 100644 index 00000000000..253d89baf95 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/graphpap.ins @@ -0,0 +1,86 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generateFile{graphpap.sty}{t}{\from{graphpap.dtx}{package}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/ifthen.dtx b/Master/texmf-dist/source/latex-dev/base/ifthen.dtx new file mode 100644 index 00000000000..b538f895d06 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ifthen.dtx @@ -0,0 +1,526 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%% +%% File `ifthen.dtx'. +%% Copyright (C) 1991 by Leslie Lamport +%% Copyright (C) 1994-2001 LaTeX3 project, David Carlisle +%% all rights reserved. +%% +% +%<*dtx> + \ProvidesFile{ifthen.dtx} +%</dtx> +%<package>\NeedsTeXFormat{LaTeX2e}[1994/12/01] +%<package>\ProvidesPackage{ifthen} +%<driver>\ProvidesFile{ifthen.drv} +% \fi +% \ProvidesFile{ifthen.dtx} + [2014/09/29 v1.1c Standard LaTeX ifthen package (DPC)] +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\begin{document} +\DocInput{ifthen.dtx} +\end{document} +%</driver> +% \fi +% +% \GetFileInfo{ifthen.dtx} +% +% \title{The \textsf{ifthen} package\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{David Carlisle} +% \date{\filedate} +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% +% +% \begin{abstract} +% This file implements an |\ifthenelse| command for \LaTeXe. +% The algorithm used is compatible with that used in the \LaTeX~2.09 +% |ifthen| style option. It has been recoded, making the resulting +% definitions somewhat more compact and efficient. +% \end{abstract} +% +% \changes{v1.0a}{1993/10/15}{New implementation} +% \changes{v1.0b}{1993/12/17}{Upgrade to LaTeX2e} +% \changes{v1.0e}{1994/02/11}{Improve documentation} +% \changes{v1.0f}{1994/03/02}{Remove need for dtx file} +% \changes{v1.0g}{1994/03/14}{Modify for the new ltxdoc.cls} +% \changes{v1.0k}{1995/04/25}{Fix `driver' docstrip guards.} +% \changes{v1.0n}{1997/11/03}{Documentation fix.} +% \changes{v1.0o}{1998/08/17}{Documentation fix.} +% +% \section{Introduction} +% +% \DescribeMacro{\ifthenelse} +% |\ifthenelse{|^^A +% \meta{test}|}{|\meta{then clause}|}{|\meta{else clause}|}| +% +% Evaluates \meta{test} as a boolean function, and then executes +% either \meta{then clause} or \meta{else clause}. +% +% \meta{test} is a boolean expression using the infix connectives, +% |\and|, |\or|, the unary |\not| and parentheses |\( \)|. +% +% As an alternative notation |\AND|, |\OR| and |\NOT| can be +% used. This is safer since it can't be misinterpreted +% when appearing inside a \TeX-conditional in which |\or| has a +% different meaning. +% +% The atomic propositions are:\\ +% \meta{number} |<| \meta{number} \\ +% \meta{number} |=| \meta{number} \\ +% \meta{number} |>| \meta{number} \\ +% |\isodd{| \meta{number} |}|\\ +% |\isundefined{| \meta{command name} |}|\\ +% |\equal{|\meta{string}|}{|\meta{string}|}|\\ +% |\lengthtest{|\meta{dimen}|<|\meta{dimen}|}|\\ +% |\lengthtest{|\meta{dimen}|=|\meta{dimen}|}|\\ +% |\lengthtest{|\meta{dimen}|>|\meta{dimen}|}|\\ +% |\boolean{|\meta{name}|}| +% +% The \meta{string}s tested by |\equal| may be any sequence of commands +% that expand to a list of tokens. If these expansions are equal, then +% the proposition is true. +% +% |\isodd| is true if the \meta{number} is odd, and false otherwise +% (even if the argument is not a number). +% +% |\isundefined{\cmd}| is true if |\cmd| is not defined. +% +% |\boolean{xyz}| returns the truth value contained in the primitive +% \TeX\ |\if|, |\ifxyz|. This is usually used with boolean flags +% created with |\newboolean| and |\provideboolean| described below. +% It can also be used with the names of |\newif| created tokens, and +% primitive \TeX\ |\if| constructs, for example |\boolean{true}| +% (|\iftrue|), |\boolean{mmode}| (|\ifmmode|) etc. +% +% +% The commands:\\ +% |\newboolean|\marg{name}\DescribeMacro{\newboolean}\ and\ +% |\provideboolean|\marg{name}\DescribeMacro{\provideboolean}\ +% are provided so the user can easily create new boolean flags. +% As for |\newcommand|, |\newboolean| generates an error if the +% command name is not new. |\provideboolean| silently does nothing in +% that case. +% +% The boolean flags may be set with:\\ +% |\setboolean|\marg{name}\marg{value}\DescribeMacro{\setboolean}\\ +% \meta{value} may be either |true| or |false| (any CaSe). +% +% Note that there is no precedence between |\and| and |\or|. +% The proposition is evaluated in a left right manner. |\not| only +% applies to the immediately following proposition. (This is consistent +% with Lamport's |ifthen.sty|.) In this style, though the test is +% `lazily' evaluated, so for instance if the first proposition in an +% |\or| is true, the second one is skipped. (On the second pass---the +% first pass in an |\edef| expands clauses in all propositions.) +% +% Apart from the addition of the extra atomic propositions |\isodd|, +% |\boolean|, |\lengthtest| and |\isundefined|, +% the only known incompatibility is that +% in this package the expression|\not\not|\meta{P} is equivalent to +% \meta{P}. +% However in the original style it was equivalent to |\not|\meta{P}. +% This is intentional (bug fix:-). +% +% \DescribeMacro{\whiledo} +% The command |\whiledo| is also defined (copied directly from +% the \LaTeX2.09 definition). +% +% |\whiledo{|\meta{test}|}{|\meta{while clause}|}| +% +% With \meta{test} as above, repeatedly executes \meta{while clause} +% while the test remains true. +% +% \StopEventually{} +% +% \section{The Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macro}{\TE@throw} +% In order to support the syntax of |ifthen.sty|, which allows access +% to the primitive \TeX\ syntax for a numeric test, rather than a |{}| +% delimited argument form, it is most convenient to work `within' an +% |\ifnum|. |\ift@throw| `throws' you out of the current |\ifnum| so +% that you can (eg) start an |\ifdim| for the length tests. +% \begin{macrocode} +\def\TE@throw{\@ne=\@ne\noexpand\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\boolean} +% A non-standard extension to |ifthen|, supporting boolean was +% previously available, this is a simpler implementation. +% \begin{macrocode} +\def\boolean#1#2{% + \TE@throw\expandafter\noexpand\csname if#1\endcsname#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@length} +% Testing lengths. |#1| is the test. The extra argument gobbles spaces. +% \begin{macrocode} +\def\TE@length#1#2{\TE@throw\noexpand\ifdim#1#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@odd} +% \begin{macro}{\TE@@odd} +% Testing odd/even. This is true if |#1| is an odd number, and false +% otherwise (even if |#1| is not a number at all). +% +% It is hard to make this completely reliable. Here I have erred on the +% side of safety. This should not generate a \TeX\ error if given any +% robust commands as its argument. However it returns true on any +% argument that \emph{starts} with an odd number |11xx| which is bad, +% and it can not deal with \TeX's count registers, although \LaTeX\ +% counters work (via |\value|). +% \changes{v1.0b}{1993/12/17}{Improve \cs{isodd}.} +% \changes{v1.0c}{1994/01/20}{Improve \cs{isodd} again.} +% \begin{macrocode} +\def\TE@odd#1#2{% + \TE@throw\noexpand\TE@@odd#1\noexpand\@nil\noexpand\ifodd\count@#2} +% \end{macrocode} +% +% |\TE@@odd| is not expanded on the first pass. +% \begin{macrocode} +\def\TE@@odd#1#2\@nil{% + \@defaultunits + \count@\if-#1-0\else0\expandafter#1\fi#2\relax\@nnil} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\TE@repl} +% |\TE@repl| replaces the single token |#1| by |#2|. (Not within |{}| +% groups.) It is used to replace |\or| by |\TE@or| without the need to +% redefine |\or|. Earlier versions just |\let\or\TE@or| but this has a +% bad effect on the expansion of commands which use the primitive +% |\or| internally, eg |\alph|, and so caused surprising results if +% these commands were used inside |\equal|. +% \changes{v1.0h}{1994/05/14}{macro added} +% \begin{macrocode} +\def\TE@repl#1#2{% + \long\def\@tempc##1#1##2{% + \def\@tempa{##2}\def\@tempb{\@tempc}% + \ifx\@tempa\@tempb + \toks@\expandafter{\the\toks@##1}% + \expandafter\@gobble + \else + \toks@\expandafter{\the\toks@##1#2}% + \expandafter\@tempc + \fi + ##2}% + \expandafter\toks@\expandafter{\expandafter}% + \expandafter\@tempc\the\toks@#1\@tempc} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ifthenelse} +% The remaining macros in this file are derived from the ones in +% |ifthen.sty| but recoded and simplified. The main simplification is +% that the original style (and the |\boolean| extensions) expressed +% logical values always in terms of |\ifnum|. As |\fi| is `untyped' this +% is not necessary, so for example the length tests can return values +% via |\ifdim|, the trailing |\fi| will not complain, even though it was +% `expecting' an |\ifnum|. Also the system of passing information via +% macros expanding to |T| or |F| has been completely replaced by a +% simpler system using |\iftrue|, which furthermore allows lazy +% evaluation on the second pass. +% \begin{macrocode} +\long\def\ifthenelse#1{% +% \end{macrocode} +% \changes{v1.0h}{1994/05/14}{Use \cs{TE@repl}} +% \begin{macrocode} + \toks@{#1}% + \TE@repl\or\TE@or + \TE@repl\and\TE@and + \TE@repl\not\TE@neg +% \end{macrocode} +% +% \changes{v1.1c}{2001/05/25}{Added \cs{AND}, \cs{OR} and \cs{NOT} as +% boolean operators as alternative to the lower case versions +% (pr/3297)} +% Support alternate names for the boolean operators (strictly +% speaking only |\OR| would be necessary). +% \begin{macrocode} + \TE@repl\OR\TE@or + \TE@repl\AND\TE@and + \TE@repl\NOT\TE@neg +% \end{macrocode} +% The original |ifthen.sty| processed everything inside a box +% assignment, to catch any extra spaces before they appeared in the +% output. Instead I have added extra arguments to the commands so they +% each remove any following space. +% +% Set up the user level names |\not| etc. +% \changes{v1.0c}{1994/01/20}{Modify \cs{protect} and \cs{value}} +% \changes{v1.0j}{1994/11/15}{Modify \cs{protect} add \cs{@setref}} +% \changes{v1.0l}{1996/03/22} +% {Use \cs{begingroup} not \cs{bgroup} for latex/2105} +% \changes{v1.1a}{1999/01/07}{\cs{isundefined} added for /2824} +% \begin{macrocode} + \begingroup + \let\protect\@unexpandable@protect + \def\@setref##1##2##3{% + \ifx##1\relax\z@\else\expandafter##2##1\fi}% + \def\value##1{\the\csname c@##1\endcsname}% + \let\equal\TE@equal \let\(\TE@lparen \let\)\TE@rparen + \let\isodd\TE@odd \let\lengthtest\TE@length + \let\isundefined\TE@undef +% \end{macrocode} +% For the first pass, in a group, make various tokens non-expandable. +% +% It is unfortunate that in order to remain compatible with |ifthen| +% syntax, it is necessary to have a two pass system. The first pass +% inside an |\edef| `exposes' the |\if|\ldots\ |\fi| tokens, so the +% correct clauses may be skipped on the second pass. This means that the +% whole |\ifthenelse| command does not work by expansion, and so +% possibly has only limited usefulness for macro code writers. +% The main problem with the |ifthen:| syntax is that (unique for \LaTeX) +% it does not uses a brace delimited argument form, and exposes the +% primitive \TeX\ syntax for \meta{number}. Pretty much the only way of +% parsing |1 > 2 \or 2 < 1| is to actually evaluate the primitive +% |\ifnum|s. A syntax such as:\\% +% |\or{\numtest{1<2}}{\lengthtest{1pt<1in}}|\\ +% could easily be evaluated in a one pass way, operating directly via +% expansion, and leaving no extra tokens in the token stream. +% +% Still, on with the code\ldots\ make |\@tempa| and |\@tempb| tokens +% non-expandable on the first pass. +% \changes{v1.0l}{1996/03/22} +% {Use \cs{begingroup} not \{ for latex/2105} +% \begin{macrocode} + \begingroup + \let\@tempa\relax\let\@tempb\relax + \xdef\@gtempa{\expandafter\TE@eval\the\toks@\TE@endeval}% + \endgroup +% \end{macrocode} +% Now outside the group, execute |\@gtempa| which causes all the +% |\if|s etc., to be evaluated, the final truth value is contained in +% the |\newif| token |\ifTE@val|. Finally this is tested and either the +% first or second following argument is chosen accordingly. +% \changes{v1.0d}{1994/01/24} +% {Use \cs{@firstoftwo} not \cs{@leftmark}.} +% \begin{macrocode} + \@gtempa + \expandafter\endgroup\ifTE@val + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@eval} +% Initialise a term. (Expanded on the first pass). +% \begin{macrocode} +\def\TE@eval{\noexpand\TE@negatefalse\noexpand\iftrue\noexpand\ifnum} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ifTE@val} +% \begin{macro}{\ifTE@negate} +% Two |\newif|s the first holds the current truth value of the +% expression. The second is a temporary flag which is true if we need to +% negate the current proposition. +% \begin{macrocode} +\newif\ifTE@val +\newif\ifTE@negate +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\TE@endeval} +% Finalise a term. (Expanded on the first pass). +% \begin{macrocode} +\def\TE@endeval{\relax + \noexpand\TE@setvaltrue\noexpand + \else + \noexpand\TE@setvalfalse\noexpand + \fi + \noexpand\TE@negatefalse\noexpand + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@setvaltrue} +% \begin{macro}{\TE@setvalfalse} +% Set the |\ifTE@val| to true or false depending on the value of the +% current proposition, and the negate flag. (Not expanded on the first +% pass.) +% \begin{macrocode} +\def\TE@setvaltrue{% + \ifTE@negate\TE@valfalse\else\TE@valtrue\fi} +\def\TE@setvalfalse{\let\ifTE@val\ifTE@negate} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\TE@or} +% The internal version of |\or|. Ends the current term. +% If true skip the remaining terms. +% \begin{macrocode} +\def\TE@or{\TE@endeval\noexpand\ifTE@val\noexpand\else\noexpand\ifnum} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@and} +% The internal version of |\and|. If false skip the remaining terms. +% \begin{macrocode} +\def\TE@and{\TE@endeval\noexpand\ifTE@val\noexpand\ifnum} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@neg} +% \begin{macro}{\TE@negswitch} +% |\not|. Throw the current context, set a negate flag, then restart +% the |\ifnum|. |\TE@negswitch| is not expanded on the first pass. +% \begin{macrocode} +\def\TE@neg{\TE@throw\noexpand\TE@negswitch\noexpand\ifnum} +\def\TE@negswitch{\ifTE@negate\TE@negatefalse\else\TE@negatetrue\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\TE@lparen} +% |\(|. Throw the current context, then restart a term inside a group. +% \begin{macrocode} +\def\TE@lparen#1{\TE@throw\begingroup\TE@eval#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@rparen} +% |\)| end the current term, and the local group started by |\(|, but +% pass on the boolean value in |\if\@val T|. The |\noexpand| stops the +% |\expandafter| from expanding on the first pass. +% \begin{macrocode} +\def\TE@rparen#1{% + \TE@endeval + \noexpand\expandafter\endgroup\noexpand\ifTE@val#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@equal} +% |\equal| greatly simplified from the original. |\def| may be used +% rather than |\edef| as the whole thing is expanded anyway in the +% first pass. The boolean can be directly encoded with the |\ifx|, +% there is no need to start an equivalent |\ifnum|. +% \changes{v1.0h}{1994/05/14}{make long} +% \begin{macrocode} +\long\def\TE@equal#1#2#3{\TE@throw + \def\@tempa{#1}\def\@tempb{#2}% + \noexpand\ifx\@tempa\@tempb#3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setboolean} +% |\setboolean| takes |true| or |false|, as |#2|, and sets |#1| +% accordingly. +% \changes{v1.0i}{1994/05/27}{New style error commands} +% \begin{macrocode} +\def\setboolean#1#2{% + \lowercase{\def\@tempa{#2}}% + \@ifundefined{@tempswa\@tempa}% + {\PackageError{ifthen}% + {You can only set a boolean to `true' or `false'}\@ehc}% + {\@ifundefined{#1\@tempa}% + {\PackageError{ifthen}{Boolean #1 undefined}\@ehc}% + {\csname#1\@tempa\endcsname}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newboolean} +% \changes{v1.0m}{1996/08/02}{Add \cs{@ifdefinable} test for latex/2220} +% Define a new `boolean'. +% \begin{macrocode} +\def\newboolean#1{% + \expandafter\@ifdefinable\csname if#1\endcsname{% + \expandafter\newif\csname if#1\endcsname}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\provideboolean} +% \changes{v1.0m}{1996/08/02}{Macro added for latex/2220} +% Define a new `boolean' if it is not already defined. +% \begin{macrocode} +\def\provideboolean#1{% + \@ifundefined{if#1}{% + \expandafter\newif\csname if#1\endcsname}\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\whiledo} +% |\whiledo| copied directly from the original.\\ +% |\whiledo{|\meta{test}|}{|\meta{body}|}|\\ +% repeatedly evaluates \meta{body} until \meta{test} is true. +% \begin{macrocode} +\long\def\whiledo#1#2{% + \ifthenelse{#1}% + {\@whiledotrue + \@whilesw\if@whiledo\fi + {#2% + \ifthenelse{#1}\@whiledotrue\@whiledofalse}}% + {}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TE@undef} +% \changes{v1.1a}{1999/01/07}{Macro added for /2824} +% test if csname is defined. |\ifx| test. +% \begin{macrocode} +\def\TE@undef#1#2{% + \TE@throw\noexpand\ifx\noexpand\@undefined\noexpand#1#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@whiledo} +% Internal switch for |\whiledo|. +% \begin{macrocode} +\newif\if@whiledo +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ifthen.ins b/Master/texmf-dist/source/latex-dev/base/ifthen.ins new file mode 100644 index 00000000000..6b3008e1799 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ifthen.ins @@ -0,0 +1,86 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generateFile{ifthen.sty}{t}{\from{ifthen.dtx}{package}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/inputenc.dtx b/Master/texmf-dist/source/latex-dev/base/inputenc.dtx new file mode 100644 index 00000000000..93f64577e20 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/inputenc.dtx @@ -0,0 +1,3053 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage[ascii]{inputenc} +\GetFileInfo{inputenc.sty} +\title{\filename} +\date{\fileversion\space\filedate} + \author{% + Alan Jeffrey\and + Frank Mittelbach} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \setlength\hfuzz{20pt} + \DocInput{inputenc.dtx} +\end{document} +%</driver> +% \fi +% +% +% +% \changes{v0.01}{1994/03/09}{Created file.} +% \changes{v0.02}{1994/07/14}{Replaced \cs{Dh} by \cs{DH} and \cs{Th} +% by \cs{TH}.} +% \changes{v0.02}{1994/07/14}{Added \cs{ensuremath} to some math +% commands.} +% \changes{v0.02}{1994/07/14}{Added \cs{inputencoding}.} +% \changes{v0.03}{1994/09/04}{Added \cs{DeclareInputComposite} and the +% \cs{ProvidesCommand}s to the encoding files.} +% \changes{v0.03}{1994/09/04}{Removed the definition of the accent slots +% in Latin-1.} +% \changes{v0.04}{1994/10/20}{Replaced \cs{DeclareInputCharacter} by +% \cs{DeclareInputText} and \cs{DeclareInputMath}.} +% \changes{v0.04}{1994/10/20}{Removed \cs{DeclareInputComposite}.} +% \changes{v0.04}{1994/10/20}{Made many Latin-1 characters math-only.} +% \changes{v0.05}{1994/10/27}{Updated for the new version of ltoutenc.} +% \changes{v0.06}{1994/11/21}{Added \cs{textregistered}.} +% \changes{v0.06}{1994/11/21}{Added slot hex A0 to Latin-1.} +% \changes{v0.07}{1994/11/22}{Fixed typo A1 rather than A0.} +% \changes{v0.07}{1994/11/28}{Fixed where docstrip option had moved a +% line.} +% \changes{v0.09}{1994/12/10}{Added `beta test' message.} +% \changes{v0.09}{1994/12/10}{Made letters active and undefined by +% default, rather than illegal.} +% +% \changes{v0.9b}{1995/05/23}{Added Mac encoding, applemac.def} +% \changes{v0.9d}{1995/06/06}{Added cp437} +% \changes{v0.9f}{1995/09/21}{Added Next encoding, next.def} +% \changes{v0.9h}{1995/10/22}{Added Windows 3.1 ANSI encoding, +% ansinew.def} +% \changes{v0.9i}{1995/11/02}{Wrapped long lines} +% \changes{v0.9i}{1995/11/02}{Changed internal name \cs{a} to +% \cs{@tabacckludge} to protect against redefinition by malicious +% users.} +% \changes{v0.9j}{1995/11/14}{Remove \cs{endinput} so docstrip reaches +% ansinew encoding} +% \changes{v0.9k}{1995/11/29}{Replaced uses of \cs{textsterling} with +% \cs{pounds}.} +% \changes{v0.9m}{1995/12/04}{Added German version} +% \changes{v0.9m}{1995/12/04}{Replaced \cs{textasciitilde} by +% \cs{nobreakspace}.} +% \changes{v0.9m}{1995/12/04}{Made bullet and periodcentered text +% glyphs rather than math glyphs.} +% \changes{v0.9m}{1995/12/04}{Added \cs{@tabacckludge} hacks.} +% \changes{v0.9o}{1996/02/14} +% {Cedilla (\cs{c}\cs{ }) rather than (\cs{c}\{\}) latex/2077, +% finished on 1996/10/28} +% \changes{v0.9o}{1996/02/14} +% {0F0 corrected in cp850 latex/2080} +% \changes{v0.9o}{1996/02/14} +% {0B2 corrected in latin2 latex/2079} +% \changes{v0.9r}{1996/05/10}{Added cp852.def} +% \changes{v0.9t}{1996/10/28}{Added cp865.def} +% \changes{v0.9t}{1996/10/28} +% {Changed \cs{aa} and \cs{AA} to \cs{r} a and \cs{r} A} +% \changes{v0.9u}{1996/10/29}{Added more to cp865.def} +% \changes{v0.9y}{1997/04/30}{Added latin5.def (provided by +% H. Turgut Uyar: uyar@cs.itu.edu.tr)} +% \changes{v0.9z}{1997/05/10}{Added latin3.def (provided by +% J\"org Knappen and modified by Chris Rowley)} +% \changes{v0.91}{1997/08/19}{Put +% \cs{makeatletter}\ldots\cs{makeatother} around all .def files.} +% \changes{v0.92}{1997/09/08}{Added decmulti.def +% provided by M.Y. Chartoire. pr/2599} +% \changes{v0.93}{1997/11/23}{\cs{textperthousand} not +% \cs{textpermill}. pr/2673} +% \changes{v0.94}{1997/12/17}{Made degree a text glyph} +% \changes{v0.94}{1997/12/17}{Added to and tidied documentation} +% \changes{v0.94}{1997/12/17}{Ogonek: changed +% \cs{k}\{\} to \cs{k}\cs{ }} +% \changes{v0.94}{1997/12/17}{NOTE: for consistency, when available +% the robust text-or-math internal form is always used -- +% THIS MAY CHANGE} +% \changes{v0.95}{1997/12/20}{Updated documentation} +% \changes{v0.97}{1998/03/05}{Spanish ords changed to text chars, pr/2579} +% \changes{v1.1b}{2006/03/04}{Number of normalisations in the LICR +% representation (pr/3849)} +% \changes{v1.1c}{2006/11/18}{Added missing \cs{ProvidesFile} line for cp1257 (pr/3892)} +% +% +% \section{Introduction} +% +% This package allows the user to specify an input encoding (for +% example, ASCII, ISO Latin-1 or Macintosh) by saying: +% \begin{quote} +% |\usepackage[|\emph{encoding name}|]{inputenc}| +% \end{quote} +% The encoding can also be selected in the document with: +% \begin{quote} +% |\inputencoding{|\emph{encoding name}|}| +% \end{quote} +% Originally this command was only to be used in vertical mode (with +% the idea that it should be only within a document when +% using text from several documents to build up a composite work such +% as a volume of journal articles. However, usages in certain +% languages suggested that it might be preferable to allow changing +% the input encoding at any time, which is what is possible now +% (though that is quite computing resource intensive). +% +% The encodings provided by this package are: +% \begin{itemize} +% \item |ascii| ASCII encoding for the range 32--127 (all others are made +% invalid, i.e., this really defines a 7-bit encoding). +% \item |latin1| ISO Latin-1 encoding. +% \item |latin2| ISO Latin-2 encoding. +% \item |latin3| ISO Latin-3 encoding. +% \item |latin4| ISO Latin-4 encoding. +% \item |latin5| ISO Latin-5 encoding. +% \item |latin9| ISO Latin-9 encoding. +% \item |latin10| ISO Latin-10 encoding. +% \item |decmulti| DEC Multinational Character Set encoding. +% \item |cp850| IBM 850 code page. +% \item |cp852| IBM 852 code page. +% \item |cp858| IBM 858 code page (this is 850 with Euro symbol). +% \item |cp437| IBM 437 code page. +% \item |cp437de| IBM 437 code page (German version). +% \item |cp865| IBM 865 code page. +% \item |applemac| Macintosh encoding. +% \item |macce| Macintosh Central European code page. +% \item |next| Next encoding. +% \item |cp1250| Windows 1250 (central and eastern Europe) code page. +% \item |cp1252| Windows 1252 (Western Europe) code page. +% \item |cp1257| Windows 1257 (Baltic) code page. +% \item |ansinew| Windows 3.1 ANSI encoding, extension of Latin-1 +% (synonym\footnote{It is now generated using the guards +% \texttt{cp1252,ansinew} the latter only used for the provides +% file line.} for |cp1252|). +% \item |utf8| Unicode UTF-8 encoding support. +% \end{itemize} +% +% +% +% \subsection{8-bit input encoding support} +% +% The \texttt{inputenc} package makes the upper 8-bit characters active and +% assigns to all of them an error message. It then waits for the +% input encoding definitions to change this set-up. Similarly, whenever +% |\inputencoding| is encountered in a document, first the upper +% 8-bit characters are set back to produce an error and then the +% definitions for the new input encoding are loaded, changing some of the +% previous settings. +% +% +% +% Each encoding has an associated |.def| file, for example +% |latin1.def| which defines the behaviour of each input character, +% using the commands: +% \begin{quote} +% |\DeclareInputText{|\emph{slot}|}{|\emph{text}|}| \\ +% |\DeclareInputMath{|\emph{slot}|}{|\emph{math}|}| +% \end{quote} +% This defines the input character \emph{slot} to be the +% \emph{text} material or \emph{math} material respectively. +% For example, |latin1.def| defines slots |"D6| (\AE) +% and |"B5| ($\mu$) by saying: +%\begin{verbatim} +% \DeclareInputText{214}{\AE} +% \DeclareInputMath{181}{\mu} +%\end{verbatim} +% Note that the \emph{commands} should be robust, and should not be +% dependent on the output encoding. The same \emph{slot} should not +% have both a text and a math declaration for it. (This restriction +% may be removed in future releases of inputenc). +% +% The |.def| file may also define +% commands using the declarations:\\ +% |\providecommand| or |\ProvideTextCommandDefault|. +% For example: +%\begin{verbatim} +% \ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} +% \DeclareInputText{188}{\textonequarter} +%\end{verbatim} +% The use of the `provide' forms here will ensure that a +% better definition will not be over-written; their use is +% recommended since, in general, the best definition depends on the +% fonts available. +% +% See the documentation in |fntguide.tex| and |ltoutenc.dtx| for +% details of how to declare text commands. +% +% +% \subsection{UTF-8 encoding support} +% +% +% The Unicode UTF-8 support works differently. It too uses a |.def| file +% (i.e., |utf8.def|) but this file does not contain code point declarations +% via the commands |\DeclareInputText| or |\DeclareInputMath|. +% Instead it defines a number of +% parsing commands that parse UTF-8 characters and then provides the +% corresponding \LaTeX{} definitions (if possible). +% +% Unfortunately the number of Unicode characters that in theory could be +% contained in a document is enormous. Thus even with today's amount of +% computer memory it would be unrealistic to predefine all of them. Therefore the +% approach taken by \LaTeX{} is as follows: +% \begin{itemize} +% \item +% At the start of the document (|\begin{document}|) it examines all font +% encodings that are being used within the current document. +% \item +% For each such font encoding it loads all known UTF-8 mappings that generate +% characters from this font encoding. +% \item +% All other UTF-8 characters remain undefined and will produce an error +% message if they appear in the document. +% \end{itemize} +% +% The rationale behind this approach is that UTF-8 characters that do not +% correspond to any glyph within the used font encodings cannot be represented +% by \LaTeX{} anyway (without loading a font containing the glyph, which in +% turn should ``hopefully'' set up the corresponding UTF-8 mapping). +% +% This works well enough for the main Western languages for which \LaTeX{} +% has proper font encoding support, but currently already falls short on +% languages like Greek (which has some semi-official font support, but for +% which corresponding UTF-8 mappings still need to be defined). +% +% For some languages (such as Greek mentioned above) all that remains doing is +% to provide the necessary mappings and stick them into |utf8ienc.dtx|, so +% volunteers are welcome. For other languages that do not fit well into +% \LaTeX{} font selection scheme, e.g., Asian languages the outlined inputenc +% approach will not work. If that is the case one can try using Dominique +% Unruh's option |utf8x| for inputenc which has a somewhat different approach +% and encodes many more UTF-8 characters than the standard |utf8| option. +% However, we recommend to do so only if you really need such alphabets as +% there are problems with this extended approach which were precisely the +% reason that we decided to limit the support to what is properly supported +% within the boundaries of \LaTeX's font selection. +% +% If a UTF-8 mapping is missing and it is known to what \LaTeX{} definition it +% should map to, one can manually define it using a |\DeclareUnicodeCharacter| +% declaration. This declaration is available after inputenc has been loaded +% with the |utf8| option. +% +% The |\DeclareUnicodeCharacter| takes UTF-8 code point as its first argument +% (in form of a a hexadecimal number) and the definition that this maps to as +% its second argument. For example, the code point |00E4| which is +% ``LATIN SMALL LETTER A WITH DIAERESIS'' would be set up via: +%\begin{verbatim} +% \DeclareUnicodeCharacter{00E4}{\"a} +%\end{verbatim} +% Conceptually the second argument should only contain ``encoding-specific +% commands'' as defined by \LaTeX{} font encoding concept, i.e., commands that +% automatically change behavior if the font encoding changes (see chapter~7 of +% the \LaTeX{} Companion for details). +% +% For details of the mappings per font encoding and some more technical +% information see the file \texttt{utf8ienc.dtx} that provides UTF-8 support +% using the \textsf{inputenc} package interface. +% +% +% +% +% \subsection{Error messages} +% +% In certain situations the inputenc package generates one of the following +% three error messages. +% +% \subsubsection{\normalfont\ttfamily Keyboard character used is undefined in +% inputencoding `\meta{name}'} +% +% The document contains an 8-bit character that is not defined by the +% current input encoding in force. This means that either there is a +% mismatch between the document encoding that the document claims it +% is in (the option to inputenc) and the real encoding this document +% is encoded in. These days more often you find that UTF-8 is used as +% the encoding when saving a file in some text editor. +% +% Of course, it is also possible that the input encoding |.def| file is +% defective and the offending code point is simply missing from that file. +% Please check if the encoding file is one of the list above prior to +% reporting an error---on the net there are many additional encoding files +% supported by third parties. +% +% +% +% \subsubsection{\normalfont\ttfamily Cannot define Unicode char value < 00A0} +% +% This error message is shown if one tries to define a UTF-8 character +% with a code point lower than |00A0|. Those cannot be defined in +% \LaTeX{} through the |\DeclareUnicodeCharacter|. +% +% +% \subsubsection{\normalfont\ttfamily Unicode char \meta{charcode} not set up +% for use with LaTeX} +% +% This is the dreaded error message that one will receive if the +% document contains an UTF-8 character that isn't known to \LaTeX{}. +% It is quite possible that the character looks very unsuspicious and +% is rendered perfectly in the editor. +% +% For example, when entering a Euro symbol from the keyboard one may receive +% this error rather than a typeset symbol. But if this happens the reason is +% simply that the document doesn't load a font containing the Euro symbol, +% e.g., via the |textcomp| package. Thus \LaTeX{} does not know how to typeset +% one and therefore responds with this error message. +% +% However, even if \LaTeX{} can type that character in question it may not +% have been set up in which case you would need to do that yourself via +% |\DeclareUnicodeCharacter|. If you provide these declarations for a full +% font encoding then please contribute that work to this package so that +% others can benefit too. +% +% +% +% + +% \subsection{Programmers interface} +% +% To better support packages that manage their own character mappings and +% therefore have to react to input encoding changes, the following three +% commands have been added in version 1.1a: +% +% \DescribeMacro\inputencodingname This command stores the name of the current +% input encoding. +% +% \DescribeMacro\inpenc@prehook +% \DescribeMacro\inpenc@posthook These two are token registers that are +% executed whenever an |\inputencoding| change happens. The first is executed at +% the very beginning, i.e., with |\inputencodingname| still pointing to the +% encoding name currently in place while the second one is executed at the very +% end, i.e., when |\inputencoding| has build a new mapping. +% +% Packages making use of this new features should consider including the +% following line +%\begin{verbatim} +% \NeedsTeXFormat{LaTeX2e}[2005/12/01] +%\end{verbatim} +% as these commands haven't been available in \textsf{inputenc} distributed +% with older releases of \LaTeX{}. +% + +% \StopEventually{} +% +% \section{Announcing the files} +% +% We announce the files: +% \begin{macrocode} +%<package>\NeedsTeXFormat{LaTeX2e}[1995/12/01] +%<package>\ProvidesPackage{inputenc} +%<ascii> \ProvidesFile{ascii.def} +%<latin1> \ProvidesFile{latin1.def} +%<latin2> \ProvidesFile{latin2.def} +%<latin3> \ProvidesFile{latin3.def} +%<latin4> \ProvidesFile{latin4.def} +%<latin5> \ProvidesFile{latin5.def} +%<latin9> \ProvidesFile{latin9.def} +%<latin10> \ProvidesFile{latin10.def} +%<decmulti> \ProvidesFile{decmulti.def} +%<cp850> \ProvidesFile{cp850.def} +%<cp852> \ProvidesFile{cp852.def} +%<cp858> \ProvidesFile{cp858.def} +%<cp437> \ProvidesFile{cp437.def} +%<cp437de> \ProvidesFile{cp437de.def} +%<cp865> \ProvidesFile{cp865.def} +%<applemac> \ProvidesFile{applemac.def} +%<applemacce> \ProvidesFile{macce.def} +%<next> \ProvidesFile{next.def} +%<ansinew> \ProvidesFile{ansinew.def} +%<cp1252&!ansinew> \ProvidesFile{cp1252.def} +%<cp1250> \ProvidesFile{cp1250.def} +%<cp1257> \ProvidesFile{cp1257.def} + [2018/08/11 v1.3c Input encoding file] +%<cp850>%% +%<cp850>%% If you need a Euro symbol, try cp858 instead. +%<cp850>%% +% \end{macrocode} +% +% \section{The package} +% +% \changes{v0.99c}{2002/11/11}{Added cp858 (pr/3464)} +% +% \changes{v0.04}{1994/10/20}{Improved coding of \cs{DeclareInputText} +% and changed name from \cs{DeclareInputCharacter}.} +% +% \changes{v0.9g}{1995/10/19}{Replaced \cs{'} \cs{`} \cs{!=} by +% \cs{a'} \cs{a`} \cs{a!=} in order to get correct accents in +% a tabbing environment.} +% +% \changes{v0.9w}{1996/11/23}{Correct documentation +% of \cs{@tabacckludge}} +% +% \changes{v0.9x}{1997/03/21}{Use decimal rather than hex +% to avoid active character problems. latex/2451.} +% +% Before we start with the code, an important comment is in order: +% as you may or may not know, the |tabbing| environment changes the +% definition of the commands |\'|, |\`|, and |\=|. Outside such an +% environment these commands produce the corresponding accents, inside +% they are used for special text positioning, and the accents can be +% accessed using |\a'|, |\a`|, and |\a=|. Therefore we \emph{must} use +% the latter instead of the former in the second argument to +% |\DeclareInputText|, e.g. (from |latin1.def|): +% \begin{verbatim} +% \DeclareInputText{224}{\@tabacckludge`a} +%\end{verbatim} +% The command |\@tabacckludge| is defined (in |ltoutenc.dtx|) in such +% a way that |\@tabacckludge'| will expand to the internal form of |\'|. +% Thus it is |\'| that is carried around \emph{internally} (the +% same applies to the other two accent commands). +% +% \begin{macro}{\DeclareInputText} +% \begin{macro}{\DeclareInputMath} +% \begin{macro}{\IeC} +% These commands declare the expansion of an active character. The +% math declaration is the usual trick with |\uppercase|. +% The text declaration is sneakier, since in text space matters. +% We look to see if the definition ends in a macro, by checking +% whether it's |\meaning| ends in a space. If it does, then we +% add an irrelevant |\IeC| and braces around the definition, in +% order to avoid any space after the active char being gobbled up +% once the text is written out to an auxiliary file. +% +% The definition should contain only robust commands (and, for +% correct ligatures and kerning, they must be defined via the +% interfaces in the fontenc package). +% +% \changes{v0.9b}{1995/05/23}{Added hackery with \cs{IeC} in order to +% avoid space being gobbled.} +% +% \begin{macrocode} +%<*package> +\def\DeclareInputMath#1{% + \@inpenc@test + \bgroup + \uccode`\~#1% + \uppercase{% + \egroup + \def~% + }% +} +% \end{macrocode} +% \changes{v1.0a}{2003/01/17}{Now coding according to suggestion by David (pr/2004)} +% \changes{v1.0b}{2003/12/29}{but better do it properly} +% \changes{v1.0?}{2004/01/19}{or even correctly} +% \begin{macrocode} +\def\DeclareInputText#1#2{% + \def\reserved@a##1 ${}% + \def\reserved@b{#2}% + \ifcat_\expandafter\reserved@a\meaning\reserved@b$ $_% + \DeclareInputMath{#1}{#2}% + \else + \DeclareInputMath{#1}{\IeC{#2}}% + \fi +} +% \end{macrocode} +% The definition of |\IeC| was modified not to insert a |\protect| +% unless it is needed, this means it works in |\hyphenation| +% commands, and other such delicate places. It was then further +% changed to never insert a |\protect| as one is never needed; this +% makes it work in even more places. +% +% This still needs some attention. +% +% \changes{v0.9m}{1995/12/12}{Modified \cs{IeC} in order to +% work in \cs{hyphenation} latex/2004.} +% +% \changes{v0.94}{1997/12/17}{Changed non-typeset case from +% \cs{protect} to \cs{noexpand}: temporary fix.} +% +% \begin{macrocode} +\def\IeC{% + \ifx\protect\@typeset@protect + \expandafter\@firstofone + \else + \noexpand\IeC + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\inputencoding} +% \changes{v0.9q}{1996/05/09} +% {Allow characters below 32 for latex/2071} +% \changes{v0.9q}{1996/05/09} +% {Check the def file was reasonable for latex/2136} +% \changes{v0.94}{1997/12/17}{Changed to work only in outer vmode, see +% latex/2608} +% \changes{v0.94}{1997/12/17}{Warning message reworded and line +% number added, also for latex/2608} +% \changes{v0.95}{1997/12/20}{Changed to work in any vmode, for David} +% \changes{v1.2a}{2014/04/20}{Added alternative definition for xe/lua tex (pr/4024)}% +% \changes{v1.2b}{2014/04/30}{Allow (x-)ascii and utf8x aliases for utf8 in xetex/luatex}% +% \changes{v1.3a}{2018/03/24}{Make \cs{inputencoding} do nothing if +% the argument matches current encoding}% +% This sets the encoding to be |#1|. It first sets all the +% characters 128--255 to be active (and sets their initial +% definition to be |\@inpenc@undefined|). +% It now also does this for some `low' codes below 32, but +% misses out Null, control-I, control-J, control-L and control-M. +% +% It then inputs |#1.def|. But it first sets up a test that +% produces a warning message if no suitable definitions get read. +% +% \begin{macrocode} +\ifx\Umathchar\@undefined +% \end{macrocode} +% +% \begin{macrocode} +\def\inputencoding#1{% + \edef\reserved@a{#1}% + \ifx\reserved@a\inputencodingname + \else +% \end{macrocode} +% We start with a hook to be executed before the encoding change +% happens. +% \changes{v1.1a}{2006/02/22}{Added \cs{inpenc@prehook}} +% \begin{macrocode} + \the\inpenc@prehook + \gdef\@inpenc@test{\global\let\@inpenc@test\relax}% +% \end{macrocode} +% Keyboard characters which don't get a definition will be mapped to +% the command +% |\@inpenc@undefined| which gets a definition producing an error +% message indicating in which input encoding the current keyboard +% character is undefined: +% \changes{v0.98}{1998/07/04}{Give better error message if key used +% is undefined (pr/2845)} +% \changes{v0.993}{2000/01/24}{Fix error message for undefined chars +% (pr/3158)} +% \changes{v1.2a}{2014/04/20}{add \cs{protect} so undefined characters are robust (pr/4182)}% +% \begin{macrocode} + \edef\@inpenc@undefined{\noexpand\protect\noexpand\@inpenc@undefined@{#1}}% +% \end{macrocode} +% The |\edef| in the above definition is essential as |#1| may be +% |\CurrentOption| in which case a later use would return incorrect +% information (at best nothing). +% +% For external lookup by other packages we also store the new encoding name +% in a user accessible macro. +% \changes{v1.1a}{2006/02/22}{Added \cs{inputencodingname}} +% \begin{macrocode} + \edef\inputencodingname{#1}% +% \end{macrocode} +% +% Now we make all potential input characters active. +% \changes{v0.994}{2000/01/27}{Allow change also in horizontal mode +% (pr/2888)} +% \begin{macrocode} + \@inpenc@loop\^^A\^^H% + \@inpenc@loop\^^K\^^K% + \@inpenc@loop\^^N\^^_% + \@inpenc@loop\^^?\^^ff% +% \end{macrocode} +% +% To be able to process the input encoding file in horizontal mode +% we need to ensure that we don't get any stray spaces into the +% horizontal mode or else we end up with extra space in the +% paragraph. +% \changes{v0.998}{2001/05/25}{Suppress all spaces for horizontal mode +% (pr/3273)} +% \changes{v1.0f}{2004/05/06}{Really do (pr/3273)} +% \changes{v1.1d}{2007/08/06}{Set \cs{endlinechar} properly (pr/3926)} +% \changes{v1.1e}{2012/06/06}{Save and restore \cs{catcode} of @ (pr/4192)} +% \changes{v1.2c}{2015/03/17}{Save and restore \cs{catcode} of percent (pr/4420)} +% \begin{macrocode} + \xdef\saved@endlinechar@code{\the\endlinechar}% + \endlinechar\m@ne + \xdef\saved@space@catcode{\the\catcode`\ }% + \catcode`\ 9\relax + \xdef\saved@at@catcode{\the\catcode`\@}% + \makeatletter + \xdef\saved@percent@catcode{\the\catcode`\%}% + \catcode`\%14\relax + \input{#1.def}% + \endlinechar\saved@endlinechar@code\relax + \catcode`\ \saved@space@catcode\relax + \catcode`\@\saved@at@catcode\relax + \catcode`\%\saved@percent@catcode\relax +% \end{macrocode} +% +% If there have been no |\DeclareInputText| or |\DeclareInputMath| +% commands read then something is amiss. +% \begin{macrocode} + \ifx\@inpenc@test\relax\else + \PackageWarning{inputenc}% + {No characters defined\MessageBreak + by input encoding change to `#1'\MessageBreak}% + \fi +% \end{macrocode} +% We finish with a hook to be executed after the encoding change +% happens. +% \changes{v1.1a}{2006/02/22}{Added \cs{inpenc@posthook}} +% \begin{macrocode} + \the\inpenc@posthook +% \end{macrocode} +% +% \begin{macrocode} + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% Unicode based TeX engines do not require this package at all, and always use UTF-8 +% input. Allow the package to be used if |[utf8]| or |[ascii]| options are used to simplify +% switching between TeX engines. +% \begin{macrocode} +\def\inputencoding#1{% +\edef\reserved@a{#1}% +\def\reserved@b{utf8x}% +\ifx\reserved@a\reserved@b\def\reserved@a{utf8}\fi +\def\reserved@b{utf8}% +\ifx\reserved@a\reserved@b +\PackageWarningNoLine + {inputenc}% + {inputenc package ignored with utf8 based engines}% +\else +\def\reserved@b{x-ascii}% +\ifx\reserved@a\reserved@b\def\reserved@a{ascii}\fi +\def\reserved@b{ascii}% +\ifx\reserved@a\reserved@b +\PackageWarningNoLine + {inputenc}% + {inputenc can't be used to ensure 7bit clean source\MessageBreak + with a utf engine: Package ignored: utf8 assumed}% +\else +\PackageError + {inputenc}% + {inputenc is not designed for xetex or luatex.\MessageBreak + only UTF-8 supported}% + {For xelatex or lualatex save the document in UTF-8 encoding\MessageBreak + and do not use inputenc, or use the [utf8] option.} +\fi +\fi +} +\fi +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\inpenc@prehook} +% \changes{v1.1a}{2006/02/22}{Hook added} +% \begin{macro}{\inpenc@posthook} +% \changes{v1.1a}{2006/02/22}{Hook added} +% Two hooks to be executed before and after an encoding changes happened. +% \begin{macrocode} +\ifx\inpenc@prehook\@undefined\newtoks\inpenc@prehook\fi +\ifx\inpenc@posthook\@undefined\newtoks\inpenc@posthook\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@inpenc@undefined@} +% This command will assigned to any active character unless it +% get a proper definition by the encoding. The argument is the +% current encoding name. +% \changes{v0.993}{2000/01/24}{Fix error message for undefined chars +% (pr/3158)} +% \begin{macrocode} +\def\@inpenc@undefined@#1{\PackageError{inputenc}% + {Keyboard character used is undefined\MessageBreak + in inputencoding `#1'}% + {You need to provide a definition with + \noexpand\DeclareInputText\MessageBreak or + \noexpand\DeclareInputMath before using this key.}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@inpenc@loop} +% \changes{v0.9q}{1996/05/09} +% {Macro added} +% \changes{v0.9v}{1996/11/07} +% {Exit from the top of loop fixed for latex/2257} +% Make characters |#1| to |#2| inclusive active and undefined. +% \begin{macrocode} +\def\@inpenc@loop#1#2{% + \@tempcnta`#1\relax + \loop + \catcode\@tempcnta\active + \bgroup + \uccode`\~\@tempcnta + \uppercase{% + \egroup + \let~\@inpenc@undefined + }% + \ifnum\@tempcnta<`#2\relax + \advance\@tempcnta\@ne + \repeat} +% \end{macrocode} +% \end{macro} +% +% +% Then for each option, we input that encoding file. +% Only exception: for utf8x (from \texttt{ucs} package) we +% first restore the raw input encoding. That should be moved to the +% \texttt{utf8x.def} file, eventually. +% In case of a rollback |\UseRawInputEncoding| is not defined so we +% only input the encoding. +% \changes{v1.3b}{2018/04/06}{Handle utf8x encoding manually for now} +% \begin{macrocode} +\DeclareOption{utf8x}{\ifdefined\UseRawInputEncoding + \UseRawInputEncoding + \fi + \inputencoding{\CurrentOption}} +\DeclareOption*{\inputencoding{\CurrentOption}} +\ProcessOptions +%</package> +% \end{macrocode} +% +% +% \section{Default definitions for characters} +% +% Some input characters map to internal functions which are not in +% either the |T1| or |OT1| font encoding. For this reason default +% definitions are provided in the encoding file: these will be +% used unless some other output encoding is used which supports +% those glyphs. In some cases this default definition has to be +% simply an error message. +% +% Note that this works reasonably well only because the encoding +% files for both |OT1| and |T1| are loaded in the standard LaTeX +% format. +% +% \changes{v0.9a}{1995/04/23}{Default settings moved to own section} +% +% \changes{v0.9b}{1995/05/23}{Corrected ordmasc and ordfem which had +% been switched by mistake.} +% +% \changes{v0.9k}{1995/11/29}{Moved \cs{textregistered} and +% \cs{texttrademark} to the kernel.} +% \changes{v0.9k}{1995/11/29}{Added default commands for Next input +% encoding.} +% +% \changes{v0.9m}{1995/12/04}{Added \cs{ensuremath} to definitions of +% the fraction glyphs.} +% +% \changes{v0.9t}{1996/10/28} +% {Added \cs{textblacksquare}} +% \changes{v0.9u}{1996/10/29} +% {Corrected code for \cs{textblacksquare}} +% +% \changes{v0.9u}{1996/10/29} +% {Added cp865 and corrected cp850, cp852 and cp437 guards} +% \changes{v0.94}{1997/12/17}{Removed entries that were solely in +% next.def} +% \changes{v0.995}{2000/05/22}{Added latin2 option for textdegree +% (pr/3207) CAR} +% +% \changes{v1.3c}{2018/08/11}{Use \cs{guillemetleft} and \cs{guillemetright} +% instead of old Adobe names in all encoding files} +% +% The name |\textblacksquare| is derived from the AMS symbol name since +% Adobe seem not to want this symbol. The default definition, as a +% rule, makes no claim to being a good design. +% +% Some entries are repeated in case guards must all be on one line. +% \begin{macrocode} +%<*latin1|decmulti|latin2|latin3|latin4|latin5|latin9|applemacce|latin10> +\ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} +%</latin1|decmulti|latin2|latin3|latin4|latin5|latin9|applemacce|latin10> +%<*cp850|cp858|cp852|cp865|cp437|cp437de|applemac|cp1252|cp1250|cp1257|next> +\ProvideTextCommandDefault{\textdegree}{\ensuremath{{^\circ}}} +%</cp850|cp858|cp852|cp865|cp437|cp437de|applemac|cp1252|cp1250|cp1257|next> +%<*latin1|decmulti|latin3|latin5|cp850|cp858|cp852|cp1252|cp1257|next> +\ProvideTextCommandDefault{\textonehalf}{\ensuremath{\frac12}} +%</latin1|decmulti|latin3|latin5|cp850|cp858|cp852|cp1252|cp1257|next> +%<*latin1|decmulti|latin5|cp850|cp858|cp852|cp1252|cp1257|next> +\ProvideTextCommandDefault{\textonequarter}{\ensuremath{\frac14}} +%</latin1|decmulti|latin5|cp850|cp858|cp852|cp1252|cp1257|next> +%<*latin1|latin5|cp850|cp858|cp852|cp1252|cp1257|next> +\ProvideTextCommandDefault{\textthreequarters}{\ensuremath{\frac34}} +%</latin1|latin5|cp850|cp858|cp852|cp1252|cp1257|next> +%<*applemac|cp850|cp858|cp865|cp437|cp437de|cp1252|next> +\ProvideTextCommandDefault{\textflorin}{\textit{f}} +%</applemac|cp850|cp858|cp865|cp437|cp437de|cp1252|next> +%<*cp865|cp437|cp437de> +\ProvideTextCommandDefault{\textpeseta}{Pt} +%</cp865|cp437|cp437de> +%<*cp850|cp858|cp852|cp865|cp437|cp437de> +\ProvideTextCommandDefault{\textblacksquare} +{\vrule \@width .3em \@height .4em \@depth -.1em\relax} +%</cp850|cp858|cp852|cp865|cp437|cp437de> +% \end{macrocode} +% +% \changes{v0.9k}{1995/11/29}{Added error messages for unavailable +% characters.} +% +% Some commands can't be faked, so we have them generate an error +% message. +% \begin{macrocode} +%<*latin1|decmulti|latin5|latin9|cp850|cp858|cp865|cp437|cp437de> +\ProvideTextCommandDefault{\textcent} + {\TextSymbolUnavailable\textcent} +\ProvideTextCommandDefault{\textyen} + {\TextSymbolUnavailable\textyen} +%</latin1|decmulti|latin5|latin9|cp850|cp858|cp865|cp437|cp437de> +%<*applemac|cp1252|next> +\ProvideTextCommandDefault{\textcent} + {\TextSymbolUnavailable\textcent} +\ProvideTextCommandDefault{\textyen} + {\TextSymbolUnavailable\textyen} +%</applemac|cp1252|next> +%<*cp1257> +\ProvideTextCommandDefault{\textcent} + {\TextSymbolUnavailable\textcent} +%</cp1257> +%<*latin9|cp1252|cp1257|latin10> +\ProvideTextCommandDefault{\texteuro} + {\TextSymbolUnavailable\texteuro} +%</latin9|cp1252|cp1257|latin10> +%<*latin1|decmulti|latin2|latin3|latin4|latin5|cp850|cp858|cp852|cp865> +\ProvideTextCommandDefault{\textcurrency} + {\TextSymbolUnavailable\textcurrency} +%</latin1|decmulti|latin2|latin3|latin4|latin5|cp850|cp858|cp852|cp865> +%<*applemac|cp1252|cp1250|cp1257|next> +\ProvideTextCommandDefault{\textcurrency} + {\TextSymbolUnavailable\textcurrency} +%</applemac|cp1252|cp1250|cp1257|next> +%<*latin1|latin5|cp850|cp858|cp852|cp1252|cp1250|cp1257> +\ProvideTextCommandDefault{\textbrokenbar} + {\TextSymbolUnavailable\textbrokenbar} +%</latin1|latin5|cp850|cp858|cp852|cp1252|cp1250|cp1257> +%<*latin3> +\ProvideTextCommandDefault{\textmalteseH} + {\TextSymbolUnavailable\textmalteseH} +\ProvideTextCommandDefault{\textmalteseh} + {\TextSymbolUnavailable\textmalteseh} +%</latin3> +%<*latin4> +\ProvideTextCommandDefault{\textkra} + {\TextSymbolUnavailable\textkra} +\ProvideTextCommandDefault{\textTstroke} + {\TextSymbolUnavailable\textTstroke} +\ProvideTextCommandDefault{\texttstroke} + {\TextSymbolUnavailable\texttstroke} +%</latin4> +%<*cp1250|cp1252|cp1257|applemac|next> +\ProvideTextCommandDefault{\textperthousand} + {\TextSymbolUnavailable\textperthousand} +%</cp1250|cp1252|cp1257|applemac|next> +%<*applemacce> +\ProvideTextCommandDefault{\textdiv} + {\TextSymbolUnavailable\textdiv} +%</applemacce> +% \end{macrocode} +% +% \changes{v0.9l}{1995/12/01}{Removed extraneous braces from the +% `superior' glyphs.} +% \changes{v0.97}{1998/03/05}{Removed ords: +% changed to text chars, pr/2579} +% +% Characters that are supposed to be used only in math will be defined +% by |\providecommand| because \LaTeXe{} assumes that the font +% encoding for math fonts is static. +% +% \begin{macrocode} +%<*latin1|decmulti|latin5|latin9|cp850|cp858|cp1252|cp1257|next> +\providecommand{\mathonesuperior}{{^1}} +%</latin1|decmulti|latin5|latin9|cp850|cp858|cp1252|cp1257|next> +%<*latin1|decmulti|latin3|latin5|latin9|cp850|cp858|cp1252|cp1257|next> +\providecommand{\maththreesuperior}{{^3}} +%</latin1|decmulti|latin3|latin5|latin9|cp850|cp858|cp1252|cp1257|next> +%<*latin1|decmulti|latin3|latin5|latin9|cp850|cp858|cp865|cp437|cp437de> +\providecommand{\mathtwosuperior}{{^2}} +%</latin1|decmulti|latin3|latin5|latin9|cp850|cp858|cp865|cp437|cp437de> +%<*cp1252|cp1257|next> +\providecommand{\mathtwosuperior}{{^2}} +%</cp1252|cp1257|next> +%<*cp865|cp437|cp437de> +\providecommand{\mathnsuperior}{{^n}} +%</cp865|cp437|cp437de> +% \end{macrocode} +% +% \section{The ASCII encoding} +% +% The ASCII encoding only allows characters in the range 32--127, so +% we only need to provide a more or less empty |.def| file. +% But we suppress the warning that would normally appear if there are no +% encoding definitions. +% +% \changes{v1.1b}{2006/03/03}{Suppress unnecessary warning (pr/3849)} +% \begin{macrocode} +%<ascii>\@inpenc@test +% \end{macrocode} +% +% \changes{v0.94}{1997/12/17}{Merged latin1 with ansinew/cp1252} +% +% \section{The ISO Latin-2 encoding} +% +% The ISO Latin-2 encoding file defines the characters +% in the ISO 8859-2 encoding. It was contributed by +% Petr Sojka (\texttt{sojka@muni.cz}) with small technical +% updates by Frank Mittelbach. +% +% \changes{v0.9e}{1995/08/31}{Redeclared "AD to be soft hyphen.} +% \changes{v0.91}{1997/08/19}{Replaced \cs{dh}/\cs{DH} by +% \cs{dj}/\cs{DJ}.} +% \changes{v0.94}{1997/12/17}{Changed 176 to \cs{textdegree}} +% +% \begin{macrocode} +%<*latin2> +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{176}{\textdegree} +\DeclareInputText{161}{\k A} +\DeclareInputText{177}{\k a} +\DeclareInputText{162}{\u{}} +\DeclareInputText{178}{\k\ } +\DeclareInputText{163}{\L} +\DeclareInputText{179}{\l} +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{180}{\@tabacckludge'{}} +\DeclareInputText{165}{\v L} +\DeclareInputText{181}{\v l} +\DeclareInputText{166}{\@tabacckludge'S} +\DeclareInputText{182}{\@tabacckludge's} +\DeclareInputText{167}{\S} +\DeclareInputText{183}{\v{}} +\DeclareInputText{168}{\"{}} +\DeclareInputText{184}{\c\ } +\DeclareInputText{169}{\v S} +\DeclareInputText{185}{\v s} +\DeclareInputText{170}{\c S} +\DeclareInputText{186}{\c s} +\DeclareInputText{171}{\v T} +\DeclareInputText{187}{\v t} +\DeclareInputText{172}{\@tabacckludge'Z} +\DeclareInputText{188}{\@tabacckludge'z} +\DeclareInputText{173}{\-} +\DeclareInputText{189}{\H{}} +\DeclareInputText{174}{\v Z} +\DeclareInputText{190}{\v z} +\DeclareInputText{175}{\.Z} +\DeclareInputText{191}{\.z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge'R} +\DeclareInputText{208}{\DJ} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{209}{\@tabacckludge'N} +\DeclareInputText{194}{\^A} +\DeclareInputText{210}{\v N} +\DeclareInputText{195}{\u A} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{196}{\"A} +\DeclareInputText{212}{\^O} +\DeclareInputText{197}{\@tabacckludge'L} +\DeclareInputText{213}{\H O} +\DeclareInputText{198}{\@tabacckludge'C} +\DeclareInputText{214}{\"O} +\DeclareInputText{199}{\c C} +\DeclareInputMath{215}{\times} +\DeclareInputText{200}{\v C} +\DeclareInputText{216}{\v R} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{217}{\r U} +\DeclareInputText{202}{\k E} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{203}{\"E} +\DeclareInputText{219}{\H U} +\DeclareInputText{204}{\v E} +\DeclareInputText{220}{\"U} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{221}{\@tabacckludge'Y} +\DeclareInputText{206}{\^I} +\DeclareInputText{222}{\c T} +\DeclareInputText{207}{\v D} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge'r} +\DeclareInputText{240}{\dj} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{241}{\@tabacckludge'n} +\DeclareInputText{226}{\^a} +\DeclareInputText{242}{\v n} +\DeclareInputText{227}{\u a} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{228}{\"a} +\DeclareInputText{244}{\^o} +\DeclareInputText{229}{\@tabacckludge'l} +\DeclareInputText{245}{\H o} +\DeclareInputText{230}{\@tabacckludge'c} +\DeclareInputText{246}{\"o} +\DeclareInputText{231}{\c c} +\DeclareInputMath{247}{\div} +\DeclareInputText{232}{\v c} +\DeclareInputText{248}{\v r} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{249}{\r u} +\DeclareInputText{234}{\k e} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{235}{\"e} +\DeclareInputText{251}{\H u} +\DeclareInputText{236}{\v e} +\DeclareInputText{252}{\"u} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{253}{\@tabacckludge'y} +\DeclareInputText{238}{\^\i} +\DeclareInputText{254}{\c t} +\DeclareInputText{239}{\v d} +\DeclareInputText{255}{\.{}} +%</latin2> +% \end{macrocode} +% +% \section{The ISO Latin-3 encoding} +% +% The ISO Latin-3 encoding file defines the characters +% in the ISO 8859-3 encoding. It was contributed by +% by J\"org Knappen (\texttt{joerg.knappen@uni-mainz.de}) and +% adapted by Chris Rowley. +% +% It can be used for general purpose applications in +% typical office environments in the following languages: +% Afrikaans, Catalan, English, Esperanto, French, Galician, German, +% Italian, Maltese, and Turkish. +% +% \begin{macrocode} +%<*latin3> +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{176}{\textdegree} +\DeclareInputText{161}{\textmalteseH} +\DeclareInputText{177}{\textmalteseh} +\DeclareInputText{162}{\u{}} +\DeclareInputMath{178}{\mathtwosuperior} +\DeclareInputText{163}{\pounds} +\DeclareInputMath{179}{\maththreesuperior} +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{180}{\@tabacckludge'{}} +% \DeclareInputText{165}{\notdef} +\DeclareInputMath{181}{\mu} +\DeclareInputText{166}{\^H} +% NOT: \DeclareInputText{182}{h\llap{\^{}}} % \^h would be too tall +\DeclareInputText{182}{\^h} +\DeclareInputText{167}{\S} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{168}{\"{}} +\DeclareInputText{184}{\c\ } +\DeclareInputText{169}{\.I} +\DeclareInputText{185}{\i} +\DeclareInputText{170}{\c S} +\DeclareInputText{186}{\c s} +\DeclareInputText{171}{\u G} +\DeclareInputText{187}{\u g} +\DeclareInputText{172}{\^J} +\DeclareInputText{188}{\^\j} +\DeclareInputText{173}{\-} +\DeclareInputText{189}{\textonehalf} +% \DeclareInputText{174}{\notdef} +% \DeclareInputText{190}{\notdef} +\DeclareInputText{175}{\.Z} +\DeclareInputText{191}{\.z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge`A} +% \DeclareInputText{208}{\notdef} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{209}{\~N} +\DeclareInputText{194}{\^A} +\DeclareInputText{210}{\@tabacckludge`O} +% \DeclareInputText{195}{\notdef} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{196}{\"A} +\DeclareInputText{212}{\^O} +\DeclareInputText{197}{\.C} +\DeclareInputText{213}{\.G} +\DeclareInputText{198}{\^C} +\DeclareInputText{214}{\"O} +\DeclareInputText{199}{\c C} +\DeclareInputMath{215}{\times} +\DeclareInputText{200}{\@tabacckludge`E} +\DeclareInputText{216}{\^G} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{217}{\@tabacckludge`U} +\DeclareInputText{202}{\^E} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{203}{\"E} +\DeclareInputText{219}{\^U} +\DeclareInputText{204}{\@tabacckludge`I} +\DeclareInputText{220}{\"U} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{221}{\u U} +\DeclareInputText{206}{\^I} +\DeclareInputText{222}{\^S} +\DeclareInputText{207}{\"I} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge`a} +% \DeclareInputText{240}{\notdef} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{241}{\~n} +\DeclareInputText{226}{\^a} +\DeclareInputText{242}{\@tabacckludge`o} +% \DeclareInputText{227}{\notdef} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{228}{\"a} +\DeclareInputText{244}{\^o} +\DeclareInputText{229}{\.c} +\DeclareInputText{245}{\.g} +\DeclareInputText{230}{\^c} +\DeclareInputText{246}{\"o} +\DeclareInputText{231}{\c c} +\DeclareInputMath{247}{\div} +\DeclareInputText{232}{\@tabacckludge`e} +\DeclareInputText{248}{\^g} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{249}{\@tabacckludge`u} +\DeclareInputText{234}{\^e} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{235}{\"e} +\DeclareInputText{251}{\^u} +\DeclareInputText{236}{\@tabacckludge`\i} +\DeclareInputText{252}{\"u} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{253}{\u u} +\DeclareInputText{238}{\^\i} +\DeclareInputText{254}{\^s} +\DeclareInputText{239}{\"\i} +\DeclareInputText{255}{\.{}} +%</latin3> +% \end{macrocode} +% +% \section{The ISO Latin-4 encoding} +% +% The ISO Latin-4 encoding file defines the characters in the ISO +% 8859-4 encoding. It was contributed by Hana Skoumalov\'a +% (\texttt{hana.skoumalova@ff.cuni.cz}). +% +% It was created for Estonian, Latvian, Lithuanian, Finnish, Lappish, +% Swedish, Norwegian, Danish, Icelandic and Greenlandic Inuit. Some +% alphabets, however, are incomplete (Greenlandic, Icelandic and Lappish). +% Some glyphs are not available in the fonts. For example, the +% Greenlandic character `kra' is not available at all; +% the Latvian and Lithuanian characters not +% contained in other encodings are constructed from components and +% they do not look good. +% +% \changes{v0.999}{2001/06/04}{Added \cs{textkra}, \cs{texttstroke} and +% \cs{textTstroke} (pr/3336)} +% \begin{macrocode} +%<*latin4> +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{161}{\k A} +\DeclareInputText{162}{\textkra}%% Greenlandic Inuit +\DeclareInputText{163}{\c R} +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{165}{\~I} +\DeclareInputText{166}{\c L} +\DeclareInputText{167}{\S} +\DeclareInputText{168}{\"{}} +\DeclareInputText{169}{\v S} +\DeclareInputText{170}{\@tabacckludge=E} +\DeclareInputText{171}{\c G} +\DeclareInputText{172}{\textTstroke}%% Northern Sami +\DeclareInputText{173}{\-} +\DeclareInputText{174}{\v Z} +\DeclareInputText{175}{\@tabacckludge={}} +\DeclareInputText{176}{\textdegree} +\DeclareInputText{177}{\k a} +\DeclareInputText{178}{\k\ } +\DeclareInputText{179}{\c r} +\DeclareInputText{180}{\@tabacckludge'{}} +\DeclareInputText{181}{\~\i} +\DeclareInputText{182}{\c l} +\DeclareInputText{183}{\v{}} +\DeclareInputText{184}{\c\ } +\DeclareInputText{185}{\v s} +\DeclareInputText{186}{\@tabacckludge=e} +\DeclareInputText{187}{\c g} +\DeclareInputText{188}{\texttstroke}%% Northern Sami +\DeclareInputText{189}{\NG} +\DeclareInputText{190}{\v z} +\DeclareInputText{191}{\ng} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge=A} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{194}{\^A} +\DeclareInputText{195}{\~A} +\DeclareInputText{196}{\"A} +\DeclareInputText{197}{\r A} +\DeclareInputText{198}{\AE} +\DeclareInputText{199}{\k I} +\DeclareInputText{200}{\v C} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{202}{\k E} +\DeclareInputText{203}{\"E} +\DeclareInputText{204}{\.{E}} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{206}{\^I} +\DeclareInputText{207}{\@tabacckludge=I} +\DeclareInputText{208}{\DJ} +\DeclareInputText{209}{\c N} +\DeclareInputText{210}{\@tabacckludge=O} +\DeclareInputText{211}{\c K} +\DeclareInputText{212}{\^O} +\DeclareInputText{213}{\~O} +\DeclareInputText{214}{\"O} +\DeclareInputMath{215}{\times} +\DeclareInputText{216}{\O} +\DeclareInputText{217}{\k U} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{219}{\^U} +\DeclareInputText{220}{\"U} +\DeclareInputText{221}{\~U} +\DeclareInputText{222}{\@tabacckludge=U} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge=a} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{226}{\^a} +\DeclareInputText{227}{\~a} +\DeclareInputText{228}{\"a} +\DeclareInputText{229}{\r a} +\DeclareInputText{230}{\ae} +\DeclareInputText{231}{\k i} +\DeclareInputText{232}{\v c} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{234}{\k e} +\DeclareInputText{235}{\"e} +\DeclareInputText{236}{\.{e}} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{238}{\^\i} +\DeclareInputText{239}{\@tabacckludge=\i} +\DeclareInputText{240}{\dj} +\DeclareInputText{241}{\c n} +\DeclareInputText{242}{\@tabacckludge=o} +\DeclareInputText{243}{\c k} +\DeclareInputText{244}{\^o} +\DeclareInputText{245}{\~o} +\DeclareInputText{246}{\"o} +\DeclareInputMath{247}{\div} +\DeclareInputText{248}{\o} +\DeclareInputText{249}{\k u} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{251}{\^u} +\DeclareInputText{252}{\"u} +\DeclareInputText{253}{\~u} +\DeclareInputText{254}{\@tabacckludge=u} +\DeclareInputText{255}{\.{}} +%</latin4> +% \end{macrocode} +% +% \section{The ISO Latin-5 encoding} +% +% \changes{v0.991}{1999/08/23}{Corrected description for Latin-5.} +% The ISO Latin-5 encoding file defines the characters +% in the ISO 8859-9 encoding, which describes Latin Alphabet No. 5. +% It was contributed by H.~Turgut Uyar (\texttt{uyar@cs.itu.edu.tr}); +% it is used for Turkish. +% +% \begin{macrocode} +%<*latin5> +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{176}{\textdegree} +\DeclareInputText{161}{\textexclamdown} +\DeclareInputMath{177}{\pm} +\DeclareInputText{162}{\textcent} +\DeclareInputMath{178}{\mathtwosuperior} +\DeclareInputText{163}{\pounds} +\DeclareInputMath{179}{\maththreesuperior} +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{180}{\@tabacckludge'{}} +\DeclareInputText{165}{\textyen} +\DeclareInputMath{181}{\mu} +\DeclareInputText{166}{\textbrokenbar} +\DeclareInputText{182}{\P} +\DeclareInputText{167}{\S} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{168}{\"{}} +\DeclareInputText{184}{\c\ } +\DeclareInputText{169}{\copyright} +\DeclareInputMath{185}{\mathonesuperior} +\DeclareInputText{170}{\textordfeminine} +\DeclareInputText{186}{\textordmasculine} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputText{187}{\guillemetright} +\DeclareInputMath{172}{\lnot} +\DeclareInputText{188}{\textonequarter} +\DeclareInputText{173}{\-} +\DeclareInputText{189}{\textonehalf} +\DeclareInputText{174}{\textregistered} +\DeclareInputText{190}{\textthreequarters} +\DeclareInputText{175}{\@tabacckludge={}} +\DeclareInputText{191}{\textquestiondown} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge`A} +\DeclareInputText{208}{\u G} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{209}{\~N} +\DeclareInputText{194}{\^A} +\DeclareInputText{210}{\@tabacckludge`O} +\DeclareInputText{195}{\~A} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{196}{\"A} +\DeclareInputText{212}{\^O} +\DeclareInputText{197}{\r A} +\DeclareInputText{213}{\~O} +\DeclareInputText{198}{\AE} +\DeclareInputText{214}{\"O} +\DeclareInputText{199}{\c C} +\DeclareInputMath{215}{\times} +\DeclareInputText{200}{\@tabacckludge`E} +\DeclareInputText{216}{\O} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{217}{\@tabacckludge`U} +\DeclareInputText{202}{\^E} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{203}{\"E} +\DeclareInputText{219}{\^U} +\DeclareInputText{204}{\@tabacckludge`I} +\DeclareInputText{220}{\"U} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{221}{\.I} +\DeclareInputText{206}{\^I} +\DeclareInputText{222}{\c S} +\DeclareInputText{207}{\"I} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge`a} +\DeclareInputText{240}{\u g} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{241}{\~n} +\DeclareInputText{226}{\^a} +\DeclareInputText{242}{\@tabacckludge`o} +\DeclareInputText{227}{\~a} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{228}{\"a} +\DeclareInputText{244}{\^o} +\DeclareInputText{229}{\r a} +\DeclareInputText{245}{\~o} +\DeclareInputText{230}{\ae} +\DeclareInputText{246}{\"o} +\DeclareInputText{231}{\c c} +\DeclareInputMath{247}{\div} +\DeclareInputText{232}{\@tabacckludge`e} +\DeclareInputText{248}{\o} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{249}{\@tabacckludge`u} +\DeclareInputText{234}{\^e} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{235}{\"e} +\DeclareInputText{251}{\^u} +\DeclareInputText{236}{\@tabacckludge`\i} +\DeclareInputText{252}{\"u} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{253}{\i} +\DeclareInputText{238}{\^\i} +\DeclareInputText{254}{\c s} +\DeclareInputText{239}{\"\i} +\DeclareInputText{255}{\"y} +%</latin5> +% \end{macrocode} +% +% \section{DEC Multinational Character Set} +% +% The DECMultinational character set, used by the OpenVMS operating +% system, is slightly different from the ISO Latin 1 character set. +% +% Reference: Digital Equipment Corporation VT330/VT340 Programmer +% Reference Manual, Volume 1: Text Programming, page 22. +% +% This encoding was provided by M.Y. Chartoire IPNL-IN2P3 \\ +% \texttt{m.chartoire@ipnl.in2p3.fr} +% +% \begin{macrocode} +%<*decmulti> +\DeclareInputText{176}{\textdegree} +\DeclareInputText{161}{\textexclamdown} +\DeclareInputMath{177}{\pm} +\DeclareInputText{162}{\textcent} +\DeclareInputMath{178}{\mathtwosuperior} +\DeclareInputText{163}{\pounds} +\DeclareInputMath{179}{\maththreesuperior} +\DeclareInputText{165}{\textyen} +\DeclareInputMath{181}{\mu} +\DeclareInputText{182}{\P} +\DeclareInputText{167}{\S} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{168}{\textcurrency} +\DeclareInputText{169}{\copyright} +\DeclareInputMath{185}{\mathonesuperior} +\DeclareInputText{170}{\textordfeminine} +\DeclareInputText{186}{\textordmasculine} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputText{187}{\guillemetright} +\DeclareInputText{188}{\textonequarter} +\DeclareInputText{189}{\textonehalf} +\DeclareInputText{191}{\textquestiondown} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge`A} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{209}{\~N} +\DeclareInputText{194}{\^A} +\DeclareInputText{210}{\@tabacckludge`O} +\DeclareInputText{195}{\~A} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{196}{\"A} +\DeclareInputText{212}{\^O} +\DeclareInputText{197}{\r A} +\DeclareInputText{213}{\~O} +\DeclareInputText{198}{\AE} +\DeclareInputText{214}{\"O} +\DeclareInputText{199}{\c C} +\DeclareInputText{215}{\OE} +\DeclareInputText{200}{\@tabacckludge`E} +\DeclareInputText{216}{\O} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{217}{\@tabacckludge`U} +\DeclareInputText{202}{\^E} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{203}{\"E} +\DeclareInputText{219}{\^U} +\DeclareInputText{204}{\@tabacckludge`I} +\DeclareInputText{220}{\"U} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{221}{\"Y} +\DeclareInputText{206}{\^I} +\DeclareInputText{207}{\"I} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge`a} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{241}{\~n} +\DeclareInputText{226}{\^a} +\DeclareInputText{242}{\@tabacckludge`o} +\DeclareInputText{227}{\~a} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{228}{\"a} +\DeclareInputText{244}{\^o} +\DeclareInputText{229}{\r a} +\DeclareInputText{245}{\~o} +\DeclareInputText{230}{\ae} +\DeclareInputText{246}{\"o} +\DeclareInputText{231}{\c c} +\DeclareInputText{247}{\oe} +\DeclareInputText{232}{\@tabacckludge`e} +\DeclareInputText{248}{\o} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{249}{\@tabacckludge`u} +\DeclareInputText{234}{\^e} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{235}{\"e} +\DeclareInputText{251}{\^u} +\DeclareInputText{236}{\@tabacckludge`\i} +\DeclareInputText{252}{\"u} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{253}{\"y} +\DeclareInputText{238}{\^\i} +\DeclareInputText{239}{\"\i} +%</decmulti> +% \end{macrocode} +% +% +% \section{The IBM code pages 850 and 858} +% +% This input encoding was contributed by +% Timo Knuutila (\texttt{knuutila@\linebreak[0]cs.utu.fi}), +% and edited by Christian Bartels +% (\texttt{ii140ba@\linebreak[0]vm1.rz.rwth-aachen.de}). +% +% The DOS graphics `letters' and a few +% other positions are ignored (left undefined). +% +% The 858 code page is identical to the 850 except that +% +% \changes{v0.9d}{1995/06/06}{Made changes to cp850 suggested by +% Christian Bartels} +% \changes{v0.9s}{1995/08/31} +% {Swapped ordfeminine and masculine. /2203} +% +% \begin{macrocode} +%<*cp850|cp858> +\DeclareInputText{128}{\c C} +\DeclareInputText{144}{\@tabacckludge'E} +\DeclareInputText{129}{\"u} +\DeclareInputText{145}{\ae} +\DeclareInputText{130}{\@tabacckludge'e} +\DeclareInputText{146}{\AE} +\DeclareInputText{131}{\^a} +\DeclareInputText{147}{\^o} +\DeclareInputText{132}{\"a} +\DeclareInputText{148}{\"o} +\DeclareInputText{133}{\@tabacckludge`a} +\DeclareInputText{149}{\@tabacckludge`o} +\DeclareInputText{134}{\r a} +\DeclareInputText{150}{\^u} +\DeclareInputText{135}{\c c} +\DeclareInputText{151}{\@tabacckludge`u} +\DeclareInputText{136}{\^e} +\DeclareInputText{152}{\"y} +\DeclareInputText{137}{\"e} +\DeclareInputText{153}{\"O} +\DeclareInputText{138}{\@tabacckludge`e} +\DeclareInputText{154}{\"U} +\DeclareInputText{139}{\"\i} +\DeclareInputText{155}{\o} +\DeclareInputText{140}{\^\i} +\DeclareInputText{156}{\pounds} +\DeclareInputText{141}{\@tabacckludge`\i} +\DeclareInputText{157}{\O} +\DeclareInputText{142}{\"A} +\DeclareInputMath{158}{\times} +\DeclareInputText{143}{\r A} +\DeclareInputText{159}{\textflorin} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\@tabacckludge'a} +\DeclareInputText{161}{\@tabacckludge'\i} +\DeclareInputText{162}{\@tabacckludge'o} +\DeclareInputText{163}{\@tabacckludge'u} +\DeclareInputText{164}{\~n} %% "B0-"B4: DG +\DeclareInputText{165}{\~N} +\DeclareInputText{181}{\@tabacckludge'A} +\DeclareInputText{166}{\textordfeminine} +\DeclareInputText{182}{\^A} +\DeclareInputText{167}{\textordmasculine} +\DeclareInputText{183}{\@tabacckludge`A} +\DeclareInputText{168}{\textquestiondown} +\DeclareInputText{184}{\copyright} +\DeclareInputText{169}{\textregistered} +\DeclareInputMath{170}{\lnot} +\DeclareInputText{171}{\textonehalf} +\DeclareInputText{172}{\textonequarter} %% "B9-"BC: DG +\DeclareInputText{173}{\textexclamdown} +\DeclareInputText{189}{\textcent} +\DeclareInputText{174}{\guillemetleft} +\DeclareInputText{190}{\textyen} +\DeclareInputText{175}{\guillemetright} +% \end{macrocode} +% +% \begin{macrocode} +% "BF-"C5: DG +\DeclareInputText{208}{\dh} +\DeclareInputText{209}{\DH} +\DeclareInputText{210}{\^E} +\DeclareInputText{211}{\"E} +\DeclareInputText{212}{\@tabacckludge`E} +% \end{macrocode} +% Here is the only point in which the two code pages differ! +% \begin{macrocode} +%<-cp858>\DeclareInputText{213}{\i} +%<-cp850>\DeclareInputText{213}{\texteuro} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{198}{\~a} +\DeclareInputText{214}{\@tabacckludge'I} +\DeclareInputText{199}{\~A} +\DeclareInputText{215}{\^I} +\DeclareInputText{216}{\"I} +% "C8-"CE: DG +% "D9-"DC: DG +\DeclareInputText{221}{\textbrokenbar} +\DeclareInputText{222}{\@tabacckludge`I} +\DeclareInputText{207}{\textcurrency} %% "DF: DG +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge'O} +\DeclareInputText{240}{\-} +\DeclareInputText{225}{\ss} +\DeclareInputMath{241}{\pm} +\DeclareInputText{226}{\^O} +% "F2: DG (not double underline, or equals?) +\DeclareInputText{227}{\@tabacckludge`O} +\DeclareInputText{243}{\textthreequarters} +\DeclareInputText{228}{\~o} +\DeclareInputText{244}{\P} +\DeclareInputText{229}{\~O} +\DeclareInputText{245}{\S} +\DeclareInputMath{230}{\mu} +\DeclareInputMath{246}{\div} +\DeclareInputText{231}{\th} +\DeclareInputText{247}{\c\ } +\DeclareInputText{232}{\TH} +\DeclareInputText{248}{\textdegree} +\DeclareInputText{233}{\@tabacckludge'U} +\DeclareInputText{249}{\"{}} +\DeclareInputText{234}{\^U} +\DeclareInputText{250}{\textperiodcentered} +\DeclareInputText{235}{\@tabacckludge`U} +\DeclareInputMath{251}{\mathonesuperior} +\DeclareInputText{236}{\@tabacckludge'y} +\DeclareInputMath{252}{\maththreesuperior} +\DeclareInputText{237}{\@tabacckludge'Y} +\DeclareInputMath{253}{\mathtwosuperior} +\DeclareInputText{238}{\@tabacckludge={}} +\DeclareInputText{254}{\textblacksquare} % right name? +\DeclareInputText{239}{\@tabacckludge'{}} +\DeclareInputText{255}{\nobreakspace} +%</cp850|cp858> +% \end{macrocode} +% +% \section{The IBM code page 852} +% +% This input encoding was contributed by +% Petr Sojka (\texttt{sojka@\linebreak[0]Muni.cz}). +% +% \changes{v0.9t}{1996/10/28}{Added extra \cs{nobreakspace}: OK?} +% \changes{v0.9z}{1997/05/10}{Corrected typo in slot 213} +% \changes{v0.91}{1997/08/19}{Replaced \cs{dh}/\cs{DH} by +% \cs{dj}/\cs{DJ}.} +% \changes{v0.99}{1999/04/14}{Changed 212, see pr/2992} +% +% \begin{macrocode} +%<*cp852> +\DeclareInputText{128}{\c C} +\DeclareInputText{144}{\@tabacckludge'E} +\DeclareInputText{129}{\"u} +\DeclareInputText{145}{\@tabacckludge'L} +\DeclareInputText{130}{\@tabacckludge'e} +\DeclareInputText{146}{\@tabacckludge'l} +\DeclareInputText{131}{\^a} +\DeclareInputText{147}{\^o} +\DeclareInputText{132}{\"a} +\DeclareInputText{148}{\"o} +\DeclareInputText{133}{\r u} +\DeclareInputText{149}{\v L} +\DeclareInputText{134}{\@tabacckludge'c} +\DeclareInputText{150}{\v l} +\DeclareInputText{135}{\c c} +\DeclareInputText{151}{\@tabacckludge'S} +\DeclareInputText{136}{\l} +\DeclareInputText{152}{\@tabacckludge's} +\DeclareInputText{137}{\"e} +\DeclareInputText{153}{\"O} +\DeclareInputText{138}{\H O} +\DeclareInputText{154}{\"U} +\DeclareInputText{139}{\H o} +\DeclareInputText{155}{\v T} +\DeclareInputText{140}{\^\i} +\DeclareInputText{156}{\v t} +\DeclareInputText{141}{\@tabacckludge'Z} +\DeclareInputText{157}{\L} +\DeclareInputText{142}{\"A} +\DeclareInputMath{158}{\times} +\DeclareInputText{143}{\@tabacckludge'C} +\DeclareInputText{159}{\v c} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\@tabacckludge'a} +\DeclareInputText{161}{\@tabacckludge'\i} +\DeclareInputText{162}{\@tabacckludge'o} +\DeclareInputText{163}{\@tabacckludge'u} +\DeclareInputText{164}{\k A} +\DeclareInputText{165}{\k a} +\DeclareInputText{166}{\v Z} +\DeclareInputText{167}{\v z} +\DeclareInputText{168}{\k E} +\DeclareInputText{169}{\k e} +\DeclareInputMath{170}{\lnot} +\DeclareInputText{171}{\@tabacckludge'z} +\DeclareInputText{172}{\v C} +\DeclareInputText{173}{\c s} +\DeclareInputText{174}{\guillemetleft} +\DeclareInputText{175}{\guillemetright} +\DeclareInputText{181}{\@tabacckludge'A} +\DeclareInputText{182}{\^A} +\DeclareInputText{183}{\v E} +\DeclareInputText{184}{\c S} +\DeclareInputText{189}{\.Z} +\DeclareInputText{190}{\.z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{198}{\u A} +\DeclareInputText{199}{\u a} +\DeclareInputText{207}{\textcurrency} +\DeclareInputText{208}{\dj} +\DeclareInputText{209}{\DJ} +\DeclareInputText{210}{\v D} +\DeclareInputText{211}{\"E} +\DeclareInputText{212}{\v d} % d caron +\DeclareInputText{213}{\v N} +\DeclareInputText{214}{\@tabacckludge'I} +\DeclareInputText{215}{\^I} +\DeclareInputText{216}{\v e} +\DeclareInputText{221}{\c T} +\DeclareInputText{222}{\r U} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge'O} +\DeclareInputText{240}{\-} +\DeclareInputText{225}{\ss} +\DeclareInputText{241}{\H{}} +\DeclareInputText{226}{\^O} +\DeclareInputText{242}{\k\ } +\DeclareInputText{227}{\@tabacckludge'N} +\DeclareInputText{243}{\v{}} +\DeclareInputText{228}{\@tabacckludge'n} +\DeclareInputText{244}{\u{}} +\DeclareInputText{229}{\v n} +\DeclareInputText{245}{\S} +\DeclareInputText{230}{\v S} +\DeclareInputMath{246}{\div} +\DeclareInputText{231}{\v s} +\DeclareInputText{247}{\c\ } +\DeclareInputText{232}{\@tabacckludge'R} +\DeclareInputText{248}{\textdegree} +\DeclareInputText{233}{\@tabacckludge'U} +\DeclareInputText{249}{\"{}} +\DeclareInputText{234}{\@tabacckludge'r} +\DeclareInputText{250}{\.{}} +\DeclareInputText{235}{\H U} +\DeclareInputText{251}{\H u} +\DeclareInputText{236}{\@tabacckludge'y} +\DeclareInputText{252}{\v R} +\DeclareInputText{237}{\@tabacckludge'Y} +\DeclareInputText{253}{\v r} +\DeclareInputText{238}{\c t} +\DeclareInputText{254}{\textblacksquare} % right name? +\DeclareInputText{239}{\@tabacckludge'{}} +\DeclareInputText{255}{\nobreakspace} +%</cp852> +% \end{macrocode} +% +% \section{The IBM code pages 437 and 865} +% +% This input encoding is based on work by\\ +% Volker Kunert +% (\texttt{volker@\linebreak[0]numsun1.mathematik.uni-halle.de})\\ +% and \texttt{bontus@\linebreak[0]al6000.physik.uni-siegen.de}.\\ +% The changes for cp865 are based on work by S\o ren Sandmann +% (\texttt{sandmann@\linebreak[0]daimi.aau.dk}), with thanks to +% them all. +% +% The DOS graphics `letters' and a few +% other positions are ignored (left undefined). +% +% Unfortunately, in cp437 there is no agreement as to whether slot E1 +% should be `$\beta$' or `\ss', so we provide two variants, +% one (cp437) with `$\beta$' and one (cp437de) with `\ss'. +% +% \changes{v0.9e}{1995/08/31}{Added a 0 to all character codes} +% +% \changes{v0.9m}{1995/12/04}{Made uumlaut and pounds text characters} +% \changes{v0.9t}{1996/10/28}{Added \cs{textflorin} and \cs{textpeseta}} +% \changes{v0.9t}{1996/10/28}{Removed \cs{textbrokenbar}} +% \changes{v0.9t}{1996/10/28}{Removed \cs{textendash}} +% \changes{v0.9t}{1996/10/28}{Changed \cs{Theta} to \cs{Phi}} +% \changes{v0.9t}{1996/10/28}{Changed \cs{Pi} to \cs{pi}, perhaps} +% \changes{v0.9t}{1996/10/28}{Changed \cs{emptyset} to \cs{phi}} +% \changes{v0.9t}{1996/10/28}{Changed \cs{maththreesuperior} to +% \cs{mathnsuperior}} +% \changes{v0.94}{1997/12/17}{Changed 158 to \cs{DeclareInputText}} +% +% \begin{macrocode} +%<*cp437|cp437de|cp865> +\DeclareInputText{128}{\c C} +\DeclareInputText{129}{\"u} +\DeclareInputText{130}{\@tabacckludge'e} +\DeclareInputText{131}{\^a} +\DeclareInputText{132}{\"a} +\DeclareInputText{133}{\@tabacckludge`a} +\DeclareInputText{134}{\r a} +\DeclareInputText{135}{\c c} +\DeclareInputText{136}{\^e} +\DeclareInputText{137}{\"e} +\DeclareInputText{138}{\@tabacckludge`e} +\DeclareInputText{139}{\"\i} +\DeclareInputText{140}{\^\i} +\DeclareInputText{141}{\@tabacckludge`\i} +\DeclareInputText{142}{\"A} +\DeclareInputText{143}{\r A} +\DeclareInputText{144}{\@tabacckludge'E} +\DeclareInputText{145}{\ae} +\DeclareInputText{146}{\AE} +\DeclareInputText{147}{\^o} +\DeclareInputText{148}{\"o} +\DeclareInputText{149}{\@tabacckludge`o} +\DeclareInputText{150}{\^u} +\DeclareInputText{151}{\@tabacckludge`u} +\DeclareInputText{152}{\"y} +\DeclareInputText{153}{\"O} +\DeclareInputText{154}{\"U} +%</cp437|cp437de|cp865> +%<*cp437|cp437de> +\DeclareInputText{155}{\textcent} +\DeclareInputText{156}{\pounds} +\DeclareInputText{157}{\textyen} +%</cp437|cp437de> +%<*cp865> +\DeclareInputText{155}{\o} +\DeclareInputText{156}{\pounds} +\DeclareInputText{157}{\O} +%</cp865> +%<*cp437|cp437de|cp865> +\DeclareInputText{158}{\textpeseta} % Pt +\DeclareInputText{159}{\textflorin} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\@tabacckludge'a} % 160 +\DeclareInputText{161}{\@tabacckludge'\i} +\DeclareInputText{162}{\@tabacckludge'o} +\DeclareInputText{163}{\@tabacckludge'u} +\DeclareInputText{164}{\~n} +\DeclareInputText{165}{\~N} +\DeclareInputText{166}{\textordfeminine} +\DeclareInputText{167}{\textordmasculine} +\DeclareInputText{168}{\textquestiondown} +%\DeclareInputText{169}{} % left upper corner +\DeclareInputMath{170}{\lnot} +\DeclareInputText{171}{\textonehalf} +\DeclareInputText{172}{\textonequarter} +\DeclareInputText{173}{\textexclamdown} +\DeclareInputText{174}{\guillemetleft} +%<cp437|cp437de>\DeclareInputText{175}{\guillemetright} +%<cp865>\DeclareInputText{175}{\textcurrency} +%\DeclareInputText{176}{\textlightgraybox} +%\DeclareInputText{177}{\textgraybox} +%\DeclareInputText{178}{\textdarkgraybox} +%\DeclareInputMath{179}{} % vertical bar +%\DeclareInputText{180}{} % vertical bar with branch to left +%\DeclareInputText{181}{} % vertical bar with double branch to left +%\DeclareInputText{182}{} % double bar with single branch to left +%\DeclareInputText{183}{} % graphic +%\DeclareInputText{184}{} % graphic +%\DeclareInputMath{185}{} % vertical double bar with branch to left +%\DeclareInputMath{186}{} % vertical double bar +%\DeclareInputText{187}{} % double upper right corner +%\DeclareInputMath{188}{} % double lower right corner +%\DeclareInputText{189}{} % graphic +%\DeclareInputText{190}{} % graphic +%\DeclareInputMath{191}{\ensuremath{\rceil}} +% \end{macrocode} +% +% \begin{macrocode} +%\DeclareInputMath{192}{\ensuremath{\lfloor}} +%\DeclareInputText{193}{} % dash with branch up +%\DeclareInputText{194}{} % dash with branch down +%\DeclareInputText{195}{} % vertical bar with branch to right +%\DeclareInputText{196}{} % horizontal bar, not endash +%\DeclareInputText{197}{} % vertical bar crossed with dash +%\DeclareInputText{198}{} % graphic +%\DeclareInputText{199}{} % graphic +%\DeclareInputText{200}{} % double lower left corner +%\DeclareInputText{201}{} % double upper left corner +%\DeclareInputText{202}{} % double dash with branch up +%\DeclareInputText{203}{} % double dash with branch down +%\DeclareInputText{204}{} % double bar with branch right +%\DeclareInputText{205}{=} % double dash +%\DeclareInputText{206}{} % double bar crossing double dash +%\DeclareInputText{207}{} % graphic +%\DeclareInputMath{208}{} +%\DeclareInputText{209}{} +%\DeclareInputText{210}{} +%\DeclareInputText{211}{} +%\DeclareInputText{212}{} +%\DeclareInputText{213}{} +%\DeclareInputText{214}{} +%\DeclareInputText{215}{} +%\DeclareInputText{216}{} +%\DeclareInputMath{217}{\ensuremath{\rfloor}} % lower right corner +%\DeclareInputMath{218}{\ensuremath{\lceil}} % upper left corner +%\DeclareInputText{219}{} % black box +%\DeclareInputText{220}{} % lower half of black box +%\DeclareInputText{221}{} % left bar +%\DeclareInputText{222}{} % right bar +%\DeclareInputText{223}{} % upper half of black box +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputMath{224}{\alpha} +%</cp437|cp437de|cp865> +%<cp437|cp865>\DeclareInputMath{225}{\beta} +%<cp437de>\DeclareInputText{225}{\ss} +%<*cp437|cp437de|cp865> +\DeclareInputMath{226}{\Gamma} +\DeclareInputMath{227}{\pi} +\DeclareInputMath{228}{\Sigma} +\DeclareInputMath{229}{\sigma} +\DeclareInputMath{230}{\mu} +\DeclareInputMath{231}{\gamma} +\DeclareInputMath{232}{\Phi} +\DeclareInputMath{233}{\theta} +\DeclareInputMath{234}{\Omega} +\DeclareInputMath{235}{\delta} +\DeclareInputMath{236}{\infty} +\DeclareInputMath{237}{\phi} +\DeclareInputMath{238}{\varepsilon} +\DeclareInputMath{239}{\cap} +\DeclareInputMath{240}{\equiv} +\DeclareInputMath{241}{\pm} +\DeclareInputMath{242}{\geq} +\DeclareInputMath{243}{\leq} +%\DeclareInputMath{244}{} % upper part of integral sign +%\DeclareInputMath{245}{} % lower part of integral sign +\DeclareInputMath{246}{\div} +\DeclareInputMath{247}{\approx} +\DeclareInputText{248}{\textdegree} +\DeclareInputText{249}{\textperiodcentered} +\DeclareInputText{250}{\textbullet} +\DeclareInputMath{251}{\surd} +\DeclareInputMath{252}{\mathnsuperior} +\DeclareInputMath{253}{\mathtwosuperior} +\DeclareInputText{254}{\textblacksquare} % right name? +\DeclareInputText{255}{\nobreakspace} +%</cp437|cp437de|cp865> +% \end{macrocode} +% +% \section{The Macintosh encodings} +% +% This input encoding was contributed by +% Constantin Kahn (\texttt{kahn@\linebreak[0]math.toronto.edu}), +% with minor modifications by Alan Jeffrey. +% +% \changes{v0.09c}{1995/05/30}{Made mac encoding `active German quote +% safe', and added the correct docstrip magic.} +% +% \begin{macrocode} +%<*applemac> +\DeclareInputText{128}{\"A} +\DeclareInputText{129}{\r A} +\DeclareInputText{130}{\c C} +\DeclareInputText{131}{\@tabacckludge'E} +\DeclareInputText{132}{\~N} +\DeclareInputText{133}{\"O} +\DeclareInputText{134}{\"U} +\DeclareInputText{135}{\@tabacckludge'a} +\DeclareInputText{136}{\@tabacckludge`a} +\DeclareInputText{137}{\^a} +\DeclareInputText{138}{\"a} +\DeclareInputText{139}{\~a} +\DeclareInputText{140}{\r a} +\DeclareInputText{141}{\c c} +\DeclareInputText{142}{\@tabacckludge'e} +\DeclareInputText{143}{\@tabacckludge`e} +\DeclareInputText{144}{\^e} +\DeclareInputText{145}{\"e} +\DeclareInputText{146}{\@tabacckludge'\i} +\DeclareInputText{147}{\@tabacckludge`\i} +\DeclareInputText{148}{\^\i} +\DeclareInputText{149}{\"\i} +\DeclareInputText{150}{\~n} +\DeclareInputText{151}{\@tabacckludge'o} +\DeclareInputText{152}{\@tabacckludge`o} +\DeclareInputText{153}{\^o} +\DeclareInputText{154}{\"o} +\DeclareInputText{155}{\~o} +\DeclareInputText{156}{\@tabacckludge'u} +\DeclareInputText{157}{\@tabacckludge`u} +\DeclareInputText{158}{\^u} +\DeclareInputText{159}{\"u} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\dag} +\DeclareInputText{161}{\textdegree} +\DeclareInputText{162}{\textcent} +\DeclareInputText{163}{\pounds} +\DeclareInputText{164}{\S} +\DeclareInputText{165}{\textbullet} +\DeclareInputText{166}{\P} +\DeclareInputText{167}{\ss} +\DeclareInputText{168}{\textregistered} +\DeclareInputText{169}{\copyright} +\DeclareInputText{170}{\texttrademark} +\DeclareInputText{171}{\@tabacckludge'{}} +\DeclareInputText{172}{\"{}} +\DeclareInputMath{173}{\neq} +\DeclareInputText{174}{\AE} +\DeclareInputText{175}{\O} +\DeclareInputMath{176}{\infty} +\DeclareInputMath{177}{\pm} +\DeclareInputMath{178}{\leq} +\DeclareInputMath{179}{\geq} +\DeclareInputText{180}{\textyen} +\DeclareInputMath{181}{\mu} +\DeclareInputMath{182}{\partial} +\DeclareInputMath{183}{\Sigma} +\DeclareInputMath{184}{\Pi} +\DeclareInputMath{185}{\pi} +\DeclareInputMath{186}{\int} +\DeclareInputText{187}{\textordfeminine} +\DeclareInputText{188}{\textordmasculine} +\DeclareInputMath{189}{\Omega} +\DeclareInputText{190}{\ae} +\DeclareInputText{191}{\o} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\textquestiondown} +\DeclareInputText{193}{\textexclamdown} +\DeclareInputMath{194}{\lnot} +\DeclareInputMath{195}{\surd} +\DeclareInputText{196}{\textflorin} +\DeclareInputMath{197}{\approx} +\DeclareInputMath{198}{\Delta} +\DeclareInputText{199}{\guillemetleft} +\DeclareInputText{200}{\guillemetright} +\DeclareInputText{201}{\dots} +\DeclareInputText{202}{\nobreakspace} +\DeclareInputText{203}{\@tabacckludge`A} +\DeclareInputText{204}{\~A} +\DeclareInputText{205}{\~O} +\DeclareInputText{206}{\OE} +\DeclareInputText{207}{\oe} +\DeclareInputText{208}{\textendash} +\DeclareInputText{209}{\textemdash} +\DeclareInputText{210}{\textquotedblleft} +\DeclareInputText{211}{\textquotedblright} +\DeclareInputText{212}{\textquoteleft} +\DeclareInputText{213}{\textquoteright} +\DeclareInputMath{214}{\div} +\DeclareInputMath{215}{\diamond} +\DeclareInputText{216}{\"y} +\DeclareInputText{217}{\"Y} +\DeclareInputMath{218}{/} +\DeclareInputText{219}{\textcurrency} +\DeclareInputText{220}{\guilsinglleft} +\DeclareInputText{221}{\guilsinglright} +\DeclareInputText{222}{fi} +\DeclareInputText{223}{fl} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\ddag} +\DeclareInputText{225}{\textperiodcentered} +\DeclareInputText{226}{\quotesinglbase} +\DeclareInputText{227}{\quotedblbase} +\DeclareInputText{228}{\textperthousand} +\DeclareInputText{229}{\^A} +\DeclareInputText{230}{\^E} +\DeclareInputText{231}{\@tabacckludge'A} +\DeclareInputText{232}{\"E} +\DeclareInputText{233}{\@tabacckludge`E} +\DeclareInputText{234}{\@tabacckludge'I} +\DeclareInputText{235}{\^I} +\DeclareInputText{236}{\"I} +\DeclareInputText{237}{\@tabacckludge`I} +\DeclareInputText{238}{\@tabacckludge'O} +\DeclareInputText{239}{\^O} +\DeclareInputText{240}{\textapplelogo} +\DeclareInputText{241}{\@tabacckludge`O} +\DeclareInputText{242}{\@tabacckludge'U} +\DeclareInputText{243}{\^U} +\DeclareInputText{244}{\@tabacckludge`U} +\DeclareInputText{245}{\i} +\DeclareInputText{246}{\^{}} +\DeclareInputText{247}{\~{}} +\DeclareInputText{248}{\@tabacckludge={}} +\DeclareInputText{249}{\u{}} +\DeclareInputText{250}{\.{}} +\DeclareInputText{251}{\r{}} +\DeclareInputText{252}{\c\ } +\DeclareInputText{253}{\H{}} +\DeclareInputText{254}{\k\ } +\DeclareInputText{255}{\v{}} +%</applemac> +% \end{macrocode} +% +% This input encoding for the Apple Central European code page was +% contributed by Radek Tryc and Marcin Woli\'nski +% \verb=<wolinski@mimuw.edu.pl>=. +% +% \changes{v0.99b}{2002/06/16}{Added macce encoding (pr/3433)} +% \changes{v1.0d}{2004/02/05}{Reordered code} +% \changes{v1.0g}{2004/05/22}{Changed \cs{textellipsis} to \cs{dots} +% for consistency.} +% \changes{v1.0g}{2004/05/22}{Changed \cs{textdagger} to \cs{dag} +% for consistency.} +% \changes{v1.0g}{2004/05/22}{Changed \cs{textparagraph} to \cs{P} +% for consistency.} +% \changes{v1.0g}{2004/05/22}{Changed \cs{textsection} to \cs{S} +% for consistency.} +% \changes{v1.0g}{2004/05/22}{Changed \cs{textcopyright} to \cs{copyright} +% for consistency.} +% \begin{macrocode} +%<*applemacce> +\DeclareInputText{128}{\"A} +\DeclareInputText{131}{\@tabacckludge'E} +\DeclareInputText{132}{\k A} +\DeclareInputText{133}{\"O} +\DeclareInputText{134}{\"U} +\DeclareInputText{136}{\k a} +\DeclareInputText{137}{\v C} +\DeclareInputText{138}{\"a} +\DeclareInputText{139}{\v c} +\DeclareInputText{140}{\@tabacckludge'C} +\DeclareInputText{141}{\@tabacckludge'c} +\DeclareInputText{143}{\@tabacckludge'Z} +\DeclareInputText{144}{\@tabacckludge'z} +\DeclareInputText{151}{\@tabacckludge'o} +\DeclareInputText{159}{\"u} +\DeclareInputText{154}{\"o} +\DeclareInputText{133}{\"O} +\DeclareInputText{134}{\"U} +\DeclareInputText{153}{\^o} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\dag} +\DeclareInputText{161}{\textdegree} +\DeclareInputText{162}{\k E} +\DeclareInputText{163}{\pounds} +\DeclareInputText{164}{\S} +\DeclareInputText{165}{\textbullet} +\DeclareInputText{166}{\P} +\DeclareInputText{167}{\ss} +\DeclareInputText{168}{\textregistered} +\DeclareInputText{171}{\k e} +\DeclareInputText{193}{\@tabacckludge'N} +\DeclareInputText{169}{\copyright} +\DeclareInputText{184}{\l} +\DeclareInputText{196}{\@tabacckludge'n} +\DeclareInputText{199}{\guillemetleft} +\DeclareInputText{200}{\guillemetright} +\DeclareInputText{201}{\dots} +\DeclareInputText{202}{\nobreakspace} +\DeclareInputText{208}{\textendash} +\DeclareInputText{209}{\textemdash} +% \end{macrocode} +% +% \changes{v1.0e}{2004/05/03}{Typo in \cs{textquotedblleft} (pr/3673)} +% \begin{macrocode} +\DeclareInputText{210}{\textquotedblleft} +\DeclareInputText{211}{\textquotedblright} +\DeclareInputText{212}{\textquoteleft} +\DeclareInputText{213}{\textquoteright} +\DeclareInputText{214}{\textdiv} +\DeclareInputText{220}{\guilsinglleft} +\DeclareInputText{221}{\guilsinglright} +\DeclareInputText{222}{\v r} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{226}{\quotesinglbase} +\DeclareInputText{227}{\quotedblbase} +\DeclareInputText{229}{\@tabacckludge'S} +\DeclareInputText{230}{\@tabacckludge's} +\DeclareInputText{238}{\@tabacckludge'O} +\DeclareInputText{239}{\^O} +\DeclareInputText{251}{\.Z} +\DeclareInputText{252}{\L} +\DeclareInputText{253}{\.z} +%</applemacce> +% \end{macrocode} +% +% \section{The Next encoding} +% +% This input encoding is based on work by Stefan Ried +% (\texttt{stef@\linebreak[0]theo-phys.uni-essen.de} and Holger Uhr +% (\texttt{huhr@\linebreak[0]uni-paderborn.de}). +% +% Further extended by +% Jens Heise (\texttt{heisbeee@calvados.zrz.TU-Berlin.DE}). +% +% \changes{v0.9k}{1995/11/29}{Tidied up this encoding.} +% +% \changes{v0.9m}{1995/12/04}{Made fraction a math character.} +% \changes{v0.9n}{1995/12/10}{Made fraction a text character.} +% +% \changes{v0.94}{1997/12/17}{Changed \cs{textellipsis} to \cs{dots} +% for consistency.} +% \changes{v0.94}{1997/12/17}{Changed \cs{textquotesinglbase} to +% \cs{quotesinglbase}: this may be temporary.} +% \changes{v0.94}{1997/12/17}{Changed \cs{textquotedblbase} to +% \cs{quotedblbase}: this may be temporary.} +% \changes{v0.96}{1998/03/02}{Fixed typo in slot 159.} +% \changes{v0.997}{2000/12/02}{Added all missing chars. (pr/3281)} +% +% \begin{macrocode} +%<*next> +\DeclareInputText{128}{\nobreakspace} +\DeclareInputText{129}{\@tabacckludge`A} +\DeclareInputText{130}{\@tabacckludge'A} +\DeclareInputText{131}{\^A} +\DeclareInputText{132}{\~A} +\DeclareInputText{133}{\"A} +\DeclareInputText{134}{\r A} +\DeclareInputText{135}{\c C} +\DeclareInputText{136}{\@tabacckludge`E} +\DeclareInputText{137}{\@tabacckludge'E} +\DeclareInputText{138}{\^E} +\DeclareInputText{139}{\"E} +\DeclareInputText{140}{\@tabacckludge`I} +\DeclareInputText{141}{\@tabacckludge'I} +\DeclareInputText{142}{\^I} +\DeclareInputText{143}{\"I} +\DeclareInputText{144}{\DH} +\DeclareInputText{145}{\~N} +\DeclareInputText{146}{\@tabacckludge`O} +\DeclareInputText{147}{\@tabacckludge'O} +\DeclareInputText{148}{\^O} +\DeclareInputText{149}{\~O} +\DeclareInputText{150}{\"O} +\DeclareInputText{151}{\@tabacckludge`U} +\DeclareInputText{152}{\@tabacckludge'U} +\DeclareInputText{153}{\^U} +\DeclareInputText{154}{\"U} +\DeclareInputText{155}{\@tabacckludge'Y} +\DeclareInputText{156}{\TH} +\DeclareInputMath{157}{\mu} +\DeclareInputMath{158}{\times} +\DeclareInputMath{159}{\div} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\copyright} +\DeclareInputText{161}{\textexclamdown} +\DeclareInputText{162}{\textcent} +\DeclareInputText{163}{\pounds} +\DeclareInputMath{164}{/} +\DeclareInputText{165}{\textyen} +\DeclareInputText{166}{\textflorin} +\DeclareInputText{167}{\S} +\DeclareInputText{168}{\textcurrency} +\DeclareInputText{169}{\textquoteright} +\DeclareInputText{170}{\textquotedblleft} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputText{172}{\guilsinglleft} +\DeclareInputText{173}{\guilsinglright} +\DeclareInputText{174}{fi} +\DeclareInputText{175}{fl} +\DeclareInputText{176}{\textregistered} +\DeclareInputText{177}{\textendash} +\DeclareInputText{178}{\dag} +\DeclareInputText{179}{\ddag} +\DeclareInputText{180}{\textperiodcentered} +\DeclareInputText{181}{\textbrokenbar} +\DeclareInputText{182}{\P} +\DeclareInputText{183}{\textbullet} +\DeclareInputText{184}{\quotesinglbase} +\DeclareInputText{185}{\quotedblbase} +\DeclareInputText{186}{\textquotedblright} +\DeclareInputText{187}{\guillemetright} +\DeclareInputText{188}{\dots} +\DeclareInputText{189}{\textperthousand} +\DeclareInputMath{190}{\lnot} +\DeclareInputText{191}{\textquestiondown} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputMath{192}{\mathonesuperior} +\DeclareInputText{193}{\@tabacckludge`{}} +\DeclareInputText{194}{\@tabacckludge'{}} +\DeclareInputText{195}{\^{}} +\DeclareInputText{196}{\~{}} +\DeclareInputText{197}{\@tabacckludge={}} +\DeclareInputText{198}{\u{}} +\DeclareInputText{199}{\.{}} +\DeclareInputText{200}{\"{}} +\DeclareInputMath{201}{\mathtwosuperior} +\DeclareInputText{202}{\r{}} +\DeclareInputText{203}{\c\ } +\DeclareInputMath{204}{\maththreesuperior} +\DeclareInputText{205}{\H{}} +\DeclareInputText{206}{\k\ } +\DeclareInputText{207}{\v{}} +\DeclareInputText{208}{\textemdash} +\DeclareInputMath{209}{\pm} +\DeclareInputText{210}{\textonequarter} +\DeclareInputText{211}{\textonehalf} +\DeclareInputText{212}{\textthreequarters} +\DeclareInputText{213}{\@tabacckludge`a} +\DeclareInputText{214}{\@tabacckludge'a} +\DeclareInputText{215}{\^a} +\DeclareInputText{216}{\~a} +\DeclareInputText{217}{\"a} +\DeclareInputText{218}{\r a} +\DeclareInputText{219}{\c c} +\DeclareInputText{220}{\@tabacckludge`e} +\DeclareInputText{221}{\@tabacckludge'e} +\DeclareInputText{222}{\^e} +\DeclareInputText{223}{\"e} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge`\i} +\DeclareInputText{225}{\AE} +\DeclareInputText{226}{\@tabacckludge'\i} +\DeclareInputText{227}{\textordfeminine} +\DeclareInputText{228}{\^\i} +\DeclareInputText{229}{\"\i} +\DeclareInputText{230}{\dh} +\DeclareInputText{231}{\~n} +\DeclareInputText{232}{\L} +\DeclareInputText{233}{\O} +\DeclareInputText{234}{\OE} +\DeclareInputText{235}{\textordmasculine} +\DeclareInputText{236}{\@tabacckludge`o} +\DeclareInputText{237}{\@tabacckludge'o} +\DeclareInputText{238}{\^o} +\DeclareInputText{239}{\~o} +\DeclareInputText{240}{\"o} +\DeclareInputText{241}{\ae} +\DeclareInputText{242}{\@tabacckludge`u} +\DeclareInputText{243}{\@tabacckludge'u} +\DeclareInputText{244}{\^u} +\DeclareInputText{245}{\i} +\DeclareInputText{246}{\"u} +\DeclareInputText{247}{\@tabacckludge'y} +\DeclareInputText{248}{\l} +\DeclareInputText{249}{\o} +\DeclareInputText{250}{\oe} +\DeclareInputText{251}{\ss} +\DeclareInputText{252}{\th} +\DeclareInputText{253}{\"y} +%</next> +% \end{macrocode} +% +% +% +% \changes{v0.9a}{1995/04/23}{\cs{textonequarter} and friends should +% be declared with \cs{DeclareInputText}} +% \section{The MS Windows ANSI encoding cp1252,\\ +% and the ISO Latin-1 and Latin-9 encodings} +% +% The MS Windows ANSI, cp 1252, input encoding was contributed by +% Berthold K.P. Horn (\texttt{bkph@\linebreak[0]ai.mit.edu}). +% +% It has two very different names so the same code produces two files. +% These encoding files both define the characters in the +% MS Windows 3.1 ANSI encoding (Western Europe), also known as code +% page 1252, which is based on ISO Latin-1 but has important additions +% in the 128--159 range. +% +% Designed for: +% Danish, Dutch, English, Finnish, French, German, Icelandic, +% Italian, Norwegian, Portuguese, Spanish, and Swedish. +% +% Note: Windows ANSI --- like Macintosh standard Roman encoding --- +% has quotesingle at 39, and grave at 96 --- which is here +% ignored. +% +% The ISO Latin-1 encoding file defines only the restricted range of +% characters available in the ISO~8859-1 encoding. +% +% The ISO~Latin-9 encoding file defines the characters in the +% ISO~8859-15 encoding. It was contributed by Karsten Tinnefeld +% (\texttt{karsten@tinnefeld.com}). +% It differs only a small amount from ISO~Latin-1 and is a +% replacement for it that contains a few characters that are needed for +% French and Finnish. Further, a slot for the Euro currency sign has +% been added and this could be the killer argument for many 8-bit +% texts to be written in Latin-9 in the future. +% +% According to a Linux man page, ISO~Latin-9 supports Albanian, Basque, +% Breton, Catalan, Danish, Dutch, +% English, Estonian, Faroese, Finnish, French, Frisian, Galician, German, +% Greenlandic, Icelandic, Irish Gaelic, Italian, Latin, Luxemburgish, +% Norwegian, Portuguese, Rhaeto-Romanic, Scottish Gaelic, Spanish and +% Swedish. +% +% The characters added in |latin9.def| are (in \LaTeX{} notation): +% \begin{verbatim} +% \texteuro, \v S \v s \v Z \v z \OE \oe \" Y +% \end{verbatim} +% They displace the following characters from |latin1.def|: +% \begin{verbatim} +% \textcurrency \textbrokenbar \"{} \'{} \c{} +% \textonequarter \textonehalf \textthreequarters +% \end{verbatim} +% +% \changes{v0.9e}{1995/08/31}{Redeclared "AD to be soft hyphen.} +% \changes{v0.9e}{1995/08/31}{Swapped ordfeminine and ordmasculine.} +% +% \changes{v0.9p}{1996/04/11}{ansinew 09f is \"Y not \"y, latex/2119} +% +% \changes{v0.91}{1997/08/19}{Exchanged codes for +% \cs{textendash} and \cs{textemdash}.} +% +% \changes{v0.94}{1997/12/17}{Added cp1252 and merged latin1} +% \changes{v0.94}{1997/12/17}{Changed \cs{ldots} to \cs{dots}, this +% should be undetectable since \cs{ldots} is not robust.} +% +% \changes{v0.99a}{2001/07/10}{Added latin9 (from Karsten Tinnefeld)} +% \changes{v0.99b}{2002/06/16}{Added code points 142,158 for cp1252 (pr/3441)} +% \changes{v0.99b}{2002/07/08}{Added code 128 (texteuro) for cp1252 (pr/3423)} +% +% \begin{macrocode} +%<*cp1252> +\DeclareInputText{128}{\texteuro} +\DeclareInputText{130}{\quotesinglbase} +\DeclareInputText{131}{\textflorin} +\DeclareInputText{132}{\quotedblbase} +\DeclareInputText{133}{\dots} +\DeclareInputText{134}{\dag} +\DeclareInputText{135}{\ddag} +\DeclareInputText{136}{\^{}} +\DeclareInputText{137}{\textperthousand} +\DeclareInputText{138}{\v S} +\DeclareInputText{139}{\guilsinglleft} +\DeclareInputText{140}{\OE} +\DeclareInputText{142}{\v Z} +\DeclareInputText{145}{\textquoteleft} +\DeclareInputText{146}{\textquoteright} +\DeclareInputText{147}{\textquotedblleft} +\DeclareInputText{148}{\textquotedblright} +\DeclareInputText{149}{\textbullet} +\DeclareInputText{150}{\textendash} +\DeclareInputText{151}{\textemdash} +\DeclareInputText{152}{\~{}} +\DeclareInputText{153}{\texttrademark} +\DeclareInputText{154}{\v s} +\DeclareInputText{155}{\guilsinglright} +\DeclareInputText{156}{\oe} +\DeclareInputText{158}{\v z} +\DeclareInputText{159}{\"Y} +%</cp1252> +% \end{macrocode} +% +% This (somewhat confused) table is now even more disordered: first +% we deal with those few characters that are different in latin9, +% then with the rest. +% +% \begin{macrocode} +%<*cp1252|latin1> +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{166}{\textbrokenbar} +\DeclareInputText{168}{\"{}} +\DeclareInputText{180}{\@tabacckludge'{}} +\DeclareInputText{184}{\c\ } +\DeclareInputText{188}{\textonequarter} +\DeclareInputText{189}{\textonehalf} +\DeclareInputText{190}{\textthreequarters} +%</cp1252|latin1> +% \end{macrocode} +% +% \begin{macrocode} +%<*latin9> +\DeclareInputText{164}{\texteuro} +\DeclareInputText{166}{\v S} +\DeclareInputText{168}{\v s} +\DeclareInputText{180}{\v Z} +\DeclareInputText{184}{\v z} +\DeclareInputText{188}{\OE} +\DeclareInputText{189}{\oe} +\DeclareInputText{190}{\"Y} +%</latin9> +% \end{macrocode} +% +% \begin{macrocode} +%<*cp1252|latin1|latin9> +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{176}{\textdegree} +\DeclareInputText{161}{\textexclamdown} +\DeclareInputMath{177}{\pm} +\DeclareInputText{162}{\textcent} +\DeclareInputMath{178}{\mathtwosuperior} +\DeclareInputText{163}{\pounds} +\DeclareInputMath{179}{\maththreesuperior} +\DeclareInputText{165}{\textyen} +\DeclareInputMath{181}{\mu} +\DeclareInputText{182}{\P} +\DeclareInputText{167}{\S} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{169}{\copyright} +\DeclareInputMath{185}{\mathonesuperior} +\DeclareInputText{170}{\textordfeminine} +\DeclareInputText{186}{\textordmasculine} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputText{187}{\guillemetright} +\DeclareInputMath{172}{\lnot} +\DeclareInputText{173}{\-} +\DeclareInputText{174}{\textregistered} +\DeclareInputText{175}{\@tabacckludge={}} +\DeclareInputText{191}{\textquestiondown} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge`A} +\DeclareInputText{208}{\DH} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{209}{\~N} +\DeclareInputText{194}{\^A} +\DeclareInputText{210}{\@tabacckludge`O} +\DeclareInputText{195}{\~A} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{196}{\"A} +\DeclareInputText{212}{\^O} +\DeclareInputText{197}{\r A} +\DeclareInputText{213}{\~O} +\DeclareInputText{198}{\AE} +\DeclareInputText{214}{\"O} +\DeclareInputText{199}{\c C} +\DeclareInputMath{215}{\times} +\DeclareInputText{200}{\@tabacckludge`E} +\DeclareInputText{216}{\O} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{217}{\@tabacckludge`U} +\DeclareInputText{202}{\^E} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{203}{\"E} +\DeclareInputText{219}{\^U} +\DeclareInputText{204}{\@tabacckludge`I} +\DeclareInputText{220}{\"U} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{221}{\@tabacckludge'Y} +\DeclareInputText{206}{\^I} +\DeclareInputText{222}{\TH} +\DeclareInputText{207}{\"I} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge`a} +\DeclareInputText{240}{\dh} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{241}{\~n} +\DeclareInputText{226}{\^a} +\DeclareInputText{242}{\@tabacckludge`o} +\DeclareInputText{227}{\~a} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{228}{\"a} +\DeclareInputText{244}{\^o} +\DeclareInputText{229}{\r a} +\DeclareInputText{245}{\~o} +\DeclareInputText{230}{\ae} +\DeclareInputText{246}{\"o} +\DeclareInputText{231}{\c c} +\DeclareInputMath{247}{\div} +\DeclareInputText{232}{\@tabacckludge`e} +\DeclareInputText{248}{\o} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{249}{\@tabacckludge`u} +\DeclareInputText{234}{\^e} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{235}{\"e} +\DeclareInputText{251}{\^u} +\DeclareInputText{236}{\@tabacckludge`\i} +\DeclareInputText{252}{\"u} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{253}{\@tabacckludge'y} +\DeclareInputText{238}{\^\i} +\DeclareInputText{254}{\th} +\DeclareInputText{239}{\"\i} +\DeclareInputText{255}{\"y} +%</cp1252|latin1|latin9> +% \end{macrocode} +% +% +%\section{The ISO 8859-16 (Latin10) encoding} +% +% \changes{v1.0c}{2004/02/04}{Added ISO 8859-16 Latin10 (pr/3568)} +% +% This set of coded graphic characters is intended for use in data and +% text processing applications and also for information interchange. The +% set contains graphic characters used for general purpose applications in +% typical office environments in at least the following languages: +% Albanian, Croatian, English, Finnish, French, German, Hungarian, Irish +% Gaelic (new orthography), Italian, Latin, Polish, Romanian, and +% Slovenian. This set of coded graphic characters may be regarded as a +% version of an 8-bit code according to ISO/IEC 2022 or ISO/IEC 4873 at +% level 1. [ISO 8859-16:2001(E), p. 1] +% +% ISO 8859-16 was primarily designed for single-byte encoding the Romanian +% language. The UTF-8 charset is the preferred and in today's MIME software +% more widely implemented encoding suitable for Romanian. +% +% Data for the \LaTeX{} support was mainly provided by Ionel Ciob\^{i}c\u{a} +% with additions and corrections taken from\\ +% \texttt{https://www.unicode.org/Public/MAPPINGS/ISO8859/8859-16.TXT}. +% +% \changes{v1.1b}{2006/03/03}{Corrections (pr/3849)} +% +% \begin{macrocode} +%<*latin10> +% \end{macrocode} +% The ``comma below'' accent is provided here in a crude (better +% than nothing) version. +% \begin{macrocode} +\ProvideTextCommandDefault\textcommabelow[1] + {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth + \raise-.31ex\hbox{\check@mathfonts +% \end{macrocode} +% Use |\sf@size| instead of |\ssf@size| if the comma looks too small: +% \begin{macrocode} + \fontsize\ssf@size\z@ + \math@fontsfalse\selectfont,}\hidewidth}\egroup} +% \end{macrocode} +% +% \begin{macrocode} +\ProvideTextCommandDefault\textpm{\ensuremath\pm} +% \end{macrocode} +% But why only for this one encoding? (Answer: because it is a new encoding: +% it contains only LICR objects --- Frank) +% \changes{v1.0g}{2004/05/22}{Changed \cs{textpm} to \cs{pm}} +% \changes{v1.1b}{2006/03/03}{Reverted back to \cs{textpm} +% for consistency.} +% \begin{macrocode} +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{161}{\k A} +\DeclareInputText{162}{\k a} +\DeclareInputText{163}{\L} +\DeclareInputText{164}{\texteuro} +\DeclareInputText{165}{\quotedblbase} +\DeclareInputText{166}{\v S} +\DeclareInputText{167}{\S} +\DeclareInputText{168}{\v s} +\DeclareInputText{169}{\textcopyright} +\DeclareInputText{170}{\textcommabelow S} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputText{172}{\@tabacckludge'Z} +\DeclareInputText{173}{\-} +\DeclareInputText{174}{\@tabacckludge'z} +\DeclareInputText{175}{\.Z} +\DeclareInputText{176}{\textdegree} +\DeclareInputText{177}{\textpm} +\DeclareInputText{178}{\v C} +\DeclareInputText{179}{\l} +\DeclareInputText{180}{\v Z} +\DeclareInputText{181}{\textquotedblright} +\DeclareInputText{182}{\P} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{184}{\v z} +\DeclareInputText{185}{\v c} +\DeclareInputText{186}{\textcommabelow s} +\DeclareInputText{187}{\guillemetright} +\DeclareInputText{188}{\OE} +\DeclareInputText{189}{\oe} +\DeclareInputText{190}{\"Y} +\DeclareInputText{191}{\.z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge`A} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{194}{\^A} +\DeclareInputText{195}{\u A} +\DeclareInputText{196}{\"A} +\DeclareInputText{197}{\@tabacckludge'C} +\DeclareInputText{198}{\AE} +\DeclareInputText{199}{\c C} +\DeclareInputText{200}{\@tabacckludge`E} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{202}{\^E} +\DeclareInputText{203}{\"E} +\DeclareInputText{204}{\@tabacckludge`I} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{206}{\^I} +\DeclareInputText{207}{\"I} +\DeclareInputText{208}{\DJ} +\DeclareInputText{209}{\@tabacckludge'N} +\DeclareInputText{210}{\@tabacckludge`O} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{212}{\^O} +\DeclareInputText{213}{\H O} +\DeclareInputText{214}{\"O} +\DeclareInputText{215}{\@tabacckludge'S} +\DeclareInputText{216}{\H U} +\DeclareInputText{217}{\@tabacckludge`U} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{219}{\^U} +\DeclareInputText{220}{\"U} +\DeclareInputText{221}{\k E} +\DeclareInputText{222}{\textcommabelow T} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{223}{\ss} +\DeclareInputText{224}{\@tabacckludge`a} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{226}{\^a} +\DeclareInputText{227}{\u a} +\DeclareInputText{228}{\"a} +\DeclareInputText{229}{\@tabacckludge'c} +\DeclareInputText{230}{\ae} +\DeclareInputText{231}{\c c} +\DeclareInputText{232}{\@tabacckludge`e} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{234}{\^e} +\DeclareInputText{235}{\"e} +\DeclareInputText{236}{\@tabacckludge`\i} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{238}{\^\i} +\DeclareInputText{239}{\"\i} +\DeclareInputText{240}{\dj} +\DeclareInputText{241}{\@tabacckludge'n} +\DeclareInputText{242}{\@tabacckludge`o} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{244}{\^o} +\DeclareInputText{245}{\H o} +\DeclareInputText{246}{\"o} +\DeclareInputText{247}{\@tabacckludge's} +\DeclareInputText{248}{\H u} +\DeclareInputText{249}{\@tabacckludge`u} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{251}{\^u} +\DeclareInputText{252}{\"u} +\DeclareInputText{253}{\k e} +\DeclareInputText{254}{\textcommabelow t} +\DeclareInputText{255}{\"y} +%</latin10> +% \end{macrocode} +% +%\section{The MS Windows encoding cp1250} +% +% This is an MS Windows encoding for Central and Eastern Europe, +% known as Code Page 1250; it was provided by Marcin Woli\'nski +% \texttt{wolinski@melkor.mimuw.edu.pl} and edited by Chris Rowley +% (see v0.94 below) to make it consistent with other files. +% +% \changes{v0.94}{1997/12/17}{Changed \cs{textellipsis} to \cs{dots} +% for consistency.} +% \changes{v0.94}{1997/12/17}{Changed \cs{textdagger} to \cs{dag} +% for consistency.} +% \changes{v0.94}{1997/12/17}{Changed \cs{textparagraph} to \cs{P} +% for consistency.} +% \changes{v0.94}{1997/12/17}{Changed \cs{textsection} to \cs{S} +% for consistency.} +% \changes{v0.99b}{2002/07/28}{Added code 128 (texteuro) for cp1250} +% \begin{macrocode} +%<*cp1250> +\DeclareInputText{128}{\texteuro} +%\DeclareInputText{129}{} % n/u +\DeclareInputText{130}{\quotesinglbase} +%\DeclareInputText{131}{} % n/u +\DeclareInputText{132}{\quotedblbase} +\DeclareInputText{133}{\dots} +\DeclareInputText{134}{\dag} +\DeclareInputText{135}{\ddag} +%\DeclareInputText{136}{} % n/u +\DeclareInputText{137}{\textperthousand} +\DeclareInputText{138}{\v S} +\DeclareInputText{139}{\guilsinglleft} +\DeclareInputText{140}{\@tabacckludge'S} +\DeclareInputText{141}{\v T} +\DeclareInputText{142}{\v Z} +\DeclareInputText{143}{\@tabacckludge'Z} +%\DeclareInputText{144}{} % n/u +\DeclareInputText{145}{\textquoteleft} +\DeclareInputText{146}{\textquoteright} +\DeclareInputText{147}{\textquotedblleft} +\DeclareInputText{148}{\textquotedblright} +\DeclareInputText{149}{\textbullet} +\DeclareInputText{150}{\textendash} +\DeclareInputText{151}{\textemdash} +%\DeclareInputText{152}{} % n/u +\DeclareInputText{153}{\texttrademark} +\DeclareInputText{154}{\v s} +\DeclareInputText{155}{\guilsinglright} +\DeclareInputText{156}{\@tabacckludge's} +\DeclareInputText{157}{\v t} % t caron (t') ? +\DeclareInputText{158}{\v z} +\DeclareInputText{159}{\@tabacckludge'z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{161}{\v{}} +\DeclareInputText{162}{\u{}} +\DeclareInputText{163}{\L} +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{165}{\k A} +\DeclareInputText{166}{\textbrokenbar} +\DeclareInputText{167}{\S} +\DeclareInputText{168}{\"{}} +\DeclareInputText{169}{\copyright} +\DeclareInputText{170}{\c S} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputMath{172}{\lnot} +\DeclareInputText{173}{\-}% soft hyphen +\DeclareInputText{174}{\textregistered} +\DeclareInputText{175}{\.Z} +\DeclareInputText{176}{\textdegree} +\DeclareInputMath{177}{\pm}% plus-minus +\DeclareInputText{178}{\k\ } +\DeclareInputText{179}{\l} +\DeclareInputText{180}{\@tabacckludge'{}} +\DeclareInputMath{181}{\mu}% micro sign +\DeclareInputText{182}{\P} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{184}{\c\ } +\DeclareInputText{185}{\k a} +\DeclareInputText{186}{\c s} +\DeclareInputText{187}{\guillemetright} +\DeclareInputText{188}{\v L}% L caron (L') ? +\DeclareInputText{189}{\H{}} +\DeclareInputText{190}{\v l}% l caron (l') ? +\DeclareInputText{191}{\.z} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\@tabacckludge'R} +\DeclareInputText{193}{\@tabacckludge'A} +\DeclareInputText{194}{\^A} +\DeclareInputText{195}{\u A} +\DeclareInputText{196}{\"A} +\DeclareInputText{197}{\@tabacckludge'L} +\DeclareInputText{198}{\@tabacckludge'C} +\DeclareInputText{199}{\c C} +\DeclareInputText{200}{\v C} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{202}{\k E} +\DeclareInputText{203}{\"E} +\DeclareInputText{204}{\v E} +\DeclareInputText{205}{\@tabacckludge'I} +\DeclareInputText{206}{\^I} +\DeclareInputText{207}{\v D} +\DeclareInputText{208}{\DJ} % D stroke +\DeclareInputText{209}{\@tabacckludge'N} +\DeclareInputText{210}{\v N} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{212}{\^O} +\DeclareInputText{213}{\H O} +\DeclareInputText{214}{\"O} +\DeclareInputMath{215}{\times} +\DeclareInputText{216}{\v R} +\DeclareInputText{217}{\r U} +\DeclareInputText{218}{\@tabacckludge'U} +\DeclareInputText{219}{\H U} +\DeclareInputText{220}{\"U} +\DeclareInputText{221}{\@tabacckludge'Y} +\DeclareInputText{222}{\c T} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\@tabacckludge'r} +\DeclareInputText{225}{\@tabacckludge'a} +\DeclareInputText{226}{\^a} +\DeclareInputText{227}{\u a} +\DeclareInputText{228}{\"a} +\DeclareInputText{229}{\@tabacckludge'l} +\DeclareInputText{230}{\@tabacckludge'c} +\DeclareInputText{231}{\c c} +\DeclareInputText{232}{\v c} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{234}{\k e} +\DeclareInputText{235}{\"e} +\DeclareInputText{236}{\v e} +\DeclareInputText{237}{\@tabacckludge'\i} +\DeclareInputText{238}{\^\i} +\DeclareInputText{239}{\v d} % d caron (d') ? +\DeclareInputText{240}{\dj} % d stroke +\DeclareInputText{241}{\@tabacckludge'n} +\DeclareInputText{242}{\v n} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{244}{\^o} +\DeclareInputText{245}{\H o} +\DeclareInputText{246}{\"o} +\DeclareInputMath{247}{\div} +\DeclareInputText{248}{\v r} +\DeclareInputText{249}{\r u} +\DeclareInputText{250}{\@tabacckludge'u} +\DeclareInputText{251}{\H u} +\DeclareInputText{252}{\"u} +\DeclareInputText{253}{\@tabacckludge'y} +\DeclareInputText{254}{\c t} +\DeclareInputText{255}{\.{}} +%</cp1250> +% \end{macrocode} +% +% +%\section{The MS Windows encoding cp1257} +% +% This is an MS Windows encoding for Baltic languages, +% known as Code Page 1257; provided by Heiko Oberdiek +% using the mappings to Unicode in\\ +% \texttt{https://www.unicode.org/\\Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1257.TXT}\\ +% and\\ +% \texttt{http://www.microsoft.com/globaldev/reference/sbcs/1257.mspx}. +% +% \changes{v1.1b}{2006/03/03}{Large number of corrections (pr/3849)} +% \begin{macrocode} +%<*cp1257> +\DeclareInputText{128}{\texteuro} +\DeclareInputText{130}{\quotesinglbase} +\DeclareInputText{132}{\quotedblbase} +\DeclareInputText{133}{\dots} +\DeclareInputText{134}{\dag} +\DeclareInputText{135}{\ddag} +\DeclareInputText{137}{\textperthousand} +\DeclareInputText{139}{\guilsinglleft} +\DeclareInputText{141}{\"{}} +\DeclareInputText{142}{\v{}} +\DeclareInputText{143}{\c\ } +\DeclareInputText{145}{\textquoteleft} +\DeclareInputText{146}{\textquoteright} +\DeclareInputText{147}{\textquotedblleft} +\DeclareInputText{148}{\textquotedblright} +\DeclareInputText{149}{\textbullet} +\DeclareInputText{150}{\textendash} +\DeclareInputText{151}{\textemdash} +\DeclareInputText{153}{\texttrademark} +\DeclareInputText{155}{\guilsinglright} +\DeclareInputText{157}{\@tabacckludge={}} +\DeclareInputText{158}{\k\ } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{160}{\nobreakspace} +\DeclareInputText{162}{\textcent} +\DeclareInputText{163}{\pounds} +\DeclareInputText{164}{\textcurrency} +\DeclareInputText{166}{\textbrokenbar} +\DeclareInputText{167}{\S} +\DeclareInputText{168}{\O} +\DeclareInputText{169}{\copyright} +\DeclareInputText{170}{\c R} +\DeclareInputText{171}{\guillemetleft} +\DeclareInputMath{172}{\lnot} +\DeclareInputText{173}{\-} +\DeclareInputText{174}{\textregistered} +\DeclareInputText{175}{\AE} +\DeclareInputText{176}{\textdegree} +\DeclareInputMath{177}{\pm} +\DeclareInputMath{178}{\mathtwosuperior} +\DeclareInputMath{179}{\maththreesuperior} +\DeclareInputText{180}{\@tabacckludge'{}} +\DeclareInputMath{181}{\mu} +\DeclareInputText{182}{\P} +\DeclareInputText{183}{\textperiodcentered} +\DeclareInputText{184}{\o} +\DeclareInputMath{185}{\mathonesuperior} +\DeclareInputText{186}{\c r} +\DeclareInputText{187}{\guillemetright} +\DeclareInputText{188}{\textonequarter} +\DeclareInputText{189}{\textonehalf} +\DeclareInputText{190}{\textthreequarters} +\DeclareInputText{191}{\ae} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{192}{\k A} +\DeclareInputText{193}{\k I} +\DeclareInputText{194}{\@tabacckludge=A} +\DeclareInputText{195}{\@tabacckludge'C} +\DeclareInputText{196}{\"A} +\DeclareInputText{197}{\r A} +\DeclareInputText{198}{\k E} +\DeclareInputText{199}{\@tabacckludge=E} +\DeclareInputText{200}{\v C} +\DeclareInputText{201}{\@tabacckludge'E} +\DeclareInputText{202}{\@tabacckludge'Z} +\DeclareInputText{203}{\.{E}} +\DeclareInputText{204}{\c G} +\DeclareInputText{205}{\c K} +\DeclareInputText{206}{\@tabacckludge=I} +\DeclareInputText{207}{\c L} +\DeclareInputText{208}{\v S} +\DeclareInputText{209}{\@tabacckludge'N} +\DeclareInputText{210}{\c N} +\DeclareInputText{211}{\@tabacckludge'O} +\DeclareInputText{212}{\@tabacckludge=O} +\DeclareInputText{213}{\~O} +\DeclareInputText{214}{\"O} +\DeclareInputMath{215}{\times} +\DeclareInputText{216}{\k U} +\DeclareInputText{217}{\L} +\DeclareInputText{218}{\@tabacckludge'S} +\DeclareInputText{219}{\@tabacckludge=U} +\DeclareInputText{220}{\"U} +\DeclareInputText{221}{\.Z} +\DeclareInputText{222}{\v Z} +\DeclareInputText{223}{\ss} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareInputText{224}{\k a} +\DeclareInputText{225}{\k i} +\DeclareInputText{226}{\@tabacckludge=a} +\DeclareInputText{227}{\@tabacckludge'c} +\DeclareInputText{228}{\"a} +\DeclareInputText{229}{\r a} +\DeclareInputText{230}{\k e} +\DeclareInputText{231}{\@tabacckludge=e} +\DeclareInputText{232}{\v c} +\DeclareInputText{233}{\@tabacckludge'e} +\DeclareInputText{234}{\@tabacckludge'z} +\DeclareInputText{235}{\.{e}} +\DeclareInputText{236}{\c g} +\DeclareInputText{237}{\c k} +\DeclareInputText{238}{\@tabacckludge=\i} +\DeclareInputText{239}{\c l} +\DeclareInputText{240}{\v s} +\DeclareInputText{241}{\@tabacckludge'n} +\DeclareInputText{242}{\c n} +\DeclareInputText{243}{\@tabacckludge'o} +\DeclareInputText{244}{\@tabacckludge=o} +\DeclareInputText{245}{\~o} +\DeclareInputText{246}{\"o} +\DeclareInputMath{247}{\div} +\DeclareInputText{248}{\k u} +\DeclareInputText{249}{\l} +\DeclareInputText{250}{\@tabacckludge's} +\DeclareInputText{251}{\@tabacckludge=u} +\DeclareInputText{252}{\"u} +\DeclareInputText{253}{\.z} +\DeclareInputText{254}{\v z} +\DeclareInputText{255}{\.{}} +%</cp1257> +% \end{macrocode} +% +% \DeleteShortVerb{\|} +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/inputenc.ins b/Master/texmf-dist/source/latex-dev/base/inputenc.ins new file mode 100644 index 00000000000..80993e28197 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/inputenc.ins @@ -0,0 +1,181 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2019 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\askonceonly + +\usedir{tex/latex/base} + +\Msg{*** Generating input encoding files ***} + +\generate{ + \file{inputenc.sty}{ + \from{inputenc.dtx}{package}} + \file{latin1.def}{ + \from{inputenc.dtx}{latin1}} + \file{latin2.def}{ + \from{inputenc.dtx}{latin2}} + \file{latin3.def}{ + \from{inputenc.dtx}{latin3}} + \file{latin4.def}{ + \from{inputenc.dtx}{latin4}} + \file{latin5.def}{ + \from{inputenc.dtx}{latin5}} + \file{latin9.def}{ + \from{inputenc.dtx}{latin9}} + \file{latin10.def}{ + \from{inputenc.dtx}{latin10}} + } + + + + \generate{ + \file{cp850.def}{ + \from{inputenc.dtx}{cp850}} + \file{cp852.def}{ + \from{inputenc.dtx}{cp852}} + \file{cp858.def}{ + \from{inputenc.dtx}{cp858}} + \file{cp865.def}{ + \from{inputenc.dtx}{cp865}} + \file{cp437.def}{ + \from{inputenc.dtx}{cp437}} + \file{cp437de.def}{ + \from{inputenc.dtx}{cp437de}} + \file{decmulti.def}{ + \from{inputenc.dtx}{decmulti}} + } + + \generate{ + \file{ascii.def}{ + \from{inputenc.dtx}{ascii}} + \file{applemac.def}{ + \from{inputenc.dtx}{applemac}} + \file{macce.def}{ + \from{inputenc.dtx}{applemacce}} + \file{next.def}{ + \from{inputenc.dtx}{next}} + \file{ansinew.def}{% synonym for cp1252 + \from{inputenc.dtx}{cp1252,ansinew}} + \file{cp1250.def}{ + \from{inputenc.dtx}{cp1250}} + \file{cp1252.def}{ + \from{inputenc.dtx}{cp1252}} + \file{cp1257.def}{ + \from{inputenc.dtx}{cp1257}} + } + +\Msg{*** Generating utf8 input encoding files ***} + +\generate{\file{utf8.def}{\from{utf8ienc.dtx}{utf8}} + \file{utf8-test.tex}{\from{utf8ienc.dtx}{test}} + \file{lcyenc.dfu}{\from{utf8ienc.dtx}{lcy}} + \file{ly1enc.dfu}{\from{utf8ienc.dtx}{ly1}} + \file{omsenc.dfu}{\from{utf8ienc.dtx}{oms}} + \file{ot1enc.dfu}{\from{utf8ienc.dtx}{ot1}} + \file{ot2enc.dfu}{\from{utf8ienc.dtx}{ot2}} + \file{t1enc.dfu}{\from{utf8ienc.dtx}{t1}} + \file{utf8-2018.def}{\from{utf8ienc.dtx}{utf8-2018}} +} +\generate{\file{t2aenc.dfu}{\from{utf8ienc.dtx}{t2a}} + \file{t2benc.dfu}{\from{utf8ienc.dtx}{t2b}} + \file{t2cenc.dfu}{\from{utf8ienc.dtx}{t2c}} + \file{ts1enc.dfu}{\from{utf8ienc.dtx}{ts1}} + \file{x2enc.dfu}{\from{utf8ienc.dtx}{x2}} + \file{utf8enc.dfu}{\from{utf8ienc.dtx}{all}} + \file{utf8test.tex}{\from{utf8ienc.dtx}{test}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space *.def *.dfu *.sty } +\Msg{*} +\Msg{* To produce the documentation run inputenc.dtx and } +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/latex209.dtx b/Master/texmf-dist/source/latex-dev/base/latex209.dtx new file mode 100644 index 00000000000..cc5563c632a --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/latex209.dtx @@ -0,0 +1,1136 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \title{Compatibility mode for \LaTeXe{} emulating \LaTeX~2.09} +% \author{Alan Jeffrey and Frank Mittelbach} +% \date{1995/12/27} +% +% +% +% \changes{v0.01}{1993/12/11}{Created the file, including: +% setting the compatibility flag, +% inputting oldlfont.sty, +% setting the default encoding to be OT1, and +% inputting the latex209.rc file} +% \changes{v0.02}{1993/12/12}{Changed the package filename to +% latex209.sty, and added the provides-package command.} +% \changes{v0.03}{1993/12/16}{Added an empty mark, replaced +% provides-package with provides-file, added the compatibility hook.} +% \changes{v0.04}{1993/12/16}{Moved oldlfont.sty out of the +% compatibility hook and back into latex209.cmp. Redefined +% newfontswitch to ignore redefinitions. Set the LaTeX 2e commands +% to be errors.} +% \changes{v0.05}{1993/12/17} +% {Removed the \cs{mark}, since it is now in the kernel.} +% \changes{v0.06}{1993/12/18}{Replaced the redefinition of +% \cs{@newfontswitch} to a redefinition of \cs{@renewfontswitch}. +% Added \cs{sloppy.}} +% \changes{v0.07}{1993/12/18}{Fixed a bug with \cs{@missingfileerror}.} +% \changes{v0.08}{1993/12/18}{Added the obsolete .sty files.} +% \changes{v0.09}{1993/12/20}{Removed art10.sty and friends.} +% \changes{v0.10}{1994/01/14}{Replaced latex209.rc by latex209.cfg.} +% \changes{v0.11}{1994/01/21}{Replaced latex209.cmp by latex209.def. +% Moved half of oldlfont.dtx to here. Split the package dst option +% into head and tail.} +% \changes{v0.12}{1994/01/24} +% {Added \cs{normalshape} and \cs{mediumseries}, and +% declared the `oldlfont' option to stop oldlfont.sty from being +% loaded.} +% \changes{v0.13}{1994/01/31}{removed setting of \cs{normalsize}. FMi} +% \changes{v0.14}{1994/02/07}{Added it back again.} +% \changes{v0.15}{1994/02/10}{Renamed \cs{@compatibility} to +% \cs{@documentclasshook}. Added the check for whether +% \cs{normalsize} or \cs{@normalsize} needs defined.} +% \changes{v0.16}{1994/02/11}{Replaced the allocation of temporary +% dimens for \cs{footheight}, \cs{@maxsep} and \cs{@dblmaxsep} +% by real dimen variables.} +% \changes{v0.17}{1994/03/02}{Moved the documentation to the front, so +% this file can be processed directly without a driver file. +% Added \cs{@ptscale}, \cs{@halfmag}, \cs{@magscale}, and set the +% default font to be CMR at 10pt.} +% \changes{v0.18}{1994/03/11}{Restored the old definition of \cs{verb}. +% Set the catcodes of the non-alphanumerics.} +% \changes{v0.19}{1994/04/05}{Switched off more 2e features: \cs{lrbox}, +% \cs{width}, \cs{height}, \cs{depth} in box dimensions, and the new +% optional arguments to \cs{parbox}, \cs{minipage} and +% \cs{newcommand}. The code was provided by DPC. Fixed a misplaced +% </head!>. Made the \cs{ProvidesPackage} and \cs{ProvidesClass} +% warnings log messages. Removed \cs{filedate}.} +% \changes{v0.20}{1994/04/20} +% {Restored the 2.09 definition of \cs{@noligs}.} +% \changes{v0.21}{1994/04/24} +% {Restored the 2.09 definition of \cs{@lquote}.} +% \changes{v0.22}{1994/05/02}{Added \cs{@latex@e@command}.} +% \changes{v0.23}{1994/05/11}{Added bezier.sty.} +% \changes{v0.24}{1994/05/14}{Removed \cs{@@@} and switched the box +% commands back on, for use in packages.} +% \changes{v0.24}{1994/05/14}{Changed the 2e command error help.} +% \changes{v0.24}{1994/05/14}{Removed date from announcement of +% 2.09 mode.} +% \changes{v0.25}{1994/05/14}{Added the newlfont option, and rewrote the +% oldlfont option.} +% \changes{v0.26}{1994/05/15}{Added the margid and nomargid options.} +% \changes{v0.27}{1994/05/16}{Fixed a bug with the margid option.} +% \changes{v0.28}{1994/05/16}{Fixed a bug with \cs{mediumseries}.} +% \changes{v0.29}{1994/05/17}{Fixed a bug with \cs{newlfont}.} +% \changes{v0.29}{1994/05/17}{Removed extra spaces from the missing +% file error.} +% \changes{v0.29}{1994/05/17}{Made the bezier package use \cs{iffalse} +% to comment itself out, rather than \%\%, which caused it to +% appear in every 2.09 file.} +% \changes{v0.30}{1994/05/18}{Added \cs{@finalstrut}.} +% \changes{v0.31}{1994/05/20}{New definition of \cs{@finalstrut}.} +% \changes{v0.31}{1994/05/20}{Added the t1enc package.} +% \changes{v0.32}{1994/05/20}{Added SLiTeX.} +% \changes{v0.33}{1994/06/01}{Fixed bug with SLiTeX.} +% \changes{v0.34}{1994/08/22}{Replaced l2euser by usrguide.} +% \changes{v0.34}{1994/08/22}{Added a default definition for \cs{+}.} +% \changes{v0.35}{1994/09/23} +% {Added spaces to the old font scale commands.} +% \changes{v0.36}{1994/10/17}{Added an empty \cs{mark} back again.} +% \changes{v0.37}{1994/10/20}{Corrected a typo.} +% \changes{v0.38}{1994/11/16}{Removed \cs{LaTeXe} from this list} +% \changes{v0.39}{1994/11/28}{Added old behaviour of floats and space.} +% \changes{v0.40}{1995/05/05}{Make \cs{verb} use \cs{tt} font in +% math mode.} +% \changes{v0.49}{1995/10/26}{Added code for fleqn.sty, leqno.sty, +% openbib.sty.} +% \changes{v0.50}{1995/12/08}{Switched of \cs{@inmathwarn}.} +% \changes{v0.53}{2015/02/22}{Dropped \cs{@no@font@optfalse} in various places +% - no longer provided by ltfsscmp.dtx.} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% +% The file |latex209.def| is read in by \LaTeXe{} whenever it finds a +% |\documentstyle| rather than |\documentclass| command at the +% beginning of the file. This indicates a \LaTeX~2.09 document, which +% should be processed in {\em compatibility mode}. +% +% Any document which compiled under \LaTeX~2.09 should compile under +% compatibility mode, unless it uses low-level commands such as +% |\tenrm|. +% +% \section{The docstrip modules} +% +% The following modules are used in the implementation to direct +% docstrip in generating the external files: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% head & produce the beginning of |latex209.def| \\ +% tail & produce the end of |latex209.def| \\ +% article & produce |article.sty| \\ +% book & produce |book.sty| \\ +% report & produce |report.sty| \\ +% slides & produce |slides.sty| \\ +% letter & produce |letter.sty| \\ +% bezier & produce |bezier.sty| \\ +% fleqn & produce |fleqn.sty| \\ +% leqno & produce |leqno.sty| \\ +% openbib & produce |openbib.sty| +% \end{tabular} +% \end{center} +% Between the |head| and |tail| of |latex209.def|, the code for +% |oldlfont.sty| is included, so \LaTeX~2.09 documents will +% automatically be run simulating the OFSS. +% \changes{v0.09}{1993/12/20}{Removed artN.sty, bkN.sty and repN.sty.} +% \changes{v0.11}{1994/01/21}{Split package into head and tail.} +% \changes{v0.23}{1994/05/11}{Added bezier option.} +% +% \StopEventually{} +% +% \section{Driver} +% +% This section contains the driver for this documentation. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\DisableCrossrefs +% \OnlyDescription +\begin{document} + \DocInput{latex209.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \section{Beginning of latex209.def} +% +% \changes{v0.11}{1994/01/21}{oldlfont.dtx is now also used to generate +% latex209.dtx.} +% +% This section describes the beginning of the file |latex209.def|. +% \begin{macrocode} +%<*head> +% \end{macrocode} +% +% \subsection{Identification} +% +% This file needs to be run with \LaTeXe. +% \begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +% \end{macrocode} +% Describe the file. +% \begin{macrocode} +\ProvidesFile{latex209.def}[2018/08/11 v0.54 Standard LaTeX file] +% \end{macrocode} +% \changes{v0.24}{1994/05/14}{Removed date.} +% \changes{v0.40}{1995/03/21} +% {(DPC) Do not execute this file twice latex/1460} +% Announce compatibility mode to the user. +% \changes{v0.52}{1998/05/13}{Added experimental +% long typeout to possibly avoid prs like 2807} +% \begin{macrocode} +\if@compatibility + \expandafter\endinput +\else + \typeout{^^J\space +\@spaces\@spaces\space Entering LaTeX 2.09 COMPATIBILITY MODE^^J\space + *************************************************************^^J\space + \space\space\space!!WARNING!!\space + \space\space\space!!WARNING!!\space + \space\space\space!!WARNING!!\space + \space\space\space!!WARNING!!\space\space\space ^^J\space + ^^J\space + This mode attempts to provide an emulation of the LaTeX 2.09^^J\space + author environment so that OLD documents can be successfully^^J\space + processed. It should NOT be used for NEW documents!^^J\space + ^^J\space + New documents should use Standard LaTeX conventions and start^^J\space + with the \string\documentclass\space command.^^J\space + ^^J\space + Compatibility mode is UNLIKELY TO WORK with LaTeX 2.09 style^^J\space + files that change any internal macros, especially not with^^J\space + those that change the FONT SELECTION or OUTPUT ROUTINES.^^J\space +^^J\space + Therefore such style files MUST BE UPDATED to use^^J\space +\@spaces\@spaces\space Current Standard LaTeX: LaTeX2e.^^J\space + If you suspect that you may be using such a style file, which^^J\space + is probably very, very old by now, then you should attempt to^^J\space + get it updated by sending a copy of this error message to the^^J\space + author of that file.^^J\space + *************************************************************^^J} + \fi +% \end{macrocode} +% +% \subsection{Compatibility flag} +% +% \begin{macro}{\@compatibilitytrue} +% \LaTeXe{} has a flag |\if@compatibility| which can be used by +% document classes or packages to determine whether they are running +% in compatibility mode or not. This flag is set true by this file. +% \begin{macrocode} +\@compatibilitytrue +% \end{macrocode} +% \end{macro} +% +% \subsection{Removing features} +% +% \changes{v0.22}{1994/05/02}{Added \cs{@latex@e@command}.} +% \changes{v0.36}{1994/10/17}{Redid switching off commands.} +% \changes{v0.38}{1994/11/16}{Removed \cs{LaTeXe} from this list} +% +% \begin{macro}{\usepackage} +% \begin{macro}{\listfiles} +% \begin{macro}{\ensuremath} +% \begin{macro}{\lrbox} +% \begin{macro}{\newcommand} +% These \LaTeXe{} commands are switched off in compatibility mode. +% This is done by saving the old definition, and redefining the +% command to call |\@latex@e@error| before executing the old version. +% \begin{macrocode} +\def\@tempa#1#2{% + \expandafter\let\csname @@\string#1\endcsname#1% + \edef#1{% + \noexpand\@latex@e@error{\noexpand#2}% + \expandafter\noexpand\csname @@\string#1\endcsname + }% +} +\@tempa\usepackage\usepackage +\@tempa\listfiles\listfiles +\@tempa\ensuremath\ensuremath +\@tempa\lrbox{\begin{lrbox}}% +\@tempa\@xargdef{\newcommand{cmd}[args][def]}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{v0.22}{1994/05/02} +% {Added \cs{if@latex@e@errors} and \cs{@@@}.} +% \changes{v0.24} +% {1994/05/14}{Removed \cs{if@latex@e@errors} and \cs{@@@}.} +% \changes{v0.24}{1994/05/14}{Changed the error help.} +% \changes{v0.36}{1994/10/17}{Initialized \cs{@latex@e@error} to do +% nothing, and switched it on at the begin document.} +% +% \begin{macro}{\@latex@e@error} +% \begin{macro}{\@latex@e@error@} +% This error is produced if a user uses a \LaTeXe{} command in +% compatibility mode. This is to encourage users to move over to +% using |\documentclass| as quickly as possible. During the preamble +% the error does nothing (so that packages can use \LaTeXe{} commands) +% but it is redefined to be an error message at |\begin{document}|. +% \begin{macrocode} +\let\@latex@e@error\@gobble +\def\@latex@e@error@#1{% + \@latexerr{% + LaTeX2e command \string#1\space in LaTeX 2.09 document% + }{% + This is a LaTeX 2.09 document, but it contains + \string#1.^^J% + If you want to use the new features of LaTeX2e, + your document^^J% + should begin with \string\documentclass\space + rather than \string\documentstyle + }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{v0.36}{1994/10/17} +% {Allow 2e commands to be redefined once with \cs{newcommand}.} +% \changes{v0.40}{1995/03/21}{ +% (DPC) Add \cs{r} to the list of 2e commands latex/1424} +% +% \begin{macro}{\@ifdefinable} +% \begin{macro}{\@old@ifdefinable} +% \begin{macro}{\@@ifdefinable} +% \begin{macro}{\@latex@e@commands} +% We trap the |\@notdefinable| error message to check to see if the +% command is a \LaTeXe{} command, in which case we allow the +% definition to happen. We keep a list of commands which are +% allowed to be redefined this way in |\@latex@e@commands|, and +% remove an entry each time it is defined. +% \begin{macrocode} +\let\@old@ifdefinable\@ifdefinable +\long\def\@ifdefinable#1{% + \def\@tempa##1#1##2#1##3#1##4\@tempa{% + \def\@latex@e@commands{##1##2}% + ##3% ##3 will either be \iftrue or \iffalse + \expandafter\@firstofone + \else + \expandafter\@old@ifdefinable\expandafter#1% + \fi + }% + \expandafter\@tempa\@latex@e@commands#1\iftrue#1\iffalse#1\@tempa% +} +\let\@@ifdefinable\@ifdefinable +\def\@latex@e@commands{% + \usepackage\listfiles\ensuremath\LaTeXe\lrbox + \th\dh\ng\dj\TH\DH\NG\DJ\k\r\SS + \guillemetleft\guillemetright + \guillemotleft\guillemotright\guilsinglleft + \guilsinglright\quotedblbase\quotesinglbase +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@begin@tempboxa} +% \changes{v0.22}{1994/05/02}{Commented out the redefinition of +% \cs{@begin@tempboxa}.} +% If we were to switch off the new |\width|, |\height| and |\depth| +% commands, this is how to do it. This isn't done, since these +% commands may be used in packages. +% \begin{verbatim} +%\long\def\@begin@tempboxa#1#2{% +% \begingroup +% \setbox\@tempboxa#1{{#2}}} +% \end{verbatim} +% \end{macro} +% +% \subsection{Document class hook} +% +% \begin{macro}{\@documentclasshook} +% \changes{v0.15}{1994/02/10}{Renamed from \cs{@compatibility} to +% \cs{@documentclasshook}. Added the check for \cs{@normalsize} and +% \cs{normalsize} being defined.} +% \changes{v0.22}{1994/05/02}{Moved switching off commands into the +% document class hook.} +% \changes{v0.24}{1994/05/14}{Switched the box commands back on, for use +% in packages.} +% \changes{v0.36}{1994/10/17}{Changed the way the 2e command error is +% activated.} +% \changes{v0.51}{1996/05/24}{(DPC) Reimplemented for /2153.} +% This macro is called by each use of |\documentclass|. We define +% it to define |\@normalsize| and |\normalsize| if necessary, +% to input each unused option as a package, and to switch off the new +% \LaTeXe{} commands. However, we leave on the commands +% |\settoheight|, |\settowidth| and the new options to |\parbox| and +% |\minipage|, since these are likely to be used in packages. +% +% The intention of the strange |\normalsize| tests below are that after +% the |\documentstyle| command has completed, then +% if neither of the commands |\normalsize| +% nor |\@normalsize| were defined by the main style or one of its +% `substyles' or `options', then |\@normalsize| will be undefined and +% |\normalsize| will generate an error saying it hasn't been defined. +% +% If the style defined either |\normalsize| or \@|normalsize| then +% these two commands will be |\let| equal to each other, with the +% definition given by the style file. +% +% If the style defines both |\normalsize| and |\@normalsize| then +% those two definitions are kept. +% \begin{macrocode} +\def\@documentclasshook{% + \RequirePackage\@unusedoptionlist + \let\@unusedoptionlist\@empty + \def\@tempa{\@normalsize}% + \ifx\normalsize\@tempa + \let\normalsize\@normalsize + \fi + \ifx\@normalsize\@undefined + \let\@normalsize\normalsize + \fi + \ifx\normalsize\@undefined + \let\normalsize\original@normalsize + \fi + \let\@latex@e@error\@latex@e@error@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\original@normalsize} +% \changes{v0.51}{1996/05/24}{(DPC) Macro added /2153.} +% Save the original definition of |\normalsize| (which generates an +% error) +% \begin{macrocode} +\let\original@normalsize\normalsize +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalsize} +% \changes{v0.14}{1994/02/07}{Added \cs{normalsize}.} +% Some styles don't define |\normalsize|, just |\@normalsize|. +% \begin{macrocode} +\def\normalsize{\@normalsize} +% \end{macrocode} +% \end{macro} +% +% \subsection{Compatibility with \LaTeX~2.09 document styles} +% +% \begin{macro}{\@missingfileerror} +% If a |.cls| file is missing, we look to see if there is +% a file of the same name with a |.sty| extension. +% \changes{v0.06}{1993/12/18}{Corrected a typo +% \cs{@saved@missingfileerror} +% should have been \cs{saved@missingfileerror}.} +% \changes{v0.07}{1993/12/18}{Corrected a typo, I'd forgotten to pass +% the arguments of \cs{@missingfileerror} on to +% \cs{saved@missingfileerror}.} +% \changes{v0.29}{1994/05/17}{Removed extraneous spaces.} +% \begin{macrocode} +\@ifundefined{saved@missingfileerror}{ + \let\saved@missingfileerror=\@missingfileerror +}{} +\def\@missingfileerror#1#2{% + \ifx#2\@clsextension + \InputIfFileExists{#1.\@pkgextension}{% + \wlog{Compatibility mode: loading #1.\@pkgextension + \space rather than #1.#2.}% + }{% + \saved@missingfileerror{#1}{#2}% + }% + \else + \saved@missingfileerror{#1}{#2}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@obsoletefile} +% For compatibility with the document styles which |\input| the +% standard \LaTeX~2.09 document styles, we distribute +% files called |article.sty|, |book.sty|, |report.sty|, +% |slides.sty| and |letter.sty|. These use the command +% |\@obsoletefile|, which the \LaTeXe{} kernel defines to produce a +% warning message. We redefine it to just produce a message in the +% log file, and to pass any options from the old filename to the +% new filename. +% \changes{v0.08}{1993/12/19}{Added this command.} +% \changes{v0.10}{1994/01/14}{Added the option-passing.} +% \begin{macrocode} +\def\@obsoletefile#1#2{% + \expandafter\let\csname opt@#1\expandafter\endcsname + \csname opt@\@currname.\@currext\endcsname + \wlog{Compatibility mode: inputting `#1' + instead of obsolete `#2'.}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footheight} +% \begin{macro}{\@maxsep} +% \begin{macro}{\@dblmaxsep} +% \LaTeX~2.09 supported these parameters, so for compatibility with +% old document styles we allocate them. +% \changes{v0.16}{1994/02/11}{Replaced the allocation of temporary +% dimens for \cs{footheight}, \cs{@maxsep} and \cs{@dblmaxsep} by +% real dimen variables.} +% \begin{macrocode} +\newdimen\footheight +\newdimen\@maxsep +\newdimen\@dblmaxsep +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{v0.36}{1994/10/17}{Added an empty \cs{mark}.} +% \changes{v0.37} +% {1994/10/20}{Corrected a type with the empty \cs{mark}.} +% +% \begin{macro}{\mark} +% \LaTeX~2.09 initialized an empty mark. Who knows, someone may have +% relied on it: +% \begin{macrocode} +\mark{{}{}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Layout} +% +% \begin{macro}{\sloppy} +% \changes{v0.06}{1993/12/18}{Added \cs{sloppy}} +% There is a new version of |\sloppy| in \LaTeXe, so we restore the +% old one. +% \begin{macrocode} +\def\sloppy{\tolerance \@M \hfuzz .5\p@ \vfuzz .5\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@finalstrut} +% \changes{v0.30}{1994/05/18}{Added \cs{@finalstrut}.} +% \changes{v0.31}{1994/05/20}{New definition of \cs{@finalstrut}.} +% The strut which is used in a footnote has changed. This restores +% the old definition. +% \begin{macrocode} +\def\@finalstrut#1{\unskip\strut} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@marginparreset} +% \begin{macro}{\@floatboxreset} +% \changes{v0.39}{1994/11/28}{Added old behaviour of floats and space.} +% \changes{v0.45}{1995/05/25}{(CAR) Changed method of restoring +% old behaviour of floats and space.} +% Restore the old spacing around floats. +% \begin{macrocode} +\let \@marginparreset \@empty +\let \@floatboxreset \@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\proclaim} +% \changes{v0.41}{1995/04/24} +% {Move here from ltplain.dtx} +% From plain \TeX. +% \begin{macrocode} +\outer\def\proclaim #1. #2\par{% + \medbreak + \noindent{\bfseries#1.\enspace}{\slshape#2\par}% + \ifdim\lastskip<\medskipamount + \removelastskip\penalty55\medskip + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hang} +% \begin{macro}{\textindent} +% \changes{v0.42}{1995/04/27} +% {Move here from ltplain.dtx} +% From plain \TeX. +% \begin{macrocode} +\def\hang{\hangindent\parindent} +\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\ttraggedright} +% \changes{v0.41}{1995/04/24} +% {Move here from ltplain.dtx} +% \begin{macrocode} +\def\ttraggedright{\reset@font\ttfamily\rightskip\z@ plus2em\relax} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@footnotemark} +% \changes{v0.43}{1995/05/12} +% {macro added} +% \LaTeXe\ version has |\nobreak| to allow hyphenation. +% \begin{macrocode} +\def\@footnotemark{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\fi + \@makefnmark + \ifhmode\spacefactor\@x@sf\fi + \relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@textsuperscript} +% \changes{v0.48}{1995/07/07} +% {macro added for latex/1722} +% Fudge this command to remove the text font command which +% is always the first thing in the argument. This is needed +% as in compatibility mode footnotes are processed in math mode, +% but the standard classes call |\@textsuperscript| in the definition +% of |\thanks|. +% \begin{macrocode} +\def\@textsuperscript#1{$\m@th^{\@gobble#1}$} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@makefnmark} +% \changes{v0.44}{1995/05/20}{macro added} +% \LaTeXe\ version uses |\textsuperscript| rather than +% math mode. +% \begin{macrocode} +\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thempfootnote} +% \changes{v0.44}{1995/05/20}{macro added} +% \LaTeXe\ version has an additional |\itshape| which would not +% work (and would not make sense) in math mode. +% \begin{macrocode} +\def\thempfootnote{\@alph\c@mpfootnote} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fnsymbol} +% \changes{v0.46}{1995/06/30}{macro added} +% \LaTeX\ version uses |\ensuremath| which does not work in +% compatibility mode. +% \begin{macrocode} +\def\@fnsymbol#1{\ifcase#1\or *\or \dagger\or \ddagger\or + \mathchar "278\or \mathchar "27B\or \|\or **\or \dagger\dagger + \or \ddagger\ddagger \else\@ctrerr\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@inmathwarn} +% \changes{v0.50}{1995/12/08}{Switched off \cs{@inmathwarn}} +% \LaTeX\ (1995/12/01) checks for text commands being used in math +% mode. We switch this off in compatibility mode. +% \begin{macrocode} +\let\@inmathwarn\@gobble +% \end{macrocode} +% \end{macro} +% +% \subsection{Verbatim} +% +% \changes{v0.18}{1994/03/11}{Added the changes to \cs{verb}} +% \changes{v0.40}{1995/05/05}{Make \cs{verb} use \cs{tt} font in +% math mode.} +% \begin{macro}{\verb} +% \begin{macro}{\@sverb} +% We restore the old definition of |\verb|, but using +% |\verbatim@font| rather than |\tt|. The use of |\bgroup| and +% |\egroup| allows us to prefix it with |\hbox| in math mode. +% \begin{macrocode} +\def\verb{% + \relax\ifmmode\hbox\fi\bgroup + \@noligs + \verbatim@font + \let\do\@makeother \dospecials + \@ifstar{\@sverb}{\@verb}% +} +\def\@sverb#1{% + \def\@tempa ##1#1{\leavevmode\null##1\egroup}% + \@tempa +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\verbatim@nolig@list} +% \changes{v0.20}{1994/04/20}{Added the redefinition of +% \cs{verbatim@nolig@list}.} +% The only ligatures which should be switched off in 2.09 mode are +% the Spanish punctuation. +% \begin{macrocode} +\def\verbatim@nolig@list{\do\`} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@lquote} +% \changes{v0.21}{1994/04/24}{Added the definition of \cs{@lquote}.} +% We restore the old definition of |\@lquote| in case any packages +% use it. +% \begin{macrocode} +\def\@lquote{\leavevmode{\kern\z@}`} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Character codes} +% +% \changes{v0.18}{1994/03/11}{Added the catcode changes} +% +% By default, \LaTeXe{} makes the input charactes 0--8, 11, 14--31 and +% 128--255 illegal. In compatibility mode, we restore their old +% meanings. +% \begin{macrocode} +\catcode0=9 +\@tempcnta=1 +\loop\ifnum\@tempcnta<32 + \catcode\@tempcnta=12 + \advance\@tempcnta by 1 +\repeat% +\catcode`\^^I=10\relax% +\catcode`\^^L=13\relax% +\catcode`\^^M=5\relax% +\catcode127=15 +\@tempcnta=128 +\loop\ifnum\@tempcnta<256 + \catcode\@tempcnta=12 + \advance\@tempcnta by 1 +\repeat +% \end{macrocode} +% +% \subsection{Miscellaneous commands} +% +% \begin{macro}{\SLiTeX} +% The \textsc{Sli\TeX} logo. +% \begin{macrocode} +\DeclareRobustCommand{\SLiTeX}{{% + \normalfont S\kern -.06em + {\scshape l\kern -.035emi}\kern -.06em + \TeX}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\+} +% The |\+| command should be defined, so that it can be used in +% |\renewcommand|. +% \begin{macrocode} +\let\+\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cla} +% \begin{macro}{\@clb} +% \changes{v0.47}{1995/09/25} +% {(DPC) Declare old \cs{cline} registers} +% \begin{macro}{\mscount} +% \LaTeX2.09 (and early versions of \LaTeXe) used these count registers +% in the definition of |\cline| and |\multispan|. +% Declare them here in case they were used for any other purposes. +% \begin{macrocode} +\newcount\@cla +\newcount\@clb +\newcount\mscount +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@imakepicbox} +% \changes{v0.48}{1995/10/16} +% {(DPC) emulate old behaviour of picture mode makebox} +% picture mode version +% \begin{macrocode} +\long\def\@imakepicbox(#1,#2)[#3]#4{% + \vbox to#2\unitlength + {\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss + \let\mb@t\vss + \@tfor\reserved@a :=#3\do{% + \if s\reserved@a + \let\mb@l\relax\let\mb@r\relax + \else + \expandafter\let\csname mb@\reserved@a\endcsname\relax + \fi}% + \mb@t + \hb@xt@ #1\unitlength{\mb@l #4\mb@r}% + \mb@b +% \end{macrocode} +% This kern ensures that a |b| option aligns on the bottom of the +% text rather than the baseline. this is the documented behaviour in +% the \LaTeX Book. The kern is removed in compatibility mode. +% +% Remove kern for bug compatibility with 2.09. +% \begin{macrocode} +% \kern\z@ + }} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\supereject} +% \begin{macrocode} +\def\supereject{\par\penalty-\@MM} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nofiles} +% \changes{v0.51}{1996/05/24}{(DPC) Old definition, without \cs{write} +% added to \cs{protected@write}, for latex/2146} +% This old version might change the vertical spacing when it is used. +% Some old document might depend on that changed spacing so\ldots +% \begin{macrocode} +\def\nofiles{% + \@fileswfalse + \typeout{No auxiliary output files.^^J}% + \long\def\protected@write##1##2##3{}% + \let\makeindex\relax + \let\makeglossary\relax} +% \end{macrocode} +% \end{macro} +% +% \subsection{Packages and classes} +% +% \begin{macro}{\ProvidesPackage} +% \begin{macro}{\ProvidesClass} +% We redefine |\ProvidesPackage| and |\ProvidesClass| to produce a +% log message rather than a warning if they find an unexpected +% file. +% \begin{macrocode} +\def\ProvidesPackage#1{% + \xdef\@gtempa{#1}% + \ifx\@gtempa\@currname\else + \wlog{Compatibility mode: \@cls@pkg\space`\@currname' requested, + but `#1' provided.}% + \fi + \@ifnextchar[\@pr@videpackage{\@pr@videpackage[]}}%] +\let\ProvidesClass=\ProvidesPackage +% \end{macrocode} +% \end{macro} +% \end{macro} +% That ends the head of |latex209.def|. +% \begin{macrocode} +%</head> +% \end{macrocode} +% +% \section{Middle of latex209.def} +% +% At this point, the code for |oldlfont.sty| is read in by the +% installation script. +% +% \section{End of latex209.def} +% +% This section describes the end of |latex209.def|. +% \begin{macrocode} +%<*tail> +% \end{macrocode} +% +% \subsection{Font commands} +% +% \changes{v0.12}{1994/01/24}{Added the oldlfont option.} +% \changes{v0.25}{1994/05/14}{Added the newlfont option, rewrote the +% oldlfont option to change math grouping.} +% \changes{v0.26}{1994/05/15}{Added the margid and nomargid options.} +% \changes{v0.27}{1994/05/16}{Replaced \# by \#\# in margid.} +% \changes{v0.28}{1994/05/17}{Replaced \cs{input} newlfont.sty by +% \cs{OptionNotUsed} in \cs{ds@newlfont}.} +% +% \begin{macro}{\ds@oldlfont} +% \begin{macro}{\ds@newlfont} +% \begin{macro}{\ds@margid} +% \begin{macro}{\ds@nomargid} +% We declare |oldlfont|, |newlfont|, |margid| and |nomargid| +% options to mimic the \LaTeX~2.09 NFSS1 options. +% \begin{macrocode} +\def\ds@oldlfont{% +%FM \@no@font@optfalse + \let\math@bgroup\@empty + \let\math@egroup\@empty + \let\@@math@bgroup\math@bgroup + \let\@@math@egroup\math@egroup +} +\def\ds@newlfont{% +%FM \@no@font@optfalse + \OptionNotUsed +} +\def\ds@margid{% +%FM \@no@font@optfalse + \let\math@bgroup\bgroup + \def\math@egroup##1{##1\egroup}% + \let \@@math@bgroup \math@bgroup + \let \@@math@egroup \math@egroup +} +\let\ds@nomargid\ds@oldlfont +\@onlypreamble\ds@oldfont +\@onlypreamble\ds@newfont +\@onlypreamble\ds@margid +\@onlypreamble\ds@nomargid +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\encodingdefault} +% The default encoding for old documents is OT1 rather than T1. +% \begin{macrocode} +\renewcommand{\encodingdefault}{OT1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cmex/m/n/10} +% Just in case a document style relies on |\cmex/m/n/10| to exist +% (which may have been hard-wired to |\fam3|) we load the font. +% \begin{macrocode} +\expandafter\font\csname cmex/m/n/10\endcsname=cmex10 +% \end{macrocode} +% \end{macro} +% +% +% \changes{v0.12}{1994/01/24} +% {Added \cs{normalshape} and \cs{mediumseries}.} +% \changes{v0.28}{1994/05/16}{\cs{mediumseries} was using +% \cs{fontshape} rather than \cs{fontseries}.} +% +% \begin{macro}{\normalshape} +% \begin{macro}{\mediumseries} +% These commands were used in older versions of NFSS. +% \begin{macrocode} +\def\normalshape{\fontshape\shapedefault\selectfont} +\def\mediumseries{\fontseries\seriesdefault\selectfont} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\DeclareOldFontCommand} +% We redefine |\DeclareOldFontCommand| to do nothing. This means +% that any new document classes will have their redefinitions of +% |\rm|, |\bf| etc.~ignored. +% \changes{v0.06}{1993/12/18}{Replaced \cs{@newfontswitch} by +% \cs{@renewfontswitch}.} +% \changes{v0.11}{1994/01/21}{Removed \cs{RequirePackage}{oldlfont}.} +% \changes{v0.19}{1994/04/05}{Replaced \cs{@renewfontswitch} by +% \cs{DeclareOldFontCommand}.} +% \begin{macrocode} +\def \DeclareOldFontCommand #1#2#3{% + \wlog{Compatibility mode: definition + of \string#1\space ignored.}% +} +% \end{macrocode} +% \end{macro} +% +% \changes{v0.17} +% {1994/03/02}{Added \cs{@halfmag}, \cs{@magscale} and \cs{@ptscale}} +% \changes{v0.35} +% {1994/09/23}{Added spaces to the old font scale commands.} +% +% \begin{macro}{\@halfmag} +% \begin{macro}{\@magscale} +% \begin{macro}{\@ptscale} +% Some font-specifying commands from \LaTeX~2.09. +% \begin{macrocode} +\def\@halfmag{ scaled \magstephalf} +\def\@magscale#1{ scaled \magstep#1 } +\def\@ptscale#1{ scaled #100 } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\font} +% The current font is set to be CMR 10pt, to match \LaTeX~2.09. +% \begin{macrocode} +\fontencoding{OT1} \fontfamily{cmr} +\fontsize{10}{12} \fontseries{m} \fontshape{n} +\selectfont +% \end{macrocode} +% \end{macro} +% +% \changes{v0.11}{1994/01/21}{Added the rest of this subsection, which +% used to be in oldlfont.dtx.} +% +% \begin{macro}{\load} +% The |\load| command is no longer needed, it is therefore +% defined to do nothing. +% \begin{macrocode} +\let\load\@gobbletwo +% \end{macrocode} +% \end{macro} +% +% Here are three delimiters which have be partly disabled by +% NFSS2 (the small variants) since the corresponding fonts are +% normally not preloaded as math symbol fonts. +% \begin{macrocode} +\DeclareMathDelimiter{\lgroup} % extensible ( with sharper tips + {\mathopen}{bold}{"28}{largesymbols}{"3A} +\DeclareMathDelimiter{\rgroup} % extensible ) with sharper tips + {\mathclose}{bold}{"29}{largesymbols}{"3B} +\DeclareMathDelimiter{\bracevert} % the vertical bar that extends braces + {\mathord}{typewriter}{"7C}{largesymbols}{"3E} +% \end{macrocode} +% +% In old documents we might find some usages of |\bffam| etc. Thus +% we add the following code: +% \begin{macrocode} +\let\bffam\symbold +\let\sffam\symsans +\let\itfam\symitalic +\let\ttfam\symtypewriter +\let\scfam\symsmallcaps +\let\slfam\symslanted +\let\rmfam\symoperators +% \end{macrocode} +% +% Below are the |\..pt| commands with hopefully the same +% functionality as in the old \texttt{lfonts.tex}. Notice that the +% |\baselineskip| parameter wasn't set by these commands so that +% using them now shouldn't set this either. Thus we go low-level. +% This means that the commands are now fragile but I think they +% have been fragile before. +% \begin{macrocode} +\newcommand\vpt {\edef\f@size{\@vpt}\rm} +\newcommand\vipt {\edef\f@size{\@vipt}\rm} +\newcommand\viipt {\edef\f@size{\@viipt}\rm} +\newcommand\viiipt{\edef\f@size{\@viiipt}\rm} +\newcommand\ixpt {\edef\f@size{\@ixpt}\rm} +\newcommand\xpt {\edef\f@size{\@xpt}\rm} +\newcommand\xipt {\edef\f@size{\@xipt}\rm} +\newcommand\xiipt {\edef\f@size{\@xiipt}\rm} +\newcommand\xivpt {\edef\f@size{\@xivpt}\rm} +\newcommand\xviipt{\edef\f@size{\@xviipt}\rm} +\newcommand\xxpt {\edef\f@size{\@xxpt}\rm} +\newcommand\xxvpt {\edef\f@size{\@xxvpt}\rm} +% \end{macrocode} +% +% \subsection{User customization} +% +% For sites which customized their version of \LaTeX~2.09, we provide +% a file |latex209.cfg|, which is loaded every time we enter +% compatibility mode. If the file doesn't exist, we don't do +% anything. +% \begin{macrocode} +\InputIfFileExists{latex209.cfg}{}{} +% \end{macrocode} +% That ends the file |latex209.def|. +% \begin{macrocode} +%</tail> +% \end{macrocode} +% +% \section{Obsolete style files} +% +% \changes{v0.08}{1993/12/19}{Added this section.} +% \changes{v0.09}{1993/12/20}{Removed artN.sty, bkN.sty and repN.sty.} +% \changes{v0.23}{1994/05/11}{Added bezier.sty.} +% \changes{v0.31}{1994/05/20}{Added t1enc.sty.} +% +% For each of the standard \LaTeX~2.09 document styles, we produce a +% file which points to the appropriate \LaTeXe{} document class file. +% This means that any styles which say |\input article.sty| should +% still work. +% +% \begin{macrocode} +%<*article|book|report|letter|slides> +\NeedsTeXFormat{LaTeX2e} +%</article|book|report|letter|slides> +%<*article> +\@obsoletefile{article.cls}{article.sty} +\LoadClass{article} +%</article> +%<*book> +\@obsoletefile{book.cls}{book.sty} +\LoadClass{book} +%</book> +%<*report> +\@obsoletefile{report.cls}{report.sty} +\LoadClass{report} +%</report> +%<*letter> +\@obsoletefile{letter.cls}{letter.sty} +\LoadClass{letter} +%</letter> +%<*slides> +\@obsoletefile{slides.cls}{slides.sty} +\LoadClass{slides} +%</slides> +% \end{macrocode} +% We also produce empty |fleqn.sty| and |leqno.sty| files in case +% anyone has |\input| one of them. +% \begin{macrocode} +%<*fleqn> +\@obsoletefile{fleqn.clo}{fleqn.sty} +\input{fleqn.clo} +%</fleqn> +%<*leqno> +\@obsoletefile{leqno.clo}{leqno.sty} +\input{leqno.clo} +%</leqno> +% \end{macrocode} +% We also produce an empty |openbib.sty| in case anyone has |\input| +% |openbib.sty|. The |openbib| class option is now part of the kernel. +% \begin{macrocode} +%<*openbib> +\iffalse + +The openbib option is now part of LaTeX thus this package is no +longer necessary. It is only retained for upward compatibility. +See the 2nd edition of the LaTeX book, or the file usrguide.tex +which comes with the LaTeX distribution, for more details. + +\fi +%</openbib> +% \end{macrocode} +% We also produce an empty |bezier.sty| in case anyone has |\input| +% |bezier.sty|. The |\bezier| command is now part of the kernel. +% \begin{macrocode} +%<*bezier> +\iffalse + +The \bezier command is now part of LaTeX thus this package is no +longer necessary. It is only retained for upward compatibility. +Also, please note that LaTeX now offers an extended bezier command +which automatically calculates the number of points needed for the +plot. See the 2nd edition of the LaTeX book, or the file +usrguide.tex which comes with the LaTeX distribution, for more +details. + +\fi +%</bezier> +% \end{macrocode} +% We also produce a |t1enc| package, for compatibility with the +% Companion. This has been replaced by the |fontenc| package. +% \begin{macrocode} +%<*t1enc> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{t1enc}[1994/06/01 Standard LaTeX package] +\renewcommand{\encodingdefault}{T1} +\fontencoding{T1}\selectfont +%</t1enc> +% \end{macrocode} +% \DeleteShortVerb{\|} +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/latex209.ins b/Master/texmf-dist/source/latex-dev/base/latex209.ins new file mode 100644 index 00000000000..f0834e83df4 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/latex209.ins @@ -0,0 +1,129 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\Msg{*** Generating compatibility mode files ***} + +\generate{ + \usedir{tex/latex/base} + \file{latex209.def}{ + \from{latex209.dtx}{head} + \from{oldlfont.dtx}{latex209} + \from{latex209.dtx}{tail}} + \file{article.sty}{ + \from{latex209.dtx}{article}} + \file{book.sty}{ + \from{latex209.dtx}{book}} + \file{report.sty}{ + \from{latex209.dtx}{report}} + \file{letter.sty}{ + \from{latex209.dtx}{letter}} + \file{slides.sty}{ + \from{latex209.dtx}{slides}} + \file{fleqn.sty}{ + \from{latex209.dtx}{fleqn}} + \file{leqno.sty}{ + \from{latex209.dtx}{leqno}} + \file{openbib.sty}{ + \from{latex209.dtx}{openbib}} + \file{bezier.sty}{ + \from{latex209.dtx}{bezier}} + \file{t1enc.sty}{ + \from{latex209.dtx}{t1enc}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space latex209.def *.sty } +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.drv' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx b/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx new file mode 100644 index 00000000000..02194cee116 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/latexrelease.dtx @@ -0,0 +1,1011 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +% +%<*dtx> + \def\latexreleaseversion{<date only known in .sty file>} + \ProvidesFile{latexrelease.dtx} +%</dtx> +%<driver>\ProvidesFile{latexrelease.drv} +%<fixltx2e>\ProvidesPackage{fixltx2e} +%<fixltx2e> [2016/12/29 v2.1a fixes to LaTeX (obsolete)] +%<latexrelease>\ProvidesPackage{latexrelease} +%<*!fixltx2e> +% \fi +% \ProvidesFile{latexrelease.dtx} + [2018/05/08 v1.0k LaTeX release emulation and tests + (including releases up to \latexreleaseversion)] +% \iffalse +%</!fixltx2e> +%<*driver> + \documentclass{ltxdoc} + \newcommand\Lopt[1]{\textsf{#1}} + \let\Lpack\Lopt + \providecommand{\file}[1]{\texttt{#1}} + \providecommand{\MF}{\textsf{Metafont}} + \providecommand{\danger}{\marginpar[\hfill\protect\Huge!!]{\protect\Huge!!\hfill}} + \begin{document} + \DocInput{latexrelease.dtx} + \end{document} +%</driver> +% \fi +% +% \changes{v1.0i}{2017/12/17}{Add \cs{latexreleaseversion} info +% to \cs{ProvidesPackage} output} +% +% +% \let\package\textsf +% +% +% \GetFileInfo{latexrelease.dtx} +% +% \title{The \Lpack{latexrelease} package\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{The \LaTeX3 Project} +% \date{\filedate} +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% Prior to the 2015 release of \LaTeX{}, essentially no changes had been +% made to the \LaTeX\ format code for some years, with all +% improvements being instead added to the package \Lpack{fixltx2e}. +% +% While this worked at a technical level it meant that you had to +% explicitly opt-in to bug fixes and improvements, and the vast +% majority of documents did not benefit. +% +% As described in \LaTeX\ News 22, a new policy is being implemented +% in which improvements will now be added to the format by default, +% and this \Lpack{latexrelease} package may be used to ensure +% stability where needed, either by making a new format use an older +% definition of some commands, or conversely may be used to supply the +% new definitions for use with an old format. +% +% The basic use is: +%\begin{verbatim} +% \RequirePackage[2015/01/01]{latexrelease} +% \documentclass{article} +% .... +%\end{verbatim} +% +% After such a declaration the document will use definitions current +% in the January 2015 \LaTeX{}, whether the actual format being used is +% older, or newer than that date. In the former case a copy of +% |latexrelease.sty| would need to be made available for use with the +% older format. This may be used, for example, to share a document +% between co-workers using different \LaTeX\ releases, or to protect a +% document from being affected by system updates. As well as the +% definitions within the format itself, individual packages may use +% the commands defined here to adjust their definitions to the +% specified date as described below. +% +% Note that the \Lpack{latexrelease} package is intended for use +% at the start of a \emph{document}. Package and class code should not +% include this package as loading a package should not normally globally +% reset the effective version of \LaTeX\ that is in force, so affecting all +% other packages used in the document. +% +% +% The bulk of this package, after some initial setup and option +% handling consists of a series of |\IncludeInRelease| commands +% which have been extracted from the main source files of the \LaTeX\ +% format. These contain the old and new versions of any commands with +% modified definitions. +% +% \section{Package Options} +% \begin{itemize} +% \item \emph{yyyy/mm/dd} or \emph{yyyy-nn-dd} +% The package accepts any possible \LaTeX\ format date as argument, +% although dates in the future for which the current release of this +% package has no information will generate a warning. Dates +% earlier than 2015 will work but will roll back to some point in 2015 +% when the method was introduced. +% |\IncludeInRelease| command is defined. +% The |\requestedLaTeXdate| is set to the normalized date argument +% so that package rollback defaults to the specified date. +% +% \item% +% |current| This is the default behaviour, it does not change the +% effective date of the format but does ensure that the +% |\IncludeInRelease| command is defined. +% the |\requestedLaTeXdate| is reset to 0 so that package rollback +% does not use the implicit date. +% |\IncludeInRelease| command is defined. +% The |\requestedLaTeXdate| macro is reset to 0 so that package rollback +% does not use the implicit date. +% +% \item +% |latest| sets the effective date of the format to the release date +% of this file, so in an older format applies all patches currently +% available. +% |\IncludeInRelease| command is defined. +% The |\requestedLaTeXdate| macro is reset to 0 so that package rollback +% does not use the implicit date. +% \end{itemize} +% +% +% \section{Release Specific Code} +% +% The |\IncludeInRelease| mechanism allows the kernel developer to +% associate code with a specific date to choose different versions of +% definitions depending on the date specified as an option to the +% \Lpack{latexrelease} package. Is also available for use by package +% authors (or even in a document if necessary). +% +% \medskip +% +% \noindent\DescribeMacro{\IncludeInRelease} +% \marg{code-date}^^A +% \oarg{format-date}%^^A +% \marg{label}^^A +% \marg{message}^^A +% \meta{code}^^A +% |\EndIncludeInRelease| +% +% \begin{description} +% +% \item[\marg{code-date}] This date is associated with the \marg{code} +% argument and will be compared to the requested date in the option to +% the \Lpack{latexrelease}. +% +% \item[\oarg{format-date}] This optional argument can be used to +% specify a format date with the code in addition to the mandatory +% \marg{code-date} argument. This can be useful for package developers +% as described below. +% +% \item[\marg{label}] The \marg{label} argument is an identifier +% (string) that within a given package must be a unique label for each +% related set of optional definitions. Per package at most one code +% block from all the |\IncludeInRelease| declarations with the same +% label will be executed. +% +% \item[\marg{message}] +% The \marg{message} is an informative string that is used in +% messages. It has no other function. +% +% \item[\meta{code}] +% Any \TeX\ code after the |\IncludeInRelease| arguments +% up until the and the following |\EndIncludeInRelease| +% is to be +% conditionally included depending on the date of the format as +% described below. +% +% \end{description} +% +% The |\IncludeInRelease| declarations with a given label should be in +% reverse chronological order in the file. The one chosen will depend +% on this order, the effective format version and the date options, as +% described below. +% +% If your package \Lpack{mypackage} defines a |\widget| command but +% has one definition using the features available in the 2015 \LaTeX\ +% release, and a different definition is required for older formats +% then you can use: +%\begin{verbatim} +% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition} +% \def\widget{new version}% +% \EndIncludeInRelease +% +% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition} +% \def\widget{old version}% +% \EndIncludeInRelease +%\end{verbatim} +% +% If a document using this package is used with a format with +% effective release date of 2015/01/01 or later the new code will be +% used, otherwise the old code will be used. Note the \emph{effective +% release date} might be the original \LaTeX\ release date as shown at +% the start of every \LaTeX\ job, or it may be set by the +% \Lpack{latexrelease} package, so for example a document author who +% wants to ensure the new version is used could use +%\begin{verbatim} +% \RequirePackage[2015/01/01]{latexrelease} +% \documentclass{article} +% \usepackage{mypackage} +%\end{verbatim} +% +% If the document is used with a \LaTeX\ format from 2014 or before, +% then \Lpack{latexrelease} will not have been part of the original +% distribution, but it may be obtained from a later \LaTeX\ release or +% from CTAN and distributed with the document, it will make an older +% \LaTeX\ release act essentially like the 2015 release. +% +% \subsection{Intermediate Package Releases} +% +% The above example works well for testing against the latex format +% but is not always ideal for controlling code by the release date of +% the \emph{package}. Suppose \LaTeX\ is not updated but in March you +% update the \Lpack{mypackage} package and modify the definition of +% |\widget|. You could code the package as: +%\begin{verbatim} +% \IncludeInRelease{2015/03/01}{\widget}{Widget Definition} +% \def\widget{even newer improved March version}% +% \EndIncludeInRelease +% +% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition} +% \def\widget{new version}% +% \EndIncludeInRelease +% +% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition} +% \def\widget{old version}% +% \EndIncludeInRelease +%\end{verbatim} +% +% This would work and allow a document author to choose a date such as +%\begin{verbatim} +% \RequirePackage[2015/03/01]{latexrelease} +% \documentclass{article} +% \usepackage{mypackage} +%\end{verbatim} +% +% To use the latest version, however it would have disadvantage that +% until the next release of \LaTeX, by default, if the document does +% not use \Lpack{latexrelease} to specify a date, the new improved +% code will not be selected as the effective date will be 2015/01/01 +% and so the first code block will be skipped. +% +% For this reason |\IncludeInRelease| has an optional argument that +% specifies an alternative date to use if a date option has not been +% specified to \Lpack{latexrelease}. +%\begin{verbatim} +% \IncludeInRelease{2015/03/01}[2015/01/01]{\widget}{Widget Definition} +% \def\widget{even newer improved March version}% +% \EndIncludeInRelease +% +% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition} +% \def\widget{new version}% +% \EndIncludeInRelease +% +% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition} +% \def\widget{old version}% +% \EndIncludeInRelease +%\end{verbatim} +% +% Now, by default on a 2015/01/01 \LaTeX\ format, the first code block +% will compare the format date to the optional argument 2015/01/01 +% and so will execute the \emph{even newer improved} version. The +% remaining blocks using the |\widget| label argument will all then be +% skipped. +% +% If on the other hand the document requests an explicit release date +% using \Lpack{latexrelease} then this date will be used to decide what +% code block to include. +% +% \subsection{Using \cs{IncludeInRelease} in Packages} +% +% If |\IncludeInRelease| is used within a package then all such +% conditional code needs to be within such declarations, e.g., it is +% not possible in the above example to have the ``current'' definition +% of |\widget| somewhere in the main code and only the two older +% definitions inside |\IncludeInRelease| declarations. If you would do +% this then one of those |\IncludeInRelease| declarations would be +% included overwriting the even newer code in the main part of the +% package. As a result your package may get fragmented over time with +% various |\IncludeInRelease| declarations sprinkled throughout your +% code or you have to interrupt the reading flow by putting those +% declarations together but not necessarily in the place where they +% belong. +% +% To avoid this issue you can use the following coding +% strategy: place the current |\widget| definition in the main code +% where it correctly belongs. +% \begin{verbatim} +% ... +% \def\widget {even newer improved March version} +% \def\@widget{newly added helper command no defined in older releases} +% ... +%\end{verbatim} +% Then, near the end of your package place +% the following: +% \begin{verbatim} +% \IncludeInRelease{2015/03/01}[2015/01/01]{\widget}{Widget Definition} +% \EndIncludeInRelease +% +% \IncludeInRelease{2015/01/01}{\widget}{Widget Definition} +% \def\widget{new version}% +% \let\@widget\@undefined % this doesn't exist in earlier releases +% \EndIncludeInRelease +% +% \IncludeInRelease{0000/00/00}{\widget}{Widget Definition} +% \def\widget{old version}% +% \EndIncludeInRelease +%\end{verbatim} +% This way the empty code block hides the other |\IncludeInRelease| +% declarations unless there is an explicit request with a date +% 2015/01/01 or earlier. +% +% Now if you make a further change to |\widget| in the future you +% simply copy the current definition into the empty block and add a new +% empty declaration with todays date and the current format date. This +% way your main code stays readable and the old versions accumulate at +% the end of the package.\footnote{Of course there may be some cases +% in which the old code has to be in a specific place within the +% package as other code depends on it (e.g., if you +% \texttt{\string\let} something to it). In that case you have to +% place the code variations in the right place in your package rather +% than accumulating them at the very end.} +% +% The only other ``extra effort'' necessary when using this approach +% is that it may be advisable to undo new definitions in the code +% block for the previous release, e.g., in the above example we +% undefined |\@widget| as that isn't available in the 2015/01/01 +% release but was defined in the main code. If all your conditional +% code is within |\IncludeInRelease| declarations that wouldn't been +% necessary as the new code only gets defined if that release is +% chosen. +% +% \section{fixltx2e} +% +% As noted above, prior to the 2015 \LaTeX\ release updates to the +% \LaTeX\ kernel were not made in the format source files but were +% made available in the \Lpack{fixltx2e} package. That package is no +% longer needed but we generate a small package from this source +% that just makes a warning message but otherwise does nothing. +% +% +% +% +% +% \StopEventually{} +% +% \section{Implementation} +% +% We require at least a somewhat sane version of \LaTeXe{}. Earlier +% ones where really quite different from one another. +% \begin{macrocode} +%<*latexrelease> +\NeedsTeXFormat{LaTeX2e}[1996/06/01] +% \end{macrocode} +% +% \section{Setup} +% +% \begin{macro}{\IncludeInRelease} +% \begin{macro}{\EndIncludeInRelease} +% \begin{macrocode} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{v1.0c}{2015/02/19}{Swap argument order} +% \changes{v1.0k}{2018/05/08}{reset \cs{\requestedLaTeXdate} for current and latest options, gitub issue 43} +% \begin{macrocode} +\DeclareOption*{% + \def\@IncludeInRelease#1[#2]{\@IncludeInRele@se{#1}}% + \let\requestedpatchdate\CurrentOption} +\DeclareOption{latest}{% + \let\requestedpatchdate\latexreleaseversion + \AtEndOfPackage{\def\requestedLaTeXdate{0}}} +\DeclareOption{current}{% + \let\requestedpatchdate\fmtversion + \AtEndOfPackage{\def\requestedLaTeXdate{0}}} +% \end{macrocode} +% +% \begin{macrocode} +\let\requestedpatchdate\fmtversion +\ProcessOptions\relax +% \end{macrocode} +% +% Sanity check options, it allows some non-legal dates but always +% ensures |requestedLaTeXdate| gets set to a number. Generate an +% error if there are any non digit tokens remaining after removing the +% |//|. +% \changes{v1.0j}{2018/01/30}{Explain both date formats in error message} +% \begin{macrocode} +\def\reserved@a{% +\edef\requestedLaTeXdate{\the\count@}% +\reserved@b} +\def\reserved@b#1\\{% +\def\reserved@b{#1}% +\ifx\reserved@b\@empty\else +\PackageError{latexrelease}% + {Unexpected option \requestedpatchdate}% + {The option must be of the form yyyy/mm/dd or yyyy-mm-dd}% +\fi} +\afterassignment\reserved@a +\count@\expandafter + \@parse@version\expandafter0\requestedpatchdate//00\@nil\\ +% \end{macrocode} +% +% less precautions needed for |\fmtversion| +% \begin{macrocode} +\edef\currentLaTeXdate{% + \expandafter\@parse@version\fmtversion//00\@nil} +% \end{macrocode} +% +% \begin{macrocode} +\ifnum\requestedLaTeXdate=\currentLaTeXdate +\PackageWarningNoLine{latexrelease}{% + Current format date selected, no patches applied} +\expandafter\endinput +\fi +% \end{macrocode} +% +% A newer version of latexrelease should have been distributed with +% the later format. +% \begin{macrocode} +\ifnum\currentLaTeXdate + >\expandafter\@parse@version\latexreleaseversion//00\@nil +\PackageWarningNoLine{latexrelease}{% +The current package is for an older LaTeX format:\MessageBreak +LaTeX \latexreleaseversion\space\MessageBreak +Obtain a newer version of this package!} +\expandafter\endinput +\fi +% \end{macrocode} +% can't patch into the future, could make this an error +% but it has some uses to control package updates +% so allow for now. +% \begin{macrocode} +\ifnum\requestedLaTeXdate + >\expandafter\@parse@version\latexreleaseversion//00\@nil +\PackageWarningNoLine{latexrelease}{% +The current package is for LaTeX \latexreleaseversion:\MessageBreak +It has no patches beyond that date\MessageBreak +There may be an updated version\MessageBreak +of this package available from CTAN} +\expandafter\endinput +\fi +% \end{macrocode} +% +% Update the format version to the requested date. +% \begin{macrocode} +\let\fmtversion\requestedpatchdate +\let\currentLaTeXdate\requestedLaTeXdate +% \end{macrocode} +% +% +% \section{Individual Changes} +% +% The code for each change will be inserted at this point, extracted +% from the kernel source files. +% +% \begin{macrocode} +%</latexrelease> +% \end{macrocode} +% +% \section{fixltx2e} +% +% Generate a stub \Lpack{fixltx2e} package: +% \begin{macrocode} +%<*fixltx2e> +\IncludeInRelease{2015/01/01}{\fixltxe}{Old fixltx2e package} +\NeedsTeXFormat{LaTeX2e} +\PackageWarningNoLine{fixltx2e}{% +fixltx2e is not required with releases after 2015\MessageBreak +All fixes are now in the LaTeX kernel.\MessageBreak +See the latexrelease package for details} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}{\fixltxe}{Old fixltx2e package} +\def\@outputdblcol{% + \if@firstcolumn + \global\@firstcolumnfalse + \global\setbox\@leftcolumn\copy\@outputbox + \splitmaxdepth\maxdimen + \vbadness\maxdimen + \setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}% + \setbox\@outputbox\vsplit\@outputbox to\maxdimen + \toks@\expandafter{\topmark}% + \xdef\@firstcoltopmark{\the\toks@}% + \toks@\expandafter{\splitfirstmark}% + \xdef\@firstcolfirstmark{\the\toks@}% + \ifx\@firstcolfirstmark\@empty + \global\let\@setmarks\relax + \else + \gdef\@setmarks{% + \let\firstmark\@firstcolfirstmark + \let\topmark\@firstcoltopmark}% + \fi + \else + \global\@firstcolumntrue + \setbox\@outputbox\vbox{% + \hb@xt@\textwidth{% + \hb@xt@\columnwidth{\box\@leftcolumn \hss}% + \hfil + {\normalcolor\vrule \@width\columnseprule}% + \hfil + \hb@xt@\columnwidth{\box\@outputbox \hss}}}% + \@combinedblfloats + \@setmarks + \@outputpage + \begingroup + \@dblfloatplacement + \@startdblcolumn + \@whilesw\if@fcolmade \fi{\@outputpage\@startdblcolumn}% + \endgroup + \fi} +\def\end@dblfloat{% + \if@twocolumn + \@endfloatbox + \ifnum\@floatpenalty <\z@ + \@largefloatcheck + \global\dp\@currbox1sp % + \@cons\@currlist\@currbox + \ifnum\@floatpenalty <-\@Mii + \penalty -\@Miv + \@tempdima\prevdepth + \vbox{}% + \prevdepth\@tempdima + \penalty\@floatpenalty + \else + \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack + \fi + \fi + \else + \end@float + \fi +} +\def\@testwrongwidth #1{% + \ifdim\dp#1=\f@depth + \else + \global\@testtrue + \fi} +\let\f@depth\z@ +\def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber + \global\@dbltoproom \dbltopfraction\@colht + \@textmin \@colht + \advance \@textmin -\@dbltoproom + \@fpmin \dblfloatpagefraction\textheight + \@fptop \@dblfptop + \@fpsep \@dblfpsep + \@fpbot \@dblfpbot + \def\f@depth{1sp}} +\def \@doclearpage {% + \ifvoid\footins + \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa + \setbox\@tempboxa\box\@cclv + \xdef\@deferlist{\@toplist\@botlist\@deferlist}% + \global \let \@toplist \@empty + \global \let \@botlist \@empty + \global \@colroom \@colht + \ifx \@currlist\@empty + \else + \@latexerr{Float(s) lost}\@ehb + \global \let \@currlist \@empty + \fi + \@makefcolumn\@deferlist + \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}% + \if@twocolumn + \if@firstcolumn + \xdef\@deferlist{\@dbltoplist\@deferlist}% + \global \let \@dbltoplist \@empty + \global \@colht \textheight + \begingroup + \@dblfloatplacement + \@makefcolumn\@deferlist + \@whilesw\if@fcolmade \fi{\@outputpage + \@makefcolumn\@deferlist}% + \endgroup + \else + \vbox{}\clearpage + \fi + \fi + \ifx\@deferlist\@empty \else\clearpage \fi + \else + \setbox\@cclv\vbox{\box\@cclv\vfil}% + \@makecol\@opcol + \clearpage + \fi +} +\def \@startdblcolumn {% + \@tryfcolumn \@deferlist + \if@fcolmade + \else + \begingroup + \let \reserved@b \@deferlist + \global \let \@deferlist \@empty + \let \@elt \@sdblcolelt + \reserved@b + \endgroup + \fi +} +\def\@addtonextcol{% + \begingroup + \@insertfalse + \@setfloattypecounts + \ifnum \@fpstype=8 + \else + \ifnum \@fpstype=24 + \else + \@flsettextmin + \@reqcolroom \ht\@currbox + \advance \@reqcolroom \@textmin + \ifdim \@colroom>\@reqcolroom + \@flsetnum \@colnum + \ifnum\@colnum>\z@ + \@bitor\@currtype\@deferlist + \@testwrongwidth\@currbox + \if@test + \else + \@addtotoporbot + \fi + \fi + \fi + \fi + \fi + \if@insert + \else + \@cons\@deferlist\@currbox + \fi + \endgroup +} +\def\@addtodblcol{% + \begingroup + \@insertfalse + \@setfloattypecounts + \@getfpsbit \tw@ + \ifodd\@tempcnta + \@flsetnum \@dbltopnum + \ifnum \@dbltopnum>\z@ + \@tempswafalse + \ifdim \@dbltoproom>\ht\@currbox + \@tempswatrue + \else + \ifnum \@fpstype<\sixt@@n + \advance \@dbltoproom \@textmin + \ifdim \@dbltoproom>\ht\@currbox + \@tempswatrue + \fi + \advance \@dbltoproom -\@textmin + \fi + \fi + \if@tempswa + \@bitor \@currtype \@deferlist + \@testwrongwidth\@currbox + \if@test + \else + \@tempdima -\ht\@currbox + \advance\@tempdima + -\ifx \@dbltoplist\@empty \dbltextfloatsep \else + \dblfloatsep \fi + \global \advance \@dbltoproom \@tempdima + \global \advance \@colht \@tempdima + \global \advance \@dbltopnum \m@ne + \@cons \@dbltoplist \@currbox + \@inserttrue + \fi + \fi + \fi + \fi + \if@insert + \else + \@cons\@deferlist\@currbox + \fi + \endgroup +} +\def \@addtocurcol {% + \@insertfalse + \@setfloattypecounts + \ifnum \@fpstype=8 + \else + \ifnum \@fpstype=24 + \else + \@flsettextmin + \advance \@textmin \@textfloatsheight + \@reqcolroom \@pageht + \ifdim \@textmin>\@reqcolroom + \@reqcolroom \@textmin + \fi + \advance \@reqcolroom \ht\@currbox + \ifdim \@colroom>\@reqcolroom + \@flsetnum \@colnum + \ifnum \@colnum>\z@ + \@bitor\@currtype\@deferlist + \@testwrongwidth\@currbox + \if@test + \else + \@bitor\@currtype\@botlist + \if@test + \@addtobot + \else + \ifodd \count\@currbox + \advance \@reqcolroom \intextsep + \ifdim \@colroom>\@reqcolroom + \global \advance \@colnum \m@ne + \global \advance \@textfloatsheight \ht\@currbox + \global \advance \@textfloatsheight 2\intextsep + \@cons \@midlist \@currbox + \if@nobreak + \nobreak + \@nobreakfalse + \everypar{}% + \else + \addpenalty \interlinepenalty + \fi + \vskip \intextsep + \box\@currbox + \penalty\interlinepenalty + \vskip\intextsep + \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi + \outputpenalty \z@ + \@inserttrue + \fi + \fi + \if@insert + \else + \@addtotoporbot + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \if@insert + \else + \@resethfps + \@cons\@deferlist\@currbox + \fi +} +\def\@xtryfc #1{% + \@next\reserved@a\@trylist{}{}% + \@currtype \count #1% + \divide\@currtype\@xxxii + \multiply\@currtype\@xxxii + \@bitor \@currtype \@failedlist + \@testfp #1% + \@testwrongwidth #1% + \ifdim \ht #1>\@colht + \@testtrue + \fi + \if@test + \@cons\@failedlist #1% + \else + \@ytryfc #1% + \fi} +\def\@ztryfc #1{% + \@tempcnta\count #1% + \divide\@tempcnta\@xxxii + \multiply\@tempcnta\@xxxii + \@bitor \@tempcnta {\@failedlist \@flfail}% + \@testfp #1% + \@testwrongwidth #1% + \@tempdimb\@tempdima + \advance\@tempdimb\ht #1% + \advance\@tempdimb\@fpsep + \ifdim \@tempdimb >\@colht + \@testtrue + \fi + \if@test + \@cons\@flfail #1% + \else + \@cons\@flsucceed #1% + \@tempdima\@tempdimb + \fi} +\def\@{\spacefactor\@m{}} +\def\@tempa#1#2{#1#2\relax} +\ifx\setlength\@tempa + \def\setlength#1#2{#1 #2\relax} +\fi +\def\addpenalty#1{% + \ifvmode + \if@minipage + \else + \if@nobreak + \else + \ifdim\lastskip=\z@ + \penalty#1\relax + \else + \@tempskipb\lastskip + \begingroup + \advance \@tempskipb + \ifdim\prevdepth>\maxdepth\maxdepth\else + \ifdim \prevdepth = -\@m\p@ \z@ \else \prevdepth \fi + \fi + \vskip -\@tempskipb + \penalty#1% + \vskip\@tempskipb + \endgroup + \vskip -\@tempskipb + \vskip \@tempskipb + \fi + \fi + \fi + \else + \@noitemerr + \fi} +\def\@fnsymbol#1{% + \ifcase#1\or \TextOrMath\textasteriskcentered *\or + \TextOrMath \textdagger \dagger\or + \TextOrMath \textdaggerdbl \ddagger \or + \TextOrMath \textsection \mathsection\or + \TextOrMath \textparagraph \mathparagraph\or + \TextOrMath \textbardbl \|\or + \TextOrMath {\textasteriskcentered\textasteriskcentered}{**}\or + \TextOrMath {\textdagger\textdagger}{\dagger\dagger}\or + \TextOrMath {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}\else + \@ctrerr \fi +} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname eTeXversion\endcsname\relax +\DeclareRobustCommand\TextOrMath{% + \ifmmode \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\protected@edef\TextOrMath#1#2{\TextOrMath{#1}{#2}} +\else +\protected\expandafter\def\csname TextOrMath\space\endcsname{% + \ifmmode \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\edef\TextOrMath#1#2{% + \expandafter\noexpand\csname TextOrMath\space\endcsname + {#1}{#2}} +\fi +\def\@esphack{% + \relax + \ifhmode + \spacefactor\@savsf + \ifdim\@savsk>\z@ + \nobreak \hskip\z@skip % <------ + \ignorespaces + \fi + \fi} +\def\@Esphack{% + \relax + \ifhmode + \spacefactor\@savsf + \ifdim\@savsk>\z@ + \nobreak \hskip\z@skip % <------ + \@ignoretrue + \ignorespaces + \fi + \fi} +\DeclareRobustCommand\em + {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ + \eminnershape \else \itshape \fi} +\def\eminnershape{\upshape} +\DeclareRobustCommand*\textsubscript[1]{% + \@textsubscript{\selectfont#1}} +\def\@textsubscript#1{% + {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}} +\def\@DeclareMathSizes #1#2#3#4#5{% + \@defaultunits\dimen@ #2pt\relax\@nnil + \if $#3$% + \expandafter\let\csname S@\strip@pt\dimen@\endcsname\math@fontsfalse + \else + \@defaultunits\dimen@ii #3pt\relax\@nnil + \@defaultunits\@tempdima #4pt\relax\@nnil + \@defaultunits\@tempdimb #5pt\relax\@nnil + \toks@{#1}% + \expandafter\xdef\csname S@\strip@pt\dimen@\endcsname{% + \gdef\noexpand\tf@size{\strip@pt\dimen@ii}% + \gdef\noexpand\sf@size{\strip@pt\@tempdima}% + \gdef\noexpand\ssf@size{\strip@pt\@tempdimb}% + \the\toks@ + }% + \fi +} +\providecommand*\MakeRobust[1]{% + \@ifundefined{\expandafter\@gobble\string#1}{% + \@latex@error{The control sequence `\string#1' is undefined!% + \MessageBreak There is nothing here to make robust}% + \@eha + }% + {% + \@ifundefined{\expandafter\@gobble\string#1\space}% + {% + \expandafter\let\csname + \expandafter\@gobble\string#1\space\endcsname=#1% + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect\noexpand#1% + \fi + \noexpand\protect\expandafter\noexpand + \csname\expandafter\@gobble\string#1\space\endcsname}% + }% + {\@latex@info{The control sequence `\string#1' is already robust}}% + }% +} +\MakeRobust\( +\MakeRobust\) +\MakeRobust\[ +\MakeRobust\] +\MakeRobust\makebox +\MakeRobust\savebox +\MakeRobust\framebox +\MakeRobust\parbox +\MakeRobust\rule +\MakeRobust\raisebox +\def\@xfloat #1[#2]{% + \@nodocument + \def \@captype {#1}% + \def \@fps {#2}% + \@onelevel@sanitize \@fps + \def \reserved@b {!}% + \ifx \reserved@b \@fps + \@fpsadddefault + \else + \ifx \@fps \@empty + \@fpsadddefault + \fi + \fi + \ifhmode + \@bsphack + \@floatpenalty -\@Mii + \else + \@floatpenalty-\@Miii + \fi + \ifinner + \@parmoderr\@floatpenalty\z@ + \else + \@next\@currbox\@freelist + {% + \@tempcnta \sixt@@n + \expandafter \@tfor \expandafter \reserved@a + \expandafter :\expandafter =\@fps + \do + {% + \if \reserved@a h% + \ifodd \@tempcnta + \else + \advance \@tempcnta \@ne + \fi + \else\if \reserved@a t% + \@setfpsbit \tw@ + \else\if \reserved@a b% + \@setfpsbit 4% + \else\if \reserved@a p% + \@setfpsbit 8% + \else\if \reserved@a !% + \ifnum \@tempcnta>15 + \advance\@tempcnta -\sixt@@n\relax + \fi + \else + \@latex@error{Unknown float option `\reserved@a'}% + {Option `\reserved@a' ignored and `p' used.}% + \@setfpsbit 8% + \fi\fi\fi\fi\fi + }% + \@tempcntb \csname ftype@\@captype \endcsname + \multiply \@tempcntb \@xxxii + \advance \@tempcnta \@tempcntb + \global \count\@currbox \@tempcnta + }% + \@fltovf + \fi + \global \setbox\@currbox + \color@vbox + \normalcolor + \vbox \bgroup + \hsize\columnwidth + \@parboxrestore + \@floatboxreset +} + \def\@stpelt#1{\global\csname c@#1\endcsname \m@ne\stepcounter{#1}} +\EndIncludeInRelease +%</fixltx2e> +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/latexrelease.ins b/Master/texmf-dist/source/latex-dev/base/latexrelease.ins new file mode 100644 index 00000000000..1ddcfc4c290 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/latexrelease.ins @@ -0,0 +1,148 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2018 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2018 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +%\keepsilent +\usedir{tex/latex/base} + +\generateFile{latexrelease.sty}{t}{% + \from{ltclass.dtx} {latexreleasefirst,tracerollback}% + \from{ltvers.dtx} {latexrelease}% + \from{latexrelease.dtx}{latexrelease}% + \from{ltdirchk.dtx} {latexrelease}% + \from{ltdefns.dtx} {latexrelease}% + \from{ltalloc.dtx} {latexrelease}% empty + \from{ltcntrl.dtx} {latexrelease}% empty + \from{lterror.dtx} {latexrelease}% empty + \from{ltpar.dtx} {latexrelease}% empty + \from{ltlists.dtx} {latexrelease}% empty + \from{ltboxes.dtx} {latexrelease}% + \from{lttab.dtx} {latexrelease}% empty + \from{ltmath.dtx} {latexrelease}% + \from{ltpictur.dtx} {latexrelease}% + \from{ltthm.dtx} {latexrelease}% empty + \from{ltsect.dtx} {latexrelease}% empty + \from{ltfiles.dtx} {latexrelease}% + \from{ltoutenc.dtx} {latexrelease}% + \from{ltcounts.dtx} {latexrelease}% + \from{ltlength.dtx} {latexrelease}% + \from{ltfloat.dtx} {latexrelease}% + \from{ltidxglo.dtx} {latexrelease}% empty + \from{ltbibl.dtx} {latexrelease}% empty + \from{ltpage.dtx} {latexrelease}% empty + \from{ltoutput.dtx} {latexrelease}% + \from{ltclass.dtx} {latexrelease,tracerollback}% + \from{ltspace.dtx} {latexrelease}% + \from{ltlogos.dtx} {latexrelease}% empty + \from{ltplain.dtx} {latexrelease}% + \from{ltfssdcl.dtx} {latexrelease}% + \from{ltfssini.dtx} {latexrelease}% + \from{fontdef.dtx} {latexrelease}% (covering fontmath and fonttext) + \from{ltfntcmd.dtx} {latexrelease}% empty + \from{ltfssbas.dtx} {latexrelease}% + \from{ltfsstrc.dtx} {latexrelease}% empty + \from{ltfsscmp.dtx} {latexrelease}% + \from{ltpageno.dtx} {latexrelease}% empty + \from{ltxref.dtx} {latexrelease}% empty + \from{ltmiscen.dtx} {latexrelease}% + \from{ltluatex.dtx} {latexrelease}% + \from{ltfinal.dtx} {latexrelease}% +} + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space latexrelease.sty} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX2e.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + + +\generateFile{fixltx2e.sty}{t}{% + \from{latexrelease.dtx}{fixltx2e}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/latexsym.dtx b/Master/texmf-dist/source/latex-dev/base/latexsym.dtx new file mode 100644 index 00000000000..58e88d63649 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/latexsym.dtx @@ -0,0 +1,203 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% +% \iffalse % this is a METACOMMENT ! +% +% File `latexsym.dtx'. +% Copyright 1994-1998 by Frank Mittelbach. All rights reserved. +% +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{latexsym} +%<fd>\ProvidesFile{ulasy.fd} +%<-driver> [1998/08/17 v2.2e +%<package> Standard LaTeX package (lasy symbols)] +%<fd> LaTeX symbol font definitions] +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{latexsym} +\GetFileInfo{latexsym.sty} +\providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +\title{The \LaTeX{} symbol fonts for use with + \LaTeXe.\thanks{This file has version + number \fileversion, dated \filedate.}} +\date{\filedate} +\author{Frank Mittelbach} +\begin{document} +\MaintainedByLaTeXTeam{latex} +\maketitle + \DocInput{latexsym.dtx} +\end{document} +%</driver> +% \fi +% +% \changes{v2.2e}{1998/08/17}{Documentation fixes.} +% +% \section{Introduction} +% +% This file defines the package |latexsym| which makes the few +% additional characters available that come from the |lasy| fonts +% (\LaTeX's symbol fonts). These fonts are not automatically +% included in the NFSS2/\LaTeXe{} since they take up important +% space and aren't necessary if one makes use of the packages +% \texttt{amsfonts} or \texttt{amssymb}. +% +% The commands defined by the \texttt{latexsym} package are: +% \begin{quote}\raggedright +% |\mho|~$\mho$ \quad +% |\Join|~$\Join$ \quad +% |\Box|~$\Box$ \quad +% |\Diamond|~$\Diamond$ \quad +% |\leadsto|~$\leadsto$ \quad +% |\sqsubset|~$\sqsubset$ \quad +% |\sqsupset|~$\sqsupset$ \quad +% |\lhd|~$\lhd$ \quad +% |\unlhd|~$\unlhd$ \quad +% |\rhd|~$\rhd$ \quad +% |\unrhd|~$\unrhd$ +% \end{quote} +% +% \StopEventually{} +% +% \section{The \dst{} modules} +% +% The following modules are used in the implementation to direct +% \dst{} in generating the external files: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% package & produce a package file \\ +% fd & produce a font definition file +% \end{tabular} +% \end{center} +% +% +% \section{The Implementation} +% +% The individual files generated from this code are identified at the +% very top of this file by a couple of lines looking like this: +% \begin{verbatim} +% %<fd>\ProvidesFile{Ulasy.fd} +% %<-driver> [????/??/?? v2.2? +% %<package> Standard LaTeX package (lasy symbols)] +% %<fd> LaTeX symbol font definitions] +%\end{verbatim} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macro}{\symlasy} +% +% It is possible to detect whether or not the \LaTeX{} symbols are +% already defined by checking for the math group number with the +% name |\symlasy|. +% +% In that case we exit but write a message to the transcript file. +% \begin{macrocode} +\ifx\symlasy\undefined \else + \wlog{Package latexsym: nothing to set up^^J}% + \endinput \fi +% \end{macrocode} +% Otherwise we define the new symbol font. +% \begin{macrocode} + \DeclareSymbolFont{lasy}{U}{lasy}{m}{n} + \SetSymbolFont{lasy}{bold}{U}{lasy}{b}{n} +% \end{macrocode} +% \end{macro} +% +% +% Because the lasy symbols are made an error in the format we have +% to undefine them before we can set them anew with +% |\DeclareMathSymbol|. +% \begin{macrocode} + \let\mho\undefined \let\sqsupset\undefined + \let\Join\undefined \let\lhd\undefined + \let\Box\undefined \let\unlhd\undefined + \let\Diamond\undefined \let\rhd\undefined + \let\leadsto\undefined \let\unrhd\undefined + \let\sqsubset\undefined +% \end{macrocode} +% \changes{v2.2a}{1995/03/18}{\cs{lhd} and friends should be bin ops.} +% \begin{macrocode} + \DeclareMathSymbol\mho {\mathord}{lasy}{"30} + \DeclareMathSymbol\Join {\mathrel}{lasy}{"31} + \DeclareMathSymbol\Box {\mathord}{lasy}{"32} + \DeclareMathSymbol\Diamond {\mathord}{lasy}{"33} + \DeclareMathSymbol\leadsto {\mathrel}{lasy}{"3B} + \DeclareMathSymbol\sqsubset{\mathrel}{lasy}{"3C} + \DeclareMathSymbol\sqsupset{\mathrel}{lasy}{"3D} + \DeclareMathSymbol\lhd {\mathbin}{lasy}{"01} + \DeclareMathSymbol\unlhd {\mathbin}{lasy}{"02} + \DeclareMathSymbol\rhd {\mathbin}{lasy}{"03} + \DeclareMathSymbol\unrhd {\mathbin}{lasy}{"04} +% \end{macrocode} +% To save some space we can remove the definition of |\not@base| +% since it isn't any longer needed. (We use |\@undefined| so that +% gives an error and not a recursive definition +% if it is still used somewhere.) +% \changes{v2.2b}{1995/07/03}{Free space for \cs{not@base}} +% \begin{macrocode} + \let\not@base\@undefined +%</package> +% \end{macrocode} +% +% \subsection{\LaTeX{} symbols fonts} +% +% \changes{v2.2d}{1996/11/20}{lowercase ulasy.fd /1044} +% The rest of this file defines the the font shape declarations +% that have to go into the corresponding |.fd| file. +% +% \begin{macrocode} +%<*fd> +\DeclareFontFamily{U}{lasy}{} +\DeclareFontShape{U}{lasy}{m}{n}{ <5> <6> <7> <8> <9> gen * lasy + <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88>lasy10 }{} +% \end{macrocode} +% Since there are no bold lasy symbols below 10pt we silently +% substitute them by the medium ones to avoid terminal warnings if +% |\boldmath| is selected. +% \begin{macrocode} +\DeclareFontShape{U}{lasy}{b}{n}{ <-10> ssub * lasy/m/n + <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88>lasyb10 }{} +%</fd> +% \end{macrocode} +% +% The next line goes into all files and in addition prevents \dst{} +% from adding any further code from the main source file (such as a +% character table). +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \DeleteShortVerb{\|} +% \Finale +% +% diff --git a/Master/texmf-dist/source/latex-dev/base/latexsym.ins b/Master/texmf-dist/source/latex-dev/base/latexsym.ins new file mode 100644 index 00000000000..031e1d40629 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/latexsym.ins @@ -0,0 +1,157 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\declarepreamble\fdpreamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generate{ + \file{latexsym.sty}{% + \from{latexsym.dtx}{package}} + \usepreamble\fdpreamble + \file{ulasy.fd}{ + \from{latexsym.dtx}{fd}} + } + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space latexsym.sty} +\Msg{* \space\space *.fd} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile + + + + + diff --git a/Master/texmf-dist/source/latex-dev/base/letter.dtx b/Master/texmf-dist/source/latex-dev/base/letter.dtx new file mode 100644 index 00000000000..d3d3fa4e6ab --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/letter.dtx @@ -0,0 +1,1903 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% +% \iffalse +% \section{Identification} +% +% +% This document class can only be used with \LaTeXe, so we make +% sure that an appropriate message is displayed when another \TeX{} +% format is used. +% \begin{macrocode} +%<+letter>\NeedsTeXFormat{LaTeX2e}[1996/06/01] +% \end{macrocode} +% +% Announce the Class name and its version. +% \begin{macrocode} +%<+letter>\ProvidesClass{letter} +%<*driver> + \ProvidesFile{letter.drv} +%</driver> + [2014/09/29 v1.2z +%<+letter> Standard LaTeX document class] +% \end{macrocode} +% +% \section{The documentation driver file} +% +% We have our own document class to format the \LaTeXe{} +% documentation. +% \fi +% \changes{v1.0}{1993/12/07}{Use class ltxdoc document class} +% \iffalse +% \begin{macrocode} +%<*driver> +] +\documentclass{ltxdoc} +% \end{macrocode} +% +% We don't want everything to appear in the index. +% \begin{macrocode} +\DoNotIndex{\@Alph,\@alph,\@arabic,\@badmath} +\DoNotIndex{\@centercr} +\DoNotIndex{\@empty,\@ignoretrue} +\DoNotIndex{\@ixpt} +\DoNotIndex{\@M,\@minus,\@ne,\@plus} +\DoNotIndex{\\,\addtolength} +\DoNotIndex{\advance} +\DoNotIndex{\ast,\begin,\begingroup,\bfseries,\bgroup,\box} +\DoNotIndex{\bullet} +\DoNotIndex{\cdot,\cr,\day,\DeclareOption} +\DoNotIndex{\def,\DocInput,\documentclass} +\DoNotIndex{\DoNotIndex,\egroup,\ifx,\else,\fi,\endtrivlist} +\DoNotIndex{\EnableCrossrefs,\end,\end@dblfloat,\end@float,\endgroup} +\DoNotIndex{\endlist,\everycr,\ExecuteOptions} +\DoNotIndex{\filedate,\filename,\fileversion} +\DoNotIndex{\global,\halign,\hangindent,\hbox,\hfil,\hfill,\hrule} +\DoNotIndex{\hsize,\hskip,\hspace,\hss,\ifcase,\or,\fi} +\DoNotIndex{\ifvmode,\fi,\ifnum,\fi,\input} +\DoNotIndex{\kern,\leavevmode,\let,\leftmark} +\DoNotIndex{\list,\llap,\long,\m@ne,\m@th,\mark} +\DoNotIndex{\month,\newcommand,\newcounter,\newenvironment} +\DoNotIndex{\NeedsTeXFormat,\newdimen} +\DoNotIndex{\newpage,\nobreak,\noindent,\number} +\DoNotIndex{\p@} +\DoNotIndex{\pagestyle,\par} +\DoNotIndex{\penalty,\PrintChanges,\PrintIndex,\ProcessOptions} +\DoNotIndex{\protect,\ProvidesClass,\raggedbottom,\raggedright} +\DoNotIndex{\refstepcounter,\relax,\renewcommand,\reset@font} +\DoNotIndex{\rightmargin,\rlap,\rmfamily} +\DoNotIndex{\setbox,\setcounter,\setlength} +\DoNotIndex{\skip,\slshape,\space} +\DoNotIndex{\trivlist,\typeout,\tw@} +\DoNotIndex{\vskip,\vspace,\year,\z@} +% +\CodelineNumbered +\CodelineIndex +\EnableCrossrefs +\RecordChanges +% \end{macrocode} +% We use so many \file{docstrip} modules that we set the +% \texttt{StandardModuleDepth} counter to 1. +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% The following command retrieves the date and version information +% from the file. +% \begin{macrocode} +\GetFileInfo{letter.drv} +% \end{macrocode} +% Some commonly used abbreviations +% \begin{macrocode} +\newcommand*{\Lopt}[1]{\textsf {#1}} +\newcommand*{\file}[1]{\texttt {#1}} +\newcommand*{\Lcount}[1]{\textsl {\small#1}} +\newcommand*{\pstyle}[1]{\textsl {#1}} +% \end{macrocode} +% We also want the full details. +% \begin{macrocode} +\begin{document} +\DocInput{letter.dtx} +\PrintIndex +% ^^A\PrintChanges +\end{document} +%</driver> +% \end{macrocode} +% \fi +% +% \changes{v1.1}{1993/12/18}{Changes to make it work with +% compatibility mode.} +% \changes{v1.1a}{1993/12/19}{Removed float parms} +% +% \changes{v1.1c}{1994/01/17}{Moved definition of \cs{@textop} to +% initialization section, to counteract setting of \cs{@texttop} in +% \cs{raggedbottom}.} +% +% \changes{v1.1d}{1994/01/20}{Corrected margins: Now computed from +% \cs{paperwidth} and \cs{textwidth}, so that the text is +% horizontally centered.} +% \changes{v1.1e}{1994/02/03}{Corrected checksum} +% +% \changes{v1.2a}{1994/02/12}{Removed onecolumn and twocolumn options.} +% \changes{v1.2a}{1994/02/12}{Changed label producing commands in .aux +% file.} +% +% \changes{v1.2b}{1994/02/28}{Moved driver further up.} +% +% \changes{v1.2c}{1994/03/08}{Always write .aux file.} +% \changes{v1.2f}{1994/04/29}{Use LaTeX instead of LaTeX2e in messages} +% \changes{v1.2f}{1994/04/29}{Removed \cs{typeout} message} +% \changes{v1.2g}{1994/05/01}{Removed the use of \cs{fileversion} +% c.s.} +% \changes{v1.2j}{1994/06/01}{Corrected driver code.} +% \changes{v1.2k}{1994/06/17}{Various documentation enhancements} +% \changes{v1.2p}{1994/12/11}{Use \cs{newcommand*} to define +% user-level commands that take an argument} +% \changes{v1.2q}{1995/05/17}{cleaned up \cs{changes entries}} +% \changes{v1.2q}{1995/05/18}{replaced \cs{hbox to} by \cs{hb@xt@}} +% \changes{v1.2r}{1995/05/23}{removed a superfluous brace} +% +% \iffalse +% Copyright (C) 1994 LaTeX3 project, Frank Mittelbach +% and Rainer Sch\"opf, all rights reserved. +% \fi +% +% \author{Leslie Lamport and Frank Mittelbach and Rainer Sch\"opf} +% +% \title{Standard Letter Document Class for \LaTeX{} version 2e} +% +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% \tableofcontents +% +% \StopEventually +% +% +% \section{Initial Code} +% +% In this part we define a few commands that are used later on. +% +% \begin{macro}{\@ptsize} +% This control sequence is used to store the second digit of the +% pointsize we are typesetting in. So, normally, it's value is one +% of 0, 1 or 2. +% \begin{macrocode} +%<*letter> +\newcommand\@ptsize{} +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Setting Paper Sizes} +% +% The variables |\paperwidth| and |\paperheight| should reflect the +% physical paper size after trimming. For desk printer output this +% is usually the real paper size since there is no post-processing. +% \changes{v1.0a}{1993/12/14}{Corrected typo, A4 is not 279 mm high} +% \begin{macrocode} +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5paper} + {\setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}} +\DeclareOption{b5paper} + {\setlength\paperheight {250mm}% + \setlength\paperwidth {176mm}} +\DeclareOption{letterpaper} + {\setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{legalpaper} + {\setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{executivepaper} + {\setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}} +% \end{macrocode} +% +% \changes{v1.2o}{1994/08/26}{Added the option \textsf{landscape}} +% The option \Lopt{landscape} switches the values of |\paperheight| +% and |\paperwidth|, assuming the dimensions were given for portrait +% paper. +% \begin{macrocode} +\DeclareOption{landscape} + {\setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}} +% \end{macrocode} +% +% \subsection{Choosing the type size} +% +% The type size options are handled by defining |\@ptsize| to +% contain the last digit of the size in question and branching on +% |\ifcase| statements. This is done for historical reasons to stay +% compatible with other packages that use the |\@ptsize| variable +% to select special actions. It makes the declarations of size +% options less than 10pt difficult, although one can probably use +% \texttt{9} and \texttt{8} assuming that a class wont define both +% \Lopt{8pt} and \Lopt{18pt} options. +% +% \begin{macrocode} +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\DeclareOption{11pt}{\renewcommand\@ptsize{1}} +\DeclareOption{12pt}{\renewcommand\@ptsize{2}} +% \end{macrocode} +% +% +% \subsection{Two-side or one-side printing} +% +% Two-sided printing was not supported in the \LaTeX~2.09 version +% of this document class. +% \changes{v1.2e}{1994/04/28}{Added oneside option and twoside option +% in native mode} +% \begin{macrocode} +\if@compatibility + \DeclareOption{twoside}{\@latexerr{No `twoside' layout for letters}% + \@eha} +\else + \DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\fi +% \end{macrocode} +% +% +% \begin{macrocode} +\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} +% \end{macrocode} +% +% \subsection{Draft option} +% +% If the user requests \Lopt{draft} we show any overfull boxes. +% We could probably add some more interesting stuff to this option. +% \begin{macrocode} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +% \end{macrocode} +% +% +% \subsection{Equation numbering on the left} +% +% The option \Lopt{leqno} can be used to get the equation numbers +% on the left side of the equation. +% \changes{v1.1c}{1994/01/17}{Option leqno now read from +% \file{leqno.clo}.} +% \begin{macrocode} +\DeclareOption{leqno}{\input{leqno.clo}} +% \end{macrocode} +% +% \subsection{Flush left displays} +% +% The option \Lopt{fleqn} redefines the displayed math environments +% in such a way that they come out flush left, with an indentation +% of |\mathindent| from the prevailing left margin. +% \changes{v1.1}{1993/12/18}{Corrected typo in \cs{renewcommand}, +% doubled hash marks.} +% \changes{v1.1c}{1994/01/17}{Option fleqn now read from +% \file{fleqn.clo}.} +% \begin{macrocode} +\DeclareOption{fleqn}{\input{fleqn.clo}} +% \end{macrocode} +% +% +% \section{Executing Options} +% +% Here we execute the default options to initialize certain +% variables. +% \changes{v1.2e}{1994/04/28}{Added execution of `oneside' option} +% \begin{macrocode} +\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final} +% \end{macrocode} +% +% The |\ProcessOptions| command causes the execution of the code +% for every option \Lopt{foo} which is declared and for which the +% user typed the \Lopt{foo} option in his |\documentclass| command. +% For every option \Lopt{bar} he typed, which is not declared, the +% option is assumed to be a global option. All options will be +% passed as document options to any |\usepackage| command in the +% document preamble. +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% Now that all the options have been executed we can load the +% chosen class option file that contains all size dependent code. +% \begin{macrocode} +\input{size1\@ptsize.clo} +% \end{macrocode} +% +% +% \section{Loading Packages} +% +% The standard class files do not load additional packages. +% +% +% \section{Document Layout} +% \label{sec:maincode} +% +% In this section we are finally dealing with the nasty typographical +% details. +% +% \subsection{Paragraphing} +% +% \begin{macro}{\lineskip} +% \begin{macro}{\normallineskip} +% These parameters control \TeX's behavior when two lines tend to +% come too close together. +% \begin{macrocode} +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\baselinestretch} +% This is used as a multiplier for |\baselineskip|. The default is +% to {\em not\/} stretch the baselines. +% \begin{macrocode} +\renewcommand\baselinestretch{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parskip} +% \begin{macro}{\parindent} +% |\parskip| gives extra vertical space between paragraphs and +% |\parindent| is the width of the paragraph indentation. +% Letters are typeset without paragraph indentation. +% \begin{macrocode} +\setlength\parskip{0.7em} +\setlength\parindent{0\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@lowpenalty} +% \begin{macro}{\@medpenalty} +% \begin{macro}{\@highpenalty} +% The commands |\nopagebreak| and |\nolinebreak| put in penalties +% to discourage these breaks at the point they are put in. +% They use |\@lowpenalty|, |\@medpenalty| or |\@highpenalty|, +% dependent on their argument. +% \begin{macrocode} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\clubpenalty} +% \begin{macro}{\widowpenalty} +% These penalties are used to discourage club and widow lines. +% Because we use their default values we only show them here, +% commented out. +% \begin{macrocode} +% \clubpenalty 150 +% \widowpenalty 150 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\displaywidowpenalty} +% \begin{macro}{\predisplaypenalty} +% \begin{macro}{\postdisplaypenalty} +% Discourage (but not so much) widows in front of a math display +% and forbid breaking directly in front of a display. Allow break +% after a display without a penalty. Again the default values are +% used, therefore we only show them here. +% \begin{macrocode} +% \displaywidowpenalty 50 +% \predisplaypenalty 10000 +% \postdisplaypenalty 0 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\interlinepenalty} +% Allow the breaking of a page in the middle of a paragraph. +% \begin{macrocode} +% \interlinepenalty 0 +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\brokenpenalty} +% We allow the breaking of a page after a hyphenated line. +% \begin{macrocode} +% \brokenpenalty 0 +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Page Layout} +% +% All margin dimensions are measured from a point one inch from the +% top and lefthand side of the page. +% +% \subsubsection{Vertical spacing} +% +% \begin{macro}{\headheight} +% \begin{macro}{\headsep} +% The |\headheight| is the height of the box that will contain the +% running head. The |\headsep| is the distance between the bottom +% of the running head and the top of the text. |\topskip| is the +% |\baselineskip| for the first line on a page, its value depends +% on the size option that was specified. Therefore it is +% initialized in one of the \file{size1x.clo} files. +% \begin{macrocode} +\setlength\headheight{12\p@} +\setlength\headsep {45\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footskip} +% The distance from the baseline of the box which contains the +% running footer to the baseline of last line of text is controlled +% by the |\footskip|. +% Bottom of page: +% \begin{macrocode} +\setlength\footskip{25\p@} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2n}{1994/07/13}{Setting of \cs{maxdepth} and +% \cs{@maxdepth} already happens in the size.. files, removed +% here} +% +% \subsubsection{The dimension of text} +% +% \begin{macro}{\textwidth} +% When we are in compatibility mode we have to make sure that the +% dimensions of the printed area are not different from what the +% user was used to see. +% +% \changes{v1.2n}{1994/07/13}{Setting \cs{textwidth} to a fixed value +% should only happen in compatibility mode} +% \begin{macrocode} +\if@compatibility + \setlength\textwidth{365\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textheight} +% Now that we have computed the width of the text, we have to take +% care of the height. The |\textheight| is the height of text +% (including footnotes and figures, excluding running head and +% foot). +% \changes{v1.2n}{1994/07/13}{Setting \cs{textheight} to a fixed value +% should only happen in compatibility mode} +% \begin{macrocode} + \setlength\textheight{505\p@} +\fi +% \end{macrocode} +% In native mode we use the dimensions as they were computed by one +% of the \Lopt{xxpt} options, together with one of the +% \Lopt{..paper} options. +% \end{macro} +% +% \subsubsection{Margins} +% +% \begin{macro}{\oddsidemargin} +% \begin{macro}{\evensidemargin} +% \begin{macro}{\marginparwidth} +% \changes{v1.1d}{1994/01/20}{Corrected margins: Now computed from +% \cs{paperwidth} and \cs{textwidth}.} The values of +% |\oddsidemargin| and |\evensidemargin| are computed from those of +% |\paperwidth| and |\textwidth|. +% \changes{v1.2n}{1994/07/13}{Added fixed values for these parameters +% in compatibility mode} +% \begin{macrocode} +\if@compatibility + \setlength\oddsidemargin{53pt} + \setlength\evensidemargin{53pt} + \setlength\marginparwidth{90pt} +\else + \setlength\@tempdima{\paperwidth} + \addtolength\@tempdima{-2in} + \addtolength\@tempdima{-\textwidth} + \setlength\oddsidemargin {.5\@tempdima} + \setlength\evensidemargin {\oddsidemargin} + \setlength\marginparwidth {90\p@} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\marginparsep} +% \begin{macro}{\marginparpush} +% The horizontal space between the main text and marginal notes is +% determined by |\marginparsep|, the minimum vertical separation +% between two marginal notes is controlled by |\marginparpush|. +% \begin{macrocode} +\setlength\marginparsep {11\p@} +\setlength\marginparpush{5\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\topmargin} +% The |\topmargin| is the distance between the top of `the +% printable area' --which is 1 inch below the top of the paper-- +% and the top of the box which contains the running head. +% +% It can now be computed from the values set above. +% \begin{macrocode} +\setlength\topmargin{27pt} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Footnotes} +% +% \begin{macro}{\footnotesep} +% |\footnotesep| is the height of the strut placed at the beginning +% of every footnote. It equals the height of a normal +% |\footnotesize| strut in this +% class, thus no extra space occurs between footnotes. +% \begin{macrocode} +\setlength\footnotesep{12\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footins} +% |\skip\footins| is the space between the last line of the main +% text and the top of the first footnote. +% \begin{macrocode} +\setlength{\skip\footins}{10\p@ \@plus 2\p@ \@minus 4\p@} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Page Styles} +% +% The page style \pstyle{foo} is defined by defining the command +% |\ps@foo|. This command should make only local definitions. +% There should be no stray spaces in the definition, since they +% could lead to mysterious extra spaces in the output (well, that's +% something that should be always avoided). +% +% \begin{macro}{\@evenhead} +% \begin{macro}{\@oddhead} +% \begin{macro}{\@evenfoot} +% \begin{macro}{\@oddfoot} +% The |\ps@...| command defines the macros |\@oddhead|, +% |\@oddfoot|, |\@evenhead|, and |\@evenfoot| to define the running +% heads and feet---e.g., |\@oddhead| is the macro to produce the +% contents of the heading box for odd-numbered pages. It is called +% inside an |\hbox| of width |\textwidth|. +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Marking conventions} +% +% To make headings determined by the sectioning commands, the page +% style defines the commands |\chaptermark|, |\sectionmark|, +% \ldots, where |\chaptermark{|\meta{text}|}| is called by +% |\chapter| to set a mark, and so on. +% +% The |\...mark| commands and the |\...head| macros are defined +% with the help of the following macros. (All the |\...mark| +% commands should be initialized to no-ops.) +% +% \LaTeX{} extends \TeX's |\mark| facility by producing two kinds +% of marks, a `left' and a `right' mark, using the following +% commands: +% \begin{flushleft} +% |\markboth{|\meta{left}|}{|\meta{right}|}|: Adds both marks. +% +% |\markright{|\meta{right}|}|: Adds a `right' mark. +% +% |\leftmark|: Used in the |\@oddhead|, |\@oddfoot|, |\@evenhead| +% or |\@evenfoot| macros, it gets the current `left' +% mark. |\leftmark| works like \TeX's |\botmark| +% command. +% +% |\rightmark|: Used in the |\@oddhead|, |\@oddfoot|, |\@evenhead| +% or |\@evenfoot| macros, it gets the current +% `right' mark. |\rightmark| works like \TeX's +% |\firstmark| command. +% \end{flushleft} +% +% The marking commands work reasonably well for right marks +% `numbered within' left marks--e.g., the left mark is changed by a +% |\chapter| command and the right mark is changed by a |\section| +% command. However, it does produce somewhat anomalous results if +% two |\markboth|'s occur on the same page. +% +% +% Commands like |\tableofcontents| that should set the marks in some +% page styles use a |\@mkboth| command, which is |\let| by the +% pagestyle command (|\ps@...|) to |\markboth| for setting the +% heading or to |\@gobbletwo| to do nothing. +% +% +% \subsubsection{Defining the page styles} +% \label{sec:pagestyle} +% +% The pagestyles \pstyle{empty} and \pstyle{plain} are defined in +% the \LaTeX{} kernel (\file{ltpage.dtx}), but these definitions +% are changed to a simpler version for this document class. +% +% \begin{macro}{\ps@headings} +% The definition of the page style \pstyle{headings} has to be +% different for two sided printing than it is for one sided +% printing. +% +% \changes{v1.2e}{1994/04/28}{Added twoside support} +% \begin{macrocode} +\if@twoside + \def\ps@headings{% +% \end{macrocode} +% The running feet are empty in this page style. +% \begin{macrocode} + \let\@oddfoot\@empty\let\@evenfoot\@empty +% \end{macrocode} +% The running head contains some information about this letter. The +% head is the same for even and odd pages. +% \changes{v1.2i}{1994/05/12}{Made running heads the same on odd and +% even pages} +% \changes{v1.2k}{1994/06/17}{Added a missing brace} +% \begin{macrocode} + \def\@oddhead{\slshape\headtoname{} \ignorespaces\toname + \hfil \@date + \hfil \pagename{} \thepage}% + \let\@evenhead\@oddhead} +% \end{macrocode} +% For one sided printing we don't need to define |\@evenhead| so +% the definition is somewhat simpler. +% \begin{macrocode} +\else + \def\ps@headings{% + \let\@oddfoot\@empty + \def\@oddhead{\slshape\headtoname{} \ignorespaces\toname + \hfil \@date + \hfil \pagename{} \thepage}} +\fi +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ps@empty} +% The definition of the page style \pstyle{empty} is simple: +% No running head or foot at all. +% \changes{v1.2e}{1994/04/28}{Also make even feet and head empty} +% \begin{macrocode} +\def\ps@empty{% + \let\@oddfoot\@empty\let\@oddhead\@empty + \let\@evenfoot\@empty\let\@evenhead\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@firstpage} +% The page style \pstyle{firstpage} puts the telephone number +% in the proper place for the letterhead. It should be adapted +% to site conventions. The size of the number is determined +% depending on the main size. +% \begin{macrocode} +\def\ps@firstpage{% + \let\@oddhead\@empty + \def\@oddfoot{\raisebox{-45\p@}[\z@]{% + \hb@xt@\textwidth{\hspace*{100\p@}% + \ifcase \@ptsize\relax + \normalsize + \or + \small + \or + \footnotesize + \fi + \fromlocation \hfill \telephonenum}}\hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@plain} +% The definition of the page style \pstyle{plain} is again simple. +% \changes{v1.2e}{1994/04/28}{Added definition of \cs{@evenfoot} +% because of twoside option} +% \changes{v1.2s}{1995/05/25}{replace \cs{rmfamily} with +% \cs{normalfont} (PR 1578)} +% \begin{macrocode} +\def\ps@plain{% + \let\@oddhead\@empty + \def\@oddfoot{\normalfont\hfil\thepage\hfil}% + \def\@evenfoot{\normalfont\hfil\thepage\hfil}} +% \end{macrocode} +% \end{macro} +% +% +% +% \section{Document Markup} +% +% \subsection{Global Declarations} +% +% \begin{macro}{\name} +% \begin{macro}{\signature} +% \begin{macro}{\address} +% \begin{macro}{\location} +% \begin{macro}{\telephone} +% The following declarations, shown with examples, give information +% about the sender: +% \begin{itemize} +% \item |\name{Dr. L. User}| : to be used for the return address on +% the envelope. +% \begin{macrocode} +\newcommand*{\name}[1]{\def\fromname{#1}} +% \end{macrocode} +% \item |\signature{Larry User}| : goes after the closing. +% \begin{macrocode} +\newcommand*{\signature}[1]{\def\fromsig{#1}} +% \end{macrocode} +% \item |\address{3245 Foo St.\\Gnu York}| : used as the return +% address in the +% letter and on the envelope. If not declared, then an +% institutional standard address is used. +% \begin{macrocode} +\newcommand*{\address}[1]{\def\fromaddress{#1}} +% \end{macrocode} +% \item |\location{Room 374}| : Acts as modifier to the standard +% institutional address. +% \begin{macrocode} +\newcommand*{\location}[1]{\def\fromlocation{#1}} +% \end{macrocode} +% \item |\telephone{(415)123-4567}| : Just in case some style puts it +% on the letter. +% \changes{v1.2m}{1994/06/23}{Removed typo (\#[] instead of [1])} +% \begin{macrocode} +\newcommand*{\telephone}[1]{\def\telephonenum{#1}} +% \end{macrocode} +% \end{itemize} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fromname} +% \begin{macro}{\fromsig} +% \begin{macro}{\fromaddress} +% \begin{macro}{\fromlocation} +% \begin{macro}{\telephonenum} +% We make sure that the internal control sequences that are used to +% store the information exist and are empty. +% \begin{macrocode} +\name{} +\signature{} +\address{} +\location{} +\telephone{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\makelabels} +% The |\makelabels| declaration causes mailing labels to be made. +% \begin{macrocode} +\newcommand*{\makelabels}{% +% \end{macrocode} +% At the beginning of the document, we need to activate the +% |\@mlabel| and |\@startlabels| commands, as well as write +% |\@startlabels| to the |.aux| file. +% \begin{macrocode} + \AtBeginDocument{% + \let\@startlabels\startlabels + \let\@mlabel\mlabel + \if@filesw + \immediate\write\@mainaux{\string\@startlabels}\fi}% +% \end{macrocode} +% At the end of the document we need to write |\clearpage| to the +% |.aux| file. +% \begin{macrocode} + \AtEndDocument{% + \if@filesw\immediate\write\@mainaux{\string\clearpage}\fi}} +% \end{macrocode} +% |\makelabels| is allowed only before the |\begin{document}| +% command. +% \begin{macrocode} +\@onlypreamble\makelabels +% \end{macrocode} +% \end{macro} +% +% \subsection{The generic letter commands} +% +% \begin{environment}{letter} +% The letter environment creates a new letter, starting from page +% $1$, with footnotes starting from $1$ as well. +% (The first page is unnumbered.) It has a single argument, which +% is the addressee and his address, as in +%\begin{verbatim} +% \begin{letter}{Sam Jones \\ +% Institute for Retarded Study\\ +% Princeton, N.J.} +%\end{verbatim} +% Local declarations, such as |\address|, can follow the +% |\begin{letter}|. +% \changes{v1.2e}{1994/04/28}{When printing twosided a new letter +% shouldn't start on the back of the previous one. Added insertion +% of a blank page when necessary.} +% \changes{v1.2z}{1999/04/29}{Reset footnote counter to 0, (PR 2957).} +% \begin{macrocode} +\newenvironment{letter}[1] + {\newpage + \if@twoside \ifodd\c@page + \else\thispagestyle{empty}\null\newpage\fi + \fi + \c@page \@ne + \c@footnote \z@ + \interlinepenalty=200 % smaller than the TeXbook value +% \end{macrocode} +% The |\leavevmode| and |\ignorespaces| commands are there for +% protecting against an empty argument. +% \begin{macrocode} + \@processto{\leavevmode\ignorespaces #1}} +% \end{macrocode} +% The end of the environment possibly writes the address +% information on the \file{.aux} file. +% \changes{v1.2p}{1994/12/11}{No longer redefine \cs{protect} but use +% one of the available settings} +% \begin{macrocode} + {\stopletter\@@par\pagebreak\@@par + \if@filesw + \begingroup + \let\\=\relax + \let\protect\@unexpandable@protect + \immediate\write\@auxout{% + \string\@mlabel{\returnaddress}{\toname\\\toaddress}}% + \endgroup + \fi} +% \end{macrocode} +% \end{environment} +% +% +% \begin{macro}{\@processto} +% \begin{macro}{\@xproc} +% \begin{macro}{\@yproc} +% |\@processto| gets the |\toname| and |\toaddress| from the letter +% environment's macro argument. |\@xproc| and |\@yproc| are auxiliary +% macros. +% \begin{macrocode} +\long\def\@processto#1{% + \@xproc #1\\@@@% + \ifx\toaddress\@empty + \else + \@yproc #1@@@% + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\@xproc #1\\#2@@@{\def\toname{#1}\def\toaddress{#2}} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\@yproc #1\\#2@@@{\def\toaddress{#2}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \subsubsection{Page breaking control} +% +% \begin{macro}{\stopbreaks} +% When the command |\stopbreaks| is issued no page breaks should +% occur until |\startbreaks| is called. +% \begin{macrocode} +\newcommand*{\stopbreaks}{% + \interlinepenalty\@M + \def\par{\@@par\nobreak}% + \let\\\@nobreakcr + \let\vspace\@nobreakvspace} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nobreakvspace} +% \changes{v1.2t}{1996/01/20}{Made robust pr/2049} +% \begin{macro}{\@nobreakvspacex} +% \begin{macro}{\@nobreakcr} +% These are needed by |\stopbreaks| +% \begin{macrocode} +\DeclareRobustCommand\@nobreakvspace + {\@ifstar\@nobreakvspacex\@nobreakvspacex} +% \end{macrocode} +% +% \begin{macrocode} +\def\@nobreakvspacex#1{% + \ifvmode + \nobreak\vskip #1\relax + \else + \@bsphack\vadjust{\nobreak\vskip #1}\@esphack + \fi} +% \end{macrocode} +% +% \changes{v1.2w}{1997/01/07} +% {Simplify definition, for ltspace 1.2u. /2341} +% \begin{macrocode} +\def\@nobreakcr{\@ifstar{\@normalcr*}{\@normalcr*}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\startbreaks} +% This cancels the effect of |\stopbreaks|. +% \begin{macrocode} +\newcommand*{\startbreaks}{% + \let\\\@normalcr + \interlinepenalty 200% + \def\par{\@@par\penalty 200\relax}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\longindentation} +% The size of the indent to use before the closing of the letter. +% \begin{macrocode} +\newdimen\longindentation +\longindentation=.5\textwidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\indentedwidth} +% The width of the closing of the letter. +% \begin{macrocode} +\newdimen\indentedwidth +\indentedwidth=\textwidth +\advance\indentedwidth -\longindentation +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\opening} +% Text is begun with the |\opening| command, whose argument +% generates the salutation, as in +%\begin{verbatim} +% \opening{Dear Henry,} +%\end{verbatim} +% This should produce everything up to and including the +% `Dear Henry,' and a |\par| command that follows. +% Since there's a |\vfil| at the bottom of every page, +% it can add vertical fill to position a short letter. +% It should use the following commands: +% \begin{itemize} +% \item |\toname| : name part of `to' address. +% Will be one line long. +% \item |\toaddress| : address part of `to' address. +% The lines separated by |\\|. +% \item |\fromname| : name of sender. +% \item |\fromaddress| : argument of current |\address| +% declaration-- null if none. Should use standard institutional +% address if null. +% \item |\fromlocation| : argument of current |\location| +% declaration--null if none. +% \item |\telephonenum| : argument of current |\telephone| +% declaration--null if none. +% \end{itemize} +% \begin{macrocode} +\newcommand*{\opening}[1]{\ifx\@empty\fromaddress + \thispagestyle{firstpage}% + {\raggedleft\@date\par}% + \else % home address + \thispagestyle{empty}% +% \end{macrocode} +% \changes{v1.2y}{1998/05/10}{Avoid space at right of tabular +% (pr2794)} +% \begin{macrocode} + {\raggedleft\begin{tabular}{l@{}}\ignorespaces + \fromaddress \\*[2\parskip]% + \@date \end{tabular}\par}% + \fi + \vspace{2\parskip}% + {\raggedright \toname \\ \toaddress \par}% + \vspace{2\parskip}% + #1\par\nobreak} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\closing} +% The body of the letter follows, ended by a |\closing| command, +% as in +%\begin{verbatim} +% \closing{Yours truly,} +%\end{verbatim} +% This command generates the closing matter, and the signature. +% An obvious thing to do is to use a |\parbox| for the closing +% and the signature. Should use the following: +% \begin{itemize} +% \item |\fromsig| : argument of current |\signature| declaration +% or, if null, the |\fromname|. +% \item |\stopbreaks| : a macro that inhibits page breaking. +% \end{itemize} +% \begin{macrocode} +\newcommand{\closing}[1]{\par\nobreak\vspace{\parskip}% + \stopbreaks + \noindent + \ifx\@empty\fromaddress\else + \hspace*{\longindentation}\fi + \parbox{\indentedwidth}{\raggedright + \ignorespaces #1\\[6\medskipamount]% + \ifx\@empty\fromsig + \fromname + \else \fromsig \fi\strut}% + \par} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smallskipamount} +% \begin{macro}{\medskipamount} +% \begin{macro}{\bigskipamount} +% Of these three, only |\medskipmount| is actually used above. +% \begin{macrocode} +%\smallskipamount=.5\parskip +\medskipamount=\parskip +%\bigskipamount=2\parskip +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cc} +% \begin{macro}{\encl} +% \begin{macro}{\ps} +% After the |\closing| you can put arbitrary stuff, which is typeset +% with zero |\parindent| and no page breaking. Commands designed +% for use after the closing are: +% \begin{verbatim} +% \cc{Tinker\\Evers\\Chance} +%\end{verbatim} +% which produces:\\ +% \begin{tabular}{ll} +% cc: & Tinker\\ +% & Evers\\ +% & Chance +% \end{tabular}\\ +% Note the obvious use of |\parbox|. +% \changes{v1.2s}{1995/05/25}{replace \cs{reset@font} with +% \cs{normalfont}; remove \cs{rm}} +% \begin{macrocode} +\newcommand*{\cc}[1]{% + \par\noindent + \parbox[t]{\textwidth}{% + \@hangfrom{\normalfont\ccname: }% + \ignorespaces #1\strut}\par} +% \end{macrocode} +%\begin{verbatim} +% \encl{Foo(2)\\Bar} +%\end{verbatim} +% which produces:\\ +% \begin{tabular}{ll} +% encl: & Foo(2)\\ +% & Bar +% \end{tabular} +% \begin{macrocode} +\newcommand*{\encl}[1]{% + \par\noindent + \parbox[t]{\textwidth}{% + \@hangfrom{\normalfont\enclname: }% + \ignorespaces #1\strut}\par} +% \end{macrocode} +% +% The only thing |\ps| needs to do is call |\startbreaks|, +% which allows page breaking again. +% \begin{macrocode} +\newcommand*{\ps}{\par\startbreaks} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\stopletter} +% The |\stopletter| command is called by |\endletter| to do the +% following: +% \begin{itemize} +% \item Add any desired fill or other material at the end of the +% letter. +% \item Define |\returnaddress| to be the return address for the +% mailing label. +% More precisely, it is the first argument of the |\mlabel| +% command described below. It should be defined to null if the +% return address doesn't appear on the labels. Any command, +% other than |\\|, that should not be expanded until the |\mlabel| +% command is actually executed must be preceded by |\protect|. +% Whenever possible, |\protect| commands in the definition of +% |\returnaddress|---it's much more efficient that way. In +% particular, when the standard return address is used, you +% should define |\returnaddress| to something like +% |\protect\standardreturnaddress|. +% \end{itemize} +% \begin{macrocode} +\newcommand*{\stopletter}{} +% \end{macrocode} +% \end{macro} +% +% \subsection{Customizing the labels} +% +% Commands for generating the labels are put on the \file{.aux} file, +% which is read in and processed by the |\end{document}| command. +% You have to define the following two commands: +% \begin{itemize} +% \item |\startlabels| : Should reset the page layout parameters if +% necessary. +% \item |\mlabel|\marg{return address}\marg{to address} : Command to +% generate a single label. +% \end{itemize} +% +% +% +% \begin{macro}{\returnaddress} +% The return address for the mailing labels can be stored in this +% macro. +% \begin{macrocode} +\newcommand*{\returnaddress}{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\labelcount} +% A register to count the labels +% \begin{macrocode} +\newcount\labelcount +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\startlabels} +% The following |\startlabels| command sets things up for +% producing labels in two columns of five 2" $\times$ 4-1/4" +% labels each, suitable for reproducing onto Avery brand number +% 5352 address labels. +% \changes{v1.2q}{1995/03/14}{changed value of \cs{columnsep} by 1pt} +% \begin{macrocode} +\newcommand*{\startlabels}{\labelcount\z@ + \pagestyle{empty}% + \let\@texttop\relax + \topmargin -50\p@ + \headsep \z@ + \oddsidemargin -35\p@ + \evensidemargin -35\p@ + \textheight 10in + \@colht\textheight \@colroom\textheight \vsize\textheight + \textwidth 550\p@ + \columnsep 26\p@ + \ifcase \@ptsize\relax + \normalsize + \or + \small + \or + \footnotesize + \fi + \baselineskip \z@ + \lineskip \z@ + \boxmaxdepth \z@ + \parindent \z@ + \twocolumn\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@startlabels} +% |\@startlabels| is the command name that is written to the |.aux| +% file. It is a no-op at first, and defined to be the same as +% |\startlabels| in the |\begin{document}| hook. +% \begin{macrocode} +\let\@startlabels=\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mlabel} +% This command prints an address label; it is used when the user +% specified |\makelabels| in the preamble of his document. The +% command |\mlabel| takes two arguments; the second argument is +% supposed to be the address; the first argument can be used to +% print a return address. In this document class we ignore the +% first argument. Also the labels are supposed to be 2~inch high +% and 3.6~inch wide. When your address labels have a different you +% will have to define your own |\mlabel| command. +% \changes{v1.2p}{1994/12/11}{Redefined \cs{mlabel} to not use the +% \cs{setbox} primitive} +% \changes{v1.2q}{1995/03/14}{changed width of the labels slightly to +% prevent \LaTeX\ stuffing two on each line} +% \begin{macrocode} +\newcommand*{\mlabel}[2]{% + \parbox[b][2in][c]{262\p@}{\strut\ignorespaces #2}% + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mlabel} +% The macro |\@mlabel| is written to the \file{.aux} file instead +% of |\mlabel|. This allows us to make it a no-op by default, +% and then activate it in the |\begin{document}| hook. +% \begin{macrocode} +\let\@mlabel=\@gobbletwo +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Lists} +% +% \subsubsection{General List Parameters} +% +% The following commands are used to set the default values for the +% list environment's parameters. See the \LaTeX{} manual for an +% explanation of the meanings of the parameters. Defaults for the +% list environment are set as follows. First, |\rightmargin|, +% |\listparindent| and |\itemindent| are set to 0pt. Then, for a +% \texttt{K}th level list, the command |\@listK| is called, where +% `\texttt{K}' denotes `\texttt{i}', `\texttt{ii}', ... , +% `\texttt{vi}'. (I.e., |\@listiii| is called for a third-level +% list.) By convention, |\@listK| should set |\leftmargin| to +% |\leftmarginK|. +% +% \begin{macro}{\leftmargin} +% \begin{macro}{\leftmargini} +% \begin{macro}{\leftmarginii} +% \begin{macro}{\leftmarginiii} +% \begin{macro}{\leftmarginiv} +% \begin{macro}{\leftmarginv} +% \begin{macro}{\leftmarginvi} +% For efficiency, level-one list's values are defined at top level, and +% |\@listi| is defined to set only |\leftmargin|. +% \begin{macrocode} +\setlength\leftmargini {2.5em} +% \end{macrocode} +% The following three are calculated so that they are larger than +% the sum of |\labelsep| and the width of the default labels (which +% are `(m)', `vii.' and `M.'). +% \begin{macrocode} +\setlength\leftmarginii {2.2em} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\setlength\leftmarginv {1em} +\setlength\leftmarginvi {1em} +% \end{macrocode} +% Here we set the top level leftmargin. +% \begin{macrocode} +\setlength\leftmargin {\leftmargini} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelsep} +% \begin{macro}{\labelwidth} +% |\labelsep| is the distance between the label and the text of an +% item; |\labelwidth| is the width of the label. +% \begin{macrocode} +\setlength \labelsep {5\p@} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\partopsep} +% When the user leaves a blank line before the environment an extra +% vertical space of |\partopsep| is inserted, in addition to +% |\parskip| and |\topsep|. +% \begin{macrocode} +\setlength\partopsep{0\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@beginparpenalty} +% \begin{macro}{\@endparpenalty} +% These penalties are inserted before and after a list or paragraph +% environment. They are set to a bonus value to encourage page +% breaking at these points. +% \begin{macro}{\@itempenalty} +% This penalty is inserted between list items. +% \begin{macrocode} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listI} +% \begin{macro}{\@listi} +% |\@listI| defines top level and |\@listi| values of +% |\leftmargin|, |\parsep|, |\topsep|, and |\itemsep| +% +% \begin{macrocode} +\def\@listI{\setlength\leftmargin{\leftmargini}% + \setlength\parsep {0\p@}% + \setlength\topsep {.4em}% + \setlength\itemsep{.4em}} +\let\@listi\@listI +% \end{macrocode} +% We have to initialize these parameters. +% \begin{macrocode} +\@listi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listii} +% \begin{macro}{\@listiii} +% \begin{macro}{\@listiv} +% \begin{macro}{\@listv} +% \begin{macro}{\@listvi} +% Here are the same macros for the higher level lists. +% \begin{macrocode} +\def\@listii {\setlength \leftmargin{\leftmarginii}% + \setlength \labelwidth{\leftmarginii}% + \addtolength\labelwidth{-\labelsep}} +\def\@listiii{\setlength \leftmargin{\leftmarginiii}% + \setlength \labelwidth{\leftmarginiii}% + \addtolength\labelwidth{-\labelsep}% + \setlength \topsep {.2em}% + \setlength \itemsep {\topsep}} +\def\@listiv {\setlength \leftmargin{\leftmarginiv}% + \setlength \labelwidth{\leftmarginiv}% + \addtolength\labelwidth{-\labelsep}} +\def\@listv {\setlength \leftmargin{\leftmarginv}% + \setlength \labelwidth{\leftmarginv}% + \addtolength\labelwidth{-\labelsep}} +\def\@listvi {\setlength \leftmargin{\leftmarginvi}% + \setlength \labelwidth{\leftmarginvi}% + \addtolength\labelwidth{-\labelsep}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Enumerate} +% +% The enumerate environment uses four counters: \Lcount{enumi}, +% \Lcount{enumii}, \Lcount{enumiii} and \Lcount{enumiv}, where +% \Lcount{enumN} controls the numbering of the Nth level +% enumeration. +% +% \begin{macro}{\theenumi} +% \begin{macro}{\theenumii} +% \begin{macro}{\theenumiii} +% \begin{macro}{\theenumiv} +% The counters are already defined in the \LaTeX{} kernel +% (\file{ltlists.dtx}), but their representation is changed here. +% +% \begin{macrocode} +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelenumi} +% \begin{macro}{\labelenumii} +% \begin{macro}{\labelenumiii} +% \begin{macro}{\labelenumiv} +% The commands |\labelenumi| ... |\labelenumiv| generate the label +% for each item. +% \begin{macrocode} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\p@enumii} +% \begin{macro}{\p@enumiii} +% \begin{macro}{\p@enumiv} +% The expansion of |\p@enumN||\theenumN| defines the output of a +% |\ref| command when referencing an item of the Nth level of an +% enumerated list. +% \begin{macrocode} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Itemize} +% +% \begin{macro}{\labelitemi} +% \begin{macro}{\labelitemii} +% \changes{v1.2h}{1994/05/06}{Inserted \cs{normalfont}} +% \changes{v1.2u}{1996/08/25}{replaced -{}- with \cs{textendash}} +% \begin{macro}{\labelitemiii} +% \begin{macro}{\labelitemiv} +% Itemization is controlled by |\labelitemi|, +% |\labelitemii|, |\labelitemiii|, and |\labelitemiv|, which define +% the labels of the various itemization levels: the symbols used are +% bullet, bold en-dash, asterisk and centered dot. +% +% \changes{v1.2n}{1994/07/11}{renamed \cs{labelitemiiii} to +% \cs{labelitemiii}} +% \changes{v1.2x}{1997/04/16}{Changed to \cs{textbullet}, +% \cs{textasteriskcentered} and \cs{textperiodcentered}} +% \begin{macrocode} +\newcommand\labelitemi{\textbullet} +\newcommand\labelitemii{\normalfont\bfseries \textendash} +\newcommand\labelitemiii{\textasteriskcentered} +\newcommand\labelitemiv{\textperiodcentered} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Description} +% +% \begin{environment}{description} +% The description environment is defined here -- while the itemize +% and enumerate environments are defined in the \LaTeX{} kernel +% (\file{ltlists.dtx}). +% +% \begin{macrocode} +\newenvironment{description} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\descriptionlabel} +% To change the formatting of the label, you must redefine +% |\descriptionlabel|. +% +% \changes{v1.2q}{1995/03/14}{made command short} +% \begin{macrocode} +\newcommand*{\descriptionlabel}[1]{\hspace\labelsep + \normalfont\bfseries #1} +% \end{macrocode} +% \end{macro} +% +% \subsection{Defining new environments} +% +% \subsubsection{Verse} +% +% \begin{environment}{verse} +% The verse environment is defined by making clever use of the +% list environment's parameters. The user types |\\| to end a line. +% This is implemented by |\let|'ing |\\| equal |\@centercr|. +% +% \begin{macrocode} +\newenvironment{verse} + {\let\\=\@centercr + \list{}{\setlength\itemsep{\z@}% + \setlength\itemindent{-15\p@}% + \setlength\listparindent{\itemindent}% + \setlength\rightmargin{\leftmargin}% + \addtolength\leftmargin{15\p@}}% + \item[]} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Quotation} +% +% \begin{environment}{quotation} +% The quotation environment is also defined by making clever use of +% the list environment's parameters. The lines in the environment +% are set smaller than |\textwidth|. The first line of a paragraph +% inside this environment is indented. +% +% \begin{macrocode} +\newenvironment{quotation} + {\list{}{\setlength\listparindent{1.5em}% + \setlength\itemindent{\listparindent}% + \setlength\rightmargin{\leftmargin}}% + \item[]} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Quote} +% +% \begin{environment}{quote} +% The quote environment is like the quotation environment except +% that paragraphs are not indented. +% +% \begin{macrocode} +\newenvironment{quote} + {\list{}{\setlength\rightmargin{\leftmargin}}% + \item[]} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{Theorem} +% +% This document class does not define it's own theorem environments, +% the defaults, supplied by the \LaTeX{} kernel (\file{ltthm.dtx}) +% are available. +% +% +% \subsection{Setting parameters for existing environments} +% +% \subsubsection{Array and tabular} +% +% \begin{macro}{\arraycolsep} +% The columns in an array environment are separated by +% 2|\arraycolsep|. +% \begin{macrocode} +\setlength\arraycolsep{5\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabcolsep} +% The columns in an tabular environment are separated by +% 2|\tabcolsep|. +% \begin{macrocode} +\setlength\tabcolsep{6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arrayrulewidth} +% The width of vertical rules in the array and tabular environments +% is given by |\arrayrulewidth|. +% \begin{macrocode} +\setlength\arrayrulewidth{.4\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doublerulesep} +% The space between adjacent rules in the array and tabular +% environments is given by |\doublerulesep|. +% \begin{macrocode} +\setlength\doublerulesep{2\p@} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Tabbing} +% +% \begin{macro}{\tabbingsep} +% This controls the space that the |\'| command puts in. (See +% \LaTeX{} manual for an explanation.) +% \begin{macrocode} +\setlength\tabbingsep{\labelsep} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Minipage} +% +% \begin{macro}{\@minipagerestore} +% The macro |\@minipagerestore| is called upon entry to a minipage +% environment to set up things that are to be handled differently +% inside a minipage environment. In the current styles, it does +% nothing. +% \end{macro} +% +% \begin{macro}{\@mpfootins} +% Minipages have their own footnotes; |\skip||\@mpfootins| plays +% same r\^ole for footnotes in a minipage as |\skip||\footins| does +% for ordinary footnotes. +% +% \begin{macrocode} +\skip\@mpfootins = \skip\footins +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Framed boxes} +% +% \begin{macro}{\fboxsep} +% The space left by |\fbox| and |\framebox| between the box and the +% text in it. +% \begin{macro}{\fboxrule} +% The width of the rules in the box made by |\fbox| and |\framebox|. +% \begin{macrocode} +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Equation and eqnarray} +% +% \begin{macro}{\theequation} +% The equation counter will be typeset using arabic numbers. +% \begin{macrocode} +\renewcommand\theequation{\@arabic\c@equation} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\jot} +% |\jot| is the extra space added between lines of an eqnarray +% environment. The default value is used. +% \begin{macrocode} +% \setlength\jot{3pt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@eqnnum} +% The macro |\@eqnnum| defines how equation numbers are to appear in +% equations. Again the default is used. +% +% \begin{macrocode} +% \def\@eqnnum{(\theequation)} +% \end{macrocode} +% \end{macro} +% +% \subsection{Font changing} +% +% Here we supply the declarative font changing commands that were +% common in \LaTeX\ version 2.09 and earlier. These commands work +% in text mode \emph{and} in math mode. They are provided for +% compatibility, but one should start using the |\text...| and +% |\math...| commands instead. These commands are redefined using +% |\@renewfontswitch|, a command with three arguments: the user +% command to be defined; \LaTeX\ commands to execute in text mode +% and \LaTeX\ commands to execute in math mode. +% +% \begin{macro}{\rm} +% \begin{macro}{\tt} +% \begin{macro}{\sf} +% The commands to change the family. +% \changes{v1.0a}{1993/12/14}{Added compatibility mode support.} +% \changes{v1.1}{1993/12/18}{Changed \cs{@newfontswitch} to +% \cs{@renewfontswitch}, removed switch.} +% \changes{v1.2d}{1994/04/14}{\cs{@renewfontswitch} has become +% \cs{DeclareOldFontCommand}} +% \begin{macrocode} +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bf} +% The command to change to the bold series. One should use +% |\mdseries| to explicitly switch back to medium series. +% \changes{v1.0a}{1993/12/14}{Added compatibility mode support.} +% \changes{v1.1}{1993/12/18}{Changed \cs{@newfontswitch} to +% \cs{@renewfontswitch}, removed switch.} +% \begin{macrocode} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sl} +% \begin{macro}{\it} +% \begin{macro}{\sc} +% +% And the commands to change the shape of the font. The slanted and +% small caps shapes are not available by default as math alphabets, +% so those changes do nothing in math mode. One should use +% |\upshape| to explicitly change back to the upright shape. +% \changes{v1.0a}{1993/12/14}{Added compatibility mode support.} +% \changes{v1.1}{1993/12/18}{Changed \cs{@newfontswitch} to +% \cs{@renewfontswitch}, removed switch.} +% \changes{v1.1b}{1993/12/20}{Added forgotten re.} +% \begin{macrocode} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\relax} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cal} +% \changes{v1.0a}{1993/12/14}{Macro added} +% \begin{macro}{\mit} +% \changes{v1.0a}{1993/12/14}{Macro added} +% +% The commands |\cal| and |\mit| should only be used in math mode, +% outside math mode they have no effect. Currently the New Font +% Selection Scheme defines these commands to generate warning +% messages. Therefore we have to define them `by hand'. +% \changes{v1.2p}{1994/12/11}{Now define \cs{cal} and \cs{mit} using +% \cs{DeclareRobustCommand*}} +% \begin{macrocode} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Footnotes} +% +% \begin{macro}{\footnoterule} +% Usually, footnotes are separated from the main body of the text +% by a small rule. This rule is drawn by the macro |\footnoterule|. +% We have to make sure that the rule takes no vertical space (see +% \file{plain.tex}) so we compensate for the natural height of the +% rule of 0.4pt by adding the right amount of vertical skip. +% +% To prevent the rule from colliding with the footnote we first add +% a little negative vertical skip, then we put the rule and make +% sure we end up at the same point where we begun this operation. +% \begin{macrocode} +\renewcommand\footnoterule{% + \kern-\p@ + \hrule \@width .4\columnwidth + \kern .6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@footnote} +% A counter for footnotes. +% \begin{macrocode} +% \newcounter{footnote} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefntext} +% \changes{v1.2c}{1994/03/08}{Always call \cs{@makefnmark}.} +% The footnote mechanism of \LaTeX{} calls the macro |\@makefntext| +% to produce the actual footnote. The macro gets the text of the +% footnote as its argument and should use |\@makefnmark| to produce +% the mark of the footnote. The macro |\@makefntext| is called when +% effectively inside a |\parbox| of width |\columnwidth| (i.e., +% with |\hsize| = |\columnwidth|). +% +% An example of what can be achieved is given by the following piece +% of \TeX\ code. +% \begin{verbatim} +% \long\def\@makefntext#1{% +% \@setpar{\@@par +% \@tempdima = \hsize +% \advance\@tempdima-10pt +% \parshape \@ne 10pt \@tempdima}% +% \par +% \parindent 1em\noindent +% \hb@xt@\z@{\hss\@makefnmark}#1} +% \end{verbatim} +% The effect of this definition is that all lines of the footnote +% are indented by 10pt, while the first line of a new paragraph is +% indented by 1em. To change these dimensions, just substitute the +% desired value for `10pt' (in both places) or `1em'. The mark is +% flush right against the footnote. +% +% In this document class we use a simpler macro, in which the +% footnote text is set like an ordinary text paragraph, with no +% indentation except on the first line of a paragraph, and the +% first line of the footnote. Thus, all the macro must do is set +% |\parindent| to the appropriate value for succeeding paragraphs +% and put the proper indentation before the mark. +% +% \begin{macrocode} +\long\def\@makefntext#1{% + \noindent + \hangindent 5\p@ + \hb@xt@5\p@{\hss\@makefnmark}#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefnmark} +% The footnote markers that are printed in the text to point to the +% footnotes should be produced by the macro |\@makefnmark|. We use +% the default definition for it. +% \begin{macrocode} +%\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Words} +% +% \begin{macro}{\ccname} +% \begin{macro}{\enclname} +% \begin{macro}{\pagename} +% \begin{macro}{\headtoname} +% This document class is for documents prepared in the English +% language. To prepare a version for another language, various +% English words must be replaced. All the English words that +% require replacement are defined below in command names. +% \begin{macrocode} +\newcommand*{\ccname}{cc} +\newcommand*{\enclname}{encl} +\newcommand*{\pagename}{Page} +\newcommand*{\headtoname}{To} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Date} +% +% \begin{macro}{\today} +% This macro uses the \TeX\ primitives |\month|, |\day| and |\year| +% to provide the date of the \LaTeX-run. +% \begin{macrocode} +\newcommand*{\today}{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +% \end{macrocode} +% \end{macro} +% +% \subsection{Two column mode} +% +% \begin{macro}{\columnsep} +% This gives the distance between two columns in two column mode. +% \begin{macrocode} +\setlength\columnsep{10\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\columnseprule} +% This gives the width of the rule between two columns in two +% column mode. We have no visible rule. +% \begin{macrocode} +\setlength\columnseprule{0\p@} +% \end{macrocode} +% \end{macro} +% +% \subsection{The page style} +% We have \pstyle{plain} pages in this document class by +% default. We use arabic page numbers. +% \begin{macrocode} +\pagestyle{plain} +\pagenumbering{arabic} +% \end{macrocode} +% +% \subsection{Single or double sided printing} +% +% We don't try to make each page as long as all the others. +% \begin{macrocode} +\raggedbottom +% \end{macrocode} +% +% \begin{macro}{\@texttop} +% The document class letter sets |\@texttop| to |\vskip| 0pt +% \texttt{plus} .00006fil on the first page of a letter, which +% centers a short letter on the page. This fil value may have to be +% changed for other letterheads. This setting has to be done after +% |\raggedbottom| is executed, since the latter sets |\@texttop| to +% |\relax|. +% \begin{macrocode} +\def\@texttop{\ifnum\c@page=1\vskip \z@ plus.00006fil\relax\fi} +% \end{macrocode} +% \end{macro} +% +% We always start in one column mode. +% \begin{macrocode} +\onecolumn +%</letter> +% \end{macrocode} +% +% +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/letter.ins b/Master/texmf-dist/source/latex-dev/base/letter.ins new file mode 100644 index 00000000000..28d77dd3b53 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/letter.ins @@ -0,0 +1,109 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\Msg{*** Generating letter class file ***} + +\generateFile{letter.cls}{t}{ + \from{letter.dtx}{letter}} + + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space letter.cls} +\Msg{*} +\Msg{* To produce the documentation run the file `letter.dtx'} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile + + + diff --git a/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx b/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx new file mode 100644 index 00000000000..5da3582e556 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltalloc.dtx @@ -0,0 +1,176 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltalloc.dtx +%<*driver> +% \fi +\ProvidesFile{ltalloc.dtx} + [2018/08/05 v1.1c LaTeX Kernel (allocation)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltalloc.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} +\MaintainedByLaTeXTeam{latex} +\maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.1b}{1995/10/25}{General doc improvements} +% +% \section{Counters} +% +% This section deals with counter and other variable allocation. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% The following are from plain \TeX: +% \begin{description} +% \item[\cs{z@}] A zero dimen or number. It's more efficient to write +% |\parindent\z@| than |\parindent 0pt|. +% \item[\cs{@ne}] The number 1. +% \item[\cs{m@ne}] The number $-1$. +% \item[\cs{tw@}] The number 2. +% \item[\cs{sixt@@n }] The number 16. +% \item[\cs{@m}] The number 1000. +% \item[\cs{@MM}] The number 20000. +% \end{description} +% +% \begin{macro}{\@xxxii} +% The constant $32$. +% \begin{macrocode} +\chardef\@xxxii=32 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@Mi} +% \begin{macro}{\@Mii} +% \begin{macro}{\@Miii} +% \begin{macro}{\@Miv} +% Constants $10001$--$10004$. +% \begin{macrocode} +\mathchardef\@Mi=10001 +\mathchardef\@Mii=10002 +\mathchardef\@Miii=10003 +\mathchardef\@Miv=10004 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{v1.0d}{1994/03/28} +% {Redefinition of `new' allocations removed.} +% +% \begin{macro}{\@tempcnta} +% \begin{macro}{\@tempcntb} +% Scratch count registers used by \LaTeX\ kernel commands. +% \begin{macrocode} +\newcount\@tempcnta +\newcount\@tempcntb +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@tempswa} +% General boolean switch used by \LaTeX\ kernel commands. +% \begin{macrocode} +\newif\if@tempswa +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tempdima} +% \begin{macro}{\@tempdimb} +% \begin{macro}{\@tempdimc} +% Scratch dimen registers used by \LaTeX\ kernel commands. +% \begin{macrocode} +\newdimen\@tempdima +\newdimen\@tempdimb +\newdimen\@tempdimc +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@tempboxa} +% Scratch box register used by \LaTeX\ kernel commands. +% \begin{macrocode} +\newbox\@tempboxa +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tempskipa} +% \begin{macro}{\@tempskipb} +% Scratch skip registers used by \LaTeX\ kernel commands. +% \begin{macrocode} +\newskip\@tempskipa +\newskip\@tempskipb +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@temptokena} +% Scratch token register used by \LaTeX\ kernel commands. +% \begin{macrocode} +\newtoks\@temptokena +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@flushglue} +% Glue used for |\right|- \& |\leftskip| = 0pt plus 1fil +% \begin{macrocode} +\newskip\@flushglue \@flushglue = 0pt plus 1fil +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx b/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx new file mode 100644 index 00000000000..79505680c43 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltbibl.dtx @@ -0,0 +1,409 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltbibl.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltbibl.dtx} + [2018/11/09 v1.1r LaTeX Kernel (Bibliography)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltbibl.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Bibliography Generation} +% +% A bibliography is created by the |thebibliography| environment, which +% generates a title such as ``References'', and a list of entries. +% The BIB\TeX{} program will create a file containing such an +% environment, which will be read in by the |\bibliography| command. +% With BIB\TeX, the following commands will be used. +% +% \DescribeMacro{\bibliography} +% |\bibliography|\marg{file1,file2, \ldots ,filen} : specifies +% the bibdata files. Writes a |\bibdata| entry on the |.aux| file +% and tries to read in |mainfile.bbl|. +% +% \DescribeMacro{\bibliographystyle} +% |\bibliographystyle|\marg{style} : +% Writes a |\bibstyle| entry on the |.aux| file. +% +% \DescribeEnv{thebibliography} +% The |thebibliography| environment is a list environment. To save the +% use of an extra counter, it should use |enumiv| as the item +% counter. +% Instead of using |\item|, items in the bibliography are produced by +% the following commands:\\ +% |\bibitem|\marg{name} : Produces a numbered entry cited as +% \meta{name}.\\ +% |\bibitem|\oarg{label}\marg{name} : Produces an entry labeled by +% \meta{Label} and cited by \meta{name}. +% +% The former is used for bibliographies with citations like [1], [2], +% etc.; +% the latter is used for citations like [Knuth82]. +% +% The document class must define the thebibliography environment. This +% environment has a single argument, which is the widest bibliography +% label-- e.g., if the [Knuth67] is the widest entry, then this +% argument will be Knuth67. The |\thebibliography| command must begin +% a list environment, which the |\endthebibliography| command ends. +% +% \DescribeMacro{\cite} +% Entries are cited by the command |\cite|\marg{name}. +% +% \DescribeMacro{\nocite} +% |\nocite|\marg{citations} +% puts information on the |.aux| file that causes +% \BibTeX{} to include the \marg{citations} list in the bibliography, +% but puts nothing in the text. +% +% |\nocite{*}| is special: it tells \BibTeX{} to put the whole of a +% collection of references into the bibiography. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/31}{Initial version of ltidxbib.dtx, +% split from ltherest.dtx} +% \changes{v1.1a}{1994/05/19}{Initial version of ltbibl.dtx, +% split from ltidxbib.dtx} +% \changes{v1.1b}{1994/05/21}{Use new warning commands} +% \changes{v1.1c}{1994/11/10}{Fix \cs{nocite}\texttt{\char`\{*\char`\}}} +% +% \begin{macrocode} +%<*2ekernel> +\message{bibliography,} +% \end{macrocode} +% +% +% \begin{oldcomments} +% PARAMETERS +% +% \@cite : A macro such that \@cite{LABEL1,LABEL2}{NOTE} +% produces the output for a \cite[NOTE]{FOO1,FOO2} command, +% where entry FOOi is defined by \bibitem[LABELi]{FOOi}. +% The switch @tempswa is true if the optional NOTE argument +% is present. +% The default definition is : +% \@cite{LABELS}{NOTE} == +% BEGIN [LABELS +% IF @tempswa = T THEN , NOTE FI +% ] +% END +% +% \@biblabel : A macro to produce the label in the bibliography +% entry. For \bibitem[LABEL]{NAME}, the label is +% generated by \@biblabel{LABEL}. It has the default +% definition \@biblabel{LABEL} -> [LABEL]. +% CONVENTION +% +% \b@FOO : The name or number of the reference created by \cite{FOO} +% E.g., if \cite{FOO} -> [17] , then \b@FOO -> 17. +% +% \end{oldcomments} +% +% \begin{macro}{\bibitem} +% \changes{v1.1g}{1995/05/08}{Removed unnecessary braces} +% \begin{macrocode} +\def\bibitem{\@ifnextchar[\@lbibitem\@bibitem} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@lbibitem} +% \changes{LaTeX2.09}{1992/02/26}{Added \cs{hfill} to restore +% left-alignment of bibliography labels in alpha style} +% \begin{macrocode} +\def\@lbibitem[#1]#2{\item[\@biblabel{#1}\hfill]\if@filesw + {\let\protect\noexpand + \immediate + \write\@auxout{\string\bibcite{#2}{#1}}}\fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@bibitem} +% \changes{LaTeX2.09}{1991/11/13}{Changed counter enumi to enumiv, +% as it says in the comment above} +% \changes{LaTeX2.09}{1992/01/10}{Changed \cs{c@enumiv} to \cs{value} +% of \cs{@listctr}} +% \begin{macrocode} +\def\@bibitem#1{\item\if@filesw \immediate\write\@auxout + {\string\bibcite{#1}{\the\value{\@listctr}}}\fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibcite} +% \changes{v1.1f}{1995/04/24} +% {Make \cs{@onlypreamble} /1388.} +% \changes{v1.1h}{1995/06/19} +% {Call \cs{@newl@bel} so repeated keys produce better warning.} +% \changes{v1.1i}{1995/07/14} +% {Remove \cs{@onlypreamble} so still defined in new \cs{enddocument}} +% \begin{macrocode} +\def\bibcite{\@newl@bel b} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\citation} +% \begin{macrocode} +\let\citation\@gobble +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cite} +% \changes{v1.1j}{1995/10/16}{(DPC) Make robust} +% \begin{macrocode} +\DeclareRobustCommand\cite{% + \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@citex} +% |\penalty\@m| added to definition of |\@citex| to allow a line +% break after the `,' in citations like [Jones80,Smith77] +% (Added 23 Oct 86) +% +% space added after the `,' (21 Nov 87) +% +% \changes{LaTeX2.09}{1991/10/25} +% {added \cs{reset@font}, suggested by Bernd Raichle.} +% \changes{LaTeX2.09}{1991/11/06} +% {added code to remove a leading blank} +% \changes{LaTeX2.09}{1992/08/14} +% {added missing argument braces around \cs{hbox}, +% found by Ed Sznyter} +% \changes{LaTeX2.09}{1992/08/17} +% {simplified code for removing leading blanks in +% citation key (proposed by Frank Jensen and +% Kresten Krab Thorup)} +% \changes{LaTeX2.09}{1993/08/06} +% {Moved writing to .aux file in loop over citation keys +% so that leading blanks are removed there as well.} +% \changes{v1.0c}{1994/05/05}{Set switch for warning and end of run.} +% \changes{v1.1e}{1995/04/24} +% {Add \cs{mbox} to undefined case: latex/1239.} +% \changes{v1.1g}{1995/05/08}{Use \cs{@firstofone}} +% \changes{v1.1k}{1995/10/20}{Removed refundefined flag} +% \changes{v1.1l}{1995/12/07}{Restored name of \cs{G@refundefinedtrue}} +% \changes{v1.1m}{1997/04/24}{\cs{@empty} to avoid primitive +% error on empty cite keys. latex/2432} +% \changes{v1.1n}{2002/12/13}{Added \cs{leavevmode} in case citation +% is at start of paragraph (pr/3486)} +% \begin{macrocode} +\def\@citex[#1]#2{\leavevmode + \let\@citea\@empty + \@cite{\@for\@citeb:=#2\do + {\@citea\def\@citea{,\penalty\@m\ }% + \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% + \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi +% \end{macrocode} +% Using |\hbox| instead of |\mbox| is fine because of the +% |\leavevmode| above. In fact the use of a box around the citation +% contents is more than questionable in my view (FMi), but within +% 2e I have to keep that for compatibility reasons as it would +% probably change too many existing documents. Its main reason is +% to avoid hyphenation of labels such as [FOOB89] into [FOO- B89] +% so in certain styles it makes sense; but, for example, in author +% year citations it becomes more than questionable. +% +% So Chris added yet another hook here, as suggested by, at least, +% Donald Arsenau. Note that this one is inside the first argument +% of the |\@cite| hook. +% This decouples the top-level typesetting of the citation from +% the details of the other business conducted here. All this really +% needs a complete rethink to get the right modularity. +% +% \changes{v1.1q}{2004/02/15}{Changed to use a hook with default +% value \cs{hbox}} +% \begin{macrocode} + \@ifundefined{b@\@citeb}{\hbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\bibdata} +% \begin{macro}{\bibstyle} +% \begin{macrocode} +\let\bibdata=\@gobble +\let\bibstyle=\@gobble +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\bibliography} +% \changes{LaTeX2e}{1994/01/18} +% {Use \cs{@input@} so include files are listed.} +% \changes{LaTeX2e}{2018/11/09} +% {Zap spaces in the argument as BibTeX doesn't support them (github/88)} +% \begin{macrocode} +\def\bibliography#1{% + \if@filesw + \immediate\write\@auxout{\string\bibdata{\zap@space#1 \@empty}}% + \fi + \@input@{\jobname.bbl}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bibliographystyle} +% \changes{v1.1d}{1994/12/09}{(DPC) Allow use in preamble.} +% \begin{macrocode} +\def\bibliographystyle#1{% + \ifx\@begindocumenthook\@undefined\else + \expandafter\AtBeginDocument + \fi + {\if@filesw + \immediate\write\@auxout{\string\bibstyle{#1}}% + \fi}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\nocite} +% (Added 14 Jun 85) +% \changes{v1.1c}{1994/11/10}{Fix \cs{nocite}\texttt{\char`\{*\char`\}}} +% +% This puts information on the |.aux| file that causes +% \BibTeX{} to include the citation list in the bibliography, +% but puts nothing in the text. +% +% RmS 93/08/06: Made loop for |\nocite| like that for |\@citex|, +% to get rid of leading spaces. +% \changes{v1.0b}{1994/05/03}{Make \cs{nocite} issue a warning +% for an undefined citation key.} +% \changes{v1.0c}{1994/05/05}{Do not write page number in +% \cs{nocite} warning message.} +% \changes{v1.0c}{1994/05/05}{Set switch for warning and end of run.} +% \changes{v1.1g}{1995/05/08}{Use \cs{@firstofone}} +% \changes{v1.1k}{1995/10/20}{Removed refundefined flag} +% \begin{macrocode} +\def\nocite#1{\@bsphack +% \end{macrocode} +% With the implementation designed already in \LaTeX\,2.09 the +% |\nocite| command will not work before |\begin{document}| since +% it tries to write to the |.aux| file which is not open before +% that point. As a result the ``reference'' will appear on the +% terminal and nothing else will happen. +% +% This would be easy to fix, but then a document using the fix will +% silently fail on an older release of \LaTeX{}, missing all +% citations done with |\nocite|. Thus we do only generate an error +% message and leave the fix for a \LaTeXe{} successor. +% +% \changes{v1.1o}{2003/05/18}{Check if we are after \cs{document}} +% \changes{v1.1p}{2004/01/04}{Changed error message} +% \begin{macrocode} + \ifx\@onlypreamble\document +% \end{macrocode} +% Since we are after |\begin{document}| we can do the citations: +% \begin{macrocode} + \@for\@citeb:=#1\do{% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi + \@ifundefined{b@\@citeb}{\G@refundefinedtrue + \@latex@warning{Citation `\@citeb' undefined}}{}}% + \else +% \end{macrocode} +% But before |\begin{document}| we raise an error message: +% \begin{macrocode} + \@latex@error{Cannot be used in preamble}\@eha +% \end{macrocode} +% Without the compatibility problems we could fix the problem as follows: +% \begin{macrocode} + % \AtBeginDocument{\nocite{#1}} + \fi + \@esphack} +% \end{macrocode} +% Since |\nocite{*}| should not produce a warning about undefined +% citation keys (seee PR 557), we need to set the control sequence +% `|\b@*|' to something other than |\relax|. As a result |\cite{*}| +% will not warn either (but that never worked with \BibTeX{} in the +% first place). +% \begin{macrocode} +\expandafter\let\csname b@*\endcsname\@empty +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Default definitions} +% +% This hook determines the `relative formatting' of the two logical +% parts of a citation with comment. +% \begin{macro}{\@cite} +% \begin{macrocode} +\def\@cite#1#2{[{#1\if@tempswa , #2\fi}]} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cite@ofmt} +% \changes{v1.1q}{2004/02/15}{Added hook with default value \cs{hbox}} +% This is, in general, a command that appears to have one argument +% whose value is, in the kernel, a single cs whose name is the +% expansion of |b@\@citeb|; the expansion of this cs will +% typically be some hmode material that produces the detailed +% typeset form of just the citations themselves. +% \begin{macrocode} +\let\@cite@ofmt\hbox +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@biblabel} +% \changes{LaTeX2.09}{1992/01/14}{removed \cs{hfill}} +% \begin{macrocode} +\def\@biblabel#1{[#1]} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx b/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx new file mode 100644 index 00000000000..6bfbc38af97 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltboxes.dtx @@ -0,0 +1,1306 @@ +% \iffalse meta-comment +% +% Copyright 1993-2017 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltboxes.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltboxes.dtx} + [2017/03/29 v1.3a LaTeX Kernel (Box Commands)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltboxes.dtx} +\title{\filename} +\date{\filedate} +\author{David Carlisle\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.1e}{1998/08/17}{(RmS) Minor Documentation fixes.} +% \section{\LaTeX\ Box commands} +% +% +% \DescribeMacro\makebox +% |\makebox[|\meta{wid}|][|\meta{pos}|]{|\meta{obj}|}|\\ +% Puts \meta{obj} in an |\hbox| of width \meta{wid}, positioned by +% \meta{pos}. +% +% The possible \meta{pos} are:\\ +% \begin{tabular}{ll} +% |s| stretched,\\ +% |l| flushleft,\\ +% |r| flushright,\\ +% |c| (default) centred. +% \end{tabular} +% +% If \meta{wid} is missing, then \meta{pos} is also missing and +% \meta{obj} is put in an |\hbox| of its natural width. +% +% |\makebox(|\meta{x}|,|\meta{y}|)[|\meta{pos}|]{|\meta{obj}|}|\\ +% Puts \meta{obj} in an |\hbox| of width $x * |\unitlength|$ +% and height $y * |\unitlength|$. +% \meta{pos} arguments are +% |s|, |l|, |r| or |c| (default) for stretched, flushleft, flushright +% or centred, and |t| or |b| +% for top, bottom -- or combinations like |tr| or |rb|. +% Default for horizontal and vertical are centered. +% Note that in this picture mode version of |\makebox| a [b] aligns on +% the \emph{bottom} of the text as documented. If you want to align on +% the \emph{baseline} use +% |\makebox( , )[b]{\raisebox{0pt}[\height][0pt]{xyz}}}| +% or |\makebox( , )[b]{\smash{xyz}}| +% +% \DescribeMacro\mbox +% |\mbox{|\meta{obj}|}| The same as |\makebox{|\meta{obj}|}|, but is +% more efficient as no checking for optional arguments is done. +% +% \DescribeMacro\newsavebox +% |\newsavebox{\cmd}| : If |\cmd| is undefined, then defines it +% to be a \TeX\ box register. +% +% \DescribeMacro\savebox +% |\savebox{\cmd}| ... : |\cmd| is defined to be a \TeX\ box register, +% and the '...' are any |\makebox| arguments. It is +% like |\makebox|, except it doesn't produce text but +% saves the value in |\box| |\cmd|. +% +% \DescribeMacro\sbox +% |\sbox{|\meta{cmd}|}{|\meta{obj}|}| is an efficient abbreviation for\\ +% |\savebox{|\meta{cmd}|}{|\meta{obj}|}|. +% +% \DescribeEnv{lrbox} +% |\begin{lrbox}{|\meta{cmd}|}|\meta{text}|\end{lrbox}| is equivalent +% to\\ +% |\sbox{|\meta{cmd}|}{|\meta{text}|}|\\ +% except that any white space at the beginning and end of \meta{text} +% is ignored. +% +% \DescribeMacro\framebox +% |\framebox| ... : like |\makebox|, except it puts a `frame' around +% the box. The frame is made of lines of thickness +% |\fboxrule|, separated by space |\fboxsep| from the +% text -- except for |\framebox(X,Y)| ... , where the +% thickness of the lines is as for the picture environment, +% and there is no separation added. +% +% \DescribeMacro\fbox +% |\fbox{|\meta{obj}|}| is an abbreviation for +% |\framebox{|\meta{obj}|}|. +% +% \DescribeMacro\parbox +% |\parbox[|\meta{pos}|][|\meta{height}|][|\meta{inner-pos}|]{|^^A +% \meta{width}|}{|\meta{text}|}| : +% Makes a box with |\hsize| \meta{width}, positioned by \meta{pos} as +% follows: +% c : |\vcenter| (placed in |$...$| if not in math mode) +% b : |\vbox| +% t : |\vtop| +% default value is c. +% Sets |\hsize| := \meta{width} and calls |\@parboxrestore|, which +% does the following: +% Restores the original definitions of: +% +% \begin{tabular}{l} +% |\par|\\ +% |\\|\\ +% |\-|\\ +% |\'|\\ +% | \`|\\ +% |\=| +% \end{tabular} +% +% Resets the following parameters: +% +% \begin{tabular}{l@{\quad=\quad}ll} +% |\parindent| & 0pt \\ +% |\parskip| & 0pt & added 20 Jan 87\\ +% |\linewidth| & |\hsize|\\ +% |\@totalleftmargin| & 0pt\\ +% |\leftskip| & 0pt\\ +% |\rightskip| & 0pt\\ +% |\@rightskip| & 0pt\\ +% |\parfillskip| & 0pt plus 1fil\\ +% |\lineskip| & |\normallineskip|\\ +% |\baselineskip| & |\normalbaselineskip| +% \end{tabular} +% +% Calls |\sloppy| +% +% Note: |\@arrayparboxrestore| same as |\@parboxrestore| +% but it doesn't restore |\\|. +% +% \DescribeEnv{minipage} +% |minipage| : Similar to |\parbox|, except it also +% makes this look like a page by setting +% +% |\textwidth| == |\columnwidth| == box width +% +% changes footnotes by redefining:\\% +% |\@mpfn| == mpfootnote \\ +% |\thempfn| == |\thempfootnote|\\ +% |\@footnotetext| == |\@mpfootnotetext| +% +% resets the following list environment parameters:\\ +% |\@listdepth| == |\@mplistdepth|\\ +% where |\@mplistdepth| is initialized to zero, +% +% and executes |\@minipagerestore| to allow the document +% style to reset any other parameters it desires. +% It sets |@minipage| true, and resets |\everypar| to set +% it false. This switch keeps |\addvspace| from putting space +% at the top of a minipage. +% +% Change added 24 May 89: |\minipage| sets |@minipage| globally; +% |\endminipage| resets it false. +% +% +% \DescribeMacro\rule +% |\rule[|\meta{raised}|]{|\meta{width}|}{|\meta{height}|}| : +% Makes a $\meta{width}*\meta{height}$ rule, raised \meta{raised}. +% +% \DescribeMacro\underline +% |\underline{|\meta{text}|}| : Makes an underlined hbox with +% \meta{text} in it. +% +% \DescribeMacro\raisebox +% |\raisebox{|\meta{distance}|}[|\meta{height}|][|\meta{depth}^^A +% |]{|\meta{box}|}| :\\ +% Raises \meta{box} up by \meta{distance} length (down if +% \meta{distance} negative). Makes \TeX\ think that the new box extends +% \meta{height} above the line and \meta{depth} below, for a total +% vertical length of \meta{height}+\meta{depth}. Default values of +% \meta{height} \& \meta{depth} = actual height and depth of box in new +% position. +% +% \StopEventually{} +% +% \changes{v0.1e}{1994/03/02}{Remove need for drv file} +% \changes{v0.1e}{1994/03/02}{Add 2ekernel module} +% \changes{v1.0a}{1994/03/07}{Unify format with other Kernel files} +% \changes{v1.0f}{1994/05/11} +% {Superfluous braces removed from several commands} +% \changes{v1.0j}{1994/10/18} +% {stuff from ltpatch done} +% \changes{v1.0p}{1994/11/09} +% {more colour changes\ldots} +% \changes{v1.0q}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0t}{1995/05/07}{Use \cs{hb@xt@}} +% \changes{v1.0w}{1995/10/16}{Clarify makebox description} +% \begin{macrocode} +%<*2ekernel> +\message{boxes,} +% \end{macrocode} +% +% \begin{macro}{\makebox} +% \changes{v0.1a}{1993/12/03} +% {modified} +% |\makebox| User level command just looks for optional |[| or |(|. +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\makebox}{Make \makebox robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\makebox{% + \leavevmode + \@ifnextchar(%) + \@makepicbox + {\@ifnextchar[\@makebox\mbox}}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\makebox}{Make \makebox robust}% +%<latexrelease>\def\makebox{% +%<latexrelease> \leavevmode +%<latexrelease> \@ifnextchar(%) +%<latexrelease> \@makepicbox +%<latexrelease> {\@ifnextchar[\@makebox\mbox}}% +%<latexrelease>\expandafter\let\csname makebox \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mbox} +% \changes{v0.1a}{1993/12/03} +% {extra group} +% \changes{v1.0j}{1994/10/18} +% {\cs{long} added} +% The basic horizontal box command for \LaTeX. +% \begin{macrocode} +\long\def\mbox#1{\leavevmode\hbox{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makebox} +% \changes{v0.1a}{1993/12/03} +% {default changed from x to c} +% Look for a possible second optional argument (defaults to |c|). +% \begin{macrocode} +\def\@makebox[#1]{% + \@ifnextchar [{\@imakebox[#1]}{\@imakebox[#1][c]}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@begin@tempboxa} +% \changes{v0.1a}{1993/12/03} +% {macro added} +% \changes{v0.1b}{1993/12/08} +% {Extra braces for color support +% (braces removed from other macros)} +% \changes{v1.0f}{1994/05/11} +% {Use new \cs{color@setgroup} concept.} +% Helper macro for supporting |\height|, |\width| etc. Grab |#1| into +% |\@tempboxa| and measure it. +% \begin{macrocode} +\long\def\@begin@tempboxa#1#2{% + \begingroup + \setbox\@tempboxa#1{\color@begingroup#2\color@endgroup}% + \def\width{\wd\@tempboxa}% + \def\height{\ht\@tempboxa}% + \def\depth{\dp\@tempboxa}% + \let\totalheight\@ovri + \totalheight\height + \advance\totalheight\depth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@end@tempboxa} +% \changes{v0.1a}{1993/12/03} +% {macro added} +% End the group started by |\@begin@tempboxa|, so that the scope of +% |\height| only includes the `length' argument to the user-command. +% \begin{macrocode} +\let\@end@tempboxa\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bm@c} +% \begin{macro}{\bm@l} +% \begin{macro}{\bm@r} +% \begin{macro}{\bm@s} +% \begin{macro}{\bm@t} +% \begin{macro}{\bm@b} +% \changes{v0.1a}{1993/12/03} +% {macros added} +% Set up spacing. +% \begin{macrocode} +\def\bm@c{\hss\unhbox\@tempboxa\hss} +\def\bm@l{\unhbox\@tempboxa\hss}\let\bm@t\bm@l +\def\bm@r{\hss\unhbox\@tempboxa}\let\bm@b\bm@r +\def\bm@s{\unhbox\@tempboxa} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@imakebox} +% \changes{v0.1a}{1993/12/03} +% {macro modified} +% Internal form of |\makebox|. +% \begin{macrocode} +\long\def\@imakebox[#1][#2]#3{% + \@begin@tempboxa\hbox{#3}% + \setlength\@tempdima{#1}% support calc + \hb@xt@\@tempdima{\csname bm@#2\endcsname}% + \@end@tempboxa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makepicbox} +% \changes{v0.1a}{1993/12/03} +% {macro modified} +% Picture mode form of |\makebox|. +% \begin{macrocode} +\def\@makepicbox(#1,#2){% + \@ifnextchar[{\@imakepicbox(#1,#2)}{\@imakepicbox(#1,#2)[]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@imakepicbox} +% picture mode version +% \begin{macrocode} +\long\def\@imakepicbox(#1,#2)[#3]#4{% + \vbox to#2\unitlength + {\let\mb@b\vss \let\mb@l\hss\let\mb@r\hss + \let\mb@t\vss + \@tfor\reserved@a :=#3\do{% + \if s\reserved@a + \let\mb@l\relax\let\mb@r\relax + \else + \expandafter\let\csname mb@\reserved@a\endcsname\relax + \fi}% + \mb@t + \hb@xt@ #1\unitlength{\mb@l #4\mb@r}% + \mb@b +% \end{macrocode} +% This kern ensures that a |b| option aligns on the bottom of the +% text rather than the baseline. this is the documented behaviour in +% the \LaTeX Book. The kern is removed in compatibility mode. +% \begin{macrocode} + \kern\z@}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\set@color} +% \changes{v0.1a}{1993/12/03} +% {macro added} +% \changes{v0.1a}{1993/12/03} +% {color support} +% This macro is initially a no-op, but the colour package will redefine +% it to insert a |\special|. +% \begin{macrocode} +\let\set@color\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\color@begingroup} +% \changes{v1.0b}{1994/03/14} +% {macro added for colour support} +% \begin{macro}{\color@endgroup} +% \changes{v1.0b}{1994/03/14} +% {macro added for colour support} +% \begin{macro}{\color@setgroup} +% \changes{v1.0f}{1994/05/11} +% {macro added for colour support} +% \begin{macro}{\normalcolor} +% \changes{v1.0g}{1994/05/12} +% {macro added for colour support} +% \begin{macro}{\color@hbox} +% \changes{v1.0n}{1994/11/05} +% {macro added for colour support} +% \begin{macro}{\color@vbox} +% \changes{v1.0r}{1994/11/18} +% {macro added for colour support} +% \begin{macro}{\color@endbox} +% \changes{v1.0n}{1994/11/05} +% {macro added for colour support} +% These macros are initially a no-op, but the colour package will +% redefine them to be |\begingroup|, |\endgroup|, +% |\begingroup\set@color|,\\ |\hbox\bgroup\color@begingroup|, +% |\color@endgroup\egroup|. +% and \meta{set to main document colour} respectively. +% \begin{macrocode} +\let\color@begingroup\relax +\let\color@endgroup\relax +\let\color@setgroup\relax +\let\normalcolor\relax +\let\color@hbox\relax +\let\color@vbox\relax +\let\color@endbox\relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\newsavebox} +% \changes{v0.1a}{1993/12/03} +% {Pass the whole of arg 1 to \cs{@ifdefinable}} +% Allocate a new `savebox'. +% \begin{macrocode} +\def\newsavebox#1{\@ifdefinable{#1}{\newbox#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\savebox} +% Save |#1| in a box register. +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\savebox}{Make \savebox robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\savebox[1]{% + \@ifnextchar(%) + {\@savepicbox#1}{\@ifnextchar[{\@savebox#1}{\sbox#1}}}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\savebox}{Make \savebox robust}% +%<latexrelease>\def\savebox#1{% +%<latexrelease> \@ifnextchar(%) +%<latexrelease> {\@savepicbox#1}{\@ifnextchar[{\@savebox#1}{\sbox#1}}}% +%<latexrelease>\expandafter\let\csname savebox \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sbox} +% \changes{v0.1a}{1993/12/03} +% {extra group} +% \changes{v0.1a}{1993/12/03} +% {color support} +% \changes{v1.0b}{1994/03/14} +% {Use \cs{color@setgroup}} +% \changes{v1.0j}{1994/10/18} +% {\cs{long} added} +% Save |#1| in a box register. +% \begin{macrocode} +\long\def\sbox#1#2{\setbox#1\hbox{% + \color@setgroup#2\color@endgroup}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@savebox} +% \changes{v0.1a}{1993/12/03} +% {default c not x} +% Look for second optional argument. +% \begin{macrocode} +\def\@savebox#1[#2]{% + \@ifnextchar [{\@isavebox#1[#2]}{\@isavebox#1[#2][c]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@isavebox} +% \changes{v0.1a}{1993/12/03} +% {extra group} +% \changes{v0.1a}{1993/12/03} +% {color support} +% \changes{v1.0b}{1994/03/14} +% {Use \cs{color@setgroup}} +% \changes{v1.0d}{1994/04/15} +% {Added missing procent character.} +% \changes{v1.0v}{1995/07/20} +% {Use \cs{sbox}} +% \begin{macrocode} +\long\def\@isavebox#1[#2][#3]#4{% + \sbox#1{\@imakebox[#2][#3]{#4}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@savepicbox} +% Picture mode version of |\savebox|. +% \begin{macrocode} +\def\@savepicbox#1(#2,#3){% + \@ifnextchar[%] + {\@isavepicbox#1(#2,#3)}{\@isavepicbox#1(#2,#3)[]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@isavepicbox} +% \changes{v0.1a}{1993/12/03} +% {extra group} +% \changes{v1.0b}{1994/03/14} +% {Use \cs{color@setgroup}} +% \changes{v1.0l}{1994/10/25} +% {missing percent (moved from ltpatch)} +% \changes{v1.0v}{1995/07/20} +% {Use \cs{sbox}} +% Picture mode version of |\savebox|. +% \begin{macrocode} +\long\def\@isavepicbox#1(#2,#3)[#4]#5{% + \sbox#1{\@imakepicbox(#2,#3)[#4]{#5}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lrbox} +% \changes{v0.1a}{1993/12/03} +% {macro added} +% \changes{v0.1a}{1993/12/03} +% {color support} +% \changes{v0.1b}{1993/12/08} +% {move \cs{@endpefalse} out of the inner group} +% \changes{v1.0b}{1994/03/14} +% {Use \cs{color@setgroup}} +% |lrbox|: the new environment form of |\sbox|. Use |\aftergroup| tricks +% to enable a \emph{local} assignment to be made to the box, in a way +% that it still has an effect \emph{outside} the |lrbox| environment. +% \begin{macrocode} +\def\lrbox#1{% + \edef\reserved@a{% + \endgroup + \setbox#1\hbox{% + \begingroup\aftergroup}% + \def\noexpand\@currenvir{\@currenvir}% + \def\noexpand\@currenvline{\on@line}}% + \reserved@a + \@endpefalse + \color@setgroup + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endlrbox} +% \changes{v0.1a}{1993/12/03} +% {macro added} +% End the |lrbox| environment. +% \begin{macrocode} +\def\endlrbox{\unskip\color@endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\usebox} +% unchanged +% \begin{macrocode} +\def\usebox#1{\leavevmode\copy #1\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frame} +% +% The following definition of |\frame| was written by Pavel Curtis +% (Extra space removed 14 Jan 88) +% RmS 92/08/24: Replaced occurrence of |\@halfwidth| by |\@wholewidth| +% \begin{macrocode} +\long\def\frame#1{% + \leavevmode + \hbox{% + \hskip-\@wholewidth + \vbox{% + \vskip-\@wholewidth + \hrule \@height\@wholewidth + \hbox{% + \vrule\@width\@wholewidth + #1% + \vrule\@width\@wholewidth}% + \hrule\@height\@wholewidth + \vskip-\@wholewidth}% + \hskip-\@wholewidth}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fboxrule} +% \begin{macro}{\fboxsep} +% user level parameters, +% \begin{macrocode} +\newdimen\fboxrule +\newdimen\fboxsep +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\fbox} +% Abbreviated framed box command. +% \changes{v0.1a}{1993/12/03} +% {extra group} +% \changes{v1.0g}{1994/05/12} +% {New definition, merged with \cs{framebox}} +% \changes{v1.0i}{1994/06/01} +% {New version, using \cs{@frameb@x}} +% \changes{v1.0j}{1994/10/18} +% {\cs{long} added} +% \changes{v1.0k}{1994/10/24} +% {Inner braces added (to fix latex/1061)} +% \changes{v1.0s}{1995/04/27} +% {Move \cs{leavevmode} for graphics/1512} +% \begin{macrocode} +\long\def\fbox#1{% + \leavevmode + \setbox\@tempboxa\hbox{% + \color@begingroup + \kern\fboxsep{#1}\kern\fboxsep + \color@endgroup}% + \@frameb@x\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\framebox} +% Framed version of |\makebox|. +% \changes{v1.0g}{1994/05/12} +% {Merged \cs{fbox} and \cs{framebox}} +% \changes{v1.0i}{1994/06/01} +% {New version, so \cs{width} is correct in \cs{framebox}} +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\framebox}{Make \framebox robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\framebox{% + \@ifnextchar(%) + \@framepicbox{\@ifnextchar[\@framebox\fbox}}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\framebox}{Make \framebox robust}% +%<latexrelease>\def\framebox{% +%<latexrelease> \@ifnextchar(%) +%<latexrelease> \@framepicbox{\@ifnextchar[\@framebox\fbox}}% +%<latexrelease>\expandafter\let\csname framebox \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@framebox} +% Deal with optional arguments. +% \begin{macrocode} +\def\@framebox[#1]{% + \@ifnextchar[%] + {\@iframebox[#1]}% + {\@iframebox[#1][c]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iframebox} +% The handling the optional arguments. +% \changes{v1.0i}{1994/06/01} +% {New version, so \cs{width} is correct in \cs{framebox}} +% \changes{v1.0j}{1994/10/18} +% {\cs{leavevmode} moved to \cs{@frameb@x}} +% \changes{v1.0s}{1995/04/27} +% {Move \cs{leavevmode} for graphics/1512} +% In order to set the whole box, including the frame to the +% specified dimension, we first determine that dimension +% from the natural size of the text, |#3|. +% calculated width. +% \begin{macrocode} +\long\def\@iframebox[#1][#2]#3{% + \leavevmode + \@begin@tempboxa\hbox{#3}% + \setlength\@tempdima{#1}% + \setbox\@tempboxa\hb@xt@\@tempdima + {\kern\fboxsep\csname bm@#2\endcsname\kern\fboxsep}% + \@frameb@x{\kern-\fboxrule}% + \@end@tempboxa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@frameb@x} +% Common part of |\framebox| and |\fbox|. |#1| is a negative kern +% in the |\framebox| case so that the vertical rules do not add to the +% width of the box. +% \changes{v1.0i}{1994/06/01} +% {Macro added.} +% \changes{v1.0j}{1994/10/18} +% {\cs{leavevmode} added} +% \changes{v1.0s}{1995/04/27} +% {Move \cs{leavevmode} for graphics/1512} +% \begin{macrocode} +\def\@frameb@x#1{% + \@tempdima\fboxrule + \advance\@tempdima\fboxsep + \advance\@tempdima\dp\@tempboxa + \hbox{% + \lower\@tempdima\hbox{% + \vbox{% + \hrule\@height\fboxrule + \hbox{% + \vrule\@width\fboxrule + #1% + \vbox{% + \vskip\fboxsep + \box\@tempboxa + \vskip\fboxsep}% + #1% + \vrule\@width\fboxrule}% + \hrule\@height\fboxrule}% + }% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@framepicbox} +% Picture mode version. +% \begin{macrocode} +\def\@framepicbox(#1,#2){% + \@ifnextchar[{\@iframepicbox(#1,#2)}{\@iframepicbox(#1,#2)[]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iframepicbox} +% Picture mode version. +% \begin{macrocode} +\long\def\@iframepicbox(#1,#2)[#3]#4{% + \frame{\@imakepicbox(#1,#2)[#3]{#4}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parbox} +% \changes{v0.1a}{1993/12/03} +% {Redefined to support extra optional arguments} +% \changes{v0.1d}{1993/12/15} +% {Changed default from `c' to `s'} +% The main vertical-box command for \LaTeX. +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\parbox}{Make \parbox robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\parbox{% + \@ifnextchar[%] + \@iparbox + {\@iiiparbox c\relax[s]}}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\parbox}{Make \parbox robust}% +%<latexrelease>\def\parbox{% +%<latexrelease> \@ifnextchar[%] +%<latexrelease> \@iparbox +%<latexrelease> {\@iiiparbox c\relax[s]}}% +%<latexrelease>\expandafter\let\csname parbox \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iparbox} +% \changes{v0.1d}{1993/12/15} +% {Changed default from `c' to `s'} +% Optional argument handling. +% \begin{macrocode} +\def\@iparbox[#1]{% + \@ifnextchar[%] + {\@iiparbox{#1}}% + {\@iiiparbox{#1}\relax[s]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iiparbox} +% Optional argument handling. +% \begin{macrocode} +\def\@iiparbox#1[#2]{% + \@ifnextchar[%] + {\@iiiparbox{#1}{#2}}% + {\@iiiparbox{#1}{#2}[#1]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iiiparbox} +% \begin{macro}{\@parboxto} +% \changes{v1.0j}{1994/10/18} +% {Macro added to remove misuse of \cs{@empty}} +% \changes{v0.1b}{1993/12/08} +% {\cs{endgraf} added due to extra group in \cs{@begin@tempboxa}} +% \changes{v1.0y}{1996/06/10} +% {(DPC) Changed \cs{endgraf} to \cs{@@par}} +% \changes{v1.1f}{1999/04/27} +% {(CAR) Changed \cs{@empty} to \cs{relax} as flag for natural +% width: pr/2975} +% \changes{v1.1g}{2006/05/18} +% {Ensure \cs{@parboxto} holds the value of \cs{@tempdimb} not the +% register itself (pr/3867)} +% The internal version of |\parbox|. +% \begin{macrocode} +\let\@parboxto\@empty +\long\def\@iiiparbox#1#2[#3]#4#5{% + \leavevmode + \@pboxswfalse + \setlength\@tempdima{#4}% + \@begin@tempboxa\vbox{\hsize\@tempdima\@parboxrestore#5\@@par}% + \ifx\relax#2\else + \setlength\@tempdimb{#2}% + \edef\@parboxto{to\the\@tempdimb}% + \fi + \if#1b\vbox + \else\if #1t\vtop + \else\ifmmode\vcenter + \else\@pboxswtrue $\vcenter + \fi\fi\fi + \@parboxto{\let\hss\vss\let\unhbox\unvbox + \csname bm@#3\endcsname}% + \if@pboxsw \m@th$\fi + \@end@tempboxa} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{v1.0c}{1994/04/12} +% {Remove \cs{@acci}, now defined in ltplain.dtx} +% \changes{v1.0c}{1994/04/12} +% {Remove \cs{@dischyph}, now defined in ltinit.dtx} +% +% \begin{macro}{\@arrayparboxrestore} +% Restore various paragraph parameters. +% +% The rational for allowing two normally global flags to be set +% locally here was stated originally by +% Donald Arsenau and extended by Chris Rowley. +% It is because these flags are only set globally to +% true by section commands, and these should never appear within +% boxes or, indeed, in any group; and they are only ever +% set globally to false when they are definitely true. +% +% If anyone is unhappy with this argument then both flags should be +% treated as in |\set@nobreak|; otherwise this command will be +% redundant. +% \changes{v1.1a}{1996/10/24}{Added local settings of flags: dangerous!!} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017-04-15}% +%<latexrelease> {\normallineskiplimit} +%<latexrelease> {reset \lineskiplimit}% +%<*2ekernel|latexrelease> +\def\@arrayparboxrestore{% + \let\if@nobreak\iffalse + \let\if@noskipsec\iffalse + \let\par\@@par + \let\-\@dischyph +% \end{macrocode} +% Redefined accents to allow changes in font encoding +% \changes{v1.0h}{1994/05/13} +% {New accent system, use \cs{let} not \cs{def}} +% \begin{macrocode} + \let\'\@acci\let\`\@accii\let\=\@acciii + \parindent\z@ \parskip\z@skip + \everypar{}% + \linewidth\hsize + \@totalleftmargin\z@ + \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip + \parfillskip\@flushglue + \lineskip\normallineskip +% \end{macrocode} +% \changes{v1.3a}{2017/03/29} +% {Reset \cs{lineskiplimit}} +% \begin{macrocode} + \lineskiplimit\normallineskiplimit +% \end{macrocode} +% +% \begin{macrocode} + \baselineskip\normalbaselineskip + \sloppy} +%</2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000-00-00}% +%<latexrelease> {\normallineskiplimit} +%<latexrelease> {reset \lineskiplimit}% +%<latexrelease>\def\@arrayparboxrestore{% +%<latexrelease> \let\if@nobreak\iffalse +%<latexrelease> \let\if@noskipsec\iffalse +%<latexrelease> \let\par\@@par +%<latexrelease> \let\-\@dischyph +%<latexrelease> \let\'\@acci\let\`\@accii\let\=\@acciii +%<latexrelease> \parindent\z@ \parskip\z@skip +%<latexrelease> \everypar{}% +%<latexrelease> \linewidth\hsize +%<latexrelease> \@totalleftmargin\z@ +%<latexrelease> \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip +%<latexrelease> \parfillskip\@flushglue \lineskip\normallineskip +%<latexrelease> \baselineskip\normalbaselineskip +%<latexrelease> \sloppy} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parboxrestore} +% Restore various paragraph parameters, and also |\\|. +% \begin{macrocode} +\def\@parboxrestore{\@arrayparboxrestore\let\\\@normalcr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@minipage} +% Switch that is true at the start of a minipage. +% \changes{v1.0z}{1996/07/26}{put \cs{global} into definition} +% \begin{macrocode} +\def\@minipagefalse{\global\let\if@minipage\iffalse} +\def\@minipagetrue {\global\let\if@minipage\iftrue} +\@minipagefalse +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\minipage} +% \changes{v0.1a}{1993/12/03} +% {Redefined to support extra optional arguments} +% \changes{v0.1d}{1993/12/15} +% {extra space removed.} +% \changes{v0.1d}{1993/12/15} +% {Changed default from `c' to `s'} +% Essentially an environment form of |\parbox|. +% \begin{macrocode} +\def\minipage{% + \@ifnextchar[%] + \@iminipage + {\@iiiminipage c\relax[s]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iminipage} +% \changes{v0.1d}{1993/12/15} +% {Changed default from `c' to `s'} +% Optional argument handling. +% \begin{macrocode} +\def\@iminipage[#1]{% + \@ifnextchar[%] + {\@iiminipage{#1}}% + {\@iiiminipage{#1}\relax[s]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iiminipage} +% Optional argument handling. +% \begin{macrocode} +\def\@iiminipage#1[#2]{% + \@ifnextchar[%] + {\@iiiminipage{#1}{#2}}% + {\@iiiminipage{#1}{#2}[#1]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iiiminipage} +% \changes{v1.0e}{1994/04/21} +% {Extra \cs{bgroup} for colour} +% \changes{v1.0f}{1994/05/11} +% {Use new \cs{color@setgroup} concept.} +% Internal form of |minipage|. +% \changes{v1.1a}{1996/10/24}{Use it or lose it (@setminpage): Frank +% will want to lose it} +% \begin{macrocode} +\def\@iiiminipage#1#2[#3]#4{% + \leavevmode + \@pboxswfalse + \setlength\@tempdima{#4}% + \def\@mpargs{{#1}{#2}[#3]{#4}}% + \setbox\@tempboxa\vbox\bgroup + \color@begingroup + \hsize\@tempdima + \textwidth\hsize \columnwidth\hsize + \@parboxrestore + \def\@mpfn{mpfootnote}\def\thempfn{\thempfootnote}\c@mpfootnote\z@ + \let\@footnotetext\@mpfootnotetext + \let\@listdepth\@mplistdepth \@mplistdepth\z@ + \@minipagerestore + \@setminipage} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@minipagerestore} +% Hook so that other styles can reset other commands in a minipage. +% \begin{macrocode} + \let\@minipagerestore=\relax +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\endminipage} +% \changes{LaTeX209}{1992/08/14} +% {(RmS) replaced \cs{vskip}-\cs{lastskip} by \cs{unskip} +% (proposed by FMi)} +% \changes{v1.0e}{1994/04/21} +% {Extra \cs{egroup} for colour} +% \changes{v1.0f}{1994/05/11} +% {Use new \cs{color@setgroup} concept.} +% \changes{v1.0n}{1994/11/05} +% {Colour resetting for footnotes moved to here: as for main +% page.} +% \begin{macrocode} +\def\endminipage{% + \par + \unskip + \ifvoid\@mpfootins\else + \vskip\skip\@mpfootins + \normalcolor + \footnoterule + \unvbox\@mpfootins + \fi + \@minipagefalse %% added 24 May 89 + \color@endgroup + \egroup + \expandafter\@iiiparbox\@mpargs{\unvbox\@tempboxa}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@mplistdepth} +% \begin{macro}{\@mpfootins} +% Versions of |\@listdepth| and |\footins| local to minipage. +% \begin{macrocode} +\newcount\@mplistdepth +\newinsert\@mpfootins +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@mpfootnotetext} +% Minipage version of |\@footnotetext|. +% +% Final |\strut| added 27 Mar 89, on suggestion by Don Hosek +% \changes{LaTeX2.09}{1991/09/29}{(RmS) added \cs{reset@font}} +% \changes{LaTeX2.09}{1992/11/26}{(RmS) added protection for \cs{edef}} +% \changes{v0.1a}{1994/03/07}{Extra group for colour} +% \changes{v1.0e}{1994/04/21} +% {Extra \cs{endgraf} for colour} +% \changes{v1.0f}{1994/05/11} +% {Use new \cs{color@setgroup} concept.} +% \changes{v1.0f}{1994/05/11} +% {Use new \cs{normalcolor} and \cs{@finalstrut}.} +% \changes{v1.0m}{1994/11/04} +% {Added \cs{protected@edef}. ASAJ.} +% \changes{v1.0n}{1994/11/05} +% {Colour resetting for footnotes moved to endminipage: as for main +% page.} +% \changes{v1.0o}{1994/11/05} +% {Colour groups restored here.} +% \begin{macrocode} +\long\def\@mpfootnotetext#1{% + \global\setbox\@mpfootins\vbox{% + \unvbox\@mpfootins + \reset@font\footnotesize + \hsize\columnwidth + \@parboxrestore + \protected@edef\@currentlabel + {\csname p@mpfootnote\endcsname\@thefnmark}% + \color@begingroup + \@makefntext{% + \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% + \color@endgroup}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\newif\if@pboxsw +% \end{macrocode} +% +% \begin{macro}{\rule} +% Draw a rule of the specified size. +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\rule}{Make \rule robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\rule{\@ifnextchar[\@rule{\@rule[\z@]}}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\rule}{Make \rule robust}% +%<latexrelease>\def\rule{\@ifnextchar[\@rule{\@rule[\z@]}}% +%<latexrelease>\expandafter\let\csname rule \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@rule} +% Internal form of |\rule|. +% \changes{v1.1c}{1998/06/04}{Support calc-expressions} +% \begin{macrocode} + \def\@rule[#1]#2#3{% + \leavevmode + \hbox{% + \setlength\@tempdima{#1}% + \setlength\@tempdimb{#2}% + \setlength\@tempdimc{#3}% + \advance\@tempdimc\@tempdima + \vrule\@width\@tempdimb\@height\@tempdimc\@depth-\@tempdima}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@underline} +% Saved primitive |\underline|. +% \begin{macrocode} +\let\@@underline\underline +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\underline} +% \LaTeX\ version works outside math. +% \task{???}{why the second `relax in `underline ?} +% \begin{macrocode} +\def\underline#1{% + \relax + \ifmmode\@@underline{#1}% + \else $\@@underline{\hbox{#1}}\m@th$\relax\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\raisebox} +% \changes{v0.1a}{1993/12/03} +% {redefined to support \cs{height}} +% \changes{v1.0s}{1995/04/27} +% {Move \cs{leavevmode} for graphics/1512} +% Raise a box, and change its vertical dimensions. +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\raisebox}{Make \raisebox robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\raisebox[1]{% + \leavevmode + \@ifnextchar[{\@rsbox{#1}}{\@irsbox{#1}[]}} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\raisebox}{Make \raisebox robust}% +%<latexrelease>\def\raisebox#1{% +%<latexrelease> \leavevmode +%<latexrelease> \@ifnextchar[{\@rsbox{#1}}{\@irsbox{#1}[]}} +%<latexrelease>\expandafter\let\csname raisebox \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@rsbox} +% Optional argument handling. +% \begin{macrocode} +\def\@rsbox#1[#2]{% + \@ifnextchar[{\@iirsbox{#1}[#2]}{\@irsbox{#1}[#2]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@argrsbox} +% \changes{v0.1a}{1993/12/03} +% {macro removed} +% ... +% \end{macro} +% +% \begin{macro}{\@irsbox} +% \changes{v0.1a}{1993/12/03} +% {redefined to support \cs{height}} +% \changes{v0.1b}{1993/12/08} +% {fix typo} +% \changes{v0.1c}{1993/12/09} +% {fix another typo} +% \changes{v0.1f}{1994/03/03} +% {Replaced a missing \cs{else}} +% \changes{v1.0s}{1995/04/27} +% {Move \cs{leavevmode} for graphics/1512} +% \changes{v1.0u}{1995/05/17} +% {Removed surplus braces} +% Internal version of |\raisebox| (less than two optional args). +% \begin{macrocode} +\long\def\@irsbox#1[#2]#3{% + \@begin@tempboxa\hbox{#3}% + \setlength\@tempdima{#1}% + \ifx\\#2\\\else\setlength\@tempdimb{#2}\fi + \setbox\@tempboxa\hbox{\raise\@tempdima\box\@tempboxa}% + \ifx\\#2\\\else\ht\@tempboxa\@tempdimb\fi + \box\@tempboxa + \@end@tempboxa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iirsbox} +% \changes{v0.1a}{1993/12/03} +% {redefined to support \cs{height}} +% \changes{v1.0s}{1995/04/27} +% {Move \cs{leavevmode} for graphics/1512} +% Internal version of |\raisebox| (two optional args). +% \begin{macrocode} +\long\def\@iirsbox#1[#2][#3]#4{% + \@begin@tempboxa\hbox{#4}% + \setlength\@tempdima{#1}% + \setlength\@tempdimb{#2}% + \setlength\dimen@{#3}% + \setbox\@tempboxa\hbox{\raise\@tempdima\box\@tempboxa}% + \ht\@tempboxa\@tempdimb + \dp\@tempboxa\dimen@ + \box\@tempboxa + \@end@tempboxa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@finalstrut} +% This macro adds a special strut the \emph{depth} of the box given as +% |#1|, and height and width 0pt. It is used for ensuring that the +% last line of a paragraph has the correct depth in `p' columns of +% tables and in footnotes. In vertical mode nothing is done, as adding +% the strut (as done in 2.09) would start a new paragraph. It would be +% possible to inspect |\prevdepth| to check the depth of the +% just-completed paragraph, but we do not do that here. +% \changes{v1.0g}{1994/05/12} +% {macro added} +% Actually we do even less now, skip the vmode test as it broke tabular +% `p' columns. +% \changes{v1.0p}{1994/11/09} +% {Revert \cs{finalstrut} to 2.09 equivalent (from ltpatch)}. +% \changes{v1.0x}{1995/10/31} +% {Add \cs{nobreak} in horiz mode to allow hyphenation. +% internal/1931} +% +% The |\nobreak| was added (1995/10/31) to allow hyphenation of the +% final word of the paragraph. +% \begin{macrocode} +\def\@finalstrut#1{% + \unskip\ifhmode\nobreak\fi\vrule\@width\z@\@height\z@\@depth\dp#1} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Some low-level constructs} +% +% The following commands are basically inherited from plain \TeX. +% +% \begin{macro}{\leftline} +% \begin{macro}{\rightline} +% \begin{macro}{\centerline} +% \begin{macro}{\@@line} +% These macros place text on a full line either centred or left or +% right adjusted. +% \begin{macrocode} +\def\@@line{\hb@xt@\hsize} +\def\leftline#1{\@@line{#1\hss}} +\def\rightline#1{\@@line{\hss#1}} +\def\centerline#1{\@@line{\hss#1\hss}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\rlap} +% \begin{macro}{\llap} +% These macros place text to the left or right of the current +% reference point without taking up space. +% \end{macro} +% \begin{macrocode} +\def\rlap#1{\hb@xt@\z@{#1\hss}} +\def\llap#1{\hb@xt@\z@{\hss#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +\endinput +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltclass.dtx b/Master/texmf-dist/source/latex-dev/base/ltclass.dtx new file mode 100644 index 00000000000..b3a23310130 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltclass.dtx @@ -0,0 +1,2598 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltclass.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltclass.dtx} + [2019/07/09 v1.3a LaTeX Kernel (Class & Package Interface)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltclass.dtx} +\begin{document} +\title{The main structure of documents} +\author{Frank Mittelbach\and Chris Rowley\and Alan Jeffrey\and + David Carlisle} +\date{\filedate} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% \iffalse +% (C) Copyright Frank Mittelbach, Chris Rowley, +% Alan Jeffrey and David Carlisle 1993-1998. +% All rights reserved. +% \fi +% +% +% \changes{v0.2f}{1993/11/22} +% {\cs{@unknownversion} removed} +% \changes{v1.0j}{1994/10/18} +% {Move \cs{listfiles} to ltfiles.dtx} +% \changes{v1.0f}{1994/05/22}{Use new warning and error commands} +% \changes{v1.0l}{1994/11/17}{\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0z}{1998/03/21}{Added to documentation of filecontents} +% \changes{v1.1c}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% +% \section{Introduction} +% +% This file implements the following declarations, which replace +% |\documentstyle| in \LaTeXe\ documents. +% +% Note that old documents containing |\documentstyle| will be run using +% a compatibility option---thus keeping everyone happy, we hope! +% +% The overall idea is that there are two types of `style files': +% `class files' which define elements and provide a default formatting +% for them; and `packages' which provide extra functionality. One +% difference between \LaTeXe\ and \LaTeX2.09 is that \LaTeXe\ packages +% may have options. Note that options to classes packages may be +% implemented such that they input files, but these file names are not +% necessarily directly related to the option name. +% +% \section{User interface} +% +% |\documentclass[|\meta{main-option-list}|]{|^^A +% \meta{class}|}[|\meta{version}|]| +% +% There must be exactly one such declaration, and it must come first. +% The \meta{main-option-list} is a list of options which can modify the +% formatting of elements which are defined in the \meta{class} file +% as well as in all following |\usepackage| declarations (see below). +% The \meta{version} is a version number, beginning with a date in the +% format |YYYY/MM/DD|. If an older version of the class is found, a +% warning is issued. +% +% \bigskip +% +% |\documentstyle[|\meta{main-option-list}|]{|^^A +% \meta{class}|}[|\meta{version}|]| +% +% The |\documentstyle| declaration is kept in order to maintain upward +% compatibility with \LaTeX2.09 documents. It is similar to +% |\documentclass|, but it causes all options in +% \meta{main-option-list} that the \meta{class} does not use to be +% passed to |\RequirePackage| after the options have been processed. +% This maintains compatibility with the 2.09 behaviour. Also a flag is +% set to indicate that the document is to be processed in \LaTeX2.09 +% compatibility mode. As far as most packages are concerned, this +% only affects the warnings and errors \LaTeX\ generates. This flag +% does affect the definition of font commands, and |\sloppy|. +% +% \bigskip +% +% |\usepackage[|\meta{package-option-list}|]{|^^A +% \meta{package-list}|}[|\meta{version}|]| +% +% There can be any number of these declarations. All packages in +% \meta{package-list} are called with the same options. +% +% Each \meta{package} file defines new elements (or modifies those +% defined in the \meta{class}), and thus extends the range of documents +% which can be processed. +% The \meta{package-option-list} is a list of options which can modify +% the formatting of elements defined in the \meta{package} file. +% The \meta{version} is a version number, beginning with a date in the +% format |YYYY/MM/DD|. If an older version of the package is found, a +% warning is issued. +% +% Each package is loaded only once. If the same package is requested +% more than once, nothing happens, unless the package has been requested +% with options that were not given the first time it was loaded, in +% which case an error is produced. +% +% As well as processing the options given in the +% \meta{package-option-list}, each package processes the +% \meta{main-option-list}. This means that options that affect all +% of the packages can be given globally, rather than repeated for every +% package. +% +% Note that class files have the extension |.cls|, packages have the +% extension |.sty|. +% +% \DescribeEnv{filecontents} +% The environment |filecontents| is intended for passing the contents +% of packages, options, or other files along with a document in a +% single file. +% It has one argument, which is the name of the file to create. If that +% file already exists (maybe only in the current directory if the OS +% supports a notion of a `current directory' or `default directory') +% then nothing happens +% (except for an information message) and the body of the environment +% is bypassed. Otherwise, the body of the environment is written +% verbatim to the file name given as the first argument, together with +% some comments about how it was produced. +% +% The environment is allowed only before |\documentclass| to ensure +% that all packages or options necessary for this particular run are +% present when needed. The begin and end tags should each be on a +% line by itself. There is also a star-form; this does not write +% extra comments into the file. +% +% \subsection{Option processing} +% +% When the options are processed, they are divided into two types: {\em +% local\/} and {\em global}: +% \begin{itemize} +% +% \item For a class, the options in the |\documentclass| command are +% local. +% +% \item For a package, the options in the |\usepackage| command are +% local, and the options in the |\documentclass| command are global. +% +% \end{itemize} +% The options for |\documentclass| and |\usepackage| +% are processed in the following way: +% \begin{enumerate} +% +% \item The local and global options that have been declared +% (using |\DeclareOption| as described below) are processed +% first. +% +% In the case of |\ProcessOptions|, they are processed in the order +% that they were declared in the class or package. +% +% In the case of |\ProcessOptions*|, they are processed in the order +% that they appear in the option-lists. First the global options, and +% then the local ones. +% +% \item Any remaining local options are dealt with using the default +% option (declared using the |\DeclareOption*| declaration described +% below). For document classes, this usually does nothing, but +% records the option on a list of unused options. +% For packages, this usually produces an error. +% +% \end{enumerate} +% Finally, when |\begin{document}| is reached, if there are any global +% options which have not been used by either the class or any package, +% the system will produce a warning. +% +% +% \section{Class and Package interface} +% +% \subsection{Class name and version} +% +% \DescribeMacro\ProvidesClass +% A class can identify itself with the +% |\ProvidesClass{|\meta{name}|}[|\meta{version}|]| command. The +% \meta{version} should begin with a date in the format |YYYY/MM/DD|. +% +% \subsection{Package name and version} +% +% \DescribeMacro\ProvidesPackage +% A package can identify itself with the +% |\ProvidesPackage|\marg{name}\oarg{version} command. The +% \meta{version} should begin with a date in the format |YYYY/MM/DD|. +% +% \subsection{Requiring other packages} +% +% \DescribeMacro\RequirePackage +% Packages or classes can load other packages using\\ +% |\RequirePackage|\oarg{options}\marg{name}\oarg{version}.\\ +% If the package has already been loaded, then nothing happens unless +% the requested options are not a subset of the options with which it +% was loaded, in which case an error is called. +% +% \DescribeMacro\LoadClass +% Similar to |\RequirePackage|, but for classes, may not be used in +% package files. +% +% \DescribeMacro\PassOptionsToPackage +% Packages can pass options to other packages using:\\ +% |\PassOptionsToPackage{|\meta{options}|}{|\meta{package}|}|.\\ +% \DescribeMacro\PassOptionsToClass +% This adds the \meta{options} to the options list of any future +% |\RequirePackage| or |\usepackage| command. For example: +% \begin{verbatim} +% \PassOptionsToPackage{foo,bar}{fred} +% \RequirePackage[baz]{fred}\end{verbatim} +% is the same as: +% \begin{verbatim} +% \RequirePackage[foo,bar,baz]{fred}\end{verbatim} +% +% \DescribeMacro\LoadClassWithOptions +% |\LoadClassWithOptions|\marg{name}\oarg{version}:\\ +% This is similar to +% |\LoadClass|, but it always calls class \meta{name} with +% exactly the same option list that is being used by the current class, +% rather than an option explicitly supplied or passed on by +% |\PassOptionsToClass|. +% \DescribeMacro\RequirePackageWithOptions +% |\RequirePackageWithOptions| is the analogous command for packages. +% +% This is mainly intended to allow one class to simply build on another, +% for example: +%\begin{verbatim} +% \LoadClassWithOptions{article} +%\end{verbatim} +% +% This should be contrasted with the slightly different construction +%\begin{verbatim} +% \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} +% \ProcessOptions +% \LoadClass{article} +%\end{verbatim} +% +% As used here, the effects are more or less the same, but the +% version using |\LoadClassWithOptions| is slightly quicker +% (and less to type). +% If, however, the class declares options of its own then +% the two constructions are different; compare, for example: +%\begin{verbatim} +% \DeclareOption{landscape}{...} +% \ProcessOptions +% \LoadClassWithOptions{article} +%\end{verbatim} +% with: +%\begin{verbatim} +% \DeclareOption{landscape}{...} +% \DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} +% \ProcessOptions +% \LoadClass{article} +%\end{verbatim} +% In the first case, the \textsf{article} class will be called with +% option |landscape| precisely when the current class is called with +% this option; but in the second example it will +% not as in that case \textsf{article} is only passed options by the +% default option handler, which is not used for |landscape| as that +% option is explicitly declared. +% +% \DescribeMacro\@ifpackageloaded +% To find out if a package has already been loaded, use\\ +% \DescribeMacro\@ifclassloaded +% |\@ifpackageloaded{|\meta{package}|}{|\meta{true}|}{|\meta{false}|}|. +% +% \DescribeMacro\@ifpackagelater +% \changes{v1.1i}{2013/07/07}{Correctly describe how the date in +% \cs{@ifpackagelater} is used} +% To find out if a package has already been loaded with a version +% equal to or more +% recent than \meta{version}, use\\ +% \DescribeMacro\@ifclasslater +% |\@ifpackagelater{|\meta{package}|}{|\meta{version}|}{|^^A +% \meta{true}|}{|\meta{false}|}|. +% +% \DescribeMacro\@ifpackagewith +% To find out if a package has already been loaded with at least the +% options \meta{options}, use +% \DescribeMacro\@ifclasswith +% |\@ifpackagewith{|\meta{package}|}{|\meta{options}|}{|^^A +% \meta{true}|}{|\meta{false}|}|. +% +% There exists one package that can't be tested with the above +% commands: the \texttt{fontenc} package pretends that it was never +% loaded to allow for repeated reloading with different options (see +% \texttt{ltoutenc.dtx} for details). +% +% +% \subsection{Declaring new options} +% +% Options for classes and packages are built using the same macros. +% +% \DescribeMacro\DeclareOption To define a builtin option, use +% |\DeclareOption{|\meta{name}|}{|\meta{code}|}|. +% +% \DescribeMacro{\DeclareOption*} To define the default action to +% perform for local options which have not been declared, use +% |\DeclareOption*{|\meta{code}|}|. +% +% {\em Note\/}: there should be no use of\\ +% |\RequirePackage|, |\DeclareOption|, |\DeclareOption*| or +% |\ProcessOptions|\\ +% inside |\DeclareOption| or |\DeclareOption*|. +% +% Possible uses for |\DeclareOption*| include: +% +% |\DeclareOption*{}|\\ +% Do nothing. Silently accept unknown options. (This suppresses the +% usual warnings.) +% +% |\DeclareOption*{\@unkownoptionerror}|\\ +% Complain about unknown local options. (The initial setting for +% package files.) +% +% |\DeclareOption*{\PassOptionsToPackage{\CurrentOption}|^^A +% |{|\meta{pkg-name}|}|\\ +% Handle the the current option by passing it on to the package +% \meta{pkg-name}, which will presumably be loaded via +% |\RequirePackage| later in the file. This is useful for building +% `extension' packages, that perhaps handle a couple of new options, +% but then pass everything else on to an existing package. +% +% |\DeclareOption*{\InputIfFileExists{xx-\CurrentOption.yyy}%|\\ +% | {}%|\\ +% | {\OptionNotUsed}}|\\ +% Handle the option foo by loading the file |xx-foo.yyy| if it +% exists, otherwise do nothing, but declare that the option was not +% used. +% Actually the |\OptionNotUsed| declaration is only needed if this is +% being used in class files, but does no harm in package files. +% +% +% \subsection{Safe Input Macros} +% \DescribeMacro{\InputIfFileExists} +% |\InputIfFileExists{|\meta{file}|}{|\meta{then}|}{|\meta{else}|}|\\ +% Inputs \meta{file} if it exists. Immediately before the input, +% \meta{then} is executed. Otherwise \meta{else} is executed. +% +% \DescribeMacro{\IfFileExists} +% As above, but does not input the file. +% +% One thing you might like to put in the \meta{else} clause is +% +% \DescribeMacro{\@missingfileerror} +% This starts an interactive request for a filename, supplying default +% extensions. Just hitting return causes the whole input to be skipped +% and entering |x| quits the current run, +% +% \DescribeMacro{\input} +% This has been redefined from the \LaTeX2.09 definition, in terms of +% the new commands |\InputIfFileExists| and |\@missingfileerror|. +% +% +% \DescribeMacro{\listfiles} Giving this declaration in the preamble +% causes a list of all files input via the `safe input' commands to be +% listed at the end. Any strings specified in the optional argument to +% |\ProvidesPackage| are listed alongside the file name. So files in +% standard (and other non-standard) distributions can put informative +% strings in this argument. +% +% \StopEventually{} +% +% \section{Implementation} +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% +% \changes{v0.2g}{1993/11/23} +% {Various macros now moved to latex.tex.} +% \changes{v0.2g}{1993/11/23} +% {Warnings and errors now directly coded.} +% \changes{v0.2h}{1993/11/28} +% {Primitive filenames now terminated by space not \cs{relax}.} +% \changes{v0.2h}{1993/11/28} +% {Directory syntax checing moved to dircheck.dtx} +% \changes{v0.2h}{1993/11/28} +% {Assorted commands now in the kernel removed.} +% \changes{v0.2i}{1993/12/03} +% {\cs{@onlypreamble}: Many commands declared.} +% \changes{v0.2i}{1993/12/03} +% {Removed obsolete \cs{@documentclass}} +% \changes{v0.2o}{1993/12/13} +% {Removed setting \cs{errorcontextlines}\ (now in latex.tex)} +% \changes{v0.2p}{1993/12/15} +% {Removed extra `.'s from \cs{@@warning}s} +% \changes{v0.2s}{1994/01/17} +% {Added many more \cs{@onlypreamble} commands} +% \changes{v0.2s}{1994/01/17} +% {Wrapped long lines to column 72} +% \changes{v0.3a}{1994/03/02} +% {Remove need for driver file} +% \changes{v0.3b}{1994/03/08} +% {Modify driver code into `new style'} +% \changes{v0.3c}{1994/03/12} +% {Change name from docclass to ltclass} +% \changes{v0.3h}{1994/04/25} +% {Removed spurious extra `.'s at the end of error messages} +% \changes{v1.0a}{1994/04/29} +% {Change version number to 1 (no other change)} +% \changes{v1.0k}{1994/11/03} +% {Move \cs{@missingfileerror} to ltfiles} +% +% \begin{macro}{\if@compatibility} +% The flag for compatibility mode. +% \begin{macrocode} +\newif\if@compatibility +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@documentclasshook} +% The hook called after the first |\documentclass| command. By +% default this checks to see if |\@normalsize| is undefined, and if +% so, sets it to |\normalsize|. +% \changes{v0.2q}{1993/12/17} +% {Macro added} +% \changes{v0.2z}{1994/02/10} +% {Changed the name from \cs{@compatibility} to +% \cs{@documentclasshook}, and added the check for whether +% \cs{@normalsize} has been defined. ASAJ.} +% \begin{macrocode} +\def\@documentclasshook{% + \ifx\@normalsize\@undefined + \let\@normalsize\normalsize + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@declaredoptions} +% This list is automatically built by |\DeclareOption|. +% It is the list of options (separated by commas) declared in +% the class or package file and it defines the order in which the +% the corresponding |\ds@|\meta{option} commands are executed. +% All local \meta{option}s which are not declared will be processed +% in the order defined by the optional argument of |\documentclass| +% or |\usepackage|. +% \begin{macrocode} +\let\@declaredoptions\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classoptionslist} +% List of options of the main class. +% \changes{v1.0u}{1996/07/26}{made only preamble} +% \begin{macrocode} +\let\@classoptionslist\relax +\@onlypreamble\@classoptionslist +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@unusedoptionlist} +% \changes{v1.0u}{1996/07/26}{made only preamble} +% List of options of the main class that haven't been declared or +% loaded as class option files. +% \begin{macrocode} +\let\@unusedoptionlist\@empty +\@onlypreamble\@unusedoptionlist +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\CurrentOption} +% Name of current package or option. +% \changes{v0.2c}{1993/11/17} +% {Name changed from \cs{@curroption}} +% \begin{macrocode} +\let\CurrentOption\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@currname} +% Name of current package or option. +% \begin{macrocode} +\let\@currname\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@currext} +% The current file extension. +% \changes{v0.2a}{1993/11/14}{Name changed from \cs{@currextension}} +% \begin{macrocode} +\global\let\@currext=\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@clsextension} +% \begin{macro}{\@pkgextension} +% The two possible values of |\@currext|. +% \begin{macrocode} +\def\@clsextension{cls} +\def\@pkgextension{sty} +\@onlypreamble\@clsextension +\@onlypreamble\@pkgextension +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@pushfilename} +% \begin{macro}{\@popfilename} +% \begin{macro}{\@currnamestack} +% Commands to push and pop the file name and extension. \\ +% |#1| current name. \\ +% |#2| current extension. \\ +% |#3| current catcode of |@|. \\ +% |#4| Rest of the stack. +% \begin{macrocode} +\def\@pushfilename{% + \xdef\@currnamestack{% + {\@currname}% + {\@currext}% + {\the\catcode`\@}% + \@currnamestack}} +\@onlypreamble\@pushfilename +% \end{macrocode} +% +% \begin{macrocode} +\def\@popfilename{\expandafter\@p@pfilename\@currnamestack\@nil} +\@onlypreamble\@popfilename +% \end{macrocode} +% +% \begin{macrocode} +\def\@p@pfilename#1#2#3#4\@nil{% + \gdef\@currname{#1}% + \gdef\@currext{#2}% + \catcode`\@#3\relax + \gdef\@currnamestack{#4}} +\@onlypreamble\@p@pfilename +% \end{macrocode} +% +% \begin{macrocode} +\gdef\@currnamestack{} +\@onlypreamble\@currnamestack +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ptionlist} +% Returns the option list of the file. +% \begin{macrocode} +\def\@ptionlist#1{% + \@ifundefined{opt@#1}\@empty{\csname opt@#1\endcsname}} +\@onlypreamble\@ptionlist +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifpackageloaded} +% \begin{macro}{\@ifclassloaded} +% |\@ifpackageloaded{|\meta{name}|}| +% Checks to see whether a file has been loaded. +% \changes{v0.2t}{1994/01/18} +% {Fix typo \cs{@pkgetension}} +% \begin{macrocode} +\def\@ifpackageloaded{\@ifl@aded\@pkgextension} +\def\@ifclassloaded{\@ifl@aded\@clsextension} +\@onlypreamble\@ifpackageloaded +\@onlypreamble\@ifclassloaded +% \end{macrocode} +% +% \begin{macrocode} +\def\@ifl@aded#1#2{% + \expandafter\ifx\csname ver@#2.#1\endcsname\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +\@onlypreamble\@ifl@aded +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ifpackagelater} +% \begin{macro}{\@ifclasslater} +% |\@ifpackagelater{|\meta{name}|}{YYYY/MM/DD}| +% Checks that the package loaded is more recent than the given date. +% \begin{macrocode} +\def\@ifpackagelater{\@ifl@ter\@pkgextension} +\def\@ifclasslater{\@ifl@ter\@clsextension} +\@onlypreamble\@ifpackagelater +\@onlypreamble\@ifclasslater +% \end{macrocode} +% +% \begin{macrocode} +\def\@ifl@ter#1#2{% + \expandafter\@ifl@t@r + \csname ver@#2.#1\endcsname} +\@onlypreamble\@ifl@ter +%</2ekernel> +% \end{macrocode} +% +% This internal macro is also used in |\NeedsTeXFormat|. +% \changes{v0.2f}{1993/11/22} +% {Added //00 so parsing never produces a runaway argument.} +% \changes{v1.2d}{2018/02/18} +% {Added 0 up front to make bad data come out as 0.} +% \changes{v1.2g}{2018/04/08} +% {Strip leading spaces from dates.} +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2018/04/01}% +%<latexrelease> {\@ifl@t@r}{Guard against bad input}% +%<*2ekernel|latexrelease> +\def\@ifl@t@r#1#2{% + \ifnum\expandafter\@parse@version@#1//00\@nil<% + \expandafter\@parse@version@#2//00\@nil + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi} +\def\@parse@version@#1{\@parse@version0#1} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@ifl@t@r}{Guard against bad input}% +%<latexrelease>\def\@ifl@t@r#1#2{% +%<latexrelease> \ifnum\expandafter\@parse@version#1//00\@nil<% +%<latexrelease> \expandafter\@parse@version#2//00\@nil +%<latexrelease> \expandafter\@secondoftwo +%<latexrelease> \else +%<latexrelease> \expandafter\@firstoftwo +%<latexrelease> \fi} +%<latexrelease>\let\@parse@version@\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\@ifl@t@r +% \end{macrocode} +% +% \changes{v1.1j}{2016/06/20} +% {don't declare as \cs{@onlypreamble}} +% \changes{v1.2c}{2017/03/08} +% {add \cs{@parse@version@dash} to support yyyy-mm-dd as well as yyyy/mm/dd } +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexreleasefirst> +\def\@parse@version#1/#2/#3#4#5\@nil{% +\@parse@version@dash#1-#2-#3#4\@nil +} +% \end{macrocode} +% +% The |\if| test here ensures that an argument with no |/| or |-| produces 0 (actually 00). +% \begin{macrocode} +\def\@parse@version@dash#1-#2-#3#4#5\@nil{% + \if\relax#2\relax\else#1\fi#2#3#4 } +%</2ekernel|latexreleasefirst> +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ifpackagewith} +% \begin{macro}{\@ifclasswith} +% |\@ifpackagewith{|\meta{name}|}{|\meta{option-list}|}| +% Checks that \meta{option-list} is a subset of the options +% \textbf{with} which \meta{name} was loaded. +% \begin{macrocode} +\def\@ifpackagewith{\@if@ptions\@pkgextension} +\def\@ifclasswith{\@if@ptions\@clsextension} +\@onlypreamble\@ifpackagewith +\@onlypreamble\@ifclasswith +% \end{macrocode} +% +% \begin{macrocode} +\def\@if@ptions#1#2{% + \@expandtwoargs\@if@pti@ns{\@ptionlist{#2.#1}}} +\@onlypreamble\@if@ptions +% \end{macrocode} +% +% Probably shouldn't use |\CurrentOption| here\ldots (changed to +% |\reserved@b|.) +% \changes{v0.2y}{1994/02/07} +% {Add extra ,s so `two' is not matched with `twocolumn'} +% \changes{v1.1i}{2011/08/19} +% {Re-jig definition after more stringent \cs{in@} test.} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/01/01}% +%<latexrelease> {\@if@pti@ns}{Spaces in option clash check}% +%<*2ekernel|latexrelease> +\def\@if@pti@ns#1#2{% + \let\reserved@a\@firstoftwo +% \end{macrocode} +% \changes{v1.2a}{2016/10/02} +% {Ignore spaces while checking for option clash} +% \begin{macrocode} + \edef\reserved@b{\zap@space#2 \@empty}% + \@for\reserved@b:=\reserved@b\do{% + \ifx\reserved@b\@empty + \else + \expandafter\in@\expandafter{\expandafter,\reserved@b,}{,#1,}% + \ifin@ + \else + \let\reserved@a\@secondoftwo + \fi + \fi + }% + \reserved@a} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@if@pti@ns}{Spaces in option clash check}% +%<latexrelease>\def\@if@pti@ns#1#2{% +%<latexrelease> \let\reserved@a\@firstoftwo +%<latexrelease> \@for\reserved@b:=#2\do{% +%<latexrelease> \ifx\reserved@b\@empty +%<latexrelease> \else +%<latexrelease> \expandafter\in@\expandafter +%<latexrelease> {\expandafter,\reserved@b,}{,#1,}% +%<latexrelease> \ifin@ +%<latexrelease> \else +%<latexrelease> \let\reserved@a\@secondoftwo +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> }% +%<latexrelease> \reserved@a} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\@if@pti@ns +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ProvidesPackage} +% Checks that the current filename is correct, and defines +% |\ver@filename|. +% \changes{v0.3c}{1994/03/12} +% {Add \cs{wlog}} +% \changes{v0.3c}{1994/03/12} +% {use \cs{@gtempa}} +% \begin{macrocode} +\def\ProvidesPackage#1{% + \xdef\@gtempa{#1}% + \ifx\@gtempa\@currname\else + \@latex@warning@no@line{You have requested + \@cls@pkg\space`\@currname',\MessageBreak + but the \@cls@pkg\space provides `#1'}% + \fi + \@ifnextchar[\@pr@videpackage{\@pr@videpackage[]}}%] +\@onlypreamble\ProvidesPackage +% \end{macrocode} +% +% \begin{macrocode} +\def\@pr@videpackage[#1]{% + \expandafter\xdef\csname ver@\@currname.\@currext\endcsname{#1}% + \ifx\@currext\@clsextension + \typeout{Document Class: \@gtempa\space#1}% + \else + \wlog{Package: \@gtempa\space#1}% + \fi} +\@onlypreamble\@pr@videpackage +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ProvidesClass} +% Like |\ProvidesPackage|, but for classes. +% \begin{macrocode} +\let\ProvidesClass\ProvidesPackage +\@onlypreamble\ProvidesClass +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ProvidesFile} +% Like |\ProvidesPackage|, but for arbitrary files. Do not apply +% |\@onlypreamble| to these, as we may want to label files input +% during the document. +% \changes{v0.2l}{1993/12/07} +% {Macro added} +% \changes{v0.3c}{1994/03/12} +% {Add \cs{wlog}} +% \changes{v0.3g}{1994/04/11} +% {Protect against weird catcodes.} +% \begin{macro}{\@providesfile} +% \changes{v1.0r}{1995/10/17} +% {Delay definition of \cs{ProvidesFile} till ltfinal} +% \changes{v1.1a}{1998/03/21} +% {Allow \&. Internal/2702} +% \changes{v1.1d}{2001/05/25}{Explicitly set catcode of +% \cs{endlinechar} to 10 (pr/3334)} +% \changes{v1.1e}{2001/06/04}{But only if it is a char (pr/3334)} +% \changes{v1.1f}{2001/08/26}{Readded setting of space char (pr/3353)} +% \begin{macrocode} +\def\ProvidesFile#1{% + \begingroup + \catcode`\ 10 % + \ifnum \endlinechar<256 % + \ifnum \endlinechar>\m@ne + \catcode\endlinechar 10 % + \fi + \fi + \@makeother\/% + \@makeother\&% +% \end{macrocode} +% \changes{v1.1g}{2004/01/28}{Use kernel version of +% \cs{@ifnextchar} (pr/3501)} +% \begin{macrocode} + \kernel@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}} +% \end{macrocode} +% +% During initex a special version of |\@providesfile| is used. +% The real definition is installed right at the end, in |ltfinal.dtx|. +%\begin{verbatim} +%\def\@providesfile#1[#2]{% +% \wlog{File: #1 #2}% +% \expandafter\xdef\csname ver@#1\endcsname{#2}% +% \endgroup} +%\end{verbatim} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\PassOptionsToPackage} +% \begin{macro}{\PassOptionsToClass} +% If the package has been loaded, we check that it was first loaded with +% the options. Otherwise we add the option list to that of the package. +% \begin{macrocode} +\def\@pass@ptions#1#2#3{% + \expandafter\xdef\csname opt@#3.#1\endcsname{% + \@ifundefined{opt@#3.#1}\@empty + {\csname opt@#3.#1\endcsname,}% + \zap@space#2 \@empty}} +\@onlypreamble\@pass@ptions +% \end{macrocode} +% +% \begin{macrocode} +\def\PassOptionsToPackage{\@pass@ptions\@pkgextension} +\def\PassOptionsToClass{\@pass@ptions\@clsextension} +\@onlypreamble\PassOptionsToPackage +\@onlypreamble\PassOptionsToClass +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\DeclareOption} +% \begin{macro}{\DeclareOption*} +% Adds an option as a |\ds@| command, or the default |\default@ds| +% command. +% \changes{v0.2c}{1993/11/17} +% {Error checking added} +% \changes{v1.0m}{1995/04/21} +% {Made long /1498} +% \changes{v1.0n}{1995/05/12} +% {Use \cs{toks@} to remove need to double hash /1557} +% \begin{macrocode} +\def\DeclareOption{% + \let\@fileswith@pti@ns\@badrequireerror + \@ifstar\@defdefault@ds\@declareoption} +\long\def\@declareoption#1#2{% + \xdef\@declaredoptions{\@declaredoptions,#1}% + \toks@{#2}% + \expandafter\edef\csname ds@#1\endcsname{\the\toks@}} +\long\def\@defdefault@ds#1{% + \toks@{#1}% + \edef\default@ds{\the\toks@}} +\@onlypreamble\DeclareOption +\@onlypreamble\@declareoption +\@onlypreamble\@defdefault@ds +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\OptionNotUsed} +% If we are in a class file, add |\CurrentOption| to the list of +% unused options. Otherwise, in a package file do nothing. +% \begin{macrocode} +\def\OptionNotUsed{% + \ifx\@currext\@clsextension + \xdef\@unusedoptionlist{% + \ifx\@unusedoptionlist\@empty\else\@unusedoptionlist,\fi + \CurrentOption}% + \fi} +\@onlypreamble\OptionNotUsed +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\default@ds} +% The default default option code. +% Set by |\@onefilewithoptions| to either |\OptionNotUsed| for +% classes, or |\@unknownoptionerror| for packages. This may be reset +% in either case with |\DeclareOption*|. +% \begin{macrocode} +% \let\default@ds\OptionNotUsed +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ProcessOptions} +% \begin{macro}{\ProcessOptions*} +% |\ProcessOptions| calls |\ds@option| for each known package option, +% then calls |\default@ds| for each option on the local options list. +% Finally resets all the declared options to |\relax|. The empty option +% does nothing, this has to be reset on the off chance it's set to +% |\relax| if an empty element gets into the |\@declaredoptions| list. +% +% The star form is similar but executes options given in the order +% specified in the document, not the order they are declared in the +% file. In the case of packages, global options are executed before +% local ones. +% \changes{v0.2a}{1993/11/14} +% {Stop adding the global option list inside class files.} +% \changes{v0.2a}{1993/11/14} +% {Optimise `empty option' code.} +% \changes{v0.2b}{1993/11/15} +% {Star form added.} +% \changes{v0.2c}{1993/11/17} +% {restoring \cs{@fileswith@pti@ns} added.} +% \begin{macrocode} +\def\ProcessOptions{% + \let\ds@\@empty + \edef\@curroptions{\@ptionlist{\@currname.\@currext}}% + \@ifstar\@xprocess@ptions\@process@ptions} +\@onlypreamble\ProcessOptions +% \end{macrocode} +% +% \changes{v0.2y}{1994/02/07} +% {Add extra ,s so `two' is not matched with `twocolumn'} +% \begin{macrocode} +\def\@process@ptions{% + \@for\CurrentOption:=\@declaredoptions\do{% + \ifx\CurrentOption\@empty\else + \@expandtwoargs\in@{,\CurrentOption,}{% + ,\ifx\@currext\@clsextension\else\@classoptionslist,\fi + \@curroptions,}% + \ifin@ + \@use@ption + \expandafter\let\csname ds@\CurrentOption\endcsname\@empty + \fi + \fi}% + \@process@pti@ns} +\@onlypreamble\@process@ptions +% \end{macrocode} +% +% \changes{v0.2y}{1994/02/07} +% {Add extra ,s so `two' is not matched with `twocolumn'} +% \begin{macrocode} +\def\@xprocess@ptions{% + \ifx\@currext\@clsextension\else + \@for\CurrentOption:=\@classoptionslist\do{% + \ifx\CurrentOption\@empty\else + \@expandtwoargs\in@{,\CurrentOption,}{,\@declaredoptions,}% + \ifin@ + \@use@ption + \expandafter\let\csname ds@\CurrentOption\endcsname\@empty + \fi + \fi}% + \fi + \@process@pti@ns} +\@onlypreamble\@xprocess@ptions +% \end{macrocode} +% +% The common part of |\ProcessOptions| and |\ProcessOptions*|. +% \begin{macrocode} +\def\@process@pti@ns{% + \@for\CurrentOption:=\@curroptions\do{% + \@ifundefined{ds@\CurrentOption}% + {\@use@ption + \default@ds}% +% \end{macrocode} +% There should not be any non-empty definition of |\CurrentOption| at +% this point, as all the declared options were executed earlier. This is +% for compatibility with 2.09 styles which use |\def\ds@|\ldots\ +% directly, and so have options which do not appear in +% |\@declaredoptions|. +% \begin{macrocode} + \@use@ption}% +% \end{macrocode} +% Clear all the definitions for option code. First set all the declared +% options to |\relax|, then reset the `default' and `empty' options. and +% the lst of declared options. +% \begin{macrocode} + \@for\CurrentOption:=\@declaredoptions\do{% + \expandafter\let\csname ds@\CurrentOption\endcsname\relax}% +% \end{macrocode} +% \changes{v1.0r}{1995/10/17} +% {Reset \cs{CurrentOption} for graphics/1873} +% \begin{macrocode} + \let\CurrentOption\@empty + \let\@fileswith@pti@ns\@@fileswith@pti@ns + \AtEndOfPackage{\let\@unprocessedoptions\relax}} +\@onlypreamble\@process@pti@ns +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@options} +% |\@options| is a synonym for |\ProcessOptions*| for upward +% compatibility with \LaTeX2.09 style files. +% \begin{macrocode} +\def\@options{\ProcessOptions*} +\@onlypreamble\@options +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@use@ption} +% Execute the code for the current option. +% \changes{v0.2g}{1993/11/23} +% {Name changed from \cs{@executeoption}} +% \changes{v1.0e}{1994/05/17} +% {Execute option after removing from list, not before} +% \begin{macrocode} +\def\@use@ption{% + \@expandtwoargs\@removeelement\CurrentOption + \@unusedoptionlist\@unusedoptionlist + \csname ds@\CurrentOption\endcsname} +\@onlypreamble\@use@ption +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ExecuteOptions} +% |\ExecuteOptions{|\meta{option-list}|}| executes the code declared +% for each option. +% \changes{v0.2d}{1993/11/18} +% {Use \cs{CurrentOption} not \cs{reserved@a}} +% \changes{v0.2k}{1993/12/06} +% {Preserve \cs{CurrentOption}.} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/01/01}% +%<latexrelease> {\ExecuteOptions}{Spaces in \ExecuteOptions}% +%<*2ekernel|latexrelease> +\def\ExecuteOptions#1{% +% \end{macrocode} +% \changes{v1.2a}{2016/10/02} +% {Ignore spaces in argument} +% Use |\@fortmp| here as it is anyway cleared during |\@for| loop +% so does not change any existing names. +% \begin{macrocode} + \edef\@fortmp{\zap@space#1 \@empty}% + \def\reserved@a##1\@nil{% + \@for\CurrentOption:=\@fortmp\do + {\csname ds@\CurrentOption\endcsname}% + \edef\CurrentOption{##1}}% + \expandafter\reserved@a\CurrentOption\@nil} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\ExecuteOptions}{Spaces in \ExecuteOptions}% +%<latexrelease>\def\ExecuteOptions#1{% +%<latexrelease> \def\reserved@a##1\@nil{% +%<latexrelease> \@for\CurrentOption:=#1\do +%<latexrelease> {\csname ds@\CurrentOption\endcsname}% +%<latexrelease> \edef\CurrentOption{##1}}% +%<latexrelease> \expandafter\reserved@a\CurrentOption\@nil} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\ExecuteOptions +% \end{macrocode} +% \end{macro} +% +% The top-level commands, which just set some parameters then call +% the internal command, |\@fileswithoptions|. +% \begin{macro}{\documentclass} +% \changes{v1.0q}{1995/06/19} +% {Dont redefine \cs{usepackage} in compat mode for /1634} +% The main new-style class declaration. +% \begin{macrocode} +\def\documentclass{% + \let\documentclass\@twoclasseserror + \if@compatibility\else\let\usepackage\RequirePackage\fi + \@fileswithoptions\@clsextension} +\@onlypreamble\documentclass +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\documentstyle} +% 2.09 style class `style' declaration. +% \changes{v0.2a}{1993/11/14} +% {Added \cs{RequirePackage} \cs{@unusedoptionlist} stuff.} +% \changes{v0.2b}{1993/11/15} +% {Modified to match \cs{ProcessOption*}} +% \changes{v0.2d}{1993/11/18} +% {Modified \cs{RequirePackage} stuff.} +% \changes{v0.2n}{1993/12/09} +% {input 209 compatibility file.} +% \changes{v0.2o}{1993/12/13} +% {compatibility file now latex209.sty.} +% \changes{v0.2q}{1993/12/17} +% {Match Alan's new code.} +% \changes{v0.2u}{1994/01/21} +% {compatibility file now latex209.def.} +% \begin{macrocode} +\def\documentstyle{% + \makeatletter\input{latex209.def}\makeatother + \documentclass} +\@onlypreamble\documentstyle +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\RequirePackage} +% Load package if not already loaded. +% \begin{macrocode} +\def\RequirePackage{% + \@fileswithoptions\@pkgextension} +\@onlypreamble\RequirePackage +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LoadClass} +% Load class. +% \begin{macrocode} +\def\LoadClass{% + \ifx\@currext\@pkgextension + \@latex@error + {\noexpand\LoadClass in package file}% + {You may only use \noexpand\LoadClass in a class file.}% + \fi + \@fileswithoptions\@clsextension} +\@onlypreamble\LoadClass +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@loadwithoptions} +% \changes{v1.0t}{1995/11/14}{macro added} +% Pass the current option list on to a class or package. +% |#1| is |\@|\emph{cls-or-pkg}|extension|, +% |#2| is |\RequirePackage| or |\LoadClass|, +% |#3| is the class or package to be loaded. +% \begin{macrocode} +\def\@loadwithoptions#1#2#3{% + \expandafter\let\csname opt@#3.#1\expandafter\endcsname + \csname opt@\@currname.\@currext\endcsname + #2{#3}} +\@onlypreamble\@loadwithoptions +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LoadClassWithOptions} +% \changes{v1.0t}{1995/11/14}{macro added} +% Load class `|#1|' with the current option list. +% \begin{macrocode} +\def\LoadClassWithOptions{% + \@loadwithoptions\@clsextension\LoadClass} +\@onlypreamble\LoadClassWithOptions +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\RequirePackageWithOptions} +% \changes{v1.0t}{1995/11/14}{macro added} +% \changes{v1.0v}{1996/10/04}{Reset \cs{@unprocessedoptions} for /2269} +% Load package `|#1|' with the current option list. +% \begin{macrocode} +\def\RequirePackageWithOptions{% + \AtEndOfPackage{\let\@unprocessedoptions\relax}% + \@loadwithoptions\@pkgextension\RequirePackage} +\@onlypreamble\RequirePackageWithOptions +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\usepackage} +% To begin with, |\usepackage| produces an error. This is reset by +% |\documentclass|. +% \changes{v0.2o}{1993/12/13} +% {Fixed error handling} +% \changes{v1.0h}{1994/05/23}{Remove argument if possible} +% \begin{macrocode} +\def\usepackage#1#{% + \@latex@error + {\noexpand \usepackage before \string\documentclass}% + {\noexpand \usepackage may only appear in the document + preamble, i.e.,\MessageBreak + between \noexpand\documentclass and + \string\begin{document}.}% + \@gobble} +\@onlypreamble\usepackage +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NeedsTeXFormat} +% Check that the document is running on the correct system. +% \changes{v0.2a}{1993/11/14} +% {made more robust for alternative syntax for other formats.} +% \changes{v0.2c}{1993/11/17} +% {Name changed from \cs{NeedsFormat}} +% \changes{v0.2d}{1993/11/18} +% {\cs{fmtname} \cs{fmtversion} not \cs{@}\ldots} +% \begin{macrocode} +\def\NeedsTeXFormat#1{% + \def\reserved@a{#1}% + \ifx\reserved@a\fmtname + \expandafter\@needsformat + \else + \@latex@error{This file needs format `\reserved@a'% + \MessageBreak but this is `\fmtname'}{% + The current input file will not be processed + further,\MessageBreak + because it was written for some other flavor of + TeX.\MessageBreak\@ehd}% +% \end{macrocode} +% If the file is not meant to be processed by \LaTeXe{} we stop +% inputting it, but we do not end the run. We just end inputting +% the current file. +% \changes{v1.0h}{1994/05/23} +% {Don't stop completely when format is wrong} +% \begin{macrocode} + \endinput \fi} +\@onlypreamble\NeedsTeXFormat +% \end{macrocode} +% +% \begin{macrocode} +\def\@needsformat{% + \@ifnextchar[%] + \@needsf@rmat + {}} +\@onlypreamble\@needsformat +% \end{macrocode} +% +% \changes{v1.0b}{1994/05/04} +% {Changed wording of the warning} +% \begin{macrocode} +\def\@needsf@rmat[#1]{% + \@ifl@t@r\fmtversion{#1}{}% + {\@latex@warning@no@line + {You have requested release `#1' of LaTeX,\MessageBreak + but only release `\fmtversion' is available}}} +\@onlypreamble\@needsf@rmat +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\zap@space} +% |\zap@space foo|\meta{space}|\@empty| removes all spaces from |foo| +% that are not protected by |{ }| groups. +% \begin{macrocode} +\def\zap@space#1 #2{% + #1% + \ifx#2\@empty\else\expandafter\zap@space\fi + #2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fileswithoptions} +% The common part of |\documentclass| and |\usepackage|. +% \begin{macrocode} +\def\@fileswithoptions#1{% + \@ifnextchar[%] + {\@fileswith@ptions#1}% + {\@fileswith@ptions#1[]}} +\@onlypreamble\@fileswithoptions +% \end{macrocode} +% +% \changes{v0.2f}{1993/11/22} +% {Made the default [] not [\cs{@unknownversion}]} +% \changes{v1.1h}{2007/08/05} +% {Prevent loss of brackets PR/3965} +% \begin{macrocode} +\def\@fileswith@ptions#1[#2]#3{% + \@ifnextchar[%] + {\@fileswith@pti@ns#1[{#2}]#3}% + {\@fileswith@pti@ns#1[{#2}]#3[]}} +\@onlypreamble\@fileswith@ptions +% \end{macrocode} +% Then we do some work. +% +% First of all, we define the global variables. +% Then we look to see if the file has already been loaded. +% If it has, we check that it was first loaded with at least the current +% options. +% If it has not, we add the current options to the package options, +% set the default version to be |0000/00/00|, and load the file if we +% can find it. +% Then we check the version number. +% +% Finally, we restore the old file name, reset the default option, +% and we set the catcode of |@|. +% +% For classes, we can immediately process the file. For other types, +% |#2| could be a comma separated list, so loop through, processing +% each one separately. +% \changes{v0.2q}{1993/12/17} +% {Add \cs{@compatibility} hook} +% \changes{v0.2s}{1994/01/17} +% {Modify to reduce parameter stack usage} +% \changes{v0.2y}{1994/02/07} +% {Run \cs{@compatibility} on the first class to start +% (not the first to finish) } +% \changes{v0.2z}{1994/02/10} +% {Renamed \cs{@compatibility} to \cs{@documentclasshook}. +% ASAJ.} +% \changes{v1.1h}{2007/08/05} +% {Prevent loss of brackets PR/3965} +% \changes{v2.1b}{2016/11/09} +% {Improve \cs{ifx} tests PR/4497} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/01/01}% +%<latexrelease> {\@fileswith@pti@ns}{ifx tests in \@fileswith@pti@ns}% +%<*2ekernel|latexrelease> +\def\@fileswith@pti@ns#1[#2]#3[#4]{% + \ifx#1\@clsextension + \ifx\@classoptionslist\relax + \xdef\@classoptionslist{\zap@space#2 \@empty}% + \def\reserved@a{% + \@onefilewithoptions#3[{#2}][{#4}]#1% + \@documentclasshook}% + \else + \def\reserved@a{% + \@onefilewithoptions#3[{#2}][{#4}]#1}% + \fi + \else +% \end{macrocode} +% build up a list of calls to |\@onefilewithoptions| +% (one for each package) without thrashing the parameter stack. +% \begin{macrocode} + \def\reserved@b##1,{% +% \end{macrocode} +% If |#1| is |\@nnil| we have reached the end of the list +% (older version used |\@nil| here but |\@nil| is undefined so |\ifx| +% equal to all undefined commands) +% \begin{macrocode} + \ifx\@nnil##1\relax\else +% \end{macrocode} +% If |\ifx\@nnil##1\n@nil| is true then |#1| is (presumably) empty +% (Older code used |\relax| which is slighly easier to get into |#1| +% by mistake, which would spoil this test.) +% \begin{macrocode} + \ifx\@nnil##1\@nnil\else +% \end{macrocode} +% +% \begin{macrocode} + \noexpand\@onefilewithoptions##1[{#2}][{#4}]% + \noexpand\@pkgextension + \fi + \expandafter\reserved@b + \fi}% + \edef\reserved@a{\zap@space#3 \@empty}% + \edef\reserved@a{\expandafter\reserved@b\reserved@a,\@nnil,}% + \fi + \reserved@a} +%</2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@fileswith@pti@ns}{ifx tests in \@fileswith@pti@ns}% +%<latexrelease>\def\@fileswith@pti@ns#1[#2]#3[#4]{% +%<latexrelease> \ifx#1\@clsextension +%<latexrelease> \ifx\@classoptionslist\relax +%<latexrelease> \xdef\@classoptionslist{\zap@space#2 \@empty}% +%<latexrelease> \def\reserved@a{% +%<latexrelease> \@onefilewithoptions#3[{#2}][{#4}]#1% +%<latexrelease> \@documentclasshook}% +%<latexrelease> \else +%<latexrelease> \def\reserved@a{% +%<latexrelease> \@onefilewithoptions#3[{#2}][{#4}]#1}% +%<latexrelease> \fi +%<latexrelease> \else +%<latexrelease> \def\reserved@b##1,{% +%<latexrelease> \ifx\@nil##1\relax\else +%<latexrelease> \ifx\relax##1\relax\else +%<latexrelease> \noexpand\@onefilewithoptions##1[{#2}][{#4}]% +%<latexrelease> \noexpand\@pkgextension +%<latexrelease> \fi +%<latexrelease> \expandafter\reserved@b +%<latexrelease> \fi}% +%<latexrelease> \edef\reserved@a{\zap@space#3 \@empty}% +%<latexrelease> \edef\reserved@a{% +%<latexrelease> \expandafter\reserved@b\reserved@a,\@nil,}% +%<latexrelease> \fi +%<latexrelease> \reserved@a} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\@fileswith@pti@ns +% \end{macrocode} +% +% Have the main argument as |#1|, so we only need one |\expandafter| +% above. +% \changes{v0.2a}{1993/11/14} +% {Moved resetting of \cs{default@ds}, \cs{ds@} and +% \cs{@declaredoptions} here, from the end of +% \cs{ProcessOptions}.} +% \changes{v0.2f}{1993/11/22} +% {Made the initial version [] not [\cs{@unknownversion}]} +% \changes{v0.2m}{1993/12/07} +% {Reset \cs{CurrentOption}} +% \begin{macrocode} +\def\@onefilewithoptions#1[#2][#3]#4{% + \@pushfilename + \xdef\@currname{#1}% + \global\let\@currext#4% + \expandafter\let\csname\@currname.\@currext-h@@k\endcsname\@empty + \let\CurrentOption\@empty + \@reset@ptions + \makeatletter +% \end{macrocode} +% Grab everything in a macro, so the parameter stack is popped before +% any processing begins. +% \changes{v0.2s}{1994/01/17} +% {Modify to reduce parameter stack usage} +% \changes{v1.1b}{1998/05/07} +% {Modify help message for latex/2805} +% \begin{macrocode} + \def\reserved@a{% + \@ifl@aded\@currext{#1}% + {\@if@ptions\@currext{#1}{#2}{}% + {\@latex@error + {Option clash for \@cls@pkg\space #1}% + {The package #1 has already been loaded + with options:\MessageBreak + \space\space[\@ptionlist{#1.\@currext}]\MessageBreak + There has now been an attempt to load it + with options\MessageBreak + \space\space[#2]\MessageBreak + Adding the global options:\MessageBreak + \space\space + \@ptionlist{#1.\@currext},#2\MessageBreak + to your \noexpand\documentclass declaration may fix this.% + \MessageBreak + Try typing \space <return> \space to proceed.}}}% + {\@pass@ptions\@currext{#2}{#1}% +% \end{macrocode} +% \changes{v0.3c}{1994/03/12} +% {Do not use \cs{@pr@videpackage} to avoid typeout} +% \begin{macrocode} + \global\expandafter + \let\csname ver@\@currname.\@currext\endcsname\@empty + \InputIfFileExists + {\@currname.\@currext}% + {}% + {\@missingfileerror\@currname\@currext}% +% \end{macrocode} +% |\@unprocessedoptions| will generate an error for each specified +% option in a package unless a |\ProcessOptions| has appeared in the +% package file. +% \changes{v0.2v}{1994/01/29} +% {All options raise error if no \cs{ProcessOptions} appears} +% \changes{v0.2x}{1994/02/02} +% {Only run the hook and options check if the file was loaded.} +% \begin{macrocode} + \let\@unprocessedoptions\@@unprocessedoptions + \csname\@currname.\@currext-h@@k\endcsname + \expandafter\let\csname\@currname.\@currext-h@@k\endcsname + \@undefined + \@unprocessedoptions}% +% \end{macrocode} +% +% \begin{macrocode} + \@ifl@ter\@currext{#1}{#3}{}% + {\@latex@warning@no@line + {You have requested,\on@line, + version\MessageBreak + `#3' of \@cls@pkg\space #1,\MessageBreak + but only version\MessageBreak + `\csname ver@#1.\@currext\endcsname'\MessageBreak + is available}}% +% \end{macrocode} +% \changes{v0.2c}{1993/11/17} +% {Added trap for two \cs{LoadClass} commands.} +% \begin{macrocode} + \ifx\@currext\@clsextension\let\LoadClass\@twoloadclasserror\fi + \@popfilename + \@reset@ptions}% + \reserved@a} +\@onlypreamble\@onefilewithoptions +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@fileswith@pti@ns} +% Save the definition (for error checking). +% \changes{v0.2c}{1993/11/17} +% {Macro added} +% \begin{macrocode} +\let\@@fileswith@pti@ns\@fileswith@pti@ns +\@onlypreamble\@@fileswith@pti@ns +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@reset@ptions} +% Reset the default option, and clear lists of declared options. +% \changes{v0.2a}{1993/11/14}{macro added} +% \begin{macrocode} +\def\@reset@ptions{% + \global\ifx\@currext\@clsextension + \let\default@ds\OptionNotUsed + \else + \let\default@ds\@unknownoptionerror + \fi + \global\let\ds@\@empty + \global\let\@declaredoptions\@empty} +\@onlypreamble\@reset@ptions +% \end{macrocode} +% \end{macro} +% +% \subsection{Hooks} +% +% Allow code do be saved to be executed at specific later times. +% +% Save things in macros, I considered using toks registers, (and +% |\addto@hook| from the NFSS code, that would require stacking the +% contents in the case of required packages, so just generate a new +% macro for each package. +% \begin{macro}{\@begindocumenthook} +% \changes{v1.0s}{1995/10/20} +% {Make setting conditional, for autoload version} +% \begin{macro}{\@enddocumenthook} +% Stuff to appear at the beginning or end of the document. +% \begin{macrocode} +\ifx\@begindocumenthook\@undefined + \let\@begindocumenthook\@empty +\fi +\let\@enddocumenthook\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\g@addto@macro} +% Globally add to the end of a macro. +% \changes{v0.2a}{1993/11/14}{Made global} +% \changes{v0.2w}{1994/01/31} +% {Use toks register to avoid `hash' problems} +% \changes{v1.0o}{1995/05/17} +% {Make long for latex/1522} +% \changes{v1.0w}{1996/12/17} +% {Use \cs{begingroup} to save making a mathord} +% \changes{v1.0x}{1997/02/05} +% {missing percent /2402} +% \begin{macrocode} +\long\def\g@addto@macro#1#2{% + \begingroup + \toks@\expandafter{#1#2}% + \xdef#1{\the\toks@}% + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AtEndOfPackage} +% \begin{macro}{\AtEndOfClass} +% \begin{macro}{\AtBeginDocument} +% \begin{macro}{\AtEndDocument} +% The access functions. +% \changes{v0.2a}{1993/11/14} +% {Included extension in the generated macro name for package +% and class hooks.} +% \begin{macrocode} +\def\AtEndOfPackage{% + \expandafter\g@addto@macro\csname\@currname.\@currext-h@@k\endcsname} +\let\AtEndOfClass\AtEndOfPackage +\@onlypreamble\AtEndOfPackage +\@onlypreamble\AtEndOfClass +% \end{macrocode} +% +% \begin{macrocode} +\def\AtBeginDocument{\g@addto@macro\@begindocumenthook} +\def\AtEndDocument{\g@addto@macro\@enddocumenthook} +\@onlypreamble\AtBeginDocument +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@cls@pkg} +% The current file type. +% \changes{v0.2i}{1993/12/03} +% {Name changed to avoid clash with output routine.} +% \begin{macrocode} +\def\@cls@pkg{% + \ifx\@currext\@clsextension + document class% + \else + package% + \fi} +\@onlypreamble\@cls@pkg +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@unknownoptionerror} +% Bad option. +% \begin{macrocode} +\def\@unknownoptionerror{% + \@latex@error + {Unknown option `\CurrentOption' for \@cls@pkg\space`\@currname'}% + {The option `\CurrentOption' was not declared in + \@cls@pkg\space`\@currname', perhaps you\MessageBreak + misspelled its name. + Try typing \space <return> + \space to proceed.}} +\@onlypreamble\@unknownoptionerror +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@unprocessedoptions} +% Declare an error for each option, unless a |\ProcessOptions| occurred. +% \changes{v0.2v}{1994/01/29} +% {Macro added.} +% \changes{v1.0t}{1995/11/14}{Allow empty option} +% \begin{macrocode} +\def\@@unprocessedoptions{% + \ifx\@currext\@pkgextension + \edef\@curroptions{\@ptionlist{\@currname.\@currext}}% + \@for\CurrentOption:=\@curroptions\do{% + \ifx\CurrentOption\@empty\else\@unknownoptionerror\fi}% + \fi} +\@onlypreamble\@unprocessedoptions +\@onlypreamble\@@unprocessedoptions +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badrequireerror} +% |\RequirePackage| or |\LoadClass| occurs in the options section. +% \changes{v0.2c}{1993/11/17} +% {Macro added} +% \begin{macrocode} +\def\@badrequireerror#1[#2]#3[#4]{% + \@latex@error + {\noexpand\RequirePackage or \noexpand\LoadClass + in Options Section}% + {The \@cls@pkg\space `\@currname' is defective.\MessageBreak + It attempts to load `#3' in the options section, i.e.,\MessageBreak + between \noexpand\DeclareOption and \string\ProcessOptions.}} +\@onlypreamble\@badrequireerror +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@twoloadclasserror} +% Two |\LoadClass| in a class. +% \changes{v0.2c}{1993/11/17} +% {Macro added} +% \begin{macrocode} +\def\@twoloadclasserror{% + \@latex@error + {Two \noexpand\LoadClass commands}% + {You may only use one \noexpand\LoadClass in a class file}} +\@onlypreamble\@twoloadclasserror +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@twoclasseserror} +% Two |\documentclass| or |\documentstyle|. +% \changes{v0.2h}{1993/11/28} +% {Macro added} +% \begin{macrocode} +\def\@twoclasseserror#1#{% + \@latex@error + {Two \noexpand\documentclass or \noexpand\documentstyle commands}% + {The document may only declare one class.}\@gobble} +\@onlypreamble\@twoclasseserror +% \end{macrocode} +% \end{macro} +% +% \subsection{Providing shipment} +% +% \begin{macro}{\two@digits} +% Prefix a number less than 10 with `0'. +% \begin{macrocode} +\def\two@digits#1{\ifnum#1<10 0\fi\number#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\filecontents} +% \begin{macro}{\endfilecontents} +% This environment implements inline files. +% The star-form does not write extra comments into the file. +% +% \changes{v0.2h}{1993/11/28} +% {Don't globally allocate a write stream (always use 15)} +% \changes{v0.2r}{1993/12/19}{Different message when ignoring a file} +% \changes{v0.3g}{1994/04/11} +% {Add star form, +% dont write \cs{endinput} at the end of the file.} +% \changes{v1.0c}{1994/05/11} +% {Add checks for form feed and tab} +% \changes{v1.0m}{1995/04/21} +% {Close input check stream: latex/1487} +% \changes{v1.0p}{1995/05/25}{Delete \cs{filec@ntents} after preamble} +% \begin{macrocode} +% \changes{v1.3a}{2019/07/01}{Support UTF8 and spaces in +% filecontents environment file name} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2019/10/01}% +%<latexrelease> {\filec@ntents}{Spaces in file names}% +\begingroup% +\@tempcnta=1 +\loop + \catcode\@tempcnta=12 % + \advance\@tempcnta\@ne % +\ifnum\@tempcnta<32 % +\repeat % +\catcode`\*=11 % +\catcode`\^^M\active% +\catcode`\^^L\active\let^^L\relax% +\catcode`\^^I\active% +% \end{macrocode} +% +% \begin{macrocode} +\gdef\filecontents{\@tempswatrue\filec@ntents}% +\gdef\filecontents*{\@tempswafalse\filec@ntents}% +% \end{macrocode} +% +% \begin{macrocode} +\gdef\filec@ntents#1{% + \set@curr@file{#1}% + \edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}% + \openin\@inputcheck\q@curr@file \space % + \ifeof\@inputcheck% + \@latex@warning@no@line% + {Writing file `\@currdir\@curr@file'}% +% \end{macrocode} +% +% \changes{v1.0y}{1997/10/10} +% {\cs{reserved@c} not \cs{verbatim@out} to save a csname} +% \begin{macrocode} + \chardef\reserved@c15 % + \ch@ck7\reserved@c\write% + \immediate\openout\reserved@c\q@curr@file\relax% + \else% +% \end{macrocode} +% +% \changes{v1.0y}{1997/10/10} +% {Use \cs{@gobbletwo}} +% \begin{macrocode} + \closein\@inputcheck% + \@latex@warning@no@line% + {File `\@curr@file' already exists on the system.\MessageBreak% + Not generating it from this source}% + \let\write\@gobbletwo% + \let\closeout\@gobble% + \fi% + \if@tempswa% +% \end{macrocode} +% +% \changes{v1.0y}{1997/10/10} +% {\cs{@currenvir} in banner} +% \begin{macrocode} + \immediate\write\reserved@c{% + \@percentchar\@percentchar\space% + \expandafter\@gobble\string\LaTeX2e file `\@curr@file'^^J% + \@percentchar\@percentchar\space generated by the % + `\@currenvir' \expandafter\@gobblefour\string\newenvironment^^J% + \@percentchar\@percentchar\space from source `\jobname' on % + \number\year/\two@digits\month/\two@digits\day.^^J% + \@percentchar\@percentchar}% + \fi% + \let\do\@makeother\dospecials% +% \end{macrocode} +% If there are active characters in the upper half (e.g., from +% \texttt{inputenc} there would be confusion so we render everything +% harmless. +% \changes{v1.2f}{2018/03/27} +% {Use full file name for old release} +% \begin{macrocode} + \count@ 128\relax% + \loop% + \catcode\count@ 11\relax% + \advance\count@ \@ne% + \ifnum\count@<\@cclvi% + \repeat% +% \end{macrocode} +% +% \changes{v1.0y}{1997/10/10} +% {Check for text before or after \cs{end} environment. latex/2636} +% \begin{macrocode} + \edef\E{\@backslashchar end\string{\@currenvir\string}}% + \edef\reserved@b{% + \def\noexpand\reserved@b% + ####1\E####2\E####3\relax}% + \reserved@b{% + \ifx\relax##3\relax% +% \end{macrocode} +% There was no |\end{filecontents}| +% \begin{macrocode} + \immediate\write\reserved@c{##1}% + \else% +% \end{macrocode} +% There was a |\end{filecontents}|, so stop this time. +% \begin{macrocode} + \edef^^M{\noexpand\end{\@currenvir}}% + \ifx\relax##1\relax% + \else% +% \end{macrocode} +% Text before the |\end|, write it with a warning. +% \begin{macrocode} + \@latex@warning{Writing text `##1' before % + \string\end{\@currenvir}\MessageBreak as last line of \@curr@file}% + \immediate\write\reserved@c{##1}% + \fi% + \ifx\relax##2\relax% + \else% +% \end{macrocode} +% Text after the |\end|, ignore it with a warning. +% \begin{macrocode} + \@latex@warning{% + Ignoring text `##2' after \string\end{\@currenvir}}% + \fi% + \fi% + ^^M}% +% \end{macrocode} +% +% +% \changes{v1.2j}{2018/05/29}{use \cs{csname} not \cs{@undefined}} +% \begin{macrocode} + \catcode`\^^L\active% + \let\L\@undefined% + \def^^L{\expandafter\ifx\csname L\endcsname\relax\fi ^^J^^J}% + \catcode`\^^I\active% + \let\I\@undefined% + \def^^I{\expandafter\ifx\csname I\endcsname\relax\fi\space}% + \catcode`\^^M\active% + \edef^^M##1^^M{% + \noexpand\reserved@b##1\E\E\relax}}% +\endgroup% +% \end{macrocode} +% +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\filec@ntents}{Spaces in file names}% +%<latexrelease>\begingroup% +%<latexrelease>\@tempcnta=1 +%<latexrelease>\loop +%<latexrelease> \catcode\@tempcnta=12 % +%<latexrelease> \advance\@tempcnta\@ne % +%<latexrelease>\ifnum\@tempcnta<32 % +%<latexrelease>\repeat % +%<latexrelease>\catcode`\*=11 % +%<latexrelease>\catcode`\^^M\active% +%<latexrelease>\catcode`\^^L\active\let^^L\relax% +%<latexrelease>\catcode`\^^I\active% +%<latexrelease> +%<latexrelease>\gdef\filec@ntents#1{% +%<latexrelease> \openin\@inputcheck#1 % +%<latexrelease> \ifeof\@inputcheck% +%<latexrelease> \@latex@warning@no@line% +%<latexrelease> {Writing file `\@currdir#1'}% +%<latexrelease> \chardef\reserved@c15 % +%<latexrelease> \ch@ck7\reserved@c\write% +%<latexrelease> \immediate\openout\reserved@c#1\relax% +%<latexrelease> \else% +%<latexrelease> \closein\@inputcheck% +%<latexrelease> \@latex@warning@no@line% +%<latexrelease> {File `#1' already exists on the system.\MessageBreak% +%<latexrelease> Not generating it from this source}% +%<latexrelease> \let\write\@gobbletwo% +%<latexrelease> \let\closeout\@gobble% +%<latexrelease> \fi% +%<latexrelease> \if@tempswa% +%<latexrelease> \immediate\write\reserved@c{% +%<latexrelease> \@percentchar\@percentchar\space% +%<latexrelease> \expandafter\@gobble\string\LaTeX2e file `#1'^^J% +%<latexrelease> \@percentchar\@percentchar\space generated by the % +%<latexrelease> `\@currenvir' \expandafter\@gobblefour\string\newenvironment^^J% +%<latexrelease> \@percentchar\@percentchar\space from source `\jobname' on % +%<latexrelease> \number\year/\two@digits\month/\two@digits\day.^^J% +%<latexrelease> \@percentchar\@percentchar}% +%<latexrelease> \fi% +%<latexrelease> \let\do\@makeother\dospecials% +%<latexrelease> \count@ 128\relax% +%<latexrelease> \loop% +%<latexrelease> \catcode\count@ 11\relax% +%<latexrelease> \advance\count@ \@ne% +%<latexrelease> \ifnum\count@<\@cclvi% +%<latexrelease> \repeat% +%<latexrelease> \edef\E{\@backslashchar end\string{\@currenvir\string}}% +%<latexrelease> \edef\reserved@b{% +%<latexrelease> \def\noexpand\reserved@b% +%<latexrelease> ####1\E####2\E####3\relax}% +%<latexrelease> \reserved@b{% +%<latexrelease> \ifx\relax##3\relax% +%<latexrelease> \immediate\write\reserved@c{##1}% +%<latexrelease> \else% +%<latexrelease> \edef^^M{\noexpand\end{\@currenvir}}% +%<latexrelease> \ifx\relax##1\relax% +%<latexrelease> \else% +%<latexrelease> \@latex@warning{Writing text `##1' before % +%<latexrelease> \string\end{\@currenvir}\MessageBreak as last line of #1}% +%<latexrelease> \immediate\write\reserved@c{##1}% +%<latexrelease> \fi% +%<latexrelease> \ifx\relax##2\relax% +%<latexrelease> \else% +%<latexrelease> \@latex@warning{% +%<latexrelease> Ignoring text `##2' after \string\end{\@currenvir}}% +%<latexrelease> \fi% +%<latexrelease> \fi% +%<latexrelease> ^^M}% +%<latexrelease> +%<latexrelease> \catcode`\^^L\active% +%<latexrelease> \let\L\@undefined% +%<latexrelease> \def^^L{\expandafter\ifx\csname L\endcsname\relax\fi ^^J^^J}% +%<latexrelease> \catcode`\^^I\active% +%<latexrelease> \let\I\@undefined% +%<latexrelease> \def^^I{\expandafter\ifx\csname I\endcsname\relax\fi\space}% +%<latexrelease> \catcode`\^^M\active% +%<latexrelease> \edef^^M##1^^M{% +%<latexrelease> \noexpand\reserved@b##1\E\E\relax}}% +%<latexrelease>\endgroup% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% \begin{macrocode} +\begingroup +\catcode`|=\catcode`\% +\catcode`\%=12 +\catcode`\*=11 +\gdef\@percentchar{%} +\gdef\endfilecontents{| + \immediate\closeout\reserved@c + \def\T##1##2##3{| + \ifx##1\@undefined\else + \@latex@warning@no@line{##2 has been converted to Blank ##3e}| + \fi}| + \T\L{Form Feed}{Lin}| + \T\I{Tab}{Spac}| + \immediate\write\@unused{}} +\global\let\endfilecontents*\endfilecontents +\@onlypreamble\filecontents +\@onlypreamble\endfilecontents +\@onlypreamble\filecontents* +\@onlypreamble\endfilecontents* +\endgroup +\@onlypreamble\filec@ntents +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% +% \section{Package/class rollback mechanism} +% +% +% +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexreleasefirst> +% \end{macrocode} +% +% \changes{v1.2d}{2018/02/18}{Introduce rollback concept} +% +% \begin{macro}{\pkgcls@debug} +% For testing we have a few extra lines of code that by default do +% nothing but one can set |\pkgcls@debug| to |\typeout| to get +% extra info. Sometime in the future this will be dropped. +% \begin{macrocode} +%<*tracerollback> +%\let\pkgcls@debug\typeout +\let\pkgcls@debug\@gobble +%</tracerollback> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\requestedLaTeXdate} +% The macro (!) |\requestedLaTeXdate| holds the globally requested +% rollback date (via \texttt{latexrelease}) or zero if no such +% request was made. +% \begin{macrocode} +\def\requestedLaTeXdate{0} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pkgcls@targetdate} +% \begin{macro}{\pkgcls@targetlabel} +% \begin{macro}{\pkgcls@innerdate} +% +% If a rollback for a package or class is requested then +% |\pkgcls@targetdate| holds the requested date as a number +% YYYYMMDD (if there was one, otherwise the value of +% |\requestedLaTeXdate|) and |\pkgcls@targetlabel| will be +% empty. If there was a request for a named version then +% |\pkgcls@targetlabel| holds the verion name and +% |\pkgcls@targetdate| is set to \texttt{1}. +% +% |\pkgcls@targetdate=0| is used to indicate that there was no +% rollback request. +% While loading an old release |\pkgcls@targetdate| is also reset to +% zero so that |\DeclareRelease| declarations are bypassed. +% +% In contrast |\pkgcls@innerdate| will always hold the requested +% date (in a macro not a counter) if there was one, otherwise, +% e.g., if there was no request or a request to a version name it +% will contain \TeX{} largest legal number. While loading a file +% this can be used to provide conditionals that select code based +% on the request. +% +% +% \begin{macrocode} +\ifx\pkgcls@targetdate\@undefined + \newcount\pkgcls@targetdate +\fi +\let\pkgcls@targetlabel\@empty +\def\pkgcls@innerdate{\maxdimen} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} + +% \begin{macro}{\pkgcls@candidate} +% \begin{macro}{\pkgcls@releasedate} +% When looping through the |\DeclareRelease| declarations we +% record if the release is the best candidate we have seen so far. +% This is recorded in |\pkgcls@candidate| and we update it whenever +% we see a better one. +% +% In |\pkgcls@releasedate| we keep track of the release date of +% that candidate. +% \begin{macrocode} +\let\pkgcls@candidate\@empty +\let\pkgcls@releasedate\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\load@onefilewithoptions} +% \begin{macro}{\@onefilewithoptions} +% the best place to add the rollback code is at the point where +% |\@onefilewithoptions| is called to load a single class or +% package. +% +% To make things easy we save the old definition as +% |\load@onefilewithoptions| and then provide a new interface. +% +% Important: as this code is also unconditionally placed into +% latexrelease we can only do this name change once otherwise both +% macros will contain the same code. +% \begin{macrocode} +\ifx\load@onefilewithoptions\@undefined + \let\load@onefilewithoptions\@onefilewithoptions +% \end{macrocode} +% +% \begin{macrocode} + \def\@onefilewithoptions#1[#2][#3]#4{% +% \end{macrocode} +% First a bit of tracing normally disabled. +% \begin{macrocode} +%<*tracerollback> + \pkgcls@debug{--- File loaded request (\noexpand\usepackage or ...)}% + \pkgcls@debug{\@spaces 1: #1}% + \pkgcls@debug{\@spaces 2: #2}% + \pkgcls@debug{\@spaces 3: #3}% + \pkgcls@debug{\@spaces 4: #4}% +%</tracerollback> +% \end{macrocode} +% Two of the arguments are needed later on in error/warning +% messages so we save them. +% \begin{macrocode} + \def\pkgcls@name{#1}% % for info message + \def\pkgcls@arg {#3}% % for info message +% \end{macrocode} +% then we parse the final optional argument to determine if there +% is a specific rollback request for the current file. This will +% set |\pkgcls@targetdate|, |\pkgcls@targetlabel| and +% |\pkgcls@mindate|. +% \begin{macrocode} + \pkgcls@parse@date@arg{#3}% +% \end{macrocode} +% When determining the correct release to load we keep track of +% candiates in |\pkgcls@candidate| and initially we don't have any: +% \begin{macrocode} + \let\pkgcls@candidate\@empty +% \end{macrocode} +% If we had a rollback request then |#3| may contain data but not +% necessarily a ``minimal date'' so instead of passing it on we +% pass on the content of |\pkgcls@mindate|. We need to pass the +% value not the command, otherwise nested packages may pick up the +% wrong information. +% \changes{v1.2h}{2018-04-08}{Pass expanded date} +% \begin{macrocode} + \begingroup + \edef\reserved@a{% + \endgroup + \unexpanded{\load@onefilewithoptions#1[#2]}% + [\pkgcls@mindate]% + \unexpanded{#4}}% + \reserved@a + } +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\pkgcls@parse@date@arg} +% The |\pkgcls@parse@date@arg| command parses the second optional +% argument of |\usepackage|, |\RequirePackage| or |\documentclass| +% for a rollback request setting the values of |\pkgcls@targetdate| +% and |\pkgcls@targetlabel|. +% +% This optional argument has a dual purpose: If it just contains a +% date string then this means that the package should have at least +% that date (to ensure that a certain feature is actually available, +% or a certain bug has been fixed). When the package gets loaded the +% information in |\Provides...| will then be checked against this +% request. +% +% But if it starts with an equal sign followed by a date string or +% followed by a version name then this means that we should roll +% back to the state of the package at tht date or to the version +% with the requested name. +% +% If there was no optional argument or the optional argument +% does not start with ``\texttt{=}'' then the |\pkgcls@targetdate| +% is set to the date of the overall rollback request (via +% \texttt{latexrelease}) or if that was not given it is set to +% \texttt{0}. +% In either case |\pkgcls@targetlabel| will be made empty. +% +% If the argument doesn't start with ``\texttt{=}'' then it is +% supposed to be a ``minimal date'' and we therefore save the value +% in |\pkgcls@mindate|, otherwise this macro is made empty. +% +% So in summary we have: +% \begin{flushleft} +% \hspace*{-1in}\begin{tabular}{ccccc@{}} +% Input & & \cs{pkgcls@targetdate} +% & \cs{pkgcls@targetlabel} +% & \cs{pkgcls@mindate}\\[3pt] +% \meta{empty} & $\to$ & \meta{global-rollbackdate-as-number} +% & \meta{empty} & \meta{empty} +% \\ +% \meta{date} & $\to$ & \meta{global-rollbackdate-as-number} +% & \meta{empty} & \meta{date} +% \\ +% \texttt{=}\meta{date} & $\to$ & \meta{date-as-number} +% & \meta{empty} & \meta{empty} +% \\ +% \texttt{=}\meta{version}& $\to$ & \texttt{1} +% & \meta{version} & \meta{empty} +% \\ +% \meta{other} & $\to$ & \meta{global-rollbackdate-as-number} +% & \meta{empty} & \meta{other} +% \\ +% \end{tabular} +% \end{flushleft} +% where \meta{global-rollbackdate-as-number} is a date request given +% via \texttt{latexrelease} or if there wasn't one \texttt{0}. +% +% \begin{macrocode} +\def\pkgcls@parse@date@arg #1{% +% \end{macrocode} +% If the argument is empty we use the rollback date from +% \texttt{latexrelease} which has the value of zero if there was no +% rollback request. The label and the minimal date is made empty in that case. +% \begin{macrocode} + \ifx\@nil#1\@nil + \pkgcls@targetdate\requestedLaTeXdate\relax + \let\pkgcls@targetlabel\@empty + \let\pkgcls@mindate\@empty +% \end{macrocode} +% Otherwise we parse the argument further, checking for a \texttt{=} +% as the first character. We append a \texttt{=} at the end so that +% there is at least one such character in the argument. +% \begin{macrocode} + \else + \pkgcls@parse@date@arg@#1=\@nil\relax + \fi + } +% \end{macrocode} +% The actual parsing work then happens in |\pkgcls@parse@date@arg@|: +% \begin{macrocode} +\def\pkgcls@parse@date@arg@#1=#2\@nil{% +% \end{macrocode} +% We set |\pkgcls@targetdate| depending on the parsing result; the +% code is expandable so we can do the parsing as part of the assignment. +% \begin{macrocode} + \pkgcls@targetdate +% \end{macrocode} +% If a \texttt{=} was in first position then |#1| will be empty. In +% that case |#2| will be the original argument with a \texttt{=} +% appended. +% +% This can be parsed with |\@parse@version|, the trailing character +% is simply ignored. This macro returns the parsed date as a number +% (or zero if it wasn't a date) and accepts both YYYY/MM/DD and YYYY-MM-DD +% formats. +% \begin{macrocode} + \ifx\@nil#1\@nil + \@parse@version0#2//00\@nil\relax +% \end{macrocode} +% Whatever is returned is thus assigned to |\pkgcls@targetdate| +% and therefore we can now test its value. If the value is zero we +% assume that the remaining argument string represents a version +% and change |\pkgcls@targetdate| and set |\pkgcls@targetlabel| to +% the version name (after stripping off the trailing \texttt{=}. +% \begin{macrocode} + \ifnum \pkgcls@targetdate=\z@ + \pkgcls@targetdate\@ne + \def\pkgcls@innerdate{\maxdimen}% + \pkgcls@parse@date@arg@version#2% + \else + \edef\pkgcls@innerdate{\the\pkgcls@targetdate}% + \fi + \let\pkgcls@mindate\@empty + \else +% \end{macrocode} +% If |#1| was not empty then there wasn't a \texttt{=} character in +% first position so we we are dealing either with a ``minimum +% date'' or with some incorrect data. We assume the former and make +% the following assignments (the first one finishing the assignment +% of |\pkgcls@targetdate|): +% \begin{macrocode} + \requestedLaTeXdate\relax + \let\pkgcls@targetlabel\@empty + \def\pkgcls@innerdate{\maxdimen}% + \def\pkgcls@mindate{#1}% +% \end{macrocode} +% If the min-date is after the requested rollback date (if there is +% any, i.e., if it is not zero) then we have a conflict and +% therefore issue a warning. +% \changes{v1.2i}{2018/05/08} +% {Make suspicious rollback a warning not error: github issue 43} +% \begin{macrocode} + \ifnum \pkgcls@targetdate > \z@ + \ifnum \@parse@version0#1//00\@nil > \pkgcls@targetdate + \@latex@warning@no@line{Suspicious rollback/min-date date given\MessageBreak + A minimal date of #1 has been specified for + \@cls@pkg\MessageBreak '\pkgcls@name'.\MessageBreak + But this is in conflict + with a rollback request to \requestedpatchdate} + \fi + \fi + \fi +} +% \end{macrocode} +% Strip off te trailing \texttt{=} and assign the version name to +% |\pkgcls@targetlabel|. +% \begin{macrocode} +\def\pkgcls@parse@date@arg@version#1={% + \def\pkgcls@targetlabel{#1}} +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\DeclareRelease} +% First argument is the ``name'' of the release and it can be left empty +% if one doesn't like to give a name to the release. +% The second argument is that from which on this release was +% available (or should be used in case of minor updates). +% The final argument is the external file name of this release, by +% convention this should be +% \meta{pkg/cls-name}\texttt{-}\meta{date}\texttt{.}\meta{extension} +% but this is not enforced and through this argument one can +% overwrite it. +% \begin{macrocode} +\def\DeclareRelease#1#2#3{% + \ifnum\pkgcls@targetdate>\z@ % some sort of rollback request +%<*tracerollback> + \pkgcls@debug{---\string\DeclareRelease:}% + \pkgcls@debug{\@spaces 1: #1}% + \pkgcls@debug{\@spaces 2: #2}% + \pkgcls@debug{\@spaces 3: #3}% +%</tracerollback> +% \end{macrocode} +% If the date argument |#2| is empty we are dealing with a special +% release that should be only accessible via its name; a typical +% use case would be a ``beta'' release. So if we are +% currently processing a date request we ignore it and otherwise we +% check if we can match the name and if so load the corresponding +% release file. +% \begin{macrocode} + \ifx\@nil#2\@nil + \ifnum\pkgcls@targetdate=\@ne % named request + \def\reserved@a{#1}% + \ifx\pkgcls@targetlabel\reserved@a + \pkgcls@use@this@release{#3}{}% +%<*tracerollback> + \else + \pkgcls@debug{Label doesn't match}% +%</tracerollback> + \fi +%<*tracerollback> + \else + \pkgcls@debug{Date request: ignored}% +%</tracerollback> + \fi + \else +% \end{macrocode} +% If the value of |\pkgcls@targetdate| is greater than 1 (or in +% reality greater than something like 19930101) we are dealing with a +% rollback request to a specific date. +% \begin{macrocode} + \ifnum\pkgcls@targetdate>\@ne % a real request +% \end{macrocode} +% So we parse the date of this release to check if it is before or +% after the request date. +% \begin{macrocode} + \ifnum\@parse@version#2//00\@nil + >\pkgcls@targetdate +% \end{macrocode} +% If it is after we have to distinguish between two cases: If there +% was an earlier candidate we use that one because the other is too +% late, but if there wasn't one (i.e., if current release is the +% oldest that exists) we use it as the best choice. However in +% that case something is wrong (as there shouldn't be a rollback to +% a date where a package used doesn't yet exists. So we make a +% complained to the user. +% \begin{macrocode} + \ifx\pkgcls@candidate\@empty + \pkgcls@rollbackdate@error{#2}% + \pkgcls@use@this@release{#3}{#2}% + \else + \pkgcls@use@this@release\pkgcls@candidate + \pkgcls@releasedate + \fi + \else +% \end{macrocode} +% Otherwise, if the release date of this version is before the +% target rollback and we record it as a candidate. But we don't use +% it yet as there may be another release which is still before the +% target rollback. +% \begin{macrocode} + \def\pkgcls@candidate{#3}% + \def\pkgcls@releasedate{#2}% +%<*tracerollback> + \pkgcls@debug{New candidate: #3}% +%</tracerollback> + \fi + \else +% \end{macrocode} +% If we end up in this branch we have a named version request. So +% we check if |\pkgcls@targetlabel| matches the current name and if +% yes we use this release immediately, otherwise we do nothing as a +% later declaration may match it. +% \begin{macrocode} + \def\reserved@a{#1}% + \ifx\pkgcls@targetlabel\reserved@a + \pkgcls@use@this@release{#3}{#2}% +%<*tracerollback> + \else + \pkgcls@debug{Label doesn't match}% +%</tracerollback> + \fi + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} + + + + +% \begin{macro}{\pkgcls@use@this@release} +% If a certain release has been selected (stored in the external +% file given in \verb=#1=) we need to input it and afterwards stop +% reading the current file. +% \begin{macrocode} +\def\pkgcls@use@this@release#1#2{% +% \end{macrocode} +% Before that we record the selection made inside the transcript. +% \begin{macrocode} + \pkgcls@show@selection{#1}{#2}% +% \end{macrocode} +% We then set the |\pkgcls@targetdate| to zero so that any +% |\DeclareRelease| or |\DeclareCurrentRelease| in the file we +% now load are bypassed\footnote{The older release may also have +% such declarations inside if it was a simply copy of the +% \texttt{.sty} or \texttt{.cls} file current at that +% date. Removing these declarations would make the file load a tiny +% bit faster, but this way it works in any case.} and then we +% finally load the correct release. +% +% After loading that file we need to stop reading the current file +% so we issue |\endinput|. Note that the |\relax| before that is +% essential to ensure that the |\endinput| is only happening after +% the file has been fully processed, otherwise it would act after the +% first line of the |\@@input|! +% \changes{v1.2e}{2018/03/24} +% {Use full file name for old release} +% \begin{macrocode} + \pkgcls@targetdate\z@ + \@@input #1\relax + \endinput +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\pkgcls@show@selection} +% This command records what selection was made. As that is needed +% in two places (and it is rather lengthly) it was placed in a +% separate command. The first argument is the name of the external +% file that is being loaded and is only needed for debugging. The +% second argument is the date that corresponds to this file and it +% is used as part of the message. +% \begin{macrocode} +\def\pkgcls@show@selection#1#2{% +%<*tracerollback> + \pkgcls@debug{Result: use #1}% +%</tracerollback> + \GenericInfo + {\@spaces\@spaces\space}{Rollback for + \@cls@pkg\space'\@currname' requested -> + \ifnum\pkgcls@targetdate>\@ne + date + \ifnum\requestedLaTeXdate=\pkgcls@targetdate + \requestedpatchdate + \else + \expandafter\@gobble\pkgcls@arg + \fi.\MessageBreak +% \end{macrocode} +% Instead of ``best approximation'' we could say that we have been +% able to exactly match the date (if it is exact), but that would +% mean extra tests without much gain, so not done. +% \begin{macrocode} + Best approximation is + \else + version '\pkgcls@targetlabel'.\MessageBreak + This corresponds to + \fi + \ifx\@nil#2\@nil + a special release% + \else + the release introduced on #2% + \fi + \@gobble}% +} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\pkgcls@rollbackdate@error} +% This is called if the requested rollback date is earlier than the +% earliest known release of a package or class. +% +% A similar error is given if global rollback date and min-date on +% a specific package conflict with each other, but that case is +% happens only once so it is is inlined. +% \begin{macrocode} +\def\pkgcls@rollbackdate@error#1{% + \@latex@error{Suspicious rollback date given}% + {The \@cls@pkg\space'\@currname' claims that it + came into existence on #1 which\MessageBreak + is after your requested rollback date --- so + something is wrong here.\MessageBreak + Continue and we use the earliest known release.}} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\DeclareCurrentRelease} +% This declares the date (and possible name) of the current version +% of a package or class. +% \begin{macrocode} +\def\DeclareCurrentRelease#1#2{% +% \end{macrocode} +% First we test if |\pkgcls@targetdate| is greater than zero, +% otherwise this code is bypassed (as there is no rollback +% request). +% \begin{macrocode} + \ifnum\pkgcls@targetdate>\z@ % some sort of rollback request +%<*tracerollback> + \pkgcls@debug{---DeclareCurrentRelease}% + \pkgcls@debug{ 1: #1}% + \pkgcls@debug{ 2: #2}% +%</tracerollback> +% \end{macrocode} +% If the value is greater than 1 we have to deal with a date +% request, so we parse |#2| as a date and compare it with +% |\pkgcls@targetdate|. +% \begin{macrocode} + \ifnum\pkgcls@targetdate>\@ne % a date request + \ifnum\@parse@version#2//00\@nil + >\pkgcls@targetdate +% \end{macrocode} +% If it is greater that means the release date if this file is +% later than the requested rollback date. Again we have two cases: +% If there was a previous candidate release we use that one as the +% current release is too young, but if there wasn't we have to use +% this release nevertheless as there isn't any alternative. +% +% However this case can only happen if there is a +% |\DeclareCurrentRelease| but no declared older releases (so +% basically the use of the declaration is a bit dubious). +% \begin{macrocode} + + \ifx\pkgcls@candidate\@empty + \pkgcls@rollbackdate@error{#2}% + \else + \pkgcls@use@this@release\pkgcls@candidate + \pkgcls@releasedate + \fi +% \end{macrocode} +% Otherwise the curent file is the right release, so we record that +% in the transcript and then carry on. +% \begin{macrocode} + \else + \pkgcls@show@selection{current version}{#2}% + \fi + \else % a label request +% \end{macrocode} +% Otherwise we have a rollback request to a named version so we +% check if that fits the current name and if not give an error as +% this was the last possible opportunity. +% \begin{macrocode} + \def\reserved@a{#1}% + \ifx\pkgcls@targetlabel\reserved@a + \pkgcls@show@selection{current version}{#2}% + \else + \@latex@error{Requested version '\pkgcls@targetlabel' for + \@cls@pkg\space'\@currname' is unknown}\@ehc + \fi + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% + +% \begin{macro}{\IfTargetDateBefore} +% This enables a simple form of conditional code inside a class or +% package file. If there is a date request and the request date is +% earlier than the first argument the code in the second argument +% is processed otherwise the code in the third argument is +% processed. If there was no date request then we also execute the +% third argument, i.e., we will get the ``latest'' version of the +% file. +% +% Most often the second argument (before-date-code) will be empty. +% \begin{macrocode} +\long\def\IfTargetDateBefore#1{% + \ifnum\pkgcls@innerdate <% + \expandafter\@parse@version\expandafter0#1//00\@nil + \typeout{Exclude code introduced on #1}% + \expandafter\@firstoftwo + \else + \typeout{Include code introduced on #1}% + \expandafter\@secondoftwo + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel|latexreleasefirst> +% \end{macrocode} +% +% +% \section{After Preamble} +% Finally we declare a package that allows all the commands declared +% above to be |\@onlypreamble| to be used after |\begin{document}|. +% \changes{v0.3f}{1994/03/16} +% {Add pkgindoc package} +% \changes{v1.1a}{1998/03/21} +% {Correct to new onlypreamble command list} +% \begin{macrocode} +%<*afterpreamble> +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{pkgindoc} + [1994/10/20 v1.1 Package Interface in Document (DPC)] +\def\reserved@a#1\do\@classoptionslist#2\do\filec@ntents#3\relax{% + \gdef\@preamblecmds{#1#3}} +\expandafter\reserved@a\@preamblecmds\relax +%</afterpreamble> +% \end{macrocode} +% +% \Finale diff --git a/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx b/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx new file mode 100644 index 00000000000..c4e755eca71 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltcntrl.dtx @@ -0,0 +1,326 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltcntrl.dtx +%<*driver> +% \fi +\ProvidesFile{ltcntrl.dtx} + [2014/04/21 v1.0h LaTeX Kernel (program control)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltcntrl.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.0b}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0c}{1994/11/28} +% {Documentation improvements} +% +% \section{Program control structure} +% +% This section defines a number of control structure macros, such as +% while-loops and for-loops. +% +% \StopEventually{} +% +% \begin{oldcomments} +% \begin{macrocode} +%<*2ekernel> +\message{control,} +% \end{macrocode} +% +% \@whilenum TEST \do {BODY} +% \@whiledim TEST \do {BODY} : These implement the loop +% while TEST do BODY od +% where TEST is a TeX \ifnum or \ifdim test, respectively. +% They are optimized for the normal case of TEST initially false. +% +% \@whilesw SWITCH \fi {BODY} : Implements the loop +% while SWITCH do BODY od +% Optimized for normal case of SWITCH initially false. +% +% \@for NAME := LIST \do {BODY} : Assumes that LIST expands to A1,A2, +% ... ,An . +% Executes BODY n times, with NAME = Ai on the i-th iteration. +% Optimized for the normal case of n = 1. Works for n=0. +% +% \@tfor NAME := LIST \do {BODY} +% if, before expansion, LIST = T1 ... Tn where each Ti is a +% token or {...}, then executes BODY n times, with NAME = Ti +% on the i-th iteration. Works for n=0. +% +% NOTES: 1. These macros use no \@temp sequences. +% 2. These macros do not work if the body contains anything that +% looks syntactically to TeX like an improperly balanced \if +% \else \fi. +% +% \@whilenum TEST \do {BODY} == +% BEGIN +% if TEST +% then BODY +% \@iwhilenum{TEST \relax BODY} +% END +% +% \@iwhilenum {TEST BODY} == +% BEGIN +% if TEST +% then BODY +% \@nextwhile = def(\@iwhilenum) +% else \@nextwhile = def(\@whilenoop) +% fi +% \@nextwhile {TEST BODY} +% END +% +% \@whilesw SWITCH \fi {BODY} == +% BEGIN +% if SWITCH +% then BODY +% \@iwhilesw {SWITCH BODY}\fi +% fi +% END +% +% \@iwhilesw {SWITCH BODY} \fi == +% BEGIN +% if SWITCH +% then BODY +% \@nextwhile = def(\@iwhilesw) +% else \@nextwhile = def(\@whileswnoop) +% fi +% \@nextwhile {SWITCH BODY} \fi +% END +% +% \end{oldcomments} +% +% \begin{macro}{\@whilenoop} +% \begin{macro}{\@whilenum} +% \begin{macro}{\@iwhilenum} +% \changes{v1.0f}{1995/07/09}{Reimplemented using Kabelschacht method} +% \changes{v1.0g}{1995/08/16}{Removed \cs{@whilenoop}} +% \changes{v1.0g}{1995/08/16}{Made defs long} +% \begin{macrocode} +\long\def\@whilenum#1\do #2{\ifnum #1\relax #2\relax\@iwhilenum{#1\relax + #2\relax}\fi} +\long\def\@iwhilenum#1{\ifnum #1\expandafter\@iwhilenum + \else\expandafter\@gobble\fi{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@whiledim} +% \begin{macro}{\@iwhiledim} +% \changes{v1.0f}{1995/07/09}{Reimplemented using Kabelschacht method} +% \changes{v1.0g}{1995/08/16}{Removed \cs{@whilenoop}} +% \changes{v1.0g}{1995/08/16}{Made defs long} +% \begin{macrocode} +\long\def\@whiledim#1\do #2{\ifdim #1\relax#2\@iwhiledim{#1\relax#2}\fi} +\long\def\@iwhiledim#1{\ifdim #1\expandafter\@iwhiledim + \else\expandafter\@gobble\fi{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@whileswnoop} +% \begin{macro}{\@whilesw} +% \begin{macro}{\@iwhilesw} +% \changes{v1.0f}{1995/07/09}{Reimplemented using Kabelschacht method} +% \changes{v1.0g}{1995/08/16}{Removed \cs{@whileswnoop}} +% \begin{macrocode} +\long\def\@whilesw#1\fi#2{#1#2\@iwhilesw{#1#2}\fi\fi} +\long\def\@iwhilesw#1\fi{#1\expandafter\@iwhilesw + \else\@gobbletwo\fi{#1}\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{oldcomments} +% +% \@for NAME := LIST \do {BODY} == +% BEGIN \@forloop expand(LIST),\@nil,\@nil \@@ NAME {BODY} END +% +% \@forloop CAR, CARCDR, CDRCDR \@@ NAME {BODY} == +% BEGIN +% NAME = CAR +% if def(NAME) = def(\@nnil) +% else BODY; +% NAME = CARCDR +% if def(NAME) = def(\@nnil) +% else BODY +% \@iforloop CDRCDR \@@ NAME \do {BODY} +% fi +% fi +% END +% +% \@iforloop CAR, CDR \@@ NAME {BODY} = +% NAME = CAR +% if def(NAME) = def(\@nnil) +% then \@nextwhile = def(\@fornoop) +% else BODY ; +% \@nextwhile = def(\@iforloop) +% fi +% \@nextwhile name cdr {body} +% +% \@tfor NAME := LIST \do {BODY} +% = \@tforloop LIST \@nil \@@ NAME {BODY} +% +% \@tforloop car cdr \@@ name {body} = +% name = car +% if def(name) = def(\@nnil) +% then \@nextwhile == \@fornoop +% else body ; +% \@nextwhile == \@forloop +% fi +% \@nextwhile name cdr {body} +% \end{oldcomments} +% +% \begin{macro}{\@nnil} +% \begin{macrocode} +\def\@nnil{\@nil} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@empty} +% \begin{macrocode} +\def\@empty{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fornoop} +% \changes{v1.0g}{1995/08/16}{Made defs long} +% \changes{v1.0h}{2007/08/06}{Really make defs long} +% \begin{macrocode} +\long\def\@fornoop#1\@@#2#3{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@for} +% \changes{v1.0d}{1995/04/24} +% {Dont expand second argument with \cs{edef}: /1317 (DPC)} +% \begin{macrocode} +\long\def\@for#1:=#2\do#3{% + \expandafter\def\expandafter\@fortmp\expandafter{#2}% + \ifx\@fortmp\@empty \else + \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@forloop} +% \changes{v1.0g}{1995/08/16}{Made defs long} +% \begin{macrocode} +\long\def\@forloop#1,#2,#3\@@#4#5{\def#4{#1}\ifx #4\@nnil \else + #5\def#4{#2}\ifx #4\@nnil \else#5\@iforloop #3\@@#4{#5}\fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iforloop} +% \changes{v1.0f}{1995/07/09}{Reimplemented using Kabelschacht method} +% \changes{v1.0g}{1995/08/16}{Made defs long} +% \begin{macrocode} +\long\def\@iforloop#1,#2\@@#3#4{\def#3{#1}\ifx #3\@nnil + \expandafter\@fornoop \else + #4\relax\expandafter\@iforloop\fi#2\@@#3{#4}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tfor} +% \changes{LaTeX209}{1991/10/17} +% {(Rms) \cs{xdef} replaced by \cs{def} +% (See FMi's array.doc)} +% \changes{v1.0c}{1994/03/13} +% {(DPC) Add \cs{@tf@r} so a single group is +% correctly treated.} +% \changes{v1.0f}{1995/07/09}{Reimplemented using Kabelschacht method} +% \changes{v1.0g}{1995/08/16}{Made defs long} +% \begin{macrocode} +\def\@tfor#1:={\@tf@r#1 } +\long\def\@tf@r#1#2\do#3{\def\@fortmp{#2}\ifx\@fortmp\space\else + \@tforloop#2\@nil\@nil\@@#1{#3}\fi} +\long\def\@tforloop#1#2\@@#3#4{\def#3{#1}\ifx #3\@nnil + \expandafter\@fornoop \else + #4\relax\expandafter\@tforloop\fi#2\@@#3{#4}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@break@tfor} +% Break out of a |\@tfor| loop. This should be called \emph{inside} +% the scope of an |\if|. See |\@iffileonpath| for an example. +% \changes{v1.0l}{1994/05/02}{Macro added (from ltfiles.dtx)} +% \changes{v1.0g}{1995/08/16}{Made long} +% \begin{macrocode} +\long\def\@break@tfor#1\@@#2#3{\fi\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@removeelement} +% Removes an element from a comma-separated list and puts it into +% a control sequence, called as +% |\@removeelement{|\meta{element}|}{|\meta{list}|}{|\meta{cs}|}|. +% Due to the implementation method the \meta{element} is not allowed +% to contain braces. +% \begin{macrocode} +\def\@removeelement#1#2#3{% + \def\reserved@a##1,#1,##2\reserved@a{##1,##2\reserved@b}% + \def\reserved@b##1,\reserved@b##2\reserved@b{% + \ifx,##1\@empty\else##1\fi}% + \edef#3{% + \expandafter\reserved@b\reserved@a,#2,\reserved@b,#1,\reserved@a}} +% \end{macrocode} +% \end{macro} +% +% +% \changes{v1.0e}{1995/04/29}{Removed unused defs for +% \cs{@setprotect} and \cs{@resetprotect}} +% \changes{v1.0e}{1995/04/29}{Moved init of \cs{protect} +% to ltdefns.dtx} +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +%\Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx b/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx new file mode 100644 index 00000000000..8158ef7c611 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltcounts.dtx @@ -0,0 +1,682 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltcounts.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltcounts.dtx} + [2018/04/22 v1.1l LaTeX Kernel (Counters)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltcounts.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0c}{1994/03/29} +% {Create file from parts of ltmiscen and ltherest.} +% \changes{v1.1a}{1994/05/19}{Extracted file from ltcntlen.} +% \changes{v1.1d}{1996/04/23}{Documentation improvements} +% +% \section{Counters and Lengths} +% Commands for defining and using counters. This file defines: +% +% \DescribeMacro{\newcounter} +% To define a new counter. +% +% \DescribeMacro{\setcounter} +% To set the value of counters. +% +% \DescribeMacro{\addtocounter} +% Increase the counter |#1| by the number |#2|. +% +% \DescribeMacro{\stepcounter} +% Increase a counter by one. +% +% \DescribeMacro{\refstepcounter} +% Increase a counter by one, also setting the value used by |\label|. +% +% +% \DescribeMacro{\value} +% For accessing the value of the counter as a \TeX\ number (as opposed +% to |\the|\meta{counter} which expands to the \emph{printed} +% representation of \meta{counter}) +% +% \DescribeMacro\arabic +% |\arabic|\marg{counter}: 1, 2, 3, \ldots +% +% \DescribeMacro\roman +% |\roman|\marg{counter}: i, ii, iii, \ldots +% +% \DescribeMacro\Roman +% |\Roman|\marg{counter}: I, II, III, \ldots +% +% \DescribeMacro\alph +% |\alph|\marg{counter}: a, b, c, \ldots +% +% \DescribeMacro\Alph +% |\Alph|\marg{counter}: A, B, C, \ldots +% +% \DescribeMacro\fnsymbol +% |\fnsymbol|\marg{counter}: $*$, $\dagger$, $\ddagger$, \ldots +% +% +% \DescribeMacro\counterwithin +% |\counterwithin|\marg{counter}\marg{within-counter}: +% Resets \meta{counter} whenever +% \meta{within-counter} is stepped. Also +% redefines |\the|\meta{counter} command to produce +% |\the|\meta{within-counter}|.\arabic|\marg{counter}. +% Star form omits redefining the print representation. + +% +% \DescribeMacro\counterwithout +% |\counterwithout|\marg{counter}\marg{within-counter}: +% Removes \meta{counter} from the reset list of \meta{within-counter}. +% Also +% redefines |\the|\meta{counter} command to produce +% |\arabic|\marg{counter}. +% Star form omits redefining the print representation. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% \subsection{Environment Counter Macros} +% +% An environment foo has an associated counter defined by the +% following control sequences: +% +% \begin{tabular}{lp{.75\textwidth}} +% |\c@foo| & Contains the counter's numerical value. +% It is defined by |\newcount\foocounter|.\\ +% |\thefoo| & Macro that expands to the printed value of |\foocounter|. +% For example, if sections are numbered within chapters, +% and section headings look like +% +% Section II-3. The Nature of Counters +% +% then |\thesection| might be defined by:\newline +% |\def\thesection|\newline\hspace*{2em} +% |{\@Roman{\c@chapter}-\@arabic{\c@section}}|\\ +% +% |\p@foo| & Macro that expands to a printed `reference prefix' of +% counter foo. Any |\ref| to a value created by counter +% foo will produce the expansion of |\p@foo\thefoo| when +% the |\label| command is executed. See file \texttt{ltxref.dtx} +% for an extension of this mechanism.\\ +% |\cl@foo| & List of counters to be reset when foo stepped. +% Has format +% |\@elt{countera}\@elt{counterb}\@elt{counterc}|. +% \end{tabular} +% +% \textbf{NOTE:}\\ +% |\thefoo| and |\p@foo| \emph{must} be defined in such a way that +% |\edef\bar{\thefoo}| or |\edef\bar{\p@foo}| +% defines |\bar| so that it will evaluate to the counter value at the +% time of the |\edef|, even after |\foocounter| and any other counters +% have been changed. This will happen if you use the standard commands +% |\@arabic|, |\@Roman|, etc. +% +% +% The following commands are used to define and modify counters. +% +% |\refstepcounter|\marg{foo}\\ +% Same as |\stepcounter|, but it also defines +% |\@currentreference| so that a subsequent +% |\label|\marg{bar} command causes |\ref|\marg{bar} to +% generate the current value of counter \meta{foo}. +% +% |\@definecounter|\marg{foo}\\ +% Initializes counter \marg{foo} (with empty reset list), defines +% |\p@foo| and |\thefoo| to be null. Also adds \meta{foo} +% to |\cl@@ckpt| -- +% the reset list of a dummy counter |@ckpt| used for taking +% checkpoints for the |\include| system. +% +% |\@addtoreset|\marg{foo}\marg{bar} : +% Adds counter \meta{foo} to the list of counters +% |\cl@bar| to be reset when counter \meta{bar} is stepped. +% +% |\@removefromreset|\marg{foo}\marg{bar} : +% Removes counter \meta{foo} to the list of counters +% |\cl@bar| to be reset when counter \meta{bar} is stepped. +% +% +% \begin{macro}{\setcounter} +% \changes{v1.0d}{1994/04/09} +% {\cs{@nocnterr} now has counter name argument} +% \changes{v1.0e}{1994/04/17} +% {Use \cs{@nocounterr} instead of \cs{@nocnterr}} +% |\setcounter|\marg{foo}\marg{val} : +% Globally sets |\foocounter| equal to \meta{val}. +% \begin{macrocode} +\def\setcounter#1#2{% + \@ifundefined{c@#1}% + {\@nocounterr{#1}}% + {\global\csname c@#1\endcsname#2\relax}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtocounter} +% \changes{v1.0d}{1994/04/09} +% {\cs{@nocnterr} now has counter name argument} +% \changes{v1.0e}{1994/04/17} +% {Use \cs{@nocounterr} instead of \cs{@nocnterr}} +% |\addtocounter|\marg{foo}\marg{val} +% Globally increments |\foocounter| by \meta{val}. +% \begin{macrocode} +\def\addtocounter#1#2{% + \@ifundefined{c@#1}% + {\@nocounterr{#1}}% + {\global\advance\csname c@#1\endcsname #2\relax}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newcounter} +% |\newcounter|\marg{newctr}\oarg{oldctr} +% Defines \meta{newctr} to be a counter, which is reset when counter +% \meta{oldctr} is stepped. If \meta{newctr} already defined +% produces +% `|c@newctr already defined|' error. +% \begin{macrocode} +\def\newcounter#1{% + \expandafter\@ifdefinable \csname c@#1\endcsname + {\@definecounter{#1}}% + \@ifnextchar[{\@newctr{#1}}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\value} +% |\value|\marg{ctr} +% produces the value of counter \meta{ctr}, for use with +% a |\setcounter| or |\addtocounter| command. +% \begin{macrocode} +\def\value#1{\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@newctr} +% \changes{v1.0d}{1994/04/09} +% {\cs{@nocnterr} now has counter name argument} +% \changes{v1.0e}{1994/04/17} +% {Use \cs{@nocounterr} instead of \cs{@nocnterr}} +% \begin{macrocode} +\def\@newctr#1[#2]{% + \@ifundefined{c@#2}{\@nocounterr{#2}}{\@addtoreset{#1}{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\stepcounter} +% \changes{LaTeX209}{1992/11/23}{Replaced \{\} in \cs{stepcounter} by +% \cs{begingroup} \cs{endgroup} to avoid adding an empty ord in +% math mode} +% \changes{v1.0d}{1994/04/09} +% {Use \cs{addtocounter} to have name checked} +% |\stepcounter|{foo} +% Globally increments counter |\c@FOO| +% and resets all subsidiary counters. +% \begin{macrocode} +\def\stepcounter#1{% + \addtocounter{#1}\@ne + \begingroup + \let\@elt\@stpelt + \csname cl@#1\endcsname + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@stpelt} +% \changes{v1.1h}{2015/01/10}{Reset all within counters in one go (latexrelease)} +% +% Rather than resetting the ``within'' counter to zero we set it to +% $-1$ and then run |\stepcounter| that moves it to $0$ and also +% initiates resetting the next level down. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\@stpelt} +%<latexrelease> {Reset nested counters}% +%<*2ekernel|latexrelease> +\def\@stpelt#1{\global\csname c@#1\endcsname \m@ne\stepcounter{#1}}% +%<latexrelease>\EndIncludeInRelease +%</2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{0000/00/00}{\@stpelt} +%<latexrelease> {Reset nested counters}%% +%<latexrelease>\def\@stpelt#1{\global\csname c@#1\endcsname \z@}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cl@@ckpt} +% \begin{macrocode} +\def\cl@@ckpt{\@elt{page}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@definecounter} +% \changes{v1.1b}{1995/05/20}{Streamlined code} +% \changes{v1.1c}{1995/05/20}{And do it right} +% +% \begin{macrocode} +\def\@definecounter#1{\expandafter\newcount\csname c@#1\endcsname + \setcounter{#1}\z@ + \global\expandafter\let\csname cl@#1\endcsname\@empty + \@addtoreset{#1}{@ckpt}% + \global\expandafter\let\csname p@#1\endcsname\@empty + \expandafter + \gdef\csname the#1\expandafter\endcsname\expandafter + {\expandafter\@arabic\csname c@#1\endcsname}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtoreset} +% \begin{macrocode} +\def\@addtoreset#1#2{\expandafter\@cons\csname cl@#2\endcsname {{#1}}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% +% \begin{macro}{\@removefromreset} +% \changes{v1.1k}{2018/03/08}{Interface added} +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2018-04-01} +%<latexrelease> {\@removefromreset}{Add interfaces}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +\def\@removefromreset#1#2{% +% \end{macrocode} +% Even through this is internal and the programmer should know what +% he/she is doing we test here if counter |#2| is defined. If not, +% the execution would run into a tight loop. +% \begin{macrocode} + \@ifundefined{c@#2}\relax + {\begingroup + \expandafter\let\csname c@#1\endcsname\@removefromreset + \def\@elt##1{% + \expandafter\ifx\csname c@##1\endcsname\@removefromreset + \else + \noexpand\@elt{##1}% + \fi}% + \expandafter\xdef\csname cl@#2\endcsname + {\csname cl@#2\endcsname}% + \endgroup}} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\@ifbothcounters} +% \changes{v1.1k}{2018/03/08}{Interface added} +% Test if arg |#1| and |#2| are counters and if so execute |#3|. +% \begin{macrocode} +\def\@ifbothcounters#1#2#3{% + \@ifundefined{c@#1}{\@nocounterr{#1}}% + {% else counter is defined + \@ifundefined{c@#2}{\@nocounterr{#2}}% + {% else both counter and within are defined + #3}}} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\counterwithout} +% +% \changes{v1.1k}{2018/03/08}{Interface added} +% \begin{macrocode} +\def\counterwithout {\@ifstar\counterwithout@s\counterwithout@x} +% \end{macrocode} +% +% \begin{macrocode} +\def\counterwithout@s#1#2{% + \@ifbothcounters{#1}{#2}{\@removefromreset{#1}{#2}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\counterwithout@x#1#2{% + \@ifbothcounters{#1}{#2}% + {\@removefromreset{#1}{#2}% + \expandafter + \gdef\csname the#1\expandafter\endcsname\expandafter + {\expandafter + \@arabic\csname c@#1\endcsname}}} +% \end{macrocode} +% \end{macro} + + + +% \begin{macro}{\counterwithin} +% +% \changes{v1.1k}{2018/03/08}{Interface added} +% \begin{macrocode} +\def\counterwithin{\@ifstar\counterwithin@s\counterwithin@x} +% \end{macrocode} +% +% \begin{macrocode} +\def\counterwithin@s#1#2{% + \@ifbothcounters{#1}{#2}{\@addtoreset{#1}{#2}}} +% \end{macrocode} +% +% \changes{v1.1l}{2018/04/11}{Correct default (issue/38)} +% \begin{macrocode} +\def\counterwithin@x#1#2{% + \@ifbothcounters{#1}{#2}% + {\@addtoreset{#1}{#2}% + \expandafter + \gdef\csname the#1\expandafter\endcsname\expandafter + {\csname the#2\expandafter\endcsname\expandafter + .\expandafter + \@arabic\csname c@#1\endcsname}}} +% \end{macrocode} +% \end{macro} + + +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000-00-00} +%<latexrelease> {\@removefromreset}{Add interfaces}% +%<latexrelease>\let \@removefromreset \undefined +%<latexrelease>\let \@ifbothcounters \undefined +%<latexrelease>\let \counterwithout \undefined +%<latexrelease>\let \counterwithout@s \undefined +%<latexrelease>\let \counterwithout@x \undefined +%<latexrelease>\let \counterwithin \undefined +%<latexrelease>\let \counterwithin@s \undefined +%<latexrelease>\let \counterwithin@x \undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% Numbering commands for definitions of |\theCOUNTER| and |\list| +% arguments. +% +% All commands can now be used in text and math mode. +% +% \begin{macro}{\arabic} +% Representation of\meta{counter} as arabic numerals. +% Changed 29 Apr 86 to make it print the obvious thing +% it COUNTER not positive. +% \begin{macrocode} +\def\arabic#1{\expandafter\@arabic\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\roman} +% Representation of \meta{counter} as lower-case +% Roman numerals. +% \begin{macrocode} +\def\roman#1{\expandafter\@roman\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Roman} +% Representation of \meta{counter} as upper-case +% Roman numerals. +% \begin{macrocode} +\def\Roman#1{\expandafter\@Roman\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\alph} +% Representation of \meta{counter} as a lower-case +% letter: 1 = a, 2 = b, etc. +% \begin{macrocode} +\def\alph#1{\expandafter\@alph\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\Alph} +% Representation of \meta{counter} as an upper-case +% letter: 1 = A, 2 = B, etc. +% \begin{macrocode} +\def\Alph#1{\expandafter\@Alph\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fnsymbol} +% \changes{v1.1b}{1995/05/20}{Streamlined code} +% \changes{v1.1e}{1997/03/21} +% {Use \cs{mathsection} and \cs{mathparagraph}. latex/2445} +% +% Representation of \meta{COUNTER} as a footnote +% symbol: 1 = $*$, 2 = $\dagger$, etc. +% \begin{macrocode} +\def\fnsymbol#1{\expandafter\@fnsymbol\csname c@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0f}{1994/05/13}{Removed \cs{@ialph}} +% \changes{v1.0f}{1994/05/13}{Removed \cs{@Ialph}} +% +% \begin{macro}{\@arabic} +% |\@arabic\FOOcounter| +% Representation of |\FOOcounter| as arabic numerals. +% \begin{macrocode} +\def\@arabic#1{\number #1} %% changed 29 Apr 86 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@roman} +% |\@roman\FOOcounter| +% Representation of |\FOOcounter| as lower-case +% Roman numerals. +% \begin{macrocode} +\def\@roman#1{\romannumeral #1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@Roman} +% |\@Roman\FOOcounter| +% Representation of |\FOOcounter| as upper-case +% Roman numerals. + +% \changes{v1.1f}{1997/10/06}{Change \cs{@Roman} to be fully +% expandable, so that the result is written properly to files.} +% \begin{macrocode} +\def\@Roman#1{\expandafter\@slowromancap\romannumeral #1@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@slowromancap} +% \changes{v1.1f}{1997/10/06}{Macro added.} +% Fully expandable macro to change a roman number to uppercase. +% \begin{macrocode} +\def\@slowromancap#1{\ifx @#1% then terminate + \else + \if i#1I\else\if v#1V\else\if x#1X\else\if l#1L\else\if + c#1C\else\if d#1D\else \if m#1M\else#1\fi\fi\fi\fi\fi\fi\fi + \expandafter\@slowromancap + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@alph} +% |\@alph\FOOcounter| +% Representation of |\FOOcounter| as a lower-case +% letter: 1 = a, 2 = b, etc. +% \begin{macrocode} +\def\@alph#1{% + \ifcase#1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or + k\or l\or m\or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or + y\or z\else\@ctrerr\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@Alph} +% |\@Alph\FOOcounter| +% Representation of |\FOOcounter| as an upper-case +% letter: 1 = A, 2 = B, etc. +% \begin{macrocode} +\def\@Alph#1{% + \ifcase#1\or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or + K\or L\or M\or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or + Y\or Z\else\@ctrerr\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fnsymbol} +% \changes{v1.1b}{1995/05/20}{Allowing both text and math} +% Typesetting old fashioned footnote symbols. +% This can be done both in text or math mode now. +% +% \changes{v1.1h}{2015/01/10}{Unse \cs{TextOrMath} (latexrelease)} +% This macro is another example of an ever recurring problem in +% \TeX: Determining if something is text-mode or math-mode. It is +% imperative for the decision between text and math to be delayed +% until the actual typesetting is done as the code in question may +% go through an |\edef| or |\write| where an |\ifmmode| test would +% be executed prematurely. Hence in the implementation below, +% |\@fnsymbol| is not robust in itself but the parts doing the +% actual typesetting are. +% +% In the case of |\@fnsymbol| we make use of the robust command +% |\TextOrMath| which takes two arguments and typesets the first if +% in text-mode and the second if in math-mode. Note that in order +% for this command to make the correct decision, it must insert a +% |\relax| token if run under regular \TeX, which ruins any kerning +% between the preceding characters and whatever awaits +% typesetting. If you use e\TeX\ as engine for \LaTeX\ (as +% recommended) this unfortunate side effect is not present. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\@fnsymbol}{Use \TexOrMath}% +%<*2ekernel|latexrelease> +\def\@fnsymbol#1{% + \ifcase#1\or \TextOrMath\textasteriskcentered *\or + \TextOrMath \textdagger \dagger\or + \TextOrMath \textdaggerdbl \ddagger \or + \TextOrMath \textsection \mathsection\or + \TextOrMath \textparagraph \mathparagraph\or + \TextOrMath \textbardbl \|\or + \TextOrMath {\textasteriskcentered\textasteriskcentered}{**}\or + \TextOrMath {\textdagger\textdagger}{\dagger\dagger}\or + \TextOrMath {\textdaggerdbl\textdaggerdbl}{\ddagger\ddagger}\else + \@ctrerr \fi +}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\@fnsymbol}{Use \TexOrMath}% +%<latexrelease>\def\@fnsymbol#1{\ensuremath{% +%<latexrelease> \ifcase#1\or *\or \dagger\or \ddagger\or \mathsection\or +%<latexrelease> \mathparagraph\or \|\or **\or \dagger\dagger +%<latexrelease> \or \ddagger\ddagger \else\@ctrerr\fi}}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\TextOrMath} +% \changes{v1.1h}{2015/01/11}{Add command to solve robustness +% issues (pr/3752) (latexrelease)} +% \changes{v1.1j}{2016/10/19}{Test directly for \cs{protected}} +% When using regular \TeX, we make this command robust so that it +% always selects the correct branch in an |\ifmmode| switch with +% the usual disadvantage of ruining kerning. For the application we +% use it for here that shouldn't matter. The alternative would be +% to mimic |\IeC| from \textsf{inputenc} but then it wil have the +% disadvantage of choosing the wrong branch if appearing at the +% beginning of an alignment cell. However, users of e\TeX\ will be +% pleasantly surprised to get the best of both worlds and no bad +% side effects. +% +% First some code for checking if we are running e\TeX\ but making +% sure not to permanently turn |\protected| into |\relax|. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\TextOrMath}{\TextOrMath}% +%<*2ekernel|latexrelease> +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname protected\endcsname\relax +% \end{macrocode} +% In case of ordinary \TeX\ we define |\TextOrMath| as a robust +% command but make sure it always grabs its arguments. If we didn't do +% this it might very well gobble spaces in the input stream. +% \begin{macrocode} +\DeclareRobustCommand\TextOrMath{% + \ifmmode \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\protected@edef\TextOrMath#1#2{\TextOrMath{#1}{#2}} +\else +% \end{macrocode} +% For e\TeX\ the situation is similar. The robust macro is a hidden +% one so that we again avoid problems of gobbling spaces in the input. +% \begin{macrocode} +\protected\expandafter\def\csname TextOrMath\space\endcsname{% + \ifmmode \expandafter\@secondoftwo + \else \expandafter\@firstoftwo \fi} +\edef\TextOrMath#1#2{% + \expandafter\noexpand\csname TextOrMath\space\endcsname + {#1}{#2}} +\fi +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\TextOrMath}{\TextOrMath}% +%<latexrelease>\let\TextOrMath\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx b/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx new file mode 100644 index 00000000000..3a7d6f06ea6 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltdefns.dtx @@ -0,0 +1,1544 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltdefns.dtx +%<*driver> +% \fi +\ProvidesFile{ltdefns.dtx} + [2018/09/26 v1.5e LaTeX Kernel (definition commands)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltdefns.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0n}{1994/05/10}{(ASAJ) Added +% \cs{DeclareProtectedCommand}.} +% \changes{v1.0p}{1994/05/12}{(ASAJ) Fixed a bug with \cs{relax} +% which was +% using \cs{@gobble} before defining it.} +% \changes{v1.0q}{1994/05/13}{(ASAJ) Renamed +% \cs{DeclareProtectedCommand} to +% \cs{DeclareRobustCommand}. Removed \cs{@if@short@command}.} +% \changes{v1.0q}{1994/05/13}{(ASAJ) Replaces \cs{space} by `~' in +% \cs{csname}.} +% \changes{v1.0r}{1994/05/13}{(ASAJ) Added logging message to +% \cs{DeclareProtectedCommand}.} +% \changes{v1.0s}{1994/05/13}{(ASAJ) Added \cs{@backslashchar}.} +% \changes{v1.0s}{1994/05/13}{(ASAJ) Coded \cs{@ifdefinable} more +% efficiently.} +% \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.1b}{1994/05/17}{(ASAJ) Removed warnings and logging to +% lterror.dtx.} +% \changes{v1.1b}{1994/05/17}{(ASAJ) Added definitions for protect.} +% \changes{v1.1c}{1994/05/17}{(ASAJ) Redid definitions for protect.} +% \changes{v1.1d}{1994/05/19}{(RmS) Added definitions for +% \cs{@namedef} and \cs{@nameuse} again.} +% \changes{v1.1e}{1994/05/20}{Changed command name from +% \cs{@checkcommand} to \cs{CheckCommand}.} +% \changes{v1.1f}{1994/05/22}{Use new warning and error cmds} +% \changes{v1.2a}{1994/10/18}{Add star-forms for all commands} +% \changes{v1.2a}{1994/10/18}{Add extra test for \cs{endgraf}} +% \changes{v1.2b}{1994/10/25}{Documentation improvements} +% \changes{v1.2c}{1994/10/30}{(CAR)\cs{@onelevel@sanitize} added} +% \changes{v1.2f}{1994/10/30}{(DPC)\cs{newwrite}'s moved to ltfiles} +% \changes{v1.0g}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0p}{1995/07/13}{Updates to documentation} +% \changes{v1.4b}{2015/02/21} +% {Removed autoload support} +% +% \section{Definitions} +% +% This section contains commands used in defining other macros. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% \subsection{Initex initialisations} +% +% \task{???}{This section needs extension} +% +% \begin{macro}{\two@digits} +% \changes{LaTeX2e}{1993/11/23}{Macro added} +% Prefix a number less than 10 with `0'. +% \begin{macrocode} +\def\two@digits#1{\ifnum#1<10 0\fi\number#1} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2e}{1994/11/04}{Added \cs{set@display@protect} to +% \cs{typeout}. ASAJ.} +% +% \begin{macro}{\typeout} +% Display something on the terminal. +% \begin{macrocode} +\def\typeout#1{\begingroup\set@display@protect + \immediate\write\@unused{#1}\endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newlinechar} +% A char to be used as new-line in output to files. +% \begin{macrocode} +\newlinechar`\^^J +% \end{macrocode} +% \end{macro} +% +% \subsection{Saved versions of \TeX{} primitives} +% +% The TeX primitive |\foo| is saved as |\@@foo|. +% The following primitives are handled in this way: +% \begin{macro}{\@@par} +% \begin{macrocode} +\let\@@par=\par +%\let\@@input=\input %%% moved earlier +%\let\@@end=\end %%% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@hyph} +% Save original primitive definition. +% \begin{macrocode} +\let\@@hyph=\- +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@@italiccorr} +% Save the original italic correction. +% \changes{v1.0a}{1994/03/07}{Macro added} +% \begin{macrocode} +\let\@@italiccorr=\/ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@height} +% \begin{macro}{\@depth} +% \begin{macro}{\@width} +% \begin{macro}{\@minus} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \begin{macro}{\@plus} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% +% The following definitions save token space. E.g., using +% |\@height| instead of height saves 5 tokens at the cost in time +% of one macro expansion. +% \begin{macrocode} +\def\@height{height} \def\@depth{depth} \def\@width{width} +\def\@minus{minus} +\def\@plus{plus} +% \end{macrocode} +% \begin{macro}{\hb@xt@} +% \changes{v1.2k}{1995/05/07}{Macro added} +% The next one is another 100 tokens worth. +% \begin{macrocode} +\def\hb@xt@{\hbox to} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\message{hacks,} +% \end{macrocode} +% +% \subsection{Command definitions} +% +% This section defines the following commands: +% +% \DescribeMacro +% {\@namedef}\marg{NAME}\\ Expands to |\def\|\marg{NAME}, +% except name can contain any characters. +% +% \DescribeMacro +% {\@nameuse}\marg{NAME}\\ +% Expands to |\|\marg{NAME}. +% +% \DescribeMacro +% {\@ifnextchar} X\marg{YES}\marg{NO}\\ +% Expands to \meta{YES} if next character is an `X', +% and to \meta{NO} otherwise. +% (Uses |\reserved@a|--|\reserved@c|.) +% NOTE: GOBBLES ANY SPACE FOLLOWING IT. +% +% \DescribeMacro +% {\@ifstar}\marg{YES}\marg{NO}\\ +% Gobbles following spaces and then tests if next the +% character is a '*'. If it is, then it gobbles the +% `*' and expands to \meta{YES}, otherwise it expands to \meta{NO}. +% +% \DescribeMacro +% {\@dblarg}\marg{CMD}\marg{ARG}\\ +% Expands to |\|\marg{CMD}\oarg{ARG}\marg{ARG}. Use +% |\@dblarg\CS| when |\CS| takes arguments |[ARG1]{ARG2}|, +% where default is| ARG1| = |ARG2|. +% +% \DescribeMacro +% {\@ifundefined}\marg{NAME}\marg{YES}\marg{NO}\\ +% : If \cs{NAME} is undefined then it executes \meta{YES}, +% otherwise it executes \meta{NO}. More precisely, +% true if \cs{NAME} either undefined or = |\relax|. +% +% \DescribeMacro +% {\@ifdefinable}|\NAME|\marg{YES} +% Executes \meta{YES} if the user is allowed to define |\NAME|, +% otherwise it gives an error. The user can define |\NAME| +% if |\@ifundefined{NAME}| is true, '|NAME|' $\neq$ '|relax|' +% and the first three letters of '|NAME|' are not +% '|end|', and if |\endNAME| is not defined. +% +% \DescribeMacro +% \newcommand|*|\marg{\cs{FOO}}\oarg{i}\marg{TEXT}\\ +% User command to define |\FOO| to be a macro with +% i arguments (i = 0 if missing) having the definition +% \meta{TEXT}. Produces an error if |\FOO| already +% defined. +% +% Normally the command is defined to be |\long| (ie it may +% take multiple paragraphs in its argument). In the +% star-form, the command is not defined as |\long| and a +% blank line in any argument to the command would generate +% an error. +% +% \DescribeMacro +% \renewcommand|*|\marg{\cs{FOO}}\oarg{i}\marg{TEXT}\\ +% Same as |\newcommand|, except it checks if |\FOO| already defined. +% +% \DescribeMacro +% \newenvironment|*|\marg{FOO}\oarg{i}\marg{DEF1}\marg{DEF2}\\ +% equivalent to:\\ +% |\newcommand{\FOO}[i]{DEF1}| |\def{\endFOO}{DEF2}|\\ +% (or the appropriate star forms). +% +% \DescribeMacro +% \renewenvironment\\ Obvious companion to |\newenvironment|. +% +% \DescribeMacro +% \@cons : See description of |\output| routine. +% +% \DescribeMacro{\@car} +% |\@car T1 T2 ... Tn\@nil| == |T1| (unexpanded) +% +% \DescribeMacro{\@cdr} +% |\@cdr T1 T2 ... Tn\@ni|l == |T2 ... Tn| (unexpanded) +% +% \DescribeMacro +% \typeout\marg{message}\\ Produces a warning message on the terminal. +% +% \DescribeMacro +% \typein\marg{message}\\ +% Types message, asks the user to type in a command, then +% executes it +% +% \DescribeMacro +% \typein\oarg{\cs{CS}}\marg{MSG}\\ +% Same as above, except defines |\CS| to be the input +% instead of executing it. +% +% \changes{LaTeX209}{1992/03/18} +% {(RMS) changed input channel from 0 to \cs{@inputcheck} to avoid +% conflicts with other channels allocated by \cs{newread}} +% +% \begin{macro}{\typein} +% +% \changes{v1.2k}{1995/05/08}{Use \cs{@firstofone}} +% \changes{v1.2l}{1995/05/08}{Remove unnecessary braces} +% \changes{v1.2l}{1995/05/08}{Replace \cs{def} by \cs{let}} +% \changes{v1.2m}{1995/05/24}{(DPC) New implementation} +% \changes{v1.2u}{1995/10/16}{(DPC) Use \cs{@testopt} /1911} +% \begin{macrocode} +\def\typein{% + \let\@typein\relax + \@testopt\@xtypein\@typein} +% \end{macrocode} +% +% \changes{v1.2r}{1995/10/03} +% {Add missing \cs{@typein} for /1710 (from patch file)} +% \changes{v1.4a}{2015/01/03}{use modified definition in luatex} +% \begin{macrocode} +\ifx\directlua\@undefined +% \end{macrocode} +% +% \begin{macrocode} +\def\@xtypein[#1]#2{% + \typeout{#2}% + \advance\endlinechar\@M + \read\@inputcheck to#1% + \advance\endlinechar-\@M + \@typein}% +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% +% \begin{macrocode} +\def\@xtypein[#1]#2{% + \typeout{#2}% + \begingroup \endlinechar\m@ne + \read\@inputcheck to#1% + \expandafter\endgroup + \expandafter\def\expandafter#1\expandafter{#1}% + \@typein}% +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@namedef} +% \begin{macrocode} +\def\@namedef#1{\expandafter\def\csname #1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nameuse} +% \begin{macrocode} +\def\@nameuse#1{\csname #1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@cons} +% \begin{macrocode} +\def\@cons#1#2{\begingroup\let\@elt\relax\xdef#1{#1\@elt #2}\endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@car} +% \begin{macro}{\@cdr} +% \begin{macrocode} +\def\@car#1#2\@nil{#1} +\def\@cdr#1#2\@nil{#2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@carcube} +% |\@carcube T1 ... Tn\@nil| = |T1| |T2| |T3| , $n > 3$ +% \begin{macrocode} +\def\@carcube#1#2#3#4\@nil{#1#2#3} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@onlypreamble} +% \begin{macro}{\@preamblecmds} +% This macro adds its argument to the list of commands stored in +% |\@preamblecmds| to be +% disabled after |\begin{document}|. These commands are redefined +% to generate |\@notprerr| at this point. +% \begin{macrocode} +\def\@preamblecmds{} +\def\@onlypreamble#1{% + \expandafter\gdef\expandafter\@preamblecmds\expandafter{% + \@preamblecmds\do#1}} +\@onlypreamble\@onlypreamble +\@onlypreamble\@preamblecmds +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@star@or@long} +% \changes{v1.2a}{1994/10/18}{macro added} +% Look ahead for a |*|. If present reset |\l@ngrel@x| so that +% the next definition, |#1|, will be non-long. +% \begin{macrocode} +\def\@star@or@long#1{% + \@ifstar + {\let\l@ngrel@x\relax#1}% + {\let\l@ngrel@x\long#1}} +% \end{macrocode} +% \end{macro} +% + +% \begin{macro}{\l@ngrel@x} +% This is either |\relax| or |\long| depending on whether the |*|-form +% of a definition command is being executed. +% \begin{macrocode} +\let\l@ngrel@x\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newcommand} +% \changes{LaTeX2e}{1993/11/23}{Macro reimplemented and extended} +% User level |\newcommand|.% +% \begin{macrocode} +\def\newcommand{\@star@or@long\new@command} +% \end{macrocode} +% +% \begin{macro}{\new@command} +% \changes{v1.2u}{1995/10/16}{(DPC) Use \cs{@testopt} /1911} +% \begin{macrocode} +\def\new@command#1{% + \@testopt{\@newcommand#1}0} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@newcommand} +% \changes{LaTeX2e}{1993/11/23}{Macro added} +% \begin{macro}{\@argdef} +% \changes{LaTeX2e}{1993/11/23}{Macro added} +% \begin{macro}{\@xargdef} +% \changes{LaTeX2e}{1993/11/23}{Macro interface changed} +% \changes{v1.1g}{2004/01/23}{Use kernel version of +% \cs{@ifnextchar} (pr/3501)} +% Handling arguments for |\newcommand|. +% \begin{macrocode} +\def\@newcommand#1[#2]{% + \kernel@ifnextchar [{\@xargdef#1[#2]}% + {\@argdef#1[#2]}} +% \end{macrocode} +% Define |#1| if it is definable. +% +% Both here and in |\@xargdef| the replacement text is absorbed as +% an argument because if we are not allowed to make the definition +% we have to get rid of it completely. +% \begin{macrocode} +\long\def\@argdef#1[#2]#3{% + \@ifdefinable #1{\@yargdef#1\@ne{#2}{#3}}} +% \end{macrocode} +% +% \changes{v1.2q}{1995/10/02} +% {New implementation, using \cs{@test@opt}} +% Handle the second optional argument. +% \begin{macrocode} +\long\def\@xargdef#1[#2][#3]#4{% + \@ifdefinable#1{% +% \end{macrocode} +% Define the actual command to be:\\ +% |\def\foo{\@protected@testopt\foo\\foo{default}}|\\ +% where |\\foo| is a csname generated from applying |\csname| and +% |\string| to |\foo|, ie the actual name contains a backslash and +% therefore can't clash easily with existing command names. +% ``Default'' is the contents of the second optional argument of +% |(re)newcommand|. +% +% \changes{v1.2z2}{1998/03/04} +% {Unnecessary \cs{expandafter} removed: pr/2758} +% \begin{macrocode} + \expandafter\def\expandafter#1\expandafter{% + \expandafter + \@protected@testopt + \expandafter + #1% + \csname\string#1\endcsname + {#3}}% +% \end{macrocode} +% Now we define the internal macro ie |\\foo| which is supposed to +% pick up all arguments (optional and mandatory). +% \begin{macrocode} + \expandafter\@yargdef + \csname\string#1\endcsname + \tw@ + {#2}% + {#4}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@testopt} +% \changes{v1.2q}{1995/10/02} +% {Macro added} +% \changes{v1.3a}{1999/01/07} +% {made long and brace optional arg. latex/2896} +% This macro encapsulates the most common call to |\@ifnextchar|, saving +% several tokens each time it is used in the definition of a command +% with an optional argument. +% |#1| The code to execute in the case that there is a |[| need not be +% a single token but can be any sequence of commands that `expects' to +% be followed by |[|. If this command were only used in |\newcommand| +% definitions then |#1| would be a single token and the braces could +% be omitted from |{#1}| in the definition below, saving a bit of +% memory. +% \changes{v1.1g}{2004/01/23}{Use kernel version of +% \cs{@ifnextchar} (pr/3501)} +% \begin{macrocode} +\long\def\@testopt#1#2{% + \kernel@ifnextchar[{#1}{#1[{#2}]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@protected@testopt} +% \changes{v1.2q}{1995/10/02} +% {Macro added} +% Robust version of |\@testopt|. The extra argument (|#1|) must be a +% single token. If protection is needed the call expands to |\protect| +% applied to this token, and the 2nd and 3rd arguments are +% discarded (by |\@x@protect|). Otherwise |\@testopt| is called on +% the 2nd and 3rd arguments. +% +% This method of making commands robust avoids the need for using up +% two csnames per command, the price is the extra expansion time +% for the |\ifx| test. +% \begin{macrocode} +\def\@protected@testopt#1{% + \ifx\protect\@typeset@protect + \expandafter\@testopt + \else + \@x@protect#1% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@yargdef} +% \begin{macro}{\@yargd@f} +% \changes{v1.3f}{1999/04/29}{New macro added} +% +% \changes{LaTeX2e}{1993/11/23}{Macro interface changed} +% \changes{LaTeX2e}{1993/11/23}{Avoid \cs{@?@?} token} +% \changes{v1.0b}{1994/03/12}{Name changed from \cs{XXX@argdef}} +% \changes{v1.3c}{1999/01/18}{New implementation DPC /2942} +% \changes{v1.3d}{1999/02/09}{catch bad argument forms by re-inserting \#3} +% \changes{v1.3f}{1999/04/29}{Full expansion and conversion needed +% for digit in new version, see pr/3013} +% +% These generate a primitive argument specification, from a +% \LaTeX\ |[|\meta{digit}|]| form; in fact \meta{digit} can be +% anything such that |\number|~\meta{digit} is single digit. +% +% Reorganised slightly so that |\renewcommand{\reserved@a}[1]{foo}| +% works. I am not sure this is worth it, as a following +% |\newcommand| would over-write the definition of |\reserved@a|. +% +% Recall that \LaTeX2.09 goes into an infinite loop with\\ +% |\renewcommand[1]{\@tempa}{foo}|\\ +% (DPC 6 October 93). +% +% Reorganised again (DPC 1999). Rather than make a loop to +% construct the argument spec by counting, just extract the +% required argument spec by using a delimited argument (delimited +% by the digit). This is faster and uses less tokens. The coding +% is slightly odd to preserve the old interface (using |#2| = +% |\tw@| as the flag to surround the first argument with |[]|. But +% the new method did not allow for the number of arguments |#3| not +% being given as an explicit digit; hence (further expansion of +% this argument and use of) |\number| was added later in 1999. +% +% It is not clear why these are still |\long|. +% +% \begin{macrocode} +\long \def \@yargdef #1#2#3{% + \ifx#2\tw@ + \def\reserved@b##11{[####1]}% + \else + \let\reserved@b\@gobble + \fi + \expandafter + \@yargd@f \expandafter{\number #3}#1% +} +% \end{macrocode} +% +% \begin{macrocode} +\long \def \@yargd@f#1#2{% + \def \reserved@a ##1#1##2##{% + \expandafter\def\expandafter#2\reserved@b ##1#1% + }% + \l@ngrel@x \reserved@a 0##1##2##3##4##5##6##7##8##9###1% +} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@reargdef} +% \changes{LaTeX2e}{1993/12/20} +% {Kept old version of \cs{@reargdef}, for array.sty} +% \changes{v1.0b}{1994/03/12}{New defn, in terms of \cs{@yargdef}} +% \changes{v1.2y}{1996/07/26}{third arg picked up by \cs{@yargdef}} +% \begin{macrocode} +\long\def\@reargdef#1[#2]{% + \@yargdef#1\@ne{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\renewcommand} +% Check the command name is already used. If not give an error +% message. Then temporarily +% disable |\@ifdefinable| then call |\newcommand|. (Previous +% version |\let#1=\relax| but this does not work too well if |#1| +% is |\@temp|\emph{a--e}.) +% \changes{LaTeX2e}{1993/11/23}{Macro reimplemented and extended} +% \changes{v1.1f}{1994/05/02}{Removed surplus \cs{space} in error} +% \begin{macrocode} +\def\renewcommand{\@star@or@long\renew@command} +% \end{macrocode} +% +% \begin{macro}{\renew@command} +% \changes{v1.2y}{1996/07/26}{use \cs{relax} in place of empty arg} +% \changes{v1.2y}{1996/07/26}{use \cs{noexpand} instead of \cs{string}} +% \changes{v1.2z1}{1997/10/21}{Use \cs{begingroup}/\cs{endgroup} rather +% than braces for grouping, to avoid generating empty math atom.} +% \changes{v1.5e}{2018/09/26}{Always explicitly generate a space after the csname and +% not rely on \cs{noexpand} to save tokens (git/41)} +% \begin{macrocode} +\def\renew@command#1{% + \begingroup \escapechar\m@ne\xdef\@gtempa{{\string#1}}\endgroup + \expandafter\@ifundefined\@gtempa + {\@latex@error{Command \string#1 undefined}\@ehc}% + \relax + \let\@ifdefinable\@rc@ifdefinable + \new@command#1} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{v1.0n}{1994/05/10}{Removed braces around \cs{@ifundefined} +% argument. ASAJ.} +% \changes{v1.0s}{1994/05/13}{Coded more efficiently, thanks to FMi.} +% +% \begin{macro}{\@ifdefinable} +% \begin{macro}{\@@ifdefinable} +% \begin{macro}{\@rc@ifdefinable} +% Test is user is allowed to define a command. +% \begin{macrocode} +\long\def\@ifdefinable #1#2{% + \edef\reserved@a{\expandafter\@gobble\string #1}% + \@ifundefined\reserved@a + {\edef\reserved@b{\expandafter\@carcube \reserved@a xxx\@nil}% + \ifx \reserved@b\@qend \@notdefinable\else + \ifx \reserved@a\@qrelax \@notdefinable\else + #2% + \fi + \fi}% + \@notdefinable} +% \end{macrocode} +% Saved definition of |\@ifdefinable|. +% \begin{macrocode} +\let\@@ifdefinable\@ifdefinable +% \end{macrocode} +% Version of |\@ifdefinable| for use with |\renewcommand|. Does +% not do the check this time, but restores the normal definition. +% \begin{macrocode} +\long\def\@rc@ifdefinable#1#2{% + \let\@ifdefinable\@@ifdefinable + #2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\newenvironment} +% Define a new user environment. +% |#1| is the environment name. |#2#| Grabs all the tokens up to +% the first |{|. These will be any optional arguments. They are not +% parsed at this point, but are just passed to |\@newenv| which +% will eventually call |\newcommand|. Any optional arguments will +% then be parsed by |\newcommand| as it defines the command that +% executes the `begin code' of the environment. +% +% This |#2#| trick removed with version 1.2i as it fails if a |{| +% occurs in the optional argument. Now use |\@ifnextchar| directly. +% \begin{macrocode} +\def\newenvironment{\@star@or@long\new@environment} +% \end{macrocode} +% +% \begin{macro}{\new@environment} +% \changes{v1.2i}{1995/04/25}{Parse arguments slowly but safely /1507} +% \changes{v1.2u}{1995/10/16}{(DPC) Use \cs{@testopt} /1911} +% \begin{macrocode} +\def\new@environment#1{% + \@testopt{\@newenva#1}0} +% \end{macrocode} +% +% \begin{macro}{\@newenva} +% \changes{v1.1g}{2004/01/23}{Use kernel version of +% \cs{@ifnextchar} (pr/3501)} +% \begin{macrocode} +\def\@newenva#1[#2]{% + \kernel@ifnextchar [{\@newenvb#1[#2]}{\@newenv{#1}{[#2]}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@newenvb} +% \changes{v1.3a}{1999/01/07} +% {made long and brace optional arg. latex/2896} +% \begin{macrocode} +\def\@newenvb#1[#2][#3]{\@newenv{#1}{[#2][{#3}]}} +% \end{macrocode} +% \end{macro} +% +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\renewenvironment} +% Redefine an environment. +% For |\renewenvironment| disable |\@ifdefinable| and then call +% |\newenvironment|. It is OK to |\let| the argument to |\relax| +% here as there should not be a |@temp|\ldots\ environment. +% \changes{LaTeX2e}{1993/11/23}{Macro reimplemented and extended} +% \changes{v1.1f}{1994/05/02}{Removed surplus \cs{space} in error} +% \begin{macrocode} +\def\renewenvironment{\@star@or@long\renew@environment} +% \end{macrocode} +% +% \begin{macro}{\renew@environment} +% \changes{v1.2a}{1994/10/18}{reset end command} +% \changes{v1.2y}{1996/07/26}{use \cs{relax} in place of empty arg} +% \begin{macrocode} +\def\renew@environment#1{% + \@ifundefined{#1}% + {\@latex@error{Environment #1 undefined}\@ehc + }\relax + \expandafter\let\csname#1\endcsname\relax + \expandafter\let\csname end#1\endcsname\relax + \new@environment{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@newenv} +% \changes{LaTeX2e}{1993/11/23}{Macro interface changed} +% \changes{v1.2h}{1994/11/24}{Added test for \cs{endgraf}} +% The internal version of |\newenvironment|. +% +% Call |\newcommand| to define the \meta{begin-code} for the +% environment. |\def| is used for the \meta{end-code} as it does +% not take arguments. (but may contain |\par|s) +% +% Make sure that an attempt to define a `graf' or `group' environment +% fails. +% \begin{macrocode} +\long\def\@newenv#1#2#3#4{% + \@ifundefined{#1}% + {\expandafter\let\csname#1\expandafter\endcsname + \csname end#1\endcsname}% + \relax + \expandafter\new@command + \csname #1\endcsname#2{#3}% + \l@ngrel@x\expandafter\def\csname end#1\endcsname{#4}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newif} +% \changes{v1.1l}{1995/05/24}{(DPC) New implementation} +% And here's a different sort of allocation: +% For example, +% |\newif\iffoo| creates |\footrue|, |\foofalse| to go with |\iffoo|. +% \begin{macrocode} +\def\newif#1{% + \count@\escapechar \escapechar\m@ne + \let#1\iffalse + \@if#1\iftrue + \@if#1\iffalse + \escapechar\count@} +% \end{macrocode} +% +% \begin{macro}{\@if} +% \begin{macrocode} +\def\@if#1#2{% + \expandafter\def\csname\expandafter\@gobbletwo\string#1% + \expandafter\@gobbletwo\string#2\endcsname + {\let#1#2}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\providecommand} +% |\providecommand| takes the same arguments as |\newcommand|, but +% discards them if |#1| is already defined, Otherwise it just acts like +% |\newcommand|. This implementation currently leaves any discarded +% definition in |\reserved@a| (and possibly |\\reserved@a|) this +% wastes a bit of space, but it will be reclaimed as soon as these +% scratch macros are redefined. +% +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \begin{macrocode} +\def\providecommand{\@star@or@long\provide@command} +% \end{macrocode} +% +% \begin{macro}{\provide@command} +% \changes{v1.2z}{1997/09/09}{Use \cs{begingroup} to avoid generating +% math ords if used in math mode. pr/2573} +% \begin{macrocode} +\def\provide@command#1{% + \begingroup + \escapechar\m@ne\xdef\@gtempa{{\string#1}}% + \endgroup + \expandafter\@ifundefined\@gtempa + {\def\reserved@a{\new@command#1}}% + {\def\reserved@a{\renew@command\reserved@a}}% + \reserved@a}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\CheckCommand} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \changes{v1.1e}{1994/05/20}{Changed name from \cs{@checkcommand} to +% \cs{CheckCommand}.} +% |\CheckCommand| takes the same arguments as |\newcommand|. If +% the command already exists, with the same definition, then +% nothing happens, otherwise a warning is issued. Useful for +% checking the current state befor a macro package starts +% redefining things. Currently two macros are considered to have +% the same definition if they are the same except for different +% default arguments. That is, if the old definition was: +% |\newcommand\xxx[2][a]{(#1)(#2)}| then +% |\CheckCommand\xxx[2][b]{(#1)(#2)}| would \emph{not} generate a +% warning, but, for instance |\CheckCommand\xxx[2]{(#1)(#2)}| +% would. +% \begin{macrocode} +\def\CheckCommand{\@star@or@long\check@command} +% \end{macrocode} +% |\CheckCommand| is only available in the preamble part of the +% document. +% \begin{macrocode} +\@onlypreamble\CheckCommand +% \end{macrocode} +% +% \begin{macro}{\check@command} +% \begin{macrocode} +\def\check@command#1#2#{\@check@c#1{#2}} +\@onlypreamble\check@command +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@check@c} +% \changes{v1.2i}{1995/04/25}{Make \cs{long} for latex/1346} +% |\CheckCommand| itself just grabs all the arguments we need, +% without actually looking for |[| optional argument forms. Now +% define |\reserved@a|. If |\\reserved@a| is then defined, compare it +% with the ``|\#1|' otherwise compare |\reserved@a| with |#1|. +% \begin{macrocode} +\long\def\@check@c#1#2#3{% + \expandafter\let\csname\string\reserved@a\endcsname\relax + \renew@command\reserved@a#2{#3}% + \@ifundefined{\string\reserved@a}% + {\@check@eq#1\reserved@a}% + {\expandafter\@check@eq + \csname\string#1\expandafter\endcsname + \csname\string\reserved@a\endcsname}} +\@onlypreamble\@check@c +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@check@eq} +% Complain if |#1| and |#2| are not |\ifx| equal. +% \begin{macrocode} +\def\@check@eq#1#2{% + \ifx#1#2\else + \@latex@warning@no@line + {Command \noexpand#1 has + changed.\MessageBreak + Check if current package is valid}% + \fi} +\@onlypreamble\@check@eq +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@gobble} +% \begin{macro}{\@gobbletwo} +% \begin{macro}{\@gobblefour} +% \changes{v1.2n}{1995/05/26}{(CAR) Added \cs{long}s} +% The |\@gobble| macro is used to get rid of its argument. +% \begin{macrocode} +\long\def \@gobble #1{} +\long\def \@gobbletwo #1#2{} +\long\def \@gobblefour #1#2#3#4{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@firstofone} +% \begin{macro}{\@firstoftwo} +% \begin{macro}{\@secondoftwo} +% Some argument-grabbers. +% \begin{macrocode} +\long\def\@firstofone#1{#1} +\long\def\@firstoftwo#1#2{#1} +\long\def\@secondoftwo#1#2{#2} +% \end{macrocode} +% \begin{macro}{\@iden} +% |\@iden| is another name for |\@firstofone| for +% compatibility reasons. +% \begin{macrocode} +\let\@iden\@firstofone +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@thirdofthree} +% Another grabber now used in the encoding specific +% section. +% \changes{v1.2z3}{1998/03/20}{Macro added} +% \begin{macrocode} +\long\def\@thirdofthree#1#2#3{#3} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@expandtwoargs} +% A macro to totally expand two arguments to another macro +% \begin{macrocode} +\def\@expandtwoargs#1#2#3{% +\edef\reserved@a{\noexpand#1{#2}{#3}}\reserved@a} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@backslashchar} +% A category code 12 backslash. +% \begin{macrocode} +\edef\@backslashchar{\expandafter\@gobble\string\\} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0n}{1994/05/10}{Added \cs{DeclareProtectedCommand}} +% \changes{v1.0p}{1994/05/12}{Fixed a bug with \cs{relax } which was +% using \cs{@gobble} before defining it.} +% \changes{v1.0q}{1994/05/13}{Renamed \cs{DeclareProtectedCommand} to +% \cs{DeclareRobustCommand}. Removed \cs{@if@short@command}. +% Moved to after the definition of \cs{@gobble}.} +% \changes{v1.0r}{1994/05/13}{Added logging message to +% \cs{DeclareProtectedCommand}.} +% +% \subsection{Robust commands and protect} +% +% \changes{v1.1b}{1994/05/17}{Added the discussion of protected +% commands, defined the values that \cs{protect} should have.} +% \changes{v1.1c}{1994/05/18}{Redid the discussion and definitions, in +% line with the proposed new setting of \cs{protect} in the output +% routine.} +% +% Fragile and robust commands are one of the thornier issues in +% \LaTeX's commands. Whilst typesetting documents, \LaTeX{} makes use +% of many of \TeX's features, such as arithmetic, defining macros, and +% setting variables. However, there are (at least) three different +% occasions when these commands are not safe. These are called +% `moving arguments' by \LaTeX, and consist of: +% \begin{itemize} +% \item writing information to a file, such as indexes or tables of +% contents. +% \item writing information to the screen. +% \item inside an |\edef|, |\message|, |\mark|, or other command which +% evaluates its argument fully. +% \end{itemize} +% The method \LaTeX{} uses for making fragile commands robust is to +% precede them with |\protect|. This can have one of five possible +% values: +% \begin{itemize} +% \item |\relax|, for normal typesetting. So |\protect\foo| will +% execute |\foo|. +% \item |\string|, for writing to the screen. So |\protect\foo| will +% write |\foo|. +% \item |\noexpand|, for writing to a file. So |\protect\foo| will +% write |\foo| followed by a space. +% \item |\@unexpandable@protect|, for writing a moving argument to a +% file. So |\protect\foo| will write |\protect\foo| followed by a +% space. This value is also used inside |\edef|s, |\mark|s and +% other commands which evaluate their arguments fully. +% More precisely, whenever the content of an |\edef| or |\xdef| etc.\ +% can contain arbitrary user input not under the direct control of the +% programmer, one should use |\proetected@edef| instead of |\edef|, etc., +% so that |\protect| has a suitable definition and the user input will +% not break if it contains fragile commands. +% \end{itemize} +% +% \changes{1.1b}{1994/05/17} +% {(ASAJ) Added the \cs{@protect@...} commands.} +% \changes{1.1c}{1994/05/18} +% {(ASAJ) Renamed the commands, and removed +% one which is no longer needed.} +% +% \begin{macro}{\@unexpandable@protect} +% \changes{1.2w}{1995/12/05}{Removed \cs{unexpandable@noexpand} as never used. internal/1733} +% \begin{macrocode} +\def\@unexpandable@protect{\noexpand\protect\noexpand} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2e}{1994/11/04}{Rewrote protected short commands +% using \cs{x@protect}. ASAJ.} +% +% \begin{macro}{\DeclareRobustCommand} +% \begin{macro}{\declare@robustcommand} +% This is a package-writers command, which has the same syntax as +% |\newcommand|, but which declares a protected command. It does +% this by having\\ +% |\DeclareRobustCommand\foo|\\ +% define |\foo| to be +% |\protect\foo<space>|,\\ +% and then use |\newcommand\foo<space>|.\\ +% Since the internal command is |\foo<space>|, when it is written +% to an auxiliary file, it will appear as |\foo|. +% +% We have to be a +% bit cleverer if we're defining a short command, such as |\_|, in +% order to make sure that the auxiliary file does not include a +% space after the command, since |\_ a| and |\_a| aren't the same. +% In this case we define |\_| to be: +%\begin{verbatim} +% \x@protect\_\protect\_<space> +%\end{verbatim} +% which expands to: +%\begin{verbatim} +% \ifx\protect\@typeset@protect\else +% \@x@protect@\_ +% \fi +% \protect\_<space> +%\end{verbatim} +% Then if |\protect| is |\@typeset@protect| (normally |\relax|) +% then we just perform |\_<space>|, and otherwise +% |\@x@protect@| gobbles everything up and expands to +% |\protect\_|. +% +% \emph{Note}: setting |\protect| to any value other than |\relax| +% whilst in `typesetting' mode will cause commands to go into an +% infinite loop! In particular, setting |\relax| to |\@empty| will +% cause |\_| to loop forever. It will also break lots of other +% things, such as protected |\ifmmode|s inside |\halign|s. If you +% really really have to do such a thing, then please set +% |\@typeset@protect| to be |\@empty| as well. (This is what the +% code for |\patterns| does, for example.) +% +% More fun with |\expandafter| and |\csname|. +% \begin{macrocode} +\def\DeclareRobustCommand{\@star@or@long\declare@robustcommand} +% \end{macrocode} +% +% \begin{macrocode} +\def\declare@robustcommand#1{% + \ifx#1\@undefined\else\ifx#1\relax\else + \@latex@info{Redefining \string#1}% + \fi\fi + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect + \noexpand#1% + \fi + \noexpand\protect + \expandafter\noexpand\csname + \expandafter\@gobble\string#1 \endcsname + }% + \let\@ifdefinable\@rc@ifdefinable + \expandafter\new@command\csname + \expandafter\@gobble\string#1 \endcsname +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@x@protect} +% \begin{macro}{\x@protect} +% +% \begin{macrocode} +\def\x@protect#1{% + \ifx\protect\@typeset@protect\else + \@x@protect#1% + \fi +} +\def\@x@protect#1\fi#2#3{% + \fi\protect#1% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@typeset@protect} +% +% \begin{macrocode} +\let\@typeset@protect\relax +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2e}{1994/11/04}{Added commands for setting and restoring +% \cs{protect}. ASAJ.} +% +% \begin{macro}{\set@display@protect} +% \begin{macro}{\set@typeset@protect} +% These macros set |\protect| appropriately for typesetting or +% displaying. +% \changes{v1.2o}{1995/07/03}{Use \cs{@typeset@protect} for init} +% \begin{macrocode} +\def\set@display@protect{\let\protect\string} +\def\set@typeset@protect{\let\protect\@typeset@protect} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\protected@edef} +% \begin{macro}{\protected@xdef} +% \begin{macro}{\unrestored@protected@xdef} +% \begin{macro}{\restore@protect} +% The commands |\protected@edef| and |\protected@xdef| perform +% `safe' |\edef|s and |\xdef|s, saving and restoring |\protect| +% appropriately. For cases where restoring |\protect| doesn't +% matter, there's an `unsafe' |\unrestored@protected@xdef|, useful +% if you know what you're doing! +% \begin{macrocode} +\def\protected@edef{% + \let\@@protect\protect + \let\protect\@unexpandable@protect + \afterassignment\restore@protect + \edef +} +\def\protected@xdef{% + \let\@@protect\protect + \let\protect\@unexpandable@protect + \afterassignment\restore@protect + \xdef +} +\def\unrestored@protected@xdef{% + \let\protect\@unexpandable@protect + \xdef +} +\def\restore@protect{\let\protect\@@protect} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\protect} +% The normal meaning of |\protect| +% \changes{v1.2j}{1995/04/29}{Init \cs{protect} here} +% \begin{macrocode} +\set@typeset@protect +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MakeRobust} +% \changes{v1.4a}{2015/01/08}{Added macro} +% +% The macro firstly checks if the controls sequence in question exists +% at all. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\MakeRobust}{\MakeRobust}% +%<*2ekernel|latexrelease> +\def\MakeRobust#1{% + \@ifundefined{\expandafter\@gobble\string#1}{% + \@latex@error{The control sequence `\string#1' is undefined!% + \MessageBreak There is nothing here to make robust}% + \@eha + }% +% \end{macrocode} +% Then we check if the macro is already robust. We do this by testing +% if the internal name for a robust macro is defined, namely +% \verb*=\foo =. If it is already defined do nothing, otherwise set +% \verb*=\foo = equal to \verb*=\foo= and redefine \verb*=\foo= so +% that it acts like a macro defined with \verb=\DeclareRobustCommand=. +% \begin{macrocode} + {% + \@ifundefined{\expandafter\@gobble\string#1\space}% + {% + \expandafter\let\csname + \expandafter\@gobble\string#1\space\endcsname=#1% + \edef\reserved@a{\string#1}% + \def\reserved@b{#1}% + \edef\reserved@b{\expandafter\strip@prefix\meaning\reserved@b}% + \edef#1{% + \ifx\reserved@a\reserved@b + \noexpand\x@protect\noexpand#1% + \fi + \noexpand\protect\expandafter\noexpand + \csname\expandafter\@gobble\string#1\space\endcsname}% + }% + {\@latex@info{The control sequence `\string#1' is already robust}}% + }% +}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\MakeRobust}{\MakeRobust}% +%<latexrelease>\let\MakeRobust\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \subsection{Internal defining commands} +% +% These commands are used internally to define other \LaTeX{} +% commands. +% \begin{macro}{\@ifundefined} +% \changes{LaTeX2e}{1993/11/23}{Redefined to remove a trailing \cs{fi}} +% Check if first arg is undefined or \cs{relax} and execute second or +% third arg depending, +% \changes{1.5c}{2018/01/06}{Avoid defining undefined commands to \cs{relax}} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2018-04-01}{\@ifundefined} +%<latexrelease>{Leave commands undefined in \@ifundefined}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% Version using |\ifcsname| to avoid defining undefined tokens to |\relax|. +% Defined here to simplify using unmatched |\fi|. +% \begin{macrocode} +\def\@ifundefined#1{% + \ifcsname#1\endcsname\@ifundefin@d@i\else\@ifundefin@d@ii\fi{#1}} +% \end{macrocode} +% \begin{macrocode} +\long\def\@ifundefin@d@i#1\fi#2{\fi + \expandafter\ifx\csname #2\endcsname\relax + \@ifundefin@d@ii + \fi + \@secondoftwo} +% \end{macrocode} +% \begin{macrocode} +\long\def\@ifundefin@d@ii\fi#1#2#3{\fi #2} +% \end{macrocode} +% Now test of engine. +% \begin{macrocode} +\ifx\numexpr\@undefined +% \end{macrocode} +% Classic version (should not be needed as etex is assumed). +% \begin{macrocode} +\def\@ifundefined#1{% + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} +\else\ifx\directlua\@undefined +% \end{macrocode} +% Use the |\ifcsname| defined above. +% \begin{macrocode} +\else +% \end{macrocode} +% Optimised version for Lua\TeX, using |\lastnamedcs| +% \begin{macrocode} +\def\@ifundefined#1{% + \ifcsname#1\endcsname + \expandafter\ifx\lastnamedcs\relax\else\@ifundefin@d@i\fi + \fi + \@firstoftwo} +% \end{macrocode} +% \begin{macrocode} +\long\def\@ifundefin@d@i#1#2#3#4#5{#1#2#5} +% \end{macrocode} +% \begin{macrocode} +\fi +\fi +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000-00-00}{\@ifundefined} +%<latexrelease>{Leave commands undefined in \@ifundefined}% +%<latexrelease>\def\@ifundefined#1{% +%<latexrelease> \expandafter\ifx\csname#1\endcsname\relax +%<latexrelease> \expandafter\@firstoftwo +%<latexrelease> \else +%<latexrelease> \expandafter\@secondoftwo +%<latexrelease> \fi} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@qend} +% \begin{macro}{\@qrelax} +% The following define |\@qend| and |\@qrelax| to be the strings +% `|end|' and `|relax|' with the characters |\catcode|d 12. +% \begin{macrocode} +\edef\@qend{\expandafter\@cdr\string\end\@nil} +\edef\@qrelax{\expandafter\@cdr\string\relax\@nil} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@ifnextchar} +% \changes{LaTeX209}{1992/08/24} +% {(Rms) \cs{@ifnextchar} didn't work if its +% first argument was an equal sign.} +% \changes{v1.2q}{1995/10/02} +% {Use \cs{@let@token} } +% \changes{v1.3a}{1999/01/07} +% {made long} +% \changes{v1.3b}{1999/01/07} +% {extra \cs{long}. latex/2902} +% \changes{v1.3e}{1999/03/01} +% {remove extra \cs{long}. internal/2967} +% |\@ifnextchar| peeks at the following character and compares it +% with its first argument. If both are the same it executes its +% second argument, otherwise its third. +% \begin{macrocode} +\long\def\@ifnextchar#1#2#3{% + \let\reserved@d=#1% + \def\reserved@a{#2}% + \def\reserved@b{#3}% + \futurelet\@let@token\@ifnch} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kernel@ifnextchar} +% \changes{v1.3g}{2004/01/23}{Added macro (pr/3501)} +% This macro is the kernel version of |\@ifnextchar| which is used +% in a couple of places to prevent the AMS variant from being used +% since in some places this produced chaos (for example +% if an \texttt{fd} file +% is loaded in a random place then the optional argument to +% |\ProvidesFile| could get printed there instead of being written +% only in the log file. This happened +% when there was a space or a newline between the mandatory and +% optional arguments! It should really be fixed in the +% \texttt{amsmath} package one day, but\ldots +% +% Note that there may be other places in the kernel where this version +% should be used rather than the original, but variable, version. +% +% \begin{macrocode} +\let\kernel@ifnextchar\@ifnextchar +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@ifnch} +% |\@ifnch| is a tricky macro to skip any space tokens that may +% appear before the character in question. If it encounters a space +% token, it calls \@xifnch. +% \changes{v1.2q}{1995/10/02} +% {Use \cs{@let@token} for internal/924, save \cs{reserved@e}} +% \begin{macrocode} +\def\@ifnch{% + \ifx\@let@token\@sptoken + \let\reserved@c\@xifnch + \else + \ifx\@let@token\reserved@d + \let\reserved@c\reserved@a + \else + \let\reserved@c\reserved@b + \fi + \fi + \reserved@c} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@sptoken} +% The following code makes |\@sptoken| a space token. It is +% important here that the control sequence |\:| consists of +% a non-letter only, so that the following whitespace is +% significant. Together with the fact that the equal sign +% in a |\let| may be followed by only one optional space +% the desired effect is achieved. +% NOTE: the following hacking must precede the definition of |\:| +% as math medium space. +% \begin{macrocode} +\def\:{\let\@sptoken= } \: % this makes \@sptoken a space token +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xifnch} +% In the following definition of |\@xifnch|, |\:| is again used +% to get a space token as delimiter into the definition. +% \begin{macrocode} +\def\:{\@xifnch} \expandafter\def\: {\futurelet\@let@token\@ifnch} +% \end{macrocode} +% \end{macro} + +% \changes{v1.0n}{1994/05/10}{Added \cs{makeatletter} and +% \cs{makeatother} ASAJ.} +% +% \begin{macro}{\makeatletter} +% \begin{macro}{\makeatother} +% Make internal control sequences accessible or inaccessible. +% \begin{macrocode} +\def\makeatletter{\catcode`\@11\relax} +\def\makeatother{\catcode`\@12\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@ifstar} +% \changes{v1.2u}{1995/10/16}{(DPC) New implementation, for /1910} +% The new implementation below avoids passing the \meta{true code} +% Through one more |\def| than the \meta{false code}, which previously +% meant that |#| had to be written as |####| in one argument, but |##| +% in the other. The |*| is gobbled by |\@firstoftwo|. +% \begin{macrocode} +\def\@ifstar#1{\@ifnextchar *{\@firstoftwo{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dblarg} +% \begin{macro}{\@xdblarg} +% \changes{v1.1g}{2004/01/23}{Use kernel version of +% \cs{@ifnextchar} (pr/3501)} +% \begin{macrocode} +\long\def\@dblarg#1{\kernel@ifnextchar[{#1}{\@xdblarg{#1}}} +\long\def\@xdblarg#1#2{#1[{#2}]{#2}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@sanitize} +% The command |\@sanitize| changes the catcode of all special characters +% except for braces to `other'. It can be used for commands like +% |\index| that want to write their arguments verbatim. Needless to +% say, this command should only be executed within a group, or chaos +% will ensue. +% +% \begin{macrocode} +\def\@sanitize{\@makeother\ \@makeother\\\@makeother\$\@makeother\&% +\@makeother\#\@makeother\^\@makeother\_\@makeother\%\@makeother\~} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@onelevel@sanitize} +% \changes{v1.2c}{1994/10/30}{Macro added} +% +% This makes the whole ``meaning'' of |#1| (its one-level +% expansion) into catcode 12 tokens: it could be used in +% |\DeclareRobustCommand|. +% +% If it is to be used on default float specifiers, this should be +% done when they are defined. +% \begin{macrocode} +\def \@onelevel@sanitize #1{% + \edef #1{\expandafter\strip@prefix + \meaning #1}% +} +% \end{macrocode} +% \end{macro} +% +% \section{Discretionary Hyphenation} +% \begin{macro}{\-} +% \changes{1.2x}{1995/12/13}{Documentation changed.} +% \changes{v1.5a}{2017/03/13}{Define \cs{-} in terms of \cs{hyphenchar}} +% \begin{macro}{\@dischyph} +% \changes{v1.0g}{1994/04/12} +% {Define \cs{@dischyph}, was previously in ltboxes.dtx} +% \changes{v1.5b}{2017/03/27}{Define \cs{@dischyph} after \cs{-}} +% \end{macro} +% Moved here to be after the definition of |\DeclareRobustCommand|. +% +% The primitive |\-| command adds a discretionary hyphen using the +% current font's |\hyphenchar|. Monospace fonts are usually declared +% with |\hyphenchar| set to $-1$ to suppress hyhenation. +% +% \LaTeX, from \LaTeX2.09 in 1986 defined |\-| by +% \begin{verbatim} +% \def\-{\discretionary{-}{}{}} +% \end{verbatim} +% The following comment was added when these commands were first set +% up, 19 April 1986: +% \begin{quote} +% the |\-| command is redefined to allow it to work in the |\ttfamily| +% type style, where automatic hyphenation is suppressed by setting +% |\hyphenchar| to~$-1$. The original primitive \TeX{} definition is +% saved as |\@@hyph| just in case anyone needs it. +% \end{quote} +% +% \LaTeXe, between 1993 and 2017, had a comment at this point +% saying that the definition ``would probably change'' because +% the definition always uses |-|. The definition used below +% was given in comments at this point during time. +% +% In 2017 we finally enabled this definition by default, with the +% older \LaTeX\ definition accessible via \textsf{latexrelease} +% as usual. +% +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/04/15}{\-}{Use \hyphenchar in \-}% +% \end{macrocode} +% Temporary definition of |\@latex@info|, final definition is later. +% \begin{macrocode} +%<*2ekernel> +\def\@latex@info#1{} +%</2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +%<*2ekernel|latexrelease> +\DeclareRobustCommand{\-}{% + \discretionary{% + \char \ifnum\hyphenchar\font<\z@ + \defaulthyphenchar + \else + \hyphenchar\font + \fi + }{}{}% +} +\let\@dischyph=\- +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\-}{Use \hyphenchar in \-}% +%<latexrelease>\def\-{\discretionary{-}{}{}} +%<latexrelease>\let\@dischyph=\- +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% Delayed from |ltvers.dtx| +% \begin{macrocode} +\newif\if@includeinrelease +\@includeinreleasefalse +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx b/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx new file mode 100644 index 00000000000..75f9e1d5320 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltdirchk.dtx @@ -0,0 +1,993 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% +% \iffalse +%%% From File: ltdirchk.dtx +% +%<*unstripped> +\ifx\documentclass\undefined\let\next\relax\else\def\next{% +%</unstripped> +%<*driver> +% \fi +\ProvidesFile{ltdirchk.dtx} + [2016/10/15 v1.2b LaTeX Kernel (System Dependent Parts)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltdirchk.dtx} +\title{\filename\thanks{% + this document also includes the source for + texsys.cfg and ltxcheck.tex}} +\author{David Carlisle} +\date{\filedate} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +%<*unstripped> +}\fi\next +%</unstripped> +% \fi +% +% \changes{v0.2j}{1994/02/25} +% {Remove need for drv file} +% \changes{v0.2k}{1994/03/01} +% {Add unstripped module, +% so that dircheck.dtx may be used with initex} +% \changes{v1.0a}{1994/03/08} +% {Reorganise driver module into `new style'} +% \changes{v1.0b}{1994/03/12} +% {Change name from dircheck.dtx} +% \changes{v1.0b}{1994/03/12} +% {Minor edits to the typeouts in ltxcheck} +% \changes{v1.0d}{1994/03/28} +% {Improve documentation} +% \changes{v1.0i}{1994/11/03} +% {Generate an error if latex.ltx not used with clean initex} +% \changes{v1.0j}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0r}{1996/06/13} +% {documentation improvements mainly from internal/2174} +% \changes{v1.0v}{1997/06/16} +% {documentation improvements mainly from internal/2520} +% \changes{v1.0w}{1998/08/17}{(RmS) Documentation improvements.} +% +% +% \section{\LaTeX\ System Dependent Initialisations} +% +% \changes{v0.2g}{1994/01/21} +% {Improve documentation, reorganise docstrip module} +% +% This file implements the semi-automatic determination of various +% system dependent parts of the initialisation. The actual definitions +% may be placed in a file |texsys.cfg|. Thus for operating systems for +% which the tests here do not result in acceptable settings, a `hand +% written' |texsys.cfg| may be produced. +% +% The macros that must be defined are: +% +% \DescribeMacro{\@currdir} +% |\@currdir|\meta{filename}\meta{space} should expand to a form of the +% filename that uniquely refers to the `current directory' if this is +% possible. (The expansion should also end with a space.) on UNIX, +% this is |\def\@currdir{./}|. For more exotic operating systems you may +% want to make |\@currdir| a macro with arguments delimited by |.| +% and/or \meta{space}. If the operating system has no concept of +% directory structure, this macro should be defined to be empty. +% +% +% \DescribeMacro{\input@path} +% If the primitive |\openin| searches the same directories as the +% primitive |\input|, then it is possible to tell (using |\ifeof|) +% whether a file exists before trying to input it. For systems like +% this, |\input@path| should be left undefined. +% +% If |\openin| does not `follow' |\input| then |\input@path| must be +% defined to be a list of directories to search for input files. The +% format for each directory is as for |\@currdir|, normally just a +% prefix is required, but it may be a macro with space-delimited +% argument. That is, if \meta{dir} is an entry in the input path, +% \TeX\ will try to load the expansion of +% \meta{dir}\meta{filename}\meta{space} +% +% So either \meta{dir} should be defined as a macro with argument +% delimited by space, or it should just expand to a directory name, +% including the final directory separator, so that it may be +% concatenated with the \meta{filename}. This means that for UNIX-like +% syntax, each \meta{dir} should end with a slash, |/|. +% +% |\input@path| should expand to a list of such directories, each in a +% |{}| group. +% +% \DescribeMacro{\filename@parse} +% After a call of the form: |\filename@parse{|\meta{filename}|}|, the +% three macros |\filename@area|,|\filename@base|,|\filename@ext| should +% be defined to be the `area' (or directory), basename and +% extension respectively. If there was no extension specified in +% \meta{filename}, |\filename@ext| should be |\let| to |\relax| (so this +% case may be tested with |\@ifundefined{filename@ext}| and, perhaps a +% default extension substituted). +% +% Normally one would not need to define this macro in |texsys.cfg| as +% the automatic tests can supply parsers that work with UNIX and VMS and +% Macintosh syntax, as well as a basic parser that will cover many other +% cases. However some operating systems may need a `hand produced' +% parser in which case it should be defined in this file. +% +% The UNIX parser also works for most MSDOS \TeX\ versions. +% Currently if the UNIX, VMS or Macintosh parser is not used, +% |\filename@parse| is defined to always return an empty area, and to +% split the argument into basename and extension at the first `|.|' +% that occurs in the name. +% Parsers for other formats may be defined in |texsys.cfg|, +% in which case they will be used in preference to the default +% definitions. +% +% \DescribeMacro{\@TeXversion} +% \changes{v1.0f}{1994/05/23}{Document \cs{@TeXversion}} +% |\@TeXversion| is now set automatically by the initialisation tests +% in this file. You should not need to set it in |texsys.cfg|, however +% the following documentation is left for information. \LaTeX\ does +% not set this variable exactly, the automatic tests set it to:\\ +% |2| for any version, $v$, $v < 3.0$\\ +% |3| for any version, $v$, $3.0 \leq v \leq 3.14$\\ +% \meta{undefined} otherwise.\\ +% However these values are accurate enough for \LaTeX\ to take +% appropriate action for these old \TeX{}s. +% +% If your \TeX\ is older than version 3.141, then you should define +% |\@TeXversion| (using |\def|) to be the version number. If you do not +% do this\footnote +% {Actually if your \TeX\ is really old, version~2, \LaTeX\ can +% detect this, and sets \cs{@TeXversion} to~2 if it is not set in +% the \texttt{cfg} file.} +%, \LaTeX\ will not work around a bug in old \TeX\ versions, and +% so error messages will appear in a very strange format, with |^^J| +% appearing instead of line breaks: +% \begingroup\catcode`\==\active \def=#1#2{}\hfuzz\maxdimen +%\begin{verbatim} +%! LaTeX Error: \rubbish undefined.^^J^^JSee the LaTeX manual or LaTeX= +% Companion +% for explanation.^^JType H <return> for immediate help. +% ... +% +%l.3 \renewcommand{\rubbish} +% {} +%? +%\end{verbatim} +% \endgroup\noindent +% However if you put |\def\@TeXversion{3.14}| in \texttt{texsys.cfg} +% the following format will be used: +%\begin{verbatim} +%! LaTeX Error: \rubbish undefined. +% +%See the LaTeX manual or LaTeX Companion for explanation. +%Type H <return> for immediate help. +%! . +% ... +% +%l.3 \renewcommand{\rubbish} +% {} +%? +%\end{verbatim} +% Note that this has an extra line |! .| which does not appear in +% error messages that use the default settings with a current version of +% \TeX, but this should not cause any confusion we hope. +% +% \StopEventually{} +% +% \section{Initialisation} +% As this file is read at a very early stage, some definitions that +% are normally considered to be part of the format must be made here. +% +% \subsection{INITEX} +% \changes{v0.2i}{1994/01/25} +% {Protect against looping on \cs{@@input} and \cs{@@end}.} +% \begin{macrocode} +%<*dircheck> +%<*initex> +%<initex>\ifnum\catcode`\{=1 +%<initex> \errmessage +%<initex> {LaTeX must be made using an initex with no format preloaded} +%<initex>\fi +\catcode`\{=1 +\catcode`\}=2 +% \end{macrocode} +% \changes{v1.1}{2015/01/03}{Enable extra primitives when Lua\TeX{} is used} +% \changes{v1.2}{2015/08/23}{Do not use luatex prefix} +% \changes{v1.2a}{2015/10/02}{Allow backing out of unprefixed names} +% If Lua\TeX{} is in use the extensions and other new primitives +% have to be activated: this is done as early as possible. Older +% versions of Lua\TeX{} do not hide the primitives: a version check is +% not needed as the version itself will be missing in the case where +% action is needed! +% \begin{macrocode} +\ifx\directlua\undefined +\else + \ifx\luatexversion\undefined +% \end{macrocode} +% Enable e-TeX/pdfTeX/Umath primitives with their natural names +% \begin{macrocode} + \directlua{tex.enableprimitives("",% + tex.extraprimitives('etex', 'pdftex', 'umath'))} +% \end{macrocode} +% +% In current formats enable primitives with unprefixed names. +% the \textsf{latexrelease} guards allow the primitives to be +% defined with a |\luatex| prefix if older formats are specified. +% \begin{macrocode} +%</initex> +%</dircheck> +%<*initex,latexrelease> +%<latexrelease>\ifx\directlua\undefined\else +%<latexrelease>\IncludeInRelease{2015/10/01}{\luatexluafunction} +%<latexrelease> {LuaTeX (prefixed names)}% + \directlua{tex.enableprimitives("",% + tex.extraprimitives("omega", "aleph", "luatex"))} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\luatexluafunction} +%<latexrelease> {LuaTeX (prefixed names)}% +%<latexrelease>\directlua{ +%<latexrelease> tex.enableprimitives( +%<latexrelease> "luatex", +%<latexrelease> tex.extraprimitives("core","omega", "aleph", "luatex") +%<latexrelease> ) +%<latexrelease> local i +%<latexrelease> local t = { } +%<latexrelease> for _,i in pairs(tex.extraprimitives("luatex")) do +%<latexrelease> if not string.match(i,"^U") then +%<latexrelease> if not string.match(i, "^luatex") then +%<latexrelease> table.insert(t,i) +%<latexrelease> end +%<latexrelease> else +%<latexrelease> if string.match(i,"^Uchar$") then +%<latexrelease> table.insert(t,i) +%<latexrelease> end +%<latexrelease> end +%<latexrelease> end +%<latexrelease> for _,i in pairs(t) do +%<latexrelease> tex.print( +%<latexrelease> "\noexpand\\let\noexpand\\" .. i +%<latexrelease> .. "\noexpand\\undefined" +%<latexrelease> ) +%<latexrelease> end +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\fi +%</initex,latexrelease> +%<*dircheck> +%<*initex> +% \end{macrocode} +% +% \begin{macrocode} + \fi +\fi +% \end{macrocode} +% +% \changes{v1.2b}{2016/10/15}{Require e\TeX{}} +% A test can now be made for e\TeX{}. +% \begin{macrocode} +%<initex>\ifx\eTeXversion\undefined +%<initex> \errmessage +%<initex> {LaTeX requires e-TeX} +%<initex> \expandafter\endinput +%<initex>\fi +% \end{macrocode} +% +% That distraction over, back to the basics of a format. +% \begin{macrocode} +\catcode`\#=6 +\catcode`\^=7 +\chardef\active=13 +\catcode`\@=11 +\countdef\count@=255 +\let\bgroup={ \let\egroup=} +\ifx\@@input\@undefined\let\@@input\input\fi +\ifx\@@end\@undefined\let\@@end\end\fi +\chardef\@inputcheck0 +\chardef\sixt@@n=16 +\newlinechar`\^^J +\def\typeout{\immediate\write17} +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\_\do\%\do\~} +\def\@makeother#1{\catcode`#1=12\relax} +\def\space{ } +\def\@tempswafalse{\let\if@tempswa\iffalse} +\def\@tempswatrue{\let\if@tempswa\iftrue} +\let\if@tempswa\iffalse +\def\loop#1\repeat{\def\iterate{#1\relax\expandafter\iterate\fi}% + \iterate \let\iterate\relax} +\let\repeat\fi +%</initex> +% \end{macrocode} +% +% \subsection{Some bits of 2e} +% \begin{macrocode} +%<*2ekernel> +\def\two@digits#1{\ifnum#1<10 0\fi\number#1} +\long\def\@firstoftwo#1#2{#1} +\long\def\@secondoftwo#1#2{#2} +% \end{macrocode} +% \changes{v1.0e}{1994/05/11} +% {Add \cs{ProvidesFile} as used in fd files.} +% \changes{v1.0l}{1995/10/17} +% {Modify initex version of \cs{ProvidesFile}} +% \changes{v1.0n}{1995/11/01} +% {Initialise \cs{@addtofilelist} to \cs{@gobble}} +% This is a special version of |\ProvidesFile| for initex use. +% \changes{v1.0x}{2001/05/25}{Explicitly set catcode of +% \cs{endlinechar} to 10 (pr/3334)} +% \changes{v1.0y}{2001/06/04}{But only if it is a char (pr/3334)} +% \begin{macrocode} +\def\ProvidesFile#1{% + \begingroup + \catcode`\ 10 % + \ifnum \endlinechar<256 % + \ifnum \endlinechar>\m@ne + \catcode\endlinechar 10 % + \fi + \fi + \@makeother\/% + \@ifnextchar[{\@providesfile{#1}}{\@providesfile{#1}[]}} +\def\@providesfile#1[#2]{% + \wlog{File: #1 #2}% + \@addtofilelist{ #2}% + \endgroup} +\long\def\@addtofilelist#1{} +% \end{macrocode} +% +% \begin{macrocode} +\def\@empty{} +\catcode`\%=12 +\def\@percentchar{%} +\catcode`\%=14 +\let\@currdir\@undefined +\let\input@path\@undefined +\let\filename@parse\@undefined +% \end{macrocode} +% \begin{macro}{\strip@prefix} +% \changes{v0.2a}{1993/12/13} +% {modified, name changed from \cs{stripmeaning}.} +% \changes{v0.2e}{1994/01/19} +% {name changed from \cs{strip@meaning}, to match NFSS.} +% \begin{macrocode} +\def\strip@prefix#1>{} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \section{texsys.cfg} +% As mentioned above, any site specific definitions required to describe +% the filename handling must be entered into a file |texsys.cfg|. If +% |texsys.cfg| can not be located by |\openin|, we write a default +% version out. The default version only contains comments, so we do not +% actually input the file in that case. The automatic tests later will, +% hopefully, correctly define the required macros. +% +% The tricky code below checks to see if |texsys.cfg| exists. If it does +% not, all the text in this file between START and END is copied +% verbatim to a new file |texsys,cfg|. If |texsys.cfg| is found, then it +% is simply input. This is only done when this file is being used +% unstripped. +% \begin{macrocode} +%<*docstrip> +\openin15=texsys.cfg +\ifeof15 +\typeout{** Writing a default texsys.cfg} +\immediate\openout15=texsys.cfg +\begingroup +\catcode`\^^M\active% +\let^^M\par% +\def\reserved@a#1^^M{% + \def\reserved@b{#1}% + \ifx\reserved@b\reserved@c\endgroup\else% + \immediate\write15{#1}% + \expandafter\reserved@a\fi}% +\def\reserved@d#1START^^M{\let\do\@makeother\dospecials\reserved@a}% +\catcode`\%=12 +\def\reserved@c{%END} +\reserved@d +% \end{macrocode} +%START +% \subsection{texsys.cfg} +% +% This file contains the site specific definitions of the four macros\\ +% |\@currdir|, |\input@path|, |\filename@parse| and |\@TeXversion|. +% +% As distributed it only contains comments, however this `empty' +% file will work on many systems because of the automatic tests built +% into |ltdirchk.dtx|. You \emph{are} allowed to edit this file to add +% definitions of these macros appropriate to your system. +% +% +% The macros that must be defined are: +% +% \DescribeMacro{\@currdir} +% |\@currdir|\meta{filename}\meta{space} should expand to a form of the +% filename that uniquely refers to the `current directory' if this is +% possible. (The expansion should also end with a space.) on UNIX, +% this is |\def\@currdir{./}|. For more exotic operating systems you may +% want to make |\@currdir| a macro with arguments delimited by |.| +% and/or \meta{space}. If the operating system has no concept of +% directory structure, this macro should be defined to be empty. +% +% +% \DescribeMacro{\input@path} +% If the primitive |\openin| searches the same directories as the +% primitive |\input|, then it is possible to tell (using |\ifeof|) +% whether a file exists before trying to input it. For systems like +% this, |\input@path| should be left undefined. +% +% If |\openin| does not `follow' |\input| then |\input@path| must be +% defined to be a list of directories to search for input files. The +% format for each directory is as for |\@currdir|, normally just a +% prefix is required, but it may be a macro with space-delimited +% argument. That is, if \meta{dir} is an entry in the input path, +% \TeX will try to load the expansion of +% +% \meta{dir}\meta{filename}\meta{space} +% +% So either \meta{dir} should be defined as a macro with argument +% delimited by space, or it should just expand to a directory name, +% including the final directory separator, so that it may be +% concatenated with the \meta{filename}. This means that for UNIX-like +% syntax, each \meta{dir} should end with a slash, |/|. One exception to +% this rule is that the input path should \emph{always} contain the +% empty directory |{}| as this will allow `full pathnames' to be used, +% and the `current directory' to be searched. +% +% |\input@path| should expand to a list of such directories, each in a +% |{}| group. +% +% +% \DescribeMacro{\filename@parse} +% After a call of the form: |\filename@parse{|\meta{filename}|}|, the +% three macros |\filename@area|,|\filename@base|,|\filename@ext| should +% be defined to be the `area' (or directory), basename and +% extension respectively. If there was no extension specified in +% \meta{filename}, |\filename@ext| should be |\let| to |\relax| (so this +% case may be tested with |\@ifundefined{filename@ext}| and, perhaps a +% default extension substituted). +% +% Normally one would not need to define this macro in |texsys.cfg| as +% the automatic tests can supply parsers that work with UNIX and VMS +% syntax, as well as a basic parser that willcover many other cases. +% However some operating systems may need a `hand produced' parser +% in which case it should be defined in this file. +% +% The UNIX parser also works for most MSDOS \TeX\ versions. +% Currently if the UNIX or VMS parser is not used, |\filename@parse| is +% defined to always return an empty area, and to split the argument into +% basename and extension at the first `|.|' that occurs in the name. +% Parsers for other formats may be defined in |texsys.cfg|, +% in which case they will be used in preference to the default +% definitions. +% +% +% \DescribeMacro{\@TeXversion} +% You should not need to set this macro in |texsys.cfg|. \LaTeX\ +% tests to set this automatically. See the comments in the opening +% section of \texttt{ltdirchk.dtx}. +% +% +% The following sections give examples of definitions which might +% work on various systems. These are currently mainly untested as I only +% have access to a few systems, all of which do not need this file as +% the automatic tests work. All the code is commented out. +% +% \subsection{UNIX (web2c)} +% This implementation does make |\openin| and |\input| look in the same +% places. Acceptable settings are made by |ltdirchk.dtx|, and so this +% file may be empty. The definitions below are therefore just for +% information. +% \begin{macrocode} +%\def\@currdir{./} +%\let\input@path\@undefined +% \end{macrocode} +% +% \subsection{UNIX (other)} +% Apparently some commercial UNIX implementations have different paths +% for |\openin| and |\input|. For these one could use definitions like +% the following (with whatever directories are used at your site): +% note that the directory names should end with |/|. +% \begin{macrocode} +% \def\@currdir{./} +% \def\input@path{% +% {/usr/local/lib/tex/inputs/distrib/}% +% {/usr/local/lib/tex/inputs/contrib/}% +% {/usr/local/lib/tex/inputs/local/}% +% } +% \end{macrocode} +% +% \subsection{MSDOS (emtex)} +% This implementation does make |\openin| and |\input| look in the same +% places. Acceptable settings are made by |ltdirchk.dtx|, and so this +% file may be empty. The definitions below are therefore just for +% information. +% \begin{macrocode} +% \def\@currdir{./} +% \let\input@path\@undefined +% \end{macrocode} +% +% \subsection{MSDOS (other)} +% Some PC implementations have different paths +% for |\openin| and |\input|. For these one could use definitions like +% the following (with whatever directories are used at your site): +% note that the directory names should end with |/|. +% This assumes the implementation uses UNIX style |/| as the directory +% separator. +% \begin{macrocode} +% \def\@currdir{./} +% \def\input@path{% +% {c:/tex/inputs/distrib/}% +% {c:/tex/inputs/contrib/}% +% {c:/tex/inputs/local/}% +% } +% \end{macrocode} +% +% \subsection{VMS (DECUS \TeX, PD VMS 3.6)} +% This implementation does make |\openin| and |\input| look in the same +% places. Acceptable settings are made by |ltdirchk.dtx|, and so this +% file may be empty. The definitions below are therefore just for +% information. +% \begin{macrocode} +% \def\@currdir{[]} +% \let\input@path\@undefined +% \end{macrocode} +% +% \subsection{VMS (???)} +% Some VMS implementations have different paths +% for |\openin| and |\input|. For these one could use definitions like +% the following: +% \begin{macrocode} +% \def\@currdir{[]} +% \def\input@path{% +% {tex_inputs:}% +% {SOMEDISK:[SOME.TEX.DIRECTORY]}% +% } +% \end{macrocode} +% +% \subsection{MACINTOSH (OzTeX 1.6)} +% This implementation does make |\openin| and |\input| look in the same +% places. Acceptable settings are made by |ltdirchk.dtx|, and so this +% file may be empty. The definitions below are therefore just for +% information. +% \begin{macrocode} +% \def\@currdir{:} +% \let\input@path\@undefined +% \end{macrocode} +% +% \subsection{MACINTOSH (other)} +% Some Macintosh implementations have different paths +% for |\openin| and |\input|. For these one could use definitions like +% the following (with whatever folders are used on your machine): +% note that the directory names should end with |:|, and they should +% contain {\em no\/} spaces. +% \begin{macrocode} +% \def\@currdir{:} +% \def\input@path{% +% {Hard-Disk:Applications:TeX:TeX-inputs:}% +% {Hard-Disk:Applications:TeX:My-inputs:}% +% } +% \end{macrocode} +% +% \subsection{FAKE EXAMPLE} +% This example is for an operating system that has filenames of the +% form |<area>name| For maximum compatibility with macro sets, +% you want |name.ext| to be mapped to |<ext>name|. +% and |<area>name.ext| to be mapped to |<area.ext>name|. +% |\input| does this mapping automatically, but |\openin| does not, and +% does not look in the same places as |\input|. +% |<>name| is the desired `current directory' syntax. +% +% the following code would possibly work: +% \begin{macrocode} +% \def\@dir#1#2 {% +% \@d@r{#1}#2..\@nil} +% \def\@d@r#1#2.#3.#4\@nil{% +% <\ifx\@dir#1\@dir\else#1\ifx\@dir#3\@dir\else.\fi\fi#3>#2 } +% +% \def\@currdir{\@dir{}} +% \def\input@path{% +% {\@dir{area.one}}% +% {\@dir{area.two}}% +% } +% \end{macrocode} +%END +% \begin{macrocode} +\immediate\closeout15 +% \end{macrocode} +% If |texsys.cfg| did exist, then input it. +% \begin{macrocode} +\else +\typeout{** Using the existing texsys.cfg} +\closein15 +\input texsys.cfg +\fi +%</docstrip> +% \end{macrocode} +% +% If the stripped version of this file is being used (in latex2e.ltx) +% then texsys.cfg should be there, so just input it. +% \begin{macrocode} +%<dircheck>\input texsys.cfg +% \end{macrocode} +% +% \changes{v0.2f}{1994/01/20} +% {\cs{@copytexsys} and the texsys.new file removed} +% +% \section{Setting \texttt{\cs{@currdir}}} +% +% \begin{macro}{\@currdir} +% \begin{macro}{\IfFileExists} +% \changes{v0.2e}{1994/01/19} +% {name changed from \cs{test}} +% This is a local definition of |\IfFileExists|. It tries to relocate +% |texsxys.aux|. If it succeeds, then the |\@currdir| syntax has been +% determined. If all the tests fail then |\@currdir| will be set to +% |\@empty|, and |ltxcheck| will warn of this when it checks the format. +% \begin{macrocode} +\begingroup +\count@\time +\divide\count@ 60 +\count2=-\count@ +\multiply\count2 60 +\advance\count2 \time +% \end{macrocode} +% +% \begin{macro}{\today} +% The current date and time stamp. +% \changes{v0.2g}{1994/01/21} +% {Name changed from \cs{stamp}, to save memory} +% \begin{macrocode} +\edef\today{% + \the\year/\two@digits{\the\month}/\two@digits{\the\day}:% + \two@digits{\the\count@}:\two@digits{\the\count2}} +% \end{macrocode} +% \end{macro} +% +% Create a file |texsys.aux| (hopefully in the current directory), +% then try to locate it again. +% \begin{macrocode} +\immediate\openout15=texsys.aux +\immediate\write15{\today^^J} +\immediate\closeout15 % +% \end{macrocode} +% +% |#1| is the file to try, |#2| is what to do on success, |#3| on +% failure. Note that this definition is overwritten later on again! +% \begin{macrocode} +\def\IfFileExists#1#2#3{% + \openin\@inputcheck#1 % + \ifeof\@inputcheck + #3\relax + \else + \read\@inputcheck to \reserved@a + \ifx\reserved@a\today + \typeout{#1 found}#2\relax + \else + \typeout{BAD: old file \reserved@a (should be \today)}% + #3\relax + \fi + \fi + \closein\@inputcheck} +% \end{macrocode} +% +% \begin{macrocode} +\endlinechar=-1 +% \end{macrocode} +% +% If |\@currdir| has not been pre-defined in |texsys.cfg| then test for +% UNIX, VMS and Oz-\TeX-Mac. syntax. +% \changes{v0.2h}{1994/01/24} +% {Stop testing once texsys.aux has been found} +% \begin{macrocode} +\ifx\@currdir\@undefined + \IfFileExists{./texsys.aux}{\gdef\@currdir{./}}% + {\IfFileExists{[]texsys.aux}{\gdef\@currdir{[]}}% + {\IfFileExists{:texsys.aux}{\gdef\@currdir{:}}{}}} +% \end{macrocode} +% If it is still undefined at this point, all the above tests failed. +% Earlier versions interactively prompted for a definition at this +% point, but it seems impossible to reliably obtain information from +% users at this point in the installation. This version of the file +% produces a format with no user-interaction. Later if the format is not +% suitable for the system, |texsys.cfg| may be edited and the format +% re-made. +% \changes{v0.2a}{1993/12/13} +% {Removed interactive prompting for current directory syntax} +% \changes{v0.2f}{1994/01/20} +% {\cs{@copytexsys} removed} +% \changes{v1.0u}{1996/12/06} +% {*** removed from various messages for GNU Make. +% internal/2338} +% \begin{macrocode} + \ifx\@currdir\@undefined + \global\let\@currdir\@empty + \typeout{^^J^^J% + !! No syntax for the current directory could be found^^J% + }% + \fi +% \end{macrocode} +% Otherwise |\@currdir| was defined in |texsys.cfg|. In this case check +% that the syntax specified works on this system. (In case a complete +% \LaTeX\ system has been copied from one system to another.) If the +% test fails, give up. The installer should remove or correct the +% offending |texsys.cfg| and try again. +% \begin{macrocode} +\else + \IfFileExists{\@currdir texsys.aux}{}{% + \edef\reserved@a{\errhelp{% + texsys.cfg specifies the current directory syntax to be^^J% + \meaning\@currdir^^J% + but this does not work on this system.^^J% + Remove texsys.cfg and restart.}}\reserved@a + \errmessage{Bad texsys.cfg file: \noexpand\@currdir}\@@end} +% \end{macrocode} +% The version of |\@currdir| in |texsys.cfg| looks OK. +% \begin{macrocode} +\fi +% \end{macrocode} +% \changes{v0.2d}{1994/01/14} +% {Close the texsys.aux output stream} +% \begin{macrocode} +\immediate\closeout15 % +\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\typeout{^^J^^J% + \noexpand\@currdir set to: + \expandafter\strip@prefix\meaning\@currdir.^^J% + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \changes{v0.2a}{1993/12/13} +% {on the `docstrip' pass, do not check openin path} +% +% Stop here if the file is being used unstripped. +% \begin{macrocode} +%<*docstrip> +\relax\endinput +%</docstrip> +% \end{macrocode} +% +% \section{Setting \texttt{\cs{input@path}}} +% +% Earlier versions of this file attempted to automatically test whether +% |\input@path| was required, and interactively prompt for a path if +% necessary. This was not found to be very reliable The first-time +% installer of \LaTeXe\ can not be expected to have enough information +% to supply the correct information to the prompts. Now the interaction +% is omitted. After the format is made the installer can attempt to run +% the test document |ltxcheck.tex| through \LaTeXe. This will check, +% amongst other things, whether |texsys.cfg| will need to be edited and +% the format remade. +% +% \begin{macro}{\input@path} +% Now set up the |\input@path|. +% +% |\input@path| should either be undefined, or a list of directories as +% described in the introduction. +% \changes{v0.2e}{1994/01/19} +% {No longer check that an empty group is in the path} +% \begin{macrocode} + \typeout{^^J% + Assuming \noexpand\openin and \noexpand\input^^J% + \ifx\input@path\@undefined +% \end{macrocode} +% |\input@path| has not been pre-defined. +% \begin{macrocode} + have the same search path.^^J% + \else +% \end{macrocode} +% |\input@path| has been defined in |texsys.cfg|. +% \begin{macrocode} + have different search paths.^^J% + LaTeX will use the path specified by \noexpand\input@path:^^J% + \fi + } +% \end{macrocode} +% \end{macro} +% +% \section{Filename Parsing} +% +% \begin{macro}{\filename@parse} +% Split a filename into its components. +% \changes{v0.2g}{1994/01/21} +% {Minor changes, and add Mac version (:)} +% \begin{macrocode} +\ifx\filename@parse\@undefined + \def\reserved@a{./}\ifx\@currdir\reserved@a +% \end{macrocode} +% |\filename@parse| was not specified in |texsys.cfg|, but |\@currdir| +% looks like UNIX\ldots +% \begin{macrocode} + \typeout{^^JDefining UNIX/DOS style filename parser.^^J} + \def\filename@parse#1{% + \let\filename@area\@empty + \expandafter\filename@path#1/\\} +% \end{macrocode} +% +% Search for the last |/|. +% \begin{macrocode} + \def\filename@path#1/#2\\{% + \ifx\\#2\\% + \def\reserved@a{\filename@simple#1.\\}% + \else + \edef\filename@area{\filename@area#1/}% + \def\reserved@a{\filename@path#2\\}% + \fi + \reserved@a} +% \end{macrocode} +% +% \begin{macrocode} + \else\def\reserved@a{[]}\ifx\@currdir\reserved@a +% \end{macrocode} +% |\filename@parse| was not specified in |texsys.cfg|, but |\@currdir| +% looks like VMS\ldots +% \begin{macrocode} + \typeout{^^JDefining VMS style filename parser.^^J} + \def\filename@parse#1{% + \let\filename@area\@empty + \expandafter\filename@path#1]\\} +% \end{macrocode} +% +% Search for the last |]|. +% \begin{macrocode} + \def\filename@path#1]#2\\{% + \ifx\\#2\\% + \def\reserved@a{\filename@simple#1.\\}% + \else + \edef\filename@area{\filename@area#1]}% + \def\reserved@a{\filename@path#2\\}% + \fi + \reserved@a} +% \end{macrocode} +% +% \begin{macrocode} + \else\def\reserved@a{:}\ifx\@currdir\reserved@a +% \end{macrocode} +% |\filename@parse| was not specified in |texsys.cfg|, but |\@currdir| +% looks like Macintosh\ldots +% \begin{macrocode} + \typeout{^^JDefining Mac style filename parser.^^J} + \def\filename@parse#1{% + \let\filename@area\@empty + \expandafter\filename@path#1:\\} +% \end{macrocode} +% +% Search for the last |:|. +% \changes{v1.0g}{1994/05/25} +% {Mac parser had " typo for :} +% \begin{macrocode} + \def\filename@path#1:#2\\{% + \ifx\\#2\\% + \def\reserved@a{\filename@simple#1.\\}% + \else + \edef\filename@area{\filename@area#1:}% + \def\reserved@a{\filename@path#2\\}% + \fi + \reserved@a} +% \end{macrocode} +% +% \begin{macrocode} + \else +% \end{macrocode} +% |\filename@parse| was not specified in |texsys.cfg|. +% So just make a simple parser that always sets |\filename@area| to +% empty. +% \begin{macrocode} + \typeout{^^JDefining generic filename parser.^^J} + \def\filename@parse#1{% + \let\filename@area\@empty + \expandafter\filename@simple#1.\\} + \fi\fi\fi +% \end{macrocode} +% +% |\filename@simple| is used by all three versions. +% Finally we can split off the extension. +% \begin{macrocode} + \def\filename@simple#1.#2\\{% + \ifx\\#2\\% + \let\filename@ext\relax + \else + \edef\filename@ext{\filename@dot#2\\}% + \fi + \edef\filename@base{#1}} +% \end{macrocode} +% +% Remove a final dot, added earlier. +% \begin{macrocode} + \def\filename@dot#1.\\{#1} +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% Otherwise, |\filename@parse| was specified in |texsys.cfg|. +% \begin{macrocode} + \typeout{^^J^^J% + \noexpand\filename@parse was defined in texsys.cfg:^^J% + \expandafter\strip@prefix\meaning\filename@parse.^^J% + } +\fi +% \end{macrocode} +% \end{macro} +% +% \section{\TeX\ Versions} +% +% \begin{macro}{\@TeXversion} +% \TeX\ versions older than than 3.141 require |\@TeXversion| to be +% set. This can be determined automatically due to a trick suggested +% by Bernd Raichle. (Actually this will not always get the correct +% version number, eg \TeX3.14 would be detected as \TeX3, but \LaTeX\ +% only needs to take account of \TeX's older than 3, or between 3 and +% 3.14. +% \changes{v1.0h}{1994/10/11} +% {Check for TeX3.14} +% \begin{macrocode} +\ifx\@TeXversion\@undefined + \ifx\@undefined\inputlineno + \def\@TeXversion{2} + \else + {\catcode`\^^J=\active + \def\reserved@a#1#2\@@{\if#1\string^3\fi} + \edef\reserved@a{\expandafter\reserved@a\string^^J\@@} + \ifx\reserved@a\@empty\else\gdef\@TeXversion{3}\fi} + \fi +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</dircheck> +% \end{macrocode} +% +% \section{ltxcheck.tex} +% After the format has been made, and article.cls moved with the +% other files to the `standard input directory' as specified in +% |install.txt|, the format may be checked by running the file +% |ltxcheck.tex|. +% \changes{v0.2f}{1994/01/20} +% {Modify all of ltxcheck} +% \changes{v1.0h}{1994/10/11} +% {Modify all of ltxcheck again} +% \changes{v1.0t}{1996/09/25} +% {Move ltxcheck to separate file} +% +% +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/lterror.dtx b/Master/texmf-dist/source/latex-dev/base/lterror.dtx new file mode 100644 index 00000000000..daf645b8b8c --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/lterror.dtx @@ -0,0 +1,763 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: lterror.dtx +%<*driver> +% \fi +\ProvidesFile{lterror.dtx} + [2018/08/05 v1.2p LaTeX Kernel (errors)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{lterror.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.1a}{1994/05/16}{(ASAJ) Completely new error interface.} +% \changes{v1.1b}{1994/05/17}{(ASAJ) Moved error stuff from +% ltdefns.dtx.} +% \changes{v1.1c}{1994/05/20}{(ASAJ) Added \cs{@latex@info@no@line}.} +% \changes{v1.1c}{1994/05/20}{(ASAJ) Added missing full stops.} +% \changes{v1.1c}{1994/05/20}{(ASAJ) Fixed a bug with +% \cs{@inmatherr}.} +% \changes{v1.1d}{1994/05/21}{(ASAJ) Made the error commands robust.} +% \changes{v1.1e}{1994/05/22}{(ASAJ) Replaced bgroup by begingroup in +% error messages, to stop extra mathords creeping into math mode.} +% \changes{v1.2a}{1994/05/22}{(ASAJ) Replaced \cs{@generic@message} and +% \cs{@generic@error} by \cs{GenericError}, \cs{GenericWarning} and +% \cs{GenericInfo}.} +% \changes{v1.2a}{1994/05/22}{(ASAJ) Made \cs{GenericError}, +% \cs{GenericWarning} and \cs{GenericInfo} robust.} +% \changes{v1.2a}{1994/05/22}{(ASAJ) Replaced \cmd\\ and tilde by +% \cs{MessageBreak} and \cs{space}.} +% \changes{v1.2a}{1994/05/22}{(ASAJ) Replaces \cs{string} by +% \cs{protect} in some messages.} +% \changes{v1.2f}{1994/05/24}{(DPC) wrap long lines} +% \changes{v1.2h}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.2i}{1995/09/01} +% {Add autoload support} +% \changes{v1.2j}{1995/10/09} +% {Modify autoload support} +% \changes{v1.2o}{2015/02/21} +% {Removed autoload support} +% \changes{v1.2p}{2016/10/15} +% {Require e\TeX{}} +% +% \section{Error handling} +% +% This section defines \LaTeX's error commands. +% +% \StopEventually{} +% +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% The `2ekernel' code ensures that a |\usepackage{autoerr}| is +% essentially ignored if a `full' format is being used that has +% the error messages already in the format. +% +% These days we don't support autoloading approach any longer, but +% this part bit is kept in case it is used in old documents. +% \begin{macrocode} +\expandafter\let\csname ver@autoerr.sty\endcsname\fmtversion +% \end{macrocode} +% +% +% \subsection{General commands} +% +% \begin{macro}{\MessageBreak} +% This command prints a new-line inside a message, followed by a +% continuation line begun with |\@msg@continuation|. Normally it is +% defined to be |\relax|, but inside messages, it is let to +% |\@message@break|. +% \begin{macrocode} +\let\MessageBreak\relax +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2g}{1994/11/04}{Added \cs{set@display@protect} to +% \cs{Generic*} commands. ASAJ.} +% +% \begin{macro}{\GenericInfo} +% This takes two arguments: a continuation and a message, and sends +% the result to the log file. +% \begin{macrocode} +\DeclareRobustCommand{\GenericInfo}[2]{% + \begingroup + \def\MessageBreak{^^J#1}% + \set@display@protect + \immediate\write\m@ne{#2\on@line.}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\GenericWarning} +% This takes two arguments: a continuation and a message, and sends +% the result to the screen. +% \begin{macrocode} +\DeclareRobustCommand{\GenericWarning}[2]{% + \begingroup + \def\MessageBreak{^^J#1}% + \set@display@protect + \immediate\write\@unused{^^J#2\on@line.^^J}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\GenericError} +% This macro takes four arguments: a continuation, +% an error message, where to go for further information, and the help +% information. It displays the error message, and sets the error help +% (the result of typing |h| to the prompt), and does a horrible hack +% to turn the last context line (which by default is the only context +% line) into just three dots. This could be made more efficient. +% \changes{v1.2d}{1994/05/22} +% {(DPC) New version using long command name.} +% \changes{v1.2d}{1994/05/22} +% {(DPC) Alternative version added for old TeXs} +% \begin{macrocode} +\bgroup +\lccode`\@=`\ % +\lccode`\~=`\ % +\lccode`\}=`\ % +\lccode`\{=`\ % +\lccode`\T=`\T% +\lccode`\H=`\H% +\catcode`\ =11\relax% +\lowercase{% +\egroup% +% \end{macrocode} +% +% Unfortunately \TeX\ versions older than 3.141 have a bug which means +% that |^^J| does not force a linebreak in |\message| and |\errmessage| +% commands. So for these old \TeX's we use |\typeout| to produce the +% message, and then have an empty |\errmessage| command. This causes an +% extra line of the form +%\begin{verbatim} +%! . +%\end{verbatim} +% To appear on the terminal, but if you do not like it, you can always +% upgrade your \TeX! In order for your format to use this version, you +% must define the macro |\@TeXversion| to be the version number, e.g., +% 3.14 of the underlying \TeX. See the comments in +% \texttt{ltdircheck.dtx}. +% \begin{macrocode} +\dimen@\ifx\@TeXversion\@undefined4\else\@TeXversion\fi\p@% +\ifdim\dimen@>3.14\p@% +% \end{macrocode} +% +% First the `standard case'. +% \begin{macrocode} +\DeclareRobustCommand{\GenericError}[4]{% +\begingroup% +\immediate\write\@unused{}% +\def\MessageBreak{^^J}% +\set@display@protect% +\edef% +% %<-------------------do not delete this space!------------------->% +\@err@ % +{{#4}}% +\errhelp +% %<-------------------do not delete this space!------------------->% +\@err@ % +\let +% %<-------------------do not delete this space!------------------->% +\@err@ % +\@empty +\def\MessageBreak{^^J#1}% +\def~{\errmessage{% +#2.^^J^^J% +#3^^J% +Type H <return> for immediate help% +% %<-------------------do not delete this space!------------------->% +\@err@ % +}}% +~% +\endgroup}% +% \end{macrocode} +% +% \begin{macrocode} +\else% +% \end{macrocode} +% +% Secondly the version for old \TeX's. +% \begin{macrocode} +\DeclareRobustCommand{\GenericError}[4]{% +\begingroup% +\immediate\write\@unused{}% +\def\MessageBreak{^^J}% +\set@display@protect% +\edef% +% %<-------------------do not delete this space!------------------->% +\@err@ % +{{#4}}% +\errhelp +% %<-------------------do not delete this space!------------------->% +\@err@ % +\let +% %<-------------------do not delete this space!------------------->% +\@err@ % +\errmessage +\def\MessageBreak{^^J#1}% +\def~{\typeout{! % +#2.^^J^^J% +#3^^J% +Type H <return> for immediate help.}% +% %<-------------------do not delete this space!------------------->% +\@err@ % +{}}% +~% +\endgroup}% +% \end{macrocode} +% +% \begin{macrocode} +\fi}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\PackageError} +% \begin{macro}{\PackageWarning} +% \begin{macro}{\PackageWarningNoLine} +% \begin{macro}{\PackageInfo} +% \begin{macro}{\ClassError} +% \begin{macro}{\ClassWarning} +% \begin{macro}{\ClassWarningNoLine} +% \begin{macro}{\ClassInfo} +% These commands are intended for use by package and class writers, to +% give information to authors. The syntax is: +% \begin{quote} +% |\PackageError{|\meta{package}|}{|^^A +% \meta{error}|}{|\meta{help}|}| \\ +% |\PackageWarning{|\meta{package}|}{|\meta{warning}|}| \\ +% |\PackageWarningNoLine{|\meta{package}|}{|\meta{warning}|}| \\ +% |\PackageInfo{|\meta{package}|}{|\meta{info}|}| +% \end{quote} +% and similarly for classes. The |Error| commands print the +% \meta{error} message, and present the interactive prompt; if the +% author types |h|, then the \meta{help} information is displayed. +% The |Warning| commands produce a warning but do not present the +% interactive prompt. The |WarningNoLine| commands do the same, +% but don't print the input line number. The |Info| commands write +% the message to the +% |log| file. Within the messages, the command +% |\MessageBreak| can be used to +% break a line, |\protect| can be used to protect command names, +% and |\space| is a space, for example: +% \begin{verbatim} +% \newcommand{\foo}{FOO} +% \PackageWarning{ethel}{% +% Your hovercraft is full of eels,\MessageBreak +% and \protect\foo\space is \foo} +% \end{verbatim} +% produces: +% \begin{verbatim} +% Package ethel warning: Your hovercraft is full of eels, +% (ethel) and \foo is FOO on input line 54. +% \end{verbatim} +% +% \begin{macrocode} +\gdef\PackageError#1#2#3{% + \GenericError{% + (#1)\@spaces\@spaces\@spaces\@spaces + }{% + Package #1 Error: #2% + }{% + See the #1 package documentation for explanation.% + }{#3}% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\PackageWarning#1#2{% + \GenericWarning{% + (#1)\@spaces\@spaces\@spaces\@spaces + }{% + Package #1 Warning: #2% + }% +} +\def\PackageWarningNoLine#1#2{% + \PackageWarning{#1}{#2\@gobble}% +} +\def\PackageInfo#1#2{% + \GenericInfo{% + (#1) \@spaces\@spaces\@spaces + }{% + Package #1 Info: #2% + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\gdef\ClassError#1#2#3{% + \GenericError{% + (#1) \space\@spaces\@spaces\@spaces + }{% + Class #1 Error: #2% + }{% + See the #1 class documentation for explanation.% + }{#3}% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\ClassWarning#1#2{% + \GenericWarning{% + (#1) \space\@spaces\@spaces\@spaces + }{% + Class #1 Warning: #2% + }% +} +\def\ClassWarningNoLine#1#2{% + \ClassWarning{#1}{#2\@gobble}% +} +\def\ClassInfo#1#2{% + \GenericInfo{% + (#1) \space\space\@spaces\@spaces + }{% + Class #1 Info: #2% + }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@latex@error} +% \begin{macro}{\@latex@warning} +% \begin{macro}{\@latex@warning@no@line} +% \begin{macro}{\@latex@info} +% \begin{macro}{\@latex@info@no@line} +% \changes{v1.2e}{1994/05/24}{Macro added} +% Errors and other info, for use in the \LaTeX{} core. +% \begin{macrocode} +\gdef\@latex@error#1#2{% + \GenericError{% + \space\space\space\@spaces\@spaces\@spaces + }{% + LaTeX Error: #1% + }{% + See the LaTeX manual or LaTeX Companion for explanation.% + }{#2}% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\@latex@warning#1{% + \GenericWarning{% + \space\space\space\@spaces\@spaces\@spaces + }{% + LaTeX Warning: #1% + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\@latex@warning@no@line#1{% + \@latex@warning{#1\@gobble}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@latex@info#1{% + \GenericInfo{% + \@spaces\@spaces\@spaces + }{% + LaTeX Info: #1% + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\@latex@info@no@line#1{% + \@latex@info{#1\@gobble}} +% \end{macrocode} +% +% |\@font@warning| and |\@font@info| are defined later since they +% have to be redefined by the \texttt{tracefnt} package. +%\begin{verbatim} +%\def\@font@warning#1{% +% \GenericWarning{% +% {(font)\@spaces\@spaces}% +% {Font Warning: #1}% +% } +%\def\@font@info#1{% +% \GenericInfo{% +% (font)\space\@spaces +% }{% +% Font Info: #1% +% }% +% } +%\end{verbatim} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\c@errorcontextlines} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% |\errorcontextlines| as a \LaTeX\ counter, so that it may be be +% manipulated with |\setcounter| (once it is defined :-) +% \begin{macrocode} +\let\c@errorcontextlines\errorcontextlines +\c@errorcontextlines=-1 +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0d}{1994/03/28} +% {Remove test for \cs{inputlineno} undefined.} +% \begin{macro}{\on@line} +% The message ` on input line~$n$'. +% \begin{macrocode} +\def\on@line{ on input line \the\inputlineno} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@warning} +% \begin{macro}{\@@warning} +% \begin{macro}{\@latexerr} +% Older \LaTeX{} messages. For the moment, these +% |\let| to the new message commands. They may be changed later, +% once only obsolete packages and classes contain them. +% \changes{v1.0b}{1993/12/03}{Set \cs{c@errorcontextlines} to -1} +% \changes{v1.0e}{1993/04/09}{Mention The Companion} +% \changes{v1.0f}{1993/04/11}{Remove setting of errorcontextlines} +% \changes{v1.0k}{1994/05/01}{(CAR) Added draft \cs{@latexinfo}.} +% \changes{v1.0n}{1994/05/10}{(ASAJ) Added extra blank lines to +% \cs{@latexerr}.} +% \changes{v1.0o}{1994/05/11} +% {(ASAJ) Removed one of the extra blank lines to \cs{@latexerr}.} +% \begin{macrocode} +\let\@warning\@latex@warning +\let\@@warning\@latex@warning@no@line +\global\let\@latexerr\@latex@error +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@spaces} +% Four spaces. +% \begin{macrocode} +\def\@spaces{\space\space\space\space} +% \end{macrocode} +% \end{macro} +% +% \subsection{Specific errors} +% +% \begin{macro}{\@eha} +% \begin{macro}{\@ehb} +% \begin{macro}{\@ehc} +% \begin{macro}{\@ehd} +% The more common error help messages. +% \begin{macrocode} +\gdef\@eha{% + Your command was ignored.\MessageBreak + Type \space I <command> <return> \space to replace it % + with another command,\MessageBreak + or \space <return> \space to continue without it.} +\gdef\@ehb{% + You've lost some text. \space \@ehc} +\gdef\@ehc{% + Try typing \space <return> % + \space to proceed.\MessageBreak + If that doesn't work, type \space X <return> \space to quit.} +\gdef\@ehd{% + You're in trouble here. \space\@ehc} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@notdefinable} +% Error message generated in |\@ifdefinable| from calls +% to one of the commands |\newcommand|, |\newlength| or |\newtheorem| +% specifying an already-defined command name or one that begins +% |\end...|. +% \changes{v1.2n}{1998/05/28}{Added message re `end...' pr/1555} +% \begin{macrocode} +\gdef\@notdefinable{% + \@latex@error{% + Command \@backslashchar\reserved@a\space + already defined.\MessageBreak + Or name \@backslashchar\@qend... illegal, + see p.192 of the manual}\@eha} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nolnerr} +% Generated by |\newline| and |\\| when called in vertical mode. +% \begin{macrocode} +\gdef\@nolnerr{% + \@latex@error{There's no line here to end}\@eha} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nocounterr} +% \changes{v1.0h}{1994/04/17}{New name for error message, +% old error message (without arg) kept} +% Generated by |\setcounter|, |\addtocounter| or +% |\newcounter| if applied to an undefined counter \meta{cnt}. +% +% \begin{macro}{\@nocnterr} +% Obsolete error message generated in \LaTeX2.09 by +% |\setcounter|, |\addtocounter| or |\newcounter| +% for undefined counter. +% DO NOT use for \LaTeXe\ it MIGHT vanish! +% Use |\@nocounterr|\marg{cnt} instead. +% \begin{macrocode} +\gdef\@nocounterr#1{% + \@latex@error{No counter '#1' defined}\@eha} +\gdef\@nocnterr{\@nocounterr?} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@ctrerr} +% Called when trying to print the value of a counter +% numbered by letters that's greater than 26. +% \begin{macrocode} +\gdef\@ctrerr{% + \@latex@error{Counter too large}\@ehb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nodocument} +% Error produced if paragraphs are typeset in the preamble. +% \changes{v1.2m}{1996/11/04}{Always define \cs{@nodocument} +% in kernel, so that it can be cleared by \cs{document}.} +% \begin{macrocode} +\gdef\@nodocument{% + \@latex@error{Missing \protect\begin{document}}\@ehd} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badend} +% Called by |\end| that doesn't match its |\begin|. +% RmS 1992/08/24: added code to |\@badend| to display position of +% non-matching |\begin|. +% FMi 1993/01/14: missing space added. +% \begin{macrocode} +\gdef\@badend#1{% + \@latex@error{\protect\begin{\@currenvir}\@currenvline + \space ended by \protect\end{#1}}\@eha} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badmath} +% Called by |\[|, |\]|, |\(| or |\)| when used in wrong mode. +% \begin{macrocode} +\gdef\@badmath{% + \@latex@error{Bad math environment delimiter}\@eha} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@toodeep} +% Called by a list environment nested more than six levels +% deep, or an enumerate or itemize nested more than four levels. +% \begin{macrocode} +\gdef\@toodeep{% + \@latex@error{Too deeply nested}\@ehd} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badpoptabs} +% Called by |\endtabbing| when not enough |\poptabs| have +% occurred, or by |\poptabs| when too many have occurred. +% \begin{macrocode} +\gdef\@badpoptabs{% + \@latex@error{\protect\pushtabs\space and \protect\poptabs + \space don't match}\@ehd} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badtab} +% Called by |\>|, |\+| , |\-| or |\<| when stepping to an undefined tab. +% \begin{macrocode} +\gdef\@badtab{% + \@latex@error{Undefined tab position}\@ehd} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@preamerr} +% This error is special: it appears in places where we normally have +% to |\protect| expansions. However, to prevent a protection of +% the error message itself (which would result in the message +% getting printed not issued on the terminal) we need to locally +% reset |\protect| to |\relax|. +% \begin{macrocode} +\gdef\@preamerr#1{% + \begingroup + \let\protect\relax + \@latex@error{\ifcase #1 Illegal character\or + Missing @-exp\or Missing p-arg\fi\space + in array arg}\@ehd + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badlinearg} +% Occurs in |\line| and |\vector| command when a bad slope +% argument is encountered. +% \begin{macrocode} +\gdef\@badlinearg{% + \@latex@error{% + Bad \protect\line\space or \protect\vector + \space argument}\@ehb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@parmoderr} +% Occurs in a float environment or a |\marginpar| when +% encountered in inner vertical mode. +% \begin{macrocode} +\gdef\@parmoderr{% + \@latex@error{Not in outer par mode}\@ehb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fltovf} +% Occurs in float environment or |\marginpar| when there +% are no more free boxes for storing floats. +% \begin{macrocode} +\gdef\@fltovf{% + \@latex@error{Too many unprocessed floats}\@ehb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@latexbug} +% Occurs in output routine. This is bad news. +% \begin{macrocode} +\gdef\@latexbug{% + \@latex@error{This may be a LaTeX bug}{Call for help}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@badcrerr} +% This error was removed and replaced by |\@nolnerr|. +% \changes{v1.0m}{1994/05/04}{Error message removed} +% \begin{macrocode} +%\def\@badcrerr {\@latex@error{Bad use of \protect\\}\@ehc} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@noitemerr} +% |\addvspace| or |\addpenalty| was called when not in +% vmode. Probably caused by a missing |\item|. +% \begin{macrocode} +\gdef\@noitemerr{% + \@latex@error{Something's wrong--perhaps a missing % + \protect\item}\@ehc} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@notprerr} +% A command that can be used only in the preamble +% appears after the command |\begin{document}|. +% \begin{macrocode} +\gdef\@notprerr{% + \@latex@error{Can be used only in preamble}\@eha} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@inmatherr} +% \changes{v1.0j}{1994/04/28}{Macro added} +% \changes{v1.1c}{1994/04/28}{Replaced \cs{noexpand} with \cs{protect}.} +% Issued by commands that don't work correctly within math (like +% |\item|). There is no real error recovery happening, e.g., the +% user might get additional errors afterwards. +% \begin{macrocode} +\gdef\@inmatherr#1{% + \relax + \ifmmode + \@latex@error{Command \protect#1 invalid in math mode}\@ehc + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@invalidchar} +% \changes{LaTeX2.09}{1993/09/19} +% {(RmS) Error message for invalid input characters.} +% \changes{v1.0d}{1994/03/28} +% {(DPC) Comment out (use catcode15 instead)} +% An error for use with invalid characters. This is commented +% out, since we decided to use catcode 15 instead. +% \begin{macrocode} +%\def\@invalidchar{\@latex@error{Invalid character in input}\@ehc} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% As well as the above error commands some error messages are directly +% coded to save space. The messages already present in \LaTeX2.09 +% include: +% +% |Environment --- undefined|\\ +% Issued by |\begin| for undefined environment. +% +% |Tab overflow|\\ +% Occurs in |\=| when maximum number of tabs exceeded. +% +% |\< in mid line|\\ +% Occurs in |\<| when it appears in middle of line. +% +% |Float(s) lost|\\ +% In output routine, caused by a float environment or +% |\marginpar| occurring in inner vertical mode. +% +%\Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx b/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx new file mode 100644 index 00000000000..7d628f52e1e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfiles.dtx @@ -0,0 +1,1129 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltfiles.dtx +%<*driver> +% \fi +\ProvidesFile{ltfiles.dtx} + [2019/07/01 v1.2a LaTeX Kernel (File Handling)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltfiles.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0h}{1994/05/21}{Use new error commands} +% \changes{v1.0n}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0u}{1995/07/13}{Updates to docu} +% \changes{v1.1m}{2015/02/21} +% {Removed autoload support} +% +% \section{File Handling} +% +% The following user commands are defined in this part: +% +% \DescribeMacro{\document} (ie |\begin{document}|)\\ +% Reads in the .AUX files and |\catcode|'s |@| to 12. +% +% \DescribeMacro{\nofiles}\\ +% Suppresses all file output by setting |\@filesw| false. +% +% \DescribeMacro{\includeonly}\marg{NAME1, ... ,NAMEn}\\ +% Causes only parts NAME1, ... ,NAMEn to be read by +% their |\include| commands. Works by setting \@partsw true +% and setting |\@partlist| to NAME1, ... ,NAMEn. +% +% \DescribeMacro{\include}\marg{NAME}\\ +% Does an |\input| NAME unless |\@partsw| is true and +% NAME is not in |\@partlist|. If |\@filesw| is true, then +% it directs .AUX output to NAME.AUX, including a +% checkpoint at the end. +% +% \DescribeMacro{\input}\marg{NAME}\\ +% The same as TeX's |\input|, except it allows optional +% braces around the file name. In \LaTeXe, it also avoids +% the primitive `missing file' error, if the file can not be +% found. +% +% \DescribeMacro{\IfFileExists}\marg{NAME}\marg{then}\marg{else}\\ +% If the file exists on the system, execute \emph{then} otherwise +% execute \emph{else}. +% +% \DescribeMacro{\InputIfFileExists}\marg{NAME}\marg{then}\marg{else}\\ +% If the file exists on the system, execute \emph{then} and input +% \emph{NAME} otherwise execute \emph{else}. +% +% \StopEventually{} +% +% \changes{v1.0a}{1994/03/07}{Initial version, split from latex.dtx} +% \changes{v1.0a}{1994/03/07}{Long lines wrapped to 72 columns} +% +% \begin{oldcomments} +% +% \begin{macrocode} +%<*2ekernel> +\message{files,} +% \end{macrocode} +% +% VARIABLES, SWITCHES AND INTERNAL COMMANDS: +% \@mainaux : Output file number for main .AUX file. +% \@partaux : Output file number for current part's .AUX file. +% \@auxout : Either \@mainout or \@partout, depending on +% which .AUX file output goes to. +% \@input{foo} : If file foo exists, then \input's it, +% otherwise types a warning message. +% @filesw : Switch -- set false if no .AUX, .TOC, .IDX etc +% files are to be written +% @partsw : Set true by a \includeonly command. +% \@partlist : Set to the argument of the \includeonly command. +% +% \cp@FOO : The checkpoint for \include'd file FOO.TEX, written +% by \@writeckpt at the end of file FOO.AUX +% +% +% \includeonly{FILELIST} == +% BEGIN +% \@partsw := T +% \@partlist := FILELIST +% END +% +% \include{FILE} == +% BEGIN +% \clearpage +% if \@filesw = T +% then \immediate\write\@mainaux{\string\@input{FILE.AUX}} +% fi +% if \@partsw = T +% then \@tempswa := F +% \reserved@b == FILE +% for \reserved@a := \@partlist +% do if eval(\reserved@a) = eval(\reserved@b) +% then \@tempswa := T fi +% od +% fi +% +% if \@tempswa = T +% then \@auxout := \@partaux +% if \@filesw = T +% then \immediate\openout\@partaux{FILE.AUX} +% \immediate\write\@partaux{\relax} +% fi +% \@input{FILE.TEX} +% \clearpage +% \@writeckpt{FILE} +% if @filesw then \closeout \@partaux fi +% \@auxout := \@mainaux +% else \cp@FILE +% fi +% END +% +% \@writeckpt{FILE} == +% BEGIN +% if \@filesw = T +% \immediate\write on file \@partaux: +% \@setckpt{FILE}{ %% } +% for \reserved@a := \cl@@ckpt +% do \immediate\write on file \@partaux: +% \global\string\setcounter +% {eval(\reserved@a)}{eval(\c@eval(\reserved@a))} +% od %% { +% \immediate\write on file \@partaux: } +% fi +% END +% +% \@setckpt{FILE}{LIST} == +% BEGIN +% G \cp@FILE := LIST +% END +% +% INITIALIZATION +% \@tempswa := T +% +% \end{oldcomments} +% +% +% \task{???}{Do we use @unused or mainaux?} +% \begin{macro}{\@inputcheck} +% \begin{macro}{\@unused} +% Allocate read stream for testing and output stream. +% \changes{v1.0l}{1994/11/07} +% {move here from ltdefns, remove duplicate \cs{@mainaux}} +% \begin{macrocode} +\newread\@inputcheck +\newwrite\@unused +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@mainaux} +% \begin{macro}{\@partaux} +% \begin{macrocode} +\newwrite\@mainaux +\newwrite\@partaux +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@filesw} +% \begin{macro}{\if@partsw} +% \begin{macrocode} +\newif\if@filesw \@fileswtrue +\newif\if@partsw \@partswfalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@clubpenalty} +% This stores the current normal (non-infinite) value of +% \cs{clubpenalty}; it should therefore be reset whenever the +% normal value is changed (as in the bibliography in the standard +% styles). +% \changes{v1.1h}{1996/10/05}{Added setting its value} +% \begin{macrocode} +\newcount\@clubpenalty +\@clubpenalty \clubpenalty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\document} +% \changes{v0.9e}{1993/12/09}{Hook added} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/04/15}% +%<latexrelease> {\document}{Save language for hyphenation}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% Cancel the |\begingroup| from |\begin|. +% \begin{macrocode} +\def\document{\endgroup +% \end{macrocode} +% If some options on |\documentclass| haven't been used by any +% package we will now give a warning since this is most certainly a +% misspelling. +% \begin{macrocode} + \ifx\@unusedoptionlist\@empty\else + \@latex@warning@no@line{Unused global option(s):^^J% + \@spaces[\@unusedoptionlist]}% + \fi + \@colht\textheight + \@colroom\textheight \vsize\textheight + \columnwidth\textwidth + \@clubpenalty\clubpenalty + \if@twocolumn + \advance\columnwidth -\columnsep + \divide\columnwidth\tw@ \hsize\columnwidth \@firstcolumntrue + \fi + \hsize\columnwidth \linewidth\hsize + \begingroup\@floatplacement\@dblfloatplacement + \makeatletter\let\@writefile\@gobbletwo +% \end{macrocode} +% \changes{v1.1a}{1995/10/24} +% {Removed multiplelabels switch} +% \begin{macrocode} + \global \let \@multiplelabels \relax + \@input{\jobname.aux}% + \endgroup + \if@filesw + \immediate\openout\@mainaux\jobname.aux + \immediate\write\@mainaux{\relax}% + \fi +% \end{macrocode} +% +% Dateline 1991/03/26: FMi added |\process@table| to support NFSS; +% This will also work with old lfonts if no other style defines +% |\process@table|. The following line forces the initialization of +% the math fonts. +% \begin{macrocode} + \process@table + \let\glb@currsize\@empty % Force math initialization. +% \end{macrocode} +% \changes{v0.9t}{1994/01/31} +% {set \cs{@normalsize} or \cs{normalsize} if necessary} +% \changes{v1.0d}{1994/03/28} +% {(DPC) remove \cs{@normalsize check}} +% \changes{v1.0d}{1994/03/28} +% {(DPC) Use \cs{normalsize} not \cs{@normalsize}} +% \changes{v1.0g}{1994/05/13}{Added execution of \cs{every@size}} +% \changes{v1.0m}{1994/11/07}{Renamed \cs{every@size} to +% \cs{every@math@size}.} +% \changes{v1.0q}{1995/04/25} +% {Removed execution of \cs{every@size} latex/1407} +% \begin{macrocode} + \normalsize + \everypar{}% +% \end{macrocode} +% +% So that punctuation in headings is not disturbed by verbatim +% or other local changes to the space factor codes, save the document +% default here. This will be locally reset by the output routine. +% For special cases a class may want to define |\normalsfcodes| +% directly, in case that definition will be used. +% (This is an old bug, problem existed in \LaTeX2.0x and plain \TeX.) +% \changes{v1.1k}{1997/04/14} +% {Set the document space factor defaults. latex/2404} +% \begin{macrocode} + \ifx\normalsfcodes\@empty + \ifnum\sfcode`\.=\@m + \let\normalsfcodes\frenchspacing + \else + \let\normalsfcodes\nonfrenchspacing + \fi + \fi +% \end{macrocode} +% For similar reasons also save the default language, this will be reset +% locally in the output routine. In particular it allows hyphenation +% in the page head even if the page break happens in verbatim. +% If this has already been set by a package, set to the value of |\language| +% at this spoint. +% \changes{v1.1n}{2017/03/10}{Save language default} +% \begin{macrocode} + \ifx\document@default@language\m@ne + \chardef\document@default@language\language + \fi +% \end{macrocode} +% +% Way back in 1991 (08/26) FMi \& RmS set the |\@noskipsec| switch +% to true in the preamble and to false here. +% This was done to trap lists and related text in the preamble but it +% does not catch everything; hence Change 1.1g was introduced. +% \begin{macrocode} + \@noskipsecfalse +% \end{macrocode} +% \changes{v1.1a}{1995/10/24} +% {Removed refundefined switch} +% \begin{macrocode} + \let \@refundefined \relax +% \end{macrocode} +% Just before disabling the preamble commands we execute the begin +% document hook which contains any code contributed by +% |\AtBeginDocument|. Also disable the gathering of the file list, +% if no |\listfiles| has been issued. |\AtBeginDocument| is redefined +% at this point so that and such commands that get into the hook do +% not chase their tail\ldots +% \changes{v1.1e}{1996/04/24} +% {(DPC) Reset \cs{AtBeginDocument} eg for latex/1297} +% \begin{macrocode} + \let\AtBeginDocument\@firstofone + \@begindocumenthook +% \end{macrocode} +% Most of the following assignments will be done globally in case +% the user adds something like |\begin{multicols}| to the document +% hook, i.e. starts are group in |\begin{document}|. +% \changes{v1.0r}{1995/04/27} +% {Added \cs{global} to support groups in hook} +% \changes{v1.0c}{1994/03/16} +% {(DPC) directly add file list settings} +% \changes{v1.0v}{1995/08/16}{set \cs{topskip} globally} +% \changes{v1.0v}{1995/08/16}{set \cs{@maxdepth}} +% +% \changes{v1.0s}{1995/05/25} +% {Added check for \cs{topskip} zero} +% \changes{v1.0t}{1995/05/25} +% {Corrected typo} +% Since a value of exactly 0pt for \cs{topskip} causes +% \cs{twocolumn[]} to misbehave, we add this check, hoping +% that it will not cause any problems elsewhere. +% \begin{macrocode} + \ifdim\topskip<1sp\global\topskip 1sp\relax\fi + \global\@maxdepth\maxdepth + \global\let\@begindocumenthook\@undefined + \ifx\@listfiles\@undefined + \global\let\@filelist\relax + \global\let\@addtofilelist\@gobble + \fi +% \end{macrocode} +% At the very end we disable all preamble commands. This has to +% happen after the begin document hooks was executed so that this +% hook can still use such commands. +% \changes{v0.9o}{1994/01/15} +% {move \cs{@preamblecmds} after document hook} +% \changes{v1.0v}{1995/08/16}{set \cs{do} globally} +% \begin{macrocode} + \gdef\do##1{\global\let ##1\@notprerr}% + \@preamblecmds +% \end{macrocode} +% The next line saves tokens and also allows |\@nodocument| to be +% used directly to trap preamble errors. +% \changes{v1.1g}{1996/09/29}{Added disabling of \cs{@nodocument}} +% \begin{macrocode} + \global\let \@nodocument \relax +% \end{macrocode} +% The next line is a pure safety measure in case a do list is ever +% expanded at the wrong place. In addition it will save a few +% tokens to get rid of the above definition. +% \begin{macrocode} + \global\let\do\noexpand +% \end{macrocode} +% \changes{v1.1c}{1995/12/05}{\cs{ignorespaces} added for latex/1933} +% Use of |\AtBeginDocument| hook might mean that we are already in +% horizontal mode, so ignore the space after |\begin{document}|. +% \begin{macrocode} + \ignorespaces} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\document}{Save language for hyphenation} +%<latexrelease>\def\document{\endgroup +%<latexrelease> \ifx\@unusedoptionlist\@empty\else +%<latexrelease> \@latex@warning@no@line{Unused global option(s):^^J% +%<latexrelease> \@spaces[\@unusedoptionlist]}% +%<latexrelease> \fi +%<latexrelease> \@colht\textheight +%<latexrelease> \@colroom\textheight \vsize\textheight +%<latexrelease> \columnwidth\textwidth +%<latexrelease> \@clubpenalty\clubpenalty +%<latexrelease> \if@twocolumn +%<latexrelease> \advance\columnwidth -\columnsep +%<latexrelease> \divide\columnwidth\tw@ \hsize\columnwidth +%<latexrelease> \@firstcolumntrue +%<latexrelease> \fi +%<latexrelease> \hsize\columnwidth \linewidth\hsize +%<latexrelease> \begingroup\@floatplacement\@dblfloatplacement +%<latexrelease> \makeatletter\let\@writefile\@gobbletwo +%<latexrelease> \global \let \@multiplelabels \relax +%<latexrelease> \@input{\jobname.aux}% +%<latexrelease> \endgroup +%<latexrelease> \if@filesw +%<latexrelease> \immediate\openout\@mainaux\jobname.aux +%<latexrelease> \immediate\write\@mainaux{\relax}% +%<latexrelease> \fi +%<latexrelease> \process@table +%<latexrelease> \let\glb@currsize\@empty +%<latexrelease> \normalsize +%<latexrelease> \everypar{}% +%<latexrelease> \ifx\normalsfcodes\@empty +%<latexrelease> \ifnum\sfcode`\.=\@m +%<latexrelease> \let\normalsfcodes\frenchspacing +%<latexrelease> \else +%<latexrelease> \let\normalsfcodes\nonfrenchspacing +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \@noskipsecfalse +%<latexrelease> \let \@refundefined \relax +%<latexrelease> \let\AtBeginDocument\@firstofone +%<latexrelease> \@begindocumenthook +%<latexrelease> \ifdim\topskip<1sp\global\topskip 1sp\relax\fi +%<latexrelease> \global\@maxdepth\maxdepth +%<latexrelease> \global\let\@begindocumenthook\@undefined +%<latexrelease> \ifx\@listfiles\@undefined +%<latexrelease> \global\let\@filelist\relax +%<latexrelease> \global\let\@addtofilelist\@gobble +%<latexrelease> \fi +%<latexrelease> \gdef\do##1{\global\let ##1\@notprerr}% +%<latexrelease> \@preamblecmds +%<latexrelease> \global\let \@nodocument \relax +%<latexrelease> \global\let\do\noexpand +%<latexrelease> \ignorespaces} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\document +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\normalsfcodes} +% \changes{v1.1k}{1997/04/14} +% {Macro added (from patch file) latex/2404} +% The setting of |\@empty| is just a flag. This command may be defined +% in a class or package file. If it is still |\@empty| at +% |\begin{document}| it will be defined to be |\frenchspacing| or +% |\nonfrenchspacing|, depending on which of those appears to be in +% effect at that point. +% \begin{macrocode} +\let\normalsfcodes\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nofiles} +% \changes{v1.0k}{1994/11/04} +% {Added setting of \cs{protected@write}, +% \cs{makeindex} and \cs{makeglossary} to \cs{nofiles}. ASAJ.} +% \changes{v1.0o}{1994/11/30} +% {There is no \cs{@gobblethree}\ldots} +% \changes{v1.0t}{1995/05/25} +% {(CAR) added \cs{long}} +% \changes{v1.1f}{1996/05/17} +% {added \cs{write} to \cs{protected@write} for latex/2146} +% Set |\@fileswfalse| which suppresses the places where \LaTeX\ makes +% |\immediate| writes. The |\makeindex| and |\makeglossary| are +% disabled. |\protected@write| is redefined not to write to the file +% specified, but rather to write a blank line to the log file. This +% ensures that a \meta{whatsit} node is still created, and so spacing +% is not affected by the |\nofiles| command; to ensure this more +% generally, the |\if@nobreak| test is needed. +% \changes{v1.1i}{1996/11/05} +% {Standard \cs{if@nobreak} test added} +% \begin{macrocode} +\def\nofiles{% + \@fileswfalse + \typeout{No auxiliary output files.^^J}% + \long\def\protected@write##1##2##3% + {\write\m@ne{}\if@nobreak\ifvmode\nobreak\fi\fi}% + \let\makeindex\relax + \let\makeglossary\relax} +\@onlypreamble\nofiles +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\protected@write} +% This takes three arguments: an output stream, some initialization +% code, and some text to write. It then writes this, with +% appropriate handling of |\protect| and |\thepage|. +% \changes{v1.0k}{1994/11/04}{Macro added ASAJ.} +% \changes{v1.0t}{1995/05/25} +% {(CAR) added \cs{long}} +% \begin{macrocode} +\long\def \protected@write#1#2#3{% + \begingroup + \let\thepage\relax + #2% + \let\protect\@unexpandable@protect + \edef\reserved@a{\write#1{#3}}% + \reserved@a + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\@auxout=\@mainaux +% \end{macrocode} +% +% +% \begin{macro}{\includeonly} +% \changes{v1.0p}{1995/04/22}{Allow blanks in argument} +% \changes{v1.2a}{2019/07/01}{Support UTF-8} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2019/10/01}% +%<latexrelease> {\includeonly}{Spaces in file names}% +\def\includeonly#1{% + \@partswtrue + \set@curr@file{\zap@space#1 \@empty}% + \let\@partlist\@curr@file + } +\@onlypreamble\includeonly +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\include} +% \changes{v0.9p}{1994/01/18} +% {Use \cs{@input@} so include files are listed.} +% In the definition of |\include|, |\def\reserved@b| changed to +% |\edef\reserved@b| to be consistent with the |\edef| in +% |\includeonly|. +% (Suggested by Rainer Sch\"opf \& Frank Mittelbach. +% Change made 20 Jul 88.) +% +% Changed definition of |\include| to allow space at end of file name +% --- otherwise, typing |\include{foo }| would cause \LaTeX\ to +% overwrite |foo.tex|. Change made 24 May 89, suggested by Rainer +% Sch\"opf and Frank Mittelbach +% +% Made |\include| check for being used inside an |\include|'d file, as +% this will not work and cause surprising results. +% \begin{macrocode} +\def\include#1{\relax + \ifnum\@auxout=\@partaux + \@latex@error{\string\include\space cannot be nested}\@eha + \else + \set@curr@file{#1 }% + \expandafter\@include\@curr@file + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\includeonly}{Spaces in file names}% +%<latexrelease>\def\includeonly#1{% +%<latexrelease> \@partswtrue +%<latexrelease> \edef\@partlist{\zap@space#1 \@empty}} +%<latexrelease> +%<latexrelease>\def\include#1{\relax +%<latexrelease> \ifnum\@auxout=\@partaux +%<latexrelease> \@latex@error{\string\include\space cannot be nested}\@eha +%<latexrelease> \else \@include#1 \fi} +%<latexrelease> +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} + +% +% \begin{macro}{\@include} +% \begin{macrocode} +\def\@include#1 {% + \clearpage + \if@filesw + \immediate\write\@mainaux{\string\@input{#1.aux}}% + \fi + \@tempswatrue + \if@partsw + \@tempswafalse + \edef\reserved@b{#1}% + \@for\reserved@a:=\@partlist\do + {\ifx\reserved@a\reserved@b\@tempswatrue\fi}% + \fi + \if@tempswa + \let\@auxout\@partaux + \if@filesw + \immediate\openout\@partaux #1.aux + \immediate\write\@partaux{\relax}% + \fi + \@input@{#1.tex}% + \clearpage + \@writeckpt{#1}% + \if@filesw + \immediate\closeout\@partaux + \fi + \else +% \end{macrocode} +% If the file is not included, reset |\deadcycles|, so that a long +% list of non-included files does not generate an `Output loop' +% error. +% \changes{v1.1j}{1997/01/08}{reset \cs{deadcycles} latex/2365} +% \begin{macrocode} + \deadcycles\z@ + \@nameuse{cp@#1}% + \fi + \let\@auxout\@mainaux} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@writeckpt} +% \begin{macrocode} +\def\@writeckpt#1{% + \if@filesw + \immediate\write\@partaux{\string\@setckpt{#1}\@charlb}% + {\let\@elt\@wckptelt \cl@@ckpt}% + \immediate\write\@partaux{\@charrb}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@wckptelt} +% \begin{macrocode} +\def\@wckptelt#1{% + \immediate\write\@partaux{% + \string\setcounter{#1}{\the\@nameuse{c@#1}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@setckpt} +% RmS 93/08/31: introduced |\@setckpt| +% \begin{macrocode} +\def\@setckpt#1{\global\@namedef{cp@#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@charlb} +% \begin{macro}{\@charrb} +% The following defines |\@charlb| and |\@charrb| to be |{| and |}|, +% respectively with |\catcode| 11. +% \begin{macrocode} +{\catcode`[=1 \catcode`]=2 +\catcode`{=11 \catcode`}=11 +\gdef\@charlb[{] +\gdef\@charrb[}] +]% }brace matching +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \subsection{Safe Input Macros} +% +% +% + +% \begin{macro}{\@curr@file} +% \begin{macro}{\set@curr@file} +% +% File name handling is done by generating a csname from the +% provided file name (which means that UTF-8 octets gets turned into +% strings as this is what happens if they appear in a csname due to +% the code in \texttt{utf8.def}). By setting \cs{escapchar} to +% \texttt{-1} we ensure that we don't get a backslash in front. As a +% result we end up with all characters as catcode 12 (plus +% spaces). We then sometimes add quotes around the contruct +% (removing any existing inner quotes. Somes we only remove the +% quotes if they have been supplied by the user. There is clearly +% some room for improvement. +% +% A side effect of the new code is that we will see quotes around +% file name displays where there haven't been any before. +% +% \changes{v1.2a}{2019/07/01}{Support UTF-8} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2019/10/01}% +%<latexrelease> {\set@curr@file}{Quote file names}% +\def\set@curr@file#1{% + \begingroup + \escapechar\m@ne + \xdef\@curr@file{\expandafter\string\csname #1\endcsname}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\quote@name} +% \begin{macro}{\quote@@name} +% \begin{macro}{\unquote@name} +% Quoting spaces +%\begin{verbatim} +% a b c -> "a b c" +% "a b c" -> "a b c" +% a" "b" "c -> "a b c" +% -> "" +%\end{verbatim} +% \begin{macrocode} +\def\quote@name#1{"\quote@@name#1\@gobble""} +\def\quote@@name#1"{#1\quote@@name} +% \end{macrocode} +% and removing quotes \ldots +% \begin{macrocode} +\def\unquote@name#1{\quote@@name#1\@gobble"} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\IfFileExists} +% +% \changes{v1.2a}{2019/07/01}{Support UTF-8} +% \begin{macrocode} +\def\IfFileExists#1{% + \set@curr@file{#1}% + \edef\q@curr@file{\expandafter\quote@name\expandafter{\@curr@file}}% + \expandafter\IfFileExists@\expandafter{\q@curr@file}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfFileExists@} +% \changes{v0.9b}{1993/12/04}{Macro added} +% \changes{v0.9p}{1994/01/18}{New Definition} +% \changes{v1.0t}{1995/05/25} +% {(CAR) added \cs{long}} +% +% \begin{macrocode} +\long\def \IfFileExists@#1#2#3{% + \openin\@inputcheck#1 % + \ifeof\@inputcheck + \ifx\input@path\@undefined + \def\reserved@a{#3}% + \else + \def\reserved@a{\@iffileonpath{#1}{#2}{#3}}% + \fi + \else + \closein\@inputcheck + \edef\@filef@und{#1 }% + \def\reserved@a{#2}% + \fi + \reserved@a} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\set@curr@file}{Quote file names}% +%<latexrelease> +%<latexrelease>\let\quote@name\@undefined +%<latexrelease>\let\quote@@name\@undefined +%<latexrelease>\let\unquote@name\@undefined +%<latexrelease>\let\set@curr@file\@undefined +%<latexrelease> +%<latexrelease>\let\IfFileExists@\@undefined +%<latexrelease> +%<latexrelease>\long\def \IfFileExists#1#2#3{% +%<latexrelease> \openin\@inputcheck#1 % +%<latexrelease> \ifeof\@inputcheck +%<latexrelease> \ifx\input@path\@undefined +%<latexrelease> \def\reserved@a{#3}% +%<latexrelease> \else +%<latexrelease> \def\reserved@a{\@iffileonpath{#1}{#2}{#3}}% +%<latexrelease> \fi +%<latexrelease> \else +%<latexrelease> \closein\@inputcheck +%<latexrelease> \edef\@filef@und{#1 }% +%<latexrelease> \def\reserved@a{#2}% +%<latexrelease> \fi +%<latexrelease> \reserved@a} +%<latexrelease> +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% +% \begin{macro}{\@iffileonpath} +% If the file is not found by |\openin|, and |\input@path| is defined, +% look in all the directories specified in |\input@path|. +% \changes{v0.9p}{1994/01/18}{Macro added} +% \changes{v1.0f}{1994/05/02} +% {\cs{@break@loop} renamed to \cs{@break@tfor}} +% \changes{v1.0t}{1995/05/25} +% {(CAR) added \cs{long}} +% \changes{v1.1d}{1996/01/10} +% {Change argument handling to not require doubled hash. latex/2024} +% \begin{macrocode} +\long\def\@iffileonpath#1{% + \let\reserved@a\@secondoftwo + \expandafter\@tfor\expandafter\reserved@b\expandafter + :\expandafter=\input@path\do{% + \openin\@inputcheck\reserved@b#1 % + \ifeof\@inputcheck\else + \edef\@filef@und{\reserved@b#1 }% + \let\reserved@a\@firstoftwo% + \closein\@inputcheck + \@break@tfor + \fi}% + \reserved@a} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\InputIfFileExists} +% \changes{v0.9b} +% {1993/12/04}{Macro added} +% \changes{v0.9p} +% {1994/01/18}{New Definition} +% \changes{v0.3b}{1994/03/13} +% {Use new cmd \cs{@addtofilelist}} +% Now define |\InputIfFileExists| to input |#1| if it seems to exist. +% Immediately prior to the input, |#2| is executed. +% If the file |#1| does not exist, execute `|#3|'. +% \changes{v1.0t}{1995/05/25} +% {(CAR) added \cs{long}} +% \changes{v1.1o}{2019/02/07}{Expand \cs{@filef@und} before executing +% second argument (github/109)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2019/10/01}% +%<latexrelease> {\InputIfFileExists}{Don't lose the file name}% +%<*2ekernel|latexrelease> +% \begin{macrocode} +\long\def \InputIfFileExists#1#2{% + \IfFileExists{#1}% + {% + \expandafter\@swaptwoargs\expandafter + {\@filef@und}{#2\@addtofilelist{#1}\@@input}}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@swaptwoargs} +% +% \changes{v1.1o}{2019/02/07}{Helper macro added} +% Swap two arguments and return them unbraced (like +% \cs{@firstoftwo} etc). +% \begin{macrocode} +\long\def\@swaptwoargs#1#2{#2#1} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\InputIfFileExists}{Don't lose the file name}% +%<latexrelease>\long\def \InputIfFileExists#1#2{% +%<latexrelease> \IfFileExists{#1}% +%<latexrelease> {#2\@addtofilelist{#1}\@@input \@filef@und}} +%<latexrelease> +%<latexrelease>\let\@swaptwoargs\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% +% \begin{macro}{\input} +% Input a file: if the argument is given in braces use safe input +% macros, otherwise use \TeX's primitive |\input| command (which is +% called |\@@input| in \LaTeX). +% \changes{v0.9b}{1993/12/04}{Macro reimplemented} +% \begin{macrocode} +\def\input{\@ifnextchar\bgroup\@iinput\@@input} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@iinput} +% Define |\@iinput| (i.e., |\input|) in terms of +% |\InputIfIfileExists|. +% \changes{v0.9b}{1993/12/04}{Macro reimplemented} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2019/10/01}% +%<latexrelease> {\@iinput}{Quote file names}% +\def\@iinput#1{% + \InputIfFileExists{#1}{}% + {\filename@parse\@curr@file + \edef\reserved@a{\noexpand\@missingfileerror + {\filename@area\filename@base}% + {\ifx\filename@ext\relax tex\else\filename@ext\fi}}% + \reserved@a}} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@iinput}{Quote file names}% +%<latexrelease>\def\@iinput#1{% +%<latexrelease> \InputIfFileExists{#1}{}% +%<latexrelease> {\filename@parse{#1}% +%<latexrelease> \edef\reserved@a{\noexpand\@missingfileerror +%<latexrelease> {\filename@area\filename@base}% +%<latexrelease> {\ifx\filename@ext\relax tex\else\filename@ext\fi}}% +%<latexrelease> \reserved@a}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} + + + + +% +% \begin{macro}{\@input} +% \changes{v0.9b}{1993/12/04}{Macro reimplemented} +% \changes{v0.9p}{1994/01/18}% +% {do not use a different definition for \cs{input@path}} +% Define |\@input| in terms of |\IfIfileExists|. +% So this is a `safe input' command, but the files input are not +% listed by |\listfiles|. +% +% We don't want |.aux|, |.toc| files etc be listed by |\listfiles|. +% However, something like |.bbl| probably should be listed and thus +% should be implemented not by |\@input|. +% \begin{macrocode} +\def\@input#1{% + \IfFileExists{#1}{\@@input\@filef@und}{\typeout{No file #1.}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@input@} +% \changes{v0.9p}{1994/01/18}{Macro added} +% \task{???}{share code with `@input ?} +% Version of |\@input| that does add the file to |\@filelist|. +% \begin{macrocode} +\def\@input@#1{\InputIfFileExists{#1}{}{\typeout{No file #1.}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@missingfileerror} +% This `error' command avoids \TeX's primitive missing file loop. +% +% Missing file error. Prompt for a new filename, offering a default +% extension. +% \changes{LaTeX2e}{1993/11/21} +% {Stop infinite looping on \cs{@er@ext}} +% \changes{LaTeX2e}{1993/11/28} +% {Use filename parser from dircheck} +% \changes{LaTeX2e}{1994/03/15} +% {Quit on x or X just like a real error} +% \changes{LaTeX2e}{1994/05/26} +% {Modify message format} +% \changes{v1.0j}{1994/11/03} +% {Move here from ltclass} +% \changes{v1.0w}{1995/10/06} +% {Autoload error} +% \begin{macrocode} +\gdef\@missingfileerror#1#2{% + \typeout{^^J! LaTeX Error: File `#1.#2' not found.^^J^^J% + Type X to quit or <RETURN> to proceed,^^J% + or enter new name. (Default extension: #2)^^J}% + \message{Enter file name: }% + {\endlinechar\m@ne + \global\read\m@ne to\@gtempa}% + \ifx\@gtempa\@empty + \else + \def\reserved@a{x}\ifx\reserved@a\@gtempa\batchmode\@@end\fi + \def\reserved@a{X}\ifx\reserved@a\@gtempa\batchmode\@@end\fi + \filename@parse\@gtempa + \edef\filename@ext{% + \ifx\filename@ext\relax#2\else\filename@ext\fi}% + \edef\reserved@a{% + \noexpand\InputIfFileExists + {\filename@area\filename@base.\filename@ext}% + {}% + {\noexpand\@missingfileerror + {\filename@area\filename@base}{\filename@ext}}}% + \reserved@a + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@obsoletefile} +% For compatibility with \LaTeX~2.09 document styles, we distribute +% files called |article.sty|, |book.sty|, |report.sty|, +% |slides.sty| and |letter.sty|. These use the command +% |\@obsoletefile|, which produces a warning message. +% \changes{v0.9m}{1993/12/20}{Added this command, removed +% @oldfilewarning} +% \changes{v1.0f}{1994/05/02}{Make \cs{@onlypreamble}} +% \begin{macrocode} +\def\@obsoletefile#1#2{% + \@latex@warning@no@line{inputting `#1' instead of obsolete `#2'}} +\@onlypreamble\@obsoletefile +% \end{macrocode} +% +% \subsection{Listing files} +% +% \begin{macro}{\@filelist} +% A list of files input so far. The initial value of |\@gobble| eats +% the comma before the first file name. +% \begin{macrocode} +\let\@filelist\@gobble +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtofilelist} +% Add to the list of files input so far. +% \changes{LaTeX2e}{1994/03/13} +% {Macro added} +% \changes{LaTeX2e}{1995/10/01} +% {Macro added} +% This `real' definition is only used for `cfg' files during initex. +% An initial definition of |\@gobble| has already been set. +% \begin{macrocode} +%\def\@addtofilelist#1{\xdef\@filelist{\@filelist,#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\listfiles} +% A preamble command to cause |\end{document}| to list files input +% from the main file. +% \changes{LaTeX2e}{1993/11/22} +% {Removed checking for \cs{@unknownversion}} +% \changes{LaTeX2e}{1994/01/17} +% {New Version, adds `.tex' if needed, and lines up columns} +% \changes{LaTeX2e}{1994/05/13} +% {Stop \cs{listfiles} being run twice} +% \changes{v1.0i}{1994/10/18} +% {code moved here from ltclass} +% \begin{macrocode} +\def\listfiles{% + \let\listfiles\relax + \def\@listfiles##1##2##3##4##5##6##7##8##9\@@{% + \def\reserved@d{\\}% + \@tfor\reserved@c:=##1##2##3##4##5##6##7##8\do{% + \ifx\reserved@c\reserved@d + \edef\filename@area{ \filename@area}% + \fi}}% +% \end{macrocode} +% +% \changes{v1.0o}{1994/11/30} +% {Use \cs{@dofilelist}} +% \begin{macrocode} + \def\@dofilelist{% + \typeout{^^J *File List*}% + \@for\@currname:=\@filelist\do{% + \filename@parse\@currname + \edef\reserved@a{% + \filename@base.% + \ifx\filename@ext\relax tex\else\filename@ext\fi}% + \expandafter\let\expandafter\reserved@b + \csname ver@\reserved@a\endcsname + \expandafter\expandafter\expandafter\@listfiles\expandafter + \filename@area\filename@base\\\\\\\\\\\\\\\\\\\@@ + \typeout{% + \filename@area\reserved@a + \ifx\reserved@b\relax\else\@spaces\reserved@b\fi}}% + \typeout{ ***********^^J}}} +% \end{macrocode} +% +% \changes{LaTeX2e}{1994/03/13} +% {Reset \cs{@addtofilelist} at begin document} +% \changes{LaTeX2e}{1994/03/16} +% {Move this code directly into \cs{document}} +% The |\@filelist| will be de-activated if |\listfiles| does not +% appear in the preamble. |\begin{document}| contains code equivalent +% to the following: +%\begin{verbatim} +% \AtBeginDocument{% +% \ifx\@listfiles\@undefined +% \let\@filelist\relax +% \let\@addtofilelist\@gobble +% \fi} +%\end{verbatim} +% \begin{macrocode} +\@onlypreamble\listfiles +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dofilelist} +% \changes{v1.0o}{1994/11/30} +% {Macro added} +% \begin{macrocode} +\let\@dofilelist\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx b/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx new file mode 100644 index 00000000000..db98a9cb8ff --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfinal.dtx @@ -0,0 +1,1119 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltfinal.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltfinal.dtx} + [2019/04/09 v2.1g LaTeX Kernel (Final Settings)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltfinal.dtx} +\title{\filename} +\date{\filedate} +\author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{ltfinal.dtx} +\end{document} +%</driver> +% \fi +% +% +% \section{Final settings} +% This section contains the final settings for \LaTeX. It initialises +% some debugging and typesetting parameters, sets the default +% |\catcode|s and uc/lc codes, and inputs the hyphenation file. +% +% \StopEventually{} +% +% \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx} +% \changes{v0.1a}{1994/03/07}{Remove oldcomments environment} +% \changes{v0.1c}{1994/04/21}{Added comments, set the catcodes of +% 128--255.} +% \changes{v0.1d}{1994/04/23}{Check that \cs{font@submax} is still zero} +% \changes{v0.1e}{1994/05/02}{Set all the catcodes} +% \changes{v0.1f}{1994/05/03}{Set the catcode of control-J to be +% `other', for use in messages.} +% \changes{v0.1g}{1994/05/05}{Added empty errhelp.} +% \changes{v0.1h}{1994/05/13}{Added package ot1enc, and defined +% \cs{@acci}, \cs{@accii} and \cs{@acciii}.} +% \changes{v0.1j}{1994/05/18}{Corrected the lccode for d-bar.} +% \changes{v0.1k}{1994/05/19}{Removed \cs{makeat...}} +% \changes{v1.0n}{1994/05/31}{Renamed lthyphen.* to lthyphen.*.} +% \changes{v1.0o}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0p}{1994/12/01} +% {Renamed lthyphen.* to hyphen.*.} +% \changes{v1.0r}{1995/06/05} +% {Added \cs{MakeUppercase} and \cs{MakeLowercase}.} +% \changes{v1.0s}{1995/06/06} +% {Made \cs{MakeUppercase} and \cs{MakeLowercase} brace their +% argument.} +% \changes{v2.0r}{2016/10/15}{Require e\TeX{}} +% \changes{v2.0s}{2016/10/15}{Tidy up status of char 127} +% +% \subsection{Debugging} +% +% By default, \LaTeX{} shows statistics: +% \begin{macrocode} +%<*2ekernel> +\tracingstats1 +% \end{macrocode} +% +% \subsection{Typesetting parameters} +% +% \begin{macro}{\@lowpenalty} +% \begin{macro}{\@medpenalty} +% \begin{macro}{\@highpenalty} +% These are penalties used internally. +% \begin{macrocode} +\newcount\@lowpenalty +\newcount\@medpenalty +\newcount\@highpenalty +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +%\begin{macro}{\newmarks} +% \changes{v2.0a}{2014/12/30}{macro added} +% \changes{v2.0b}{2015/01/23}{use reserved count 256} +% \changes{v2.0g}{2015/06/19}{Use $-1$ for first range to get contiguous allocation} +% Allocate extended marks types if etex is active. +% Placed here at the end of the format +% to increase compatibility with count allocations +% in earlier releases. +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\newmarks}{Extended Allocation}% +% \end{macrocode} +% +% \begin{macrocode} +\ifx\marks\@undefined\else +\def\newmarks{% + \e@alloc\marks \e@alloc@chardef{\count256}\m@ne\e@alloc@top} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\newmarks}{Extended Allocation}% +%<latexrelease>\let\newmarks\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\newXeTeXintercharclass} +% \changes{v2.0a}{2014/12/30}{macro added} +% \changes{v2.0b}{2015/01/23}{use reserved count 257} +% \changes{v2.0f}{2015/04/28}{define \cs{xe@alloc@intercharclass} for compatibility with older xelatex initilisation} +%\begin{macro}{\xe@alloc@intercharclass} +%\begin{macro}{\e@alloc@intercharclass@top} +% \changes{v2.0j}{2016/01/04}{Start allocation at one not three} +% \changes{v2.0k}{2016/01/05}{Remove duplicated code} +% Allocate |\XeTeXintercharclass| types if xetex is active. +% previously defined in |xetex.ini|. +% +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\newXeTeXintercharclass}{Extended Allocation}% +% \end{macrocode} +% +% Classes allocated 1 to 4094 (or 254 on older xetex) +% (In earlier XeLaTeX versions 1, 2 and 3 were pre-set for CJK). +% \changes{v2.0g}{2015/06/19}{Use $-1$ for first range to get contiguous allocation} +% \changes{v2.0q}{2016/04/22}{XeTeX 0.99996 has 4096 char classes not 256} +% \begin{macrocode} +\ifx\XeTeXcharclass\@undefined +\else +% \end{macrocode} +% \begin{macrocode} +\ifdim\the\XeTeXversion\XeTeXrevision\p@>0.99993\p@ + \chardef\e@alloc@intercharclass@top=4095 +\else + \chardef\e@alloc@intercharclass@top=255 +\fi +% \end{macrocode} +% \begin{macrocode} +\def\newXeTeXintercharclass{% + \e@alloc\XeTeXcharclass + \chardef\xe@alloc@intercharclass\m@ne\e@alloc@intercharclass@top} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\newXeTeXintercharclass}{Extended Allocation}% +%<latexrelease> \ifx\XeTeXcharclass\@undefined +%<latexrelease> \else +%<latexrelease> \def\xe@alloc@#1#2#3#4#5{\global\advance#1\@ne +%<latexrelease> \xe@ch@ck#1#4#2% +%<latexrelease> \allocationnumber#1% +%<latexrelease> \global#3#5\allocationnumber +%<latexrelease> \wlog{\string#5=\string#2\the\allocationnumber}} +%<latexrelease> \def\xe@ch@ck#1#2#3{% +%<latexrelease> \ifnum#1<#2\else +%<latexrelease> \errmessage{No room for a new #3}% +%<latexrelease> \fi} +%<latexrelease> \def\newXeTeXintercharclass{% +%<latexrelease> \xe@alloc@\xe@alloc@intercharclass +%<latexrelease> \XeTeXcharclass\chardef\@cclv} +%<latexrelease> \fi +%<latexrelease>\EndIncludeInRelease +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2016/02/01}% +%<latexrelease> {\xe@alloc@intercharclass}{Start of XeTeX class allocator}% +\ifx\XeTeXcharclass\@undefined +\else + \countdef\xe@alloc@intercharclass=257 + \xe@alloc@intercharclass=\z@ +\fi +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\xe@alloc@intercharclass}{Start of XeTeX class allocator}% +%<latexrelease> \ifx\XeTeXcharclass\@undefined +%<latexrelease> \else +%<latexrelease> \xe@alloc@intercharclass=\thr@@ +%<latexrelease> \fi +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\xe@alloc@intercharclass}{Start of XeTeX class allocator}% +%<latexrelease> \ifx\XeTeXcharclass\@undefined +%<latexrelease> \else +%<latexrelease> \newcount\xe@alloc@intercharclass +%<latexrelease> \xe@alloc@intercharclass=\thr@@ +%<latexrelease> \fi +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% The default values of the picture and |\fbox| parameters: +% \begin{macrocode} +\unitlength = 1pt +\fboxsep = 3pt +\fboxrule = .4pt +% \end{macrocode} +% The saved value of \TeX's |\maxdepth|: +% \begin{macrocode} +\@maxdepth = \maxdepth +% \end{macrocode} +% |\vsize| initialized because a |\clearpage| with |\vsize < \topskip| +% causes trouble. +% |\@colroom| and |\@colht| also initialized because |\vsize| may be +% set to them if a |\clearpage| is done before the |\begin{document}| +% +% \begin{macrocode} +\vsize = 1000pt +\@colroom = \vsize +\@colht = \vsize +% \end{macrocode} +% Initialise |\textheight| |\textwidth| and page style, to avoid +% internal errors if they are not set by the class. +% \changes{v0.1b}{1994/04/18} +% {Initialise \cs{textheight}, \cs{textwidth} and page style} +% \begin{macrocode} +\textheight=.5\maxdimen +\textwidth=\textheight +\ps@empty +% \end{macrocode} +% +% \subsection{Lccodes for hyphenation} +% +% \changes{v2.0a}{2015/01/03}{Unicode data loading added} +% \changes{v2.0c}{2015/01/24}{Skip T1-code entirely with Unicode engines} +% \changes{v2.0d}{2015/03/26}{Use renamed +% \texttt{unicode-letters.def}} +% \changes{v2.0i}{2015/12/10}{Use new common Unicode data loaders} +% \changes{v2.0j}{2016/01/04}{Do not set up inter character classes for +% XeTeX} +% \changes{v2.0l}{2016/01/05}{Correct \textsf{latexrelease} guards} +% \changes{v2.0l}{2016/01/05}{Ensure old definitions for inter-character +% class toks are available using \textsf{latexrelease}} +% \changes{v2.0m}{2016/01/05}{Undefine XeTeX classes when using patching +% an older kernel} +% \changes{v2.0l}{2016/01/05}{Missing brace} +% \changes{v2.0p}{2016/01/05}{Only apply XeTeX change if XeTeX is in use} +% For $7$- and $8$-bit engines the assumption of T1 encodings is the +% basis for the hyphenation patterns. That's not the case for the Unicode +% engines, where the assumption is engine-native working. The common +% loader system provides access to data from the Unicode Consortium +% covering not only |\lccode| but also other related data. The +% |\lccode| part of that at least needs to be loaded before hyphenation is +% tackled: Xe\TeX{} follows the standard \TeX{} route of building patterns +% into the format. Lua\TeX{} doesn't require this data be loaded \emph{here} +% but it does need to be loaded somewhere. Rather than test for the Unicode +% engines by name, the approach here is to look for the extended math mode +% handling both provide: any other engine developed in this area will +% presumably also provide |\Umathcode|. +% \begin{macrocode} +\ifnum 0% + \ifx\Umathcode\@undefined\else 1\fi + \ifx\XeTeXmathcode\@undefined\else 1\fi + >\z@ + \message{ Unicode character data,} + \input{load-unicode-data} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2016/02/01}% +%<latexrelease> {\XeTeXintercharclasses}{XeTeX character classes}% +%<latexrelease> \ifx\XeTeXinterchartoks\undefined +%<latexrelease> \else +%<latexrelease> \begingroup +%<latexrelease> \chardef\XeTeXcharclassID = 0 % +%<latexrelease> \chardef\XeTeXcharclassOP = 0 % +%<latexrelease> \chardef\XeTeXcharclassCL = 0 % +%<latexrelease> \chardef\XeTeXcharclassEX = 0 % +%<latexrelease> \chardef\XeTeXcharclassIS = 0 % +%<latexrelease> \chardef\XeTeXcharclassNS = 0 % +%<latexrelease> \chardef\XeTeXcharclassCM = 0 % +%<latexrelease> \input{load-unicode-xetex-classes} +%<latexrelease> \endgroup +%<latexrelease> \global\let\xtxHanGlue\undefined +%<latexrelease> \global\let\xtxHanSpace\undefined +%<latexrelease> \global\XeTeXinterchartoks 0 1 = {} +%<latexrelease> \global\XeTeXinterchartoks 0 2 = {} +%<latexrelease> \global\XeTeXinterchartoks 0 3 = {} +%<latexrelease> \global\XeTeXinterchartoks 1 0 = {} +%<latexrelease> \global\XeTeXinterchartoks 2 0 = {} +%<latexrelease> \global\XeTeXinterchartoks 3 0 = {} +%<latexrelease> \global\XeTeXinterchartoks 1 1 = {} +%<latexrelease> \global\XeTeXinterchartoks 1 2 = {} +%<latexrelease> \global\XeTeXinterchartoks 1 3 = {} +%<latexrelease> \global\XeTeXinterchartoks 2 1 = {} +%<latexrelease> \global\XeTeXinterchartoks 2 2 = {} +%<latexrelease> \global\XeTeXinterchartoks 2 3 = {} +%<latexrelease> \global\XeTeXinterchartoks 3 1 = {} +%<latexrelease> \global\XeTeXinterchartoks 3 2 = {} +%<latexrelease> \global\XeTeXinterchartoks 3 3 = {} +%<latexrelease> \fi +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\XeTeXintercharclasses}{XeTeX character classes}% +%<latexrelease> \ifx\XeTeXinterchartoks\undefined +%<latexrelease> \else +%<latexrelease> \input{load-unicode-xetex-classes} +%<latexrelease> \gdef\xtxHanGlue{\hskip0pt plus 0.1em\relax} +%<latexrelease> \gdef\xtxHanSpace{\hskip0.2em plus 0.2em minus 0.1em\relax} +%<latexrelease> \global\XeTeXinterchartoks 0 1 = {\xtxHanSpace} +%<latexrelease> \global\XeTeXinterchartoks 0 2 = {\xtxHanSpace} +%<latexrelease> \global\XeTeXinterchartoks 0 3 = {\nobreak\xtxHanSpace} +%<latexrelease> \global\XeTeXinterchartoks 1 0 = {\xtxHanSpace} +%<latexrelease> \global\XeTeXinterchartoks 2 0 = {\nobreak\xtxHanSpace} +%<latexrelease> \global\XeTeXinterchartoks 3 0 = {\xtxHanSpace} +%<latexrelease> \global\XeTeXinterchartoks 1 1 = {\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 1 2 = {\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 1 3 = {\nobreak\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 2 1 = {\nobreak\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 2 2 = {\nobreak\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 2 3 = {\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 3 1 = {\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 3 2 = {\xtxHanGlue} +%<latexrelease> \global\XeTeXinterchartoks 3 3 = {\nobreak\xtxHanGlue} +%<latexrelease> \fi +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \changes{v2.0d}{2015/02/03}{Set \cs{lccode} for \texttt{-} with Unicode +% engines} +% There is one over-ride that makes sense here (see below for the same for +% $8$-bit engines): setting the lccode for |-| to itself. +% \begin{macrocode} + \lccode`\- =`\- % default hyphen char +% \end{macrocode} +% The alternative is that a ``traditional'' engine is in use. +% \begin{macrocode} +\else +% \end{macrocode} +% \changes{v1.1b}{1998/05/20}{Set up lccodes before loading +% hyphenation files: pr/2639} +% We set things up so that hyphenation files can assume that the +% default (T1) lccodes are in use (at present this also sets up the +% uccodes). +% We temporarily define |\reserved@a| to apply |\reserved@c| to +% all the numbers in the range of its arguments. +% \begin{macrocode} +\def\reserved@a#1#2{% + \@tempcnta#1\relax + \@tempcntb#2\relax + \reserved@b +} +\def\reserved@b{% + \ifnum\@tempcnta>\@tempcntb\else + \reserved@c\@tempcnta + \advance\@tempcnta\@ne + \expandafter\reserved@b + \fi +} +% \end{macrocode} +% Depending on the \TeX{} version, we might not be allowed to do +% this for non-ASCII characters. +% \changes{v1.0n}{1994/06/09}{For \TeX2, do not set codes for higher +% half of character table.} +% \begin{macrocode} +\def\reserved@c#1{% + \count@=#1\advance\count@ by -"20 + \uccode#1=\count@ + \lccode#1=#1 +} +\reserved@a{`\a}{`\z} +\reserved@a{"A0}{"BC} +\reserved@a{"E0}{"FF} +% \end{macrocode} +% The upper case characters need their |\uccode| and |\lccode| values +% set, and their |\sfcode| set to 999. +% \begin{macrocode} +\def\reserved@c#1{% + \count@=#1\advance\count@ by "20 + \uccode#1=#1 + \lccode#1=\count@ + \sfcode#1=999 +} +\reserved@a{`\A}{`\Z} +\reserved@a{"80}{"9C} +\reserved@a{"C0}{"DF} +% \end{macrocode} +% Well, it would be nice if that were correct, but unfortunately, the +% Cork encoding contains some odd slots whose uccode or lccode isn't +% quite what you'd expect. +% \begin{macrocode} +\uccode`\^^Y=`\I % dotless i +\lccode`\^^Y=`\^^Y % dotless i +\uccode`\^^Z=`\J % dotless j, ae in OT1 +\lccode`\^^Z=`\^^Z % dotless j, ae in OT1 +\lccode`\^^9d=`\i % dotted I +\uccode`\^^9d=`\^^9d % dotted I +\lccode`\^^9e=`\^^9e % d-bar +\uccode`\^^9e=`\^^d0 % d-bar +% \end{macrocode} +% Finally here is one that helps hyphenation in the OT1 encoding. +% \changes{v1.0z}{1996/10/31} +% {Added extra \cs{lcode}, hoping it does no harm in T1 (pr/1969)} +% \begin{macrocode} +\lccode`\^^[=`\^^[ % oe in OT1 +% \end{macrocode} +% +% And we also set the |\lccode| of |\-| and |\textcompwordmark| so +% that they do not prevent hyphenation in the remainder of the word +% (as suggested by Lars Helstr\"om). +% \changes{v1.1e}{2003/10/13} +% {Added extra \cs{lccode} for \cs{-} and \cs{textcompwordmark}} +% \begin{macrocode} +\lccode`\- =`\- % default hyphen char +\lccode 127=127 % alternate hyphen char +\lccode 23 =23 % textcompwordmark in T1 +% \end{macrocode} +% +% End of the conditional to select either Unicode or T1 encoding defaults. +% \begin{macrocode} +\fi +% \end{macrocode} +% +% This is as good a place as any to active a few Xe\TeX{}-specific +% settings +% \begin{macrocode} +\ifx\XeTeXuseglyphmetrics\@undefined +\else + \XeTeXuseglyphmetrics=1 % + \XeTeXdashbreakstate=1 % +\fi +% \end{macrocode} +% +% \subsection{Hyphenation} +% +% \changes{v0.1a}{1994/03/07}{move code here from lhyphen.dtx} +% \changes{v0.1a}{1994/03/07} +% {use \cs{InputIfFileExists} not \cs{IfFileExists}} +% \changes{v1.0x}{1995/11/01} +% {(DPC) Switch meaning of \cs{@addtofilelist} for cfg files}% +% The following code will be compiled into the format file. It checks +% for the existence of \texttt{hyphen.cfg} in inputs that file if +% found. Otherwise it inputs \texttt{hyphen.ltx}. Note that these +% are loaded in \emph{before} the |\catcode|s are set, so local +% hyphenation files can use 8-bit input. +% +% We try to load the customized hyphenation description file. +% \begin{macrocode} +\InputIfFileExists{hyphen.cfg} + {\typeout{===========================================^^J% + Local configuration file hyphen.cfg used^^J% + ===========================================}% + \def\@addtofilelist##1{\xdef\@filelist{\@filelist,##1}}% + } + {\input{hyphen.ltx}} +\let\@addtofilelist\@gobble +% \end{macrocode} +% +% \begin{macro}{\l@nohyphenation} +% \changes{v2.0t}{2017/03/09}{ensure \cs{l@nohyphenation} is defined.} +% \begin{macrocode} +\ifx\l@nohyphenation \@undefined + \newlanguage\l@nohyphenation +\fi +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\document@default@language} +% Default document language. -1 acts as language 0, but used as a flag in |\document| +% to see if it has been set in the preamble. +% \changes{v2.1f}{2018/08/24}{Add to latexrelease (github/68)} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2017/04/15}% +%<latexrelease> {\document@default@language}{Save language for hyphenation}% +\let\document@default@language\m@ne +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\document@default@language}{Save language for hyphenation}% +%<latexrelease>\let\document@default@language\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Font loading} +% Fonts loaded during the formatting process might already have +% changed the |\font@submax| from |0pt| to something higher. +% If so, we put out a bold warning. +% \changes{v0.1l}{1994/05/20}{Use new font warning commands} +% \changes{v1.1c}{2000/08/23}{Fix typo in warning} +% \begin{macrocode} +\ifdim \font@submax >\z@ + \@font@warning{Size substitutions with differences\MessageBreak + up to \font@submax\space have occurred.\MessageBreak + \MessageBreak + Please check the transcript file + carefully\MessageBreak + and redo the format generation if necessary! + \@gobbletwo}% + \errhelp{Only stopped, to give you time to + read the above message.} + \errmessage{} +% \end{macrocode} +% We reset the macro. Otherwise every user will get a warning on +% every job. +% \begin{macrocode} +\def\font@submax{0pt} +\fi +% \end{macrocode} +% +% \subsection{Input encoding} +% +% \changes{v2.1a}{2018/03/25}{default to UTF-8} +% Starting with the 2018 \LaTeX\ release default the inputencoding +% to UTF-8. Unless the format is being used with luatex, xetex, enctex or mltex. +% +% This is done in a way largely compatible with older releases: |utf8.def| is input just as if\\ +% |\usepackage[utf8]{inputenc}|\\ +% had been used, however rather than input the whole package a minimal core part just enough to support +% loading the UTF-8 encoding files is defined here. +% +% If a document re-specifies UTF-8 this is silently ignored. +% +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +% \end{macrocode} +% +% Check that a classic 8-bit tex engine is being used (LaTeX or PDFLaTeX). +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2018/04/01}% +%<latexrelease> {\UTFviii@invalid}{UTF-8 default}% +% \end{macrocode} +% +% +% Skip this section in Unicode TeX, or if MLTeX and EncTeX are enabled. +% \begin{macrocode} +\ifnum0% + \ifx\Umathchar\@undefined\else 1\fi + \ifx\mubyte\@undefined\else 1\fi + \ifx\charsubdef\@undefined\else 1\fi + =\z@ +% \end{macrocode} +% +% \begin{macrocode} +\def\saved@space@catcode{10} +\let\@inpenc@test\relax +\def\IeC{% + \ifx\protect\@typeset@protect + \expandafter\@firstofone + \else + \noexpand\IeC + \fi +} +% \end{macrocode} +% +% Make characters active for UTF-8 input formats +% \begin{macrocode} +\@tempcnta=1 +\loop + \catcode\@tempcnta=13 % + \advance\@tempcnta\@ne % +\ifnum\@tempcnta<32 % +\repeat % +\catcode0=15 % null +\catcode9=10 % tab +\catcode10=12 % ctrl J +\catcode12=13 % ctrl L +\catcode13=5 % newline +\@tempcnta=128 +\loop + \catcode\@tempcnta=13 + \advance\@tempcnta\@ne +\ifnum\@tempcnta<256 +\repeat +% \end{macrocode} +% +% \begin{macro}{\UseRawInputEncoding} +% \changes{v2.1a}{2018/03/25}{Macro added} +% Reset 8 bit characters to catcode 12 so the input endcoing matches the ``Raw'' +% font encoding. +% Useful for special behaviours, or for compatibility with older \LaTeX\ formats. +% \changes{v2.1b}{2018/04/06}{Undo changes to \cs{DeclareFontEncoding@} and +% definition of \cs{DeclareUnicodeCharacter}} +% \changes{v2.1c}{2018/04/07}{Undefine \cs{inputencodingname}} +% \begin{macrocode} +\def\UseRawInputEncoding{% +\let\inputencodingname\@undefined % revert +\let\DeclareFontEncoding@\DeclareFontEncoding@saved % revert +\let\DeclareUnicodeCharacter\@undefined % revert +\@tempcnta=1 +\loop + \catcode\@tempcnta=15 % + \advance\@tempcnta\@ne % +\ifnum\@tempcnta<32 % +\repeat % +\catcode0=15 % null +\catcode9=10 % tab +\catcode10=12 % ctrl J +\catcode12=13 % ctrl L +\catcode13=5 % newline +\@tempcnta=128 +\loop + \catcode\@tempcnta=12 + \advance\@tempcnta\@ne +\ifnum\@tempcnta<256 +\repeat +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareFontEncoding@saved} +% Saved version of |\DeclareFontEncoding@| before \texttt{utf8.def} +% modifies it for use in |\UseRawInputEncoding| above. +% \begin{macrocode} +\let\DeclareFontEncoding@saved\DeclareFontEncoding@ +% \end{macrocode} +% \end{macro} +% +% \changes{v2.1d}{2018/04/08}{Delay full UTF-8 handling to \cs{everyjob}} +% \changes{v2.18}{2018/05/11}{Make invalid UTF-8 also safe, for legacy filesystem encodings} +% \begin{macrocode} +\edef\inputencodingname{utf8}% +\input{utf8.def} +\let\UTFviii@undefined@err@@\UTFviii@undefined@err +\let\UTFviii@invalid@err@@\UTFviii@invalid@err +\let\UTFviii@two@octets@@\UTFviii@two@octets +\let\UTFviii@three@octets@@\UTFviii@three@octets +\let\UTFviii@four@octets@@\UTFviii@four@octets +%<2ekernel>\def\UTFviii@undefined@err#1{\@gobble#1}% +%<2ekernel>\let\UTFviii@invalid@err\string +%<2ekernel>\let\UTFviii@two@octets\string +%<2ekernel>\let\UTFviii@three@octets\string +%<2ekernel>\let\UTFviii@four@octets\string +%<2ekernel>\everyjob\expandafter{\the\everyjob +%<2ekernel>\let\UTFviii@undefined@err\UTFviii@undefined@err@@ +%<2ekernel>\let\UTFviii@invalid@err\UTFviii@invalid@err@@ +%<2ekernel>\let\UTFviii@two@octets\UTFviii@two@octets@@ +%<2ekernel>\let\UTFviii@three@octets\UTFviii@three@octets@@ +%<2ekernel>\let\UTFviii@four@octets\UTFviii@four@octets@@ +%<2ekernel>} +\let\@inpenc@test\@undefined +\let\saved@space@catcode\@undefined +% \end{macrocode} +% +% For formats not set up for UTF-8 default, set the C0 controls to catcode 15. +% \begin{macrocode} +\else +\@tempcnta=0 +\loop + \catcode\@tempcnta=15 % + \advance\@tempcnta\@ne % +\ifnum\@tempcnta<32 % +\repeat % +\catcode0=15 % null +\catcode9=10 % tab +\catcode10=12 % ctrl J +\catcode12=13 % ctrl L +\catcode13=5 % newline +% \end{macrocode} +% +% \begin{macrocode} +\let\UseRawInputEncoding\relax +% \end{macrocode} +% +% \begin{macrocode} +\fi +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\UTFviii@invalid}{UTF-8 default}% +% \end{macrocode} +% +% The first block of commands got only introduced in 2019 but we +% revert all of Unicode support in one go not jump to the +% intermediate version. +% \begin{macrocode} +%<latexrelease> \let\UTFviii@two@octets@combine\@undefined +%<latexrelease> \let\UTFviii@three@octets@combine\@undefined +%<latexrelease> \let\UTFviii@four@octets@combine\@undefined +%<latexrelease> \let\UTFviii@two@octets@string\@undefined +%<latexrelease> \let\UTFviii@three@octets@string\@undefined +%<latexrelease> \let\UTFviii@four@octets@string\@undefined +%<latexrelease> \let\UTFviii@two@octets@noexpand\@undefined +%<latexrelease> \let\UTFviii@three@octets@noexpand\@undefined +%<latexrelease> \let\UTFviii@four@octets@noexpand\@undefined +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\@tempcnta=0 +%<latexrelease>\loop +%<latexrelease> \catcode\@tempcnta=15 +%<latexrelease> \advance\@tempcnta\@ne +%<latexrelease>\ifnum\@tempcnta<32 +%<latexrelease>\repeat % +%<latexrelease>\catcode9=10 % tab +%<latexrelease>\catcode10=12 % ctrl J +%<latexrelease>\catcode12=13 % ctrl L +%<latexrelease>\catcode13=5 % newline +%<latexrelease>\@tempcnta=128 +%<latexrelease>\loop +%<latexrelease>\catcode\@tempcnta=12 +%<latexrelease>\advance\@tempcnta\@ne +%<latexrelease>\ifnum\@tempcnta<256 +%<latexrelease>\repeat +%<latexrelease>\let\IeC\@undefined +%<latexrelease>\def\DeclareFontEncoding@#1#2#3{% +%<latexrelease> \expandafter +%<latexrelease> \ifx\csname T@#1\endcsname\relax +%<latexrelease> \def\cdp@elt{\noexpand\cdp@elt}% +%<latexrelease> \xdef\cdp@list{\cdp@list\cdp@elt{#1}% +%<latexrelease> {\default@family}{\default@series}% +%<latexrelease> {\default@shape}}% +%<latexrelease> \expandafter\let\csname#1-cmd\endcsname\@changed@cmd +%<latexrelease> \else +%<latexrelease> \@font@info{Redeclaring font encoding #1}% +%<latexrelease> \fi +%<latexrelease> \global\@namedef{T@#1}{#2}% +%<latexrelease> \global\@namedef{M@#1}{\default@M#3}% +%<latexrelease> \xdef\LastDeclaredEncoding{#1}% +%<latexrelease> } +%<latexrelease> \let\UseRawInputEncoding\@undefined +%<latexrelease> \let\DeclareFontEncoding@saved\@undefined +%<latexrelease> \let\inputencodingname\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \begin{macrocode} +%<*2ekernel> +% \begin{macrocode} +% +% We temporarily define |\reserved@a| to apply |\reserved@c| to all the +% numbers in the range of its arguments. +% \begin{macrocode} +\def\reserved@a#1#2{% + \@tempcnta#1\relax + \@tempcntb#2\relax + \reserved@b +} +\def\reserved@b{% + \ifnum\@tempcnta>\@tempcntb\else + \reserved@c\@tempcnta + \advance\@tempcnta\@ne + \expandafter\reserved@b + \fi +} +% \end{macrocode} +% \changes{v0.1e}{1994/05/02}{Added setting the special catcodes.} +% \changes{v0.1f}{1994/05/02}{Set the catcode of control-J.} +% Set the special catcodes (although some of these are useless, since an +% error will have occurred if the catcodes have changed). Note that +% |^^J| has catcode `other' for use in warning messages. +% \begin{macrocode} +\catcode`\ =10 +\catcode`\#=6 +\catcode`\$=3 +\catcode`\%=14 +\catcode`\&=4 +\catcode`\\=0 +\catcode`\^=7 +\catcode`\_=8 +\catcode`\{=1 +\catcode`\}=2 +\catcode`\~=13 +\catcode`\@=11 +\catcode`\^^I=10 +\catcode`\^^J=12 +\catcode`\^^L=13 +\catcode`\^^M=5 +% \end{macrocode} +% \changes{v0.1e}{1994/05/02}{Added setting the `other' catcodes.} +% Set the `other' catcodes. +% \begin{macrocode} +\def\reserved@c#1{\catcode#1=12\relax} +\reserved@c{`\!} +\reserved@c{`\"} +\reserved@a{`\'}{`\?} +\reserved@c{`\[} +\reserved@c{`\]} +\reserved@c{`\`} +\reserved@c{`\|} +% \end{macrocode} +% \changes{v0.1e}{1994/05/02}{Added setting the `letter' catcodes.} +% Set the `letter' catcodes. +% \begin{macrocode} +\def\reserved@c#1{\catcode#1=11\relax} +\reserved@a{`\A}{`\Z} +\reserved@a{`\a}{`\z} +% \end{macrocode} +% \changes{v0.1e}{1994/05/02}{Made slot 127 illegal} +% \changes{v1.0n}{1994/11/18} +% {re-allow slots 127--255} +% All the characters in the range 0--31 and 127--255 are illegal, +% \emph{except} tab (|^^I|), nl (|^^J|), ff (|^^L|) and cr (|^^M|). +% +% +% \subsection{Lccodes and uccodes} +% +% \changes{v1.1b}{1998/05/20}{Set up uc/lccodes after loading +% hyphenation files: pr/2639} +% We now again set up the default (T1) uc/lccodes. +% The lower case characters need their |\uccode| and |\lccode| values +% set. Some of this is a repeat of the set-up before loading +% hyphenation files. +% Depending on the \TeX{} version, we might not be allowed to do +% this for non-ASCII characters. +% \changes{v1.0n}{1994/06/09}{For \TeX2, do not set codes for higher +% half of character table.} +% \changes{v2.0a}{2015/01/03}{Skip resetting codes with Unicode engines} +% For the Unicode engines (Xe\TeX{} and Lua\TeX{}) there is no need to +% do any of this: they use hyphenation data which does not alter any +% of the set up and so this entire block is skipped. +% \begin{macrocode} +\ifnum 0% + \ifx\Umathcode\@undefined\else 1\fi + \ifx\XeTeXmathcode\@undefined\else 1\fi + >\z@ +\else +\def\reserved@c#1{% + \count@=#1\advance\count@ by -"20 + \uccode#1=\count@ + \lccode#1=#1 +} +\reserved@a{`\a}{`\z} +\reserved@a{"A0}{"BC} +\reserved@a{"E0}{"FF} +% \end{macrocode} +% The upper case characters need their |\uccode| and |\lccode| values +% set, and their |\sfcode| set to 999. +% \begin{macrocode} +\def\reserved@c#1{% + \count@=#1\advance\count@ by "20 + \uccode#1=#1 + \lccode#1=\count@ + \sfcode#1=999 +} +\reserved@a{`\A}{`\Z} +\reserved@a{"80}{"9C} +\reserved@a{"C0}{"DF} +% \end{macrocode} +% Well, it would be nice if that were correct, but unfortunately, the +% Cork encoding contains some odd slots whose uccode or lccode isn't +% quite what you'd expect. +% \begin{macrocode} +\uccode`\^^Y=`\I % dotless i +\lccode`\^^Y=`\^^Y % dotless i +\uccode`\^^Z=`\J % dotless j, ae in OT1 +\lccode`\^^Z=`\^^Z % dotless j, ae in OT1 +\lccode`\^^9d=`\i % dotted I +\uccode`\^^9d=`\^^9d % dotted I +\lccode`\^^9e=`\^^9e % d-bar +\uccode`\^^9e=`\^^d0 % d-bar +% \end{macrocode} +% Finally here is one that helps hyphenation in the OT1 encoding. +% \changes{v1.0z}{1996/10/31} +% {Added extra \cs{lcode}, hoping it does no harm in T1 (pr/1969)} +% \begin{macrocode} +\lccode`\^^[=`\^^[ % oe in OT1 +\fi % End of reset block for 8-bit engines +% \end{macrocode} +% +% \begin{macro}{\MakeUppercase} +% \begin{macro}{\MakeUppercase} +% \begin{macro}{\@uclclist} +% +% \changes{v1.1a}{1997/10/20}{Removed \cs{aa} and \cs{AA} from +% \cs{@uclclist} as these are macros.} +% +% And whilst we're doing things with uc/lc tables, here are two +% commands to upper- and lower-case a string. +% +% \emph{Note} that this implementation is subject to change! At +% the moment we're not providing any way to extend the list of +% uc/lc commands, since finding a good interface is difficult. +% These commands have some nasty features, such as uppercasing +% mathematics, environment names, labels, etc. A much better +% long-term solution is to use all-caps fonts, but these aren't +% generally available. +% \begin{macrocode} +\DeclareRobustCommand{\MakeUppercase}[1]{{% + \def\i{I}\def\j{J}% + \def\reserved@a##1##2{\let##1##2\reserved@a}% + \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}% + \protected@edef\reserved@a{\uppercase{#1}}% + \reserved@a + }} +\DeclareRobustCommand{\MakeLowercase}[1]{{% + \def\reserved@a##1##2{\let##2##1\reserved@a}% + \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}% + \protected@edef\reserved@a{\lowercase{#1}}% + \reserved@a + }} +\def\@uclclist{\oe\OE\o\O\ae\AE + \dh\DH\dj\DJ\l\L\ng\NG\ss\SS\th\TH} +% \end{macrocode} +% The above code works, but has the nasty side-effect that if you +% say something like: +%\begin{verbatim} +% \markboth{\MakeUppercase\contentsname} +% {\MakeUppercase\contentsname} +%\end{verbatim} +% then the uppercasing is only done to the first letter of the +% contents name, since the mark expands out to: +%\begin{verbatim} +% \mark{\protect\MakeUppercase Table of Contents} +% {\protect\MakeUppercase Table of Contents} +%\end{verbatim} +% In order to get round this, we redefine |\MakeUppercase| and +% |\MakeLowercase| to grab their argument and brace it. This is a +% very low-level hack, and is \emph{not} recommended practice! +% This is an instance of a general problem that makes it unsafe to +% grab arguments unbraced, and probably needs a more general +% solution. For the moment though, this hack will do: +% \begin{macrocode} +\protected@edef\MakeUppercase#1{\MakeUppercase{#1}} +\protected@edef\MakeLowercase#1{\MakeLowercase{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{v1.0h}{1994/05/13}{Added output enc stuff} +% \changes{v1.0i}{1994/05/16}{moved output enc stuff to lfonts} +% +% \changes{v0.1a}{1994/03/07}{Add code from the old dump.dtx} +% +% \subsection{Applying Patch files} +% Between major releases, small patches will be distributed in +% files |ltpatch.ltx| which must be added at this point. +% \changes{v1.0m}{1994/06/08}{Add patch file system} +% \changes{v2.0h}{2015/06/23} +% {set \cs{patch@level} in ltvers rather than in ltfinal/ltpatch} +% +% Patch file code removed. +% \begin{macrocode} +%\IfFileExists{ltpatch.ltx} +% {\typeout{=================================^^J% +% Applying patch file ltpatch.ltx^^J% +% =================================} +% \def\fmtversion@topatch{unknown} +% \input{ltpatch.ltx} +% \ifx\fmtversion\fmtversion@topatch +% \ifx\patch@level\@undefined +% \typeout{^^J^^J^^J% +% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% +% !! Patch file `ltpatch.ltx' not suitable for this^^J% +% !! version of LaTeX.^^J^^J% +% !! Please check if initex found an old patch file:^^J% +% !! --- if so, rename it or delete it, and redo the^^J% +% !! initex run.^^J% +% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% +% \batchmode \@@end +% \else +% \end{macrocode} +% \changes{v1.0q}{1995/04/21} +% {Allow initial patch level 0} +% \changes{v1.0t}{1995/06/13} +% {Add patch level string more carefully} +% The code below adds the `patch level' string to the first |\typeout| +% in the startup banner. +% \begin{macrocode} +% \def\fmtversion@topatch{0}% +% \ifx\fmtversion@topatch\patch@level\else +% \def\reserved@a\typeout##1##2\reserved@a{% +% \typeout{##1 patch level \patch@level}##2} +% \everyjob\expandafter\expandafter\expandafter{% +% \expandafter\reserved@a\the\everyjob\reserved@a} +% \let\reserved@a\relax +% \the\everyjob +% \fi +% \fi +% \else +% \typeout{^^J^^J^^J% +% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% +% !! Patch file `ltpatch.ltx' (for version <\fmtversion@topatch>)^^J% +% !! is not suitable for version <\fmtversion> of LaTeX.^^J^^J% +% !! Please check if initex found an old patch file:^^J% +% !! --- if so, rename it or delete it, and redo the^^J% +% !! initex run.^^J% +% !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J}% +% \batchmode \@@end +% \fi +% \let\fmtversion@topatch\relax +% }{} +% \end{macrocode} +% +% \subsection{Freeing Memory} +% +% \begin{macro}{\reserved@a} +% \begin{macro}{\reserved@b} +% \changes{v1.0v}{1995/10/17}{reset here after the \cs{input} above} +% And just to make sure nobody relies on those definitions of +% |\reserved@b| and friends. +% These macros are reserved for use in the kernel. \emph{Do not use +% them as general scratch macros}. +% \begin{macrocode} +\let\reserved@a\@filelist +\let\reserved@b=\@undefined +\let\reserved@c=\@undefined +\let\reserved@d=\@undefined +\let\reserved@e=\@undefined +\let\reserved@f=\@undefined +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\toks} +% \changes{v1.0y}{1996/07/10} +% {Free up memory from scratch registers /2213} +% \begin{macrocode} +\toks0{} +\toks2{} +\toks4{} +\toks6{} +\toks8{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\errhelp} +% \changes{v0.1g}{1994/05/05}{Set error help empty.} +% \changes{v1.1d}{2000/09/01}{Set error help empty at very end +% (pr/449 done correctly).} +% Empty the error help message, which may have some rubbish: +% \begin{macrocode} +\errhelp{} +% \end{macrocode} +% \end{macro} +% +% \subsection{Initialise file list} +% +% \begin{macro}{\@providesfile} +% \changes{v1.0v}{1995/10/17}{reset macro} +% Initialise for use in the document. During initex a modified version +% has been used which leaves debugging information for |latexbug.tex|. +% \begin{macrocode} +\def\@providesfile#1[#2]{% + \wlog{File: #1 #2}% + \expandafter\xdef\csname ver@#1\endcsname{#2}% + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@filelist} +% \changes{v1.0w}{1995/10/19}{Move after \cs{reserved@a} setting:-)} +% \begin{macro}{\@addtofilelist} +% Reset |\@filelist| so files input while making the format are not +% listed. The list built up so far may take up a lot of memory and so +% it is moved to |\reserved@a| where it will be overwritten as soon +% as almost any \LaTeX\ command is issued in a class file. +% However the |latexbug.tex| program will be able to access this +% information and insert it into a bug report. +% \begin{macrocode} +\let\@filelist\@gobble +\def\@addtofilelist#1{\xdef\@filelist{\@filelist,#1}}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Dumping the format} +% Finally we make |@| into a letter, ensure the format will +% be in the `normal' error mode, and dump everything into the +% format file. +% \changes{v1.0t}{1995/06/13} +% {Call \cs{errorstopmode}} +% \begin{macrocode} +\makeatother +\errorstopmode +\dump +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx b/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx new file mode 100644 index 00000000000..ac1e37688ee --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfloat.dtx @@ -0,0 +1,1517 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltfloat.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltfloat.dtx}[2015/02/21 v1.2c LaTeX Kernel (Floats)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltfloat.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Floats} +% +% The different types of floats are identified by a \meta{type} name, +% which is the name of the counter for that kind of float. For +% example, figures are of type `figure' and tables are of type `table'. +% Each \meta{type} has associated a positive \meta{type number}, which +% is a power of two. E.g.,\\ +% figures might be have type number~1, tables type number~2, programs +% type number~4, etc. +% +% The locations where a float can go are specified by a +% \meta{placement specifier}, which is a list of the possible +% locations, each denoted by a letter as follows: +% \begin{center} +% \begin{tabular}{l@{ : }l@{ --- }l} +% h & here & at the current location in the text.\\ +% t & top & at the top of a text page.\\ +% b & bottom & at the bottom of a text page.\\ +% p & page & on a separate float page +% \end{tabular} +% \end{center} +% In addition, in conjunction with these, you can use `!' which means +% that the current values of the float positioning parameters are +% ignored for this float. (Has no effect on `p', float page +% positioning.) +% For example, `pht' specifies that the float can appear in any of +% three locations: page, here or top. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/04}{Initial version, split from latex.dtx} +% \changes{v1.0b}{1994/03/28}{Split further from ltherest.dtx} +% \changes{v1.0e}{1994/04/25}{Changed warning messages} +% \changes{v1.0e}{1994/04/25}{Removed obsolete tracing code} +% \changes{v1.0f}{1994/05/03} +% {(CAR) Added \cs{@largefloatcheck}} +% \changes{v1.0f}{1994/05/03}{Removed unnecessary braces from +% arguments of \cs{@ifnextchar}} +% \changes{v1.0i}{1994/05/22}{Use new warning commands} +% \changes{v1.1e}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.1g}{1994/12/10}{Some temps reinserted temporarily} +% \changes{v1.1n}{1995/11/28}{documentation fixes} +% \changes{v1.1s}{1997/06/16}{documentation fixes} +% +% \subsection{Floating Environments} +% \begin{macrocode} +%<*2ekernel> +\message{floats,} +% \end{macrocode} +% \begin{oldcomments} +% +% Where floats may appear on a page, and how many may appear there +% are specified by the following float placement parameters. The +% numbers are named like counters so the user can set them with +% the ordinary counter-setting commands. +% +% \c@topnumber : Number of floats allowed at the top of a column. +% \topfraction : Fraction of column that can be devoted to floats. +% \c@dbltopnumber, \dbltopfraction +% : Same as above, but for double-column floats. +% \c@bottomnumber, \bottomfraction +% : Same as above for bottom of page. +% \c@totalnumber : Number of floats allowed in a single column, +% including in-text floats. +% \textfraction :Minimum fraction of column that must contain text. +% \floatpagefraction: Minimum fraction of page that must be taken +% up by float page. +% \dblfloatpagefraction +% : Same as above, for double-column floats. +% +% The document style must define the following. +% +% \fps@TYPE : The default placement specifier for floats of type +% TYPE. +% +% \ftype@TYPE : The type number for floats of type TYPE. +% +% \ext@TYPE : The file extension indicating the file on which the +% contents list for float type TYPE is stored. +% For example, \ext@figure = 'lof'. +% +% \fnum@TYPE : A macro to generate the figure number for a caption. +% For example, \fnum@TYPE == Figure \thefigure. +% +% \@makecaption{NUM}{TEXT} : +% A macro to make a caption, with NUM the value +% produced by \fnum@... and TEXT the text of the caption. +% It can assume it's in a \parbox of the appropriate width. +% +% \@float{TYPE}[PLACEMENT] : This macro begins a float environment for a +% single-column float of type TYPE with PLACEMENT as the placement +% specifier. The default value of PLACEMENT is defined by +% \fps@TYPE. The environment is ended by \end@float. +% E.g., \figure == \@float{figure}, \endfigure == \end@float. +% +% \@float{TYPE}[PLACEMENT] == +% BEGIN +% if hmode then \@bsphack +% \@floatpenalty := -10002 +% else \@floatpenalty := -10003 +% fi +% \@captype ==L TYPE +% \@dblflset +% \@fps ==L PLACEMENT +% \@onelevel@sanitize \@fps +% add default PLACEMENT if at most ! in PLACEMENT == \@fpsadddefault +% if inner +% then LaTeX Error: 'Not in outer paragraph mode.' +% \@floatpenalty := 0 +% else if \@freelist nonempty +% then \@currbox :=L head of \@freelist +% \@freelist :=G tail of \@freelist +% \count\@currbox :=G 32*\ftype@TYPE + +% bits determined by PLACEMENT +% else \@floatpenalty := 0 +% LaTeX Error: 'Too many unprocessed floats' +% fi +% fi +% \@currbox :=G \color@vbox +% \normalcolor +% \vbox{ +% %% 15 Dec 87 -- +% %% removed \boxmaxdepth :=L 0pt +% %% that made box 0 depth because it screwed +% %% things up. Instead, added \vskip0pt at end +% \hsize = \columnwidth +% \@parboxrestore +% \@floatboxreset +% END +% +% \caption == +% BEGIN +% \refstepcounter{\@captype} +% \@dblarg{\@caption{\@captype}} +% END +% +% In following definition, \par moved from after \addcontentsline to +% before \addcontentsline because the \write could cause +% an extra blank line to be added to the paragraph above the +% caption. (Change made 12 Jun 87) +% +% \@caption{TYPE}[STEXT]{TEXT} == +% BEGIN +% \par +% \addcontentsline{\ext@TYPE}{TYPE}{\numberline{\theTYPE}{STEXT}} +% \begingroup +% \@parboxrestore +% \@normalsize +% \@makecaption{\fnum@TYPE}{TEXT} +% \par +% \endgroup +% END +% +% +% \@dblfloat{TYPE}[PLACEMENT] : Macro to begin a float environment for +% a double-column float of type TYPE with PLACEMENT as the placement +% specifier. The default value of PLACEMENT is 'tp' +% The environment is ended by \end@dblfloat. +% E.g., \figure* == \@dblfloat{figure}, +% \endfigure* == \end@dblfloat. +% +% \@dblfloat{TYPE}[PLACEMENT] == +% Identical to \@float{TYPE}[PLACEMENT] except \hsize and \linewidth +% are set to \textwidth. +% \end{oldcomments} +% +% \begin{macro}{\@floatpenalty} +% \begin{macrocode} +\newcount\@floatpenalty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\caption} +% +% This is set to be an error message outside a float since no +% captype is defined there; this may need to be changed by some +% classes. +% \changes{v1.1u}{1999/04/19} +% {Made caption an error outside a float: latex/2815} +% \begin{macrocode} +\def\caption{% + \ifx\@captype\@undefined + \@latex@error{\noexpand\caption outside float}\@ehd + \expandafter\@gobble + \else + \refstepcounter\@captype + \expandafter\@firstofone + \fi + {\@dblarg{\@caption\@captype}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@caption} +% \changes{v1.0b}{1994/03/28} +% {Use \cs{normalsize} not \cs{@normalsize}} +% \changes{v1.1r}{1996/12/06} +% {Call \cs{@setminpage} if needed. latex/2318} +% \begin{macrocode} +\long\def\@caption#1[#2]#3{% + \par + \addcontentsline{\csname ext@#1\endcsname}{#1}% + {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}% + \begingroup +% \end{macrocode} +% +% The paragraph setting parameters are normalised at this point, however +% |\@parboxrestore| resets |\everypar| which is not correct in this +% context so |\@setminipage| is called if needed. +% +% The float mechanism, like minipage, sets the flag |@minipage| true +% before executing the user-supplied text. Many \LaTeX\ constructs +% test for this flag and do not add vertical space when it is true. +% The intention is that this emulates \TeX's `top of page' behaviour. +% The flag must be set false at the start of the first paragraph. This +% is achieved by a redefinition of |\everypar|, but the call to +% |\@parboxrestore| removes that redefinition, so it is re-inserted +% if needed. If the flag is already false then the |\caption| was not +% the first entry in the float, and so some other paragraph has already +% activated the special |\everypar|. In this case no further action is +% needed. +% \begin{macrocode} + \@parboxrestore + \if@minipage + \@setminipage + \fi +% \end{macrocode} +% +% \begin{macrocode} + \normalsize + \@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@float} +% \begin{macro}{\@dblflset} +% \changes{v1.1a}{1994/10/31}{Macro added} +% \changes{v1.1g}{1994/12/10}{Macro removed temporarily} +% \changes{v1.1a}{1994/10/31} +% {Major changes to parameter parsing, setting of local variables, +% etc; two-column and one-column cases merged; space hacks moved} +% \changes{v1.1c}{1994/11/05} +% {Add compatibility with old version of \cs{@xfloat}.} +% \changes{v1.1g}{1994/12/10}{Old version reinstated temporarily} +% +% \begin{macrocode} +\def\@float#1{% + \@ifnextchar[% + {\@xfloat{#1}}% + {\edef\reserved@a{\noexpand\@xfloat{#1}[\csname fps@#1\endcsname]}% + \reserved@a}} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dblfloat} +% \changes{v1.1a}{1994/10/31} +% {Major changes since two-column and one-column cases merged} +% \changes{v1.1g}{1994/12/10}{Old version reinstated temporarily} +% +% \begin{macrocode} +\def\@dblfloat{% + \if@twocolumn\let\reserved@a\@dbflt\else\let\reserved@a\@float\fi + \reserved@a} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\fps@dbl} +% \changes{v1.1a}{1994/10/31}{Macro added} +% \changes{v1.1g}{1994/12/10}{Macro removed temporarily} +% Note that all double floats have default fps `tp'. +% \end{macro} +% +% \begin{macro}{\@setfps} +% \changes{v1.1a}{1994/10/31}{Macro added} +% \changes{v1.1c}{1994/11/05} +% {Add compatibility with old version of \cs{@xfloat}.} +% \changes{v1.1g}{1994/12/10}{Macro removed temporarily} +% This sets the fps, dealing with error conditions by adding +% the default. +% +% \end{macro} +% +% \begin{macro}{\@xfloat} +% \changes{LaTeX2e}{1993/12/05}{Command changed} +% \changes{LaTeX2e}{1994/01/21}{Added missing percent characters.} +% \changes{v1.1a}{1994/10/31} +% {Major changes, removing setting of local variables, space hacks +% etc; two-column and one-column cases merged} +% \changes{v1.1c}{1994/11/05} +% {Add compatibility with old version of \cs{@xfloat}: but the +% arguments, provided at exorbitant cost, are now completely +% ignored} +% \changes{v1.1f}{1994/11/21} +% {Missing percents reinserted after 4, 8: these are not numbers.} +% \changes{v1.1g}{1994/12/10}{Old version reinstated temporarily} +% \changes{v1.1g}{1994/12/10}{Sanitisation added temporarily} +% The first part of this sets the count register that stores all +% the information about the type and fps of the float. +% +% We assume here that the default specifiers already contain no +% active characters. +% +% It may be better to store the defaults as numbers, rather than +% symbol strings. +% +% \changes{v1.1p}{1996/10/24}{Added \cs{@nodocument} to trap +% floats in the preamble} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\@xfloat}{Check float options}% +%<*2ekernel|latexrelease> +\def\@xfloat #1[#2]{% + \@nodocument + \def \@captype {#1}% + \def \@fps {#2}% + \@onelevel@sanitize \@fps + \def \reserved@b {!}% + \ifx \reserved@b \@fps + \@fpsadddefault + \else + \ifx \@fps \@empty + \@fpsadddefault + \fi + \fi + \ifhmode + \@bsphack + \@floatpenalty -\@Mii + \else + \@floatpenalty-\@Miii + \fi + \ifinner + \@parmoderr\@floatpenalty\z@ + \else + \@next\@currbox\@freelist + {% + \@tempcnta \sixt@@n + \expandafter \@tfor \expandafter \reserved@a + \expandafter :\expandafter =\@fps + \do +% \end{macrocode} +% \changes{v1.2b}{2015/01/11}{Check for valid option (latexrelease)} +% Start of changes, use a nested if structure, ending in an error. +% \begin{macrocode} + {% + \if \reserved@a h% + \ifodd \@tempcnta + \else + \advance \@tempcnta \@ne + \fi + \else\if \reserved@a t% + \@setfpsbit \tw@ + \else\if \reserved@a b% + \@setfpsbit 4% + \else\if \reserved@a p% + \@setfpsbit 8% + \else\if \reserved@a !% + \ifnum \@tempcnta>15 + \advance\@tempcnta -\sixt@@n\relax + \fi + \else + \@latex@error{Unknown float option `\reserved@a'}% + {Option `\reserved@a' ignored and `p' used.}% + \@setfpsbit 8% + \fi\fi\fi\fi\fi + }% +% \end{macrocode} +% End of changes +% \begin{macrocode} + \@tempcntb \csname ftype@\@captype \endcsname + \multiply \@tempcntb \@xxxii + \advance \@tempcnta \@tempcntb + \global \count\@currbox \@tempcnta + }% + \@fltovf + \fi +% \end{macrocode} +% The remainder sets up the box in which the float is typeset, and +% the typesetting environment to be used. It is essential to have +% the extra box to avoid the unwanted space that would otherwise +% often be put at the top of the float. +% +% It ends with a hook; not sure how useful this is but it is needed +% at present to deal with double-column floats. +% \task{CAR?}{Sort out hooks} +% \changes{v1.0a}{1994/03/07} +% {(DPC) Extra group for colour} +% \changes{v1.0c}{1994/03/14} +% {(DPC) Use \cs{color@begingroup}} +% \changes{v1.0g}{1994/05/13} +% {(DPC) Use \cs{normalcolor}} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Extra box added to remove colour resetting from vmode} +% \changes{v1.1a}{1994/10/31}{Reset hook added} +% \changes{v1.1c}{1994/11/05} +% {Use new \cs{color@hbox} concept.} +% \changes{v1.1f}{1994/11/21} +% {Changed to \cs{color@vbox} so that large floats overflow +% at the bottom} +% \changes{v1.1f}{1994/11/21}{Use \cs{@setnobreak}} +% \changes{v1.1f}{1994/11/21}{Added \cs{@setminipage}} +% \changes{v1.1f}{1994/11/21}{Added resetting of size and font} +% \changes{v1.1m}{1995/05/25}{(CAR) Resettings moved to hook} +% \begin{macrocode} + \global \setbox\@currbox + \color@vbox + \normalcolor + \vbox \bgroup + \hsize\columnwidth + \@parboxrestore + \@floatboxreset +}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@xfloat}{Check float options}% +%<latexrelease>\def\@xfloat #1[#2]{% +%<latexrelease> \@nodocument +%<latexrelease> \def \@captype {#1}% +%<latexrelease> \def \@fps {#2}% +%<latexrelease> \@onelevel@sanitize \@fps +%<latexrelease> \def \reserved@b {!}% +%<latexrelease> \ifx \reserved@b \@fps +%<latexrelease> \@fpsadddefault +%<latexrelease> \else +%<latexrelease> \ifx \@fps \@empty +%<latexrelease> \@fpsadddefault +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \ifhmode +%<latexrelease> \@bsphack +%<latexrelease> \@floatpenalty -\@Mii +%<latexrelease> \else +%<latexrelease> \@floatpenalty-\@Miii +%<latexrelease> \fi +%<latexrelease> \ifinner +%<latexrelease> \@parmoderr\@floatpenalty\z@ +%<latexrelease> \else +%<latexrelease> \@next\@currbox\@freelist +%<latexrelease> {% +%<latexrelease> \@tempcnta \sixt@@n +%<latexrelease> \expandafter \@tfor \expandafter \reserved@a +%<latexrelease> \expandafter :\expandafter =\@fps +%<latexrelease> \do +%<latexrelease> {% +%<latexrelease> \if \reserved@a h% +%<latexrelease> \ifodd \@tempcnta +%<latexrelease> \else +%<latexrelease> \advance \@tempcnta \@ne +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \if \reserved@a t% +%<latexrelease> \@setfpsbit \tw@ +%<latexrelease> \fi +%<latexrelease> \if \reserved@a b% +%<latexrelease> \@setfpsbit 4% +%<latexrelease> \fi +%<latexrelease> \if \reserved@a p% +%<latexrelease> \@setfpsbit 8% +%<latexrelease> \fi +%<latexrelease> \if \reserved@a !% +%<latexrelease> \ifnum \@tempcnta>15 +%<latexrelease> \advance\@tempcnta -\sixt@@n\relax +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> }% +%<latexrelease> \@tempcntb \csname ftype@\@captype \endcsname +%<latexrelease> \multiply \@tempcntb \@xxxii +%<latexrelease> \advance \@tempcnta \@tempcntb +%<latexrelease> \global \count\@currbox \@tempcnta +%<latexrelease> }% +%<latexrelease> \@fltovf +%<latexrelease> \fi +%<latexrelease> \global \setbox\@currbox +%<latexrelease> \color@vbox +%<latexrelease> \normalcolor +%<latexrelease> \vbox \bgroup +%<latexrelease> \hsize\columnwidth +%<latexrelease> \@parboxrestore +%<latexrelease> \@floatboxreset +%<latexrelease>}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@floatboxreset} +% \changes{v1.1a}{1994/10/31}{Macro added} +% +% The rational for allowing these normally global flags to be set +% locally here, via |\@parboxrestore|, was stated originally by +% Donald Arseneau and extended by Chris Rowley. +% It is because these flags are only set globally to +% true by section commands, and these should never appear within +% marginals or floats or, indeed, in any group; and they are only ever +% set globally to false when they are definitely true. +% +% If anyone is unhappy with this argument then both flags should be +% treated as in |\set@nobreak|; otherwise this command will be +% redundant. +% \changes{v1.1p}{1996/10/24} +% {Added local settings of flags: dangerous!!} +% \begin{macrocode} +\def \@floatboxreset {% + \reset@font + \normalsize + \@setminipage +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@setnobreak} +% \changes{v1.1f}{1994/11/21}{Macro added} +% \changes{v1.1n}{1996/07/26}{remove unecessary \cs{global} before +% \cs{@nobreak...}} +% \begin{macrocode} +\def \@setnobreak{% + \if@nobreak + \let\outer@nobreak\@nobreaktrue + \@nobreakfalse + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@setminipage} +% \changes{v1.1f}{1994/11/21}{Macro added} +% \changes{v1.1n}{1996/07/26}{remove unecessary \cs{global} before +% \cs{@minipage...}} +% \begin{macrocode} +\def \@setminipage{% + \@minipagetrue + \everypar{\@minipagefalse\everypar{}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@float} +% \changes{v1.0f}{1994/05/03} +% {(CAR) Added \cs{@largefloatcheck}} +% \changes{v1.1n}{1995/10/25}{(CAR) unify code for double and +% single versions} +% \begin{macrocode} +\def\end@float{% + \@endfloatbox + \ifnum\@floatpenalty <\z@ +% \end{macrocode} +% We make sure that we never exceed |\textheight|, otherwise float +% will never get typeset (91/03/15 FMi). +% \begin{macrocode} + \@largefloatcheck + \@cons\@currlist\@currbox + \ifnum\@floatpenalty <-\@Mii + \penalty -\@Miv +% \end{macrocode} +% Saving and restoring |\prevdepth| added 26 May 87 to prevent extra +% vertical space when used in vertical mode. +% \begin{macrocode} + \@tempdima\prevdepth + \vbox{}% + \prevdepth\@tempdima +% \end{macrocode} +% +% \begin{macrocode} + \penalty\@floatpenalty +% \end{macrocode} +% \changes{LaTeX2.09}{1992/03/18} +% {(RmS) changed \cs{@esphack} to \cs{@Esphack}} +% \begin{macrocode} + \else + \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end@dblfloat} +% \changes{v1.0f}{1994/05/03}{\cs{@largefloatcheck} added} +% \changes{v1.1n}{1995/10/25}{(CAR) unify code for double and +% single versions} +% \changes{v1.2b}{2015/01/11}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\end@dblfloat}{float order in 2-column}% +%<*2ekernel|latexrelease> +\def\end@dblfloat{% + \if@twocolumn + \@endfloatbox + \ifnum\@floatpenalty <\z@ + \@largefloatcheck +% \end{macrocode} +% +% Force the depth of two column float boxes. +% \begin{macrocode} + \global\dp\@currbox1sp % +% \end{macrocode} +% What follows is essentially |\end@float| without a starting +% |\@endfloatbox|. +% \changes{v1.2b}{2000/09/24}{FMi: use output routine to +% defer float} +% \changes{v1.2b}{2014/04/27}{Inline the code to allow some +% coexistence with packages that hook into \cs{end@float} and do not +% know about the algorithm change} +% \begin{macrocode} + \@cons\@currlist\@currbox + \ifnum\@floatpenalty <-\@Mii + \penalty -\@Miv + \@tempdima\prevdepth + \vbox{}% + \prevdepth\@tempdima + \penalty\@floatpenalty + \else + \vadjust{\penalty -\@Miv \vbox{}\penalty\@floatpenalty}\@Esphack + \fi +% \end{macrocode} +% \changes{v1.2b}{2014/06/10}{missing \cs{fi} added} +% \begin{macrocode} + \fi + \else + \end@float + \fi +}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\end@dblfloat}{float order in 2-column}% +%<latexrelease>\def\end@dblfloat{% +%<latexrelease>\if@twocolumn +%<latexrelease> \@endfloatbox +%<latexrelease> \ifnum\@floatpenalty <\z@ +% \end{macrocode} +% We make sure that we never exceed |\textheight|, otherwise float +% will never get typeset (91/03/15 FMi). +% \begin{macrocode} +%<latexrelease> \@largefloatcheck +%<latexrelease> \@cons\@dbldeferlist\@currbox +%<latexrelease> \fi +% \end{macrocode} +% RmS 92/03/18 changed |\@esphack| to |\@Esphack|. +% \begin{macrocode} +%<latexrelease> \ifnum \@floatpenalty =-\@Mii \@Esphack\fi +%<latexrelease>\else +%<latexrelease> \end@float +%<latexrelease>\fi +%<latexrelease>}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@endfloatbox} +% \changes{v1.1n}{1995/10/25}{(CAR) macro added: to unify code for +% double and single versions} +% This macro is not intended to be a hook; it is designed to help +% maintain the integrity of this code, which is used twice and, as +% can be seen, is subject to frequent changes. +% \begin{macrocode} +\def \@endfloatbox{% + \par\vskip\z@skip %% \par\vskip\z@ added 15 Dec 87 +% \end{macrocode} +% \changes{v1.0a} +% {1994/03/07}{(DPC) Extra group for colour} +% \changes{v1.0c}{1994/03/14} +% {(DPC) Use \cs{color@endgroup}} +% \changes{v1.0h}{1994/05/20}{Restore outer value of @nobreak switch.} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Extra box added to remove colour resetting from vmode} +% \changes{v1.1c}{1994/11/05} +% {Use new \cs{color@hbox} concept.} +% \changes{v1.1f}{1994/11/21}{Corrected position of \cs{outer@nobreak}} +% \changes{v1.1f}{1994/11/21}{Added reset of minipage flag} +% \changes{v1.1n}{1996/07/26}{remove unecessary \cs{global} before +% \cs{@minipage...}} +% \begin{macrocode} + \@minipagefalse + \outer@nobreak + \egroup %% end of vbox + \color@endbox +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\outer@nobreak} +% \changes{v1.0h}{1994/05/20}{Macro added: default is to do nothing.} +% \begin{macrocode} +\let\outer@nobreak\@empty +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@largefloatcheck} +% \changes{v1.0e}{1994/04/25}{Command added} +% +% This calculates by how much a float is oversize for the page and +% prints this in a warning message. +% +% \begin{macrocode} +\def \@largefloatcheck{% + \ifdim \ht\@currbox>\textheight + \@tempdima -\textheight + \advance \@tempdima \ht\@currbox +% \end{macrocode} +% \changes{v1.0e}{1994/04/25}{Changed warning message to give more +% info} +% \begin{macrocode} + \@latex@warning {Float too large for page by \the\@tempdima}% + \ht\@currbox \textheight + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dbflt} +% \begin{macro}{\@xdblfloat} +% \changes{v1.1a}{1994/10/31} +% {Macros removed: \cs{@dbflt}, \cs{@xdblfloat}} +% \changes{v1.1g}{1994/12/10}{Macros reinserted temporarily} +% +% +% \begin{macrocode} +\def\@dbflt#1{\@ifnextchar[{\@xdblfloat{#1}}{\@xdblfloat{#1}[tp]}} +\def\@xdblfloat#1[#2]{% + \@xfloat{#1}[#2]\hsize\textwidth\linewidth\textwidth} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% Moved to ltoutput 93/12/16 +% \begin{macrocode} +%\newcount\c@topnumber +%\newcount\c@dbltopnumber +%\newcount\c@bottomnumber +%\newcount\c@totalnumber +% \end{macrocode} +% +% \begin{macro}{\@floatplacement} +% An analysis of |\@floatplacement|: +% +% This should be called whenever |\@colht| has been set. +% \begin{macrocode} +\def\@floatplacement{\global\@topnum\c@topnumber + % Textpage bit, global: + \global\@toproom \topfraction\@colht + \global\@botnum \c@bottomnumber + \global\@botroom \bottomfraction\@colht + \global\@colnum \c@totalnumber + % Floatpage bit, local: + \@fpmin \floatpagefraction\@colht} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dblfloatplacement} +% \changes{LaTeX2e}{1993/12/05}{Command changed} +% +% This should be called only within a group. Now changed to +% provide extra checks in |\@addtodblcol|, needed when processing a +% BANG float. +% +% \changes{v1.2b}{2015/01/11}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\@dblfloatplacement}{float order in 2-column}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% When making two column float area, look for floats with 1sp +% depth. +% \begin{macrocode} +\def\@dblfloatplacement{\global\@dbltopnum\c@dbltopnumber + \global\@dbltoproom \dbltopfraction\@colht + \@textmin \@colht + \advance \@textmin -\@dbltoproom + \@fpmin \dblfloatpagefraction\textheight + \@fptop \@dblfptop + \@fpsep \@dblfpsep + \@fpbot \@dblfpbot +% \end{macrocode} +% |\f@depth| is used in |\@testwrongwidth| to look for either +% column or dbl-column floats. A value of |1sp| signals the +% latter. Because of this setting here, |\@dblfloatplacment| needs to +% be called inside a group which is a questionable design. +% \begin{macrocode} + \def\f@depth{1sp}}% +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@dblfloatplacement}{float order in 2-column}% +%<latexrelease>\def \@dblfloatplacement {% +% \end{macrocode} +% Textpage bit: global, but need not be. +% \begin{macrocode} +%<latexrelease> \global \@dbltopnum \c@dbltopnumber +%<latexrelease> \global \@dbltoproom \dbltopfraction\@colht +% \end{macrocode} +% This new bit uses |\@textmin| to locally store the amount of extra +% room in the column. +% \begin{macrocode} +%<latexrelease> \@textmin \@colht +%<latexrelease> \advance \@textmin -\@dbltoproom +% \end{macrocode} +% Floatpage bit: must be local. +% \begin{macrocode} +%<latexrelease> \@fpmin \dblfloatpagefraction\textheight +%<latexrelease> \@fptop \@dblfptop +%<latexrelease> \@fpsep \@dblfpsep +%<latexrelease> \@fpbot \@dblfpbot +%<latexrelease>}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{oldcomments} +% MARGINAL NOTES: +% +% Marginal notes use the same mechanism as floats to communicate +% with the \output routine. Marginal notes are distinguished from +% floats by having a negative placement specification. The command +% \marginpar [LTEXT]{RTEXT} generates a marginal note in a parbox, +% using LTEXT if it's on the left and RTEXT if it's on the right. +% (Default is RTEXT = LTEXT.) It uses the following parameters. +% +% \marginparwidth : Width of marginal notes. +% \marginparsep : Distance between marginal note and text. +% the page layout to determine how to move the marginal +% note into the margin. E.g., \@leftmarginskip == +% \hskip -\marginparwidth \hskip -\marginparsep . +% \marginparpush : Minimum vertical separation between \marginpar's +% +% Marginal notes are normally put on the outside of the page +% if @mparswitch = true, and on the right if @mparswitch = false. +% The command \reversemarginpar reverses the side where they +% are put. \normalmarginpar undoes \reversemarginpar. +% These commands have no effect for two-column output. +% +% SURPRISE: if two marginal notes appear on the same line of +% text, then the second one could appear on the next page, in +% a funny position. +% +% +% \marginpar [LTEXT]{RTEXT} == +% BEGIN +% if hmode then \@bsphack +% \@floatpenalty := -10002 +% else \@floatpenalty := -10003 +% fi +% if inner +% then LaTeX Error: 'Not in outer paragraph mode.' +% \@floatpenalty := 0 +% else if \@freelist has two elements: +% then get \@marbox, \@currbox from \@freelist +% \count\@marbox :=G -1 +% else \@floatpenalty := 0 +% LaTeX Error: 'Too many unprocessed floats' +% \@currbox, \@marbox := \@tempboxa %%use \def +% fi +% fi +% if optional argument +% then %% \@xmpar == +% \@savemarbox\@marbox{LTEXT} +% \@savemarbox\@currbox{RTEXT} +% else %% \@ympar == +% \@savemarbox\@marbox{RTEXT} +% \box\@currbox :=G \box\@marbox +% fi +% \@xympar +% END +% +% \reversemarginpar == BEGIN \@mparbottom :=G 0 +% @reversemargin :=G true +% END +% +% \normalmarginpar == BEGIN \@mparbottom :=G 0 +% @reversemargin :=G false +% END +% +% \end{oldcomments} +% +% \begin{macro}{\marginpar} +% \begin{macrocode} +\def\marginpar{% + \ifhmode + \@bsphack + \@floatpenalty -\@Mii + \else + \@floatpenalty-\@Miii + \fi + \ifinner + \@parmoderr + \@floatpenalty\z@ + \else + \@next\@currbox\@freelist{}{}% + \@next\@marbox\@freelist{\global\count\@marbox\m@ne}% + {\@floatpenalty\z@ + \@fltovf\def\@currbox{\@tempboxa}\def\@marbox{\@tempboxa}}% + \fi + \@ifnextchar [\@xmpar\@ympar} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xmpar} +% \begin{macrocode} +\long\def\@xmpar[#1]#2{% + \@savemarbox\@marbox{#1}% + \@savemarbox\@currbox{#2}% + \@xympar} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ympar} +% \begin{macrocode} +\long\def\@ympar#1{% + \@savemarbox\@marbox{#1}% + \global\setbox\@currbox\copy\@marbox + \@xympar} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@savemarbox} +% \changes{v1.0b}{1994/03/12} +% {(DPC) Extra group for colour} +% \changes{v1.0c}{1994/03/14} +% {(DPC) Use \cs{color@begingroup}} +% \changes{v1.0d}{1994/04/18} +% {(DPC) Remove Colour support} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Extra box added for colour} +% \changes{v1.1c}{1994/11/05} +% {Use new \cs{color@hbox} concept.} +% \changes{v1.1f}{1994/11/21}{Changed to \cs{color@vbox} } +% \changes{v1.1f}{1994/11/21}{Use \cs{@setnobreak} etc} +% \changes{v1.1f}{1994/11/21}{Added \cs{@setminipage} etc} +% \changes{v1.1f}{1994/11/21}{Added resetting of size and font} +% \changes{v1.1m}{1995/05/25}{(CAR) Resettings moved to hook} +% \changes{v1.1n}{1996/07/26}{remove unecessary \cs{global} before +% \cs{@minipage...}} +% \begin{macrocode} +\long\def \@savemarbox #1#2{% + \global\setbox #1% + \color@vbox + \vtop{% + \hsize\marginparwidth + \@parboxrestore + \@marginparreset + #2% + \@minipagefalse + \outer@nobreak + }% + \color@endbox +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@marginparreset} +% \changes{v1.1f}{1994/11/21}{Macro added} +% +% The rational for allowing these normally global flags to be set +% locally here, via |\@parboxrestore| was stated originally by +% Donald Arsenau and extended by Chris Rowley. +% It is because these flags are only set globally to +% true by section commands, and these should never appear within +% marginals or floats or, indeed, in any group; and they are only ever +% set globally to false when they are definitely true. +% +% If anyone is unhappy with this argument then both flags should be +% treated as in |\set@nobreak|; otherwise this command will be +% redundant. +% \changes{v1.1p}{1996/10/24} +% {Added local settings of flags: dangerous!!} +% \begin{macrocode} +\def \@marginparreset {% + \reset@font + \normalsize +% \let\if@nobreak\iffalse +% \let\if@noskipsec\iffalse +% \@setnobreak + \@setminipage +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xympar} +% \begin{macrocode} +% \end{macrocode} +% \changes{LaTeX2.09}{1992/03/18} +% {(RmS) added \cs{global}\cs{@ignorefalse}} +% \changes{v1.0b}{1994/03/12} +% {(DPC) Extra bgroup for colour} +% \changes{1.0c}{1994/03/14} +% {(DPC) Use \cs{color@begingroup}} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Extra box added since needed for floats} +% \changes{v1.1c}{1994/11/05} +% {Use new \cs{color@hbox} concept.} +% \changes{v1.1f}{1994/11/21}{Changed to \cs{color@vbox} } +% Setting the box here is done only because the code +% uses \cs{end@float}; it will be empty and gets discarded. +% \changes{v1.1o}{1996/08/02}{Remove \cs{global} before \cs{@ignore...}} +% \begin{macrocode} +\def \@xympar{% + \ifnum\@floatpenalty <\z@\@cons\@currlist\@marbox\fi + \setbox\@tempboxa + \color@vbox + \vbox \bgroup + \end@float + \@ignorefalse + \@esphack +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reversemarginpar} +% \begin{macro}{\normalmarginpar} +% \begin{macrocode} +\def\reversemarginpar{\global\@mparbottom\z@ \@reversemargintrue} +\def\normalmarginpar{\global\@mparbottom\z@ \@reversemarginfalse} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\message{footnotes,} +% \end{macrocode} +% +% \subsection{Footnotes} +% +% \begin{oldcomments} +% +% \footnote{NOTE} : User command to insert a footnote. +% +% \footnote[NUM]{NOTE}: User command to insert a footnote numbered +% NUM, where NUM is a number -- 1, 2, +% etc. For example, if footnotes are numbered +% *, **, etc. within pages, then \footnote[2]{...} +% produces footnote '**'. This command does not +% step the footnote counter. +% +% \footnotemark[NUM] : Command to produce just the footnote mark in +% the text, but no footnote. With no argument, +% it steps the footnote counter before generating +% the mark. +% +% \footnotetext[NUM]{TEXT} : Command to produce the footnote but +% no mark. \footnote is equivalent to +% \footnotemark \footnotetext . +% +% As in PLAIN, footnotes use \insert\footins, and the following +% parameters: +% +% \footnotesize : Size-changing command for footnotes. +% +% \footnotesep : The height of a strut placed at the beginning of +% every footnote. +% \skip\footins : Space between main text and footnotes. The rule +% separating footnotes from text occurs in this +% space. This space lies above the strut of height +% \footnotesep which is at the beginning of the +% first footnote. +% \footnoterule : Macro to draw the rule separating footnotes from +% text. It is executed right after a \vspace of +% \skip\footins. It should take zero vertical +% space--i.e., it should to a negative skip to +% compensate for any positive space it occupies. +% (See PLAIN.TEX.) +% +% \interfootnotelinepenalty : Interline penalty for footnotes. +% +% \thefootnote : In usual LaTeX style, produces the footnote number. +% If footnotes are to be numbered within pages, then +% the document style file must include an \@addtoreset +% command to cause the footnote counter to be reset +% when the page counter is stepped. This is not a good +% idea, though, because the counter will not always be +% reset in time to ensure that the first footnote on a +% page is footnote number one. +% +% \@thefnmark : Holds the current footnote's mark--e.g., \dag or '1' +% or 'a'. +% +% \@mpfnnumber : A macro that generates the numbers for \footnote +% and \footnotemark commands. It == \thefootnote +% outside a minipage environment, but can be +% changed inside to generate numbers for +% \footnote's. +% +% \@makefnmark : A macro to generate the footnote marker from +% \@thefnmark The default definition was +% \hbox{$^\@thefnmark$}. +% +% This is now replaced by +% \textsuperscript{\@thefnmark} +% +% \@makefntext{NOTE} : +% Must produce the actual footnote, using \@thefnmark as the mark +% of the footnote and NOTE as the text. It is called when +% effectively inside a \parbox, with \hsize = \columnwidth. +% For example, it might be as simple as +% $^{\@thefnmark}$ NOTE +% +% In a minipage environment, \footnote and \footnotetext are redefined +% so that +% (a) they use the counter mpfootnote +% (b) the footnotes they produce go at the bottom of the minipage. +% The switch is accomplished by letting \@mpfn == footnote or mpfootnote +% and \thempfn == \thefootnote or \thempfootnote, and by redefining +% \@footnotetext to be \@mpfootnotetext in the minipage. +% +% \footnote{NOTE} == +% BEGIN +% \stepcounter{\@mpfn} +% begingroup +% \protect == \noexpand +% \@thefnmark :=G eval (\thempfn) +% endgroup +% \@footnotemark +% \@footnotetext{NOTE} +% END +% +% \footnote[NUM]{NOTE} == +% BEGIN +% begingroup +% \protect == \noexpand +% counter \@mpfn :=L NUM +% \@thefnmark :=G eval (\thempfn) +% endgroup +% \@footnotemark +% \@footnotetext{NOTE} +% END +% +% \footnotemark == +% BEGIN \stepcounter{footnote} +% begingroup +% \protect == \noexpand +% \@thefnmark :=G eval(\thefootnote) +% endgroup +% \@footnotemark +% END +% +% \footnotemark[NUM] == +% BEGIN +% begingroup +% footnote counter :=L NUM +% \protect == \noexpand +% \@thefnmark :=G eval(\thefootnote) +% endgroup +% \@footnotemark +% END +% +% \@footnotemark == +% BEGIN +% \leavevmode +% IF hmode THEN \@x@sf := \the\spacefactor FI +% \@makefnmark % put number in main text +% IF hmode THEN \spacefactor := \@x@sf FI +% END +% +% \footnotetext == +% BEGIN begingroup \protect == \noexpand +% \@thefnmark :=G eval (\thempfn) +% endgroup +% \@footnotetext +% END +% +% \footnotetext[NUM] == +% BEGIN begingroup counter \@mpfn :=L NUM +% \protect == \noexpand +% \@thefnmark :=G eval (\thempfn) +% endgroup +% \@footnotetext +% END +% +% \end{oldcomments} +% +% +% \changes{v1.1l}{1995/05/24}{Moved definition of \cs{footins} +% and \cs{footnoterule} from ltplain.} +% +% \begin{macro}{\footins} +% \LaTeX\ does use the same insert for footnotes as PLAIN. +% \begin{macrocode} +\newinsert\footins +% \end{macrocode} +% +% \LaTeX\ leaves these initializations for the |\footins| insert. +% +% \begin{macrocode} +\skip\footins=\bigskipamount % space added when footnote is present +\count\footins=1000 % footnote magnification factor (1 to 1) +\dimen\footins=8in % maximum footnotes per page +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\footnoterule} +% \LaTeX\ keeps PLAIN \TeX's |\footnoterule| as the default. +% +% \begin{macrocode} +\def\footnoterule{\kern-3\p@ + \hrule \@width 2in \kern 2.6\p@} % the \hrule is .4pt high +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thefootnote} +% \changes{v1.1i}{1995/05/16}{Streamlined parts of code.} +% \begin{macrocode} +\@definecounter{footnote} +\def\thefootnote{\@arabic\c@footnote} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thempfootnote} +% \changes{v1.1j}{1995/05/18}{Added \cs{itshape}.} +% \changes{v1.1v}{2002/10/01}{Use braces around \cs{itshape} +% to keep font change local (pr/3460).} +% The default display for the footnote counter in minipages is to +% use italic letters. We use |\itshape| not |\textit| as the latter +% would add an italic correction. +% \begin{macrocode} +\@definecounter{mpfootnote} +\def\thempfootnote{{\itshape\@alph\c@mpfootnote}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefnmark} +% \changes{v1.1i}{1995/05/16}{Now use \cs{textsuperscript}.} +% \changes{v1.1j}{1995/05/18}{Added \cs{normalfont}.} +% \changes{v1.1k}{1995/05/20}{Moved \cs{normalfont} to +% \cs{textsuperscript}} +% \changes{v1.1k}{1995/05/20}{Moved \cs{normalfont} back +% and use \cs{@textsuperscript}} +% Default definition. +% \begin{macrocode} +%\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}} +\def\@makefnmark{\hbox{\@textsuperscript{\normalfont\@thefnmark}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textsuperscript} +% \changes{v1.1i}{1995/05/16}{Command added./pr1503} +% \changes{v1.1k}{1995/05/20}{Use \cs{normalfont}.} +% \changes{v1.1l}{1995/05/24}{Use \cs{@textsuperscript}} +% This command provides superscript characters in the current text +% font. It's implementation might change!!! +% \begin{macrocode} +\DeclareRobustCommand*\textsuperscript[1]{% + \@textsuperscript{\selectfont#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@textsuperscript} +% \changes{v1.1l}{1995/05/24}{Command added.} +% \changes{v1.1n}{1995/12/05}{Use \cs{ensuremath} for latex/1984.} +% \changes{v1.1m}{1995/12/07} +% {Move \cs{m@th} out of the \cs{ensuremath} for latex/1984.} +% This command should not be used directly, but may be used to define +% other commands |\textsuperscript|, |\@makefnmark|. |#1| should +% always start with a font selection command, to activate the font +% size switch. +% \begin{macrocode} +\def\@textsuperscript#1{% + {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textsubscript} +% \changes{v1.2a}{2014/12/30}{Command added (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\textsubscript}{\textsubscript}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand*\textsubscript[1]{% + \@textsubscript{\selectfont#1}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@textsubscript} +% \changes{v1.2a}{2014/12/30}{Command added (latexrelease)} +% +% \begin{macrocode} +\def\@textsubscript#1{% + {\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\textsubscript}{\textsubscript}% +%<latexrelease>\let\textsubscript\@undefined +%<latexrelease>\let\@textsubscript\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macro}{\footnotesep} +% \begin{macrocode} +\newdimen\footnotesep +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\footnote} +% \changes{LaTeX2.09}{1991/11/01} +% {(RmS) Added \cs{let}\cs{protect}\cs{noexpand} in +% \cs{footnote}, \cs{footnotemark}, +% and \cs{footnotetext}, since \cs{xdef} is used} +% \changes{LaTeX2.09}{1991/11/22} +% {(RmS) Added \cs{let}\cs{protect}\cs{noexpand} in +% \cs{@xfootnote}, \cs{@xfootnotemark}, +% and \cs{@xfootnotetext}} +% \changes{LaTeX2.09}{1992/11/26} +% {(RmS) Changed all to +% `def`protect\string{`noexpand`protect`noexpand\string}} +% \changes{v1.1b}{1994/11/26} +% {(ASAJ) Added \cs{protected@xdef}.} +% +% \begin{macrocode} +\def\footnote{\@ifnextchar[\@xfootnote{\stepcounter\@mpfn + \protected@xdef\@thefnmark{\thempfn}% + \@footnotemark\@footnotetext}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xfootnote} +% \begin{macrocode} +\def\@xfootnote[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \@footnotemark\@footnotetext} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotetext} +% \changes{LaTeX2.09}{1991/09/29} +% {(RmS) added \cs{reset@font}} +% \changes{LaTeX2.09}{1992/11/26} +% {(RmS) added protection for \cs{edef}} +% \changes{v1.0a}{1994/03/07} +% {(DPC) Extra group for colour} +% \changes{v1.0c}{1994/03/14} +% {(DPC) Use \cs{color@begingroup}, add \cs{endgraf}} +% \changes{v1.0d}{1994/04/18} +% {(DPC) Remove Colour support} +% \changes{v1.0g}{1994/05/13} +% {(DPC) Add new style colour support: \cs{normalcolor}} +% \changes{v1.0g}{1994/05/13} +% {(DPC) Use \cs{@finalstrut}} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Move colour setting to output routine} +% \changes{v1.1b}{1994/11/04} +% {(ASAJ) Added \cs{protected@edef}.} +% \changes{v1.1c}{1994/11/05} +% {Removed \cs{normalcolor} (again)} +% \changes{v1.1t}{1997/11/19} +% {Missing percent, again} +% \begin{macrocode} +\long\def\@footnotetext#1{\insert\footins{% + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + \csname p@footnote\endcsname\@thefnmark + }% + \color@begingroup + \@makefntext{% + \rule\z@\footnotesep\ignorespaces#1\@finalstrut\strutbox}% + \color@endgroup}}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotemark} +% \changes{v1.1b}{1994/11/04}{Added \cs{protected@xdef} to +% \cs{footnotemark}.} +% \begin{macrocode} +\def\footnotemark{% + \@ifnextchar[\@xfootnotemark + {\stepcounter{footnote}% + \protected@xdef\@thefnmark{\thefootnote}% + \@footnotemark}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xfootnotemark} +% \begin{macrocode} +\def\@xfootnotemark[#1]{% + \begingroup + \c@footnote #1\relax + \unrestored@protected@xdef\@thefnmark{\thefootnote}% + \endgroup + \@footnotemark} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@footnotemark} +% \changes{v1.1h}{1995/05/12} +% {Add \cs{nobreak} to allow hyphenation. latex/1605} +% \begin{macrocode} +\def\@footnotemark{% + \leavevmode + \ifhmode\edef\@x@sf{\the\spacefactor}\nobreak\fi + \@makefnmark + \ifhmode\spacefactor\@x@sf\fi + \relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotetext} +% \begin{macrocode} +\def\footnotetext{% + \@ifnextchar [\@xfootnotenext + {\protected@xdef\@thefnmark{\thempfn}% + \@footnotetext}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xfootnotenext} +% \begin{macrocode} +\def\@xfootnotenext[#1]{% + \begingroup + \csname c@\@mpfn\endcsname #1\relax + \unrestored@protected@xdef\@thefnmark{\thempfn}% + \endgroup + \@footnotetext} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thempfn} +% \begin{macro}{\@mpfn} +% \begin{macrocode} +\def\@mpfn{footnote} +\def\thempfn{\thefootnote} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx b/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx new file mode 100644 index 00000000000..e500ed871a2 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfntcmd.dtx @@ -0,0 +1,776 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltfntcmd.dtx +%% +%<*driver> +% \fi +\ProvidesFile{ltfntcmd.dtx} + [2019/01/27 v3.4b LaTeX Kernel (Font commands)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltfntcmd.dtx} +\title{\filename} +\date{\filedate} +\author{Frank Mittelbach, Chris Rowley} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \iffalse +% Copyright (C) 1994-1995 Frank Mittelbach and Chris Rowley +% all rights reserved. +% \fi +% +% \changes{v2.0b}{1993/05/05}{Removed all LaTeX related cmds} +% \changes{v3.0a}{1993/12/11}{Complete reworking of all text commands, +% using just one creator function} +% \changes{v3.0a}{1993/12/11}{newfontswitch command corrected and +% changed} +% \changes{v3.0a}{1993/12/11}{newcommands replaced by defs} +% \changes{v3.0a}{1993/12/11}{italic correction now put in front of +% penalty before glue} +% \changes{v3.0b}{1993/12/19}{\cs{@pdef} command added} +% \changes{v3.0b}{1993/12/19}{Other tidying} +% \changes{v3.0b}{1993/12/19}{Made \cs{@newfontswitch} produce an +% error if command already exists, and added \cs{@renewfontswitch}, +% ASAJ} +% \changes{v3.0b}{1993/12/19}{Untidying added, so this is now a +% TEMPORARY version.} +% \changes{v3.0b}{1993/12/19}{Some more tidying done} +% \changes{v3.1b}{1994/01/31}{\cs{@normalsize} no longer defined} +% \changes{v3.2a}{1994/03/15}{Adapted to mass formatting} +% \changes{v3.2a}{1994/03/15}{Removed defs of short-forms and all +% sizes except \cs{normalize}} +% \changes{v3.2a}{1994/03/15}{Removed \cs{@renewfontswitch}} +% \changes{v3.2a}{1994/03/15}{Changed \cs{/} to \cs{@@italiccorr}} +% \changes{v3.2b}{1994/04/14}{Macros renamed to non-private forms, JB} +% \changes{v3.3a}{1994/04/20}{New implementation of \cs{nocorr}} +% \changes{v3.3a}{1994/04/20}{Documentation up-dated} +% \changes{v3.3b}{1994/04/30}{Documentation up-dated and tidied} +% \changes{v3.3b}{1994/04/30}{Title changed} +% \changes{v3.3b}{1994/04/30}{Prefix frag@ changed to frag in +% \cs{@protecteddef}} +% \changes{v3.3b}{1994/04/30}{Warning changed to info message in +% \cs{@protecteddef}} +% \changes{v3.3c}{1994/05/05}{Corrected \cs{@fontswitch}} +% \changes{v3.3d}{1994/05/08}{Removed \cs{@undefinedfonterror}} +% \changes{v3.3f}{1994/05/09}{Replaced all \cs{next} by +% \cs{@let@token} and undo change 3.3e, +% whatever that was.} +% \changes{v3.3g}{1994/05/13}{Replaced \cs{@protecteddef} by +% \cs{DeclareRobustCommand}} +% \changes{v3.3h}{1994/05/20}{Use new error commands} +% \changes{v3.3i}{1994/05/24}{Tidying and typos fixed} +% \changes{v3.3j}{1994/05/25}{Insertion of \cs{aftergroup}s to +% implement \cs{nocorr} moved to the end of the group} +% \changes{v3.3k}{1994/06/09}{Tidying and typos fixed in documentation} +% \changes{v3.3l}{1994/06/18}{Added check for empty text} +% \changes{v3.3m}{1994/06/22}{Removed space from \cs{nfss@text}} +% \changes{v3.3m}{1994/06/22}{Renamed \cs{check@nocorr}} +% \changes{v3.3p}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v3.3v}{1997/06/16}{Fix typo in documentation.} +% \changes{v3.3x}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% \def \ie {i.e.~} +% \def \eg {e.g.~} +% +% \def \dst {{\normalfont\scshape docstrip}} +% \def \NFSS {\textsf{NFSS}} +% +% +% \begin{abstract} +% The commands defined in this file \texttt{ltfntcmd} are +% part of the kernel code for \LaTeXe/NFSS2. +% +% It is also meant to serve as documentation for package writers since +% it demonstrates how to define high-level font changing commands +% using a small number of creator functions. +% \end{abstract} +% +% \section{Introduction} +% +% Font changes such as |\bfseries|, |\sffamily|, etc.\ are +% declarations; this means that their scope is delimited by the +% grouping structure, either by the next |\end| of some environment or +% by explicitly using a group, e.g., writing something like +% |{\bfseries...}| in the source. If you make the mistake of writing +% |\bfseries{...}| (thinking of |\bfseries| as a command with one +% argument) then the result is rather striking. +% +% Font declarations are an artifact of the \TeX{} system and for +% several reasons it is better to avoid them on the user level +% whenever possible. In \LaTeX3 they will probably all be +% replaced by environments and by font commands taking one argument. +% +% This file defines a creator function for such declarative font +% switches. This function creates commands which can be used in +% both math and text. +% +% This file also defines a number of high-level commands (all +% starting with |\text..|) that have one argument and typeset this +% argument in the requested way. Thus these commands are for +% typesetting short pieces of text in a specific family, series or +% shape. These are all produced as examples of the use of a creator +% function which is itself also defined in this file. +% +% Table~\ref{tab:fontcmds} shows all these high-level commands in +% action. A further advantage of using these commands is that they +% automatically take care of any necessary italic correction on either +% side of their argument. +% \begin{table}[t] +% \begin{center} +% \begin{tabular}{lll} +% \textit{Command} & \textit{Corresponds to }& \textit{Action} \\[4pt] +% |\textnormal{..}| & |\normalfont| & +% Typeset argument in normal family \\ +% |\textrm{..}| & |\rmfamily| & +% Typeset argument in roman family \\ +% |\textsf{..}| & |\sffamily| & +% Typeset argument in \textsf{sans serif} family \\ +% |\texttt{..}| & |\ttfamily| & +% Typeset argument in \texttt{typewriter} family +% \\[2pt] +% |\textmd{..}| & |\mdseries| & +% Typeset argument in medium series \\ +% |\textbf{..}| & |\bfseries| & +% Typeset argument in \textbf{bold} series \\[2pt] +% |\textup{..}| & |\upshape| & +% Typeset argument in normal shape \\ +% |\textit{..}| & |\itshape| & +% Typeset argument in \textit{italic} shape \\ +% |\textsl{..}| & |\slshape| & +% Typeset argument in \textsl{slanted} shape \\ +% |\textsc{..}| & |\scshape| & +% Typeset argument in \textsc{small caps} shape +% \\[2pt] +% |\emph{..}| & |\em| & +% Typeset argument \emph{emphasized} +% \end{tabular} +% \end{center} +% \caption{Font-change commands with arguments} +% \label{tab:fontcmds} +% \begin{quote} +% The font change commands provided here +% all start with |\text..| to emphasize that they +% are for use in normal text and to be easily memorable. They +% automatically take care of any necessary italic correction on either +% side of the argument. +% \end{quote} +% \end{table} +% +% Thus, when using such commands, one does not have to worry about +% forgetting the italic correction when changing fonts. Only in very +% few situations is this additional space wrong but, for example, most +% typographers recommend omitting the italic correction if a small +% punctuation character, like a comma, directly follows the font +% change. Since the amount of correction required is partly a matter +% of taste, you can define in what situations the italic correction +% should be suppressed. This is done by putting the characters that +% should cancel a preceding italic correction in the list +% |\nocorrlist|.\footnote{Any package that changes the +% \texttt{\string\catcode} of a character inside +% \texttt{\string\nocorrlist} must then explicitly reset the list. +% Otherwise the changed character will no longer be recognized +% by the suppression algorithm.} +% The default definition for this list is produced by the following. +% \begin{verbatim} +% \newcommand \nocorrlist {,.} +% \end{verbatim} +% It is best to declare the most often used characters first, because +% this will make the processing slightly faster. For example, +% \begin{verbatim} +% \emph{When using the \NFSS{} high-level commands, +% the \emph{proper} use of italic corrections is +% automatically taken care of}. Only +% \emph{sometimes} one has to help \LaTeX{} by +% adding a \verb=\nocorr= command. +% \end{verbatim} +% which results in: +% \begin{quote} +% \emph{When using the \NFSS{} high-level commands, +% the \emph{proper} use of italic corrections is +% automatically taken care of}. Only +% \emph{sometimes} one has to help \LaTeX{} by +% adding a \verb=\nocorr= command. +% \end{quote} +% +% In contrast, the use of the declaration forms is often more +% appropriate when you define your own commands or environments. +% \begin{verbatim} +% \newenvironment{bfitemize}{\begin{itemize}\normalfont\bfseries} +% {\end{itemize}} +% \begin{bfitemize} +% \item This environment produces boldface items. +% \item It is defined in terms of \LaTeX's +% \texttt{itemize} environment and NFSS +% declarations. +% \end{bfitemize} +% \end{verbatim} +% This gives: +% \begin{quote} +% \newenvironment{bfitemize} +% {\begin{itemize}\normalfont\bfseries} +% {\end{itemize}} +% \begin{bfitemize} +% \item This environment produces boldface items. +% \item It is defined in terms of \LaTeX's +% \texttt{itemize} environment and NFSS +% declarations. +% \end{bfitemize} +% \end{quote} +% +% In addition to global customization of when to insert the italic +% correction, it is of course sometimes necessary to explicitly insert +% one with |\/|. +% +% It is also possible to suppress the italic correction +% in individual instances. For this, the command |\nocorr| is provided. +% +% The |\nocorr| must appear as the first or last token inside the +% braces of the argument of the |\text...| commands, at that end of +% the text where you wish to suppress the italic correction. +% +% +% It is worth pointing out here that inserting a |\/| in places where +% it can have no function (\ie anywhere except immediately after a +% slanted letter) is not an error---it will just be silently ignored. +% Unfortunately this is not true if the redefinition of |\/| in {\tt +% amstex.sty} is used as this version can cause space to be removed +% immediately before the |\/|. +% +% \StopEventually{} +% +% +% \section{The implementation} +% +% \changes{v3.3z}{2003/01/01}{Code checked and documentation extended +% by Chris} +% +% \begin{macro}{\DeclareTextFontCommand} +% \changes{v3.0a}{1993/12/11}{Macro changed} +% \changes{v3.0a}{1993/12/11}{Macro changed} +% This is the creator function for |\text..| commands. +% It gives a warning if |\foo| or |\fragfoo| is already defined. +% \changes{v3.0b}{1993/12/19}{Corrected and tidied} +% +% In math mode it simply puts the font declaration and text into a +% box (possibly an automagically sized one). +% +% Otherwise it first scans the text to see where |\nocorr| occurs +% within it. This sets the |\check@ic| commands to do what is +% necessary concerning the italic correction at both ends. +% +% The algorithm for deciding whether to put in an italic correction +% is not very subtle: one is added whenever the newly current font +% is not itself positively sloped, unless the next token is a +% character in the `nocorr' list. At the end of the text this +% is done after closing the group so as to check the `outer font'. +% Note that this +% will often result in adding an italic correction token after a +% character in an unsloped font; we believe (in early 2003) that +% this is perhaps inefficient but not dangerous. +% +% It also now checks for empty contents of the text command and optimises +% this case. Some care is also taken to check that doing dangerous +% things in vertical mode is avoided. +% +% The italic correction token is added to the horizontal list +% before (in the list) an immediately preceding non-zero glob of +% glue (skip) and any non-zero penalty preceding that since, in +% the typical case, this puts it immediately +% after the last character in the preceding word. +% +% +% \changes{v3.3j}{1994/05/25}{Insertion of \cs{aftergroup}s moved} +% \changes{v3.3j}{1994/05/25}{\cs{expandafter} inserted} +% \changes{v3.3m}{1994/06/22}{Removed space from \cs{nfss@text}} +% \changes{v3.3u}{1996/10/08}{Removed \cs{check@icr} when in vmode +% since it causes various errors (see pr/2157)} +% \changes{v3.3w}{1997/10/17}{Reinstalled \cs{check@icr} as check is +% now done in \cs{check@nocorr@} (see PR/2646).} +% \changes{v3.3y}{2000/01/30}{Use \cs{hmode@bgroup} now (pr/3160)} +% +% Note that it is necessary to put in the |\aftergroup\maybe@ic| at +% the end of the group so that it comes after any other aftergroup +% tokens and immediately before the following tokens. +% It is also necessary to remove the |\fi| from the token list before +% the group ends; this is done by adding an |\expandafter| just +% before the closing brace. +% +% \begin{macrocode} +%<*2ekernel> +\def \DeclareTextFontCommand #1#2{% + \DeclareRobustCommand#1[1]{% + \ifmmode + \nfss@text{#2##1}% + \else + \hmode@bgroup + \text@command{##1}% + #2\check@icl ##1\check@icr + \expandafter + \egroup + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textrm} +% \begin{macro}{\textsf} +% \begin{macro}{\texttt} +% \begin{macro}{\textnormal} +% Now we define the |\text|\meta{family} commands in terms of the +% above; |\texttt| does not look very nice! +% \begin{macrocode} +\DeclareTextFontCommand{\textrm}{\rmfamily} +\DeclareTextFontCommand{\textsf}{\sffamily} +\DeclareTextFontCommand{\texttt}{\ttfamily} +\DeclareTextFontCommand{\textnormal}{\normalfont} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\textbf} +% \begin{macro}{\textmd} +% For the series attribute: +% \begin{macrocode} +\DeclareTextFontCommand{\textbf}{\bfseries} +\DeclareTextFontCommand{\textmd}{\mdseries} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\textit} +% \begin{macro}{\textsl} +% \begin{macro}{\textsc} +% \begin{macro}{\textup} +% \changes{v3.0a}{1993/12/11}{Macros changed} +% And for the shapes: +% \begin{macrocode} +\DeclareTextFontCommand{\textit}{\itshape} +\DeclareTextFontCommand{\textsl}{\slshape} +\DeclareTextFontCommand{\textsc}{\scshape} +\DeclareTextFontCommand{\textup}{\upshape} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\emph} +% \changes{v3.0a}{1993/12/11}{Macro changed} +% Finally we have the |\em| font change declaration of \LaTeX. The +% corresponding definition with argument is +% \begin{macrocode} +\DeclareTextFontCommand{\emph}{\em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nocorr} +% This is just a label, so it does nothing; it should also be +% unexpandable. +% \begin{macrocode} +\let \nocorr \relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\check@icl} +% \begin{macro}{\check@icr} +% \changes{v3.3j}{1994/05/25}{Macros added} +% \changes{v3.3t}{1996/05/09}{Default definitions added} +% We define these defaults in case some error causes them to be +% expanded at the wrong time. +% \begin{macrocode} +\let \check@icl \@empty +\let \check@icr \@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\text@command} +% \begin{macro}{\check@nocorr@} +% \changes{v3.3a}{1994/04/20}{Macros added} +% \changes{v3.3m}{1994/06/22}{Renamed \cs{check@nocorr} to +% \cs{text@command} to improve \cs{long} error message} +% \changes{v3.3j}{1994/05/25}{Insertion of \cs{aftergroup}s moved +% and defaults set up for efficiency} +% This checks for a |\nocorr| as the first token in its argument +% and also for one in any other position not protected within +% braces (the latter is treated as if it were at the end of the +% argument). +% +% Is this the correct action in the `empty' case? It is efficient but +% typographically it is, strictly, incorrect! +% \changes{v3.3l}{1994/06/18}{Added check for empty text} +% \begin{macrocode} +\def \text@command #1{% + \def \reserved@a {#1}% + \ifx \reserved@a \@empty + \let \check@icl \@empty + \let \check@icr \@empty + \else +% \end{macrocode} +% |\space| is a reserved word in \LaTeX{} or actually already in +% plain \TeX. If somebody really redefines it so many things will +% break that I don't see any reason to make this routine here +% slower than necessary. +% \changes{v3.3q}{1994/12/10}{Use \cs{space} command for comparison} +% \begin{macrocode} +% \def \reserved@b { }% +% \ifx \reserved@a \reserved@b + \ifx \reserved@a \space + \let \check@icl \@empty + \let \check@icr \@empty + \else + \check@nocorr@ #1\nocorr\@nil + \fi + \fi +} +\def \check@nocorr@ #1#2\nocorr#3\@nil {% +% \end{macrocode} +% The two checks are initialised here to their values in +% the normal case. +% \changes{v3.3w}{1997/10/17}{Check for vertical mode moved here, from +% \cs{DeclareTextFontCommand} (see PR/2646).} +% \begin{macrocode} + \let \check@icl \maybe@ic + \def \check@icr {\ifvmode \else \aftergroup \maybe@ic \fi}% + \def \reserved@a {\nocorr}% + \def \reserved@b {#1}% + \def \reserved@c {#3}% + \ifx \reserved@a \reserved@b + \ifx \reserved@c \@empty +% \end{macrocode} +% In this case there is a |\nocorr| at the start but not at the +% end, so |\check@icl| should be empty. +% \begin{macrocode} + \let \check@icl \@empty + \else +% \end{macrocode} +% Otherwise there is a |\nocorr| both at the start and +% elsewhere, so no italic corrections should be added. +% \begin{macrocode} + \let \check@icl \@empty + \let \check@icr \@empty + \fi + \else + \ifx \reserved@c \@empty +% \end{macrocode} +% In this case there is no |\nocorr| anywhere, so we need to check +% for an italic correction at both the beginning and the end. This +% has been set up as the default so no code is needed here. +% \begin{macrocode} + \else +% \end{macrocode} +% In this case there is no |\nocorr| at the start but there is one +% elsewhere, so no |\aftergroup| is needed. +% \begin{macrocode} + \let \check@icr \@empty + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ifmaybe@ic} +% \changes{v3.4a}{2009/12/14}{Macro added} +% Switch used soley within |\maybe@ic| not interfering with other +% switches. +% \begin{macrocode} +\newif\ifmaybe@ic +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\maybe@ic} +% \changes{v3.0a}{1993/12/11}{Macro name changed} +% \begin{macro}{\maybe@ic@} +% \changes{v3.0a}{1993/12/11}{Macro and name changed} +% \changes{v3.4a}{2009/12/14}{Use switch \cs{ifmaybe@ic} instead of +% \cs{if@tempswa}} +% \task{CAR}{Make this more efficient by checking for non-characters +% first and using \cs{if} test?} +% These macros implement the italic correction. +% \begin{macrocode} +\def \maybe@ic {\futurelet\@let@token\maybe@ic@} +\def \maybe@ic@ {% +% \end{macrocode} +% We first check to see if the current font is positively sloped. +% (But do not forget the message Rainer sent about an upright font +% with non-zero slope! Or is this an urban myth?) It has been +% suggested that this should test against a small positive value, +% but what? +% \begin{macrocode} + \ifdim \fontdimen\@ne\font>\z@ + \else + \maybe@ictrue +% \end{macrocode} +% It would be possible, but probably not worthwhile, to continue the +% forward scan beyond any closing braces. +% +% \changes{v3.3a}{1994/04/20}{\cs{nocorr} etc removed from list of +% tokens to check, leaving only punctuation characters} +% \begin{macrocode} + \expandafter\@tfor\expandafter\reserved@a\expandafter:\expandafter=% + \nocorrlist +% \end{macrocode} +% We have to hide the |\@let@token| in the macro |\t@st@ic| rather +% than testing it directly in the loop since it might be |\let| +% to a |\fi| or |\else|, which would result in chaos. +% \changes{v2.1a}{1993/11/24}{Use \cs{t@st@ic}} +% \begin{macrocode} + \do \t@st@ic +% \end{macrocode} +% Frank thinks that the next bit it is inefficient if done after +% the second change. Chris thinks that most all of this is +% inefficient for the commonest cases: but that is the price of a +% cleverer algorithm. It is certainly needed to deal with the use +% of |\nolinebreak|. +% +% \begin{macrocode} + \ifmaybe@ic \sw@slant \fi + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\t@st@ic} +% \changes{v2.1a}{1993/11/24}{Macro added} +% \changes{v3.3s}{1995/07/05}{Renamed from \cs{test@next}} +% The next token in the input stream is stored in |\@let@token| via a +% |\let|, the current token from |\nocorrlist| is stored via |\def| +% in |\reserved@a|. To compare them we have to fiddle around a bit. +% +% If the only things to check were characters then this could be +% done via an |\if| thus their catcodes would not matter; but this +% will not work whilst |\futurelet| is used above. +% \changes{v3.4a}{2009/12/14}{Use switch \cs{ifmaybe@ic} instead of +% \cs{if@tempswa}} +% \begin{macrocode} +\def \t@st@ic {% + \expandafter\let\expandafter\reserved@b\expandafter=\reserved@a\relax + \ifx\reserved@b\@let@token +% \end{macrocode} +% If they are the same we record the fact and jump out of the loop. +% \changes{v3.3s}{1995/07/03}{Use clean interface for jump} +% \begin{macrocode} + \maybe@icfalse + \@break@tfor + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sw@slant} +% \changes{v3.0a}{1993/12/11}{Macro changed} +% \begin{macro}{\fix@penalty} +% \changes{v3.0a}{1993/12/11}{Macro added} +% The definition of the mysterious |\sw@slant| command is as follows. +% \begin{macrocode} +\def \sw@slant {% +% \end{macrocode} +% It is surely correct to put in an italic correction when there +% is no skip. If the last thing on the list is actually a zero +% skip (including things whose dimension part is zero, such as +% |\hfill|), or anything other than a character, then the +% italic correction will have no effect. +% +% In order to work correctly with unbreakable spaces from |~| +% (and other common forms of line-breaking control) we also move +% back across a penalty before the glue. +% \begin{macrocode} + \ifdim \lastskip=\z@ + \fix@penalty + \else + \skip@ \lastskip + \unskip + \fix@penalty + \hskip \skip@ + \fi +} +% \end{macrocode} +% The above code means: ``If there is a non-zero space just before +% the current position (|\ifdim...|) save the amount of that space +% (|\skip@\lastskip|), remove it (|\unskip|), then do a similar +% thing if there is a penalty just before the skip, +% and finally put the space back in.'' +% +% Since zero glue cannot be distinguished in this context from no +% glue, we dare not put in an |\hskip| in this case as this may +% produce an unwanted breakpoint. This is not satisfactory. +% +% The penalty before the glue is handled similarly, with the same +% caveats concerning the zero case. Is this the first recorded +% use of |\unpenalty| in standard \LaTeX{} code? +% \begin{macrocode} +\def \fix@penalty {% + \ifnum \lastpenalty=\z@ + \@@italiccorr + \else + \count@ \lastpenalty + \unpenalty + \@@italiccorr + \penalty \count@ + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\nocorrlist} +% This holds the list of characters that should prevent italic +% correction. They should be ordered by decreasing frequency of +% use. If any such character is made active later on one needs +% to redefine the list so that the active character becomes part +% of it. +% \changes{v3.1a}{1994/01/27}{Only ., used as default for cm fonts} +% \begin{macrocode} +\def \nocorrlist {,.} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\nfss@text} +% This command will by default behave like a \LaTeX{} |\mbox| but +% may be redefined by packages such as |amstext.sty| to be a bit +% cleverer. +% \begin{macrocode} +\ifx \nfss@text\@undefined + \def \nfss@text {\leavevmode\hbox} +\fi +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\DeclareOldFontCommand} +% \changes{v3.2b}{1994/04/14}{Renamed from \cs{@newfontswitch}} +% This is the function used to create declarative font-changing +% commands that can also be used to change alphabets in math-mode. +% +% Usage: |\DeclareOldFontCommand \fn{|\meta{font-change decls}|}| +% \meta{math-alphabet} +% +% Here |\fn| is the font-declaration command being defined, +% \meta{font-change decls} is the declaration it will expand to in +% text-mode, and \meta{math-alphabet} is the (single) math alphabet +% specifier which is to be used in math-mode. +% +% It does not care whether the command being defined already +% exists but it does give a warning if it redefines anything. +% +% Here are some typical examples of its use in conjunction with +% more basic NFSS2 font commands. +% \begin{verbatim} +% \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +% \DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +% \DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +% \end{verbatim} +% +% \changes{v3.0b}{1993/12/19}{Corrected and tidied} +% \begin{macrocode} +\def \DeclareOldFontCommand #1#2#3{% + \DeclareRobustCommand #1{\@fontswitch {#2}{#3}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@fontswitch} +% \begin{macro}{\@@math@egroup} +% \begin{macro}{\@@math@egroup} +% These two commands actually do the necessary tests and +% declarative \mbox{font-} or alphabet-changing. +% +% \changes{v3.3c}{1994/05/05}{Corrected \cs{@fontswitch} and added +% saved versions} +% \changes{v3.3q}{1994/12/10}{Don't read arguments} +% \changes{v3.3r}{1995/04/02}{Read them again to be able to add \cs{relax}.} +% \begin{macrocode} +\def \@fontswitch #1#2{% + \ifmmode + \let \math@bgroup \relax + \def \math@egroup {\let \math@bgroup \@@math@bgroup + \let \math@egroup \@@math@egroup}% +% \end{macrocode} +% We need to have a |\relax| in the following line in case the |#2| +% is something like |\mathsf| grabbing the next token as an +% argument. For this reason the code also uses explicit arguments +% again (see pr/1275). +% \begin{macrocode} + #2\relax + \else + #1% + \fi +} +\let \@@math@bgroup \math@bgroup +\let \@@math@egroup \math@egroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{v2.1b}{1993/12/08}{Macros \cs{rm}, \cs{bf} and \cs{sf} +% moved to classes.dtx} +% +% These commands are available only in the preamble. +% \begin{macrocode} +\@onlypreamble \DeclareTextFontCommand +\@onlypreamble \DeclareOldFontCommand +% \end{macrocode} +% +% \section{Initialization} +% \changes{v3.0b}{1993/12/19}{Added by ASAJ.} +% \changes{v3.0b}{1993/12/19}{Wording changes by CAR.} +% +% \begin{macro}{\normalsize} +% \changes{v3.3d}{1994/05/08}{Removed \cs{@undefinedfonterror}} +% \changes{v3.3o}{1994/11/12}{Added \cs{MessageBreak}} +% This is defined to produce an error. +% \begin{macrocode} +\def\normalsize{% + \@latex@error {The font size command \protect\normalsize\space + is not defined:\MessageBreak + there is probably something wrong with + the class file}\@eha +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx new file mode 100644 index 00000000000..11abbae1121 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfssbas.dtx @@ -0,0 +1,2031 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltfssbas.dtx +%% Copyright (C) 1989-2002 Frank Mittelbach and Rainer Sch\"opf +% +%<*driver> +% \fi +% +% +\ProvidesFile{ltfssbas.dtx} + [2019/07/09 v3.2c LaTeX Kernel (NFSS Basic Macros)] +% \iffalse +\documentclass{ltxdoc} +\begin{document} +\DocInput{ltfssbas.dtx} +\end{document} +%</driver> +% \fi +% +% \iffalse +%<+checkmem>\def\CHECKMEM{\tracingstats=2 +%<+checkmem> \newlinechar=`\^^J +%<+checkmem> \message{^^JMemory usage: \filename}\shipout\hbox{}} +%<+checkmem>\CHECKMEM +% \fi +% +% +% +% \GetFileInfo{ltfssbas.dtx} +% \title{A new font selection scheme for \TeX{} macro packages\\ +% (Basic Macros)\thanks +% {This file has version number +% \fileversion\ dated \filedate}} +% +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% This file contains the main implementation of the `low level' font +% selection commands. See other parts of the \LaTeX\ +% distribution, or \emph{The \LaTeX\ Companion} for higher level +% documentation of the \LaTeX\ `New' Font Selection Scheme. +% +% \begin{quote} +% \textbf{Warning:} +% The macro documentation is still basically the documentation from the +% first NFSS release and therefore in some cases probably not +% completely accurate. +% \end{quote} +% +% \StopEventually{} +% +% \changes{v3.0v}{1998/08/17}{(RmS) Documentation fixes.} +% \changes{v3.0j}{1995/10/22}{(RmS) New size function macro +% \cs{genb@sfcnt} needs to be disabled at \cs{document}.} +% \changes{v3.0i}{1995/10/20} +% {(DPC) Modify autoload code, change \cs{undefined}} +% \changes{v3.0g}{1995/10/04}{Modify autoload code} +% \changes{v3.0f}{1995/08/24}{Added autoload code} +% \changes{v3.0d}{1995/07/13} +% {minor documentation changes} +% \changes{v3.0c}{1995/06/15} +% {(DPC) minor documentation changes} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Make file from previous file, fam.dtx 1995/05/20 v2.2d} +% +% +% \changes{v2.1x}{1994/11/18}{(DPC) use \cs{reserved@f} not \cs{next}} +% \changes{v2.1q}{1994/05/20}{Use new error commands} +% \changes{v2.1o}{1994/05/15}{encoding cmds changed to {enc}-cmd} +% \changes{v2.1k}{1994/05/13}{Remove File identification `typeout'} +% \changes{v2.1j}{1994/05/12}{New baselinestretch concept} +% \changes{v2.1j}{1994/05/12}{Replaced hand-protected commands by +% \cs{DeclareRobustCommand} defs} +% \changes{v2.1h}{1994/04/11}{Added \cs{defaultscriptratio} and +% \cs{defaultscriptscriptratio}. ASAJ.} +% \changes{v2.1g}{1994/03/13}{add 2ekernel module to omit repeated code} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% \changes{v2.0c}{1993/03/18}{Changed all \cs{@tempdima} in +% \cs{@tempdimb} to avoid killing \cs{numberline}} +% \changes{v1.91a}{1992/09/22}{Introduced \cs{tf@size} for math size.} +% \changes{v1.3a}{1991/11/27}{All \cs{family}, \cs{shape} etc. +% renamed to \cs{fontfamily} etc.} +% \changes{v1.2i}{1990/04/01}{Code added from tracefnt.dtx.} +% \changes{v1.2i}{1990/04/01}{Support for TeX3.} +% \changes{v1.2g}{1990/02/16}{Support for changes of \cs{baselineskip} +% without changing the size.} +% +% \changes{v1.2c}{1990/01/23}{\cs{no@version@warning} renamed to +% \cs{no@alphabet@error}.} +% \changes{v1.0s}{1989/11/25}{All \cs{edef}\cs{font@name} changed to +% \cs{xdef}\cs{font@name}. +% Necessary after introduction of +% \cs{begingroup}/\cs{endgroup} in v1.0q.} +% \changes{v1.0s}{1989/11/25}{extra// $\to$ + in \cs{extra@def}.} +% \changes{v1.0o}{1989/11/08}{First parameter of +% \cs{define@mathalphabet} +% and \cs{define@mathgroup} changed +% from string to control sequence.} +% \changes{v1.0m}{1989/09/14} +% {Global replacement: \cs{group} to \cs{mathgroup}} +% \changes{v1.0k}{1989/05/22}{Lines longer than 72 characters folded.} +% \changes{v1.0j}{1989/05/01}{Default for \cs{baselinestretch} added.} +% \changes{v1.0i}{1989/04/29} +% {Removed the \cs{halign} \cs{noalign} correction +% (wasn't bugfree)} +% \changes{v1.0h}{1989/04/29}{Documented problem with \cs{halign}, and +% \cs{noalign}} +% \changes{v1.0g}{1989/04/27}{Documentation revised.} +% \changes{v1.0f}{1989/04/23}{\% in \cs{getanddefinefonts} added.} +% \changes{v1.0e}{1989/04/21}{Documentation is fun!! +% Parameters of \cs{define@mathalphabet} changed.} +% \changes{v1.0d}{1989/04/19}{Even more doc.} +% \changes{v1.0c}{1989/04/14}{More documentation added.} +% \changes{v1.0b}{1989/04/10}{\cs{preload@sizes} added.} +% \changes{v1.0b}{1989/04/10}{\cs{wrong@fontshape} changed to define +% substitution font/shape macro.} +% \changes{v1.0a}{1989/04/10}{Starting with version numbers!! +% \cs{ifmmode} added in \cs{math@group}} +% \changes{v2.1w}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v3.0z}{2015/02/21} +% {Removed autoload code} +% +% +% The `2ekernel' code ensures that a |\usepackage{autofss1}| is +% essentially ignored if a `full' format is being used that has +% picture mode already in the format. +% +% Note the |autofss2| loading is currently disabled. +% +% \begin{macrocode} +%<2ekernel>\expandafter\let\csname ver@autofss1.sty\endcsname\fmtversion +% \end{macrocode} +% +% +% \section{Preliminary macros} +% +% We define a number +% of macros that will be used later. +% +% +% \begin{macro}{\@nomath} +% |\@nomath| is used by most macros that will have no effect +% in math mode. It issues a warning message. +% \begin{macrocode} +%<*2ekernel> +\def\@nomath#1{\relax\ifmmode + \@font@warning{Command \noexpand#1invalid in math mode}\fi} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.2c}{1990/01/23}{Macro \cs{no@alphabet@help} added} +% \changes{v2.1i}{1994/04/18}{Macro \cs{no@alphabet@help} +% removed again} +% +% \begin{macro}{\no@alphabet@error} +% \changes{v1.2c}{1990/01/23}{Changed to error call} +% \changes{v2.1i}{1994/04/18}{Use std LaTeX error macro} +% The macro |\no@alphabet@error| is called whenever +% the user requests a math \emph{alphabet} that is not +% available in the current \emph{version}. +% In math mode an error message is produced otherwise the command +% keeps silent. +% The argument is the name of the control sequence that identifies +% the math \emph{alphabet}. +% The |\relax| at the beginning is necessary to prevent +% \TeX{} from scanning too far in certain situations. +% \begin{macrocode} +\gdef\no@alphabet@error#1{\relax \ifmmode + \@latex@error{Math\space alphabet\space identifier\space + \noexpand#1is\space undefined\space in\space math\space + version\space `\math@version'}% + {Your\space requested\space math\space alphabet\space + is\space undefined\space in\space the\space current\space + math\space version.^^JCheck\space the\space spelling\space + or\space use\space the\space \noexpand\SetMathAlphabet\space + command.} + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\new@mathgroup} +% \begin{macro}{\mathgroup} +% We also give a new name to |\newfam| and |\fam| +% to avoid verbal confusion +% (see the introduction).\footnote{For the same reason +% it seems advisable to +% {\ttfamily\bslash let\bslash fam} and +% {\ttfamily\bslash newfam} +% equal to {\ttfamily\bslash relax}, +% but this is commented out to retain +% compatibility to existing style files.} +% \changes{v1.2e}{1990/01/28}{\cs{newfam} let to \cs{new@mathgroup}.} +% \changes{v3.0a}{1995/05/24} +% {(DPC) No need to redefine \cs{newfam} as not outer} +% \changes{v3.0b}{1995/05/27} +% {(FMi) But a need to define \cs{new@mathgroup}} +% \changes{v3.0y}{2014/12/30} +% {move allocation to ltplain.} +% \begin{macrocode} +%\def\new@mathgroup{\alloc@8\mathgroup\chardef\sixt@@n} +\let\mathgroup\fam +%\let\newfam\new@mathgroup +\@onlypreamble\new@mathgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \section{Macros for setting up the tables} +% +% \begin{macro}{\DeclareFontShape} +% +% \changes{v1.9a}{1992/07/26}{Introduced \cs{DeclareFontShape}} +% The macro |\DeclareFontShape| takes $6$ arguments: +% \begin{macrocode} +\def\DeclareFontShape{\begingroup +% \end{macrocode} +% First we restore the catcodes of all characters used in the syntax. +% \changes{v2.1e}{1994/02/24} +% {Separate restoration of catcodes for fd cmds} +% \begin{macrocode} + \nfss@catcodes +% \end{macrocode} +% We use |\expandafter| |\endgroup| to restore catcode in case +% something goes wrong with the argument parsing (suggested by Tim +% Van Zandt) +% \end{macro} +% +% +% +% \begin{macro}{\DeclareFontShape} +% \changes{v2.1c}{1994/02/07}{revert catcode settings earlier} +% \changes{v3.0m}{1995/11/01} +% {(DPC) Test for \cs{relax} not \cs{undefined}, internal/1933} +% \begin{macrocode} + \expandafter\endgroup + \DeclareFontShape@} +\def\DeclareFontShape@#1#2#3#4#5#6{% + \expandafter\ifx\csname #1+#2\endcsname\relax + \@latex@error{Font family `#1+#2' unknown}\@eha + \else + \expandafter + \xdef\csname#1/#2/#3/#4\endcsname{\expandafter\noexpand + \csname #5\endcsname}% + \def\reserved@a{#6}% + \global + \expandafter\let\csname#5\expandafter\endcsname + \ifx\reserved@a\@empty + \@empty + \else + \reserved@a + \fi + \fi + } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\DeclareFixedFont} +% Define a direct font switch that avoids all overhead. +% \changes{v2.1u}{1994/11/06}{Renamed +% \cs{every@size} to \cs{every@math@size}.} +% \begin{macrocode} +\def\DeclareFixedFont#1#2#3#4#5#6{% + \begingroup + \math@fontsfalse + \every@math@size{}% + \fontsize{#6}\z@ + \usefont{#2}{#3}{#4}{#5}% + \global\expandafter\let\expandafter#1\the\font + \endgroup + } +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\do@subst@correction} +% +% \begin{macrocode} +\def\do@subst@correction{% + \xdef\subst@correction{% + \font@name + \global\expandafter\font + \csname \curr@fontshape/\f@size\endcsname + \noexpand\fontname\font + \relax}% +% \end{macrocode} +% Calling |\subst@correction| after the current group means calling +% it after we have loaded the substitution font which is done +% inside a group. +% \begin{macrocode} + \aftergroup\subst@correction +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareFontFamily} +% \begin{macrocode} +\def\DeclareFontFamily#1#2#3{% +% \end{macrocode} +% If we want fast checking for the encoding scheme we can just +% check for |\T@..| being defined. +% \begin{macrocode} +% \@tempswafalse +% \def\reserved@b{#1}% +% \def\cdp@elt##1##2##3##4{\def\reserved@c{##1}% +% \ifx\reserved@b\reserved@c \@tempswatrue\fi}% +% \cdp@list +% \if@tempswa + \@ifundefined{T@#1}% + {% + \@latex@error{Encoding scheme `#1' unknown}\@eha + }% + {% +% \end{macrocode} +% Now we have to define the macro |\|\meta{\#1}|+|\meta{\#2} +% to contain |#3|. But since most of the time |#3| will be empty +% we use |\let| in a tricky way rather than a simple |\def| since +% this will save internal memory. +% We store the argument |#3| in a temporary macro +% |\reserved@a|. +% \begin{macrocode} + \def\reserved@a{#3}% +% \end{macrocode} +% We compare |\reserved@a| with |\@empty| +% If these two are the same we |\let| the `extra' +% macro equal to |\@empty| which is not the same a doing a |\let| +% to |\reserved@a| --- the latter would blow one extra memory +% location rather then reusing the one from |\@empty|. +% \begin{macrocode} + \global + \expandafter\let\csname #1+#2\expandafter\endcsname + \ifx \reserved@a\@empty + \@empty + \else \reserved@a + \fi + }% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\cdp@list} +% We initialize the code page list to be empty. +% \begin{macrocode} +\let\cdp@list\@empty +\@onlypreamble\cdp@list +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cdp@elt} +% \begin{macrocode} +\let\cdp@elt\relax +\@onlypreamble\cdp@elt +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\DeclareFontEncoding} +% \begin{macrocode} +\def\DeclareFontEncoding{% +% \end{macrocode} +% First we start with ignoring all blanks and newlines since every +% surplus space in the second or third argument will come out in +% a weird place in the document. +% \changes{v2.1c}{1994/02/07}{revert catcode settings earlier} +% \changes{v2.1t}{1994/10/19}{Add missing \cs{relax}.} +% \changes{v2.1z}{1994/12/06}{use \cs{nfss@catcodes}} +% \begin{macrocode} + \begingroup + \nfss@catcodes + \expandafter\endgroup + \DeclareFontEncoding@} +\@onlypreamble\DeclareFontEncoding +% \end{macrocode} +% \changes{v2.0g}{1993/09/15} +% {Corrected: \cs{default@T} to \cs{default@M}.} +% \begin{macrocode} +\def\DeclareFontEncoding@#1#2#3{% + \expandafter + \ifx\csname T@#1\endcsname\relax + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@family}{\default@series}% + {\default@shape}}% +% \end{macrocode} +% To support encoding dependent commands (like accents) we +% initialise the command +% |\|\meta{encoding}|-cmd| to be |\@changed@cmd|. +% (See \texttt{ltoutenc.dtx} for details.) +% \changes{v2.1l}{1994/05/13}{Init encoding change command} +% \changes{v2.1n}{1994/05/14}{Only init enc change cmd when +% new encoding} +% \changes{v2.1n}{1994/05/14}{Log if encoding is redeclared} +% \begin{macrocode} + \expandafter\let\csname#1-cmd\endcsname\@changed@cmd + \else + \@font@info{Redeclaring font encoding #1}% + \fi +% \end{macrocode} +% +% \begin{macrocode} + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@M#3}% +% \end{macrocode} +% Keep a record of the last encoding being declared: +% \changes{v3.0w}{1999/01/06}{Added \cs{LastDeclaredEncoding} to +% support cyrillic integration (pr/2988)} +% \begin{macrocode} + \xdef\LastDeclaredEncoding{#1}% + } +\@onlypreamble\DeclareFontEncoding@ +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\LastDeclaredEncoding} +% \changes{v3.0w}{1999/01/06}{Added \cs{LastDeclaredEncoding} to +% support cyrillic integration (pr/2988)} +% The last encoding being declared by |\DeclareFontEncoding|. +% \begin{macrocode} +\def\LastDeclaredEncoding{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareFontSubstitution} +% \begin{macrocode} +\def\DeclareFontSubstitution#1#2#3#4{% + \expandafter + \ifx\csname T@#1\endcsname\relax + \@latex@error{Encoding scheme `#1' unknown}\@eha + \else + \begingroup +% \end{macrocode} +% \changes{v3.0x}{2002/10/02}{Adding \cs{LastDeclaredEncoding} +% introduced a bug as on some occasions that macro name was stored +% in the internal lists instead of the actual encoding. (pr/3459)} +% We loop through the |\cdp@list| and rebuild it anew in |\toks@| +% thereby replacing the defaults for the encoding in question with +% the new defaults. It is important to store the encoding to test +% against expanded in |\reserved@a| since it might just be +% |\LastDeclaredEncoding| that is passed as |#1|. +% \begin{macrocode} + \edef\reserved@a{#1}% + \toks@{}% + \def\cdp@elt##1##2##3##4{% + \def\reserved@b{##1}% + \ifx\reserved@a\reserved@b +% \end{macrocode} +% Here we use the new defaults but we use |##1| (i.e., the encoding +% name already stored previously) since we know that it is expanded. +% \begin{macrocode} + \addto@hook\toks@{\cdp@elt{##1}{#2}{#3}{#4}}% + \else +% \end{macrocode} +% If |\reserved@a| and |\reserved@b| differ then we simply copy +% from the old list to the new. +% \begin{macrocode} + \addto@hook\toks@{\cdp@elt{##1}{##2}{##3}{##4}}% + \fi}% + \cdp@list + \xdef\cdp@list{\the\toks@}% + \endgroup + \global + \@namedef{D@#1}{% + \def\default@family{#2}% + \def\default@series{#3}% + \def\default@shape{#4}% + }% + \fi + } +\@onlypreamble\DeclareFontSubstitution +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\DeclareFontEncodingDefaults} +% \begin{macrocode} +\def\DeclareFontEncodingDefaults#1#2{% + \ifx\relax#1\else + \ifx\default@T\@empty\else + \@font@info{Overwriting encoding scheme text defaults}% + \fi + \gdef\default@T{#1}% + \fi + \ifx\relax#2\else + \ifx\default@M\@empty\else + \@font@info{Overwriting encoding scheme math defaults}% + \fi + \gdef\default@M{#2}% + \fi +} +\@onlypreamble\DeclareFontEncodingDefaults +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\default@T} +% \begin{macro}{\default@M} +% \begin{macrocode} +\let\default@T\@empty +\let\default@M\@empty +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\DeclarePreloadSizes} +% \begin{macrocode} +\def\DeclarePreloadSizes#1#2#3#4#5{% + \@ifundefined{T@#1}% + {\@latex@error{Encoding scheme `#1' unknown}\@eha}% + {% +% \end{macrocode} +% Don't know at the moment what this group here does! +% \begin{macrocode} + \begingroup +% \end{macrocode} +% We define a macro |\reserved@f|\footnote{We cannot use +% {\ttfamily\bslash @tempa} +% since it is needed in +% {\ttfamily\bslash pickup@font}.} +% that grabs the next \emph{size} and loads the corresponding +% font. +% This is done by delimiting |\reserved@f|'s only argument by the +% \textsf{token} |,| (comma). +% \begin{macrocode} + \def\reserved@f##1,{% +% \end{macrocode} +% The end of the list will be detected when there are no more +% elements, i.e.\ when |\reserved@f|'s argument is empty. +% The trick used here is explained in Appendix~D of the +% \TeX{}book: if the argument is empty the |\if| +% will select the first clause and |\let| |\reserved@f| +% equal to |\relax|. +% (We use the |>| character here since it cannot appear +% in font file names.) +% \changes{v1.2j}{1990/06/24}{Missing percent added.} +% \begin{macrocode} + \if>##1>% + \let\reserved@f\relax + \else +% \end{macrocode} +% Otherwise, we define |\font@name| appropriately and +% call |\pickup@font| to do the work. +% Note that the requested |\curr@fontshape| +% combination must have been defined, or you will get an error. +% The definition of |\font@name| is carried out globally +% to be consistent with the rest of the code in this file. +% \begin{macrocode} + \xdef\font@name{\csname#1/#2/#3/#4/##1\endcsname}% + \pickup@font +% \end{macrocode} +% Now we forget the name of the font just loaded. +% More precisely, we set the corresponding control sequence +% to |\relax|. This means that later on, when the font +% is first used, the macro |\define@newfont| is called +% again to execute the `extra' macro for this font. +% \changes{v1.2d}{1990/01/27}{Font identifier set to \cs{relax}.} +% \begin{macrocode} + \global\expandafter\let\font@name\relax + \fi +% \end{macrocode} +% Finally we call |\reserved@f| again to process the next +% \emph{size}. If |\reserved@f| was |\let| equal to |\relax| +% this will end the macro. +% \begin{macrocode} + \reserved@f}% +% \end{macrocode} +% We finish with reinserting the list of sizes after the +% |\reserved@f| +% macro and appending an empty element so that the end of the list +% is recognized properly. +% \begin{macrocode} + \reserved@f#5,,% + \endgroup + }% +} +\@onlypreamble\DeclarePreloadSizes +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\ifmath@fonts} +% We need a switch to decide if we have to switch math fonts. +% For this purpose we provide |\ifmath@fonts| +% that can be set to true or false by the |\S@...| macros +% depending on if math fonts +% are provided for this size or not. +% The default is of course to switch all fonts. +% \begin{macrocode} +\newif\ifmath@fonts \math@fontstrue +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\DeclareMathSizes} +% \begin{macro}{\DeclareMathSizes*} +% |\DeclareMathSizes| takes the text size, math text size, math +% script size, and math scriptscript size as arguments and defines +% the right |\S@|\dots{} macro. +% +% \begin{macrocode} +\def\DeclareMathSizes{% + \@ifstar{\@DeclareMathSizes\math@fontsfalse}% + {\@DeclareMathSizes{}}} +\@onlypreamble\DeclareMathSizes +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@DeclareMathSizes} +% \changes{v3.0p}{1996/07/26}{use faster \cs{if} test} +% This modification by Michael J. Downes on comp.text.tex on 2002/10/17 +% allows the user to have settings such as\\ +% |\DeclareMathSizes{9.5dd}{9.5dd}{7.4dd}{6.6dd}|. +% \changes{v3.0y}{2015/01/11}{Allow arbitrary units (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\@DeclareMathSizes}% +%<latexrelease> {Arbitrary units in \DeclareMathSizes}% +%<*2ekernel|latexrelease> +\def\@DeclareMathSizes #1#2#3#4#5{% + \@defaultunits\dimen@ #2pt\relax\@nnil + \if $#3$% + \expandafter\let\csname S@\strip@pt\dimen@\endcsname\math@fontsfalse + \else + \@defaultunits\dimen@ii #3pt\relax\@nnil + \@defaultunits\@tempdima #4pt\relax\@nnil + \@defaultunits\@tempdimb #5pt\relax\@nnil + \toks@{#1}% + \expandafter\xdef\csname S@\strip@pt\dimen@\endcsname{% + \gdef\noexpand\tf@size{\strip@pt\dimen@ii}% + \gdef\noexpand\sf@size{\strip@pt\@tempdima}% + \gdef\noexpand\ssf@size{\strip@pt\@tempdimb}% + \the\toks@ + }% + \fi +}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\@DeclareMathSizes}% +%<latexrelease> {Arbitrary units in \DeclareMathSizes}% +%<latexrelease>\def\@DeclareMathSizes#1#2#3#4#5{% +%<latexrelease> \@defaultunits\dimen@#2pt\relax\@nnil +%<latexrelease> \if$#3$% +%<latexrelease> \expandafter \let +%<latexrelease> \csname S@\strip@pt\dimen@\endcsname +%<latexrelease> \math@fontsfalse +%<latexrelease> \else +%<latexrelease> \expandafter \gdef +%<latexrelease> \csname S@\strip@pt\dimen@\endcsname +%<latexrelease> {\gdef\tf@size{#3}\gdef\sf@size{#4}% +%<latexrelease> \gdef\ssf@size{#5}% +%<latexrelease> #1% +%<latexrelease> }% +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\@DeclareMathSizes +% \end{macrocode} +% \end{macro} +% +% +% +% \section{Selecting a new font} +% +% \subsection{Macros for the user} +% +% +% \begin{macro}{\fontencoding} +% \changes{v2.1j}{1994/05/12}{Use \cs{DeclareRobustCommand}.} +% \begin{macro}{\f@encoding} +% As we said in the introduction a font is described by four parameters. +% We first define macros to specify the wanted \emph{family}, +% \emph{series}, or \emph{shape}. +% These are simply recorded in internal macros +% |\f@family|, |\f@series|, and |\f@shape|, resp. +% We use |\edef|'s so that the arguments can also be macros. +% \begin{macrocode} +\DeclareRobustCommand\fontencoding[1]{% + \expandafter\ifx\csname T@#1\endcsname\relax + \@latex@error{Encoding scheme `#1' unknown}\@eha + \else + \edef\f@encoding{#1}% + \ifx\cf@encoding\f@encoding +% \end{macrocode} +% If the new encoding is the same as the old +% encoding we have nothing to do. +% However, in case we had a sequence of several encoding changes +% without a |\selectfont| in-between we can save processing by +% making sure that |\enc@update| is |\relax|. +% \begin{macrocode} + \let\enc@update\relax + \else +% \end{macrocode} +% If current and new encoding differ we define the macro +% |\enc@update| +% to contain all updates necessary at |\selectfont| time. +% \begin{macrocode} + \let\enc@update\@@enc@update + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@enc@update} +% \begin{macrocode} +\def\@@enc@update{% +% \end{macrocode} +% When |\@@enc@update| is executed |\f@encoding| holds the encoding +% name +% for the new encoding and |\cf@encoding| the name of the last active +% encoding. +% +% We start by setting the init command for encoding dependent +% macros to |\@changed@cmd|. +% \begin{macrocode} + \expandafter + \let + \csname\cf@encoding -cmd\endcsname + \@changed@cmd +% \end{macrocode} +% Then we turn the one for the new encoding to |\@current@cmd| (see +% \texttt{ltoutenc.dtx} for further explanations). +% \begin{macrocode} + \expandafter + \let + \csname\f@encoding-cmd\endcsname + \@current@cmd +% \end{macrocode} +% We execute the default settings |\default@T|, followed by the one +% for the new encoding. +% \begin{macrocode} + \default@T + \csname T@\f@encoding\endcsname +% \end{macrocode} +% Finally we change the default substitution values, disable +% |\enc@update| and make |\f@encoding| officially the current +% encoding. +% \begin{macrocode} + \csname D@\f@encoding\endcsname + \let\enc@update\relax + \let\cf@encoding\f@encoding +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\enc@update} +% \changes{v2.1m}{1994/05/14}{Macro added} +% The default action in |\selectfont| is to do nothing. +% \begin{macrocode} +\let\enc@update\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fontfamily} +% \changes{v2.1j}{1994/05/12}{Use \cs{DeclareRobustCommand}.} +% \begin{macro}{\f@family} +% \begin{macro}{\fontseries} +% \changes{v2.1j}{1994/05/12}{Use \cs{DeclareRobustCommand}.} +% \begin{macro}{\f@series} +% \begin{macro}{\fontshape} +% \changes{v2.1j}{1994/05/12}{Use \cs{DeclareRobustCommand}.} +% \changes{v2.1y}{1994/11/30}{Use \cs{@current@cmd} in +% \cs{@@enc@update}. ASAJ.} +% \begin{macro}{\f@shape} +% \begin{macrocode} +\DeclareRobustCommand\fontfamily[1]{\edef\f@family{#1}} +\DeclareRobustCommand\fontseries[1]{\edef\f@series{#1}} +\DeclareRobustCommand\fontshape [1]{\edef\f@shape{#1}} +% \end{macrocode} +% Some handy abbreviation if you want to get some particular font +% in the current size. If also the size should change one has to +% issue a |\fontsize| command first. +% \begin{macrocode} +\def\usefont#1#2#3#4{\fontencoding{#1}\fontfamily{#2}% + \fontseries{#3}\fontshape{#4}\selectfont + \ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\linespread} +% \changes{v2.1j}{1994/05/12}{New macro} +% \changes{v2.1p}{1994/05/16}{Remove surplus braces} +% The command |\linespread| changes the current |\baselinestretch| +% by calling |\set@fontsize|. The values for |\f@size| and +% |\f@baselineskip| will be left unchanged. +% \begin{macrocode} +\DeclareRobustCommand\linespread[1] + {\set@fontsize{#1}\f@size\f@baselineskip} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\fontsize} +% \changes{v2.1j}{1994/05/12}{Redefined to use \cs{set@fontsize}} +% \changes{v2.1p}{1994/05/16}{Pass \cs{baselinstretch} not +% \cs{f@linespread}} +% We also define a macro that allows to specify a size. In this +% case, however, we also need the value of |\baselineskip|. As the +% first argument to |\set@fontsize| we pass the current value of +% |\baselinestretch|. This will either match the internal value (in +% which case nothing changes, or it will be an updated value due to +% a user change of that macro using |\renewcommand|. If we would +% pass the internal |\f@linespread| such a change would be +% effectively overwritten by a size change. +% \begin{macrocode} +\DeclareRobustCommand\fontsize[2] + {\set@fontsize\baselinestretch{#1}{#2}} +% \end{macrocode} +% \end{macro} +% +% +% \changes{v2.1n}{1994/05/14}{Set defaults for all \cs{f@...}} +% +% \begin{macro}{\f@linespread} +% \changes{v2.1j}{1994/05/12}{New macro} +% This macro holds the current internal value for +% |\baselinestretch|. +% \begin{macrocode} +\let\f@family\@empty +\let\f@series\@empty +\let\f@shape\@empty +\let\f@size\@empty +\let\f@baselineskip\@empty +\let\f@linespread\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cf@encoding} +% \changes{v2.1u}{1994/11/06}{New macro} +% \begin{macrocode} +\let\f@encoding\@empty +\let\cf@encoding\@empty +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@defaultunits} +% +% The function |\@defaultunits| when wrapped around a dimen or skip +% assignment supplies default units. Usage: +% +% |\@defaultunits\dimen@=#1pt\relax\@nnil| +% +% Note: the |\relax| is *important*. Other units can be substituted +% for the `pt' if desired. +% +% We use |\remove@to@nnil| as an auxiliary macros for +% |\@defaultunits|. It just has to gobble the supplied default unit +% `pt' or whatever, if it wasn't used in the assignment. +% \begin{macrocode} +\def\@defaultunits{\afterassignment\remove@to@nnil} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\strip@pt} +% \begin{macro}{\rem@pt} +% This macro strips the characters |pt| produced by using |\the| +% on a dimen register. +% \begin{macrocode} +\begingroup + \catcode`P=12 + \catcode`T=12 + \lowercase{ + \def\x{\def\rem@pt##1.##2PT{##1\ifnum##2>\z@.##2\fi}}} + \expandafter\endgroup\x +\def\strip@pt{\expandafter\rem@pt\the} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\mathversion} +% \changes{v1.0h}{1989/04/29}{Test if version defined added.} +% \changes{v1.0m}{1989/09/14} +% {Corrected typo: \cs{endscname} to \cs{endcsname}.} +% \changes{v2.1j}{1994/05/12}{Use \cs{DeclareRobustCommand}.} +% \begin{macro}{\math@version} +% |\mathversion| takes the math \emph{version} name as +% argument, defines |\math@version| appropriately and switches +% to the font selected +% forcing a call to |\glb@settings| if the \emph{version} is +% known to the system. +% \changes{v1.0p}{1989/11/14}{Math version prefix `mv@' added.} +% \changes{v1.0r}{1989/11/22} +% {\cs{def} $\to$ \cs{edef} for \cs{math@version}.} +% \changes{v1.2g}{1990/02/16}{\cs{@nomath} added.} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% \begin{macrocode} +\DeclareRobustCommand\mathversion[1] + {\@nomath\mathversion + \expandafter\ifx\csname mv@#1\endcsname\relax + \@latex@error{Math version `#1' is not defined}\@eha\else + \edef\math@version{#1}% +% \end{macrocode} +% We need to force a math font setup both now and at the point +% where we return to the previous math version. +% Forcing a math font setup can simply be done by setting +% |\glb@currsize| to an invalid value since this will trigger the +% setup when the formula starts. +% \begin{macrocode} + \gdef\glb@currsize{}% +% \end{macrocode} +% When the scope of the current |\mathversion| ends we need to +% restore the old setup. However this time we need to force it +% directly at least if we are inside math, otherwise we could wait. +% Another way to enhance this code here is todo the setting only if +% the version really has changed after all. This might be +% interesting in case of \texttt{amstext} and \texttt{boldsymbol}. +% \changes{v2.1b}{1994/01/25}{Corrections for math setup} +% \begin{macrocode} + \aftergroup\glb@settings + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% If \TeX{} would support a hook just before the end of a formula +% (opposite of |\everymath| so to speak) the implementation of the +% algorithm would be much simpler because in that case we would set up +% the correct math fonts at this point without having to worry about +% incorrect settings due to nesting. The same would be true if in +% \LaTeX{} the use of |$| (as the primitive \TeX{} command) would be +% impossible and instead only a higher-level interface would be +% available. Note that this does not mean that a |$| couldn't be the +% short-hand for starting and stopping that higher-level interface, it +% only means that the direct \TeX{} function must be hidden. +% +% Anyway, since we don't have this and won't have it in \LaTeXe{} we +% need to implement it in a somewhat slower way. +% +% +% We test for the current math font setup on entry of a formula, +% i.e., on the +% hooks |\everymath| and |\everydisplay|. But since these hooks may +% contain user data we provide ourselves with an internal version of +% these hooks which stays frozen. +% +% +% \begin{macro}{\frozen@everymath} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% \begin{macro}{\frozen@everydisplay} +% New internal names for |\everymath| and |\everydisplay|. +% \begin{macrocode} +\let\frozen@everymath\everymath +\let\frozen@everydisplay\everydisplay +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\everymath} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% \begin{macro}{\everydisplay} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% Now we provide now user hooks that will be called in the +% frozen internals. +% \begin{macrocode} +\newtoks\everymath +\newtoks\everydisplay +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\frozen@everymath} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% Now we define the behaviour of the frozen hooks: first +% check the math setup then call the user hook. +% \begin{macrocode} +\frozen@everymath = {\check@mathfonts + \the\everymath} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\frozen@everydisplay} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% Ditto for the display hook. +% \begin{macrocode} +\frozen@everydisplay = {\check@mathfonts + \the\everydisplay} +% \end{macrocode} +% \end{macro} +% +% \changes{v3.0q}{1996/07/27}{\cs{if@inmath} switch removed} +% +% \begin{macro}{\curr@math@size} +% \changes{v2.1a}{1994/01/17}{New math font setup} +% This holds locally the current math size. +% \begin{macrocode} +\let\curr@math@size\@empty +% \end{macrocode} +% \end{macro} +% +% +% +% +% \subsection{Macros for loading fonts} +% +% \begin{macro}{\pickup@font} +% The macro |\pickup@font| which is used in +% |\selectfont| is very simple: +% if the font name is undefined (i.e.\ not known yet) it calls +% |\define@newfont| to load it. +% \begin{macrocode} +\def\pickup@font{% + \expandafter \ifx \font@name \relax + \define@newfont + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\split@name} +% |\pickup@font| assumes that |\font@name| is set +% but it is sometimes called when |\f@family|, |\f@series|, +% |\f@shape|, or |\f@size| may have the wrong settings +% (see, e.g., the definition of |\getanddefine@fonts|). +% Therefore we need a macro to extract font \emph{family}, +% \emph{series}, \emph{shape}, and \emph{size} from the font name. +% To this end we define |\split@name| which takes the font +% name as a list of characters of |\catcode| 12 (without the +% backslash at the beginning) delimited by the +% special control sequence |\@nil|. +% This is not very complicated: we first ensure that |/| has +% the right |\catcode| +% \begin{macrocode} +{\catcode`\/=12 +% \end{macrocode} +% and define |\split@name| so that it will define our +% private |\f@encoding|, |\f@family|, |\f@series|, |\f@shape|, +% and |\f@size| macros. +% \changes{v1.9a}{1992/07/26}{Added splitting into \cs{f@encoding}.} +% \begin{macrocode} +\gdef\split@name#1/#2/#3/#4/#5\@nil{\def\f@encoding{#1}% + \def\f@family{#2}% + \def\f@series{#3}% + \def\f@shape{#4}% + \def\f@size{#5}}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\curr@fontshape} +% Abbreviation which may get removed again for speed. +% \changes{v1.9a}{1992/07/26}{} +% \begin{macrocode} +\def\curr@fontshape{\f@encoding/\f@family/\f@series/\f@shape} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\define@newfont} +% Now we can tackle the problem of defining a new font. +% \changes{v1.9a}{1992/07/26}{} +% \begin{macrocode} +\def\define@newfont{% +% \end{macrocode} +% We have already mentioned that the \textsf{token} list that +% |\split@name| will get as argument must not start with +% a backslash. +% To reach this goal we will set the |\escapechar| to $-1$ so +% that the |\string| primitive will not generate an +% escape character. +% To keep this change local we open a group. We use +% |\begingroup| for this purpose since |\define@newfont| +% might be called in math mode, and an empty +% |\bgroup|\ldots|\egroup| would add an empty Ord atom +% to the math list and thus affect the spacing. +% +% Also locally redefine |\typeout| so that `No file ...fd' +% Warnings become Font Info message just sent to the log file. +% \changes{v1.0q}{1989/11/19}{Group added.} +% \changes{v3.0m}{1995/11/17}{Redefine \cs{typeout} latex/1676} +% \begin{macrocode} + \begingroup + \let\typeout\@font@info + \escapechar\m@ne +% \end{macrocode} +% Then we extract \emph{encoding scheme}, \emph{family}, +% \emph{series}, \emph{shape}, +% and \emph{size} from the font name. +% Note the four |\expandafter|'s so that |\font@name| is +% expanded first, then |\string|, and finally +% |\split@name|. +% \begin{macrocode} + \expandafter\expandafter\expandafter + \split@name\expandafter\string\font@name\@nil +% \end{macrocode} +% If the |\curr@fontshape| combination is not available, +% (i.e.\ undefined) we call the macro |\wrong@fontshape| to take +% care of this case. Otherwise |\extract@font| +% will load the external font for us. +% \changes{v1.2f}{1990/01/28}{Added call to \cs{curr@fontshape} macro +% to allow substitution.} +% \begin{macrocode} +% \expandafter\ifx +% \csname\curr@fontshape\endcsname \relax + \try@load@fontshape % try always +% \fi + \expandafter\ifx + \csname\curr@fontshape\endcsname \relax + \wrong@fontshape\else +% \end{macrocode} +% To allow substitution we call the |curr@fontshape| macro +% which usually will expand to |\relax| but may hold code for +% substitution (see |\subst@fontshape| definition). +% \begin{macrocode} +% \csname\curr@fontshape\endcsname + \extract@font\fi +% \end{macrocode} +% We are nearly finished and must only restore the +% |\escapechar| by closing the group. +% \begin{macrocode} + \endgroup} +% \end{macrocode} +% +% +% \changes{v3.2b}{2019/02/07}{Changed wording of warning (github/107)} +% \begin{macrocode} +\def\try@load@fontshape{% + \expandafter + \ifx\csname \f@encoding+\f@family\endcsname\relax + \@font@info{Trying to load font information for + \f@encoding+\f@family}% +% \end{macrocode} +% We predefine this combination to be |\@empty| which means that +% next time we don't try again unnecessary in case we don't find a +% |.fd| file. If the file contains a |\DeclareFontFamily| command +% than this setting will be overwritten. +% \changes{v2.1e}{1994/02/24} +% {Separate restoration of catcodes for fd cmds} +% \changes{v2.1l}{1994/05/13}{Use \cs{@input@} for fd files} +% \begin{macrocode} + \global\expandafter\let + \csname\f@encoding+\f@family\endcsname\@empty +% \end{macrocode} +% Set the catcodes used in the syntax, but do it only once (this +% will be restored at the end of the font loading group). +% \changes{v3.0t}{1997/10/21}{Move \cs{makeatletter} to +% \cs{nfss@catcodes}.} +% \begin{macrocode} + \nfss@catcodes + \let\nfss@catcodes\relax +% \end{macrocode} +% +% \changes{v3.0s}{1996/11/18} +% {(DPC) lowercase fd file names. internal/1044} +% For increased portability make the external filename +% monocase, but look for the (old style) mixed case +% filename if the first attempt fails. +% +% On any monocase system this means that the file is looked for twice +% which takes up time and string space, but at least for this release +% Check for both names to give people time to re-install their private +% fd files with lowercase names. +% \begin{macrocode} + \edef\reserved@a{% + \lowercase{% + \noexpand\InputIfFileExists{\f@encoding\f@family.fd}}}% + \reserved@a\relax + {\@input@{\f@encoding\f@family.fd}}% + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\nfss@catcodes} +% \changes{v2.1e}{1994/02/24} +% {Separate restoration of catcodes for fd cmds} +% This macro should contain the standard |\catcode| assignments to +% all characters which are used in the commands found in an +% \texttt{.fd} file and which might have special |\catcode|s in the +% middle of a document. If necessary, this list can be extended in +% a package file using a suitable number of |\expandafter|, i.e., +%\begin{verbatim} +% \expandafter\def\expandafter\nfss@catcodes +% \expandafter{\nfss@catcodes <additional settings>} +%\end{verbatim} +% Note, that this macro might get executed several times since it +% is also called by |\DeclareFontShape|, thus it probably should +% not be misused as a general purpose hook. +% \begin{macrocode} +\def\nfss@catcodes{% +% \end{macrocode} +% We start by making |@| a letter and ignoring all blanks and newlines. +% \changes{v2.1z}{1994/12/06}{Added tab char as well} +% \changes{v3.0p}{1996/07/26}{omit \cs{relax} as not needed} +% \changes{v3.0t}{1997/10/21}{Moved \cs{makeatletter} from +% \cs{try@load@font@shape}.} +% \begin{macrocode} + \makeatletter + \catcode`\ 9% + \catcode`\^^I9% + \catcode`\^^M9% +% \end{macrocode} +% Then we set up |\|, |{|, |}|, |#| and |%| in case an \texttt{.fd} +% file is loaded during a verbatim environment. +% \changes{v3.0n}{1995/11/27}{Reset hash, for definitions in fd files} +% \changes{v3.00}{1995/12/06}{Reset hat, for typeouts etc in fd files} +% \begin{macrocode} + \catcode`\\\z@ + \catcode`\{\@ne + \catcode`\}\tw@ + \catcode`\#6% + \catcode`\^7% + \catcode`\%14% +% \end{macrocode} +% The we make sure that the important syntax parts have the right +% |\catcode|. +% \changes{v2.1s}{1994/09/16}{Reset [ and ] as well, just in case} +% \changes{v3.0r}{1996/08/25}{Reset the acute, grave and double quote +% chars as well} +% \begin{macrocode} + \@makeother\<% + \@makeother\>% + \@makeother\*% + \@makeother\.% + \@makeother\-% + \@makeother\/% + \@makeother\[% + \@makeother\]% + \@makeother\`% + \@makeother\'% + \@makeother\"% +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\DeclareErrorFont} +% Declare the last resort shape! We assume that in this fontshape +% there is a 10pt font but it doesn't really matter. We only loose +% one macro name if the assumption is false. But at least the font +% should be there! +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2019/10/01}% +%<latexrelease> {\DeclareErrorFont}{No side effects please}% +\def\DeclareErrorFont#1#2#3#4#5{% + \xdef\error@fontshape{% + \noexpand\expandafter\noexpand\split@name\noexpand\string + \expandafter\noexpand\csname#1/#2/#3/#4/#5\endcsname + \noexpand\@nil}% +% \end{macrocode} +% Initialize all those internal variables which may or may not have +% values in the first seconds of NFSS' bootstraping process. Later +% on such values will be updated when an encoding is selected, etc. +% +% We definitely don't want to set |\f@encoding|; we can set all the +% others since if they are left ``blank'' any selection would grap +% ``error default values'' as well. However, this probably should +% go also---and now it did. +% \changes{v2.1n}{1994/05/14}{Don't set \cs{f@encoding}} +% \changes{v3.2c}{2019/07/09}{Don't set any \cs{f@...} macros} +% \begin{macrocode} +% \gdef\f@encoding{#1}% + \gdef\default@family{#2}% + \gdef\default@series{#3}% + \gdef\default@shape{#4}% +} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\DeclareErrorFont}{No side effects please}% +%<latexrelease> +%<latexrelease>\def\DeclareErrorFont#1#2#3#4#5{% +%<latexrelease> \xdef\error@fontshape{% +%<latexrelease> \noexpand\expandafter\noexpand\split@name\noexpand\string +%<latexrelease> \expandafter\noexpand\csname#1/#2/#3/#4/#5\endcsname +%<latexrelease> \noexpand\@nil}% +%<latexrelease> \gdef\default@family{#2}% +%<latexrelease> \gdef\default@series{#3}% +%<latexrelease> \gdef\default@shape{#4}% +%<latexrelease> \global\let\f@family\default@family +%<latexrelease> \global\let\f@series\default@series +%<latexrelease> \global\let\f@shape\default@shape +%<latexrelease> \gdef\f@size{#5}% +%<latexrelease> \gdef\f@baselineskip{#5pt}% +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareErrorFont +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\wrong@fontshape} +% Before we come to the macro |\extract@font| we have to take +% care of unknown |\curr@fontshape| combinations. +% The general strategy is to issue a warning and to try a default +% \emph{shape}, then a default \emph{series}, +% and finally a default \emph{family}. +% If this last one also fails \TeX{} will go into an infinite loop. +% But if the defaults are set incorrectly one deserves nothing else! +% \changes{v1.9a}{1992/07/26}{} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\wrong@fontshape}% +%<latexrelease> {Font substituation in preamble}% +%<*2ekernel|latexrelease> +\def\wrong@fontshape{% + \csname D@\f@encoding\endcsname % install defaults if in math +% \end{macrocode} +% We remember the wanted |\curr@fontshape| combination +% which we will need in a moment. +% \begin{macrocode} + \edef\reserved@a{\csname\curr@fontshape\endcsname}% + \ifx\last@fontshape\reserved@a + \errmessage{Corrupted NFSS tables}% + \error@fontshape + \else +% \end{macrocode} +% Then we warn the user about the mess and set the shape to its +% default. +% \changes{v1.0q}{1989/11/19} +% {Instead of calling \cs{family}\cs{default@family}, +% etc. we directly set \cs{f@family}, etc.} +% \changes{v1.2f}{1990/01/28}{Warning message slightly changed.} +% \begin{macrocode} + \let\f@shape\default@shape +% \end{macrocode} +% If the combination is not known, try the default \emph{series}. +% \begin{macrocode} + \expandafter\ifx\csname\curr@fontshape\endcsname\relax + \let\f@series\default@series +% \end{macrocode} +% If this is still undefined, try the default \emph{family}. +% Otherwise give up. We never try to change the encoding scheme! +% \changes{v1.9a}{1992/07/26}{} +% \changes{v3.1a}{2015/04/07}{Try loading fd file if family has changed} +% \begin{macrocode} + \expandafter + \ifx\csname\curr@fontshape\endcsname\relax + \let\f@family\default@family +% \end{macrocode} +% If we change the font family and we are in the preamble then the +% corresponding \texttt{.fd} file may not been loaded +% yet. Therefore we try this now. Otherwise equating the requested +% font shape with the finally selected fontshape below will fail +% and can result in ``NFSS tables corruped''. After begin document +% that will not happen as all \texttt{.fd} files involved in +% substituation are loaded at |\begin{document}|. +% \begin{macrocode} + \begingroup + \try@load@fontshape + \endgroup + \fi \fi + \fi +% \end{macrocode} +% At this point a valid |\curr@fontshape| combination must +% have been found. +% We inform the user about this fact. +%\changes{v3.0n}{1995/11/02} +% {(DPC) Remove extra space with \cs{string} for latex/1676} +% \changes{v3.0m}{1995/11/17} +% {Support \cs{@wrong@font@char} latex/1676} +% +% The |\expandafter\string| here stops \TeX\ adding the space +% that it usually puts after command names in messages. The similar +% construction with |\@undefined| just produces `undefined', but saves +% a few tokens. +% +% |\@wrong@font@char| is locally redefined in |\UseTextSymbol| from +% its normal (empty) definition, to report the symbol generating the +% font switch. +% \begin{macrocode} + \@font@warning{Font shape `\expandafter\string\reserved@a' + \expandafter\@gobble\string\@undefined\MessageBreak + using `\curr@fontshape' instead\@wrong@font@char}% + \global\let\last@fontshape\reserved@a +% \end{macrocode} +% We change |\@defaultsubs| to produce a warning at the end of +% the document. +% \changes{v3.0d}{1995/07/13}{Change a macro not a switch to flag +% default font substitutions} +% \changes{v3.0k}{1995/10/24}{Make this code inline since it +% happens only here} +% The macro |\@defaultsubs| is initially |\relax| but gets changed +% here if some default font substitution happens. +% It is then executed in |\enddocument|. +% \begin{macrocode} + \gdef\@defaultsubs{% + \@font@warning{Some font shapes were not available, defaults + substituted.\@gobbletwo}}% +% \end{macrocode} +% If we substitute a |\curr@fontshape| combination +% by the default one we don't want the warning to be printed out +% whenever this (unknown) combination is used. +% Therefore we globally |\let| the macro corresponding to +% the wanted combination equal to its substitution. +% This requires the use of four |\expandafter|'s +% since |\csname|\dots|\endcsname| has to be +% expanded before |\reserved@a| (i.e.\ the requested +% combination), +% and this must happen before the |\let| is executed. +% \begin{macrocode} + \global\expandafter\expandafter\expandafter\let + \expandafter\reserved@a + \csname\curr@fontshape\endcsname +% \end{macrocode} +% Now we can redefine |\font@name| accordingly. +% This \emph{must} be done globally since it might occur in the +% group opened by |\define@newfont|. If we would this +% definition were local the closing |\endgroup| there +% would restore the old meaning of |\font@name| and then +% switch to the wrong font at the end of |\selectfont| +% although the correct font was loaded. +% \begin{macrocode} + \xdef\font@name{% + \csname\curr@fontshape/\f@size\endcsname}% +% \end{macrocode} +% The last thing this macro does is to call |\pickup@font| +% again to load the font if it is not defined yet. +% At this point this code will loop endlessly if +% the defaults are not well defined. +% \begin{macrocode} + \pickup@font} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\wrong@fontshape}% +%<latexrelease> {Font substituation in preamble}% +%<latexrelease>\def\wrong@fontshape{% +%<latexrelease> \csname D@\f@encoding\endcsname +%<latexrelease> \edef\reserved@a{\csname\curr@fontshape\endcsname}% +%<latexrelease> \ifx\last@fontshape\reserved@a +%<latexrelease> \errmessage{Corrupted NFSS tables}% +%<latexrelease> \error@fontshape +%<latexrelease> \else +%<latexrelease> \let\f@shape\default@shape +%<latexrelease> \expandafter\ifx\csname\curr@fontshape\endcsname\relax +%<latexrelease> \let\f@series\default@series +%<latexrelease> \expandafter +%<latexrelease> \ifx\csname\curr@fontshape\endcsname\relax +%<latexrelease> \let\f@family\default@family +%<latexrelease> \fi \fi +%<latexrelease> \fi +%<latexrelease> \@font@warning{Font shape +%<latexrelease> `\expandafter\string\reserved@a' +%<latexrelease> \expandafter\@gobble\string\@undefined +%<latexrelease> \MessageBreak +%<latexrelease> using `\curr@fontshape' instead\@wrong@font@char}% +%<latexrelease> \global\let\last@fontshape\reserved@a +%<latexrelease> \gdef\@defaultsubs{% +%<latexrelease> \@font@warning{Some font shapes were not available, +%<latexrelease> defaults substituted.\@gobbletwo}}% +%<latexrelease> \global\expandafter\expandafter\expandafter\let +%<latexrelease> \expandafter\reserved@a +%<latexrelease> \csname\curr@fontshape\endcsname +%<latexrelease> \xdef\font@name{% +%<latexrelease> \csname\curr@fontshape/\f@size\endcsname}% +%<latexrelease> \pickup@font} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@wrong@font@char} +% \changes{v3.0m}{1995/11/17}{(DPC) Macro added. latex/1676} +% Normally empty but redefined in |\UseTextSymbol| so that the +% Font shape undefined message can refer to the symbol causing the +% problem. +% \begin{macrocode} +\let\@wrong@font@char\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@defaultsubs} +% \changes{v3.0d}{1995/07/13}{macro added} +% \changes{v3.0k}{1995/10/24}{macro removed} +% \begin{macro}{\@defaultsubs} +% \changes{v3.0d}{1995/07/13}{macro added} +% See above. +% \begin{macrocode} +\let\@defaultsubs\relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\strip@prefix} +% In |\extract@font| we will need a way to recover the +% replacement text of a macro. +% This is done by the primitive |\meaning| together +% with the macro |\strip@prefix| (for the details +% see appendix~D of the \TeX{}book, p.\ 382). +% \begin{macrocode} +\def\strip@prefix#1>{} +% \end{macrocode} +% \end{macro} +% +% ^^A \extract@font +% +% +% +% \section{Assigning math fonts to \emph{versions}} +% +% +% \begin{macro}{\install@mathalphabet} +% This is just another name for |\gdef| but we can redefine it if +% necessary later on. +% \begin{macrocode} +\let\install@mathalphabet\gdef +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\math@fonts} +% +% \changes{v1.9a}{1992/07/26}{} +% \begin{macrocode} +\let\math@fonts\@empty +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\select@group} +% \changes{v1.0t}{1989/11/26}{\cs{bgroup}/\cs{egroup} changed to +% \cs{begingroup}/\cs{endgroup} to avoid empty Ord atom on math list.} +% |\select@group| has four arguments: the new +% \meta{math alphabet identifier} (a control sequence), the +% \meta{math group number}, the extra macro for math mode +% and the |\curr@fontshape| definition macro name. +% We first check if we are in math mode. +% \changes{v1.1a}{1989/12/16}{\cs{relax} in front added.} +% \changes{v1.1a}{1989/12/16}{Now four arguments.} +% \begin{macrocode} +%\def\select@group#1#2#3{\relax\ifmmode +% \end{macrocode} +% We do these things locally using |\begingroup| instead +% of |\bgroup| to avoid the appearance of an empty Ord +% atom on the math list. +% \begin{macrocode} +% \begingroup +% \end{macrocode} +% We set the math fonts for the \emph{family} in question by calling +% |\getanddefine@fonts| in the correct environment. +% \changes{v1.9a}{1992/07/26}{} +% \begin{macrocode} +% \escapechar\m@ne +% \getanddefine@fonts{\csname c@mv@\math@version\endcsname}#3% +% \end{macrocode} +% We globally select the math fonts\dots +% \begin{macrocode} +% \globaldefs\@ne \math@fonts +% \end{macrocode} +% \dots{} and close the group to +% restore |\globaldefs| and |\escapechar|. +% \begin{macrocode} +% \endgroup +% \end{macrocode} +% As long as no \emph{size} or \emph{version} change occurs +% the \meta{math alphabet identifier} should simply switch to the +% installed \emph{math group} instead of calling +% |\select@group| +% unnecessarily. So we globally redefine the first argument +% (the new \meta{math alphabet identifier}) +% to expand into a |\mathgroup| switch +% and then select this \emph{alphabet}. Note that this redefinition +% will be overwritten by the next call to a \emph{version} macro. +% \changes{v1.1a}{1989/12/16}{Usage of `\quotechar=' macro added.} +% \changes{v1.1a}{1989/12/16}{Redefinition of alphabet now simpler.} +% \changes{v1.2a}{1990/01/20}{Def for alph id changed.} +% The original code for the end of |\select@group| was +% \begin{verbatim} +% \gdef#1{#3\mathgroup #2}#1\fi} +%\end{verbatim} +% i.e.\ first redefining the \meta{math alphabet identifier} and +% then calling the new definition to switch to the wanted +% \meta{math group}. Now we define the \meta{math alphabet +% identifier} as a call to the |\use@mathgroup| command. +% \changes{v1.2b}{1990/01/21}{Code moved to \cs{use@mathgroup}.} +% \begin{macrocode} +% \xdef#1{\noexpand\use@mathgroup\noexpand#2% +% {\number\csname c@mv@\math@version\endcsname}}% +% \end{macrocode} +% \changes{v1.3c}{1992/05/12}{Added call to +% \cs{extract@alph@from@version}.} +% But this is not sufficient, as we learned the hard way. +% The problem here is that the loading of the fonts that comprise +% the alphabet identifier |#1|, as well as the necessary math font +% assignments is deferred until it is used. This is OK so far, but +% if the fonts are switched within the current formula (which may +% happen if a sub-formula is a box that contains a math version +% switch) the font assignments for |#1| are not restored unless +% |#1| is used again. This is disastrous since TeX sees the wrong +% fonts at the end of the math formula, when it converts the math +% list into a horizontal list. +% +% This is taken into account as follows: When a math alphabet +% identifier is used for the first time in a certain version +% it modifies the corresponding macro |\mv@|\meta{version} +% so that it calls |\getanddefine@fonts| directly in future as well. +% We use the macro |\extract@alph@from@version| to do this. +% It takes the math alphabet identifer |#1| and the math version +% macro as arguments. +% \changes{v1.9a}{1992/07/26}{} +% \begin{macrocode} +% \expandafter\extract@alph@from@version +% \csname mv@\math@version\expandafter\endcsname +% \expandafter{\number\csname c@mv@\math@version\endcsname}% +% #1% +% \stepcounter{mv@\math@version}% +% \end{macrocode} +% Finally, it is not possible to simply call the new definition +% since we +% have an argument (the third argument of |\use@mathgroup| +% or more exactly the argument od |\math@egroup| if the {\ttfamily +% margid} option is in force) +% which would swallow our closing |\fi|. So +% we use the |\expandafter| technique to remove the |\fi| +% before the |\use@mathgroup| is expanded. +% \begin{macrocode} +%\expandafter #1\fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\extract@alph@from@version} +% \changes{v1.3c}{1992/05/12}{Macro added.} +% We proceed to the definition of the +% macro |\extract@alph@from@version|. As stated above, it takes +% a math alphabet identifier and a math version macro +% (e.g.\ |\mv@normal|) as its arguments. +% \begin{macrocode} +\def\extract@alph@from@version#1#2#3{% +% \end{macrocode} +% To extract and replace the definition of math alphabet identifier +% |#3| in macro |#1| we have to recall how this definition looks +% like: Somewhere in the replacement text of |#1| there is +% the sequence\\[2pt] +% |\install@mathalphabet|\meta{math alphabet identifier} |#3||{%| \\ +% \hspace*{\MacroIndent}\hspace*{5mm} +% \meta{Definitions for }|#3}| \\[2pt] +% Hence, the first thing we do is to extract the tokens preceding +% this definitions, the definition itself, and the tokens following +% it. To this end we define one auxiliary macro |\reserved@a|. +% \begin{macrocode} + \def\reserved@a##1\install@mathalphabet#3##2##3\@nil{% +% \end{macrocode} +% When |\reserved@a| is expanded, it will have the tokens preceding +% the definition in question in its first argument (|##1|), the +% following tokens in its third argument (|##3|), and the replacement +% text for the math alphabet identifier |#3| in its second argument. +% (|##2|). This is then recorded for later use in a temporary macro +% |\reserved@b|. +% \begin{macrocode} + \def\reserved@b{##2}% +% \end{macrocode} +% Additionally, we define a macro |\reserved@c| to reconstruct the +% definitions for the math version in question from the tokens that +% will remain unchanged (|##1| and |##3|) and the yet to build new +% definitions for the math alphabet identifier |#3|. +% \begin{macrocode} + \def\reserved@c####1{\gdef#1{##1####1##3}}}% +% \end{macrocode} +% Then we execute our auxiliary macro. +% \begin{macrocode} + \expandafter\reserved@a#1\@nil +% \end{macrocode} +% OK, so now we have to build the new definition for |#3|. To do so, +% we first extract the interesting parts out of the old one. +% The old definition looks like:\\[2pt] +% |\select@group|\meta{math alphabet identifier} \\ +% \hspace*{\MacroIndent}\hspace*{5mm} +% \meta{math group number}\meta{math extra part}\\ +% \meta{|curr@fontshape| definition} \\[2pt] +% So we define a new temporary macro |\reserved@a| that +% extracts these parts. +% \begin{macrocode} + \def\reserved@a\select@group#3##1##2\@nil{% +% \end{macrocode} +% This macro can now directly rebuild the math version definition +% by calling |\reserved@c|: +% \begin{macrocode} + \reserved@c{% + \getanddefine@fonts{#2}##2% + \install@mathalphabet#3{% + \relax\ifmmode \else \non@alpherr#3\fi + \use@mathgroup##1{#2}}}% +% \end{macrocode} +% \changes{v2.1t}{1994/10/15}{Warn if math alpha is used outside math} +% In addtion it defines the alphabet the way it should be used from +% now on. +% \begin{macrocode} + \gdef#3{\relax\ifmmode \else \non@alpherr#3\fi + \use@mathgroup##1{#2}}}% +% \end{macrocode} +% Finally, we only have to call this macro |\reserved@a| on the old +% definitions recorded in |\reserved@b|: +% \begin{macrocode} + \expandafter\reserved@a\reserved@b\@nil + } +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\math@bgroup} +% \changes{v1.2a}{1990/01/20}{Def. placed in this file.} +% \begin{macro}{\math@egroup} +% \changes{v1.2a}{1990/01/20}{Def. placed in this file.} +% \changes{v1.2h}{1990/03/30}{Changed to have one arg.} +% \changes{v2.2f}{1994/03/10}{Changed \cs{begingroup}/\cs{endgroup} to +% \cs{bgroup}/\cs{egroup}.} +% Here are the default definitions for |\math@bgroup| and +% |\math@egroup|. We use |\bgroup| instead of |\begingroup| +% to avoid `leaking out' of style changes. This has the side +% effect of always producing mathord atoms. +% \begin{macrocode} +\let\math@bgroup\bgroup +\def\math@egroup#1{#1\egroup} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\calculate@math@sizes} +% \changes{v2.1i}{1994/04/18}{Changed message to log only} +% Here is the default definition for |\calculate@math@sizes| +% a more elaborate interface +% is under testing in mthscale.sty. +% \begin{macrocode} +\gdef\calculate@math@sizes{% + \@font@info{Calculating\space math\space sizes\space for\space + size\space <\f@size>}% + \dimen@\f@size \p@ + \@tempdimb \defaultscriptratio \dimen@ + \dimen@ \defaultscriptscriptratio \dimen@ + \expandafter\xdef\csname S@\f@size\endcsname{% + \gdef\noexpand\tf@size{\f@size}% + \gdef\noexpand\sf@size{\strip@pt\@tempdimb}% + \gdef\noexpand\ssf@size{\strip@pt\dimen@}% + \noexpand\math@fontstrue}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\defaultscriptratio} +% \changes{v2.1h}{1994/04/11}{Macro added} +% \begin{macro}{\defaultscriptscriptratio} +% \changes{v2.1h}{1994/04/11}{Macro added} +% The default ratio for math +% sizes is:\\ +% 1 to |\defaultscriptratio| to |\defaultscriptscriptratio|.\\ +% By default this is 1 to .7 to .5. +% \begin{macrocode} +\def\defaultscriptratio{.7} +\def\defaultscriptscriptratio{.5} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\noaccents@} +% If we don't have a definition for |\noaccents@| we provide a +% dummy. +% \begin{macrocode} +\ifx\noaccents@\@undefined + \let\noaccents@\@empty +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\showhyphens} +% \changes{v1.2l}{1990/06/30}{Macro added.} +% \changes{v2.0e}{1993/05/16}{Use \cs{reset@font}} +% \changes{v3.0h}{1995/10/10} +% {Use \cs{normalfont} and make colour safe, and autoloadable} +% \changes{v3.0u}{1998/03/25} +% {Suppress unnecessary error when used in preamble} +% \changes{v3.2a}{2017/01/10} +% {Add version of \cs{showhyphens} that works with Xe\TeX.} +% The |\showhyphens| command must be redefined since the version in +% \texttt{plain.tex} uses |\tenrm|. We have also made some further +% adjustments for its use in \LaTeX. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/01/01}{\showhyphens}% +%<latexrelease> {XeTeX support for \showhyphens}% +%<*2ekernel|latexrelease> +\ifx\XeTeXcharclass\@undefined +% \end{macrocode} +% Version for engines other than Xe\TeX. +% \begin{macrocode} +\gdef\showhyphens#1{% + \setbox0\vbox{% + \color@begingroup + \everypar{}% + \parfillskip\z@skip\hsize\maxdimen + \normalfont + \pretolerance\m@ne\tolerance\m@ne\hbadness\z@\showboxdepth\z@\ #1% + \color@endgroup}} +% \end{macrocode} +% \begin{macrocode} +\else +% \end{macrocode} +% Xe\TeX\ version. When using system fonts Xe\TeX\ reports consecutive +% runs of characters as a single item in box logging, which means the +% standard |\showhyphens| does not work. This version typesets the +% text into a narrow box to force hyphenation and then reconstructs a +% horizontal list with explicit hyphens to generate the display. Note +% that the |lmr| OpenType font is forced, this works even if the +% characters are not in the font as hyphenation is attempted due to +% the width of the space and hyphen character. It may generate +% spurious Missing Character warnings in the log, these are however +% suppressed from the terminal output by ensuring that +% |\tracingonline| is locally zero. +% \begin{macrocode} +\long\def\showhyphens#1{% + \setbox0\vbox{% + \usefont{TU}{lmr}{m}{n}% + \hsize 1sp % + \hbadness\@M + \hfuzz\maxdimen + \tracingonline\z@ + \everypar={}% + \leftskip\z@skip + \rightskip\z@skip + \parfillskip\z@skip + \hyphenpenalty=-\@M + \pretolerance\m@ne + \interlinepenalty\z@ + \clubpenalty\z@ + \widowpenalty\z@ + \brokenpenalty1127 % + \setbox\z@\hbox{}% + \noindent + \hskip\z@skip + #1% + \par +% \end{macrocode} +% Note here we stop the loop if made no progress, non-removable items +% may mean that we can not process the whole list (which would be +% testable as |\lastnodetype=-1|). +% \begin{macrocode} + \loop + \@tempswafalse + \ifnum\lastnodetype=11\unskip\@tempswatrue\fi + \ifnum\lastnodetype=12\unkern\@tempswatrue\fi + \ifnum\lastnodetype=13 % + \count@\lastpenalty + \unpenalty\@tempswatrue + \fi + \ifnum\lastnodetype=\@ne + \setbox\tw@\lastbox\@tempswatrue + \setbox0\hbox{\unhbox\tw@\unskip\unskip\unpenalty + \ifnum\count@=1127 \else\ \fi + \unhbox0}% + \count@\z@ + \fi + \if@tempswa + \repeat + \hbadness\z@ + \hsize\maxdimen + \showboxdepth\z@ + \tolerance\m@ne + \hyphenpenalty\z@ + \noindent\unhbox\z@ +}} +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\showhyphens}% +%<latexrelease> {XeTeX support for \showhyphens}% +%<latexrelease>\gdef\showhyphens#1{% +%<latexrelease> \setbox0\vbox{% +%<latexrelease> \color@begingroup +%<latexrelease> \everypar{}% +%<latexrelease> \parfillskip\z@skip\hsize\maxdimen +%<latexrelease> \normalfont +%<latexrelease> \pretolerance\m@ne\tolerance\m@ne +%<latexrelease> \hbadness\z@\showboxdepth\z@\ #1% +%<latexrelease> \color@endgroup}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\addto@hook} +% \changes{v1.0u}{1989/12/05}{\cs{addto@hook} added.} +% \changes{v2.1d}{1994/02/10}{Made \cs{addto@hook} long.} +% We need a macro to add tokens to a hook. +% \begin{macrocode} +\long\def\addto@hook#1#2{#1\expandafter{\the#1#2}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@vpt} +% \changes{v2.1v}{1994/11/09}{(DPC) macros added, from setsize.dtx} +% \changes{v2.1v}{1994/11/09}{(DPC) reduce save stack usage latex/1742} +% \begin{macrocode} + \def\@vpt{5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@vipt} +% \begin{macrocode} + \def\@vipt{6} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@viipt} +% \begin{macrocode} + \def\@viipt{7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@viiipt} +% \begin{macrocode} + \def\@viiipt{8} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ixpt} +% \begin{macrocode} + \def\@ixpt{9} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xpt} +% \begin{macrocode} + \def\@xpt{10} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xipt} +% \begin{macrocode} + \def\@xipt{10.95} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xiipt} +% \begin{macrocode} + \def\@xiipt{12} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xivpt} +% \begin{macrocode} + \def\@xivpt{14.4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xviipt} +% \begin{macrocode} + \def\@xviipt{17.28} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xxpt} +% \begin{macrocode} + \def\@xxpt{20.74} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xxvpt} +% \begin{macrocode} + \def\@xxvpt{24.88} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx b/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx new file mode 100644 index 00000000000..8157428fde5 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfsscmp.dtx @@ -0,0 +1,378 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltfsscmp.dtx +%% Copyright (C) 1989-1995 Frank Mittelbach and Rainer Sch\"opf, +%% all rights reserved. +% +%<*driver> +% \fi +% +% +\ProvidesFile{ltfsscmp.dtx} + [2015/06/23 v3.0f LaTeX Kernel (NFSS1 Compatibility)] +% \iffalse +\documentclass{ltxdoc} +\begin{document} +\DocInput{ltfsscmp.dtx} +\end{document} +%</driver> +% \fi +% +% \iffalse +%<+checkmem>\def\CHECKMEM{\tracingstats=2 +%<+checkmem> \newlinechar=`\^^J +%<+checkmem> \message{^^JMemory usage: \filename}\shipout\hbox{}} +%<+checkmem>\CHECKMEM +% \fi +% +% +% +% \GetFileInfo{ltfsscmp.dtx} +% \title{A new font selection scheme for \TeX{} macro packages\\ +% (Compatibility with NFSS1)\thanks +% {This file has version number +% \fileversion\ dated \filedate}} +% +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% This file contains the implementation of commands giving +% compatibility with the original `NFSS1' release of the Font Selection +% Scheme. +% +% \begin{quote} +% \textbf{Warning:} +% The macro documentation is still basically the documentation from the +% first NFSS release and therefore in some cases probably not +% completely accurate. +% \end{quote} +% +% Version 1 of NFSS is obsolete now for about 20 years (and was +% ``current'' only for a short intermediate time) so with the 2015 +% release these internal interface commands are removed from the +% kernel and made available via \textsf{latexrelease} package so that +% backward compatibility remains ensured for very old documents. +% +% \StopEventually{} +% +% +% \changes{v3.0b}{1995/06/15} +% {(DPC) minor documentation edits} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Make file from previous file, fam.dtx 1995/05/20 v2.2d} +% \changes{v3.0d}{2015/02/21} +% {Removed autoload code} +% \changes{v3.0e}{2015/02/22} +% {Moved all code into latexrelease - obsolete commands are no +% longer automatically part of the kernel} +% +% +% \begin{macrocode} +%<*latexrelease> +\IncludeInRelease{2015/01/01}{\new@fontshape}% + {NFSS version1 commands}% +\let\new@fontshape\@undefined +\let\warn@rel@i\@undefined +\let\scan@fontshape\@undefined +\let\scan@@fontshape\@undefined +\let\subst@fontshape\@undefined +\let\extra@def\@undefined +\let\default@mextra\@undefined +\let\preload@sizes\@undefined +\let\err@rel@i\@undefined +\let\newmathalphabet\@undefined +\let\newmathalphabet@\@undefined +\let\newmathalphabet@@@\@undefined +\let\if@no@font@opt\@undefined +\let\@no@font@optfalse\@undefined +\let\define@mathalphabet\@undefined +\let\define@mathgroup\@undefined +\let\addtoversion\@undefined +\EndIncludeInRelease +% \end{macrocode} +% +% In older releases we provide the original definitions. +% +% \begin{macrocode} +\IncludeInRelease{0000/00/00}{\new@fontshape}% + {NFSS version1 commands}% +% \end{macrocode} +% +% \begin{macro}{\new@fontshape} +% The interface is now |\DeclareFontShape|. +% \begin{macrocode} +\gdef\new@fontshape#1#2#3#4{% + \warn@rel@i\new@fontshape\DeclareFontShape + \expandafter\scan@fontshape\@gobble#4<\@nil><<% + \DeclareFontShape U{#1}{#2}{#3}\reserved@f}% +\@onlypreamble\new@fontshape +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\warn@rel@i} +% The warning message used above. +% \begin{macrocode} +\gdef\warn@rel@i#1#2{% + \@font@warning{*** NFSS release 1 command + \noexpand#1found\MessageBreak + *** Update by using release 2 command + \string#2.\MessageBreak + *** Recovery is probably possible}% +}% +\@onlypreamble\warn@rel@i +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\scan@fontshape} +% This will scan the old font shape definition syntax. +% \begin{macrocode} +\gdef\scan@fontshape{% + \let\reserved@f\@empty + \let\reserved@e\@empty % holds last info + \scan@@fontshape +}% +\@onlypreamble\scan@fontshape +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\scan@@fontshape} +% \begin{macrocode} +\gdef\scan@@fontshape#1>#2#3<{% + \ifx\@nil#1% + \edef\reserved@f{\reserved@f\reserved@e}% + \else + \def\reserved@b{#1}% nick names + \def\reserved@c{#3}% + \in@{ at}{#3}% + \ifin@ + \in@{pt}{#3}% not a proof but a good chance + \ifin@ +% \end{macrocode} +% We grap also everything after pt and discard it if people have +% forgotten to place a percent sign there. +% \changes{v2.1d}{1994/02/10}{scan away stuff after pt} +% \begin{macrocode} + \def\reserved@a##1 at##2pt##3\@nil{% + \def\reserved@b{##2}% + \def\reserved@c{##1}% + }% + \reserved@a#3\@nil + \fi + \fi + \ifnum 0<0#2 + \edef\reserved@d{subf*\reserved@c}% + \ifcase #2\or + \or + \else + \errmessage{*** What's this? NFSS release 0? ***}% + \fi + \else + \edef\reserved@d{#2\reserved@c}% + \fi + \ifx\reserved@d\reserved@e + \edef\reserved@f{\reserved@f<\reserved@b>}% + \else + \edef\reserved@f{\reserved@f\reserved@e<\reserved@b>}%add old info + \let\reserved@e\reserved@d + \fi + \expandafter\scan@@fontshape + \fi +}% +\@onlypreamble\scan@@fontshape +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\subst@fontshape} +% This is now also handled by the extend syntax of +% |\DeclareFontShape|. +% \begin{macrocode} +\gdef\subst@fontshape#1#2#3#4#5#6{% + \warn@rel@i\subst@fontshape\DeclareFontShape + \DeclareFontShape{U}{#1}{#2}{#3}{<->sub*#4/#5/#6}{}}% +\@onlypreamble\subst@fontshape +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\extra@def} +% This was replaced by |\DeclareFontFamily|. +% \begin{macrocode} +\gdef\extra@def#1#2#3{% + \warn@rel@i\extra@def\DeclareFontFamily + \DeclareFontFamily{U}{#1}{}% +}% +\@onlypreamble\extra@def +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\default@mextra} +% The new name is |\DeclareFontEncodingDefaults| but in this case +% we don't feel comfortable with this either. +% \begin{macrocode} +\gdef\default@mextra{% + \warn@rel@i\default@mextra\DeclareFontEncodingDefaults +% \end{macrocode} +% We pick up the argument to |\default@mextra| implicitly as +% the second argument of |\DeclareFontEncodingDefaults|. +% \begin{macrocode} + \DeclareFontEncodingDefaults\relax +}% +\@onlypreamble\default@mextra +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\preload@sizes} +% The new interface is |\DeclarePreloadSizes|. +% \begin{macrocode} +\gdef\preload@sizes{% + \warn@rel@i\preload@sizes\DeclarePreloadSizes + \DeclarePreloadSizes U% +}% +\@onlypreamble\preload@sizes +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\err@rel@i} +% This macro is used in cases where emulation with NFSS2 features +% is not really possible. +% \begin{macrocode} +\gdef\err@rel@i#1#2{% + \@latex@error{*** NFSS release 1 command \noexpand#1found% + ^^J*** Recovery not possible. Use \string#2}% + {The new release of NFSS doesn't support the + \noexpand#1command^^Jany longer. + Please upgrade your file to the syntax of NFSS + release 2^^Jusing the \noexpand#2command.}% +% \end{macrocode} +% Let's die. +% \begin{macrocode} + \batchmode\input.\relax +}% +\@onlypreamble\err@rel@i +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\newmathalphabet} +% \begin{macro}{\newmathalphabet@@} +% \begin{macro}{\newmathalphabet@@@} +% |\newmathalphabet| is the old form. +% \begin{macrocode} +\gdef\newmathalphabet{% + \if@no@font@opt + \@latex@error{*** NFSS release 1 command + \noexpand\newmathalphabet found% + ^^J \space*** Automatic recovery not possible.% + ^^J \space*** TYPE H for Help% + }% + {Please look at the file usrguide.tex for hints on + how to resolve this problem.}% + \else + \warn@rel@i\newmathalphabet\DeclareMathAlphabet + \fi + \@ifstar\newmathalphabet@@@ + \newmathalphabet@@}% +\gdef\newmathalphabet@@#1{\DeclareMathAlphabet#1{U}{}{}{}}% +\gdef\newmathalphabet@@@#1#2#3#4{% + \DeclareMathAlphabet{#1}{U}{#2}{#3}{#4}}% +\@onlypreamble\newmathalphabet +\@onlypreamble\newmathalphabet@@ +\@onlypreamble\newmathalphabet@@@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@no@font@opt} +% \begin{macro}{\@no@font@optfalse} +% \begin{macrocode} +\global\let\if@no@font@opt\iftrue +\gdef\@no@font@optfalse{\let\if@no@font@opt\iffalse}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\define@mathalphabet} +% This is a case where dying is best. +% \begin{macrocode} +\gdef\define@mathalphabet{% + \err@rel@i\define@mathalphabet\DeclareMathAlphabet +}% +\@onlypreamble\define@mathalphabet +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\define@mathgroup} +% And here is another one +% \begin{macrocode} +\gdef\define@mathgroup{% + \err@rel@i\define@mathgroup\DeclareSymbolFont +}% +\@onlypreamble\define@mathgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtoversion} +% |\addtoversion| is the old form. +% \begin{macrocode} +\def\addtoversion#1#2{% + \warn@rel@i\addtoversion\SetMathAlphabet + \SetMathAlphabet#2{#1}{U}}% +\@onlypreamble\addtoversion +% \end{macrocode} +% \end{macro} +% +% Finishing off this huge |\IncludeInRelease| argument: +% \begin{macrocode} +\EndIncludeInRelease +%</latexrelease> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx new file mode 100644 index 00000000000..cca3df4693c --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfssdcl.dtx @@ -0,0 +1,1639 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltfssdcl.dtx +%% Copyright (C) 1989-1998 Frank Mittelbach and Rainer Sch\"opf, +%% all rights reserved. +% +%<*driver> +% \fi +% +% +\ProvidesFile{ltfssdcl.dtx} + [2016/02/18 v3.0r LaTeX Kernel (NFSS Declarative Interface)] +% \iffalse +\documentclass{ltxdoc} +\begin{document} +\DocInput{ltfssdcl.dtx} +\end{document} +%</driver> +% \fi +% +% \iffalse +%<+checkmem>\def\CHECKMEM{\tracingstats=2 +%<+checkmem> \newlinechar=`\^^J +%<+checkmem> \message{^^JMemory usage: \filename}\shipout\hbox{}} +%<+checkmem>\CHECKMEM +% \fi +% +% +% +% \GetFileInfo{ltfssdcl.dtx} +% \title{A new font selection scheme for \TeX{} macro packages\\ +% (Declarative Interface)\thanks +% {This file has version number +% \fileversion\ dated \filedate}} +% +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% This file contains the main implementation of the font selection +% scheme commands. See other parts of the \LaTeX\ distribution, or +% \emph{The \LaTeX\ Companion} for higher level documentation of these +% commands. +% +% \begin{quote} +% \textbf{Warning:} +% The macro documentation is still basically the documentation from the +% first NFSS release and therefore in some cases probably not +% completely accurate. +% \end{quote} +% +% \StopEventually{} +% +% \section{Interface Commands} +% +% \changes{v3.0i}{1998/08/17} +% {(RmS) Corrected minor glitches in changes entries.} +% \changes{v3.0b}{1995/06/15} +% {(DPC) minor documentation changes} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Make file from previous file, latint.dtx 1995/05/21 v2.1t} +% \changes{v3.0p}{2015/02/21} +% {Removed autoload code} +% +% +% \changes{v2.1o}{1994/11/22} +% {wrap long lines} +% \changes{v2.1m}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v2.1j}{1994/05/29}{Use new error commands} +% \changes{v2.1h}{1994/05/13}{Removed file identification typeout} +% \changes{v2.1g}{1994/05/12}{Allow \cs{relax}'ed cmds to be declared} +% \changes{v2.1g}{1994/05/12}{Allow \cs{relax} as undefined command} +% \changes{v2.1e}{1994/04/28}{Removed all \cs{uppercase} in hex num +% parsing macros} +% \changes{v2.1d}{1994/04/18}{Removed surplus \cs{no@alphabet@error} +% (see fam.dtx)} +% +% +% +% \changes{v2.1f}{1994/05/03}{Renamed \cs{@@DeclareMathDelimiter} to +% \cs{@DeclareMathDelimiter}} +% \changes{v2.1c}{1994/03/13}{add 2ekernel module to omit repeated code} +% +% +% \begin{macro}{\in@} +% \changes{v3.0m}{2009/10/20}{More robust thanks to Heiko.} +% \changes{v3.0n}{2011/05/08}{Simplified thanks to Bruno.} +% \begin{macro}{\ifin@} +% |\@in| is a utility macro with two arguments. It determines +% whether its first argument occurs in its second and sets the +% switch |\ifin@| accordingly. The first argument may not +% contain braces nor |#| (more precisely, tokens of category +% code 1,~2, or~6). +% \begin{macrocode} +%<*2ekernel> +\def\in@#1#2% + {% + \begingroup + \def\in@@##1#1{}% + \toks@\expandafter{\in@@#2{}{}#1}% + \edef\in@@{\the\toks@}% + \expandafter\endgroup + \ifx\in@@\@empty + \in@false + \else + \in@true + \fi + } +\newif\ifin@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Before the |\begin{document}| command several +% \meta{math versions} and \meta{math alphabet identifiers} may +% be declared. +% In principle, there should be exactly one family/series/shape +% combination be declared for each version/alphabet pair. +% But we want to allow for defaults as well for automagical +% filling of holes. +% +% While building the tables for math alphabet identifiers and math +% versions we keep several lists: +% \begin{itemize} +% \item the list of all math versions, |\version@list|, +% each entry prefixed by the control sequence |\version@elt|, +% i.e.\ this list has the following form +% \begin{quote} +% |\version@elt|\meta{version$_1$}^^A +% |\version@elt|\meta{version$_2$}\ldots\\\hspace*{\fill}^^A +% |\version@elt|\meta{version$_n$} +% \end{quote} +% \item the list of all math alphabet identifiers. Here every +% entry has the form:\\[2pt] +% \hspace*{\MacroIndent} +% |\group@elt|\meta{math group number}\\ +% \hspace*{\MacroIndent} +% |{{|\meta{default family}^^A +% |}{|\meta{default series}^^A +% |}{|\meta{default shape}|}}|. +% \item Each defined math alphabet identifier holds a list containing +% Information about the {\em versions\/} for which it is +% defined. This list has a more complicated structure: it +% looks as follows: +% \begin{quote} +% |\set@alpha|\meta{the alphabet identifier itself}\\ +% \hspace*{\MacroIndent} +% |\reserved@c|\meta{math version}\meta{font info}\\ +% \hspace*{\MacroIndent}\ldots\\ +% |\@nil| +% \end{quote} +% where \meta{font info} is either |\reserved@e| +% (if the combination is not defined yet) or +% \begin{quote} +% |{{|\meta{family}|}{|\meta{series}^^A +% |}{|\meta{shape}|}}| +% \end{quote} +% \end{itemize} +% +% \begin{macro}{\version@list} +% We initialize the version list to be empty. +% \begin{macrocode} +\let\version@list=\@empty +\@onlypreamble\version@list +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\version@elt} +% \begin{macrocode} +\let\version@elt\relax +\@onlypreamble\version@elt +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\new@mathversion} +% The macro |\new@mathversion| is called with the version control +% sequence as its argument. +% \begin{macrocode} +%\def\new@mathversion#1{% +% \end{macrocode} +% The first thing this macro does is to check if the version +% identifier is already present in |\version@list|. +% We enclose |\version@list| in braces since it might be empty +% (if no {\em version\/} is defined yet). But this means that +% we need a suitable number of |\expandafter| primitives. +% \begin{macrocode} +% \expandafter\in@\expandafter#1\expandafter{\version@list}% +% \ifin@ +% \end{macrocode} +% If so it prints an error message. +% The |\next| macro is used to get rid of the four characters +% |\mv@| that would otherwise appear at the begin of the +% version name in the error message. +% \begin{macrocode} +% \@latex@error{Math version +% `\expandafter\@gobblefour\string#1' +% already defined}\@eha +% \end{macrocode} +% Otherwise we have a new version, and we can proceed with +% entering it into the tables. +% We add it to |\version@list|. This is very easy: +% we define |\version@elt| (which is the delimiter in +% |\version@list|) to protect itself and the following token +% from being expanded and simply redefine |\version@list|. +% \begin{macrocode} +% \else +% \global\expandafter\newcount\csname c@\expandafter +% \@gobble\string#1\endcsname +% \global\csname c@\expandafter +% \@gobble\string#1\endcsname\@ne +% \def\version@elt{\noexpand\version@elt\noexpand}% +% \edef\version@list{\version@list\version@elt#1}% +% \end{macrocode} +% Then we prepare to enter the new version into all math +% alphabet identifier lists. Remember that these lists +% use |\reserved@c| as delimiter, and that there appears the +% control sequence |\reserved@e| that must not be expanded. +% Therefore we take suitable precautions. +% \begin{macrocode} +% \def\reserved@c{\noexpand\reserved@c\noexpand}% +% \let\reserved@e\relax +% \end{macrocode} +% We will now go through the |\alpha@list| to process every +% \meta{math alphabet identifier} in turn. +% Since this list has |\group@elt| as a delimiter we define +% this control sequence. It has three arguments as every +% entry consists of three items (as explained above). +% \begin{macrocode} +% \def\group@elt##1##2##3{% +% \end{macrocode} +% The first of these arguments is the \meta{math alphabet +% identifier}. We redefine it by appending the information +% about the new version at the end of the list contained in +% it. However, there is one subtlety: the definitions for +% |\reserved@c| and |\reserved@e| made above prevent the +% main part of the list from being expanded. But we still have +% to take care of the header and the trailer. To do this we +% remove the trailer by means of the macro |\remove@nil| +% which also protect the header from being expanded. Its +% definition is given below. Now we can prepare to add the +% new version. +% \begin{macrocode} +% \edef##1{\expandafter\remove@nil##1% +% \reserved@c +% #1% +% \reserved@e +% \noexpand\@nil}}% +% \end{macrocode} +% Finally we call |\alpha@list| which will now execute +% the macro |\group@elt| once for every defined \meta{math +% alphabet identifier}. And that's all for now. +% \begin{macrocode} +% \alpha@list +% \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\alpha@list} +% As we explained above every entry in |\alpha@list| has +% the form\\[2pt] +% |\alpha@elt|\\\meta{alphabet identifier}\meta{internal +% group number}\meta{default font assignments}\ldots\\[2pt] +% We initialize it to |\@empty|. +% \begin{macrocode} +\let\alpha@list\@empty +\@onlypreamble\alpha@list +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\alpha@elt} +% \begin{macrocode} +\let\alpha@elt\relax +\@onlypreamble\alpha@elt +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\newgroup} +% Start the group (fam) allocation at 0. (Doesn't belong here.) +% \begin{macrocode} +\count18=-1 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\stepcounter} +% \changes{v3.0f}{1997/11/13} +% {(DPC) Remove as never used. (Re)defined in ltcounts} +% \end{macro} +% +% \begin{macro}{\select@group} +% We surround |\select@group| with braces so that functions using it +% can be used directly after |_| or |^|. +% \changes{v2.1p}{1994/12/10}{Surround with braces (add fourth arg)} +% However, if we use oldstyle syntax where the math alphabet +% doesn't have arguments (ie if |\math@bgroup| is not |\bgroup|) we +% need to get rid of the extra group. +% \changes{v2.1q}{1995/04/02}{fix problem for pr/1275} +% \changes{v3.0g}{1997/11/20} +% {(DPC) inline use of \cs{stepcounter} (faster, and saves a csname +% per math version as no reset list)} +% \changes{v3.0q}{2015/03/18}{Introduce \cs{e@mathgroup@top}} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01} +%<latexrelease> {\select@group}{\select@group}% +%<*2ekernel|latexrelease> +\def\select@group#1#2#3#4{% + \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi + {% + \ifmmode + \ifnum\csname c@mv@\math@version\endcsname<\e@mathgroup@top + \begingroup + \escapechar\m@ne + \getanddefine@fonts{\csname c@mv@\math@version\endcsname}#3% + \globaldefs\@ne \math@fonts + \endgroup + \init@restore@version + \xdef#1{\noexpand\use@mathgroup\noexpand#2% + {\number\csname c@mv@\math@version\endcsname}}% + \global\advance\csname c@mv@\math@version\endcsname\@ne + \else + \let#1\relax + \@latex@error{Too many math alphabets used in + version \math@version}% + \@eha + \fi + \else \expandafter\non@alpherr\fi + #1{#4}% + }% +} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00} +%<latexrelease> {\select@group}{\select@group}% +%<latexrelease>\def\select@group#1#2#3#4{% +%<latexrelease> \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi +%<latexrelease> {% +%<latexrelease> \ifmmode +%<latexrelease> \ifnum\csname c@mv@\math@version\endcsname<\sixt@@n +%<latexrelease> \begingroup +%<latexrelease> \escapechar\m@ne +%<latexrelease> \getanddefine@fonts +%<latexrelease> {\csname c@mv@\math@version\endcsname}#3% +%<latexrelease> \globaldefs\@ne \math@fonts +%<latexrelease> \endgroup +%<latexrelease> \init@restore@version +%<latexrelease> \xdef#1{\noexpand\use@mathgroup\noexpand#2% +%<latexrelease> {\number\csname c@mv@\math@version\endcsname}}% +%<latexrelease> \global\advance\csname c@mv@\math@version\endcsname\@ne +%<latexrelease> \else +%<latexrelease> \let#1\relax +%<latexrelease> \@latex@error{Too many math alphabets used in +%<latexrelease> version \math@version}% +%<latexrelease> \@eha +%<latexrelease> \fi +%<latexrelease> \else \expandafter\non@alpherr\fi +%<latexrelease> #1{#4}% +%<latexrelease> }% +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\restore@mathversion +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\init@restore@version} +% \changes{v3.0e}{1996/07/26}{Removed \cs{ifrestore@version} switch +% and replaced by \cs{init@restore@version}} +% \begin{macrocode} +\def\init@restore@version{% + \global\let\init@restore@version\relax + \xdef\restore@mathversion + {\expandafter\noexpand\csname mv@\math@version\endcsname + \global\csname c@mv@\math@version\endcsname + \number\csname c@mv@\math@version\endcsname\relax}% + \aftergroup\dorestore@version +} +\@onlypreamble\init@restore@version +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\non@alpherr} +% \changes{v3.0c}{1995/10/10} +% {(DPC) autoload error message} +% \changes{v3.0j}{2005/07/27} +% {(MH) Change because command is now properly robust} +% \begin{macrocode} +\gdef\non@alpherr#1{\@latex@error{% +% \end{macrocode} +% The command here will have a space at the end of its name, so we make +% sure not to insert an extra one. +% \begin{macrocode} + \string#1allowed only in math mode}\@ehd} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dorestore@version} +% \begin{macrocode} +\def\dorestore@version + {\ifmmode + \aftergroup\dorestore@version + \else + \gdef\init@restore@version{% + \global\let\init@restore@version\relax + \xdef\restore@mathversion + {\expandafter\noexpand\csname mv@\math@version\endcsname + \global\csname c@mv@\math@version\endcsname + \number\csname c@mv@\math@version\endcsname\relax}% + \aftergroup\dorestore@version + }% + \begingroup + \let\getanddefine@fonts\@gobbletwo + \restore@mathversion + \endgroup + \fi}% +\@onlypreamble\dorestore@version +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\document@select@group} +% We surround |\select@group| with braces so that functions using it +% can be used directly after |_| or |^|. +% \changes{v2.1p}{1994/12/10}{Surround with braces (add fourth arg)} +% \changes{v2.1q}{1995/04/02}{fix problem for pr/1275} +% \changes{v3.0g}{1997/11/20} +% {(DPC) inline use of \cs{stepcounter} (faster, and saves a csname +% per math version as no reset list)} +% \changes{v3.0q}{2015/03/18}{Introduce \cs{e@mathgroup@top}} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01} +%<latexrelease> {\document@select@group}{\document@select@group}% +%<*2ekernel|latexrelease> +\def\document@select@group#1#2#3#4{% + \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi + {% + \ifmmode + \ifnum\csname c@mv@\math@version\endcsname<\e@mathgroup@top + \begingroup + \escapechar\m@ne + \getanddefine@fonts{\csname c@mv@\math@version\endcsname}#3% + \globaldefs\@ne \math@fonts + \endgroup + \expandafter\extract@alph@from@version + \csname mv@\math@version\expandafter\endcsname + \expandafter{\number\csname + c@mv@\math@version\endcsname}% + #1% + \global\advance\csname c@mv@\math@version\endcsname\@ne + \else + \let#1\relax + \@latex@error{Too many math alphabets used + in version \math@version}% + \@eha + \fi + \else \expandafter\non@alpherr\fi + #1{#4}% + }% +} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00} +%<latexrelease> {\document@select@group}{\document@select@group}% +%<latexrelease>\def\document@select@group#1#2#3#4{% +%<latexrelease> \ifx\math@bgroup\bgroup\else\relax\expandafter\@firstofone\fi +%<latexrelease> {% +%<latexrelease> \ifmmode +%<latexrelease> \ifnum\csname c@mv@\math@version\endcsname<\sixt@@n +%<latexrelease> \begingroup +%<latexrelease> \escapechar\m@ne +%<latexrelease> \getanddefine@fonts +%<latexrelease> {\csname c@mv@\math@version\endcsname}#3% +%<latexrelease> \globaldefs\@ne \math@fonts +%<latexrelease> \endgroup +%<latexrelease> \expandafter\extract@alph@from@version +%<latexrelease> \csname mv@\math@version\expandafter\endcsname +%<latexrelease> \expandafter{\number\csname +%<latexrelease> c@mv@\math@version\endcsname}% +%<latexrelease> #1% +%<latexrelease> \global\advance\csname c@mv@\math@version\endcsname\@ne +%<latexrelease> \else +%<latexrelease> \let#1\relax +%<latexrelease> \@latex@error{Too many math alphabets used +%<latexrelease> in version \math@version}% +%<latexrelease> \@eha +%<latexrelease> \fi +%<latexrelease> \else \expandafter\non@alpherr\fi +%<latexrelease> #1{#4}% +%<latexrelease> }% +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\process@table} +% \begin{macrocode} +\def\process@table{% + \def\cdp@elt##1##2##3##4{% + \@font@info{Checking defaults for + ##1/##2/##3/##4}% + \expandafter + \ifx\csname##1/##2/##3/##4\endcsname\relax +% \end{macrocode} +% Grouping is important for two reasons, first |\cdp@elt| will get +% redefined if |\Declare...| functions are executed within the +% external |.fd| file and secondly |\try@load@fontshape| changes a +% lot of catcodes without surrounding itself with a group. +% \begin{macrocode} + \begingroup + \def\f@encoding{##1}\def\f@family{##2}% + \try@load@fontshape + \endgroup + \fi + \expandafter + \ifx\csname##1/##2/##3/##4\endcsname\relax + \@latex@error{This NFSS system isn't set up properly}% + {For encoding scheme ##1 the defaults + ##2/##3/##4 do not form a valid font shape}% + \else + \@font@info{... okay}% + \fi}% + \cdp@list +% \end{macrocode} +% Now we make sure that |\error@fontshape| is okay. +% \begin{macrocode} + \begingroup + \escapechar\m@ne + \error@fontshape + \expandafter\ifx\csname \curr@fontshape\endcsname\relax + \begingroup + \try@load@fontshape + \endgroup + \fi + \expandafter\ifx\csname \curr@fontshape\endcsname\relax + \@latex@error{This NFSS system isn't set up properly}% + {The system maintainer forgot to specify a suitable + substitution + font shape using the \noexpand\DeclareErrorFont + command}% + \fi + \endgroup +% \end{macrocode} +% Set |\select@group| to its meaning used within the document body. +% \begin{macrocode} + \let\select@group\document@select@group +% \end{macrocode} +% Install the default font attributes they are currently pointing +% to error font shape. +% Don't use |\reset@font| since that would trigger |\selectfont|. +% \begin{macrocode} + \fontencoding{\encodingdefault}% + \fontfamily{\familydefault}% + \fontseries{\seriesdefault}% + \fontshape{\shapedefault}% +% \end{macrocode} +% kill all macros not longer needed. +% we need to add many more!!!!!! +% \begin{macrocode} + \everyjob{}% +} +\@onlypreamble\process@table +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%\@onlypreamble\set@mathradical +% \end{macrocode} +% +% \begin{macro}{\DeclareMathVersion} +% \begin{macrocode} +\def\DeclareMathVersion#1{% + \expandafter\new@mathversion\csname mv@#1\endcsname} +\@onlypreamble\DeclareMathVersion +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\new@mathversion} +% \changes{v3.0o}{2011/09/03} +% {(Will) Remove \cs{global} before \cs{newcount} (unnecessary and caused etex bug).} +% \begin{macrocode} +\def\new@mathversion#1{% + \expandafter\in@\expandafter#1\expandafter{\version@list}% + \ifin@ + \@font@info{Redeclaring math version + `\expandafter\@gobblefour\string#1'}% + \else + \expandafter\newcount\csname c@\expandafter + \@gobble\string#1\endcsname + \def\version@elt{\noexpand\version@elt\noexpand}% + \edef\version@list{\version@list\version@elt#1}% + \fi +% \end{macrocode} +% |\toks@| is used to gather all tokens for the math version. +% |\count@| will be used to count the math groups we add to this +% version. +% \begin{macrocode} + \toks@{}% + \count@\z@ +% \end{macrocode} +% Now we loop over |\group@list| to add all math groups defined so +% far to the version and at the same time to count them. +% \begin{macrocode} + \def\group@elt##1##2{% + \advance\count@\@ne + \addto@hook\toks@{\getanddefine@fonts##1##2}% + }% + \group@list +% \end{macrocode} +% We set the counter for this math version to the number of math +% groups found in |\group@list|. +% \begin{macrocode} + \global\csname c@\expandafter\@gobble\string#1\endcsname\count@ +% \end{macrocode} +% Now we loop over |\alpha@list| to add all math alphabets known so +% far. We have to distinguish the case that an alphabet by default +% should produce an error in new versions. +% \begin{macrocode} + \def\alpha@elt##1##2##3{% + \ifx##2\no@alphabet@error + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\no@alphabet@error##1}}% + \else + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\select@group##1##2##3}}% + \fi + }% + \alpha@list +% \end{macrocode} +% Finally we define the math version to expand to the contents of +% |\toks@|. +% \changes{v2.0e}{1993/08/18}{Exchanged names of encodings in warning +% message of \cs{SetSymbolFont}.} +% \begin{macrocode} + \xdef#1{\the\toks@}% +} +\@onlypreamble\new@mathversion +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareSymbolFont} +% \begin{macrocode} +\def\DeclareSymbolFont#1#2#3#4#5{% + \@tempswafalse + \edef\reserved@b{#2}% + \def\cdp@elt##1##2##3##4{\def\reserved@c{##1}% + \ifx\reserved@b\reserved@c \@tempswatrue\fi}% + \cdp@list + \if@tempswa + \@ifundefined{sym#1}{% +% \end{macrocode} +% +% \changes{v3.0q}{2015/03/18}{Restrict Symbol fonts to 0-15} +% \begin{macrocode} + \ifnum\count18<15 % + \expandafter\new@mathgroup\csname sym#1\endcsname + \expandafter\new@symbolfont\csname sym#1\endcsname + {#2}{#3}{#4}{#5}% + \else + \@latex@error{Too many symbol fonts declared}\@eha + \fi + }% + {% +% \end{macrocode} +% +% \begin{macrocode} + \@font@info{Redeclaring symbol font `#1'}% +% \end{macrocode} +% \changes{v3.0f}{1997/11/13} +% {(DPC) Really update \cs{group@list} dont +% leave new version in \cs{toks@}. latex/2661} +% Update the group list. +% \begin{macrocode} + \def\group@elt##1##2{% + \noexpand\group@elt\noexpand##1% + \expandafter\ifx\csname sym#1\endcsname##1% + \expandafter\noexpand\csname#2/#3/#4/#5\endcsname + \else + \noexpand##2% + \fi}% + \xdef\group@list{\group@list}% +% \end{macrocode} +% Update the version list. +% \begin{macrocode} + \def\version@elt##1{% + \expandafter + \SetSymbolFont@\expandafter##1\csname#2/#3/#4/#5\expandafter + \endcsname \csname sym#1\endcsname + }% + \version@list + }% + \else + \@latex@error{Encoding scheme `#2' unknown}\@eha + \fi + } +\@onlypreamble\DeclareSymbolFont +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\group@list} +% \begin{macrocode} +\let\group@list\@empty +\@onlypreamble\group@list +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\group@elt} +% \begin{macrocode} +\let\group@elt\relax +\@onlypreamble\group@elt +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\new@symbolfont} +% \begin{macrocode} +\def\new@symbolfont#1#2#3#4#5{% + \toks@\expandafter{\group@list}% + \edef\group@list{\the\toks@\noexpand\group@elt\noexpand#1% + \expandafter\noexpand\csname#2/#3/#4/#5\endcsname}% + \def\version@elt##1{\toks@\expandafter{##1}% + \edef##1{\the\toks@\noexpand\getanddefine@fonts + #1\expandafter\noexpand\csname#2/#3/#4/#5\endcsname}% + \global\advance\csname c@\expandafter + \@gobble\string##1\endcsname\@ne + }% + \version@list +} +\@onlypreamble\new@symbolfont +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetSymbolFont} +% \begin{macrocode} +\def\SetSymbolFont#1#2#3#4#5#6{% + \@tempswafalse + \edef\reserved@b{#3}% + \def\cdp@elt##1##2##3##4{\def\reserved@c{##1}% + \ifx\reserved@b\reserved@c \@tempswatrue\fi}% + \cdp@list + \if@tempswa + \expandafter\SetSymbolFont@ + \csname mv@#2\expandafter\endcsname\csname#3/#4/#5/#6\expandafter + \endcsname \csname sym#1\endcsname + \else + \@latex@error{Encoding scheme `#3' unknown}\@eha + \fi +} +\@onlypreamble\SetSymbolFont +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetSymbolFont@} +% \changes{v3.0l}{2007/08/31}{Font warning changed to info +% for encoding change (pr/3975)} +% \begin{macrocode} +\def\SetSymbolFont@#1#2#3{% + \expandafter\in@\expandafter#1\expandafter{\version@list}% + \ifin@ + \expandafter\in@\expandafter#3\expandafter{\group@list}% + \ifin@ + \begingroup + \expandafter\get@cdp\string#2\@nil\reserved@a + \toks@{}% + \def\install@mathalphabet##1##2{% + \addto@hook\toks@{\install@mathalphabet##1{##2}}% + }% + \def\getanddefine@fonts##1##2{% + \ifnum##1=#3% + \addto@hook\toks@{\getanddefine@fonts#3#2}% + \expandafter\get@cdp\string##2\@nil\reserved@b + \ifx\reserved@a\reserved@b\else + \@font@info{Encoding `\reserved@b' has changed + to `\reserved@a' for symbol font\MessageBreak + `\expandafter\@gobblefour\string#3' in the + math version `\expandafter + \@gobblefour\string#1'}% + \fi + \@font@info{% + Overwriting symbol font + `\expandafter\@gobblefour\string#3' in + version `\expandafter + \@gobblefour\string#1'\MessageBreak + \@spaces \expandafter\@gobble\string##2 --> + \expandafter\@gobble\string#2}% + \else + \addto@hook\toks@{\getanddefine@fonts##1##2}% + \fi}% + #1% + \xdef#1{\the\toks@}% + \endgroup + \else + \@latex@error{Symbol font `\expandafter\@gobblefour\string#3' + not defined}\@eha + \fi + \else + \@latex@error{Math version `\expandafter\@gobblefour\string#1' + is not + defined}{You probably misspelled the name of the math + version.^^JOr you have to specify an additional package.}% + \fi +} +\@onlypreamble\SetSymbolFont@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\get@cdp} +% \begin{macrocode} +\def\get@cdp#1#2/#3\@nil#4{\def#4{#2}} +\@onlypreamble\get@cdp +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareMathAlphabet} +% \changes{v3.0j}{2005/07/27} +% {(MH) Make document commands robust} +% \begin{macrocode} +\def\DeclareMathAlphabet#1#2#3#4#5{% + \@tempswafalse + \edef\reserved@b{#2}% + \def\cdp@elt##1##2##3##4{\def\reserved@c{##1}% + \ifx\reserved@b\reserved@c \@tempswatrue\fi}% + \cdp@list + \if@tempswa + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \new@mathalphabet#1{#2}{#3}{#4}{#5}% + \else +% \end{macrocode} +% Check if it is already a math alphabet. +% \begin{macrocode} + \edef\reserved@a{\noexpand\in@{\string\select@group}% + {\expandafter\meaning\csname \expandafter + \@gobble\string#1\space\endcsname}}% + \reserved@a + \ifin@ + \@font@info{Redeclaring math alphabet \string#1}% + \def\version@elt##1{% + \expandafter\SetMathAlphabet@\expandafter + ##1\csname#2/#3/#4/#5\expandafter\endcsname +% \end{macrocode} +% \changes{???}{1994/04/18}{Pass correct arg (2 not 3)} +% \begin{macrocode} + \csname M@#2\expandafter\endcsname + \csname \expandafter\@gobble\string#1\space\endcsname#1}% + \version@list + \else +% \end{macrocode} +% Check if it is a math alphabet defined via +% |\DeclareSymbolFontAlphabet|. +% \begin{macrocode} + \edef\reserved@a{\noexpand\in@{\string\use@mathgroup}% + {\expandafter\meaning\csname \expandafter + \@gobble\string#1\space\endcsname}}% + \reserved@a + \ifin@ +% \end{macrocode} +% In that case overwriting is simple since there is nothing +% inserted in the math version macros. +% \begin{macrocode} + \@font@info{Redeclaring math alphabet \string#1}% + \new@mathalphabet#1{#2}{#3}{#4}{#5}% +% \end{macrocode} +% Otherwise panic. +% \begin{macrocode} + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi + \fi + \fi + \else + \@latex@error{Encoding scheme `#2' unknown}\@eha + \fi + } +\@onlypreamble\DeclareMathAlphabet +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\new@mathalphabet} +% \changes{v3.0j}{2005/07/27} +% {(MH) Make document commands robust} +% \begin{macrocode} +\def\new@mathalphabet#1#2#3#4#5{% + \toks@\expandafter{\alpha@list}% + \edef#1{\expandafter\noexpand\csname \expandafter + \@gobble\string#1\space\endcsname + \if/#5/% + \noexpand\no@alphabet@error + \noexpand\no@alphabet@error + \else + \expandafter\noexpand\csname M@#2\endcsname + \expandafter\noexpand\csname#2/#3/#4/#5\endcsname + \fi + }% + \toks2\expandafter{#1}% + \edef\alpha@list{\the\toks@\noexpand\alpha@elt\the\toks2}% + \def\version@elt##1{\toks@\expandafter{##1}% + \edef##1{\the\toks@\install@mathalphabet + \expandafter\noexpand + \csname \expandafter\@gobble + \string#1\space\endcsname + {\if/#5/% + \noexpand\no@alphabet@error + \noexpand#1% + \else + \noexpand\select@group\the\toks2 + \fi}}% + }% + \version@list + \expandafter\edef\csname \expandafter\@gobble + \string#1\space\endcsname{\if/#5/% + \noexpand\no@alphabet@error + \noexpand#1% + \else + \noexpand\select@group\the\toks2 + \fi}% + \edef#1{\noexpand\protect + \expandafter\noexpand\csname \expandafter + \@gobble\string#1\space\endcsname}% +} +\@onlypreamble\new@mathalphabet +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetMathAlphabet} +% \changes{v3.0j}{2005/07/27} +% {(MH) Make document commands robust} +% \begin{macrocode} +\def\SetMathAlphabet#1#2#3#4#5#6{% + \@tempswafalse + \edef\reserved@b{#3}% + \def\cdp@elt##1##2##3##4{\def\reserved@c{##1}% + \ifx\reserved@b\reserved@c \@tempswatrue\fi}% + \cdp@list + \if@tempswa + \expandafter\SetMathAlphabet@ + \csname mv@#2\expandafter\endcsname\csname#3/#4/#5/#6\expandafter + \endcsname \csname M@#3\expandafter\endcsname + \csname \expandafter\@gobble\string#1\space\endcsname#1% + \else + \@latex@error{Encoding scheme `#3' unknown}\@eha + \fi +} +\@onlypreamble\SetMathAlphabet +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SetMathAlphabet@} +% \begin{macrocode} +\def\SetMathAlphabet@#1#2#3#4#5{% + \expandafter\in@\expandafter#1\expandafter{\version@list}% + \ifin@ + \expandafter\in@\expandafter#4\expandafter{\alpha@list}% + \ifin@ + \begingroup + \toks@{}% + \def\getanddefine@fonts##1##2{% + \addto@hook\toks@{\getanddefine@fonts##1##2}% + }% + \def\reserved@c##1##2##3##4{% % for message below + \expandafter\@gobble\string##4}% + \def\install@mathalphabet##1##2{% + \ifx##1#4% + \addto@hook\toks@ + {\install@mathalphabet#4{\select@group#4#3#2}}% + \@font@info{Overwriting math alphabet + `\string#5' in version `\expandafter + \@gobblefour\string#1'\MessageBreak + \@spaces \reserved@c##2 --> + \expandafter\@gobble\string#2}% + \else + \addto@hook\toks@{\install@mathalphabet##1{##2}}% + \fi + }% + #1% + \xdef#1{\the\toks@}% + \endgroup + \else +% \end{macrocode} +% If the math alphabet was defined via |\DeclareSymbolFontAlphabet| +% we have remove its external definition and add it as a normal +% math alphabet to every version before trying to change it in one +% version. +% \changes{v2.1b}{1994/03/11}{Changed parameter template in temporary +% macro to catch check add below.} +% \begin{macrocode} + \edef\reserved@a{% + \noexpand\in@{\string\use@mathgroup}{\meaning#4}}% + \reserved@a + \ifin@ + \def\reserved@b##1\use@mathgroup##2##3{% + \def\reserved@b{##3}\def\reserved@c{##2}}% + \expandafter\reserved@b#4% + \begingroup + \def\install@mathalphabet##1##2{% + \addto@hook\toks@{\install@mathalphabet##1{##2}}% + }% + \def\getanddefine@fonts##1##2{% + \addto@hook\toks@{\getanddefine@fonts##1##2}% + \ifnum##1=\reserved@b + \expandafter + \addto@hook\expandafter\toks@ + \expandafter{\expandafter\install@mathalphabet + \expandafter#4\expandafter + {\expandafter\select@group\expandafter + #4\reserved@c##2}}% + \fi + }% + \def\version@elt##1{% + \toks@{}% + ##1% + \xdef##1{\the\toks@}% + }% + \version@list + \endgroup +% \end{macrocode} +% Put it into the |\alpha@list| with default `error' +% \begin{macrocode} + \expandafter\gdef\expandafter\alpha@list\expandafter + {\alpha@list + \alpha@elt #4\no@alphabet@error \no@alphabet@error}% + \gdef#4{\no@alphabet@error #5}% fake things :-) +% \end{macrocode} +% Then call the internal setting routine again: +% \begin{macrocode} + \SetMathAlphabet@{#1}{#2}{#3}#4#5% + \else + \@latex@error{Command `\string#5' not defined as a + math alphabet}% + {Use \noexpand\DeclareMathAlphabet to define it.}% + \fi + \fi + \else + \@latex@error{Math version `\expandafter\@gobblefour\string#1' + is not + defined}{You probably misspelled the name of the math + version.^^JOr you have to specify an additional package.}% + \fi +} +\@onlypreamble\SetMathAlphabet@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareMathAlphabet} +% could do with more checks like allowing single number in |#4| +% lowercase in |#4| etc +% \changes{v3.0r}{2016/02/18} +% {Check for mathaccent not \cs{mathaccemt}} +% \begin{macrocode} +\def\DeclareMathAccent#1#2#3#4{% + \expandafter\in@\csname sym#3\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \count\z@=#4\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \if\relax\noexpand#1% is command? + \edef\reserved@a{\noexpand\in@ + {\expandafter\@gobble\string\mathaccent}{\meaning#1}}% + \reserved@a + \ifin@ + \expandafter\set@mathaccent + \csname sym#3\endcsname#1#2% + {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \@font@info{Redeclaring math accent \string#1}% + \else + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \expandafter\set@mathaccent + \csname sym#3\endcsname#1#2% + {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi + \fi + \else + \@latex@error{Not a command name: `\noexpand#1'}\@eha + \fi + \endgroup + \else + \@latex@error{Symbol font `#3' is not defined}\@eha + \fi +} +\@onlypreamble\DeclareMathAccent +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@mathaccent} +% \begin{macrocode} +\def\set@mathaccent#1#2#3#4{% + \xdef#2{\mathaccent"\mathchar@type#3\hexnumber@#1#4\relax}} +\@onlypreamble\set@mathaccent +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareMathSymbol} +% \changes{v3.0r}{2016/02/18} +% {Check for mathchar not \cs{mathchar}} +% \begin{macrocode} +\def\DeclareMathSymbol#1#2#3#4{% + \expandafter\in@\csname sym#3\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \count\z@=#4\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \if\relax\noexpand#1% is command? + \edef\reserved@a + {\noexpand\in@{\expandafter\@gobble\string\mathchar}% + {\meaning#1}}% + \reserved@a + \ifin@ + \expandafter\set@mathsymbol + \csname sym#3\endcsname#1#2% + {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \@font@info{Redeclaring math symbol \string#1}% + \else + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \expandafter\set@mathsymbol + \csname sym#3\endcsname#1#2% + {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi + \fi + \else + \expandafter\set@mathchar + \csname sym#3\endcsname#1#2 + {\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \fi + \endgroup + \else + \@latex@error{Symbol font `#3' is not defined}\@eha + \fi +} +\@onlypreamble\DeclareMathSymbol +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@mathchar} +% \begin{macrocode} +\def\set@mathchar#1#2#3#4{% + \global\mathcode`#2="\mathchar@type#3\hexnumber@#1#4\relax} +\@onlypreamble\set@mathchar +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@mathsymbol} +% \begin{macrocode} +\def\set@mathsymbol#1#2#3#4{% + \global\mathchardef#2"\mathchar@type#3\hexnumber@#1#4\relax} +\@onlypreamble\set@mathsymbol +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%\def\mathsymbol#1#2#3{% +% \@tempcnta=#3\relax +% \@tempcntb\@tempcnta +% \divide\@tempcnta\sixt@@n +% \count@\@tempcnta +% \multiply\count@\sixt@@n +% \advance\@tempcntb-\count@ +% \mathchar"\mathchar@type#1\hexnumber@#2% +% \hexnumber@\@tempcnta\hexnumber@\@tempcntb\relax} +% +%\def\DeclareMathAlphabetCharacter#1#2#3{% +% \DeclareMathSymbol{#1}7{#2}{#3}} +% \end{macrocode} +% +% \begin{macro}{\DeclareMathDelimiter} +% \changes{v2.1m}{1994/11/18} +% {(DPC) \cs{expandafter} instead of \cs{next}} +% \begin{macrocode} +\def\DeclareMathDelimiter#1{% + \if\relax\noexpand#1% + \expandafter\@DeclareMathDelimiter + \else + \expandafter\@xxDeclareMathDelimiter + \fi + #1} +\@onlypreamble\DeclareMathDelimiter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xxDeclareMathDelimiter} +% \changes{v3.0h}{1998/04/15}{Macro added (pr/2662)} +% This macro checks if the second arg is a ``math type'' such +% as |\mathopen|. The undocumented original code didn't use math +% types when the delimiter was a single letter. +% For this reason the coding is a bit strange as it tries to +% support the undocumented syntax for compatibility reasons. +% \begin{macrocode} +\def\@xxDeclareMathDelimiter#1#2#3#4{% +% \end{macrocode} +% 7 is the default value returned in the case that |\mathchar@type| +% is passed something unexpected, like a math symbol font name. +% We locally move |\mathalpha| out of the way so if you use that +% the right branch is taken. This will still fail if an explicit +% number |7| is used! +% \begin{macrocode} + \begingroup + \let\mathalpha\mathord + \ifnum7=\mathchar@type{#2}% + \endgroup +% \end{macrocode} +% If this branch is taken we have old syntax (5 arguments). +% \begin{macrocode} + \expandafter\@firstofone + \else +% \end{macrocode} +% If this branch is taken |\mathchar@type| is different from 7 so +% we assume new syntax. In this case we also use the arguments to +% set up the letter as a math symbol for the case where it is not +% used as a delimiter. +% \begin{macrocode} + \endgroup + \DeclareMathSymbol#1{#2}{#3}{#4}% +% \end{macrocode} +% Then we arrange that |\@xDeclareMathDelimiter| only gets |#1|, +% |#3|, |#4| \ldots\ as it does not expect a math type as argument. +% \begin{macrocode} + \expandafter\@firstoftwo + \fi + {\@xDeclareMathDelimiter#1}{#2}{#3}{#4}} +\@onlypreamble\@xxDeclareMathDelimiter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@DeclareMathDelimiter} +% \changes{v3.0r}{2016/02/18} +% {Check for delimiter not \cs{delimiter}} +% \begin{macrocode} +\def\@DeclareMathDelimiter#1#2#3#4#5#6{% + \expandafter\in@\csname sym#3\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \expandafter\in@\csname sym#5\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \count\z@=#4\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \edef\reserved@c{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + % + \count\z@=#6\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \edef\reserved@d{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + % + \edef\reserved@a{\noexpand\in@ + {\expandafter\@gobble\string\delimiter}{\meaning#1}}% + \reserved@a + \ifin@ + \expandafter\set@mathdelimiter + \csname sym#3\expandafter\endcsname + \csname sym#5\endcsname#1#2% + \reserved@c\reserved@d + \@font@info{Redeclaring math delimiter \string#1}% + \else + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \expandafter\set@mathdelimiter + \csname sym#3\expandafter\endcsname + \csname sym#5\endcsname#1#2% + \reserved@c\reserved@d + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi + \fi + \endgroup + \else + \@latex@error{Symbol font `#5' is not defined}\@eha + \fi + \else + \@latex@error{Symbol font `#3' is not defined}\@eha + \fi +} +\@onlypreamble\@DeclareMathDelimiter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xDeclareMathDelimiter} +% \begin{macrocode} +\def\@xDeclareMathDelimiter#1#2#3#4#5{% + \expandafter\in@\csname sym#2\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \expandafter\in@\csname sym#4\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \count\z@=#3\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \edef\reserved@c{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + % + \count\z@=#5\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \edef\reserved@d{\hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \expandafter\set@@mathdelimiter + \csname sym#2\expandafter\endcsname\csname sym#4\endcsname#1% + \reserved@c\reserved@d + \endgroup + \else + \@latex@error{Symbol font `#4' is not defined}\@eha + \fi + \else + \@latex@error{Symbol font `#2' is not defined}\@eha + \fi +} +\@onlypreamble\@xDeclareMathDelimiter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@mathdelimiter} +% We have to end the definition of a math delimiter like |\lfloor| +% with a space and not with |\relax| as we did before, because +% otherwise constructs involving |\abovewithdelims| will prematurely +% end (pr/1329) +% +% \changes{v2.1q}{1995/04/02}{fix pr/1329} +% \begin{macrocode} +\def\set@mathdelimiter#1#2#3#4#5#6{% + \xdef#3{\delimiter"\mathchar@type#4\hexnumber@#1#5% + \hexnumber@#2#6 }} +\@onlypreamble\set@mathdelimiter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@@mathdelimiter} +% \begin{macrocode} +\def\set@@mathdelimiter#1#2#3#4#5{% + \global\delcode`#3="\hexnumber@#1#4\hexnumber@#2#5\relax} +\@onlypreamble\set@@mathdelimiter +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareMathRadical} +% \begin{macrocode} +\def\DeclareMathRadical#1#2#3#4#5{% +% \end{macrocode} +% Below is a crude fix to make this macro work if |#1| is undefined +% or |\relax|. Should be improved! +% \changes{v2.1t}{1995/05/21}{Allow for undefined cs names} +% \changes{v3.0r}{2016/02/18} +% {Check for radical not \cs{radical}} +% \begin{macrocode} + \expandafter\ifx + \csname\expandafter\@gobble\string#1\endcsname + \relax + \let#1\radical + \fi + \edef\reserved@a{\noexpand\in@ + {\expandafter\@gobble\string\radical}{\meaning#1}}% + \reserved@a + \ifin@ + \expandafter\in@\csname sym#2\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \expandafter\in@\csname sym#4\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ + \begingroup + \count\z@=#3\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \edef\reserved@c{% + \hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% + \count\z@=#5\relax + \count\tw@\count\z@ + \divide\count\z@\sixt@@n + \count@\count\z@ + \multiply\count@\sixt@@n + \advance\count\tw@-\count@ + \edef\reserved@d{% + \hexnumber@{\count\z@}\hexnumber@{\count\tw@}}% +% \end{macrocode} +% Coded inline instead of using |\set@mathradical| +% \begin{macrocode} +% \expandafter\set@mathradical +% \csname sym#2\expandafter\endcsname +% \csname sym#4\endcsname#1% +% \reserved@c\reserved@d + \xdef#1{\radical"\expandafter\hexnumber@ + \csname sym#2\endcsname\reserved@c + \expandafter\hexnumber@ + \csname sym#4\endcsname\reserved@d + \relax}% + \endgroup + \else + \@latex@error{Symbol font `#4' is not defined}\@eha + \fi + \else + \@latex@error{Symbol font `#2' is not defined}\@eha + \fi + \else + \@latex@error{Command `\string#1' already defined}\@eha + \fi +} +\@onlypreamble\DeclareMathRadical +% \end{macrocode} +% \end{macro} +% +% Definition below was wrong it contained |\delimiter| ! +% +%\begin{verbatim} +%\def\set@mathradical#1#2#3#4#5{% +% \xdef#3{\radical"\hexnumber@#1#4\hexnumber@#2#5\relax}} +%\end{verbatim} +% +% \begin{macro}{\mathalpha} +% just a dummy currently +% \begin{macrocode} +\let\mathalpha\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mathchar@type} +% \begin{macrocode} +\def\mathchar@type#1{% + \ifodd 2#11 #1\else % is this non-negative number? + \ifx#1\mathord 0\else + \ifx#1\mathop 1\else + \ifx#1\mathbin 2\else + \ifx#1\mathrel 3\else + \ifx#1\mathopen 4\else + \ifx#1\mathclose 5\else + \ifx#1\mathpunct 6\else + 7% % anything else is variable ord + \fi + \fi + \fi + \fi + \fi + \fi + \fi + \fi} +\@onlypreamble\mathchar@type +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareSymbolFontAlphabet} +% \changes{v3.0j}{2005/07/27} +% {(MH) Make document commands robust} +% \begin{macrocode} +\def\DeclareSymbolFontAlphabet#1#2{% + \expandafter\DeclareSymbolFontAlphabet@ + \csname \expandafter\@gobble\string#1\space\endcsname{#2}#1} +\@onlypreamble\DeclareSymbolFontAlphabet +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareSymbolFontAlphabet@} +% \begin{macrocode} +\def\DeclareSymbolFontAlphabet@#1#2#3{% +% \end{macrocode} +% We use the switch |\if@tempswa| to decide if we can declare this +% symbol font alphabet. +% \begin{macrocode} + \@tempswatrue +% \end{macrocode} +% First check if |#2| is known to be a symbol font +% \begin{macrocode} + \expandafter\in@\csname sym#2\expandafter\endcsname + \expandafter{\group@list}% + \ifin@ +% \end{macrocode} +% Check if |#1| is defined as a math alphabet defined via +% |\DeclareMathAlphabet|: +% \begin{macrocode} + \expandafter\in@\expandafter#1\expandafter{\alpha@list}% + \ifin@ +% \end{macrocode} +% If so remove it from the |\alpha@list| and from all math version +% macros. +% \begin{macrocode} + \@font@info{Redeclaring math alphabet \string#3}% + \toks@{}% + \def\alpha@elt##1##2##3{% + \ifx##1#1\else\addto@hook\toks@{\alpha@elt##1##2##3}\fi}% + \alpha@list + \xdef\alpha@list{\the\toks@}% +% \end{macrocode} +% Now we loop over all versions and remove the math alphabet: +% \begin{macrocode} + \def\version@elt##1{% + \begingroup + \toks@{}% + \def\getanddefine@fonts####1####2{% + \addto@hook\toks@{\getanddefine@fonts####1####2}}% + \def\install@mathalphabet####1####2{% + \ifx####1#1\else + \addto@hook\toks@{\install@mathalphabet + ####1{####2}}\fi}% + ##1% + \xdef##1{\the\toks@}% + \endgroup + }% + \version@list + \else +% \end{macrocode} +% If |#3| is not defined as a math alphabet check if it is defined +% at all: +% \begin{macrocode} + \expandafter\ifx + \csname\expandafter\@gobble\string#1\space\endcsname + \relax +% \end{macrocode} +% If it is undefined, fine otherwise check if it is a math alphabet +% defined via |\DeclareSymbolFontAlphabet|: +% \begin{macrocode} + \else + \edef\reserved@a{% + \noexpand\in@{\string\use@mathgroup}{\meaning#1}}% + \reserved@a + \ifin@ + \@font@info{Redeclaring math alphabet \string#3}% + \else +% \end{macrocode} +% Since the command |#3| is defined to be something which is not a +% math alphabet we have to skip redefining it. +% \begin{macrocode} + \@tempswafalse + \@latex@error{Command `\string#3' already defined}\@eha + \fi + \fi + \fi + \else +% \end{macrocode} +% Since the symbol font is not known we better skip defining this +% alphabet. +% \begin{macrocode} + \@tempswafalse + \@latex@error{Unknown symbol font `#2'}\@eha + \fi + \if@tempswa +% \end{macrocode} +% When we reach this point we are allowed to define |#1| to be a +% symbol font math alphabet. This means that we have to set it to +% \begin{quote} +% |\use@mathgroup| \meta{math-settings} |\sym|\meta{name} +% \end{quote} +% The \meta{math-settings} are the one for the encoding that is +% used in the font shape where |\sym|\meta{name} is pointing to. +% This means that we have to get it from the information stored in +% |\group@list|. Thus we loop through that list after defining +% |\group@elt| in a suitable way. +% \changes{v2.1b}{1994/03/11}{Added check against use of alphabet +% switch outside of math mode.} +% \begin{macrocode} + \def\group@elt##1##2{% + \expandafter\ifx\csname sym#2\endcsname##1% + \expandafter\reserved@a\string##2\@nil + \fi}% + \def\reserved@a##1##2/##3\@nil{% + \def\reserved@a{##2}}% + \group@list + \toks@{\relax\ifmmode \else \non@alpherr#1\fi}% + \edef#1{\the\toks@ + \noexpand\use@mathgroup + \expandafter\noexpand\csname M@\reserved@a\endcsname + \csname sym#2\endcsname}% + \def#3{\protect#1}% + \fi +} +\@onlypreamble\DeclareSymbolFontAlphabet@ +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx b/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx new file mode 100644 index 00000000000..4d545f22405 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfssini.dtx @@ -0,0 +1,595 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltfssini.dtx +%% Copyright (C) 1989-2001 Frank Mittelbach and Rainer Sch\"opf, +%% all rights reserved. +% +%<*driver> +% \fi +% +% +\ProvidesFile{ltfssini.dtx} + [2019/07/09 v3.1c LaTeX Kernel (NFSS Initialisation)] +% \iffalse +\documentclass{ltxdoc} +\begin{document} +\DocInput{ltfssini.dtx} +\end{document} +%</driver> +% \fi +% +% \iffalse +%<+checkmem>\def\CHECKMEM{\tracingstats=2 +%<+checkmem> \newlinechar=`\^^J +%<+checkmem> \message{^^JMemory usage: \filename}\shipout\hbox{}} +%<+checkmem>\CHECKMEM +% \fi +% +% +% +% \GetFileInfo{ltfssini.dtx} +% \title{A new font selection scheme for \TeX{} macro packages\\ +% (Initialisation)\thanks +% {This file has version number +% \fileversion\ dated \filedate}} +% +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% This file contains the top level \LaTeX\ interface to the font +% selection scheme commands. See other parts of the \LaTeX\ +% distribution, or \emph{The \LaTeX\ Companion} for higher level +% documentation of these commands. +% +% \StopEventually{} +% +% +% \changes{v3.0i}{1998/08/17}{(RmS) Minor documentation fixes.} +% \changes{v3.0b}{1995/06/28} +% {(DPC) Fix documentation typos} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Make file from previous file, lfonts.dtx 1995/05/23 v2.2e} +% \changes{v3.1b}{2016/10/15} +% {Require e\TeX{}} +% +% +% \section{NFSS Initialisation} +% +% \iffalse +%<+checkmem>\CHECKMEM +% \fi +% +% +% \changes{v2.2a}{1994/10/14}{New coding for cfg files} +% \changes{v2.1a}{1993/12/03}{update for LaTeX2e} +% \changes{v1.2c}{1992/01/06}{added slitex code} +% \changes{v1.2d}{1992/03/21}{Renamed \cs{text} to \cs{nfss@text} +% to make it internal.} +% \changes{v1.2a}{1991/11/27}{All \cs{family}, \cs{shape} etc. renamed +% to \cs{fontfamily} etc.} +% \changes{v1.1i}{1990/04/02}{\cs{input} of files now handled +% by docstrip.} +% \changes{v1.1g}{1990/02/08}{Protected the commands +% \cs{family}, \cs{series}, +% \cs{shape}, \cs{size}, \cs{selectfont}, and \cs{mathversion}.} +% \changes{v1.1c}{1989/12/03}{Some internal macros renamed to make them +% inaccessible.} +% \changes{v1.1b}{1989/12/02}{\cs{rmmath} renamed to \cs{mathrm}} +% +% \changes{v1.0i}{1989/11/07}{All family, series, and shape names +% abbreviated.} +% \changes{v1.0g}{1989/05/22}{Lines shortened to 72 characters} +% \changes{v1.0f}{1989/04/29}{Corrections to \LaTeX\ tabular env. +% added.} +% \changes{v1.0e}{1989/04/27}{Definitions of \LaTeX\ symbols corrected.} +% \changes{v1.0d}{1989/04/26}{\cs{xpt} added.} +% \changes{v1.0c}{1989/04/21}{Changed to conform to fam.tex.} +% \changes{v1.0b}{1989/04/15}{\cs{mathfontset} renamed to +% \cs{mathversion.}} +% \changes{v1.0a}{1989/04/10}{Starting with version numbers! +% \cs{newif} for \cs{@tempswa} added since this switch is +% unknown at the time when this file is read in. +% (latex.tex is loaded later.) +% \cs{math@famname} changed to \cs{math@version.}} +% +% +% \changes{v2.1j}{1994/05/13}{Removed file identification typeout} +% +% Finally, there are six commands that are to be used in \LaTeX{} +% and that we will therefore protect against expansion at the +% wrong point: +% |\fontfamily|, |\fontseries|, |\fontshape|, |\fontsize|, +% |\selectfont|, and |\mathversion|. +% +% \changes{v2.1i}{1994/05/12}{Moved \cs{fontfamily} to fam.dtx} +% \changes{v2.1i}{1994/05/12}{Moved \cs{fontencoding} to fam.dtx} +% \changes{v2.1i}{1994/05/12}{Moved \cs{fontseries} to fam.dtx} +% \changes{v2.1i}{1994/05/12}{Moved \cs{fontshape} to fam.dtx} +% \changes{v2.1i}{1994/05/12}{Moved \cs{fontsize} to fam.dtx} +% \changes{v2.1i}{1994/05/12}{Moved \cs{mathversion} to fam.dtx} +% \changes{v2.1i}{1994/05/12}{Moved \cs{selectfont} to tracefnt.dtx} +% +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% \subsection{Providing math \emph{versions}} +% +% \LaTeX{} provides two \emph{versions}. We call them +% \textsf{normal} and \textsf{bold}, respectively. +% \begin{macrocode} +\DeclareMathVersion{normal} +\DeclareMathVersion{bold} +% \end{macrocode} +% +% +% Now we define the standard font change commands. +% We don't allow the use of |\rmfamily| etc.\ in math mode. +% +% First the changes to another \emph{family}: +% \begin{macrocode} +\DeclareRobustCommand\rmfamily + {\not@math@alphabet\rmfamily\mathrm + \fontfamily\rmdefault\selectfont} +\DeclareRobustCommand\sffamily + {\not@math@alphabet\sffamily\mathsf + \fontfamily\sfdefault\selectfont} +\DeclareRobustCommand\ttfamily + {\not@math@alphabet\ttfamily\mathtt + \fontfamily\ttdefault\selectfont} +% \end{macrocode} +% Then the commands changing the \emph{series}: +% \begin{macrocode} +\DeclareRobustCommand\bfseries + {\not@math@alphabet\bfseries\mathbf + \fontseries\bfdefault\selectfont} +\DeclareRobustCommand\mdseries + {\not@math@alphabet\mdseries\relax + \fontseries\mddefault\selectfont} +\DeclareRobustCommand\upshape + {\not@math@alphabet\upshape\relax + \fontshape\updefault\selectfont} +% \end{macrocode} +% Then the commands changing the \emph{shape}: +% \begin{macrocode} +\DeclareRobustCommand\slshape + {\not@math@alphabet\slshape\relax + \fontshape\sldefault\selectfont} +\DeclareRobustCommand\scshape + {\not@math@alphabet\scshape\relax + \fontshape\scdefault\selectfont} +\DeclareRobustCommand\itshape + {\not@math@alphabet\itshape\mathit + \fontshape\itdefault\selectfont} +% \end{macrocode} +% +% +% +% \begin{macro}{\em} +% \changes{v1.2b}{1990/01/28}{Call to \cs{@nomath} added.} +% \changes{v3.1a}{2015/01/09}{Allow \cs{emph} to produce small caps (latexrelease)} +% \begin{macro}{\eminnershape} +% \changes{v3.1a}{2015/01/09}{macro added (latexrelease)} +% We also have to define the {\em emphasize\/} font change command +% (i.e.\ |\em|). This command will look is the current font is +% sloped (i.e.\ has a positive |\fontdimen1|) and will then +% select either |\upshape| or |\itshape|. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\eminnershape}{\eminnershape}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\em + {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ + \eminnershape \else \itshape \fi}% +% \end{macrocode} +% +% \begin{macrocode} +\def\eminnershape{\upshape}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\eminnershape}{\eminnershape}% +%<latexrelease>\DeclareRobustCommand\em +%<latexrelease> {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ +%<latexrelease> \upshape \else \itshape \fi}% +%<latexrelease>\let\eminnershape\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\not@math@alphabet} +% This function generates an error message when it is called in +% math mode. The same function should be defined in +% \texttt{newlfont.sty}. +% \changes{v1.4d}{1992/09/21}{Macro defined.} +% \changes{v2.1e}{1994/01/17}{Message changed} +% \changes{v2.1f}{1994/01/18}{Message corrected} +% \changes{v2.1g}{1994/04/22}{Message changed again} +% \changes{v2.2d}{1995/04/02}{add \cs{noexpand} to second part of message} +% \begin{macrocode} +\def\not@math@alphabet#1#2{% + \relax + \ifmmode + \@latex@error{Command \noexpand#1invalid in math mode}% + {% + Please + \ifx#2\relax + define a new math alphabet^^J% + if you want to use a special font in math mode% + \else +% \end{macrocode} +% We have to a |\noexpand| below to prevent expansion of |#2|. In +% case of |#1| we can omit this (due to the current definition of +% robust commands since they do come out right there :-). +% \begin{macrocode} + use the math alphabet \noexpand#2instead of + the #1command% + \fi + . + }% + \fi} +% \end{macrocode} +% \end{macro} +% +% +% +% Finally we provide two abbreviations to switch to the \LaTeX{} +% \emph{versions}. +% \begin{macrocode} +\def\boldmath{\@nomath\boldmath + \mathversion{bold}} +\def\unboldmath{\@nomath\unboldmath + \mathversion{normal}} +% \end{macrocode} +% Here we switch to the default math version by defining the internal +% macro |\math@version|. We dare not to call |\mathversion| +% at this place because this would call |\glb@settings|. +% \begin{macrocode} +\def\math@version{normal} +% \end{macrocode} +% +% \subsection{Miscellaneous} +% +% \begin{macro}{\newfont} +% \changes{v1.2g}{1991/03/30}{Definition added.} +% \changes{v2.2e}{1995/05/23}{Font assignment made local again.} +% \begin{macro}{\symbol} +% \changes{v1.2g}{1991/03/30}{Definition added.} +% We start by defining a few macros that are part of +% standard \LaTeX's user interface. The use of these functions is +% not encouraged, but they will allow to process older documents +% without changes to the source. +% \begin{macrocode} +\def\newfont#1#2{\@ifdefinable#1{\font#1=#2\relax}} +\def\symbol#1{\char #1\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@setfontsize} +% \begin{macro}{\@setsize} +% This abbreviation is used by \LaTeX's user level size changing +% commands, such as |\large|. +% \begin{macrocode} +\def\@setfontsize#1#2#3{\@nomath#1% +% \end{macrocode} +% For the benefit of people relying on keeping the name of the +% current font command saved in |\@currsize| we define it. To ensure +% that |\@setfontsize| keeps being robust we omit this assignment +% during times where |\protect| differs from |\@typeset@protect|. +% \changes{v1.4b}{1992/08/20}{Added \cs{@currsize}.} +% \changes{v2.2b}{1994/11/06}{Use \cs{@typeset@protect}} +% \begin{macrocode} + \ifx\protect\@typeset@protect + \let\@currsize#1% + \fi + \fontsize{#2}{#3}\selectfont} +% \end{macrocode} +% For compatibility we also define |\@setsize| the 209 command +% \begin{macrocode} +%<*compat> +\def\@setsize#1#2#3#4{\@setfontsize#1{#4}{#2}} +%</compat> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\oldstylenums} +% This macro implements old style numerals but only works if we +% assume that the standard math fonts are used. Thus it needs +% changing in case other math encodings are used. +% \begin{macrocode} +\def\oldstylenums#1{% + \begingroup +% \end{macrocode} +% Provide spacing using the interword space of the current font. +% \begin{macrocode} + \spaceskip\fontdimen\tw@\font +% \end{macrocode} +% Then switch to the math italic font. We don't change the current +% value of |\f@series| which means that you can use bold numerals +% if |\bfseries| is in force. As family we use |\rmdefault| which +% means that this only works if there exist an |OML| encoded +% version of that font or rather a corresponding |.fd| file (which +% is the case for standard \LaTeX{} fonts even though they only +% contain substitutions). +% \changes{v3.0j}{1999/02/12}{Use \cs{rmdefault} instead of \texttt{cmm} +% (pr/2954)} +% \begin{macrocode} + \usefont{OML}{\rmdefault}{\f@series}{it}% + \mathgroup\symletters #1% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hexnumber@} +% To set up \LaTeX's special math character +% definitions we first provide a macro to generate hexadecimal +% numbers. It is a rather simple |\ifcase|. +% \changes{v?}{1992/11/13}{Made expandable.} +% \changes{v?}{1992/12/03}{Make it accept counters.} +% \begin{macrocode} +\def\hexnumber@#1{\ifcase\number#1 + 0\or 1\or 2\or 3\or 4\or 5\or 6\or 7\or 8\or + 9\or A\or B\or C\or D\or E\or F\fi} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\nfss@text} +% \changes{v1.1e}{1990/01/25}{Macro added.} +% In it simplest form |\nfss@text| is an |\mbox|. This will +% produce unbreakable text outside math and inside math you will +% get text with the same fonts as outside. The only drawback is +% that such item won't change sizes in subscripts. But this +% behavior can be easily changed. With the \texttt{amstex} style +% option one will get a sub style called \texttt{amstext} which will +% redefine the |\nfss@text| macro to produce correct text in all +% sizes. +% +% We have to use |\def| instead of the shorter |\let| since +% |\mbox| is undefined when we reach this point. +% \changes{v1.1k}{1990/06/23}{Changed to \cs{mbox}.} +% \changes{v2.1n}{1994/05/17}{Added braces to allow use in subscripts} +% \begin{macrocode} +\def\nfss@text#1{{\mbox{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\copyright} +% The definition of |\copyright| was changed so +% that it works in other type styles, +% and to make it robust. We leave the family untouched so that +% the copyright notice will come out differently if a different +% font family is in use. +% This command is commented out, since it is now defined in +% ltoutenc.dtx. +% \changes{v1.1m}{1991/03/28}{Extra braces added.} +% \changes{v2.1n}{1994/05/17}{Really add extra braces} +% \changes{v2.2c}{1994/12/02}{\cs{copyright} is now in ltoutenc. +% ASAJ} +% \begin{macrocode} +%\DeclareRobustCommand\copyright +% {{\ooalign{\hfil +% \raise.07ex\hbox{\mdseries\upshape c}\hfil\crcr +% \mathhexbox20D}}} +% \end{macrocode} +% \end{macro} +% +% \changes{v2.1a}{1993/11/24}{Removed \cs{xpt} stuff} +% +% +% \begin{macro}{\normalfont} +% \changes{v2.1a}{1993/11/11}{Macro added} +% \begin{macro}{\reset@font} +% \begin{macro}{\p@reset@font} +% \changes{v1.1n}{1991/08/26}{Macro introduced} +% The macro |\reset@font| is used in \LaTeX{} to switch to a standard +% font, in order to initialize the current font in situations where +% typesetting is done in a new visual context (e.g.\ in a +% footnote). We define it here to allow the test for the new +% \LaTeX{} version above but nevertheless are able to run all kind +% of mixtures. +% \changes{v1.1o}{1991/11/21}{Changed to protected version of macro.} +% \changes{v1.1o}{1991/11/21}{Added extra braces for robustness.} +% +% The user interface name for |\reset@font| is |\normalfont|: +% \changes{v2.1k}{1994/05/14}{Remove surplus braces} +% \changes{v3.0f}{1995/10/16}{Added \cs{relax} after \cs{usefont}, +% as the latter eats up spaces.} +% \begin{macrocode} +\DeclareRobustCommand\normalfont + {\usefont\encodingdefault + \familydefault + \seriesdefault + \shapedefault + \relax} +\let\reset@font\normalfont +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% We left out the special \LaTeX{} fonts which are not automatically +% included in the base version of the font selection since these fonts +% contain only a few characters which are also included in the AMS +% fonts so anybody who is using these fonts doesn't need them. +% But for compatibility reasons we will define these symbols. +% +% \changes{v2.1g}{1994/02/22}{Correct error message} +% \begin{macrocode} +\def\not@base#1{\@latex@error + {Command \noexpand#1not provided in base LaTeX2e}% + {Load the latexsym or the amsfonts package to + define this symbol}} +\def\mho{\not@base\mho} +\def\Join{\not@base\Join} +\def\Box{\not@base\Box} +\def\Diamond{\not@base\Diamond} +\def\leadsto{\not@base\leadsto} +\def\sqsubset{\not@base\sqsubset} +\def\sqsupset{\not@base\sqsupset} +\def\lhd{\not@base\lhd} +\def\unlhd{\not@base\unlhd} +\def\rhd{\not@base\rhd} +\def\unrhd{\not@base\unrhd} +% \end{macrocode} +% +% +% +% We now initialize all variables set by |\DeclareErrorFont|. These +% values are not really important since they will be overwritten +% later on by the definition in |fontdef.ltx|. +% +% However, if \texttt{fontdef.cfg} is corrupted then at least a +% hopefully suitable error font is present. +% +% \changes{v2.1k}{1994/05/14}{Init error font just before checking for +% fontdef.cfg} +% \begin{macrocode} +\DeclareErrorFont{OT1}{cmr}{m}{n}{10} %% don't modify this setting + %% overwrite it in fontdef.cfg + %% if necessary +% \end{macrocode} +% We also set some default values for |\f@family| etc. Note that we +% don't yet have any encodings that comes later. In the past this +% was implicitly done by |\DeclareErrorFont|. +% \changes{v3.1c}{2019/07/09}{Explicitly set some defaults} +% \begin{macrocode} +\fontfamily{cmr} +\fontseries{m} +\fontshape{n} +\fontsize{10}{10} +% \end{macrocode} +% +% +% +% +% We now load the customizable parts of NFSS. +% \changes{v3.0d}{1995/07/19} +% {(DPC) TeX2 support} +% \changes{v3.0e}{1995/09/15} +% {(DPC) Modify TeX2 message} +% \changes{v3.0g}{1995/11/01} +% {(DPC) Switch meaning of \cs{@addtofilelist} for cfg files} +% \changes{v3.0h}{1996/12/06} +% {(DPC) Remove *** from messages internal/2338} +% \begin{macrocode} +\InputIfFileExists{fonttext.cfg} + {\typeout{====================================^^J% + ^^J% + Local config file fonttext.cfg used^^J% + ^^J% + ====================================}% + \def\@addtofilelist##1{\xdef\@filelist{\@filelist,##1}}% + } + {\input{fonttext.ltx}} +\let\@addtofilelist\@gobble +% \end{macrocode} +% +% Ditto for math although I don't think that we will get a lot of +% customisation :-) +% \begin{macrocode} +\InputIfFileExists{fontmath.cfg} + {\typeout{====================================^^J% + ^^J% + Local config file fontmath.cfg used^^J% + ^^J% + ====================================}% + \def\@addtofilelist##1{\xdef\@filelist{\@filelist,##1}}% + } + {\input{fontmath.ltx}} +\let\@addtofilelist\@gobble +% \end{macrocode} +% +% Then we preload several fonts. This file might be customized +% \emph{without} changing the behavior of the format (i.e.\ necessary +% font definitions will be loaded at runtime if they are not +% preloaded). This is done in the file \texttt{preload.ltx}. +% \begin{macrocode} +\InputIfFileExists{preload.cfg} + {\typeout{====================================^^J% + ^^J% + Local config file preload.cfg used^^J% + ^^J% + =====================================}% + \def\@addtofilelist##1{\xdef\@filelist{\@filelist,##1}}% + } + {\input{preload.ltx}} +\let\@addtofilelist\@gobble +% \end{macrocode} +% +% +% \begin{macro}{\@acci} +% \begin{macro}{\@accii} +% \begin{macro}{\@acciii} +% \changes{v2.1m}{1994/05/16}{Define saved versions of accents} +% We also save the values of some accents in |\@acci|, |\@accii| +% and |\@acciii| so they can be restored by a |minipage| inside a +% |tabbing| environment. +% \begin{macrocode} +\let\@acci\' \let\@accii\` \let\@acciii\= +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\cal} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Remove definition} +% \begin{macro}{\mit} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Remove definition} +% Here were the two old \meta{alphabet identifiers}. +% \end{macro} +% \end{macro} +% +% +% \iffalse +%<+checkmem>\CHECKMEM +% \fi +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx b/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx new file mode 100644 index 00000000000..0270fcb066c --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltfsstrc.dtx @@ -0,0 +1,1845 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltfsstrc.dtx +%% Copyright (C) 1989-97 by Frank Mittelbach and Rainer Sch\"opf. +%% Copyright (C) 1994-97 by LaTeX3 project. All rights reserved. +% +%<package>\NeedsTeXFormat{LaTeX2e}[1995/05/16] +%<package>\ProvidesPackage{tracefnt} +%<package> [2015/02/21 v3.0k Standard LaTeX package (font tracing)] +% \fi +% \ProvidesFile{ltfsstrc.dtx} +% [2015/02/21 v3.0k LaTeX Kernel (NFSS tracing)] +% +% \iffalse +%<+checkmem>\CHECKMEM +% \fi +% +% +% +% +% \changes{v3.0g}{1995/11/28} +% {documentation fixes} +% \changes{v3.0f}{1995/10/22}{Added `genb' and `sgenb' size functions +% to support new DC font naming scheme.} +% \changes{v3.0e}{1995/10/20} +% {(DPC) Modify autoload code} +% \changes{v3.0d}{1995/10/04} +% {(DPC) Modify autoload code} +% \changes{v3.0b}{1995/05/24} +% {(DPC) Fix \cs{ProvidesFile} usage} +% \changes{v3.0a}{1995/05/24} +% {(DPC) Make file from previous file, tracefnt 1995/05/16 v2.3o} +% \changes{v3.0k}{2015/02/21} +% {Removed autoload code} +% +% \changes{v2.3m}{1994/11/18} +% {\cs{next} to \cs{reserved@f}} +% \changes{v2.3l}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v2.3i}{1994/05/20}{Use new error command names} +% \changes{v2.3g}{1994/05/13}{Removed typeouts as +% \cs{ProvidesPackage} writes to log.} +% \changes{v2.3e}{1994/04/27}{Corrected item that was forgotten +% in last change.} +% \changes{v2.3d}{1994/04/18}{Changed to new error/warning scheme} +% \changes{v2.3a}{1994/01/17}{New math font setup} +% \changes{v2.2a}{1993/11/11}{Option concept added for LaTeX2e} +% \changes{v2.1j}{1993/09/15}{Corrected spelling of \cs{noxpand}.} +% \changes{v2.1i}{1993/09/02}{Corrected name of sgen size function.} +% \changes{v2.1h}{1993/07/16}{Changed layout of info messages} +% \changes{v2.1b}{1993/03/18} +% {Changed all \cs{@tempdimb} in \cs{@tempdimx} +% to avoid killing \cs{numberline}} +% \changes{v2.1b}{1993/03/18} +% {Changed all \cs{@tempdima} in \cs{@tempdimb} +% to avoid killing \cs{numberline}} +% \changes{v1.0l}{1990/04/01}{Part of code moved to fam.dtx.} +% \changes{v1.0k}{1990/03/14}{Added code for TeX3.} +% \changes{v1.0h}{1990/01/18}{\cs{tracingfonts} meaning changed.} +% +% \newcommand\module[1]{\texttt{#1}} +% \providecommand{\dst}{\textsc{DocStrip}} +% \newcommand\Loption[1]{\texttt{#1}} +% +% \GetFileInfo{ltfsstrc.dtx} +% \title{The \texttt{tracefnt} package\thanks +% {This file has version number \fileversion, dated +% \filedate.} \\ +% for use with the new font selection scheme} +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% +% This package contains the code for tracing font loading and font +% changes. It basically overlays some of the low-level functions of +% NFSS with additional code used for tracing. +% +% The package accepts the following options: +% \begin{description} +% \item[errorshow] Write all information about font changes etc.\ +% only to the transcript file unless an error happens. This means +% that information about font substitution will not be shown on the +% terminal. +% +% \item[warningshow] Show all NFSS warnings on the terminal. This +% setting corresponds to the default behaviour of NFSS if the +% \texttt{tracefnt} package is \emph{not} loaded! +% +% \item[infoshow] Show all NFSS warning and all NFSS info +% messages (that are normally only written to the transcript file) +% also on the terminal. This is the default if the \texttt{tracefnt} +% package is loaded. +% +% \item[debugshow] In addition to \texttt{infoshow} show also +% changing of math fonts as far as possible (this option can produce a +% large amount of output. +% +% \item[loading] Show the name of external fonts when they are +% loaded. This option shows only ``newly'' loaded fonts not those +% already preloaded in the format or the class file before the +% \texttt{tracefnt} package became active. +% +% \item[pausing] +% Turn all font warnings into errors so that \LaTeX{} will stop. +% +% \end{description} +% +% +% \StopEventually{} +% +% \section{A driver for this document} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you +% are currently reading. It will be extracted from this file by the +% \dst{} program. +% +% When this file is processed directly by \LaTeX{} this will +% produce the documentation as well. +% +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} + + +%\OnlyDescription % comment out for implementation details + +\begin{document} + \DocInput{ltfsstrc.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% +% \section{The Implementation} +% +% \begin{quote} +% \textbf{Warning:} Read the macro documentation with a grain of +% salt. It is still basically the documentation from the first NFSS +% release and therefore in some cases probably not completely +% accurate. +% \end{quote} +% +% If we are making a package file it is a good idea to test whether +% we are running under 2e. +% This code is actually placed at the very beginning of this file +% for easier maintenance, thus commented out here. +% \begin{macrocode} +%<*package> +%\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{tracefnt}[??/??/?? v?.?? +% Standard LaTeX package (font tracing)] +%</package> +% \end{macrocode} +% +% +% The \texttt{debug} module makes use of commands contained in a +% special package file named \texttt{trace.sty}.\footnote{This package +% is not in distribution at the moment (and probably doesn't any +% longer work). Think of this part of the code as being historical +% artefacts.} +% \begin{macrocode} +%<+debug> \input trace.sty +% \end{macrocode} +% +% +% \section{Handling Options} +% +% \begin{macro}{\tracingfonts} +% Here is the definition of the integer register for the font +% trace. As a default in a package file we use $1$ to give error +% messages if fonts are substituted. If this code is used for +% debugging or tracing reasons in the format file (i.e.\ in +% \texttt{fam.dtx}) we use $0$ as the default. But if no font +% trace is used we build a definition that will produce a warning +% message. +% \changes{v1.0l}{1990/04/01} +% {Check if \cs{tracingfonts} already defined.} +% \changes{v1.0o}{1990/04/01} +% {Check if \cs{tracingfonts} defined removed again.} +% \begin{macrocode} +%<*2ekernel> +\def\tracingfonts{% + \@font@warning{Command \noexpand\tracingfonts + not provided.\MessageBreak + Use the `tracefnt' package.\MessageBreak Command found:}% + \count@} +%</2ekernel> +% \end{macrocode} +% The |\count@| in the line above will remove the number after +% |\tracingfonts|. Note that this definition will be overwritten be +% the next line if one of these modules are included. +% \begin{macrocode} +%<*package,trace,debug> +\newcount\tracingfonts +\tracingfonts=0 +%</package,trace,debug> +% \end{macrocode} +% \end{macro} +% +% +% The option \Loption{errorshow} turns off all warnings so that only +% real errors are shown. \Loption{warningshow} corresponds to the +% NFSS default (when \texttt{tracefnt} is not loaded). +% \Loption{infoshow} is the default for this package here; and +% \Loption{debugshow}, \Loption{loading}, and +% \Loption{pausing} extend the amount of information even further. +% \changes{v2.3o}{1995/05/13} +% {Use single hash mark in \cs{DeclareOption}} +% \begin{macrocode} +%<*package> +\DeclareOption{errorshow}{% + \def\@font@info#1{% + \GenericInfo{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Info: \space\space\space#1}}% + \def\@font@warning#1{% + \GenericInfo{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Warning: #1}}% + } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{warningshow}{% + \def\@font@info#1{% + \GenericInfo{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Info: \space\space\space#1}}% + \def\@font@warning#1{% + \GenericWarning{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Warning: #1}}% + } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{infoshow}{% + \def\@font@info#1{% + \GenericWarning{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Info: \space\space\space#1}}% + \def\@font@warning#1{% + \GenericWarning{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Warning: #1}}% + } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{loading}{% + \tracingfonts\tw@ + } +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption{debugshow}{% + \ExecuteOptions{infoshow}% + \tracingfonts\thr@@ + } +% \end{macrocode} +% +% \changes{v3.0j}{1997/05/29}{Replaced \texttt{\symbol{92}\symbol{92}} +% by \cs{MessageBreak}, as suggested by Donald Arseneau.} +% \begin{macrocode} +\DeclareOption{pausing}{% + \def\@font@warning#1{% + \GenericError + {(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Warning: #1}% + {See the LaTeX Companion for details.}% + {I'll stop for every LaTeX Font Warning because + you requested\MessageBreak the `pausing' option + to the tracefnt package.}}% + } +% \end{macrocode} +% We make |infoshow| the default, which in turn defines +% |\font@warning| and |\font@info|. +% \begin{macrocode} +\ExecuteOptions{infoshow} +\ProcessOptions +%</package> +% \end{macrocode} +% +% We also need a default definition inside the kernel: +% \begin{macrocode} +%<*2ekernel> +\def\@font@info#1{% + \GenericInfo{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Info: \space\space\space#1}}% +\def\@font@warning#1{% + \GenericWarning{(Font)\@spaces\@spaces\@spaces\space\space}% + {LaTeX Font Warning: #1}}% +%</2ekernel> +% \end{macrocode} +% +% +% \section{Macros common to \texttt{fam.tex} and \texttt{tracefnt.sty}} +% +% In the first versions of \texttt{tracefnt.dtx} some macros of +% \texttt{fam.dtx}\footnote{This file is currently not distributed in +% documented form. Its code is part of \texttt{ltfss.dtx}.} +% were redefined to included the extra tracing +% information. Now these macros are all defined in this file (i.e.\ +% removed from \texttt{fam.dtx}) and different production versions can +% be obtained simply by specifying a different set of modules to +% include when generating \texttt{ltfss.dtx}. +% +% +% +% \subsection{General font loading} +% +% +% \begin{macro}{\extract@font} +% +% This macro organizes the font loading. +% It first calls |\get@external@font| +% which will return in |\external@font| the name of the external +% font file (the \texttt{.tfm}) as it was determined by the NFSS +% tables. +% \begin{macrocode} +%<*2ekernel|package> +\def\extract@font{% + \get@external@font +% \end{macrocode} +% Then the external font is loaded and assigned to the font +% identifier stored inside |\font@name| +% (for this reason we need |\expandafter|). +% \begin{macrocode} + \global\expandafter\font\font@name\external@font\relax +% \end{macrocode} +% When tracing we typeout the internal and external font name. +% \changes{v1.0k}{1990/03/14}{Added code for TeX3.} +% \begin{macrocode} +%<*trace> + \ifnum \tracingfonts >\@ne + \@font@info{External font `\external@font' + loaded as\MessageBreak \font@name}\fi +%</trace> +% \end{macrocode} +% Finally we call the corresponding ``loading action'' macros to +% finish things. First the font is locally selected to allow the +% use of |\font| inside the loading action macros. +% \begin{macrocode} + \font@name \relax +% \end{macrocode} +% The next two lines execute the ``loading actions'' for the +% family and then for the individual font shape. +% \begin{macrocode} + \csname \f@encoding+\f@family\endcsname + \csname\curr@fontshape\endcsname + \relax + } +%</2ekernel|package> +% \end{macrocode} +% The |\relax| at the end needs to be explained. +% This is inserted to prevent \TeX{} from scanning too far +% when it is executing the replacement text of the loading +% code macros. +% \end{macro} +% +% +% \begin{macro}{\get@external@font} +% This function tries to find an external font name. It will place +% the name into the macro +% |\external@font|. If no font is found it will return the one +% that was defined via |\DeclareErrorFont|. +% \begin{macrocode} +%<*2ekernel> +\def\get@external@font{% +% \end{macrocode} +% We don't know the external font name at the beginning. +% \begin{macrocode} + \let\external@font\@empty + \edef\font@info{\expandafter\expandafter\expandafter\string + \csname \curr@fontshape \endcsname}% + \try@size@range +% \end{macrocode} +% If this failed, we'll try to substitute another size of the same +% font. This is done by the |\try@size@substitution| macro. It +% ``knows about'' |\do@extract@font|, |\font@name|, |\f@size|, and +% so on. +% \begin{macrocode} + \ifx\external@font\@empty + \try@size@substitution + \ifx\external@font\@empty + \@latex@error{Font \expandafter \string\font@name\space + not found}\@eha + \error@fontshape + \get@external@font + \fi\fi +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \changes{v1.0j}{1990/02/18} +% {Redefine unprotected version \cs{p@selectfont} +% instead of \cs{selectfont}.} +% +% +% \begin{macro}{\selectfont} +% \changes{v1.1a}{1989/12/16}{Changed order of calls.} +% \changes{v2.3f}{1994/05/12}{Use \cs{DeclareRobustCommand}} +% The macro |\selectfont| is called whenever a font change must +% take place. +% \begin{macrocode} +%<*2ekernel|package> +\DeclareRobustCommand\selectfont + {% +% \end{macrocode} +% When \module{debug} is specified we actually want something like +% `undebug'. The font selection is now stable so that using +% |\tracingall| on some other macros will show us a lot of unwanted +% information about font loading. Therefore we disable tracing during +% font loading as long as |\tracingfonts| is less than $4$. +% \changes{v1.0m}{1990/04/05} +% {Call \cs{tracingon} only if \cs{tracingfonts} greater than 3.} +% \changes{v1.0n}{1990/05/05}{\cs{tracingon} with new syntax.} +% \begin{macrocode} +%<+debug> \pushtracing +%<+debug> \ifnum\tracingfonts<4 \tracingoff +%<+debug> \else \tracingon\p@selectfont \fi +% \end{macrocode} +% If |\baselinestretch| was redefined by the user it will not +% longer match its internal counterpart |\f@linespread|. If so we +% call |\set@fontsize| to prepare |\size@update|. +% \begin{macrocode} + \ifx\f@linespread\baselinestretch \else + \set@fontsize\baselinestretch\f@size\f@baselineskip \fi +% \end{macrocode} +% Then we generate the internal name of the font +% by concatenating {\em family}, {\em series}, +% {\em shape}, and current {\em size}, +% with slashes as delimiters between them. +% This is much more readable than standard +% \LaTeX's |\twfbf|, etc. +% We define |\font@name| globally, as always. +% The reason for this is explained later on. +% \changes{v2.0b}{1992/07/26}{} +% \begin{macrocode} + \xdef\font@name{% + \csname\curr@fontshape/\f@size\endcsname}% +% \end{macrocode} +% We call the macro |\pickup@font| which will load the font if +% necessary. +% \begin{macrocode} + \pickup@font +% \end{macrocode} +% Then we select the font. +% \begin{macrocode} + \font@name +% \end{macrocode} +% If |\tracingfonts| is +% greater than 2 we also show the font switch. +% We do this before |\glb@settings| is called since this +% macro might redefine |\font@name|. +% \changes{v1.0k}{1990/03/14}{Added code for TeX3.} +% \changes{v1.0i}{1990/02/16}{Changed \cs{f@size} to \cs{lcl@currsize} +% (see fam file).} +% \begin{macrocode} +%<*trace> + \ifnum \tracingfonts>\tw@ + \@font@info{Switching to \font@name}\fi +%</trace> +% \end{macrocode} +% Finally we call |\size@update|. This macro is normally empty but +% will contain actions (like setting the |\baselineskip|) that have +% to be carried out when the font size, the base |\baselineskip| or +% the |\baselinestretch| have changed. +% \begin{macrocode} + \size@update +% \end{macrocode} +% A similar function is called to handle anything related to +% encoding updates. This one is changed from |\relax| by +% |\fontencoding|. +% \changes{v2.3h}{1994/05/14}{Added \cs{enc@update}} +% \begin{macrocode} + \enc@update +% \end{macrocode} +% Just before ending this macro we have to pop the tracing stack +% if it was pushed before. +% \begin{macrocode} +%<+debug> \poptracing + } +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\set@fontsize} +% The macro |\set@fontsize| does the actual work. First it assigns +% new values to |\f@size|, |\f@baselineskip| and |\f@linespread|. +% \begin{macrocode} +\def\set@fontsize#1#2#3{% + \@defaultunits\@tempdimb#2pt\relax\@nnil + \edef\f@size{\strip@pt\@tempdimb}% + \@defaultunits\@tempskipa#3pt\relax\@nnil + \edef\f@baselineskip{\the\@tempskipa}% + \edef\f@linespread{#1}% +% \end{macrocode} +% For backward compatibility and for later testing within +% |\selectfont| the internal value of |\f@linespread| is passed +% back to |\baselinestretch|. +% \begin{macrocode} + \let\baselinestretch\f@linespread +% \end{macrocode} +% Additional processing will happen within |\selectfont|. For this +% reason the macro |\size@update| (which will be called in +% |\selectfont|) will be defined to be: +% \begin{macrocode} + \def\size@update{% +% \end{macrocode} +% First calculate the new |\baselineskip| and also store it in +% |normalbaselineskip| +% \begin{macrocode} + \baselineskip\f@baselineskip\relax + \baselineskip\f@linespread\baselineskip + \normalbaselineskip\baselineskip +% \end{macrocode} +% then to set up a new |\strutbox| +% \begin{macrocode} + \setbox\strutbox\hbox{% + \vrule\@height.7\baselineskip + \@depth.3\baselineskip + \@width\z@}% +% \end{macrocode} +% We end with a bit of tracing information. +% \begin{macrocode} +%<*trace> + \ifnum \tracingfonts>\tw@ + \ifx\f@linespread\@empty + \let\reserved@a\@empty + \else + \def\reserved@a{\f@linespread x}% + \fi + \@font@info{Changing size to \f@size/\reserved@a + \f@baselineskip}% + \aftergroup\type@restoreinfo \fi +%</trace> +% \end{macrocode} +% When all this is processed |\size@update| redefines itself to +% |\relax| so that in later calls of |\selectfont| no extra code +% will be executed. +% \begin{macrocode} + \let\size@update\relax}% + } +% \end{macrocode} +% Instead of defining this macro internally we might speed things +% up by placing the code into a separate macro and use |\let|! +% \end{macro} +% +% +% \begin{macro}{\size@update} +% Normally this macro does nothing; it will be redefined by +% |\set@fontsize| to initiate an update. +% \begin{macrocode} +\let\size@update\relax +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\type@restoreinfo} +% This macro produces some info when a font size and/or baseline +% change will get restored. +% \changes{1.0r}{1990/08/27}{Some extra tracing info.} +% \begin{macrocode} +%<*trace> + \def\type@restoreinfo{% + \ifx\f@linespread\@empty + \let\reserved@a\@empty + \else + \def\reserved@a{\f@linespread x}% + \fi + \@font@info{Restoring size to + \f@size/\reserved@a\f@baselineskip}} +%</trace> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\glb@settings} +% \begin{macro}{\glb@currsize} +% \changes{v2.3a}{1994/01/17}{New math font setup} +% \changes{v2.3k}{1994/11/06}{New implementation} +% The macro |\glb@settings| globally selects +% all math fonts for the current size if necessary. +% \begin{macrocode} +\def\glb@settings{% +% \end{macrocode} +% When |\glb@settings| gains control a size +% change was requested and all previous font assignments need to +% be replaced. +% Therefore the old values of the fonts are no longer needed. +% For every {\em math group\/} the new assignments are appended to +% |\math@fonts|. +% But this happens only if the |math@fonts| switch +% is set to true. +% However, we always set up the correct math sizes for script and +% scriptscript fonts since they may be needed even if we don't set +% up the whole math machinery. +% +% Here we set the math size, script size and scriptscript size. +% If the |S@|\ldots{} macro is not defined we have to first +% calculate the three sizes. +% \begin{macrocode} + \expandafter\ifx\csname S@\f@size\endcsname\relax + \calculate@math@sizes + \fi +% \end{macrocode} +% The effect of this is that |\calculate@math@sizes| +% may or may not define the |S@|\ldots{} macro. In the +% first case the next time the same size is requested +% this macro is used, otherwise |\calculate@math@sizes| is +% called again. +% This also sets the |math@fonts| switch. +% If it is true we must switch the math fonts. +% \begin{macrocode} + \csname S@\f@size\endcsname + \ifmath@fonts +%<*trace> + \ifnum \tracingfonts>\tw@ + \@font@info{Setting up math fonts for + \f@size/\f@baselineskip}\fi +%</trace> +% \end{macrocode} +% Inside a group we execute the macro for the current math {\em +% version}. This sets |\math@fonts| to a list of +% |\textfont|\dots{} assignments. |\getanddefine@fonts| (which may +% be called at this point) needs the |\escapechar| parameter to be +% set to $-1$. +% \begin{macrocode} + \begingroup + \escapechar\m@ne + \csname mv@\math@version \endcsname +% \end{macrocode} +% Then we set |\globaldefs| to 1 so that all following changes are +% done globally. The math font assignments recorded in +% |\math@fonts| are executed and |\glb@currsize| is set equal to +% |\f@size|. This signals that the fonts for math in this size are +% set up. +% \begin{macrocode} + \globaldefs\@ne + \math@fonts + \let \glb@currsize \f@size + \endgroup +% \end{macrocode} +% Finally we execute any code that is supposed to happen +% whenever the math font setup changes. This register will +% be executed in local mode which means that everything that is +% supposed to have any effect should be done globally inside. +% We can't execute it within |\globaldefs\@ne| as we don't know +% what ends up inside this register, e.g., it might contain +% calculations which use some local registers to calculate the +% final (global) value. +% \begin{macrocode} + \the\every@math@size +% \end{macrocode} +% Otherwise we announce that the math fonts are not set up for this +% size. +% \begin{macrocode} +%<*trace> + \else + \ifnum \tracingfonts>\tw@ + \@font@info{No math setup for + \f@size/\f@baselineskip}\fi +%</trace> + \fi +} +%</2ekernel|package> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\baselinestretch} +% \changes{v1.0o}{1990/06/24}{Moved to tracefnt.dtx.} +% In |\selectfont| we used |\baselinestretch| as +% a factor when assigning a value to |\baselineskip|. +% We use 1 as a default (i.e.\ no stretch). +% \begin{macrocode} +%<*2ekernel> +\def\baselinestretch{1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\every@math@size} +% \changes{v1.0u fam.dtx}{1989/12/05}{Hook \cs{every@size} added.} +% \changes{v23.k}{1994/10/23}{Renamed to \cs{every@math@size}} +% We must still define the hook |\every@math@size| we used in +% |\glb@settings|. We initialize it to nothing. It is important to +% remember that everything that goes into this hook should to global +% updates, local changes will have weird effects. +% \begin{macrocode} +\newtoks\every@math@size +\every@math@size={} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Math fonts setup} +% +% +% \subsubsection{Outline of algorithm for math font sizes} +% +% \TeX{} uses the the math fonts that are current when the end of a +% formula is reached. If we don't want to keep font setups local to +% every formula (which would result in an enormous overhead, we have +% to be careful not to end up with the wrong setup in case formulas +% are nested, e.g., we need to be able to handle +% \begin{verbatim} +% $ a=b+c \mbox{ \small for all $b$ and $c\in Z$}$ +%\end{verbatim} +% Here the inner formulae |b| and |c\in Z| are typeset in |\small| but +% we have to return to |\normalsize| before we reach the closing |$| +% of the outer formula. +% +% This is handled in the following way: +% \begin{enumerate} +% \item At any point in the document the global variable +% |\gbl@currsize| contains the point size for which the math fonts +% currently are set up. +% +% \item \label{it:everymath} Whenever we start a formula we compare +% its value with the local variable |\f@size| that describes the +% current text font size. +% +% \item If both are the same we assume that we can use the current +% math font setup without adjustment. +% +% \item \label{it:everymathend} If they differ we call |\gbl@settings| +% which changes the math font setup and updates |\gbl@currsize|. +% \begin{enumerate} +% \item If we are recursively inside another formula (|\if@inmath|) we +% ensure that |\gbl@settings| is executed again in the outer +% formula, so that the old setup is automatically restored. +% \item Otherwise, we set the switch |@inmath| locally to |true| so +% that all nested formulae will be able to detect that they are +% nested in some outer formula. +% \end{enumerate} +% \end{enumerate} +% +% +% The above algorithm has the following features: +% \begin{itemize} +% \item For sizes which are not containing any formula no math setup +% is done. Compared to the original algorithm of NFSS this results +% in the following savings: +% \begin{itemize} +% \item No unnecessary loading of math fonts for sizes that are not +% used to typeset any math formulae (explicit or implicit ones). +% \item No time overhead due to unnecessary changes of the math font +% setup on entrance and exit of the text font size. +% \end{itemize} +% +% \item Math font setup changes for top-level formulae will survive +% (there is no restoration after the formula) thus any following +% formula in the same size will be directly typesetable. Compared to +% original implementation in NFSS2 +% the new algorithm has the overhead of one test per formula +% to see if the current math setup is valid (in the original +% algorithm the setup was always valid, thus no test was necessary). +% +% \item In nested formulae the math font setup is restored in the +% outer formula by a series of |\aftergroup| commands and checks. +% Compared to the original algorithm this involves additional checks +% ($2 \times \langle\mbox{non-math levels}\rangle$ per inner +% formula). +% \end{itemize} +% +% \subsubsection{Code for math font size setting} +% +% \begin{macro}{\check@mathfonts} +% \changes{v2.3a}{1994/01/17}{New math font setup} +% \changes{v2.3c}{1994/01/26}{Correct trace info placement} +% In the |\check@mathfonts| macros we implement the steps +% \ref{it:everymath} to \ref{it:everymathend} except that instead +% of a switch the macro |\init@restore@glb@settings| is used. +% \begin{macrocode} +%<*2ekernel|package> +\def\check@mathfonts{% + \ifx \glb@currsize \f@size +%<*trace> + \ifnum \tracingfonts>\thr@@ + \@font@info{*** MATH: no change \f@size\space + curr/global (\curr@math@size/\glb@currsize)}\fi +%</trace> + \else +%<*trace> + \ifnum \tracingfonts>\thr@@ + \@font@info{*** MATH: setting up \f@size\space + curr/global (\curr@math@size/\glb@currsize)}\fi +%</trace> + \glb@settings + \init@restore@glb@settings + \fi + \let\curr@math@size\f@size + \def\init@restore@glb@settings{\aftergroup\restglb@settings}% +} +% \end{macrocode} +% \end{macro} +% +% +% +% +% \begin{macro}{\init@restore@glb@settings} +% \changes{v3.0i}{1996/07/26}{macro added replacing \cs{if@inmath} switch} +% This macros does by default nothing but get redefined inside +% |\check@mathfonts| to initiate fontsize restoring in nested +% formulas. +% \begin{macrocode} +%<-trace>\let\init@restore@glb@settings\relax +%<*trace> +\def\init@restore@glb@settings{% + \ifnum \tracingfonts>\thr@@ + \@font@info{*** MATH: no resetting (not in + nested math)}\fi +} +%</trace> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\restglb@settings} +% \changes{v2.3a}{1994/01/17}{New math font setup} +% \changes{v2.3c}{1994/01/26}{Correct trace info placement} +% This macro will be executed the first time after the current +% formula. +% \begin{macrocode} +\def\restglb@settings{% +%<*trace> + \ifnum \tracingfonts>\thr@@ + \@font@info{*** MATH: restoring}\fi +%</trace> + \begingroup + \let\f@size\curr@math@size + \ifx\glb@currsize \f@size +%<*trace> + \ifnum \tracingfonts>\thr@@ + \@font@info{*** MATH: ... already okay (\f@size)}\fi +%</trace> + \else +%<*trace> + \ifnum \tracingfonts>\thr@@ + \@font@info{*** MATH: ... to \f@size}\fi +%</trace> + \glb@settings + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Other code for math} +% +% +% \begin{macro}{\use@mathgroup} +% \changes{v1.2b}{1990/01/21}{Macro added to allow cleaner interface.} +% \changes{v1.2h}{1990/03/30}{Third argument removed (see +% \cs{math@egroup}).} +% The |\use@mathgroup| macro should be used in user +% macros to select a math group. Depending on whether or not the +% \texttt{margid} option is in force it has two or three arguments. +% For this reason it should be called as the last macro. +% +% First we test if we are inside math mode since we don't want to +% apply a useless definition. +% \changes{v1.1a}{1989/12/16}{Usage of `\quotechar=' macro added.} +% \changes{v1.1a}{1989/12/16}{Redefinition of alphabet now simpler.} +% \begin{macrocode} +\def\use@mathgroup#1#2{\relax\ifmmode +% \end{macrocode} +% \changes{v1.0o}{1990/06/24}{Tracing code added.} +% \changes{v1.0q}{1990/07/07}{Group number added to tracing.} +% \begin{macrocode} +%<*trace> + \ifnum \tracingfonts>\tw@ + \count@#2\relax + \@font@info{Using \noexpand\mathgroup + (\the\count@) #2}\fi +%</trace> +% \end{macrocode} +% If so we first call the `=' macro (i.e.\ argument three) to set +% up special things for the selected math group. Then we call +% |\mathgroup| to select the group given by argument two and +% finally we place |#1| (i.e.\ the argument of the \meta{math +% alphabet identifier} at the end. This part of the code is +% surrounded by two commands which behave like |\begingroup| +% and |\endgroup| if we want \meta{math alphabet identifier}s +% but will expand into |\@empty| if we want simply switches to +% a new math group. +% \changes{v1.0p}{1990/06/30}{Added \cs{relax} after math group number.} +% Since argument number $2$ may be a digit instead of a control +% sequence we add a |\relax|. +% Otherwise something like |\mit{1}| would switch to math group +% $11$ (and back) instead of printing an oldstyle $\mit {1}$. +% \changes{v2.0b}{1992/07/26}{} +% \begin{macrocode} + \math@bgroup + \expandafter\ifx\csname M@\f@encoding\endcsname#1\else + #1\fi + \mathgroup#2\relax +% \end{macrocode} +% Before we reinsert the swallowed token (arg.\ three) into the +% input stream, in the case that the \meta{math alphabet +% identifier} isn't called in math mode, we remove the |\fi| +% with the |\expandafter| trick. This is necessary if the +% token is actually an macro with arguments. In such a case the +% |\fi| will be misinterpreted as the first argument which +% would be disastrous. +% \changes{v1.0f}{1989/12/13} +% {\cs{expandafter} added before final \cs{fi}.} +% \begin{macrocode} + \expandafter\math@egroup\fi}% +% \end{macrocode} +% The surrounding macros equal |\begingroup| and |\endgroup|. But +% using internal names makes it possible to overwrite their meaning +% in certain cases. This is for example used in \AmSTeX{} macros +% for placing accents. +% \end{macro} +% +% \begin{macro}{\math@egroup} +% \changes{v1.0q}{1990/07/07}{Tracing code added.} If the +% \texttt{margid} option is in force (which can be tested by +% looking at the definition of |\math@bgroup| we change the +% |\math@egroup| command a bit to display the current \meta{math +% group number} after it closes the scope of \meta{math alphabet} +% with |\endgroup|. +% \changes{v3.0h}{1996/05/08}{Use \cs{bgroup} instead of \cs{begingroup} +% to match a kernel change made in 1994!!!!} +% \begin{macrocode} +%<*trace> + \ifx\math@bgroup\bgroup + \def\math@egroup#1{#1\egroup + \ifnum \tracingfonts>\tw@ + \@font@info{Restoring \noexpand\mathgroup + (\ifnum\mathgroup=\m@ne default\else \the\mathgroup \fi)% + }\fi} + \fi +%</trace> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\getanddefine@fonts} +% \changes{v1.0o}{1990/06/24}{\cs{Macro} moved from fam.dtx.} +% |\getanddefine@fonts| has two arguments: the \meta{math +% group number} and the {\em family/series/shape\/} name as a +% control sequence. +% \begin{macrocode} +\def\getanddefine@fonts#1#2{% +% \end{macrocode} +% First we turn of tracing when |\tracingfonts| is less than $4$. +% \changes{v1.0o}{1990/06/24}{Adding debug code.} +% \changes{v1.0r}{1990/08/27} +% {Correcting missing name after \cs{tracingon}.} +% \begin{macrocode} +%<+debug> \pushtracing +%<+debug> \ifnum\tracingfonts<4 \tracingoff +%<+debug> \else \tracingon\getanddefine@fonts \fi +% \end{macrocode} +% \changes{v1.0o}{1990/06/24}{\cs{Adding} tracing code.} +% \changes{v1.0q}{1990/07/07}{Group number added to tracing.} +% \changes{v2.1a}{1992/09/22}{Introduced \cs{tf@size} for math size.} +% \begin{macrocode} +%<*trace> + \ifnum \tracingfonts>\tw@ + \count@#1\relax + \@font@info{\noexpand\mathgroup (\the\count@) #1 :=\MessageBreak + \string#2 \tf@size/\sf@size/\ssf@size}\fi +%</trace> +% \end{macrocode} +% We append the current |\tf@size| to |#2| to obtain the font +% name.\footnote{One might ask why this expansion does not generate +% a macro name that starts with an additional \texttt{\bslash} +% character. The solution is that \texttt{\bslash escapechar} is +% set to $-1$ before \texttt{\bslash getanddefine@fonts} is +% called.} Again, |font@name| is defined globally, for the reasons +% explained in the description of |\wrong@fontshape|. +% \begin{macrocode} + \xdef\font@name{\csname \string#2/\tf@size\endcsname}% +% \end{macrocode} +% Then we call |\pickup@font| to load it if necessary. +% We remember the internal name as |\textfont@name|. +% \begin{macrocode} + \pickup@font \let\textfont@name\font@name +% \end{macrocode} +% Same game for |\scriptfont| and |\scriptscriptfont|: +% \begin{macrocode} + \xdef\font@name{\csname \string#2/\sf@size\endcsname}% + \pickup@font \let\scriptfont@name\font@name + \xdef\font@name{\csname \string#2/\ssf@size\endcsname}% + \pickup@font +% \end{macrocode} +% Then we append the new |\textfont|\ldots{} assignments to +% the |\math@fonts|. +% \begin{macrocode} + \edef\math@fonts{\math@fonts + \textfont#1\textfont@name + \scriptfont#1\scriptfont@name + \scriptscriptfont#1\font@name}% +% \end{macrocode} +% Just before ending this macro we have to pop the tracing stack +% if it was pushed before. +% \begin{macrocode} +%<+debug> \poptracing + } +%</2ekernel|package> +% \end{macrocode} +% \end{macro} +% +% +% \section{Scaled font extraction} +% +% \begin{macro}{\ifnot@nil} +% We begin with a simple auxiliary macro. It checks +% whether its argument is the token |\@nil|. If so, +% it expands to |\@gobble| which discards the following +% argument, otherwise it expands to |\@firstofone| which +% reproduces it argument. +% \changes{v2.3n}{1995/05/08}{Use \cs{@firstofone}} +% \begin{macrocode} +%<*2ekernel> +\def\ifnot@nil#1{\def\reserved@a{#1}% + \ifx\reserved@a\@nnil \expandafter\@gobble + \else \expandafter\@firstofone\fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\remove@to@nnil} +% \begin{macro}{\remove@angles} +% \begin{macro}{\remove@star} +% Three other auxiliary macros will be needed in the following: +% |\remove@to@nnil| gobbles up everything up to, and including, +% the next |\@nnil| token, and |\remove@angles| and |\remove@star| +% do the same +% for the character |>| and |*|, respectively, instead of |\@nnil|. +% \begin{macrocode} +\def\remove@to@nnil#1\@nnil{} +\def\remove@angles#1>{\set@simple@size@args} +\def\remove@star#1*{#1} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \changes{v3.0c}{1995/08/24}{Macro \cs{gobble@font@spec} removed} +% +% \begin{macro}{\extract@sizefn} +% This macro takes a size specification and parses it into size +% function and the optional and mandatory arguments. +% \begin{macrocode} +\def\extract@sizefn#1*#2\@nil{% + \if>#2>\set@size@funct@args#1\@nil + \let\sizefn@info\@empty + \else\expandafter\set@size@funct@args\remove@star#2\@nil + \def\sizefn@info{#1}\fi + } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\try@simple@size} +% This function tries to extract the given size (specified by +% |\f@size|) for the requested font shape. The font information +% must already be present in |\font@info|. +% The central macro that does the real work is |\extract@fontinfo|. +% We will first give a simple example how this macro works, and +% describe it in full generality later. +% +% Assume that the requested parameters are: {\em encoding scheme\/} +% `OT1', {\em family\/} `cm', {\em series\/} `sansserif', +% {\em shape\/} `normal', and {\em size\/} `$12$'. +% The corresponding font definitions have already been +% extracted from the macro |\OT1/cm/sansserif/normal| and +% stored in |font@info|. +% (Otherwise |\extract@fontinfo| doesn't get called.) +% This information consists of a token list made of characters +% of category code $12$ of the form +% \begin{verbatim} +% <10*>cmss10<12*>cmss12<17*>cmss17 +%\end{verbatim} +% For reasonable packages one usually needs more sizes but this is +% sufficient to get the flavour. +% We will define a macro |\extract@fontinfo| to find +% the external font name (`cmss12') for us: +% \begin{verbatim} +% \def\extract@fontinfo#1<12*#2>#3<#4\@nnil{% +% \set@simple@size@args#3<#4\@nnil +% \execute@size@function{#2}} +%\end{verbatim} +% so that when it gets called via +% \begin{verbatim} +% \extract@fontinfo<10*>cmss10<12*>cmss12<17*>cmss17\@nnil +%\end{verbatim} +% |#1| will contain all characters before |<12*>|, +% |#2| will be empty, |#3| will be exactly |cmss12|, +% and |#3| will be |17>cmss17|. +% The expansion is therefore +% \begin{verbatim} +% \set@simple@size@args cmss12<17*>cmss17\@nnil +% \execute@size@function{} +%\end{verbatim} +% This means: the default (empty) size function will be executed, +% with its optional argument argument set to empty and its mandatory +% argument set to |cmss12| by |\set@simple@size@args|. +% As we discussed earlier, the effect of the default size function +% is to load the given external font (cmss12) at the specified size +% (12)---which is exactly what was intended. +% +% But this is only part of the whole story. +% It may be that the size requested does not occur +% in the token list |\font@info|. +% And the simple definition of |\extract@fontinfo| we gave +% above does not allow to specify give more than one +% size specification in front of the external font name. +% +% Let's address these two problems separately. The first one +% is solved with the following trick: +% We define |\extract@fontinfo| as follows: +% \begin{verbatim} +% \def\extract@fontinfo#1<12*#2>#3<#4\@nnil{% +% \ifnot@nil{#3}% +% {\set@simple@size@args#3<#4\@nnil +% \execute@size@function{#2}% +% }}% +%\end{verbatim} +% How does this work? +% We call |\extract@fontinfo| via +% \begin{verbatim} +% \expandafter\extract@fontinfo\font@info<12*>\@nil<\@nnil +%\end{verbatim} +% i.e. by appending |<12*>\@nil<\@nnil|. +% If the size (`12' in this case) appears in |\font@info| +% everything works as explained above, the only difference being +% that argument |#4| of |\extract@fontinfo| +% additionally gets the tokens |<12*>\@nil<\@nnil|. +% However, if the size is not found everything up to the final +% |<12*>| is in argument |#1|, +% |#3| gets |\@nil|, +% and |#2| and |#4| are empty. +% The macro |\ifnot@nil| will discard the calls to +% |\set@simple@size@args| and |execute@size@function|, and +% hence |\font@info| will continue to be equal to |\@empty|. +% This means that no simple size specification matching the +% requested size could be found. +% +% The second problem (more than one simple size specification +% for one external font name) will be addressed in +% |\set@simple@size@args| below. +% +% The macros are hidden inside other control sequences +% so that we have to build |\extract@fontinfo| in +% several steps. +% +% So here's the actual definition of |\extract@font| in +% |\try@simple@size|. +% \begin{macrocode} +% % this could be replaced by \try@size@range making the subst slower! +\def\try@simple@size{% +% \end{macrocode} +% |\reserved@a| is made an abbreviation for the head of the +% definition of the macro |\extract@fontinfo|. +% \begin{macrocode} + \def\reserved@a{\def\extract@fontinfo####1}% +% \end{macrocode} +% Now we can define |\extract@fontinfo|. Here we handle a small +% but convenient variation: in case of the default (empty) size +% function it is allowed to omit the |*| character. +% \changes{v2.0b}{1992/07/26}{} +% \changes{v2.0c}{1992/09/19}{} +% \begin{macrocode} + \expandafter\reserved@a\expandafter<\f@size>##2<##3\@nnil{% + \ifnot@nil{##2}% + {\set@simple@size@args##2<##3\@nnil + \execute@size@function\sizefn@info + }}% +% \end{macrocode} +% \changes{v2.0b}{1992/07/26}{} +% Now we call |\extract@fontinfo|. Note the |<\@nil| \textsf{tokens} +% at the end. +% \begin{macrocode} + \expandafter\expandafter + \expandafter\extract@fontinfo\expandafter\font@info + \expandafter<\f@size>\@nil<\@nnil +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\set@simple@size@args} +% As promised above, the macro |\set@simple@size@args| will handle +% the case of several size specifications in a row. +% If another size specification follows, the very first token of +% its argument list is the character |<|. +% By starting the definition as follows, +% \begin{macrocode} +\def\set@simple@size@args#1<{% +% \end{macrocode} +% parameter |#1| is empty in this case, and contains the size +% function's arguments otherwise. We distinguish these two cases +% (Note that the character |<| cannot appear in |#1|) by calling +% |\remove@angles| for empty |#1| and |\extract@sizefn| +% otherwise. In the latter case we have to take care of the +% remaining character tokens and discard them. This is done by +% |\remove@to@nnil|. Note also the use of Kabelschacht's method. +% \begin{macrocode} + \if<#1<% + \expandafter\remove@angles + \else + \extract@sizefn#1*\@nil + \expandafter\remove@to@nnil + \fi} +% \end{macrocode} +% \end{macro} +% +% +% Now, we are through with the case of a simple size, except for +% calling the size function. This will be handled later, as it is +% the same mechanism for all types of size specification. We will +% now proceed to macors for extraction of size range specification. +% +% +% +% \begin{macro}{\extract@rangefontinfo} +% |\extract@rangefontinfo| goes through a font shape definition +% in the input until it recognizes the tokens |<\@nil->|. +% It looks for font ranges with font size functions. It's operation +% is rather simple: it discards everything up to the next size +% specification and passes this on to |\is@range| for inspection. +% The specification (parameter |#2| is inserted again, in case +% it is needed later. +% \begin{macrocode} +\def\extract@rangefontinfo#1<#2>{% + \is@range#2->\@nil#2>} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\is@range} +% |\is@range| is again a sort of dispatcher macro: if the size +% specification it is looking at is not a range specification +% it discards it and calls |\extract@rangefontinfo| to continue +% the search. Otherwise it calls |\check@range| to check the +% requested size against the specified range. +% +% From the way |\is@range| is called inside |\extract@rangefontinfo| +% we see that |#2| is the character |>| if the size specification +% found is a simple one (as it does not contain a |-| character. +% This is checked easily enough and |\extract@rangefontinfo| +% called again. Note that the extra tokens inserted after the +% |\@nil| in the call to |\is@range| appear at the beginning of +% the first argument to |\extract@rangefontinfo| and are hence +% ignored. +% \begin{macrocode} +\def\is@range#1-#2\@nil{% + \if>#2\expandafter\check@single\else + \expandafter\check@range\fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\check@range} +% |\check@range| takes lower bound as parameter |#1|, upper bound +% as |#2|, size function as |#3| and the size function's arguments +% as |#4|. If |#3| is the special token |\@nil| |\font@info| is +% exhausted and we can stop searching. +% \begin{macrocode} +\def\check@range#1-#2>#3<#4\@nnil{% + \ifnot@nil{#3}{% +% \end{macrocode} +% If |#3| wasn't |\@nil| we have a range. We start by assuming that +% we have to recurse. Note that we have to reinsert an |<| as it +% was already removed by scanning. +% \begin{macrocode} + \def\reserved@f{\extract@rangefontinfo<#4\@nnil}% +% \end{macrocode} +% We have to make sure that both boundaries are present, if not we +% have to set them. Here we check the upper bound. If |\upper@bound| +% is zero after the assignment we set it to |\maxdimen| (upper open +% range). We need to use a \meta{dimen} register for the scan since +% we may have a decimal number as the boundary. +% \begin{macrocode} + \upper@bound0#2\p@ + \ifdim\upper@bound=\z@ \upper@bound\maxdimen\fi +% \end{macrocode} +% Now we check the upper boundary against |\f@size|. +% If it is larger or equal than |\f@size| this +% range is no good and we have to recurse. +% \begin{macrocode} + \ifdim \f@size \p@<\upper@bound +% \end{macrocode} +% Otherwise we have to check the lower bound. This time it is not +% necessary to scan the boundary value into a register because if +% it is empty we get zero as desired. We could even omit the |0| +% which would result in |1pt| as default lower boundary. If +% |\f@size| is smaller than the boundary we have to recurse. +% \begin{macrocode} + \lower@bound0#1\p@ + \ifdim \f@size \p@<\lower@bound + \else +% \end{macrocode} +% If both tests are passed we can try executing the size function. +% \begin{macrocode} + \set@simple@size@args#3<#4\@nnil + \execute@size@function\sizefn@info +% \end{macrocode} +% If the function was successful it should have left an external +% font name in |\external@font|. We use this to see if we can stop +% scanning. Otherwise we recurse. +% \begin{macrocode} + \ifx\external@font\@empty + \else + \let\reserved@f\@empty + \fi + \fi + \fi + \reserved@f}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lower@bound} +% \begin{macro}{\upper@bound} +% We use two dimen registers |\lower@bound| and |\upper@bound| +% to store the lower and upper endpoints of the range we found. +% \begin{macrocode} +\newdimen\lower@bound +\newdimen\upper@bound +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\check@single} +% |\check@single| takes the size as parameter |#1|, size function +% as |#2| and the size function's arguments as |#3|. We can assume +% that there is always something in the pipeline since the very +% last entry is a faked range (see above). +% \begin{macrocode} +\def\check@single#1>#2<#3\@nnil{% +% \end{macrocode} +% We start by assuming that +% we have to recurse. Note that we have to reinsert an |<| as it +% was already removed by scanning. +% \begin{macrocode} + \def\reserved@f{\extract@rangefontinfo<#3\@nnil}% +% \end{macrocode} +% Now we check the the size against |\f@size|. If it is not equal +% |\f@size| it is no good and we have to recurse. +% \begin{macrocode} + \ifdim \f@size \p@=#1\p@ +% \end{macrocode} +% Otherwise if this test is passed we can try executing the size +% function. +% \begin{macrocode} + \set@simple@size@args#2<#3\@nnil + \execute@size@function\sizefn@info +% \end{macrocode} +% If the function was successful it should have left an external +% font name in |\external@font|. We use this to see if we can stop +% scanning. Otherwise we recurse. +% \begin{macrocode} + \ifx\external@font\@empty + \else + \let\reserved@f\@empty + \fi + \fi + \reserved@f} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\set@size@funct@args} +% \begin{macro}{\set@size@funct@args@} +% This macro sets the optional and mandatory arguments for a size +% function. If the optional argument is not present it is set to +% the empty token list. The mandatory argument is delimited by the +% token |\@nil|. +% \begin{macrocode} +\def\set@size@funct@args{\@ifnextchar[% + \set@size@funct@args@{\set@size@funct@args@[]}} +% \end{macrocode} +% +% \begin{macrocode} +\def\set@size@funct@args@[#1]#2\@nil{% + \def\mandatory@arg{#2}% + \def\optional@arg{#1}} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\DeclareSizeFunction} +% This function defines a new size function hiding the internal +% from the designer. The body of the size function may use +% |\optional@arg| and |\mandatory@arg| denoting the optional and +% mandatory argument that may follow the size specification |<...>|. +% \changes{v2.1c}{1993/03/18}{Added all args to avoid blanks problems} +% \begin{macrocode} +%<*2ekernel> +\def\DeclareSizeFunction#1#2{\@namedef{s@fct@#1}{#2}} +\@onlypreamble\DeclareSizeFunction +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\execute@size@function} +% This macro is very simple. The only point worth noting +% is that calling an undefined size function will do nothing +% (actually execute a |\relax|). +% \begin{macrocode} +%<*2ekernel|package> +\def\execute@size@function#1{% +%<*trace> + \@ifundefined{s@fct@#1}% + {\errmessage{Undefined font size function #1}% + \s@fct@}% + {\csname s@fct@#1\endcsname}% +%</trace> +%<-trace> \csname s@fct@#1\endcsname +} +%</2ekernel|package> +% \end{macrocode} +% \end{macro} +% +% \changes{v2.3j}{1994/05/23}{Removed def of \cs{f@warn@break}} +% +% +% \begin{macro}{\try@size@range} +% This macro tries to find a suitable range for requested size +% (specified by |\f@size|) in |\font@info|. All the relevant +% action is done in |\extract@rangefontinfo|. All that needs +% to be done is to stuff in the token list in |\font@info| so +% that |\extract@rangefontinfo| can inspect it. +% Note the |<-*\@nil><| token at the end to stop scanning. +% \changes{v2.0b}{1992/07/26}{} +% \begin{macrocode} +%<*2ekernel> +\def\try@size@range{% + \expandafter\extract@rangefontinfo\font@info <-*>\@nil<\@nnil +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\try@size@substitution} +% \changes{v2.3k}{1994/11/06}{New implementation} +% This is the last thing that can be tried. If the desired |\f@size| +% is found neither among the simple size specifications nor in one +% of the ranges the whole list of size specifications is searched for +% a nearby simple size. +% \begin{macrocode} +\gdef\try@size@substitution{% +% \end{macrocode} +% First we do some initializations. |\@tempdimb| +% will hold the difference between the wanted size and the best +% solution found so far, so we initialise it with |\maxdimen|. +% The macro |\best@size| will hold the best size found, nothing +% found is indicated by the empty value. +% \begin{macrocode} + \@tempdimb \maxdimen + \let \best@size \@empty +% \end{macrocode} +% Now we loop over the specification +% \begin{macrocode} + \expandafter \try@simples \font@info <\number\@M>\@nil<\@nnil +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\font@submax} +% \changes{v2.3d}{1994/04/18}{Changed dimen to macro} +% \begin{macro}{\fontsubfuzz} +% \changes{v2.3d}{1994/04/18}{Changed dimen to macro} +% The macro |\font@submax| records the maximal deviation from the +% desired size encountered so far. Its value is used in a warning +% message at |\end{document}|. The macro +% |\fontsubfuzz| contains the amount that will not cause terminal +% warnings (warnings still go into the transcript file). +% \begin{macrocode} +\def\font@submax{0pt} +\def\fontsubfuzz{.4pt} +%</2ekernel> +%<+package>\def\fontsubfuzz{0pt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\try@simples} +% \changes{v2.3k}{1994/11/06}{New implementation} +% |\try@simples| goes through a font shape definition +% in the input until it recognizes the tokens |<*\@nil><|. +% It looks for simple sizes to determine the two closest sizes. +% It is assumed that simple sizes are in increasing order. +% \begin{macrocode} +%<*2ekernel> +\gdef\try@simples#1<#2>{% + \tryif@simple#2->\tryif@simple} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tryis@simple} +% \changes{v2.3k}{1994/11/06}{New implementation} +% |\tryis@simple| is similar to |\is@range|. If it sees a simple size, +% it checks it against the value of |\f@size| and sets +% |\lower@font@size| or |\higher@font@size|. In the latter case, it +% stops the iteration. By adding |<\number\@M>| at the end of the +% line we always have an end point. This is a hack which probably +% should be corrected. +% +% First it checks whether it is finished already, then whether the +% size specification in question is a simple one. +% \begin{macrocode} +\gdef\tryif@simple#1-#2\tryif@simple{% +% \end{macrocode} +% Most common case for |\reserved@f| first: +% \begin{macrocode} + \let \reserved@f \try@simples + \if>#2% +% \end{macrocode} +% If so, it compares it to the value of |\f@size|. This is done using +% a dimen register since there may be fractional numbers. +% \begin{macrocode} + \dimen@ #1\p@ + \ifdim \dimen@<\@M\p@ +% \end{macrocode} +% If |\dimen@| is |\@M\p@| we have reached the end of the fontspec +% (hopefully) otherwise we compare the value with |\f@size| and +% compute in |\@tempdimc| the absolute value of the difference +% between the two values. +% \begin{macrocode} + \ifdim \f@size\p@<\dimen@ + \@tempdimc \dimen@ + \advance\@tempdimc -\f@size\p@ + \else + \@tempdimc \f@size\p@ + \advance\@tempdimc -\dimen@ + \fi +% \end{macrocode} +% The result is then compared with the smallest difference we have +% encountered, if the new value (in |\@tempdimc| is smaller) we +% have found a size which is a better approximation so we make it +% the |\best@size| and adjust |\@tempdimb|. +% \begin{macrocode} + \ifdim \@tempdimc<\@tempdimb + \@tempdimb \@tempdimc + \def \best@size{#1}% + \fi +% \end{macrocode} +% When we have reached the end of the fontspec we substitute the +% best size found (if any). We code this inline to save macro +% space; in the past this was done by a macro called |\subst@size|. +% \begin{macrocode} + \else +% \end{macrocode} +% +% +% \begin{macro}{\subst@size} +% This macro substitutes the size recorded in |\best@size| for +% the unavailable size |\f@size|. |\font@submax| records the maximum +% difference between desired size and selected size in the +% whole run. +% \changes{v2.3d}{1994/04/18}{\cs{font@submax} and \cs{fontsubfuzz} +% now macros} +% \begin{macrocode} +% %\subst@size %% coded inline +% %\def\subst@size{% + \ifx \external@font\@empty + \ifx \best@size\@empty + \else + \ifdim \@tempdimb>\font@submax \relax + \xdef \font@submax {\the\@tempdimb}% + \fi + \let \f@user@size \f@size + \let \f@size \best@size + \ifdim \@tempdimb>\fontsubfuzz\relax + \@font@warning{Font\space shape\space + `\curr@fontshape'\space in\space size\space + <\f@user@size>\space not\space available\MessageBreak + size\space <\f@size>\space substituted}% + \fi + \try@simple@size + \do@subst@correction + \fi + \fi +% %} +% \end{macrocode} +% \end{macro} +% +% This brings us back into the main part of |\tryif@simple|. +% Finally we get rid of any rubbish left over on the input stack. +% +% \changes{v3.0c}{1995/08/24}{} +% \begin{macrocode} + \let \reserved@f \remove@to@nnil + \fi + \fi +% \end{macrocode} +% If it's a range iterate also. +% \begin{macrocode} + \reserved@f} +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{Sizefunctions} +% +% In the following we define some useful size functions. +% +% +% \begin{macro}{\s@fct@} +% This is the default size function. Mandatory argument is an +% external font name, optional argument a scale factor. +% The font is scaled +% to |\f@size| if no optional argument is present, and to +% |\f@size| multiplied by the optional argument otherwise. +% \changes{v2.0b}{1992/07/26}{} +% \begin{macrocode} +\DeclareSizeFunction{}{\empty@sfcnt\@font@warning} +\DeclareSizeFunction{s}{\empty@sfcnt\@font@info} +% \end{macrocode} +% +% \begin{macrocode} +\def\empty@sfcnt#1{% + \@tempdimb \f@size\p@ + \ifx\optional@arg\@empty + \else + \@tempdimb \optional@arg\@tempdimb + #1{Font\space shape\space `\curr@fontshape'\space + will\space be\MessageBreak + scaled\space to\space size\space \the\@tempdimb}% + \fi + \edef\external@font{\mandatory@arg\space at\the\@tempdimb}} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\s@fct@gen} +% \begin{macro}{\s@fct@sgen} +% This size function generates the external name from the mandatory +% argument and the requested user size, and thus can be used for +% external names where the size is encoded in the font name. The +% optional argument a scale factor. The font is scaled to |\f@size| +% if no optional argument is present, and to |\f@size| multiplied +% by the optional argument otherwise. +% \begin{macrocode} +\DeclareSizeFunction{gen}{\gen@sfcnt\@font@warning} +\DeclareSizeFunction{sgen}{\gen@sfcnt\@font@info} +% \end{macrocode} +% +% \begin{macrocode} +\def\gen@sfcnt{% + \edef\mandatory@arg{\mandatory@arg\f@size}% + \empty@sfcnt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\s@fct@genb} +% \begin{macro}{\s@fct@sgenb} +% This size function is similar to |gen|, but for fonts where the +% size is encoded in the font name in centipoints, as in the DC +% fonts version 1.2. The font is scaled to |\f@size| +% if no optional argument is present, and to |\f@size| multiplied +% by the optional argument otherwise. +% \begin{macrocode} +\DeclareSizeFunction{genb}{\genb@sfcnt\@font@warning} +\DeclareSizeFunction{sgenb}{\genb@sfcnt\@font@info} +% \end{macrocode} +% +% \begin{macrocode} +\def\genb@sfcnt{% + \edef\mandatory@arg{\mandatory@arg\expandafter\genb@x\f@size..\@@}% + \empty@sfcnt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\genb@x} +% \begin{macro}{\genb@y} +% The auxiliary macros |\genb@x| and |\genb@y| are used to convert +% the |\f@size| into centipoints. +% \begin{macrocode} +\def\genb@x#1.#2.#3\@@{\two@digits{#1}\genb@y#200\@@} +\def\genb@y#1#2#3\@@{#1#2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% \begin{macro}{\s@fct@sub} +% This size function handles font substitution. +% The mandatory argument is a family/series/shape combination, +% the optional argument (if present) is ignored. The font encoding +% scheme cannot be changed. Therefore, the first thing we do is to +% prepend the encoding scheme. +% \changes{v2.0b}{1992/07/26}{} +% \begin{macrocode} +\DeclareSizeFunction{sub}{\sub@sfcnt\@font@warning} +\DeclareSizeFunction{ssub}{\sub@sfcnt\@font@info} +% \end{macrocode} +% +% \begin{macrocode} +\def\sub@sfcnt#1{% + \edef\mandatory@arg{\f@encoding/\mandatory@arg}% +% \end{macrocode} +% Next action is split the arg into its individual components and +% allow for a late font shape load. +% \begin{macrocode} + \begingroup + \expandafter\split@name\mandatory@arg/\@nil + \try@load@fontshape + \endgroup +% \end{macrocode} +% Then we record the current |\f@size| since it may get clobbered. +% \begin{macrocode} + \let\f@user@size\f@size +% \end{macrocode} +% Then we check whether this new combination is defined and +% give an error message if not. In this case we also switch to +% |\error@fontshape|. +% \begin{macrocode} + \expandafter + \ifx\csname\mandatory@arg\endcsname\relax + \errmessage{No\space declaration\space for\space + shape\space \mandatory@arg}% + \error@fontshape + \else +% \end{macrocode} +% Otherwise we warn the user about the substitution taking place. +% \begin{macrocode} + #1{Font\space shape\space `\curr@fontshape'\space in\space + size\space <\f@size>\space not\space available\MessageBreak + Font\space shape\space `\mandatory@arg'\space tried\space + instead}% + \expandafter\split@name\mandatory@arg/\@nil + \fi +% \end{macrocode} +% Then we restart the font specification scan by calling +% |\get@external@font|. +% \begin{macrocode} + \edef\f@size{\f@user@size}% + \get@external@font +% \end{macrocode} +% Finally |\do@subst@correction| is called to get the font name +% right. +% \begin{macrocode} + \do@subst@correction +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\s@fct@subf} +% The |subf| size function allows substitution of another font. The +% mandatory argument is the external name of the font to be +% substituted, the optional argument a size scaling factor like +% in the default size function. +% The main difference to the default size function is the warning +% message. +% \begin{macrocode} +\DeclareSizeFunction{subf}{\subf@sfcnt\@font@warning} +\DeclareSizeFunction{ssubf}{\subf@sfcnt\@font@info} +% \end{macrocode} +% +% \begin{macrocode} +\def\subf@sfcnt#1{% + #1{Font\space shape\space `\curr@fontshape'\space in\space + size\space \f@size\space not\space available\MessageBreak + external\space font\space `\mandatory@arg'\space used}% + \empty@sfcnt#1% + } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\s@fct@fixed} +% The |fixed| size function is for using a font at a different size +% than requested. A warning message is printed, and the external +% font to be used is taken from the mandatory argument. +% If an optional argument is present it is used as the `at' +% size for the font. Otherwise the font is loaded at its design size. +% \begin{macrocode} +\DeclareSizeFunction{fixed}{\fixed@sfcnt\@font@warning} +\DeclareSizeFunction{sfixed}{\fixed@sfcnt\@font@info} +% \end{macrocode} +% +% \begin{macrocode} +\def\fixed@sfcnt#1{% + \ifx\optional@arg\@empty + \let\external@font\mandatory@arg + \else + \edef\external@font{\mandatory@arg\space at\optional@arg pt}% + \fi + #1{External\space font\space `\external@font'\space loaded\space + for\space size\MessageBreak + <\f@size>}% +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \iffalse +%<+checkmem>\CHECKMEM +% \fi +% +% +% \Finale diff --git a/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx b/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx new file mode 100644 index 00000000000..32b73bf8926 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/lthyphen.dtx @@ -0,0 +1,143 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%<*driver> +\ProvidesFile{lthyphen.dtx} +%</driver> +%<default>\ProvidesFile{hyphen.ltx} +% \fi +% \ProvidesFile{lthyphen.dtx} + [1994/12/04 v1.0h LaTeX Kernel (hyphenation interface)] +% +% +% +%\iffalse This is a META comment +% +% File `lthyphen.dtx'. +% Copyright (C) 1994-94 LaTeX3 project, Frank Mittelbach and +% Rainer Sch\"opf, all rights reserved. +% +%\fi +% \GetFileInfo{lthyphen.dtx} +% \title{The \texttt{lthyphen.dtx} file\thanks +% {This file has version number \fileversion, dated \filedate.}\\ +% for use with \LaTeXe} +% \author{Frank Mittelbach, Chris Rowley \and Rainer Sch\"opf} +% +% \def\dst{{\normalfont\scshape docstrip}} +% \setcounter{StandardModuleDepth}{1} +% +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% This file contains the code for loading hyphenation patterns into +% \LaTeX. Most of this will end up in a file called +% \texttt{hyphen.ltx}. If you wish to customize your \LaTeX{} system +% in respect of hyphenation patterns, write a file +% \texttt{hyphen.cfg}. If this file exists, it will be loaded instead +% of \texttt{hyphen.ltx}. See the comments below for additional +% information. +% +% \StopEventually{} +% +% To produce the printed version of this file the following code +% is used. It can be extracted with the \dst{} program, or one can run +% this file directly through \LaTeXe{}. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\begin{document} +\DocInput{lthyphen.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \changes{v0.1c}{1994/03/07}{move the 2ekernel code to ltfinal.dtx} +% \changes{v1.0g}{1994/12/01}{Rename lthyphen.ltx/cfg to hyphen.ltx/cfg} +% \changes{v1.0h}{1994/12/04}{Documentation edits for /1989} +% +% The default file |hyphen.ltx| loads hyphenation patterns for US +% english. If you want to load additional or other hyphenation +% patterns, you should create a file |hyphen.cfg|. This is best done +% by starting from |hyphen.ltx|. +% +% For backward compatibility, the default file, |hyphen.ltx|, +% first tries to load +% the file |hyphen.tex|. If this file exists, an information +% message is issued and the appropriate defaults for \TeX's internal +% parameters are set: |\language| is initialized to $0$, and +% |\lefthyphenmin| and |\righthyphenmin| to $2$ and $3$, respectively, +% to disallow x- or -xx breaks. +% \begin{macrocode} +%<*default> +\InputIfFileExists{hyphen.tex}% + {\message{Loading hyphenation patterns for US english.}% + \language=0 + \lefthyphenmin=2 \righthyphenmin=3 }% +% \end{macrocode} +% Otherwise, since we cannot do anything without any hyphenation +% patterns, an error message is printed and the Ini\TeX{} run +% is terminated by invoking |\@@end| (which is the \LaTeXe{} name +% for \TeX's |\end| primitive). +% \begin{macrocode} + {\errhelp{The configuration for hyphenation is incorrectly + installed.^^J% + If you don't understand this error message you need + to seek^^Jexpert advice.}% + \errmessage{OOPS! I can't find any hyphenation patterns for + US english.^^J \space Think of getting some or the + latex2e setup will never succeed}\@@end} +%</default> +% \end{macrocode} +% The following example describes the possible contents of a file +% |hyphen.cfg| that will load both US English and German hyphenation +% patterns, making the former the default. +% It sets |\language| to $0$ for the US patterns and to $1$ for the +% German patterns. +% Then |\language| is set to $0$ to make this the default and the +% default values of |\lefthyphenmin| and |\righthyphenmin| are set. +% \begin{verbatim} +%\language=0 +%\input hyphen % (or \input ushyphen1 if the file has been renamed) +%\language=1 +%\input ghyph31 +%\language=0 +%\lefthyphenmin=2 +%\righthyphenmin=3 +%\endinput +%\end{verbatim} +% +% Another possibility is to use the package |babel|, by Johannes Braams. +% That package is distributed with a suitable |hyphen.cfg| file. +% +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx b/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx new file mode 100644 index 00000000000..cb46fde90a8 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltidxglo.dtx @@ -0,0 +1,217 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltidxglo.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltidxglo.dtx} + [1996/01/20 v1.1e LaTeX Kernel (Index and Glossary)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltidxglo.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Index and Glossary Generation} +% Index and Glossary commands. +% +% \DescribeMacro{\makeindex} A preamble command to turn on indexing. +% +% \DescribeMacro{\makeglossary} A preamble command to turn on making +% glossary entries. +% +% \DescribeMacro{\index} Make an index entry for |#1|. +% +% \DescribeMacro{\glossary} Make a glossary entry for |#1|. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/31}{Initial version of ltidxbib.dtx, +% split from ltherest.dtx} +% \changes{v1.1a}{1994/05/19}{Initial version of ltidxglo.dtx, +% split from ltidxbib.dtx} +% \changes{v1.1d}{1995/10/25}{Doc cleanup} +% +% +% \begin{oldcomments} +% \makeindex == +% BEGIN +% \index == BEGIN \@bsphack +% \begingroup +% \protect{X} == \string X\space +% %% added 3 Feb 87 for \index commands +% %% in \footnotes +% re-\catcode special characters +% to 'other' +% \@wrindex +% END +% +% \@wrindex{ITEM} == +% BEGIN +% write of {\indexentry{ITEM}{page number}} +% \endgroup +% \@esphack +% END +% +% INITIALIZATION: +% +% \index == BEGIN \@bsphack +% \begingroup +% re-\catcode special characters (in case '%' there) +% \@index +% END +% +% \@index{ITEM} == BEGIN \endgroup \@esphack END +% +% Changes made 14 Apr 89 to write \glossaryentry's instead of +% \indexentry's on the .glo file. +% \end{oldcomments} +% +% \begin{macrocode} +%<*2ekernel> +\message{index,} +% \end{macrocode} +% +% \changes{v1.1b}{1994/11/04}{Removed \cs{if@filesw} from +% \cs{makeindex}.} +% +% \begin{macro}{\makeindex} +% \begin{macrocode} +\def\makeindex{% + \newwrite\@indexfile + \immediate\openout\@indexfile=\jobname.idx + \def\index{\@bsphack\begingroup + \@sanitize + \@wrindex}\typeout + {Writing index file \jobname.idx}% +% \end{macrocode} +% \changes{v1.1e}{1996/01/20}{Make no-op after use pr/2048} +% Opening the write channel should be done only once +% since on some OS multiple opens are forbidden and in +% any case it is useless. So we turn this into a no-op after +% use. +% \begin{macrocode} + \let\makeindex\@empty +} +\@onlypreamble\makeindex +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@wrindex} +% \changes{v1.1b}{1994/11/04}{Added \cs{protected@write} to +% \cs{@wrindex}.} +% \begin{macrocode} +\def\@wrindex#1{% + \protected@write\@indexfile{}% + {\string\indexentry{#1}{\thepage}}% + \endgroup + \@esphack} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\index} +% \begin{macrocode} +\def\index{\@bsphack\begingroup \@sanitize\@index} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@index} +% \begin{macrocode} +\def\@index#1{\endgroup\@esphack} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makeglossary} +% \changes{v1.1b}{1994/11/04}{Removed \cs{if@filesw} from +% \cs{makeglossary}.} +% \begin{macrocode} +\def\makeglossary{% + \newwrite\@glossaryfile + \immediate\openout\@glossaryfile=\jobname.glo + \def\glossary{\@bsphack\begingroup + \@sanitize + \@wrglossary}\typeout + {Writing glossary file \jobname.glo }% +% \end{macrocode} +% \changes{v1.1e}{1996/01/20}{Make no-op after use pr/2048} +% Opening the write channel should be done only once +% since on some OS multiple opens are forbidden and in +% any case it is useless. So we turn this into a no-op after +% use. +% \begin{macrocode} + \let\makeglossary\@empty +} +\@onlypreamble\makeglossary +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@wrglossary} +% \changes{v1.1b}{1994/11/04}{Added \cs{protected@write} to +% \cs{@wrglossary}.} +% \begin{macrocode} +\def\@wrglossary#1{% + \protected@write\@glossaryfile{}% + {\string\glossaryentry{#1}{\thepage}}% + \endgroup + \@esphack} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\glossary} +% \begin{macrocode} +\def\glossary{\@bsphack\begingroup\@sanitize\@index} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltlength.dtx b/Master/texmf-dist/source/latex-dev/base/ltlength.dtx new file mode 100644 index 00000000000..fab7c6fdd2b --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltlength.dtx @@ -0,0 +1,167 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltlength.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltlength.dtx} + [2015/01/08 v1.1c LaTeX Kernel (Lengths)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltlength.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0c}{1994/03/29} +% {Create file ltcntlen from parts of ltmiscen and ltherest.} +% \changes{v1.1a}{1994/05/19} +% {Extract file ltlength from ltcntlen.} +% \changes{v1.1b}{1995/08/11} +% {Doc typos fixed for latex/753} +% +% \section{Lengths} +% +% \DescribeMacro{\newlength} +% Declare |#1| to be a new length command. +% +% \DescribeMacro{\setlength} +% Set the length command, |#1|, to the value |#2|. +% +% \DescribeMacro{\addtolength} +% Increase the value of the length command, |#1|, by the value |#2|. +% +% \DescribeMacro{\settowidth} +% Set the length, |#1| to the width of a box containing |#2|. +% +% \DescribeMacro{\settoheight} +% Set the length, |#1| to the height of a box containing |#2|. +% +% \DescribeMacro{\settodepth} +% Set the length, |#1| to the depth of a box containing |#2|. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +\message{lengths,} +% \end{macrocode} +% +% \begin{macro}{\newlength} +% \begin{macrocode} +\def\newlength#1{\@ifdefinable#1{\newskip#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setlength} +% \changes{v1.1c}{2015/01/08}{add = to ensure first length argument is terminated. +% (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\setlength}{Using \setlength with \dimen0}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% \begin{macrocode} +\def\setlength#1#2{#1 #2\relax} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\setlength}{Using \setlength with \dimen0}% +%<latexrelease>\def\setlength#1#2{#1#2\relax} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addtolength} +% |\relax| added 24 Mar 86 +% \begin{macrocode} +\def\addtolength#1#2{\advance#1 #2\relax} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\settoheight} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \begin{macro}{\settodepth} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \begin{macro}{\settowidth} +% \begin{macro}{\@settodim} +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \changes{v1.0a}{1994/03/07}{(DPC) Extra group for colour} +% The obvious analogs of |\settowidth|. +% \begin{macrocode} +\def\@settodim#1#2#3{\setbox\@tempboxa\hbox{{#3}}#2#1\@tempboxa +% \end{macrocode} +% Clear the memory afterwards (which might be a lot). +% \begin{macrocode} + \setbox\@tempboxa\box\voidb@x} +\def\settoheight{\@settodim\ht} +\def\settodepth {\@settodim\dp} +\def\settowidth {\@settodim\wd} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@settopoint} +% This macro takes the contents of the skip register that is +% supplied as its argument and removes the fractional part to make +% it a whole number of points. This can be used in class files to +% avoid values like |345.4666666pt| when calulating a dimension. +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \begin{macrocode} +\def\@settopoint#1{\divide#1\p@\multiply#1\p@} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltlists.dtx b/Master/texmf-dist/source/latex-dev/base/ltlists.dtx new file mode 100644 index 00000000000..d59b7ac4f48 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltlists.dtx @@ -0,0 +1,1097 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltlists.dtx +%<*driver> +% \fi +\ProvidesFile{ltlists.dtx} + [2015/05/10 v1.0t LaTeX Kernel (List Environments)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltlists.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Tobias Oetiker\thanks{Tobi has converted the documentation to + doc.sty standard}\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0b}{1994/03/28}{Improve documentation} +% \changes{v1.0f}{1994/05/21}{Use new error commands} +% \changes{v1.0f}{1995/05/21}{Moved to doc.sty standard} +% +% \section{List, and related environments} +% +% The generic commands for creating an indented environment -- +% |enumerate|, |itemize|, |quote|, etc -- are: +% \begin{quote} +% |\list|\marg{LABEL}\marg{COMMANDS} ... |\endlist| +% \end{quote} +% +% which can be invoked by the user as the list environment. The LABEL +% argument specifies item labeling. COMMANDS contains commands for +% changing the horizontal and vertical spacing parameters. +% +% Each item of the environment is begun by the command +% |\item[|ITEMLABEL|]| +% which produces an item labeled by ITEMLABEL. If the argument is +% missing, then the LABEL argument of the |\list| command is used as the +% item label. +% +% The label is formed by putting |\makelabel|\marg{ITEMLABEL} in an hbox +% whose width is either its natural width or else |\labelwidth|, +% whichever is larger. The |\list| command defines |\makelabel| to have +% the default definition: +% \begin{quote} +% |\makelabel|\marg{ARG} == BEGIN |\hfil| ARG END +% \end{quote} +% which, for a label of width less than |\labelwidth|, puts the label +% flushright, |\labelsep| to the left of the item's text. However, +% |\makelabel| can be |\let| to another command by the |\list|'s +% COMMANDS argument. +% +% A |\usecounter|\marg{foo} command in the second argument causes the +% counter \emph{foo} to be initialized to zero, and stepped by every +% |\item| command without an argument. (|\label| commands within the +% list refer to this counter.) +% +% When you leave a list environment, returning either to an enclosing +% list or normal text mode, LaTeX begins a new paragraph if and only if +% you leave a blank line after the |\end| command. This is accomplished +% by the |\@endparenv| command. +% +% Blank lines are ignored every other reasonable place--i.e.: +% \begin{itemize} +% \item Between the |\begin{list}| and the first |\item|, +% \item Between the |\item| and the text of that item. +% \item Between the end of the last item and the |\end{list}|. +% \end{itemize} +% +% For an environment like quotation, in which items are not labeled, +% the entire environment is a single item. It is defined by +% letting |\quotation| == |\list{}{...}\item\relax|. (Note the +% |\relax|, there in case the first character in the environment is a +% '['.) The spacing parameters provide a great deal of flexability in +% designing the format, including the ability to let the indentation of +% the first paragraph be different from that of the subsequent ones. +% +% The trivlist environment is equivalent to a list environment +% whose second argument sets the following parameter values: +% \begin{description} +% \item[\cs{leftmargin} = 0:] causes no indentation of left margin +% \item[\cs{labelwidth} = 0:] see below for precise effect this has. +% \item[\cs{itemindent} = 0:] with a null label, makes first paragraph +% have no indentation. Succeeding paragraphs have |\parindent| +% indentation. To give first paragraph same indentation, set +% |\itemindent| = |\parindent| before the |\item[]|. +% \end{description} +% +% Every |\item| in a trivlist environment must have an argument---in +% many cases, this will be the null argument (|\item[]|). The trivlist +% environment is mainly used for paragraphing environments, like +% verbatim, in which there is no margin change. It provides the same +% vertical spacing as the list environment, and works reasonably well +% when it occurs immediately after an |\item| command in an enclosing +% list. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/07}{Initial version, split from latex.dtx} +% \changes{v1.0a}{1994/03/07}{Long lines wrapped to 72 columns} +% +% +% \subsection{List and Trivlist} +% +% +% The following variables are used inside a list environment: +% \begin{description} +% \item[\cs{@totalleftmargin}] The distance that the prevailing left +% margin is indented from the outermost left margin, +% \item[\cs{linewidth}] The width of the current line. Must be +% initialized to |\hsize|. +% \item[\cs{@listdepth}] A count for holding current list nesting depth. +% \item[\cs{makelabel}] A macro with a single argument, used to +% generate the label from the argument (given or implied) +% of the |\item| command. Initialized to |\@mklab| by the |\list| +% command. This command must produce some stretch---i.e., an +% |\hfil|. +% \item[\cs{@inlabel}] A switch that is false except between the time +% an |\item| is encountered and the time that \TeX{} +% actually enters horizontal mode. Should be tested by commands +% that can be messed up by the list environment's use of |\everypar|. +% \item[\cs{box}\cs{@labels}] When |@inlabel = true|, it holds the labels +% to be put out by |\everypar|. +% \item[\texttt{@noparitem}] A switch set by |\list| when +% |@inlabel = true|. +% Handles the case of a |\list| being the first thing in an item. +% \item[\texttt{@noparlist}] A switch set true for a list that begins an +% item. No |\topsep| space is added before or after |\item|'s such a +% list. +% \item[\texttt{@newlist}] Set true by |\list|, set false by the first +% text (by |\everypar|). +% \item[\texttt{@noitemarg}] Set true when executing an |\item| with no +% explicit argument. Used to save space. To save time, make two +% separate |\@item| commands. +% \item[\texttt{@nmbrlist}] Set true by |\usecounter| command, causes +% list to be numbered. +% \item[\cs{@listctr}] |\def|'ed by |\usecounter| to name of counter. +% \item[\cs{@noskipsec}] A switch set true by a sectioning command when +% it is creating an in-text heading with |\everypar|. +% \end{description} +% +% Throughout a list environment, |\hsize| is the width of the current +% line, measured from the outermost left margin to the outermost right +% margin. Environments like tabbing should use |\linewidth| instead of +% |\hsize|. +% +% Here are the parameters of a list that can be set by commands in +% the |\list|'s COMMANDS argument. These parameters are all TeX +% skips or dimensions (defined by |\newskip| or |\newdimen|), so the +% usual \TeX\ or \LaTeX\ commands can be used to set them. The +% commands will be executed in vmode if and only if the |\list| was +% preceded by a |\par| (or something like an |\end{list}|), so the +% spacing parameters can be set according to whether the list is +% inside a paragraph or is its own paragraph. +% +% +% \subsection{Vertical Spacing (skips)} +% \begin{description} +% \item[\cs{topsep}:] Space between first item and preceding paragraph. +% \item[\cs{partopsep}:] Extra space added to \cs{topsep} when +% environment starts a new paragraph (is called in vmode). +% \item[\cs{itemsep}:] Space between successive items. +% \item[\cs{parsep}:] Space between paragraphs within an item -- the +% \cs{parskip} for this environment. +% \end{description} +% +% \subsection{Penalties} +% \begin{description} +% +% \item[\cs{@beginparpenalty}:] put at the beginning of a list +% \item[\cs{@endparpenalty}:] put at end of list +% \item[\cs{@itempenalty}:] put between items. +% \end{description} +% +% \subsection{Horizontal Spacing (dimens)} +% \begin{description} +% \item[\cs{leftmargin}:] space between left margin of enclosing +% environment (or of page if top level list) and left margin of +% this list. Must be nonnegative. +% \item[\cs{rightmargin}:] analogous. +% \item[\cs{listparindent}:] extra indentation at beginning of every +% paragraph of a list except the one started by the \cs{item} +% command. May be negative! Usually, labeled +% lists have \cs{listparindent} equal to zero. +% \item[\cs{itemindent}:] extra indentation added right BEFORE an item +% label. +% \item[\cs{labelwidth}:] nominal width of box that contains the label. +% If the natural width of the +% label $< =$ \cs{labelwidth}, +% then the label is flushed right inside a box +% of width \cs{labelwidth} (with an \cs{hfil}). +% Otherwise, +% a box of the natural width is employed, which +% causes an indentation of the text on that line. +% \item[\cs{labelsep}:] space between end of label box and text of +% first item. +% \end{description} +% \subsection{Default Values} +% Defaults for the list environment are set as follows. +% First, \cs{rightmargin}, \cs{listparindent} and \cs{itemindent} +% are set +% to 0pt. Then, one of the commands +% \cs{@listi}, \cs{@listii}, ... , \cs{@listvi} +% is called, depending upon the current level of the list. +% The \cs{@list} \ldots commands should be defined by the document +% style. A convention that the document style should follow is +% to set \cs{leftmargin} to +% \cs{leftmargini},\ldots, \cs{leftmarginvi} for +% the appropriate level. Items that aren't changed may be left +% alone, but everything that could possibly be changed must be +% reset. +% \begin{oldcomments} +% \list{LABEL}{COMMANDS} == +% BEGIN +% if \@listdepth > 5 +% then LaTeX error: 'Too deeply nested' +% else \@listdepth :=G \@listdepth + 1 +% fi +% \rightmargin := 0pt +% \listparindent := 0pt +% \itemindent := 0pt +% \eval(@list \romannumeral\the\@listdepth) %% Set default values: +% \@itemlabel :=L LABEL +% \makelabel == \@mklab +% @nmbrlist :=L false +% COMMANDS +% +% \@trivlist % commands common to \list and \trivlist +% +% \parskip :=L \parsep +% \parindent :=L \listparindent +% \linewidth :=L \linewidth - \rightmargin -\leftmargin +% \@totalleftmargin :=L \@totalleftmargin + \leftmargin +% \parshape 1 \@totalleftmargin \linewidth +% \ignorespaces % gobble space up to \item +% END +% +% \endlist == BEGIN \@listdepth :=G \@listdepth -1 +% \endtrivlist +% END +% +% \@trivlist == +% BEGIN +% if @newlist = T then \@noitemerr fi +% %% This command removed for some forgotten reason. +% \@topsepadd :=L \topsep +% if @noskipsec then leave vertical mode fi %% Added 11 Jun 85 +% if vertical mode +% then \@topsepadd :=L \@topsepadd + \partopsep +% else \unskip \par % remove glue from end of last line +% fi +% if @inlabel = true +% then @noparitem :=L true +% @noparlist :=L true +% else @noparlist :=L false +% \@topsep :=L \@topsepadd +% fi +% \@topsep :=L \@topsep + \parskip %% Change 4 Sep 85 +% \leftskip :=L 0pt % Restore paragraphing parameters +% \rightskip :=L \@rightskip +% \parfillskip :=L 0pt + 1fil +% +% NOTE: \@setpar called on every \list in case \par has been +% temporarily munged before the \list command. +% \@setpar{if @newlist = false then {\@@par} fi} +% \@newlist :=G T +% \@outerparskip :=L \parskip +% END +% +% \trivlist == +% BEGIN +% \parsep := \parskip +% @nmbrlist := F +% \@trivlist +% \labelwidth := 0 +% \leftmargin := 0 +% \itemindent := \parindent +% \@itemlabel :=L "empty" %% added 93/12/13 +% \makelabel{LABEL} == LABEL +% END +% +% \endtrivlist == +% BEGIN +% if @inlabel = T then \indent fi +% if horizontal mode then \unskip \par fi +% if @noparlist = true +% else if \lastskip > 0 +% then \@tempskipa := \lastskip +% \vskip - \lastskip +% \vskip \@tempskipa -\@outerparskip + \parskip +% fi +% \@endparenv +% fi +% END +% +% \@endparenv == +% BEGIN +% \addpenalty{@endparpenalty} +% \addvspace{\@topsepadd} +% \endgroup %% ends the \begin command's \begingroup +% \par == BEGIN +% \@restorepar +% \everypar{} +% \par +% END +% \everypar == BEGIN remove \lastbox \everypar{} END +% \begingroup %% to match the \end commands \endgroup +% END +% +% \item == BEGIN if math mode then WARNING fi +% if next char = [ +% then \@item +% else @noitemarg := true +% \@item[@itemlabel] +% END +% +% \@item[LAB] == +% BEGIN +% if @noparitem = true +% then @noparitem := false +% % NOTE: then clause hardly every taken, +% % so made a macro \@donoparitem +% \box\@labels :=G \hbox{\hskip -\leftmargin +% \box\@labels +% \hskip \leftmargin } +% if @minipage = false then +% \@tempskipa := \lastskip +% \vskip -\lastskip +% \vskip \@tempskipa + \@outerparskip - \parskip +% fi +% else if @inlabel = true +% then \indent \par % previous item empty. +% fi +% if hmode then 2 \unskip's +% % To remove any space at end of prev. +% % paragraph that could cause a blank line. +% \par +% fi +% if @newlist = T +% then if @nobreak = T % Kludge if list follows \section +% then \addvspace{\@outerparskip - \parskip} +% else \addpenalty{\@beginparpenalty} +% \addvspace{\@topsep} +% \addvspace{-\parskip} %% added 4 Sep 85 +% fi +% else \addpenalty{\@itempenalty} +% \addvspace{\itemsep} +% fi +% @inlabel :=G true +% fi +% +% \everypar{ @minipage :=G F +% @newlist :=G F +% if @inlabel = true +% then @inlabel :=G false +% \hskip -\parindent +% \box\@labels +% \penalty 0 +% %% 3 Oct 85 -- allow line break here +% \box\@labels :=G null +% fi +% \everypar{} } +% @nobreak :=G false +% if @noitemarg = true +% then @noitemarg := false +% if @nmbrlist +% then \refstepcounter{\@listctr} +% fi fi +% \@tempboxa :=L \hbox{\makelabel{LAB}} +% \box\@labels :=G \@labels \hskip \itemindent +% \hskip - (\labelwidth + \labelsep) +% if \wd \@tempboxa > \labelwidth +% then \box\@tempboxa +% else \hbox to \labelwidth {\unhbox\@tempboxa} +% fi +% \hskip\labelsep +% \ignorespaces %gobble space up to text +% END +% +% \makelabel{LABEL} == ERROR %% default to catch lonely \item +% +% +% \usecounter{CTR} == BEGIN @nmbrlist :=L true +% \@listctr == CTR +% \setcounter{CTR}{0} +% END +% +% DEFINE \dimen's and \count +% \end{oldcomments} +% \begin{macro}{\topskip} +% \begin{macro}{\partopsep} +% \begin{macro}{\itemsep} +% \begin{macro}{\parsep} +% \begin{macro}{\@topsep} +% \begin{macro}{\@topsepadd} +% \begin{macro}{\outerparskip} +% \begin{macrocode} +%<*2ekernel> +\newskip\topsep +\newskip\partopsep +\newskip\itemsep +\newskip\parsep +\newskip\@topsep +\newskip\@topsepadd +\newskip\@outerparskip +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} +% \end{macro} +% \begin{macro}{\leftmargin}\begin{macro}{\rightmargin} +% \begin{macro}{\listparindent}\begin{macro}{\itemindent} +% \begin{macro}{\labelwidth}\begin{macro}{\labelsep} +% \begin{macro}{\@totalleftmargin} +% \begin{macrocode} +\newdimen\leftmargin +\newdimen\rightmargin +\newdimen\listparindent +\newdimen\itemindent +\newdimen\labelwidth +\newdimen\labelsep +\newdimen\linewidth +\newdimen\@totalleftmargin \@totalleftmargin=\z@ +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro} +% \end{macro}\end{macro} +% +% \begin{macro}{\leftmargini} +% \begin{macro}{\leftmarginii} +% \begin{macro}{\leftmarginiii} +% \begin{macro}{\leftmarginiv} +% \begin{macro}{\leftmarginv} +% \begin{macro}{\leftmarginvi} +% \begin{macrocode} +\newdimen\leftmargini +\newdimen\leftmarginii +\newdimen\leftmarginiii +\newdimen\leftmarginiv +\newdimen\leftmarginv +\newdimen\leftmarginvi +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\@listdepth}\begin{macro}{\@itempenalty} +% \begin{macro}{\@beginparpenalty}\begin{macro}{\@endparpenalty} +% \begin{macrocode} +\newcount\@listdepth \@listdepth=0 +\newcount\@itempenalty +\newcount\@beginparpenalty +\newcount\@endparpenalty +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\@labels} +% \begin{macrocode} +\newbox\@labels +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@inlabel} +% \begin{macro}{\@inlabelfalse} +% \begin{macro}{\@inlabeltrue} +% \begin{macrocode} +\newif\if@inlabel \@inlabelfalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\if@newlist} +% \begin{macro}{\@newlistfalse} +% \begin{macro}{\@newlisttrue} +% \begin{macrocode} +\newif\if@newlist \@newlistfalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\if@noparitem} +% \begin{macro}{\@noparitemfalse} +% \begin{macro}{\@noparitemtrue} +% \begin{macrocode} +\newif\if@noparitem \@noparitemfalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\if@noparlist} +% \begin{macro}{\@noparlistfalse} +% \begin{macro}{\@noparlisttrue} +% \begin{macrocode} +\newif\if@noparlist \@noparlistfalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\if@noitemarg} +% \begin{macro}{\@noitemargfalse} +% \begin{macro}{\@noitemargtrue} +% \begin{macrocode} +\newif\if@noitemarg \@noitemargfalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\if@newlist} +% \begin{macro}{\@newlistfalse} +% \begin{macro}{\@newlisttrue} +% \begin{macrocode} +\newif\if@nmbrlist \@nmbrlistfalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\list} +% \begin{macrocode} +\def\list#1#2{% + \ifnum \@listdepth >5\relax + \@toodeep + \else + \global\advance\@listdepth\@ne + \fi + \rightmargin\z@ + \listparindent\z@ + \itemindent\z@ + \csname @list\romannumeral\the\@listdepth\endcsname + \def\@itemlabel{#1}% + \let\makelabel\@mklab + \@nmbrlistfalse + #2\relax + \@trivlist + \parskip\parsep + \parindent\listparindent + \advance\linewidth -\rightmargin + \advance\linewidth -\leftmargin + \advance\@totalleftmargin \leftmargin + \parshape \@ne \@totalleftmargin \linewidth + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\par@deathcycles} +% \begin{macrocode} +\newcount\par@deathcycles +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@trivlist} +% \changes{v1.0e}{1994/12/02}{RmS: Added check for looping} +% \changes{v1.0p}{1996/10/31}{Added check for missing item in outer +% list} +% \changes{v1.0q}{1996/11/04}{Moved check for missing item: only checked +% when not inlabel flag is false} +% Because |\par| is sometimes made a no-op it is possible for a missing +% |\item| to produce a loop that does not fill memory and so never gets +% trapped by \TeX. We thus need to trap this here by seting |\par| to +% count the number of times a paragraph ii is called with no progress +% being made started. +% \begin{macrocode} +\def\@trivlist{% + \if@noskipsec \leavevmode \fi + \@topsepadd \topsep + \ifvmode + \advance\@topsepadd \partopsep + \else + \unskip \par + \fi + \if@inlabel + \@noparitemtrue + \@noparlisttrue + \else + \if@newlist \@noitemerr \fi + \@noparlistfalse + \@topsep \@topsepadd + \fi + \advance\@topsep \parskip + \leftskip \z@skip + \rightskip \@rightskip + \parfillskip \@flushglue + \par@deathcycles \z@ + \@setpar{\if@newlist + \advance\par@deathcycles \@ne + \ifnum \par@deathcycles >\@m + \@noitemerr + {\@@par}% + \fi + \else + {\@@par}% + \fi}% + \global \@newlisttrue + \@outerparskip \parskip} +% \end{macrocode} +% \end{macro} +% +% \changes{0.0}{1992/03/18}{RmS: added \cs{@nmbrlistfalse}} +% \begin{macro}{\trivlist} +% \begin{macrocode} +\def\trivlist{% + \parsep\parskip + \@nmbrlistfalse + \@trivlist + \labelwidth\z@ + \leftmargin\z@ + \itemindent\z@ +% \end{macrocode} +% +% We initialise |\@itemlabel| so that a \texttt{trivlist} with +% an |\item| not having an optional argument doesn't produce an +% error message. +% \changes{latex2e}{1993/12/13}{Initialised \cs{@itemlabel}} +% \begin{macrocode} + \let\@itemlabel\@empty + \def\makelabel##1{##1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endlist} +% \begin{macrocode} +\def\endlist{% + \global\advance\@listdepth\m@ne + \endtrivlist} +% \end{macrocode} +% \end{macro} +% +% The definition of \cs{trivlist} used to be in ltspace.dtx +% so that other commands could be `let to it'. +% They now use \cs{def}. +% \begin{macro}{\endtrivlist} +% \changes{v1.2b ltspace}{1994/11/12}{Changed order of tests to make +% \cs{@noitemerror} correct: end of an era.} +% \changes{v1.0i}{1995/05/25}{Macros moved from ltspace.dtx} +% \changes{v1.0n}{1996/10/25}{Change \cs{indent} to \cs{leavevmode}} +% \changes{v1.0n}{1996/10/25}{Reset flags explicitly} +% \changes{v1.0o}{1996/10/26}{Correct typo} +% \begin{macrocode} +\def\endtrivlist{% + \if@inlabel + \leavevmode + \global \@inlabelfalse + \fi + \if@newlist + \@noitemerr + \global \@newlistfalse + \fi + \ifhmode\unskip \par +% \end{macrocode} +% We also check if we are in math mode and issue an error message +% if so (hoping that |\@currenvir| resolves suitably). Otherwise +% the usual ``perhaps a missing item'' error will get triggered +% later which is confusing. +% \changes{v1.0s}{2002/10/28}{Check for math mode (pr/3437)} +% \begin{macrocode} + \else + \@inmatherr{\end{\@currenvir}}% + \fi + \if@noparlist \else + \ifdim\lastskip >\z@ + \@tempskipa\lastskip \vskip -\lastskip + \advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip + \vskip\@tempskipa + \fi + \@endparenv + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@endparenv} +% \begin{macro}{\@doendpe} +% To suppress the paragraph indentation in text immediately following +% a paragraph-making environment, \cs{everypar} is changed to remove the +% space, and \cs{par} is redefined to restore \cs{everypar}. Instead of +% redefining \cs{par} and \cs{everypar}, \cs{@endparenv} was changed to +% set the @endpe switch, letting \cs{end} redefine \cs{par} and +% \cs{everypar}. +% +% This allows paragraph-making environments to work right when called +% by other environments. (Changed 27 Oct 86) +% \begin{macrocode} +\def\@endparenv{% + \addpenalty\@endparpenalty\addvspace\@topsepadd\@endpetrue} +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}{\@doendpe}{clubpenalty fix}% +\def\@doendpe{\@endpetrue + \def\par{\@restorepar +% \end{macrocode} +% If a section heading changes |\clubpenalty| to keep lines +% after it together then this modification is restored via the +% |\everypar| mechanism at the start of the next paragraph. As we +% destroy the contents of this token here we explicity set +% |\clubpenalty| back to its default. +% \changes{v1.0t}{2015/05/10}{Explicitly reset \cs{clubpenalty} before +% clearing \cs{everypar}; see also pr/0462 and pr/4065} +% \begin{macrocode} + \clubpenalty\@clubpenalty + \everypar{}\par\@endpefalse}\everypar +% \end{macrocode} +% +% Use |\setbox0=\lastbox| instead of |\hskip -\parindent| +% so that a \cs{noindent} becomes a no-op when used before +% a line immediately following a list environment(23 Oct 86). +% \changes{v1.0k}{1995/11/07}{Enclosed \cs{setbox0} assignment by a +% group so that it leaves the contents of box $0$ intact.} +% \begin{macrocode} + {{\setbox\z@\lastbox}% + \everypar{}\@endpefalse}} +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{0000/00/00}{\@doendpe}{clubpenalty fix}% +%<latexrelease>\def\@doendpe{\@endpetrue +%<latexrelease> \def\par{\@restorepar\everypar{}\par\@endpefalse}\everypar +%<latexrelease> {{\setbox\z@\lastbox}\everypar{}\@endpefalse}} +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\if@endpe} +% \begin{macro}{\@endpefalse} +% \begin{macro}{\@endpeltrue} +% \begin{macrocode} +\newif\if@endpe +\@endpefalse +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% +% \begin{macro}{\@mklab} +% \begin{macrocode} +\def\@mklab#1{\hfil #1} +% \end{macrocode} +% \end{macro} +% +% \changes{LaTeX2.09}{1992/09/18} +% {(RmS) Added warning if \cs{item} is used in math mode} +% \changes{v1.0c}{1994/04/28} +% {Replaced \cs{@ltxnomath} by \cs{@inmatherr}} +% \changes{v1.0d}{1994/05/03} +% {Removed superfluous braces} +% \begin{macro}{\item} +% \begin{macrocode} +\def\item{% + \@inmatherr\item + \@ifnextchar [\@item{\@noitemargtrue \@item[\@itemlabel]}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@donoparitem} +% \begin{macrocode} +\def\@donoparitem{% + \@noparitemfalse + \global\setbox\@labels\hbox{\hskip -\leftmargin + \unhbox\@labels + \hskip \leftmargin}% + \if@minipage\else + \@tempskipa\lastskip + \vskip -\lastskip + \advance\@tempskipa\@outerparskip + \advance\@tempskipa -\parskip + \vskip\@tempskipa + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@item} +% \changes{v1.0l}{1996/07/26}{Remove unecessary \cs{global} before +% \cs{@minipage...}} +% \begin{macrocode} +\def\@item[#1]{% + \if@noparitem + \@donoparitem + \else + \if@inlabel + \indent \par + \fi + \ifhmode + \unskip\unskip \par + \fi + \if@newlist + \if@nobreak + \@nbitem + \else + \addpenalty\@beginparpenalty + \addvspace\@topsep + \addvspace{-\parskip}% + \fi + \else + \addpenalty\@itempenalty + \addvspace\itemsep + \fi + \global\@inlabeltrue + \fi + \everypar{% + \@minipagefalse + \global\@newlistfalse +% \end{macrocode} +% This |\if@inlabel| check is needed in case an item starts of +% inside a group so that |\everypar| does not become empty +% outside that group. +% \@nobreakfalse, etc etc. +% \begin{macrocode} + \if@inlabel + \global\@inlabelfalse +% \end{macrocode} +% The paragraph indent is now removed by using |\setbox...| since +% this makes |\noindent| a no-op here, as it should be. Thus the +% following comment is redundant but is left here for the sake of +% future historians: +% this next command was changed from an hskip to a kern to avoid +% a break point after the parindent box: the skip could cause a +% line-break if a very long label occurs in raggedright setting. +% \changes{v1.0d}{1994/05/03}{\cs{hskip} changed to \cs{kern}} +% \changes{v1.0m}{1996/10/23}{\cs{kern...} changed to \cs{setbox...}} +% \changes{v1.0r}{1997/02/21} +% {\cs{ifvoid} check added for \cs{noindent}. latex/2414} +% If |\noindent| was used after |\item| want to cancel the |\itemindent| +% skip. This case can be detected as the indentation box will be void. +% \begin{macrocode} + {\setbox\z@\lastbox + \ifvoid\z@ + \kern-\itemindent + \fi}% +% \end{macrocode} +% +% \begin{macrocode} + \box\@labels + \penalty\z@ + \fi +% \end{macrocode} +% This code is intended to prevent a page break after the first +% line of an item that comes immediately after a section title. It +% may be sensible to always forbid a page break after one line of +% an item? As with all such settings of |\clubpenalty| it is local +% so will have no effect if the item starts in a group. +% +% Only resetting |\@nobreak| when it is true is now +% essential since now it is sometimes set locally. +% \changes{v1.0m}{1996/10/23}{Added setting of \cs{clubpenalty} and +% set \cs{@nobreakfalse} only when necessary} +% \begin{macrocode} + \if@nobreak + \@nobreakfalse + \clubpenalty \@M + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi}% +% \end{macrocode} +% \changes{v1.0l}{1996/07/26}{Remove unecessary \cs{global} before +% \cs{@nobreak...}} +% \changes{v1.0m}{1996/10/23}{\cs{@nobreak...} moved into the +% \cs{everypar} and not executed unconditionally, see above} +% \begin{macrocode} + \if@noitemarg + \@noitemargfalse + \if@nmbrlist +% \end{macrocode} +% \changes{v1.0g}{1995/05/17}{Removed surplus braces} +% \begin{macrocode} + \refstepcounter\@listctr + \fi + \fi +% \end{macrocode} +% We use |\sbox| to support colour commands. +% \changes{LaTeX2e}{1993/12/08}{use \cs{sbox} to support colour} +% \begin{macrocode} + \sbox\@tempboxa{\makelabel{#1}}% + \global\setbox\@labels\hbox{% + \unhbox\@labels + \hskip \itemindent + \hskip -\labelwidth + \hskip -\labelsep + \ifdim \wd\@tempboxa >\labelwidth + \box\@tempboxa +% \end{macrocode} +% \changes{LaTeX2.09}{1991/11/22} +% {(RmS) Changed second call to \cs{makelabel} to +% \cs{unhbox}\cs{@tempboxa}. +% Avoids problems with side effects in \cs{makelabel} and is +% more efficient.} +% \begin{macrocode} + \else + \hbox to\labelwidth {\unhbox\@tempboxa}% + \fi + \hskip \labelsep}% + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makelabel} +% \changes{LaTeX2.09}{1991/11/04} +% {(RmS) added default definition for \cs{makelabel}, +% to produce an error message.} +% \begin{macrocode} +\def\makelabel#1{% + \@latex@error{Lonely \string\item--perhaps a missing + list environment}\@ehc} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nbitem} +% \changes{v1.0g}{1995/05/17}{Removed surplus braces} +% \begin{macrocode} +\def\@nbitem{% + \@tempskipa\@outerparskip + \advance\@tempskipa -\parskip + \addvspace\@tempskipa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\usecounter} +% \begin{macrocode} +\def\usecounter#1{\@nmbrlisttrue\def\@listctr{#1}\setcounter{#1}\z@} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Itemize and Enumerate} +% +% Enumeration is done with four counters: |enumi|, |enumii|, |enumiii| +% and |enumiv|, where |enum|N controls the numbering of the Nth level +% enumeration. The label is generated by the commands +% \cs{labelenumi} \ldots{} \cs{labelenumiv}, which should be defined +% by the document style. +% Note that \cs{p@enum}N\cs{theenum}N defines the output +% of a \cs{ref} command. A typical definition might be: +% \begin{verbatim} +% \def\theenumii{\alph{enumii}} +% \def\p@enumii{\theenumi} +% \def\labelenumii{(\theenumii)} +% \end{verbatim} +% which will print the labels as `(a)', `(b)', \ldots +% and print a \cs{ref} as `3a'. +% +% The item numbers are moved to the right of the label box, so they are +% always a distance of \cs{labelsep} from the item. +% +% \cs{@enumdepth} holds the current enumeration nesting depth. +% +% Itemization is controlled by four commands: \cs{labelitemi}, +% \cs{labelitemii}, +% \cs{labelitemiii}, and \cs{labelitemiv}. +% To cause the second-level list to be +% bulleted, you just define \cs{labelitemii} +% to be $\bullet$. \cs{@itemspacing} +% and \cs{@itemdepth} are the analogs of \cs{@enumspacing} and +% \cs{@enumdepth}. +% +% \begin{oldcomments} +% \enumerate == +% BEGIN +% if \@enumdepth > 3 +% then errormessage: ``Too deeply nested''. +% else \@enumdepth :=L \@enumdepth + 1 +% \@enumctr :=L eval(enum@\romannumeral\the\@enumdepth) +% \list{\label(\@enumctr)} +% {\usecounter{\@enumctr} +% \makelabel{LABEL} == \hss \llap{LABEL}} +% fi +% END +% +% \endenumerate == \endlist +% \end{oldcomments} +% +% \begin{macro}{\@enumdepth} +% \begin{macrocode} +\newcount\@enumdepth \@enumdepth = 0 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@enumi} +% \begin{macro}{\c@enumii} +% \begin{macro}{\c@enumii} +% \begin{macro}{\c@enumiv} +% \begin{macrocode} +\@definecounter{enumi} +\@definecounter{enumii} +\@definecounter{enumiii} +\@definecounter{enumiv} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{environment}{enumerate} +% \changes{v1.0g}{1995/05/17}{Use \cs{thr@@} and remove surplus braces} +% \begin{macrocode} +\def\enumerate{% + \ifnum \@enumdepth >\thr@@\@toodeep\else + \advance\@enumdepth\@ne + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% +% \end{macrocode} +% +% \changes{v1.0j}{1995/07/09}{Use \cs{expandafter}} +% \begin{macrocode} + \expandafter + \list + \csname label\@enumctr\endcsname + {\usecounter\@enumctr\def\makelabel##1{\hss\llap{##1}}}% + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\let\endenumerate =\endlist +% \end{macrocode} +% \end{environment} +% +% +% \begin{oldcomments} +% \itemize == +% BEGIN +% if \@itemdepth > 3 +% then errormessage: 'Too deeply nested'. +% else \@itemdepth :=L \@itemdepth + 1 +% \@itemitem == eval(labelitem\romannumeral\the\@itemdepth) +% \list{\@nameuse{\@itemitem}} +% {\makelabel{LABEL} == \hss \llap{LABEL}} +% fi +% END +% +% \enditemize == \endlist +% +% \end{oldcomments} +% +% \begin{macro}{\@itemdepth} +% \begin{macrocode} +\newcount\@itemdepth \@itemdepth = 0 +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{itemize} +% \changes{v1.0g}{1995/05/17}{Use \cs{thr@@}} +% \begin{macrocode} +\def\itemize{% + \ifnum \@itemdepth >\thr@@\@toodeep\else + \advance\@itemdepth\@ne + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% +% \end{macrocode} +% +% \changes{v1.0j}{1995/07/09}{Use \cs{expandafter}} +% \begin{macrocode} + \expandafter + \list + \csname\@itemitem\endcsname + {\def\makelabel##1{\hss\llap{##1}}}% + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\let\enditemize =\endlist +%</2ekernel> +% \end{macrocode} +% \end{environment} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx b/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx new file mode 100644 index 00000000000..1754d066300 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltlogos.dtx @@ -0,0 +1,123 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltlogos.dtx +%<*driver> +% \fi +\ProvidesFile{ltlogos.dtx} + [1998/08/17 v1.1i LaTeX Kernel (Logos)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltlogos.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.1b}{1994/05/18}{(ASAJ) Added the \TeX{} logo.} +% \changes{v1.1b}{1994/05/18}{(ASAJ) Made the \LaTeXe{} logo use the +% text font `2' rather than the math font `2'.} +% \changes{v1.1i}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% \section{Logos} +% +% Various logos are defined here. +% +% \StopEventually{} +% +% \begin{macro}{\TeX} +% The \TeX{} logo, adjusted so that a full stop after the logo +% counts as ending a sentence. +% \begin{macrocode} +%<*2ekernel> +\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\LaTeX} +% The \LaTeX{} logo. +% \changes{LaTeX2e}{1993/11/24}{Macro changed} +% \changes{v1.0o}{1994/05/11}{Use \cs{DeclareProtectedCommand}. ASAJ.} +% \changes{v1.1d}{1994/06/01} +% {Add \cs{m@th} to force math size calculations} +% \changes{v1.1e}{1994/07/20}{Save a few tokens} +% +% \changes{v1.1h}{1997/10/08}{Simplify macro (force loading of +% suitable math fonts once).} +% \begin{macrocode} +\DeclareRobustCommand{\LaTeX}{L\kern-.36em% + {\sbox\z@ T% + \vbox to\ht\z@{\hbox{\check@mathfonts + \fontsize\sf@size\z@ + \math@fontsfalse\selectfont + A}% + \vss}% + }% + \kern-.15em% + \TeX} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.1c}{1994/05/26}{Remove \cs{SLiTeX} logo} +% +% \begin{macro}{\LaTeXe} +% The \LaTeXe\ logo as proposed by A-W designers. +% \changes{LaTeX2e}{1993/11/22}{Macro added} +% \changes{LaTeX2e}{1993/12/16}{Extended logo by DPC} +% \changes{v1.0o}{1994/05/11}{Use \cs{DeclareProtectedCommand}. ASAJ.} +% \changes{v1.1e}{1994/07/20}{Save a few tokens} +% \changes{v1.1f}{1997/05/29}{Added \cs{m@th} so that the \LaTeXe{} +% logo works with non-zero values of \cs{mathsurround}.} +% \begin{macrocode} +\DeclareRobustCommand{\LaTeXe}{\mbox{\m@th + \if b\expandafter\@car\f@series\@nil\boldmath\fi + \LaTeX\kern.15em2$_{\textstyle\varepsilon}$}} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx b/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx new file mode 100644 index 00000000000..5c2f30624d8 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltluatex.dtx @@ -0,0 +1,1788 @@ +% \iffalse meta-comment +% +% Copyright 2015 2017 2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% It may be distributed and/or modified under the conditions of +% the LaTeX Project Public License (LPPL), either version 1.3c of +% this license or (at your option) any later version. The latest +% version of this license is in the file: +% +% https://www.latex-project.org/lppl.txt +% +% +% +%<2ekernel>%%% From File: ltluatex.dtx +%<plain>\ifx\newluafunction\undefined\else\expandafter\endinput\fi +%<tex>\ifx +%<tex> \ProvidesFile\undefined\begingroup\def\ProvidesFile +%<tex> #1#2[#3]{\endgroup\immediate\write-1{File: #1 #3}} +%<tex>\fi +%<plain>\ProvidesFile{ltluatex.tex} +%<*driver> +\ProvidesFile{ltluatex.dtx} +%</driver> +%<*tex> +[2018/10/21 v1.1i +%</tex> +%<plain> LuaTeX support for plain TeX (core) +%<*tex> +] +\edef\etatcatcode{\the\catcode`\@} +\catcode`\@=11 +%</tex> +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{ltluatex.dtx} +\begin{document} +\title{\filename\\(Lua\TeX{}-specific support)} +\author{David Carlisle and Joseph Wright\footnote{Significant portions + of the code here are adapted/simplified from the packages \textsf{luatex} and + \textsf{luatexbase} written by Heiko Oberdiek, \'{E}lie Roux, + Manuel P\'{e}gouri\'{e}-Gonnar and Philipp Gesang.}} +\date{\filedate} +\maketitle +\setcounter{tocdepth}{2} +\tableofcontents +\DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Overview} +% +% Lua\TeX{} adds a number of engine-specific functions to \TeX{}. Several of +% these require set up that is best done in the kernel or need related support +% functions. This file provides \emph{basic} support for Lua\TeX{} at the +% \LaTeXe{} kernel level plus as a loadable file which can be used with +% plain \TeX{} and \LaTeX{}. +% +% This file contains code for both \TeX{} (to be stored as part of the format) +% and Lua (to be loaded at the start of each job). In the Lua code, the kernel +% uses the namespace |luatexbase|. +% +% The following |\count| registers are used here for register allocation: +% \begin{itemize} +% \item[\texttt{\string\e@alloc@attribute@count}] Attributes (default~258) +% \item[\texttt{\string\e@alloc@ccodetable@count}] Category code tables +% (default~259) +% \item[\texttt{\string\e@alloc@luafunction@count}] Lua functions +% (default~260) +% \item[\texttt{\string\e@alloc@whatsit@count}] User whatsits (default~261) +% \item[\texttt{\string\e@alloc@bytecode@count}] Lua bytecodes (default~262) +% \item[\texttt{\string\e@alloc@luachunk@count}] Lua chunks (default~263) +% \end{itemize} +% (|\count 256| is used for |\newmarks| allocation and |\count 257| +% is used for\linebreak +% |\newXeTeXintercharclass| with Xe\TeX{}, with code defined in +% \texttt{ltfinal.dtx}). +% With any \LaTeXe{} kernel from 2015 onward these registers are part of +% the block in the extended area reserved by the kernel (prior to 2015 the +% \LaTeXe{} kernel did not provide any functionality for the extended +% allocation area). +% +% \section{Core \TeX{} functionality} +% +% The commands defined here are defined for +% possible inclusion in a future \LaTeX{} format, however also extracted +% to the file |ltluatex.tex| which may be used with older \LaTeX\ +% formats, and with plain \TeX. +% +% \noindent +% \DescribeMacro{\newattribute} +% |\newattribute{|\meta{attribute}|}|\\ +% Defines a named \cs{attribute}, indexed from~$1$ +% (\emph{i.e.}~|\attribute0| is never defined). Attributes initially +% have the marker value |-"7FFFFFFF| (`unset') set by the engine. +% +% \noindent +% \DescribeMacro{\newcatcodetable} +% |\newcatcodetable{|\meta{catcodetable}|}|\\ +% Defines a named \cs{catcodetable}, indexed from~$1$ +% (|\catcodetable0| is never assigned). A new catcode table will be +% populated with exactly those values assigned by Ini\TeX{} (as described +% in the Lua\TeX{} manual). +% +% \noindent +% \DescribeMacro{\newluafunction} +% |\newluafunction{|\meta{function}|}|\\ +% Defines a named \cs{luafunction}, indexed from~$1$. (Lua indexes +% tables from $1$ so |\luafunction0| is not available). +% +% \noindent +% \DescribeMacro{\newwhatsit} +% |\newwhatsit{|\meta{whatsit}|}|\\ +% Defines a custom \cs{whatsit}, indexed from~$1$. +% +% \noindent +% \DescribeMacro{\newluabytecode} +% |\newluabytecode{|\meta{bytecode}|}|\\ +% Allocates a number for Lua bytecode register, indexed from~$1$. +% +% \noindent +% \DescribeMacro{\newluachunkname} +% |newluachunkname{|\meta{chunkname}|}|\\ +% Allocates a number for Lua chunk register, indexed from~$1$. +% Also enters the name of the regiser (without backslash) into the +% \verb|lua.name| table to be used in stack traces. +% +% \noindent +% \DescribeMacro{\catcodetable@initex} +% \DescribeMacro{\catcodetable@string} +% \DescribeMacro{\catcodetable@latex} +% \DescribeMacro{\catcodetable@atletter} +% Predefined category code tables with the obvious assignments. Note +% that the |latex| and |atletter| tables set the full Unicode range +% to the codes predefined by the kernel. +% +% \noindent +% \DescribeMacro{\setattribute} +% \DescribeMacro{\unsetattribute} +% |\setattribute{|\meta{attribute}|}{|\meta{value}|}|\\ +% |\unsetattribute{|\meta{attribute}|}|\\ +% Set and unset attributes in a manner analogous to |\setlength|. Note that +% attributes take a marker value when unset so this operation is distinct +% from setting the value to zero. +% +% \section{Plain \TeX\ interface} +% +% The \textsf{ltluatex} interface may be used with plain \TeX\ using +% |\input{ltluatex}|. This inputs |ltluatex.tex| which inputs +% |etex.src| (or |etex.sty| if used with \LaTeX) +% if it is not already input, and then defines some internal commands to +% allow the \textsf{ltluatex} interface to be defined. +% +% The \textsf{luatexbase} package interface may also be used in plain \TeX, +% as before, by inputting the package |\input luatexbase.sty|. The new +% version of \textsf{luatexbase} is based on this \textsf{ltluatex} +% code but implements a compatibility layer providing the interface +% of the original package. +% +% \section{Lua functionality} +% +% \begingroup +% +% \begingroup\lccode`~=`_ +% \lowercase{\endgroup\let~}_ +% \catcode`_=12 +% +% \subsection{Allocators in Lua} +% +% \DescribeMacro{new_attribute} +% |luatexbase.new_attribute(|\meta{attribute}|)|\\ +% Returns an allocation number for the \meta{attribute}, indexed from~$1$. +% The attribute will be initialised with the marker value |-"7FFFFFFF| +% (`unset'). The attribute allocation sequence is shared with the \TeX{} +% code but this function does \emph{not} define a token using +% |\attributedef|. +% The attribute name is recorded in the |attributes| table. A +% metatable is provided so that the table syntax can be used +% consistently for attributes declared in \TeX\ or Lua. +% +% \noindent +% \DescribeMacro{new_whatsit} +% |luatexbase.new_whatsit(|\meta{whatsit}|)|\\ +% Returns an allocation number for the custom \meta{whatsit}, indexed from~$1$. +% +% \noindent +% \DescribeMacro{new_bytecode} +% |luatexbase.new_bytecode(|\meta{bytecode}|)|\\ +% Returns an allocation number for a bytecode register, indexed from~$1$. +% The optional \meta{name} argument is just used for logging. +% +% \noindent +% \DescribeMacro{new_chunkname} +% |luatexbase.new_chunkname(|\meta{chunkname}|)|\\ +% Returns an allocation number for a Lua chunk name for use with +% |\directlua| and |\latelua|, indexed from~$1$. +% The number is returned and also \meta{name} argument is added to the +% |lua.name| array at that index. +% +% \noindent +% \DescribeMacro{new_luafunction} +% |luatexbase.new_luafunction(|\meta{functionname}|)|\\ +% Returns an allocation number for a lua function for use +% with |\luafunction|, |\lateluafunction|, and |\luadef|, +% indexed from~$1$. The optional \meta{functionname} argument +% is just used for logging. +% +% These functions all require access to a named \TeX{} count register +% to manage their allocations. The standard names are those defined +% above for access from \TeX{}, \emph{e.g.}~\string\e@alloc@attribute@count, +% but these can be adjusted by defining the variable +% \texttt{\meta{type}\_count\_name} before loading |ltluatex.lua|, for example +% \begin{verbatim} +% local attribute_count_name = "attributetracker" +% require("ltluatex") +% \end{verbatim} +% would use a \TeX{} |\count| (|\countdef|'d token) called |attributetracker| +% in place of \string\e@alloc@attribute@count. +% +% \subsection{Lua access to \TeX{} register numbers} +% +% \DescribeMacro{registernumber} +% |luatexbase.registernumer(|\meta{name}|)|\\ +% Sometimes (notably in the case of Lua attributes) it is necessary to +% access a register \emph{by number} that has been allocated by \TeX{}. +% This package provides a function to look up the relevant number +% using Lua\TeX{}'s internal tables. After for example +% |\newattribute\myattrib|, |\myattrib| would be defined by (say) +% |\myattrib=\attribute15|. |luatexbase.registernumer("myattrib")| +% would then return the register number, $15$ in this case. If the string passed +% as argument does not correspond to a token defined by |\attributedef|, +% |\countdef| or similar commands, the Lua value |false| is returned. +% +% As an example, consider the input: +%\begin{verbatim} +% \newcommand\test[1]{% +% \typeout{#1: \expandafter\meaning\csname#1\endcsname^^J +% \space\space\space\space +% \directlua{tex.write(luatexbase.registernumber("#1") or "bad input")}% +% }} +% +% \test{undefinedrubbish} +% +% \test{space} +% +% \test{hbox} +% +% \test{@MM} +% +% \test{@tempdima} +% \test{@tempdimb} +% +% \test{strutbox} +% +% \test{sixt@@n} +% +% \attrbutedef\myattr=12 +% \myattr=200 +% \test{myattr} +% +%\end{verbatim} +% +% If the demonstration code is processed with Lua\LaTeX{} then the following +% would be produced in the log and terminal output. +%\begin{verbatim} +% undefinedrubbish: \relax +% bad input +% space: macro:-> +% bad input +% hbox: \hbox +% bad input +% @MM: \mathchar"4E20 +% 20000 +% @tempdima: \dimen14 +% 14 +% @tempdimb: \dimen15 +% 15 +% strutbox: \char"B +% 11 +% sixt@@n: \char"10 +% 16 +% myattr: \attribute12 +% 12 +%\end{verbatim} +% +% Notice how undefined commands, or commands unrelated to registers +% do not produce an error, just return |false| and so print +% |bad input| here. Note also that commands defined by |\newbox| work and +% return the number of the box register even though the actual command +% holding this number is a |\chardef| defined token (there is no +% |\boxdef|). +% +% \subsection{Module utilities} +% +% \DescribeMacro{provides_module} +% |luatexbase.provides_module(|\meta{info}|)|\\ +% This function is used by modules to identify themselves; the |info| should be +% a table containing information about the module. The required field +% |name| must contain the name of the module. It is recommended to provide a +% field |date| in the usual \LaTeX{} format |yyyy/mm/dd|. Optional fields +% |version| (a string) and |description| may be used if present. This +% information will be recorded in the log. Other fields are ignored. +% +% \noindent +% \DescribeMacro{module_info} +% \DescribeMacro{module_warning} +% \DescribeMacro{module_error} +% |luatexbase.module_info(|\meta{module}, \meta{text}|)|\\ +% |luatexbase.module_warning(|\meta{module}, \meta{text}|)|\\ +% |luatexbase.module_error(|\meta{module}, \meta{text}|)|\\ +% These functions are similar to \LaTeX{}'s |\PackageError|, |\PackageWarning| +% and |\PackageInfo| in the way they format the output. No automatic line +% breaking is done, you may still use |\n| as usual for that, and the name of +% the package will be prepended to each output line. +% +% Note that |luatexbase.module_error| raises an actual Lua error with |error()|, +% which currently means a call stack will be dumped. While this may not +% look pretty, at least it provides useful information for tracking the +% error down. +% +% \subsection{Callback management} +% +% \noindent +% \DescribeMacro{add_to_callback} +% |luatexbase.add_to_callback(|^^A +% \meta{callback}, \meta{function}, \meta{description}|)| +% Registers the \meta{function} into the \meta{callback} with a textual +% \meta{description} of the function. Functions are inserted into the callback +% in the order loaded. +% +% \noindent +% \DescribeMacro{remove_from_callback} +% |luatexbase.remove_from_callback(|\meta{callback}, \meta{description}|)| +% Removes the callback function with \meta{description} from the \meta{callback}. +% The removed function and its description +% are returned as the results of this function. +% +% \noindent +% \DescribeMacro{in_callback} +% |luatexbase.in_callback(|\meta{callback}, \meta{description}|)| +% Checks if the \meta{description} matches one of the functions added +% to the list for the \meta{callback}, returning a boolean value. +% +% \noindent +% \DescribeMacro{disable_callback} +% |luatexbase.disable_callback(|\meta{callback}|)| +% Sets the \meta{callback} to \texttt{false} as described in the Lua\TeX{} +% manual for the underlying \texttt{callback.register} built-in. Callbacks +% will only be set to false (and thus be skipped entirely) if there are +% no functions registered using the callback. +% +% \noindent +% \DescribeMacro{callback_descriptions} +% A list of the descriptions of functions registered to the specified +% callback is returned. |{}| is returned if there are no functions registered. +% +% \noindent +% \DescribeMacro{create_callback} +% |luatexbase.create_callback(|\meta{name},meta{type},\meta{default}|)| +% Defines a user defined callback. The last argument is a default +% function or |false|. +% +% \noindent +% \DescribeMacro{call_callback} +% |luatexbase.call_callback(|\meta{name},\ldots|)| +% Calls a user defined callback with the supplied arguments. +% +% \endgroup +% +% \StopEventually{} +% +% \section{Implementation} +% +% \begin{macrocode} +%<*2ekernel|tex|latexrelease> +%<2ekernel|latexrelease>\ifx\directlua\@undefined\else +% \end{macrocode} +% +% +% \changes{v1.0j}{2015/12/02}{Remove nonlocal iteration variables (PHG)} +% \changes{v1.0j}{2015/12/02}{Assorted typos fixed (PHG)} +% \changes{v1.0j}{2015/12/02}{Remove unreachable code after calls to error() (PHG)} +% \subsection{Minimum Lua\TeX{} version} +% +% Lua\TeX{} has changed a lot over time. In the kernel support for ancient +% versions is not provided: trying to build a format with a very old binary +% therefore gives some information in the log and loading stops. The cut-off +% selected here relates to the tree-searching behaviour of |require()|: +% from version~0.60, Lua\TeX{} will correctly find Lua files in the |texmf| +% tree without `help'. +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/10/01} +%<latexrelease> {\newluafunction}{LuaTeX}% +\ifnum\luatexversion<60 % + \wlog{***************************************************} + \wlog{* LuaTeX version too old for ltluatex support *} + \wlog{***************************************************} + \expandafter\endinput +\fi +% \end{macrocode} +% +% \subsection{Older \LaTeX{}/Plain \TeX\ setup} +% +% \begin{macrocode} +%<*tex> +% \end{macrocode} +% +% Older \LaTeX{} formats don't have the primitives with `native' names: +% sort that out. If they already exist this will still be safe. +% \begin{macrocode} +\directlua{tex.enableprimitives("",tex.extraprimitives("luatex"))} +% \end{macrocode} +% +% \begin{macrocode} +\ifx\e@alloc\@undefined +% \end{macrocode} +% +% In pre-2014 \LaTeX{}, or plain \TeX{}, load |etex.{sty,src}|. +% \begin{macrocode} + \ifx\documentclass\@undefined + \ifx\loccount\@undefined + \input{etex.src}% + \fi + \catcode`\@=11 % + \outer\expandafter\def\csname newfam\endcsname + {\alloc@8\fam\chardef\et@xmaxfam} + \else + \RequirePackage{etex} + \expandafter\def\csname newfam\endcsname + {\alloc@8\fam\chardef\et@xmaxfam} + \expandafter\let\expandafter\new@mathgroup\csname newfam\endcsname + \fi +% \end{macrocode} +% +% \subsubsection{Fixes to \texttt{etex.src}/\texttt{etex.sty}} +% +% These could and probably should be made directly in an +% update to |etex.src| which already has some Lua\TeX-specific +% code, but does not define the correct range for Lua\TeX. +% +% 2015-07-13 higher range in luatex. +% \begin{macrocode} +\edef \et@xmaxregs {\ifx\directlua\@undefined 32768\else 65536\fi} +% \end{macrocode} +% luatex/xetex also allow more math fam. +% \begin{macrocode} +\edef \et@xmaxfam {\ifx\Umathchar\@undefined\sixt@@n\else\@cclvi\fi} +% \end{macrocode} +% +% \begin{macrocode} +\count 270=\et@xmaxregs % locally allocates \count registers +\count 271=\et@xmaxregs % ditto for \dimen registers +\count 272=\et@xmaxregs % ditto for \skip registers +\count 273=\et@xmaxregs % ditto for \muskip registers +\count 274=\et@xmaxregs % ditto for \box registers +\count 275=\et@xmaxregs % ditto for \toks registers +\count 276=\et@xmaxregs % ditto for \marks classes +% \end{macrocode} +% +% and 256 or 16 fam. (Done above due to plain/\LaTeX\ differences in +% \textsf{ltluatex}.) +% \begin{macrocode} +% \outer\def\newfam{\alloc@8\fam\chardef\et@xmaxfam} +% \end{macrocode} +% +% End of proposed changes to \texttt{etex.src} +% +% \subsubsection{luatex specific settings} +% +% Switch to global cf |luatex.sty| to leave room for inserts +% not really needed for luatex but possibly most compatible +% with existing use. +% \begin{macrocode} +\expandafter\let\csname newcount\expandafter\expandafter\endcsname + \csname globcount\endcsname +\expandafter\let\csname newdimen\expandafter\expandafter\endcsname + \csname globdimen\endcsname +\expandafter\let\csname newskip\expandafter\expandafter\endcsname + \csname globskip\endcsname +\expandafter\let\csname newbox\expandafter\expandafter\endcsname + \csname globbox\endcsname +% \end{macrocode} +% +% Define|\e@alloc| as in latex (the existing macros in |etex.src| +% hard to extend to further register types as they assume specific +% 26x and 27x count range. For compatibility the existing register +% allocation is not changed. +% +% \begin{macrocode} +\chardef\e@alloc@top=65535 +\let\e@alloc@chardef\chardef +% \end{macrocode} +% +% \begin{macrocode} +\def\e@alloc#1#2#3#4#5#6{% + \global\advance#3\@ne + \e@ch@ck{#3}{#4}{#5}#1% + \allocationnumber#3\relax + \global#2#6\allocationnumber + \wlog{\string#6=\string#1\the\allocationnumber}}% +% \end{macrocode} +% +% \begin{macrocode} +\gdef\e@ch@ck#1#2#3#4{% + \ifnum#1<#2\else + \ifnum#1=#2\relax + #1\@cclvi + \ifx\count#4\advance#1 10 \fi + \fi + \ifnum#1<#3\relax + \else + \errmessage{No room for a new \string#4}% + \fi + \fi}% +% \end{macrocode} +% +% Two simple \LaTeX\ macros used in |ltlatex.sty|. +% \begin{macrocode} +\long\def\@gobble#1{} +\long\def\@firstofone#1{#1} +% \end{macrocode} +% +% Fix up allocations not to clash with |etex.src|. +% +% \begin{macrocode} +\expandafter\csname newcount\endcsname\e@alloc@attribute@count +\expandafter\csname newcount\endcsname\e@alloc@ccodetable@count +\expandafter\csname newcount\endcsname\e@alloc@luafunction@count +\expandafter\csname newcount\endcsname\e@alloc@whatsit@count +\expandafter\csname newcount\endcsname\e@alloc@bytecode@count +\expandafter\csname newcount\endcsname\e@alloc@luachunk@count +% \end{macrocode} +% +% End of conditional setup for plain \TeX\ / old \LaTeX. +% \begin{macrocode} +\fi +%</tex> +% \end{macrocode} +% +% +% \subsection{Attributes} +% +% \begin{macro}{\newattribute} +% \changes{v1.0a}{2015/09/24}{Macro added} +% As is generally the case for the Lua\TeX{} registers we start here +% from~$1$. Notably, some code assumes that |\attribute0| is never used so +% this is important in this case. +% \begin{macrocode} +\ifx\e@alloc@attribute@count\@undefined + \countdef\e@alloc@attribute@count=258 +\fi +\def\newattribute#1{% + \e@alloc\attribute\attributedef + \e@alloc@attribute@count\m@ne\e@alloc@top#1% +} +\e@alloc@attribute@count=\z@ +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setattribute} +% \begin{macro}{\unsetattribute} +% Handy utilities. +% \begin{macrocode} +\def\setattribute#1#2{#1=\numexpr#2\relax} +\def\unsetattribute#1{#1=-"7FFFFFFF\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Category code tables} +% +% \begin{macro}{\newcatcodetable} +% \changes{v1.0a}{2015/09/24}{Macro added} +% Category code tables are allocated with a limit half of that used by Lua\TeX{} +% for everything else. At the end of allocation there needs to be an +% initialisation step. Table~$0$ is already taken (it's the global one for +% current use) so the allocation starts at~$1$. +% \begin{macrocode} +\ifx\e@alloc@ccodetable@count\@undefined + \countdef\e@alloc@ccodetable@count=259 +\fi +\def\newcatcodetable#1{% + \e@alloc\catcodetable\chardef + \e@alloc@ccodetable@count\m@ne{"8000}#1% + \initcatcodetable\allocationnumber +} +\e@alloc@ccodetable@count=\z@ +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0l}{2015/12/18}{Load Unicode data from source} +% \begin{macro}{\catcodetable@initex} +% \changes{v1.0a}{2015/09/24}{Macro added} +% \begin{macro}{\catcodetable@string} +% \changes{v1.0a}{2015/09/24}{Macro added} +% \begin{macro}{\catcodetable@latex} +% \changes{v1.0a}{2015/09/24}{Macro added} +% \begin{macro}{\catcodetable@atletter} +% \changes{v1.0a}{2015/09/24}{Macro added} +% Save a small set of standard tables. The Unicode data is read +% here in using a parser simplified from that in |load-unicode-data|: +% only the nature of letters needs to be detected. +% \begin{macrocode} +\newcatcodetable\catcodetable@initex +\newcatcodetable\catcodetable@string +\begingroup + \def\setrangecatcode#1#2#3{% + \ifnum#1>#2 % + \expandafter\@gobble + \else + \expandafter\@firstofone + \fi + {% + \catcode#1=#3 % + \expandafter\setrangecatcode\expandafter + {\number\numexpr#1 + 1\relax}{#2}{#3} + }% + } + \@firstofone{% + \catcodetable\catcodetable@initex + \catcode0=12 % + \catcode13=12 % + \catcode37=12 % + \setrangecatcode{65}{90}{12}% + \setrangecatcode{97}{122}{12}% + \catcode92=12 % + \catcode127=12 % + \savecatcodetable\catcodetable@string + \endgroup + }% +\newcatcodetable\catcodetable@latex +\newcatcodetable\catcodetable@atletter +\begingroup + \def\parseunicodedataI#1;#2;#3;#4\relax{% + \parseunicodedataII#1;#3;#2 First>\relax + }% + \def\parseunicodedataII#1;#2;#3 First>#4\relax{% + \ifx\relax#4\relax + \expandafter\parseunicodedataIII + \else + \expandafter\parseunicodedataIV + \fi + {#1}#2\relax% + }% + \def\parseunicodedataIII#1#2#3\relax{% + \ifnum 0% + \if L#21\fi + \if M#21\fi + >0 % + \catcode"#1=11 % + \fi + }% + \def\parseunicodedataIV#1#2#3\relax{% + \read\unicoderead to \unicodedataline + \if L#2% + \count0="#1 % + \expandafter\parseunicodedataV\unicodedataline\relax + \fi + }% + \def\parseunicodedataV#1;#2\relax{% + \loop + \unless\ifnum\count0>"#1 % + \catcode\count0=11 % + \advance\count0 by 1 % + \repeat + }% + \def\storedpar{\par}% + \chardef\unicoderead=\numexpr\count16 + 1\relax + \openin\unicoderead=UnicodeData.txt % + \loop\unless\ifeof\unicoderead % + \read\unicoderead to \unicodedataline + \unless\ifx\unicodedataline\storedpar + \expandafter\parseunicodedataI\unicodedataline\relax + \fi + \repeat + \closein\unicoderead + \@firstofone{% + \catcode64=12 % + \savecatcodetable\catcodetable@latex + \catcode64=11 % + \savecatcodetable\catcodetable@atletter + } +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Named Lua functions} +% +% \begin{macro}{\newluafunction} +% \changes{v1.0a}{2015/09/24}{Macro added} +% Much the same story for allocating Lua\TeX{} functions except here they are +% just numbers so they are allocated in the same way as boxes. +% Lua indexes from~$1$ so once again slot~$0$ is skipped. +% \begin{macrocode} +\ifx\e@alloc@luafunction@count\@undefined + \countdef\e@alloc@luafunction@count=260 +\fi +\def\newluafunction{% + \e@alloc\luafunction\e@alloc@chardef + \e@alloc@luafunction@count\m@ne\e@alloc@top +} +\e@alloc@luafunction@count=\z@ +% \end{macrocode} +% \end{macro} +% +% \subsection{Custom whatsits} +% +% \begin{macro}{\newwhatsit} +% \changes{v1.0a}{2015/09/24}{Macro added} +% These are only settable from Lua but for consistency are definable +% here. +% \begin{macrocode} +\ifx\e@alloc@whatsit@count\@undefined + \countdef\e@alloc@whatsit@count=261 +\fi +\def\newwhatsit#1{% + \e@alloc\whatsit\e@alloc@chardef + \e@alloc@whatsit@count\m@ne\e@alloc@top#1% +} +\e@alloc@whatsit@count=\z@ +% \end{macrocode} +% \end{macro} +% +% \subsection{Lua bytecode registers} +% +% \begin{macro}{\newluabytecode} +% \changes{v1.0a}{2015/09/24}{Macro added} +% These are only settable from Lua but for consistency are definable +% here. +% \begin{macrocode} +\ifx\e@alloc@bytecode@count\@undefined + \countdef\e@alloc@bytecode@count=262 +\fi +\def\newluabytecode#1{% + \e@alloc\luabytecode\e@alloc@chardef + \e@alloc@bytecode@count\m@ne\e@alloc@top#1% +} +\e@alloc@bytecode@count=\z@ +% \end{macrocode} +% \end{macro} +% +% \subsection{Lua chunk registers} + +% \begin{macro}{\newluachunkname} +% \changes{v1.0a}{2015/09/24}{Macro added} +% As for bytecode registers, but in addition we need to add a string +% to the \verb|lua.name| table to use in stack tracing. We use the +% name of the command passed to the allocator, with no backslash. +% \begin{macrocode} +\ifx\e@alloc@luachunk@count\@undefined + \countdef\e@alloc@luachunk@count=263 +\fi +\def\newluachunkname#1{% + \e@alloc\luachunk\e@alloc@chardef + \e@alloc@luachunk@count\m@ne\e@alloc@top#1% + {\escapechar\m@ne + \directlua{lua.name[\the\allocationnumber]="\string#1"}}% +} +\e@alloc@luachunk@count=\z@ +% \end{macrocode} +% \end{macro} +% +% \subsection{Lua loader} +% +% Load the Lua code at the start of every job. +% For the conversion of \TeX{} into numbers at the Lua side we need some +% known registers: for convenience we use a set of systematic names, which +% means using a group around the Lua loader. +% \begin{macrocode} +%<2ekernel>\everyjob\expandafter{% +%<2ekernel> \the\everyjob + \begingroup + \attributedef\attributezero=0 % + \chardef \charzero =0 % +% \end{macrocode} +% Note name change required on older luatex, for hash table access. +% \begin{macrocode} + \countdef \CountZero =0 % + \dimendef \dimenzero =0 % + \mathchardef \mathcharzero =0 % + \muskipdef \muskipzero =0 % + \skipdef \skipzero =0 % + \toksdef \tokszero =0 % + \directlua{require("ltluatex")} + \endgroup +%<2ekernel>} +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \changes{v1.0b}{2015/10/02}{Fix backing out of \TeX{} code} +% \changes{v1.0c}{2015/10/02}{Allow backing out of Lua code} +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{0000/00/00} +%<latexrelease> {\newluafunction}{LuaTeX}% +%<latexrelease>\let\e@alloc@attribute@count\@undefined +%<latexrelease>\let\newattribute\@undefined +%<latexrelease>\let\setattribute\@undefined +%<latexrelease>\let\unsetattribute\@undefined +%<latexrelease>\let\e@alloc@ccodetable@count\@undefined +%<latexrelease>\let\newcatcodetable\@undefined +%<latexrelease>\let\catcodetable@initex\@undefined +%<latexrelease>\let\catcodetable@string\@undefined +%<latexrelease>\let\catcodetable@latex\@undefined +%<latexrelease>\let\catcodetable@atletter\@undefined +%<latexrelease>\let\e@alloc@luafunction@count\@undefined +%<latexrelease>\let\newluafunction\@undefined +%<latexrelease>\let\e@alloc@luafunction@count\@undefined +%<latexrelease>\let\newwhatsit\@undefined +%<latexrelease>\let\e@alloc@whatsit@count\@undefined +%<latexrelease>\let\newluabytecode\@undefined +%<latexrelease>\let\e@alloc@bytecode@count\@undefined +%<latexrelease>\let\newluachunkname\@undefined +%<latexrelease>\let\e@alloc@luachunk@count\@undefined +%<latexrelease>\directlua{luatexbase.uninstall()} +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% In \verb|\everyjob|, if luaotfload is available, load it and switch to TU. +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2017/01/01}% +%<latexrelease> {\fontencoding}{TU in everyjob}% +%<latexrelease>\fontencoding{TU}\let\encodingdefault\f@encoding +%<latexrelease>\ifx\directlua\@undefined\else +%<2ekernel>\everyjob\expandafter{% +%<2ekernel> \the\everyjob +%<*2ekernel,latexrelease> + \directlua{% + if xpcall(function ()% + require('luaotfload-main')% + end,texio.write_nl) then % + local _void = luaotfload.main ()% + else % + texio.write_nl('Error in luaotfload: reverting to OT1')% + tex.print('\string\\def\string\\encodingdefault{OT1}')% + end % + }% + \let\f@encoding\encodingdefault + \expandafter\let\csname ver@luaotfload.sty\endcsname\fmtversion +%</2ekernel,latexrelease> +%<latexrelease>\fi +%<2ekernel> } +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\fontencoding}{TU in everyjob}% +%<latexrelease>\fontencoding{OT1}\let\encodingdefault\f@encoding +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \begin{macrocode} +%<2ekernel|latexrelease>\fi +%</2ekernel|tex|latexrelease> +% \end{macrocode} +% +% \subsection{Lua module preliminaries} +% +% \begingroup +% +% \begingroup\lccode`~=`_ +% \lowercase{\endgroup\let~}_ +% \catcode`_=12 +% +% \begin{macrocode} +%<*lua> +% \end{macrocode} +% +% Some set up for the Lua module which is needed for all of the Lua +% functionality added here. +% +% \begin{macro}{luatexbase} +% \changes{v1.0a}{2015/09/24}{Table added} +% Set up the table for the returned functions. This is used to expose +% all of the public functions. +% \begin{macrocode} +luatexbase = luatexbase or { } +local luatexbase = luatexbase +% \end{macrocode} +% \end{macro} +% +% Some Lua best practice: use local versions of functions where possible. +% \begin{macrocode} +local string_gsub = string.gsub +local tex_count = tex.count +local tex_setattribute = tex.setattribute +local tex_setcount = tex.setcount +local texio_write_nl = texio.write_nl +% \end{macrocode} +% \changes{v1.0i}{2015/11/29}{Declare this as local before used in the module error definitions (PHG)} +% \begin{macrocode} +local luatexbase_warning +local luatexbase_error +% \end{macrocode} +% +% \subsection{Lua module utilities} +% +% \subsubsection{Module tracking} +% +% \begin{macro}{modules} +% \changes{v1.0a}{2015/09/24}{Function modified} +% To allow tracking of module usage, a structure is provided to store +% information and to return it. +% \begin{macrocode} +local modules = modules or { } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{provides_module} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.0f}{2015/10/03}{use luatexbase\_log} +% Local function to write to the log. +% \begin{macrocode} +local function luatexbase_log(text) + texio_write_nl("log", text) +end +% \end{macrocode} +% +% Modelled on |\ProvidesPackage|, we store much the same information but +% with a little more structure. +% \begin{macrocode} +local function provides_module(info) + if not (info and info.name) then + luatexbase_error("Missing module name for provides_module") + end + local function spaced(text) + return text and (" " .. text) or "" + end + luatexbase_log( + "Lua module: " .. info.name + .. spaced(info.date) + .. spaced(info.version) + .. spaced(info.description) + ) + modules[info.name] = info +end +luatexbase.provides_module = provides_module +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Module messages} +% +% There are various warnings and errors that need to be given. For warnings +% we can get exactly the same formatting as from \TeX{}. For errors we have to +% make some changes. Here we give the text of the error in the \LaTeX{} format +% then force an error from Lua to halt the run. Splitting the message text is +% done using |\n| which takes the place of |\MessageBreak|. +% +% First an auxiliary for the formatting: this measures up the message +% leader so we always get the correct indent. +% \changes{v1.0j}{2015/12/02}{Declaration/use of first\_head fixed (PHG)} +% \begin{macrocode} +local function msg_format(mod, msg_type, text) + local leader = "" + local cont + local first_head + if mod == "LaTeX" then + cont = string_gsub(leader, ".", " ") + first_head = leader .. "LaTeX: " + else + first_head = leader .. "Module " .. msg_type + cont = "(" .. mod .. ")" + .. string_gsub(first_head, ".", " ") + first_head = leader .. "Module " .. mod .. " " .. msg_type .. ":" + end + if msg_type == "Error" then + first_head = "\n" .. first_head + end + if string.sub(text,-1) ~= "\n" then + text = text .. " " + end + return first_head .. " " + .. string_gsub( + text + .. "on input line " + .. tex.inputlineno, "\n", "\n" .. cont .. " " + ) + .. "\n" +end +% \end{macrocode} +% +% \begin{macro}{module_info} +% \changes{v1.0a}{2015/09/24}{Function added} +% \begin{macro}{module_warning} +% \changes{v1.0a}{2015/09/24}{Function added} +% \begin{macro}{module_error} +% \changes{v1.0a}{2015/09/24}{Function added} +% Write messages. +% \begin{macrocode} +local function module_info(mod, text) + texio_write_nl("log", msg_format(mod, "Info", text)) +end +luatexbase.module_info = module_info +local function module_warning(mod, text) + texio_write_nl("term and log",msg_format(mod, "Warning", text)) +end +luatexbase.module_warning = module_warning +local function module_error(mod, text) + error(msg_format(mod, "Error", text)) +end +luatexbase.module_error = module_error +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Dedicated versions for the rest of the code here. +% \begin{macrocode} +function luatexbase_warning(text) + module_warning("luatexbase", text) +end +function luatexbase_error(text) + module_error("luatexbase", text) +end +% \end{macrocode} +% +% +% \subsection{Accessing register numbers from Lua} +% +% \changes{v1.0g}{2015/11/14}{Track Lua\TeX{} changes for +% \texttt{(new)token.create}} +% Collect up the data from the \TeX{} level into a Lua table: from +% version~0.80, Lua\TeX{} makes that easy. +% \changes{v1.0j}{2015/12/02}{Adjust hashtokens to store the result of tex.hashtokens()), not the function (PHG)} +% \begin{macrocode} +local luaregisterbasetable = { } +local registermap = { + attributezero = "assign_attr" , + charzero = "char_given" , + CountZero = "assign_int" , + dimenzero = "assign_dimen" , + mathcharzero = "math_given" , + muskipzero = "assign_mu_skip" , + skipzero = "assign_skip" , + tokszero = "assign_toks" , +} +local createtoken +if tex.luatexversion > 81 then + createtoken = token.create +elseif tex.luatexversion > 79 then + createtoken = newtoken.create +end +local hashtokens = tex.hashtokens() +local luatexversion = tex.luatexversion +for i,j in pairs (registermap) do + if luatexversion < 80 then + luaregisterbasetable[hashtokens[i][1]] = + hashtokens[i][2] + else + luaregisterbasetable[j] = createtoken(i).mode + end +end +% \end{macrocode} +% +% \begin{macro}{registernumber} +% Working out the correct return value can be done in two ways. For older +% Lua\TeX{} releases it has to be extracted from the |hashtokens|. On the +% other hand, newer Lua\TeX{}'s have |newtoken|, and whilst |.mode| isn't +% currently documented, Hans Hagen pointed to this approach so we should be +% OK. +% \begin{macrocode} +local registernumber +if luatexversion < 80 then + function registernumber(name) + local nt = hashtokens[name] + if(nt and luaregisterbasetable[nt[1]]) then + return nt[2] - luaregisterbasetable[nt[1]] + else + return false + end + end +else + function registernumber(name) + local nt = createtoken(name) + if(luaregisterbasetable[nt.cmdname]) then + return nt.mode - luaregisterbasetable[nt.cmdname] + else + return false + end + end +end +luatexbase.registernumber = registernumber +% \end{macrocode} +% \end{macro} +% +% \subsection{Attribute allocation} +% +% \begin{macro}{new_attribute} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.1c}{2017/02/18}{Parameterise count used in tracking} +% As attributes are used for Lua manipulations its useful to be able +% to assign from this end. +% \begin{macrocode} +local attributes=setmetatable( +{}, +{ +__index = function(t,key) +return registernumber(key) or nil +end} +) +luatexbase.attributes = attributes +% \end{macrocode} +% +% \begin{macrocode} +local attribute_count_name = + attribute_count_name or "e@alloc@attribute@count" +local function new_attribute(name) + tex_setcount("global", attribute_count_name, + tex_count[attribute_count_name] + 1) + if tex_count[attribute_count_name] > 65534 then + luatexbase_error("No room for a new \\attribute") + end + attributes[name]= tex_count[attribute_count_name] + luatexbase_log("Lua-only attribute " .. name .. " = " .. + tex_count[attribute_count_name]) + return tex_count[attribute_count_name] +end +luatexbase.new_attribute = new_attribute +% \end{macrocode} +% \end{macro} +% +% \subsection{Custom whatsit allocation} +% +% \begin{macro}{new_whatsit} +% \changes{v1.1c}{2017/02/18}{Parameterise count used in tracking} +% Much the same as for attribute allocation in Lua. +% \begin{macrocode} +local whatsit_count_name = whatsit_count_name or "e@alloc@whatsit@count" +local function new_whatsit(name) + tex_setcount("global", whatsit_count_name, + tex_count[whatsit_count_name] + 1) + if tex_count[whatsit_count_name] > 65534 then + luatexbase_error("No room for a new custom whatsit") + end + luatexbase_log("Custom whatsit " .. (name or "") .. " = " .. + tex_count[whatsit_count_name]) + return tex_count[whatsit_count_name] +end +luatexbase.new_whatsit = new_whatsit +% \end{macrocode} +% \end{macro} +% +% \subsection{Bytecode register allocation} +% +% \begin{macro}{new_bytecode} +% \changes{v1.1c}{2017/02/18}{Parameterise count used in tracking} +% Much the same as for attribute allocation in Lua. +% The optional \meta{name} argument is used in the log if given. +% \begin{macrocode} +local bytecode_count_name = + bytecode_count_name or "e@alloc@bytecode@count" +local function new_bytecode(name) + tex_setcount("global", bytecode_count_name, + tex_count[bytecode_count_name] + 1) + if tex_count[bytecode_count_name] > 65534 then + luatexbase_error("No room for a new bytecode register") + end + luatexbase_log("Lua bytecode " .. (name or "") .. " = " .. + tex_count[bytecode_count_name]) + return tex_count[bytecode_count_name] +end +luatexbase.new_bytecode = new_bytecode +% \end{macrocode} +% \end{macro} +% +% \subsection{Lua chunk name allocation} +% +% \begin{macro}{new_chunkname} +% \changes{v1.1c}{2017/02/18}{Parameterise count used in tracking} +% As for bytecode registers but also store the name in the +% |lua.name| table. +% \begin{macrocode} +local chunkname_count_name = + chunkname_count_name or "e@alloc@luachunk@count" +local function new_chunkname(name) + tex_setcount("global", chunkname_count_name, + tex_count[chunkname_count_name] + 1) + local chunkname_count = tex_count[chunkname_count_name] + chunkname_count = chunkname_count + 1 + if chunkname_count > 65534 then + luatexbase_error("No room for a new chunkname") + end + lua.name[chunkname_count]=name + luatexbase_log("Lua chunkname " .. (name or "") .. " = " .. + chunkname_count .. "\n") + return chunkname_count +end +luatexbase.new_chunkname = new_chunkname +% \end{macrocode} +% \end{macro} +% +% \subsection{Lua function allocation} +% +% \begin{macro}{new_luafunction} +% \changes{v1.1i}{2018/10/21}{Function added} +% Much the same as for attribute allocation in Lua. +% The optional \meta{name} argument is used in the log if given. +% \begin{macrocode} +local luafunction_count_name = + luafunction_count_name or "e@alloc@luafunction@count" +local function new_luafunction(name) + tex_setcount("global", luafunction_count_name, + tex_count[luafunction_count_name] + 1) + if tex_count[luafunction_count_name] > 65534 then + luatexbase_error("No room for a new luafunction register") + end + luatexbase_log("Lua function " .. (name or "") .. " = " .. + tex_count[luafunction_count_name]) + return tex_count[luafunction_count_name] +end +luatexbase.new_luafunction = new_luafunction +% \end{macrocode} +% \end{macro} +% +% \subsection{Lua callback management} +% +% The native mechanism for callbacks in Lua\TeX\ allows only one per function. +% That is extremely restrictive and so a mechanism is needed to add and +% remove callbacks from the appropriate hooks. +% +% \subsubsection{Housekeeping} +% +% The main table: keys are callback names, and values are the associated lists +% of functions. More precisely, the entries in the list are tables holding the +% actual function as |func| and the identifying description as |description|. +% Only callbacks with a non-empty list of functions have an entry in this +% list. +% \begin{macrocode} +local callbacklist = callbacklist or { } +% \end{macrocode} +% +% Numerical codes for callback types, and name-to-value association (the +% table keys are strings, the values are numbers). +% \begin{macrocode} +local list, data, exclusive, simple = 1, 2, 3, 4 +local types = { + list = list, + data = data, + exclusive = exclusive, + simple = simple, +} +% \end{macrocode} +% +% Now, list all predefined callbacks with their current type, based on the +% Lua\TeX{} manual version~1.01. A full list of the currently-available +% callbacks can be obtained using +% \begin{verbatim} +% \directlua{ +% for i,_ in pairs(callback.list()) do +% texio.write_nl("- " .. i) +% end +% } +% \bye +% \end{verbatim} +% in plain Lua\TeX{}. (Some undocumented callbacks are omitted as they are +% to be removed.) +% \begin{macrocode} +local callbacktypes = callbacktypes or { +% \end{macrocode} +% Section 8.2: file discovery callbacks. +% \changes{v1.1g}{2018/05/02}{find\_sfd\_file removed} +% \begin{macrocode} + find_read_file = exclusive, + find_write_file = exclusive, + find_font_file = data, + find_output_file = data, + find_format_file = data, + find_vf_file = data, + find_map_file = data, + find_enc_file = data, + find_pk_file = data, + find_data_file = data, + find_opentype_file = data, + find_truetype_file = data, + find_type1_file = data, + find_image_file = data, +% \end{macrocode} +% \changes{v1.1g}{2018/05/02}{read\_sfd\_file removed} +% \begin{macrocode} + open_read_file = exclusive, + read_font_file = exclusive, + read_vf_file = exclusive, + read_map_file = exclusive, + read_enc_file = exclusive, + read_pk_file = exclusive, + read_data_file = exclusive, + read_truetype_file = exclusive, + read_type1_file = exclusive, + read_opentype_file = exclusive, +% \end{macrocode} +% \changes{v1.0m}{2016/02/11}{read\_cidmap\_file added} +% Not currently used by luatex but included for completeness. +% may be used by a font handler. +% \begin{macrocode} + find_cidmap_file = data, + read_cidmap_file = exclusive, +% \end{macrocode} +% Section 8.3: data processing callbacks. +% \changes{v1.0m}{2016/02/11}{token\_filter removed} +% \begin{macrocode} + process_input_buffer = data, + process_output_buffer = data, + process_jobname = data, +% \end{macrocode} +% Section 8.4: node list processing callbacks. +% \changes{v1.0m}{2016/02/11} +% {process\_rule, [hv]pack\_quality append\_to\_vlist\_filter added} +% \changes{v1.0n}{2016/03/13}{insert\_local\_par added} +% \changes{v1.0n}{2016/03/13}{contribute\_filter added} +% \changes{v1.1h}{2018/08/18}{append\_to\_vlist\_filter is \texttt{exclusive}} +% \changes{v1.1j}{2019/06/18}{new\_graf added} +% \begin{macrocode} + contribute_filter = simple, + buildpage_filter = simple, + build_page_insert = exclusive, + pre_linebreak_filter = list, + linebreak_filter = list, + append_to_vlist_filter = exclusive, + post_linebreak_filter = list, + hpack_filter = list, + vpack_filter = list, + hpack_quality = list, + vpack_quality = list, + pre_output_filter = list, + process_rule = list, + hyphenate = simple, + ligaturing = simple, + kerning = simple, + insert_local_par = simple, + mlist_to_hlist = list, + new_graf = simple, +% \end{macrocode} +% Section 8.5: information reporting callbacks. +% \changes{v1.0m}{2016/02/11}{show\_warning\_message added} +% \changes{v1.0p}{2016/11/17}{call\_edit added} +% \changes{v1.1g}{2018/05/02}{finish\_synctex\_callback added} +% \changes{v1.1j}{2019/06/18}{finish\_synctex\_callback renamed finish\_synctex} +% \changes{v1.1j}{2019/06/18}{wrapup\_run added} +% \begin{macrocode} + pre_dump = simple, + start_run = simple, + stop_run = simple, + start_page_number = simple, + stop_page_number = simple, + show_error_hook = simple, + show_warning_message = simple, + show_error_message = simple, + show_lua_error_hook = simple, + start_file = simple, + stop_file = simple, + call_edit = simple, + finish_synctex = simple, + wrapup_run = simple, +% \end{macrocode} +% Section 8.6: PDF-related callbacks. +% \changes{v1.1j}{2019/06/18}{page\_objnum\_provider added} +% \changes{v1.1j}{2019/06/18}{process\_pdf\_image\_content added} +% \begin{macrocode} + finish_pdffile = data, + finish_pdfpage = data, + page_objnum_provider = simple, + process_pdf_image_content = simple, +% \end{macrocode} +% Section 8.7: font-related callbacks. +% \changes{v1.1e}{2017/03/28}{glyph\_stream\_provider added} +% \changes{v1.1g}{2018/05/02}{glyph\_not\_found added} +% \changes{v1.1j}{2019/06/18}{make\_extensible added} +% \changes{v1.1j}{2019/06/18}{font\_descriptor\_objnum\_provider added} +% \begin{macrocode} + define_font = exclusive, + glyph_not_found = exclusive, + glyph_stream_provider = exclusive, + make_extensible = exclusive, + font_descriptor_objnum_provider = exclusive, +% \end{macrocode} +% \changes{v1.0m}{2016/02/11}{pdf\_stream\_filter\_callback removed} +% \begin{macrocode} +} +luatexbase.callbacktypes=callbacktypes +% \end{macrocode} +% +% \begin{macro}{callback.register} +% \changes{v1.0a}{2015/09/24}{Function modified} +% Save the original function for registering callbacks and prevent the +% original being used. The original is saved in a place that remains +% available so other more sophisticated code can override the approach +% taken by the kernel if desired. +% \begin{macrocode} +local callback_register = callback_register or callback.register +function callback.register() + luatexbase_error("Attempt to use callback.register() directly\n") +end +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Handlers} +% +% The handler function is registered into the callback when the +% first function is added to this callback's list. Then, when the callback +% is called, the handler takes care of running all functions in the list. +% When the last function is removed from the callback's list, the handler +% is unregistered. +% +% More precisely, the functions below are used to generate a specialized +% function (closure) for a given callback, which is the actual handler. +% +% +% The way the functions are combined together depends on +% the type of the callback. There are currently 4 types of callback, depending +% on the calling convention of the functions the callback can hold: +% \begin{description} +% \item[simple] is for functions that don't return anything: they are called +% in order, all with the same argument; +% \item[data] is for functions receiving a piece of data of any type +% except node list head (and possibly other arguments) and returning it +% (possibly modified): the functions are called in order, and each is +% passed the return value of the previous (and the other arguments +% untouched, if any). The return value is that of the last function; +% \item[list] is a specialized variant of \emph{data} for functions +% filtering node lists. Such functions may return either the head of a +% modified node list, or the boolean values |true| or |false|. The +% functions are chained the same way as for \emph{data} except that for +% the following. If +% one function returns |false|, then |false| is immediately returned and +% the following functions are \emph{not} called. If one function returns +% |true|, then the same head is passed to the next function. If all +% functions return |true|, then |true| is returned, otherwise the return +% value of the last function not returning |true| is used. +% \item[exclusive] is for functions with more complex signatures; functions in +% this type of callback are \emph{not} combined: An error is raised if +% a second callback is registered.. +% \end{description} +% +% Handler for |data| callbacks. +% \begin{macrocode} +local function data_handler(name) + return function(data, ...) + for _,i in ipairs(callbacklist[name]) do + data = i.func(data,...) + end + return data + end +end +% \end{macrocode} +% Handler for |exclusive| callbacks. We can assume |callbacklist[name]| is not +% empty: otherwise, the function wouldn't be registered in the callback any +% more. +% \begin{macrocode} +local function exclusive_handler(name) + return function(...) + return callbacklist[name][1].func(...) + end +end +% \end{macrocode} +% Handler for |list| callbacks. +% \changes{v1.0k}{2015/12/02}{resolve name and i.description (PHG)} +% \begin{macrocode} +local function list_handler(name) + return function(head, ...) + local ret + local alltrue = true + for _,i in ipairs(callbacklist[name]) do + ret = i.func(head, ...) + if ret == false then + luatexbase_warning( + "Function `" .. i.description .. "' returned false\n" + .. "in callback `" .. name .."'" + ) + break + end + if ret ~= true then + alltrue = false + head = ret + end + end + return alltrue and true or head + end +end +% \end{macrocode} +% Handler for |simple| callbacks. +% \begin{macrocode} +local function simple_handler(name) + return function(...) + for _,i in ipairs(callbacklist[name]) do + i.func(...) + end + end +end +% \end{macrocode} +% +% Keep a handlers table for indexed access. +% \begin{macrocode} +local handlers = { + [data] = data_handler, + [exclusive] = exclusive_handler, + [list] = list_handler, + [simple] = simple_handler, +} +% \end{macrocode} +% +% \subsubsection{Public functions for callback management} +% +% Defining user callbacks perhaps should be in package code, +% but impacts on |add_to_callback|. +% If a default function is not required, it may be declared as |false|. +% First we need a list of user callbacks. +% \begin{macrocode} +local user_callbacks_defaults = { } +% \end{macrocode} +% +% \begin{macro}{create_callback} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.0i}{2015/11/29}{Check name is not nil in error message (PHG)} +% \changes{v1.0k}{2015/12/02}{Give more specific error messages (PHG)} +% The allocator itself. +% \begin{macrocode} +local function create_callback(name, ctype, default) + if not name or name == "" + or not ctype or ctype == "" + then + luatexbase_error("Unable to create callback:\n" .. + "valid callback name and type required") + end + if callbacktypes[name] then + luatexbase_error("Unable to create callback `" .. name .. + "':\ncallback is already defined") + end + if default ~= false and type (default) ~= "function" then + luatexbase_error("Unable to create callback `" .. name .. + ":\ndefault is not a function") + end + user_callbacks_defaults[name] = default + callbacktypes[name] = types[ctype] +end +luatexbase.create_callback = create_callback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{call_callback} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.0i}{2015/11/29}{Check name is not nil in error message (PHG)} +% \changes{v1.0k}{2015/12/02}{Give more specific error messages (PHG)} +% Call a user defined callback. First check arguments. +% \begin{macrocode} +local function call_callback(name,...) + if not name or name == "" then + luatexbase_error("Unable to create callback:\n" .. + "valid callback name required") + end + if user_callbacks_defaults[name] == nil then + luatexbase_error("Unable to call callback `" .. name + .. "':\nunknown or empty") + end + local l = callbacklist[name] + local f + if not l then + f = user_callbacks_defaults[name] + if l == false then + return nil + end + else + f = handlers[callbacktypes[name]](name) + end + return f(...) +end +luatexbase.call_callback=call_callback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{add_to_callback} +% \changes{v1.0a}{2015/09/24}{Function added} +% Add a function to a callback. First check arguments. +% \changes{v1.0k}{2015/12/02}{Give more specific error messages (PHG)} +% \begin{macrocode} +local function add_to_callback(name, func, description) + if not name or name == "" then + luatexbase_error("Unable to register callback:\n" .. + "valid callback name required") + end + if not callbacktypes[name] or + type(func) ~= "function" or + not description or + description == "" then + luatexbase_error( + "Unable to register callback.\n\n" + .. "Correct usage:\n" + .. "add_to_callback(<callback>, <function>, <description>)" + ) + end +% \end{macrocode} +% Then test if this callback is already in use. If not, initialise its list +% and register the proper handler. +% \begin{macrocode} + local l = callbacklist[name] + if l == nil then + l = { } + callbacklist[name] = l +% \end{macrocode} +% If it is not a user defined callback use the primitive callback register. +% \begin{macrocode} + if user_callbacks_defaults[name] == nil then + callback_register(name, handlers[callbacktypes[name]](name)) + end + end +% \end{macrocode} +% Actually register the function and give an error if more than one +% |exclusive| one is registered. +% \begin{macrocode} + local f = { + func = func, + description = description, + } + local priority = #l + 1 + if callbacktypes[name] == exclusive then + if #l == 1 then + luatexbase_error( + "Cannot add second callback to exclusive function\n`" .. + name .. "'") + end + end + table.insert(l, priority, f) +% \end{macrocode} +% Keep user informed. +% \begin{macrocode} + luatexbase_log( + "Inserting `" .. description .. "' at position " + .. priority .. " in `" .. name .. "'." + ) +end +luatexbase.add_to_callback = add_to_callback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{remove_from_callback} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.0k}{2015/12/02}{adjust initialisation of cb local (PHG)} +% \changes{v1.0k}{2015/12/02}{Give more specific error messages (PHG)} +% Remove a function from a callback. First check arguments. +% \begin{macrocode} +local function remove_from_callback(name, description) + if not name or name == "" then + luatexbase_error("Unable to remove function from callback:\n" .. + "valid callback name required") + end + if not callbacktypes[name] or + not description or + description == "" then + luatexbase_error( + "Unable to remove function from callback.\n\n" + .. "Correct usage:\n" + .. "remove_from_callback(<callback>, <description>)" + ) + end + local l = callbacklist[name] + if not l then + luatexbase_error( + "No callback list for `" .. name .. "'\n") + end +% \end{macrocode} +% Loop over the callback's function list until we find a matching entry. +% Remove it and check if the list is empty: if so, unregister the +% callback handler. +% \begin{macrocode} + local index = false + for i,j in ipairs(l) do + if j.description == description then + index = i + break + end + end + if not index then + luatexbase_error( + "No callback `" .. description .. "' registered for `" .. + name .. "'\n") + end + local cb = l[index] + table.remove(l, index) + luatexbase_log( + "Removing `" .. description .. "' from `" .. name .. "'." + ) + if #l == 0 then + callbacklist[name] = nil + callback_register(name, nil) + end + return cb.func,cb.description +end +luatexbase.remove_from_callback = remove_from_callback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{in_callback} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.0h}{2015/11/27}{Guard against undefined list latex/4445} +% Look for a function description in a callback. +% \begin{macrocode} +local function in_callback(name, description) + if not name + or name == "" + or not callbacklist[name] + or not callbacktypes[name] + or not description then + return false + end + for _, i in pairs(callbacklist[name]) do + if i.description == description then + return true + end + end + return false +end +luatexbase.in_callback = in_callback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{disable_callback} +% \changes{v1.0a}{2015/09/24}{Function added} +% As we subvert the engine interface we need to provide a way to access +% this functionality. +% \begin{macrocode} +local function disable_callback(name) + if(callbacklist[name] == nil) then + callback_register(name, false) + else + luatexbase_error("Callback list for " .. name .. " not empty") + end +end +luatexbase.disable_callback = disable_callback +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{callback_descriptions} +% \changes{v1.0a}{2015/09/24}{Function added} +% \changes{v1.0h}{2015/11/27}{Match test in in-callback latex/4445} +% List the descriptions of functions registered for the given callback. +% \begin{macrocode} +local function callback_descriptions (name) + local d = {} + if not name + or name == "" + or not callbacklist[name] + or not callbacktypes[name] + then + return d + else + for k, i in pairs(callbacklist[name]) do + d[k]= i.description + end + end + return d +end +luatexbase.callback_descriptions =callback_descriptions +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{uninstall} +% \changes{v1.0e}{2015/10/02}{Function added} +% Unlike at the \TeX{} level, we have to provide a back-out mechanism here +% at the same time as the rest of the code. This is not meant for use by +% anything other than \textsf{latexrelease}: as such this is +% \emph{deliberately} not documented for users! +% \begin{macrocode} +local function uninstall() + module_info( + "luatexbase", + "Uninstalling kernel luatexbase code" + ) + callback.register = callback_register + luatexbase = nil +end +luatexbase.uninstall = uninstall +% \end{macrocode} +% \end{macro} +% \endgroup +% +% \begin{macrocode} +%</lua> +% \end{macrocode} +% +% Reset the catcode of |@|. +% \begin{macrocode} +%<tex>\catcode`\@=\etatcatcode\relax +% \end{macrocode} +% +% +% \Finale diff --git a/Master/texmf-dist/source/latex-dev/base/ltmath.dtx b/Master/texmf-dist/source/latex-dev/base/ltmath.dtx new file mode 100644 index 00000000000..d7c283f9ef8 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltmath.dtx @@ -0,0 +1,1104 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltmath.dtx +% +%<leqno>\ProvidesFile{leqno.clo} +%<fleqn>\ProvidesFile{fleqn.clo} +%<leqno,fleqn> [2016/12/29 v1.2b Standard LaTeX option +%<leqno> (left equation numbers)] +%<fleqn> (flush left equations)] +% +%<*driver> +% \fi +\ProvidesFile{ltmath.dtx} + [2018/09/24 v1.2b LaTeX Kernel (Math Setup)] +% \iffalse +%</driver> +% +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{ltmath.dtx} +\title{\filename} +\date{\filedate} +\author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.1b}{1996/07/26}{Removed \cs{global} before +% \cs{@ignoretrue} in various places.} +% \changes{v1.1c}{1998/08/17}{(RmS) Minor documentation fixes.} +% \changes{v1.1g}{2005/11/10}{(MH) Minor documentation fixes.} +% +% \section{Math setup} +% +% This file contains a lot of the original plain \TeX{} code, as well +% as the \LaTeX{} environments for math. It still needs sorting out. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +\message{math definitions,} +% \end{macrocode} +% +% +% +% \subsection{Math commands based on plain \TeX} +% +% \subsubsection{The log-like functions} +% +% \changes{1.0m}{1994/10/29}{ASAJ: Added \cs{DeclareMathOperator}.} +% \changes{v1.0o}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{1.0q}{1994/11/30}{ASAJ: \cs{DeclareMathOperator} moved to +% AMS\LaTeX.} +% \changes{v1.0r}{1995/05/07}{Use \cs{hb@xt@}} +% \changes{v1.0r}{1995/05/21}{Update some plain macros} +% \changes{v1.0t}{1995/06/28}{minor doc edits} +% +% \begin{macro}{\log} +% The standard operators: +% \begin{macrocode} +\def\log{\mathop{\operator@font log}\nolimits} +\def\lg{\mathop{\operator@font lg}\nolimits} +\def\ln{\mathop{\operator@font ln}\nolimits} +\def\lim{\mathop{\operator@font lim}} +\def\limsup{\mathop{\operator@font lim\,sup}} +\def\liminf{\mathop{\operator@font lim\,inf}} +\def\sin{\mathop{\operator@font sin}\nolimits} +\def\arcsin{\mathop{\operator@font arcsin}\nolimits} +\def\sinh{\mathop{\operator@font sinh}\nolimits} +\def\cos{\mathop{\operator@font cos}\nolimits} +\def\arccos{\mathop{\operator@font arccos}\nolimits} +\def\cosh{\mathop{\operator@font cosh}\nolimits} +\def\tan{\mathop{\operator@font tan}\nolimits} +\def\arctan{\mathop{\operator@font arctan}\nolimits} +\def\tanh{\mathop{\operator@font tanh}\nolimits} +\def\cot{\mathop{\operator@font cot}\nolimits} +\def\coth{\mathop{\operator@font coth}\nolimits} +\def\sec{\mathop{\operator@font sec}\nolimits} +\def\csc{\mathop{\operator@font csc}\nolimits} +\def\max{\mathop{\operator@font max}} +\def\min{\mathop{\operator@font min}} +\def\sup{\mathop{\operator@font sup}} +\def\inf{\mathop{\operator@font inf}} +\def\arg{\mathop{\operator@font arg}\nolimits} +\def\ker{\mathop{\operator@font ker}\nolimits} +\def\dim{\mathop{\operator@font dim}\nolimits} +\def\hom{\mathop{\operator@font hom}\nolimits} +\def\det{\mathop{\operator@font det}} +\def\exp{\mathop{\operator@font exp}\nolimits} +\def\Pr{\mathop{\operator@font Pr}} +\def\gcd{\mathop{\operator@font gcd}} +\def\deg{\mathop{\operator@font deg}\nolimits} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bmod} +% And some operators have to be done by hand: +% \begin{macrocode} +\def\bmod{% + \nonscript\mskip-\medmuskip\mkern5mu% + \mathbin{\operator@font mod}\penalty900\mkern5mu% + \nonscript\mskip-\medmuskip} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pmod} +% \begin{macrocode} +\def\pmod#1{% + \allowbreak\mkern18mu({\operator@font mod}\,\,#1)} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Biggggg} +% +% \begin{macro}{\big} +% Variants on |\big| and friends for use with delimiters: +% \begin{macrocode} +\def\bigl{\mathopen\big} +\def\bigm{\mathrel\big} +\def\bigr{\mathclose\big} +\def\Bigl{\mathopen\Big} +\def\Bigm{\mathrel\Big} +\def\Bigr{\mathclose\Big} +\def\biggl{\mathopen\bigg} +\def\biggm{\mathrel\bigg} +\def\biggr{\mathclose\bigg} +\def\Biggl{\mathopen\Bigg} +\def\Biggm{\mathrel\Bigg} +\def\Biggr{\mathclose\Bigg} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The UNSORTED Rest} +% +% The other math commands are lifted from plain \TeX. +% +% \begin{macro}{\jot} +% \begin{macrocode} +\newdimen\jot +\jot=3pt +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\interdisplaylinepenalty} +% \begin{macrocode} +\newcount\interdisplaylinepenalty +\interdisplaylinepenalty=100 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\choose} +% \begin{macrocode} +\def\choose{\atopwithdelims()} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\brack} +% \begin{macrocode} +\def\brack{\atopwithdelims[]} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\brace} +% \begin{macrocode} +\def\brace{\atopwithdelims\{\}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mathpalette} +% \begin{macrocode} +\def\mathpalette#1#2{% + \mathchoice + {#1\displaystyle{#2}}% + {#1\textstyle{#2}}% + {#1\scriptstyle{#2}}% + {#1\scriptscriptstyle{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\root} +% \changes{v1.1d}{1997/01/08} +% {(DPC) Remove spurious space tokens from +% plain \TeX\ definition /2359} +% \begin{macro}{\rootbox} +% \begin{macro}{\r@@t} +% \changes{v1.0r}{1995/05/21}{Use \cs{sqrtsign} instead of +% \cs{sqrt}} +% \begin{macrocode} +\newbox\rootbox +% \end{macrocode} +% +% \begin{macrocode} +\def\root#1\of{% + \setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$}% + \mathpalette\r@@t} +% \end{macrocode} +% +% \begin{macrocode} +\def\r@@t#1#2{% + \setbox\z@\hbox{$\m@th#1\sqrtsign{#2}$}% + \dimen@\ht\z@ \advance\dimen@-\dp\z@ + \mkern5mu\raise.6\dimen@\copy\rootbox + \mkern-10mu\box\z@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\phantom} +% \changes{v1.0p}{1994/11/18} +% {(DPC) use \cs{expandafter} instead of \cs{next}} +% \changes{v1.0p}{1994/11/18} +% {(DPC) colour support} +% \begin{macro}{\hphantom} +% \begin{macro}{\vphantom} +% \begin{macrocode} +\newif\ifv@ +\newif\ifh@ +% \end{macrocode} +% +% \begin{macrocode} +\def\vphantom{\v@true\h@false\ph@nt} +% \end{macrocode} +% +% \begin{macrocode} +\def\hphantom{\v@false\h@true\ph@nt} +% \end{macrocode} +% +% \begin{macrocode} +\def\phantom{\v@true\h@true\ph@nt} +% \end{macrocode} +% +% \begin{macrocode} +\def\ph@nt{% + \ifmmode + \expandafter\mathpalette\expandafter\mathph@nt + \else + \expandafter\makeph@nt + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\makeph@nt#1{% + \setbox\z@\hbox{\color@begingroup#1\color@endgroup}\finph@nt} +% \end{macrocode} +% +% \begin{macrocode} +\def\mathph@nt#1#2{% + \setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt} +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\finph@nt}{Start LR-mode}% +\def\finph@nt{% + \setbox\tw@\null + \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi + \ifh@ \wd\tw@\wd\z@\fi +% \end{macrocode} +% \changes{v1.2b}{2018/09/24}{Start LR-mode if necessary (git/49)} +% \begin{macrocode} + \leavevmode@ifvmode\box\tw@} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\finph@nt}{Start LR-mode}% +%<latexrelease>\def\finph@nt{% +%<latexrelease> \setbox\tw@\null +%<latexrelease> \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi +%<latexrelease> \ifh@ \wd\tw@\wd\z@\fi \box\tw@} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mathstrut} +% \begin{macrocode} +\def\mathstrut{\vphantom(} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smash} +% \changes{v1.0p}{1994/11/18} +% {(DPC) use \cs{expandafter} instead of \cs{next}} +% \changes{v1.0p}{1994/11/18} +% {(DPC) colour support} +% \begin{macrocode} +\def\smash{% + \relax % \relax, in case this comes first in \halign + \ifmmode + \expandafter\mathpalette\expandafter\mathsm@sh + \else + \expandafter\makesm@sh + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\makesm@sh#1{% + \setbox\z@\hbox{\color@begingroup#1\color@endgroup}\finsm@sh} +\def\mathsm@sh#1#2{% + \setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +% \end{macrocode} +% \changes{v1.2b}{2018/09/24}{Start LR-mode if necessary (git/49)} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\finsm@sh}{Start LR-mode}% +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \leavevmode@ifvmode\box\z@} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\finsm@sh}{Start LR-mode}% +%<latexrelease>\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\buildrel} +% \begin{macrocode} +\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\cases} +% \changes{LaTeX2.09}{1991/08/14} +% {(RmS) inserted extra braces around entry for NFSS} +% \begin{macrocode} +\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th + \ialign{$##\hfil$&\quad{##}\hfil\crcr#1\crcr}}\right.} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\matrix} +% \begin{macrocode} +\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th + \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pmatrix} +% \begin{macrocode} +\def\pmatrix#1{\left(\matrix{#1}\right)} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\bordermatrix} +% \changes{LaTeX2e}{1994/01/25}{Removed \cs{p@renwd}.} +% \begin{macrocode} +\def\bordermatrix#1{\begingroup \m@th + \@tempdima 8.75\p@ + \setbox\z@\vbox{% + \def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}% + \ialign{$##$\hfil\kern2\p@\kern\@tempdima&\thinspace\hfil$##$\hfil + &&\quad\hfil$##$\hfil\crcr + \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}% + #1\crcr\omit\strut\cr}}% + \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{$\kern\wd\@ne\kern-\@tempdima\left(\kern-\wd\@ne + \global\setbox\@ne\vbox{\box\@ne\kern2\p@}% + \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}% + \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\openup} +% \begin{macrocode} +\def\openup{\afterassignment\@penup\dimen@} +% \end{macrocode} +% +% \begin{macrocode} +\def\@penup{\advance\lineskip\dimen@ + \advance\baselineskip\dimen@ + \advance\lineskiplimit\dimen@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\displaylines} +% \begin{macrocode} +\newif\ifdt@p +% \end{macrocode} +% +% \begin{macrocode} +\def\displ@y{\global\dt@ptrue\openup\jot\m@th + \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000\p@ + \vskip-\lineskiplimit \vskip\normallineskiplimit \fi + \else \penalty\interdisplaylinepenalty \fi}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y +% \end{macrocode} +% +% \begin{macrocode} +\def\displaylines#1{\displ@y \tabskip\z@skip + \halign{\hb@xt@\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr + #1\crcr}} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0r}{1995/05/21}{Remove \cs{mathhexbox} from this file} +% +% \begin{macro}{\sp} +% \begin{macro}{\sb} +% \begin{macrocode} +\let\sp=^ +\let\sb=_ +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\>} +% \begin{macro}{\;} +% \begin{macro}{\!} +% \begin{macrocode} +%\def\,{\mskip\thinmuskip} % already defined in ltspace +\def\>{\mskip\medmuskip} +\def\;{\mskip\thickmuskip} +\def\!{\mskip-\thinmuskip} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\*} +% \begin{macrocode} +\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\:} +% Nickname for the medium space since |\>| is not available inside +% \texttt{tabbing}. +% \begin{macrocode} +\let\:=\> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\active@math@prime} +% \changes{v1.1e}{1999/10/09}{Macro added, see PR 3104.} +% This is the definition of the active math prime. +% \begin{macrocode} +\def\active@math@prime{^\bgroup\prim@s} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\prime@s} +% \changes{v1.0p}{1994/11/18} +% {(DPC) use \cs{@let@token} instead of \cs{next} +% and \cs{expandafter} instead of \cs{nxt}} +% \changes{v1.1e}{1999/10/09}{Introduce \cs{active@math@prime}.} +% \begin{macrocode} +{\catcode`\'=\active \global\let'\active@math@prime} +% \end{macrocode} +% +% \begin{macrocode} +\def\prim@s{% + \prime\futurelet\@let@token\pr@m@s} +% \end{macrocode} +% +% \begin{macrocode} +\def\pr@m@s{% + \ifx'\@let@token + \expandafter\pr@@@s + \else + \ifx^\@let@token + \expandafter\expandafter\expandafter\pr@@@t + \else + \egroup + \fi + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\pr@@@s#1{\prim@s} +% \end{macrocode} +% +% \begin{macrocode} +\def\pr@@@t#1#2{#2\egroup} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0i}{1994/05/17}{Replaced \cs{let} by \cs{gdef}, for +% indirect definition.} +% \begin{macrocode} +{\catcode`\_=\active \gdef_{\_}} % _ in math is + % either subscript or \_ +% \end{macrocode} +% +% +% \changes{v1.0m}{1994/10/29}{ASAJ: Removed \cs{dag}, \cs{ddag}.} +% \changes{v1.0m}{1994/10/29}{ASAJ: Renamed \cs{S} and \cs{P} to +% \cs{mathsection} and \cs{mathparagraph} and made them +% \cs{mathchardef}s.} +% \changes{v1.0m}{1994/10/29}{ASAJ: Added \cs{mathellipsis}, +% \cs{mathdollar} and \cs{mathsterling}.} +% \changes{v1.0n}{1994/10/30}{ASAJ: Moved the new commands to ltoutenc.} +% +% \subsection{Math Environments} +% +% \changes{1.0m}{1994/10/29}{ASAJ: Tidied up documentation.} +% +% \begin{macro}{\(} +% \begin{macro}{\)} +% Produces |$...$| with checks that |\(| isn't used in math mode, and +% that |\)| is only used in math mode begun with |\(|. +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\(}{Make \( robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\({% + \relax\ifmmode\@badmath\else$\fi}% +\DeclareRobustCommand\){% + \relax\ifmmode\ifinner$\else\@badmath\fi\else \@badmath\fi}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\(}{Make \( robust}% +%<latexrelease>\def\({% +%<latexrelease> \relax\ifmmode\@badmath\else$\fi}% +%<latexrelease>\expandafter\let\csname\string( \endcsname\@undefined +%<latexrelease>\def\){% +%<latexrelease> \relax\ifmmode\ifinner$\else\@badmath\fi\else \@badmath\fi}% +%<latexrelease>\expandafter\let\csname\string) \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\[} +% \changes{v1.1g}{2005/11/10} +% {(MH) Fixed potential problem in \cs{[} (pr/3399).} +% \begin{macro}{\]} +% Produces |$$...$$| with checks that |\[| isn't used in math mode, +% and that |\]| is only used in display math mode (though there is no +% real test that this display math started with |\[| and not with |$$|). +% \changes{v1.1h}{2015/01/08}{Make Robust (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\[}{Make \[ robust}% +%<*2ekernel|latexrelease> +\DeclareRobustCommand\[{% + \relax\ifmmode + \@badmath + \else + \ifvmode + \nointerlineskip + \makebox[.6\linewidth]{}% + \fi + $$%%$$ BRACE MATCH HACK + \fi +}% +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand\]{% + \relax\ifmmode + \ifinner + \@badmath + \else + $$%%$$ BRACE MATCH HACK + \fi + \else + \@badmath + \fi + \ignorespaces +}% +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\[}{Make \[ robust}% +%<latexrelease>\def\[{% +%<latexrelease> \relax\ifmmode +%<latexrelease> \@badmath +%<latexrelease> \else +%<latexrelease> \ifvmode +%<latexrelease> \nointerlineskip +%<latexrelease> \makebox[.6\linewidth]{}% +%<latexrelease> \fi +%<latexrelease> $$%%$$ BRACE MATCH HACK +%<latexrelease> \fi +%<latexrelease>}% +%<latexrelease>\expandafter\let\csname\string[ \endcsname\@undefined +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\def\]{% +%<latexrelease> \relax\ifmmode +%<latexrelease> \ifinner +%<latexrelease> \@badmath +%<latexrelease> \else +%<latexrelease> $$%%$$ BRACE MATCH HACK +%<latexrelease> \fi +%<latexrelease> \else +%<latexrelease> \@badmath +%<latexrelease> \fi +%<latexrelease> \ignorespaces +%<latexrelease>}% +%<latexrelease>\expandafter\let\csname\string] \endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{environment}{math} +% \begin{environment}{displaymath} +% Disguises for |\(...\)| and |\[...\]|. +% \begin{macrocode} +\let\math=\( +\let\endmath=\) +% \end{macrocode} +% +% \begin{macrocode} +\def\displaymath{\[} +\def\enddisplaymath{\]\@ignoretrue} +% \end{macrocode} +% \end{environment} +% \end{environment} +% +% +% \begin{environment}{equation} +% \changes{LaTeX2.09}{1992/01/10}{RmS: put \cs{hbox} around \cs{@eqnnum} +% to typeset the equation number in text mode +% (as in the eqnarray env.)} +% \begin{macro}{\c@equation} +% Numbered equations, using the counter |\c@equation|. +% \emph{Note}: The document style must define |\theequation| etc., and +% do the appropriate |\@addtoreset|. It should also redefine |\@eqnnum| +% if another format for the equation number is desired other than the +% standard (...), or to move the equation numbers to the flushleft. +% (See comment on the |\def| of |\@eqnnum|.) +% \begin{macrocode} +\@definecounter{equation} +\def\equation{$$\refstepcounter{equation}} +\def\endequation{\eqno \hbox{\@eqnnum}$$\@ignoretrue} +% \end{macrocode} +% \end{macro} +% \end{environment} +% +% \begin{macro}{\@eqnnum} +% \changes{LaTeX2.09}{1991/09/29}{RmS: \cs{reset@font} added.} +% \changes{v1.0l}{1994/10/23}{Added \cs{normalcolor} since \cs{eqno} +% introduces a subgroup of the displayed math group} +% +% Produces the equation number for equation and +% eqnarray environments. The following definition is for +% flushright numbers; for flushleft numbers, see leqno.clo. +% The equation number is set in black roman type even +% if an eqnarray environment appears in an italic environment. +% \changes{v1.0s}{1995/05/26}{Removed \cs{rmfamily} (PR 1578), +% replaced \cs{reset@font} with \cs{normalfont}} +% \begin{macrocode} +\def\@eqnnum{{\normalfont \normalcolor (\theequation)}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\stackrel} +% A disguise for plain \TeX's buildrel. +% \begin{macrocode} +\def\stackrel#1#2{\mathrel{\mathop{#2}\limits^{#1}}} +% \end{macrocode} +% \end{macro} +% +% \changes{v0.9g}{1993/12/11}{Added a group around the first argument +% of \cs{frac} to prevent +% changes (for example font changes) from modifying the contents of +% the second argument.} +% +% \begin{macro}{\frac} +% A disguise for plain \TeX's |\over|. +% \begin{macrocode} +\def\frac#1#2{{\begingroup#1\endgroup\over#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sqrt} +% \changes{v1.0y}{1995/10/16}{(DPC) Make robust /1808} +% \begin{macro}{\@sqrt} +% Add an optional argument to plain's |\sqrt| to give the $n$th root +% of an expression $\sqrt[n]{e}$. +% \changes{v1.0r}{1995/05/21}{Use \cs{sqrtsign}} +% \begin{macrocode} +\DeclareRobustCommand\sqrt{\@ifnextchar[\@sqrt\sqrtsign} +\def\@sqrt[#1]{\root #1\of} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{LaTeX2.09}{1985/11/04}{produce warning message if line +% extends into margin. Doesn't warn about formula +% overprinting equation number.} +% \changes{LaTeX2.09}{1993/11/02}{RmS: +% Corrected description of \cs{@eqnsel}, moved \cs{@eqnsel} +% accordingly and removed extra \cs{tabskip} assignment.} +% \changes{LaTeX2e}{1993/11/03}{RmS: Initialized \cs{everycr} to empty} +% \changes{v0.9i}{1993/12/16} +% {use \cs{refstepcounter} instead of shortcut} +% \changes{v0.9o}{1994/01/13}{correcting 0.9i} +% +% \begin{environment}{eqnarray} +% \begin{macro}{\@eqcnt} +% \begin{macro}{\@eqpen} +% \begin{macro}{\if@eqnsw} +% \begin{macro}{\@eqnsel} +% Here's the eqnarray environment: +% Default is for left-hand side of equations to be flushright. +% To make them flushleft, |\let\@eqnsel = \hfil|. +% \begin{macrocode} +\newcount\@eqcnt +\newcount\@eqpen +\newif\if@eqnsw\@eqnswtrue +\newskip\@centering +\@centering = 0pt plus 1000pt +% \end{macrocode} +% To get a proper \cs{@currentlabel} we have to redefine it for the +% whole display. Note that we can't use \cs{refstepcounter} as this +% results in |\@currentlabel| getting restored at the wrong and +% thus always writing the first label to the \texttt{.aux} file. +% \begin{macrocode} +\def\eqnarray{% + \stepcounter{equation}% + \def\@currentlabel{\p@equation\theequation}% + \global\@eqnswtrue + \m@th + \global\@eqcnt\z@ + \tabskip\@centering + \let\\\@eqncr + $$\everycr{}\halign to\displaywidth\bgroup + \hskip\@centering$\displaystyle\tabskip\z@skip{##}$\@eqnsel + &\global\@eqcnt\@ne\hskip \tw@\arraycolsep \hfil${##}$\hfil + &\global\@eqcnt\tw@ \hskip \tw@\arraycolsep + $\displaystyle{##}$\hfil\tabskip\@centering + &\global\@eqcnt\thr@@ \hb@xt@\z@\bgroup\hss##\egroup + \tabskip\z@skip + \cr +} +% \end{macrocode} +% +% \begin{macrocode} +\def\endeqnarray{% + \@@eqncr + \egroup + \global\advance\c@equation\m@ne + $$\@ignoretrue +} +% \end{macrocode} +% +% \begin{macrocode} +\let\@eqnsel=\relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{environment} +% +% \begin{macro}{\nonumber} +% Switches off equation numbering. +% \begin{macrocode} +\def\nonumber{\global\@eqnswfalse} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@eqncr} +% \begin{macro}{\@xeqncr} +% \begin{macro}{\@yeqncr} +% \changes{v1.0y}{1995/10/16}{(DPC) Use \cs{@testopt} /1911} +% \begin{macrocode} +\def\@eqncr{% + {\ifnum0=`}\fi + \@ifstar{% + \global\@eqpen\@M\@yeqncr + }{% + \global\@eqpen\interdisplaylinepenalty \@yeqncr + }% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\@yeqncr{\@testopt\@xeqncr\z@skip} +% \end{macrocode} +% +% \begin{macrocode} +\def\@xeqncr[#1]{% + \ifnum0=`{\fi}% + \@@eqncr + \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}% +} +% \end{macrocode} +% +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@eqncr} +% \changes{v0.9i}{1993/12/16}{use \cs{refstepcounter} instead of shortcut} +% \changes{v0.9o}{1994/01/13}{correcting 0.9i} +% +% \begin{macrocode} +\def\@@eqncr{\let\reserved@a\relax + \ifcase\@eqcnt \def\reserved@a{& & &}\or \def\reserved@a{& &}% + \or \def\reserved@a{&}\else + \let\reserved@a\@empty + \@latex@error{Too many columns in eqnarray environment}\@ehc\fi + \reserved@a \if@eqnsw\@eqnnum\stepcounter{equation}\fi + \global\@eqnswtrue\global\@eqcnt\z@\cr} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{eqnarray*} +% \begin{macro}{\@seqncr} +% Here's the eqnarray* environment: +% \begin{macrocode} +\let\@seqncr=\@eqncr +% \end{macrocode} +% +% \begin{macrocode} +\@namedef{eqnarray*}{\def\@eqncr{\nonumber\@seqncr}\eqnarray} +% \end{macrocode} +% +% \begin{macrocode} +\@namedef{endeqnarray*}{\nonumber\endeqnarray} +% \end{macrocode} +% \end{macro} +% \end{environment} +% +% \begin{macro}{\lefteqn} +% |\lefteqn{FORMULA}| typesets |FORMULA| in display math style +% flushleft in a box of width zero. +% \changes{v1.0r}{1995/05/21}{Use \cs{rlap}} +% \begin{macrocode} +\def\lefteqn#1{\rlap{$\displaystyle #1$}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ensuremath} +% In math mode, |\ensuremath{text}| is equivalent to text; in LR or +% paragraph mode, it is equivalent to |$|text|$|. +% |\relax| is not needed +% in front of the |\ifmmode| as |\protect| will be |\let| to |\relax|. +% This version (due to Donald Arseneau) avoids duplicating its +% argument in the `then' and `else' part of the |\ifmath| which is +% necessary in nested `tabular' like environments. See amslatex/2104. +% \changes{v1.0k}{1994/05/16} +% {Use \cs{DeclareRobustCommand} and add extra braces in math mode} +% \changes{v1.0l}{1994/10/23}{Remove extra braces: but see p 168 of +% Leslie's book} +% \changes{v1.1a}{1996/03/25}{Reimplement for amslatex/2104} +% \begin{macrocode} +\DeclareRobustCommand{\ensuremath}{% + \ifmmode + \expandafter\@firstofone + \else + \expandafter\@ensuredmath + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ensuredmath} +% \changes{v1.1a}{1996/03/25}{Macro added for amslatex/2104} +% \changes{v1.1c}{1996/11/09}{Made long, as it was before. /2104} +% The |\relax| stops |\ensuremath{}| starting display math. +% \begin{macrocode} +\long\def\@ensuredmath#1{$\relax#1$} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% +% +% \subsection{External options to the standard document classes} +% +% \changes{v1.0u}{1995/08/09} +% {Added code for class options leqno and fleqn} +% +% \subsubsection{Left equation numbering} +% +% \begin{macro}{\@eqnnum} +% To put the equation number on the left side of an equation we +% have to use a little trick. The number is shifted |\displaywidth| +% to the left inside a box of (approximately) zero width. This +% fails when the quation is too wide, the equation number than may +% overprint the equation itself. +% \changes{v1.2y classes}{1995/01/12}{Added \cs{normalcolor}} +% \changes{v1.3c classes}{1995/05/25} +% {replace \cs{reset@font}\cs{rmfamily} with \cs{normalfont} +% (PR 1578)} +% \begin{macrocode} +%<*leqno> +\renewcommand\@eqnnum{\hb@xt@.01\p@{}% + \rlap{\normalfont\normalcolor + \hskip -\displaywidth(\theequation)}} +%</leqno> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Flush left equations} +% +% To get the displayed math environments to print the contents +% flush left (with an indentation) we have to redefine all of +% \LaTeXe's displayed math environments. +% +% \begin{macro}{\mathindent} +% The amount of indentation of the equations is stored in a register. +% \begin{macrocode} +%<*fleqn> +\newdimen\mathindent +% \end{macrocode} +% The setting of |\mathindent| has to be deferred until the class +% file has been processed, because |\leftmargini| is still 0pt +% wide at the moment \texttt{fleqn.clo} is read in. +% \changes{v1.0n classes} +% {1994/01/19}{Deferred setting of \cs{mathindent}} +% \changes{v1.2t classes} +% {1994/06/22}{Set \cs{mathindent} at the end of the +% class instead of at begin document} +% \begin{macrocode} +\AtEndOfClass{\mathindent\leftmargini} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\[} +% Begin display math; +% \begin{macrocode} +\IncludeInRelease{2015/01/01}{\[}{Make \[ robust}% +\DeclareRobustCommand\[{\relax + \ifmmode\@badmath + \else + \begin{trivlist}% + \@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty + \item[]\leavevmode + \hb@xt@\linewidth\bgroup $\m@th\displaystyle %$ + \hskip\mathindent\bgroup + \fi} +\EndIncludeInRelease +% \end{macrocode} +% +% \begin{macrocode} +\IncludeInRelease{0000/00/00}{\[}{Make \[ robust}% +\renewcommand\[{\relax + \ifmmode\@badmath + \else + \begin{trivlist}% + \@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty + \item[]\leavevmode + \hb@xt@\linewidth\bgroup $\m@th\displaystyle %$ + \hskip\mathindent\bgroup + \fi} +\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\]} +% end display math; +% \begin{macrocode} +\IncludeInRelease{2015/01/01}{\]}{Make \] robust}% +\DeclareRobustCommand\]{\relax + \ifmmode + \egroup $\hfil% $ + \egroup + \end{trivlist}% + \else \@badmath + \fi} +\EndIncludeInRelease +% \end{macrocode} +% +% \begin{macrocode} +\IncludeInRelease{0000/00/00}{\]}{Make \] robust}% +\renewcommand\]{\relax + \ifmmode + \egroup $\hfil% $ + \egroup + \end{trivlist}% + \else \@badmath + \fi} +\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{equation} +% The \textsf{equation} environment +% \begin{macrocode} +\renewenvironment{equation}% + {\@beginparpenalty\predisplaypenalty + \@endparpenalty\postdisplaypenalty + \refstepcounter{equation}% + \trivlist \item[]\leavevmode + \hb@xt@\linewidth\bgroup $\m@th% $ + \displaystyle + \hskip\mathindent}% + {$\hfil % $ + \displaywidth\linewidth\hbox{\@eqnnum}% + \egroup + \endtrivlist} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{eqnarray} +% The \textsf{eqnarray} environment +% \begin{macrocode} +\renewenvironment{eqnarray}{% + \stepcounter{equation}% + \def\@currentlabel{\p@equation\theequation}% + \global\@eqnswtrue\m@th + \global\@eqcnt\z@ + \tabskip\mathindent + \let\\=\@eqncr + \setlength\abovedisplayskip{\topsep}% + \ifvmode + \addtolength\abovedisplayskip{\partopsep}% + \fi +% \end{macrocode} +% When the documentclass uses a non-zero |\parskip| setting the +% |\topsep| might have a negative value to compensate for +% that. Therefore we add |\parskip| to |\abovedisplayskip|. +% \changes{v1.2v classes}{1994/11/10}{Added value of \cs{parskip} to +% \cs{abovedisplayskip} to compensate for negative \cs{topsep}} +% \begin{macrocode} + \addtolength\abovedisplayskip{\parskip}% + \setlength\belowdisplayskip{\abovedisplayskip}% + \setlength\belowdisplayshortskip{\abovedisplayskip}% + \setlength\abovedisplayshortskip{\abovedisplayskip}% + $$\everycr{}\halign to\linewidth% $$ + \bgroup + \hskip\@centering + $\displaystyle\tabskip\z@skip{##}$\@eqnsel&% + \global\@eqcnt\@ne \hskip \tw@\arraycolsep \hfil${##}$\hfil&% + \global\@eqcnt\tw@ \hskip \tw@\arraycolsep + $\displaystyle{##}$\hfil \tabskip\@centering&% + \global\@eqcnt\thr@@ + \hb@xt@\z@\bgroup\hss##\egroup\tabskip\z@skip\cr}% + {\@@eqncr + \egroup + \global\advance\c@equation\m@ne$$% $$ + \@ignoretrue + } +%</fleqn> +% \end{macrocode} +% \end{environment} +% +% +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx b/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx new file mode 100644 index 00000000000..122ef3b39bf --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltmiscen.dtx @@ -0,0 +1,1119 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltmiscen.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltmiscen.dtx} + [2018/10/11 v1.1o LaTeX Kernel (Misc. Environments)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltmiscen.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0c}{1994/03/28}{Improve Documentation} +% \changes{v1.0d}{1994/03/29}{Remove counter macros to ltcntlen} +% \changes{v1.0g}{1994/05/02}{Changed 91 to 1991 and moved some bits} +% \changes{v1.0i}{1994/05/05}{Removed braces from ifnextchar and +% ifstar arguments} +% \changes{v1.0m}{1994/05/20}{Use new warning commands} +% \changes{v1.0n}{1994/05/21}{Use new error commands} +% \changes{v1.0s}{1994/10/14}{Move math to other file} +% \changes{v1.0v}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0x}{1995/04/22}{Removed extra def of \cs{@gobble}} +% \changes{v1.0z}{1995/07/13}{Improve Documentation} +% \changes{v1.1c}{1996/04/22}{Improve Documentation} +% \changes{v1.1d}{1996/06/03}{Move setting of verbatim font and +% \cs{@noligs}.} +% \changes{v1.1g}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% \section{Miscellaneous Environments} +% This section implements the basic environment mechanism, and also +% a few specific environments including |document|, The math +% environments and related commands, the `flushing' environments, +% (|center|, |flushleft|, |flushright|), and |verbatim|. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +\message{environments,} +% \end{macrocode} +% +% \subsection{Environments} +% +% |\begin{foo}| and |\end{foo}| are used to delimit environment |foo|. +% +% |\begin{foo}| starts a group and calls |\foo| if it is defined, +% otherwise it does nothing. +% +% |\end{foo}| checks to see that it matches the +% corresponding |\begin| and if so, it calls |\endfoo| and does an +% |\endgroup|. Otherwise, |\end{foo}| does nothing. +% +% If |\end{foo}| needs to ignore blanks after it, then |\endfoo| should +% globally set the |@ignore| switch true with |\@ignoretrue| +% (this will automatically be global). +% +% +% NOTE: |\@@end| is defined to be the |\end| command of \TeX82. +% +% |\enddocument| is the user's command for ending the manuscript file. +% +% |\stop| is a panic button --- to end \TeX\ in the middle. +% +% \begin{oldcomments} +% \enddocument == +% BEGIN +% \@checkend{document} %% checks for unmatched \begin +% \clearpage +% \begingroup +% if @filesw = true +% then close file @mainaux +% if G@refundefined = true +% then LaTeX Warning: 'There are undefined references.' fi +% if @multiplelabels = true +% then LaTeX Warning: +% 'One or more label(s) multiply defined.' +% else +% \@setckpt {ARG1}{ARG2} == null +% \newlabel{LABEL}{VAL} == +% BEGIN +% \reserved@a == VAL +% if def(\reserved@a) = def(\r@LABEL) +% else @tempswa := true fi +% END +% \bibcite{LABEL}{VAL} == null +% BEGIN +% \reserved@a == VAL +% if def(\reserved@a) = def(\g@LABEL) +% else @tempswa := true fi +% END +% @tempswa := false +% make @ a letter +% \input \jobname.AUX +% if @tempswa = true +% then LaTeX Warning: 'Label may have changed. +% Rerun to get cross-references right.' +% fi fi fi +% \endgroup +% finish up +% END +% +% \@writefile{EXT}{ENTRY} == +% if tf@EXT undefined +% else \write\tf@EXT{ENTRY} +% fi +% \end{oldcomments} +% +% \begin{macro}{\@currenvir} +% The name of the current environment. Initialized to +% \texttt{document} to so that |\end{document}| works correctly. +% \begin{macrocode} +\def\@currenvir{document} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@ignore} +% \begin{macro}{\@ignoretrue} +% \begin{macro}{\@ignorefalse} +% \changes{v1.1e}{1996/07/26}{put \cs{global} into definition} +% \begin{macrocode} +\def\@ignorefalse{\global\let\if@ignore\iffalse} +\def\@ignoretrue {\global\let\if@ignore\iftrue} +\@ignorefalse +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\ignorespacesafterend} +% \changes{v1.1e}{1996/07/26}{user level macro added} +% \begin{macrocode} +\let\ignorespacesafterend\@ignoretrue +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\enddocument} +% \changes{LaTeX2.09}{1993/08/03} +% {Changed redefinition of \cs{global} to redefinition +% of \cs{@setckpt}.} +% \changes{LaTeX2.09}{1993/09/08} +% {Added warning in case of undefined references.}% +% \changes{v0.9e}{1993/12/09}{Hook added} +% \begin{macrocode} +\def\enddocument{% +% \end{macrocode} +% The |\end{document}| hook is executed first. If necessary it can +% contain a |\clearpage| to output dangling floats first. In this +% position it can also contain something like |\end{foo}| so that +% the whole document effectively starts and ends with some special +% environment. However, this must be used with care, eg if two +% applications would use this without knowledge of each other the +% order of the environments will be wrong after all. +% |\AtEndDocument| is redefined +% at this point so that and such commands that get into the hook do +% not chase their tail\ldots +% \changes{v1.0y}{1995/04/27}{\cs{@checkend} moved after hook} +% \changes{v1.0z}{1995/07/13}{Set \cs{@setckpt} to \cs{@gobbletwo} +% instead of defining it by hand} +% \changes{v1.1i}{2000/05/19} +% {Reset \cs{AtEndDocument} for latex/3060} +% \begin{macrocode} + \let\AtEndDocument\@firstofone + \@enddocumenthook + \@checkend{document}% + \clearpage + \begingroup + \if@filesw + \immediate\closeout\@mainaux + \let\@setckpt\@gobbletwo + \let\@newl@bel\@testdef +% \end{macrocode} +% \changes{v1.0z}{1995/07/13}{Shorten redefinition of \cs{bibcite} and +% \cs{newlabel}} +% The previous line is equiv to setting +%\begin{verbatim} +% \def\newlabel{\@testdef r}% +% \def\bibcite{\@testdef b}% +%\end{verbatim} +% \changes{v1.1k}{2010/08/17}{Use braces around \cs{input} arg (pr/4124)} +% \changes{v1.1l}{2010/08/17}{Change of plan: use \cs{@@input} instead +% (pr/4124)} +% We use |\@@input| to load the \texttt{.aux} file, so that it doesn't +% show up in the list of files produced by |\listfiles|. +% \begin{macrocode} + \@tempswafalse + \makeatletter \@@input\jobname.aux + \fi +% \end{macrocode} +% \changes{v1.0w}{1994/11/30} +% {(DPC) Use \cs{@dofilelist}} +% \begin{macrocode} + \@dofilelist +% \end{macrocode} +% First we check for font size substitution bigger than +% |\fontsubfuzz|. The |\relax| is necessary because this is a macro +% not a register. +% \changes{v1.0w}{1994/11/30} +% {(DPC) Do warnings even for \cs{nofiles}} +% \begin{macrocode} + \ifdim \font@submax >\fontsubfuzz\relax +% \end{macrocode} +% In case you wonder about the |\@gobbletwo| inside the message +% below, this is a horrible hack to remove the tokens |\on@line.| +% that are added by |\@font@warning| at the end. +% \changes{v1.1j}{2000/07/11}{Fix typo in warning} +% \begin{macrocode} + \@font@warning{Size substitutions with differences\MessageBreak + up to \font@submax\space have occurred.\@gobbletwo}% + \fi +% \end{macrocode} +% The macro |\@defaultsubs| is initially |\relax| but gets redefined +% to produce +% a warning if there have been some default font substitutions. +% \changes{v1.0z}{1995/07/13}{Use \cs{@defaultsubs} instead of switch} +% \begin{macrocode} + \@defaultsubs +% \end{macrocode} +% The macro |\@refundefined| is initially |\relax| but gets redefined +% to produce a warning if there are undefined refs. +% \changes{v1.1b}{1995/10/24}{Use \cs{@refundefined} instead of switch} +% \begin{macrocode} + \@refundefined +% \end{macrocode} +% If a label is defined more than once, |\@tempswa| will always be +% true and thus produce a ``Label(s) may \ldots'' warning. But +% since a rerun will not solve that problem (unless one uses a +% package like \texttt{varioref} that generates labels on the fly), +% we suppress this message. +% \changes{v1.0e}{1994/04/20}{Changed logic for producing +% warning messages} +% \changes{v1.1b}{1995/10/24}{Changed logic for producing +% warning messages and removed switch} +% \begin{macrocode} + \if@filesw + \ifx \@multiplelabels \relax + \if@tempswa + \@latex@warning@no@line{Label(s) may have changed. + Rerun to get cross-references right}% + \fi + \else + \@multiplelabels + \fi + \fi + \endgroup + \deadcycles\z@\@@end} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@testdef} +% \begin{macrocode} +\def\@testdef #1#2#3{% + \def\reserved@a{#3}\expandafter \ifx \csname #1@#2\endcsname + \reserved@a \else \@tempswatrue \fi} +% \end{macrocode} +% \end{macro} +% +% +% Reading data from auxiliary files (like \texttt{.toc} normally +% happens in vertical mode and it therefore doesn't matter if line +% endings are converted to spaces by \TeX{} during that process. +% +% However, especially the \texttt{.toc} file might be read in L-R mode +% (in cases the \cs{tableofcontents} attempts to put, say a list of +% sub-sections as a paragraph. In that case the newlines after a line +% like +% \begin{verbatim} +% \contentsline {subsubsection}{\numberline {1.1.1}A C-head}{2} +% \end{verbatim} +% might result in spurious spaces (e.g., when that level is not +% included). +% +% That could be fixed by reading in the file using +% \cs{endlinechar}\texttt{=-1} but that has the danger that it drops +% some valid endlines that should be converted to spaces (for example +% when the user edited the TOC and then used \cs{nofiles} to preserve +% it. +% +% So the approach taken instead is this: +% \begin{itemize} +% \item \cs{addcontentsline} adds the command +% \cs{protected@file@percent} to the end of the second argument of +% \cs{@writefile} that is written to the \texttt{.aux}. As the name +% indicates this is a protected macro so it doesn't change if it is +% written out. +% +% \item When the \texttt{.aux} is read back in at the end of the run, +% \cs{@writefile} is executed and writes its second argument +% unmodified to the file with the extension given by its first +% argument. Or rather that was how it was in the past. +% +% \item Instead we change \cs{@writefile} slightly: basically it looks +% at the second argument and if the last token in there is +% \cs{protected@file@percent} then it is replaced by a percent +% character and that is then written out. If not (for example, if +% the data came from a user issued \cs{addtocontents}, or from some +% package that uses \cs{@writefile} for writing its own files) then +% the command behaves exactly as before. +% \end{itemize} +% +% +% \begin{macro}{\protected@file@percent} +% Dummy cs to be replaced by a percent sign inside +% \cs{@writefile}. If it survives (when used incorrectly) it will +% expand to nothing in a typsetting context. +% \changes{v1.1n}{2018/09/26}{Sometimes mask the endline char when +% writing to files (github/73)} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\protected@file@percent}{Mask line endings}% +\protected\def\protected@file@percent{} +% \end{macrocode} +% \end{macro} + + +% \begin{macro}{\add@percent@to@temptokena} +% Helper function which is used to inspect a sequence of tokens +% (the second argument of \cs{@writefile} and it the last token is +% \cs{protected@file@percent} it will replace it by a harmless +% percent. The result is saved in \cs{@temptokena} for later use. +% \changes{v1.1n}{2018/09/26}{Sometimes mask the endline char when +% writing to files (github/73)} +% \begin{macrocode} +\begingroup +\catcode`\%=12 +% \end{macrocode} +% \texttt{latexrelease} will read this code in high-speed +% mode in certain situations. During that it will only look for +% \cs{if} tests but not actually execute the \cs{catcode} change +% above. As a result it will drop anything after the |%| character +% in the definition. Therefore the |\fi| needs to be on the next +% line and we need locally another comment character to avoid +% getting spaces into the definition---a weird problem :-) +% \begin{macrocode} +\catcode`\^^A=9 +\long\gdef\add@percent@to@temptokena + #1\protected@file@percent#2\add@percent@to@temptokena +% \end{macrocode} +% When we call this macro in |\@writefile| we stick in |\@empty| at +% the beginning, so that in case the tokenlist consists of a single brace +% group the braces aren't stripped. The |\expandafter| then expands +% this extra token away again. +% \begin{macrocode} + {\ifx!#2!\@temptokena\expandafter{#1}\else + \@temptokena\expandafter{#1%^^A +% \end{macrocode} +% Can't be on the same line as the |%| --- see above. +% \begin{macrocode} + }\fi} +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@writefile} +% \changes{v1.0l}{1994/05/20}{Added correct setting of \cs{protect}.} +% \changes{v1.0t}{1994/11/04}{Removed setting of \cs{protect}. ASAJ.} +% \changes{v1.0z}{1995/07/13}{Added missing percent and use \cs{relax} +% in the THEN case} +% \changes{v1.1n}{2018/09/26}{Sometimes mask the endline char when +% writing to files (github/73)} +% \begin{macrocode} +\long\def\@writefile#1#2{% + \@ifundefined{tf@#1}\relax + {% +% \end{macrocode} +% If we write to the file we first prepare |#2| using +% \cs{add@percent@to@temptokena} and then write the token register +% out. +% \begin{macrocode} + \add@percent@to@temptokena + \@empty#2\protected@file@percent + \add@percent@to@temptokena + \immediate\write\csname tf@#1\endcsname{\the\@temptokena}% + }% +} +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\protected@file@percent}{Mask line endings}% +%<latexrelease>\let\protected@file@percent\@undefined +%<latexrelease>\let\add@percent@to@temptokena\@undefined +%<latexrelease>\long\def\@writefile#1#2{% +%<latexrelease> \@ifundefined{tf@#1}\relax +%<latexrelease> {\@temptokena{#2}% +%<latexrelease> \immediate\write\csname tf@#1\endcsname{\the\@temptokena}% +%<latexrelease> }% +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\stop} +% \begin{macrocode} +\def\stop{\clearpage\deadcycles\z@\let\par\@@par\@@end} +% \end{macrocode} +% \end{macro} +% +% +% \begin{oldcomments} +% +% \begin{macrocode} +\everypar{\@nodocument} %% To get an error if text appears before the +\nullfont %% \begin{document} +% \end{macrocode} +% +% \begin, \end, and \@checkend changed so \end{document} will catch +% an unmatched \begin. Changed 24 May 89 as suggested by +% Frank Mittelbach and Rainer Sch\"opf. +% +% \begin{NAME} == +% BEGIN +% IF \NAME undefined THEN \reserved@a == BEGIN report error END +% ELSE \reserved@a == +% (\@currenvir :=L NAME) \NAME +% FI +% @ignore :=G F %% Added 30 Nov 88 +% \begingroup +% \@endpe := F +% \@currenvir :=L NAME +% \NAME +% END +% +% \end{NAME} == +% BEGIN +% \endNAME +% \@checkend{NAME} +% \endgroup +% IF @endpe = T %% @endpe set True by \@endparenv +% THEN \@doendpe %% \@doendpe redefines \par and \everypar +% %% to suppress paragraph indentation in +% FI %% immediately following text +% IF @ignore = T +% THEN @ignore :=G F +% \ignorespaces +% FI +% END +% +% \@checkend{NAME} == +% BEGIN +% IF \@currenvir = NAME +% ELSE \@badend{NAME} +% FI +% END +% +% \end{oldcomments} +% +% +% \begin{macro}{\begin} +% \changes{LaTeX2.09}{1992/03/18}{Changed \cs{@ignoretrue} to +% \cs{@ignorefalse} (as documented)} +% \changes{LaTeX2.09}{1992/08/24}{Added code to \cs{begin} to +% remember line number. Used by \cs{@badend} to display +% position of non-matching \cs{begin}.} +% \changes{v1.1e}{1996/07/26}{remove \cs{global} before \cs{@ignore...}} +% \begin{macrocode} +\def\begin#1{% + \@ifundefined{#1}% + {\def\reserved@a{\@latex@error{Environment #1 undefined}\@eha}}% + {\def\reserved@a{\def\@currenvir{#1}% + \edef\@currenvline{\on@line}% + \csname #1\endcsname}}% + \@ignorefalse + \begingroup\@endpefalse\reserved@a} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\end} +% \changes{v1.1e}{1996/07/26}{remove \cs{global} before \cs{@ignore...}} +% \begin{macrocode} +\def\end#1{% + \csname end#1\endcsname\@checkend{#1}% + \expandafter\endgroup\if@endpe\@doendpe\fi + \if@ignore\@ignorefalse\ignorespaces\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@checkend} +% \begin{macrocode} +\def\@checkend#1{\def\reserved@a{#1}\ifx + \reserved@a\@currenvir \else\@badend{#1}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@currenvline} +% We do need a default value for |\@currenvline| on top-level since +% the document environment cancels the brace group. This means that +% a mismatch with |\begin|\allowbreak|{document}| will not produce +% a line number. Thus the outer default must be |\@empty| or we +% will end up with two spaces. +% \changes{v1.0q}{1994/05/24}{Use \cs{@empty} as outer default} +% \begin{macrocode} +\let\@currenvline\@empty +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Center, Flushright, Flushleft} +% +% \begin{macrocode} +\message{center,} +% \end{macrocode} +% +% \begin{oldcomments} +% +% \center, \flushright and \flushleft set +% \rightskip = 0pt or \@flushglue (as appropriate) +% \leftskip = 0pt or \@flushglue (as appropriate) +% \parindent = 0pt +% \parfillskip = 0pt. (except \flushleft) +% \\ == \par \vskip -\parskip +% \\[LENGTH] == \\ \vskip LENGTH +% \\* == \par \penalty 10000 \vskip -\parskip +% \\*[LEN] == \\* \vskip LENGTH +% +% They invoke the trivlist environment to handle vertical spacing before +% and after them. +% +% \centering, \raggedright and \raggedleft are the declaration analogs +% of the above. +% +% \raggedright has a more universal effect, however. It sets +% \@rightskip := flushglue. Every environment, like the list +% environments, +% that set \rightskip to its 'normal' value set it to \@rightskip +% +% \end{oldcomments} +% +% \begin{macro}{\@centercr} +% \changes{v1.0h}{1994/05/03}{\cs{@badcrerr} replaced by \cs{@nolnerr}} +% \changes{v1.0z}{1995/07/13}{Use \cs{nobreak}} +% \begin{macrocode} +\def\@centercr{\ifhmode \unskip\else \@nolnerr\fi + \par\@ifstar{\nobreak\@xcentercr}\@xcentercr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xcentercr} +% \begin{macrocode} +\def\@xcentercr{\addvspace{-\parskip}\@ifnextchar + [\@icentercr\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@icentercr} +% \begin{macrocode} +\def\@icentercr[#1]{\vskip #1\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% +% \begin{environment}{center} +% \changes{v0.9h}{1993/12/13}{Removed optional argument of \cs{item}} +% \changes{v1.0u}{1994/11/12}{Changed end macro to \cs{def}: safer and +% consistent} +% We use |\relax| to prevent |\item| scanning too far. +% \begin{macrocode} +\def\center{\trivlist \centering\item\relax} +% \end{macrocode} +% +% \begin{macrocode} +\def\endcenter{\endtrivlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\centering} +% \begin{macrocode} +\def\centering{% + \let\\\@centercr + \rightskip\@flushglue\leftskip\@flushglue + \parindent\z@\parfillskip\z@skip} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@rightskip} +% \begin{macrocode} +\newskip\@rightskip \@rightskip \z@skip +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{flushleft} +% \changes{v0.9h}{1993/12/13}{Removed optional argument of \cs{item}} +% \changes{v1.0u}{1994/11/12}{Changed end macro to \cs{def}: safer and +% consistent} +% We use |\relax| to prevent |\item| scanning too far. +% \begin{macrocode} +\def\flushleft{\trivlist \raggedright\item\relax} +% \end{macrocode} +% +% \begin{macrocode} +\def\endflushleft{\endtrivlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\raggedright} +% \begin{macrocode} +\def\raggedright{% + \let\\\@centercr\@rightskip\@flushglue \rightskip\@rightskip + \leftskip\z@skip + \parindent\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{flushright} +% \changes{v0.9h}{1993/12/13}{Removed optional argument of \cs{item}} +% \changes{v1.0u}{1994/11/12}{Changed end macro to \cs{def}: safer and +% consistent} +% We use |\relax| to prevent |\item| scanning too far. +% \begin{macrocode} +\def\flushright{\trivlist \raggedleft\item\relax} +% \end{macrocode} +% +% \begin{macrocode} +\def\endflushright{\endtrivlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\raggedleft} +% \begin{macrocode} +\def\raggedleft{% + \let\\\@centercr + \rightskip\z@skip\leftskip\@flushglue + \parindent\z@\parfillskip\z@skip} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Verbatim} +% +% \begin{macrocode} +\message{verbatim,} +% \end{macrocode} +% +% The verbatim environment uses the fixed-width |\ttfamily| font, turns +% blanks into spaces, starts a new line for each carriage return (or +% sequence of consecutive carriage returns), and interprets +% \emph{every} character literally. +% I.e., all special characters |\, {, $|, etc. +% are |\catcode|'d to 'other'. +% +% The command |\verb| produces in-line verbatim text, where the argument +% is delimited by any pair of characters. E.g., |\verb #...#| takes +% `|...|' as its argument, and sets it verbatim in |\ttfamily| font. +% +% The *-variants of these commands are the same, except that spaces +% print as the \TeX{}book's space character instead of as blank spaces. +% +% \begin{macro}{\@vobeyspaces} +% \begin{macrocode} +{\catcode`\ =\active% +\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xobeysp} +% \changes{v1.0z}{1995/07/13}{Use \cs{nobreak}} +% \changes{v1.1f}{1996/09/28}{Moved to ltspace.dtx} +% \end{macro} +% +% +% \begin{macro}{\@xverbatim} +% \begin{macro}{\@sxverbatim} +% \begin{macrocode} +\begingroup \catcode `|=0 \catcode `[= 1 +\catcode`]=2 \catcode `\{=12 \catcode `\}=12 +\catcode`\\=12 |gdef|@xverbatim#1\end{verbatim}[#1|end[verbatim]] +|gdef|@sxverbatim#1\end{verbatim*}[#1|end[verbatim*]] +|endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@verbatim} +% \changes{LaTeX2.09}{1991/07/24}{Added \cs{penalty}\cs{interlinepenalty} +% to definition of \cs{par} so that \cs{samepage} works} +% \changes{v0.9h}{1993/12/13}{Removed optional argument of \cs{item}} +% Real start of verbatim environment +% We use |\relax| to prevent |\item| scanning too far. +% \changes{v0.9p}{1994/01/18} +% {Add \cs{global}\cs{@inlabelfalse}} +% \changes{v1.0b}{1994/03/16} +% {Remove \cs{global}\cs{@inlabelfalse} again.} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2017-04-15}{\@verbatim}% +%<latexrelease> {Disable hyphenation in verbatim}% +\def\@verbatim{\trivlist \item\relax + \if@minipage\else\vskip\parskip\fi + \leftskip\@totalleftmargin\rightskip\z@skip + \parindent\z@\parfillskip\@flushglue\parskip\z@skip +% \end{macrocode} +% \changes{LaTeX2.09}{1991/08/26}{\cs{@@par} added} +% Added |\@@par| to clear possible |\parshape| definition +% from a surrounding list (the verbatim guru says). +% \changes{v0.9p}{1994/01/18} +% {Only add \cs{penalty} if in hmode} +% Switch language when in vertical mode. +% \begin{macrocode} + \@@par +% \end{macrocode} +% Set |\language| here to suppress hyphenation. Done this way rather +% than setting |\hyphenchar| as that is a global setting. +% \begin{macrocode} + \language\l@nohyphenation + \@tempswafalse + \def\par{% + \if@tempswa +% \end{macrocode} +% A |\leavevmode| added: needed if, for example, a blank verbatim +% line is the first thing in a list item (wow!). +% \changes{v1.0f}{1994/04/29}{\cs{leavevmode} added} +% \begin{macrocode} + \leavevmode \null \@@par\penalty\interlinepenalty + \else + \@tempswatrue + \ifhmode\@@par\penalty\interlinepenalty\fi + \fi}% +% \end{macrocode} +% To allow customization we hide the font used in a separate macro. +% \changes{v0.9a}{1993/11/21}{use \cs{verbatim@font} instead of \cs{tt}} +% \changes{v0.9h}{1993/12/13}{Readded \cs{@noligs}} +% \changes{v1.1d}{1996/06/03}{Exchanged the following two code lines +% so that \cs{dospecials} cannot reset the category code +% of characters handled by \cs{@noligs}.} +% \changes{v1.1h}{2000/01/07}{Disable hyphenation even if the font allows it.} +% \changes{v1.1m}{2017-03-09}{Use \cs{language} not \cs{hyphenchar}} +% \begin{macrocode} + \let\do\@makeother \dospecials + \obeylines \verbatim@font \@noligs +% \end{macrocode} +% To avoid a breakpoint after the labels box, we remove the penalty +% put there by the list macros: another use of |\unpenalty|! +% \changes{v1.0f}{1994/04/29}{Change to \cs{everypar} added} +% \begin{macrocode} + \everypar \expandafter{\the\everypar \unpenalty}% +} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000-00-00}{\@verbatim}% +%<latexrelease> {Disable hyphenation in verbatim}% +%<latexrelease>\def\@verbatim{\trivlist \item\relax +%<latexrelease> \if@minipage\else\vskip\parskip\fi +%<latexrelease> \leftskip\@totalleftmargin\rightskip\z@skip +%<latexrelease> \parindent\z@\parfillskip\@flushglue\parskip\z@skip +%<latexrelease> \@@par +%<latexrelease> \@tempswafalse +%<latexrelease> \def\par{% +%<latexrelease> \if@tempswa +%<latexrelease> \leavevmode \null \@@par\penalty\interlinepenalty +%<latexrelease> \else +%<latexrelease> \@tempswatrue +%<latexrelease> \ifhmode\@@par\penalty\interlinepenalty\fi +%<latexrelease> \fi}% +%<latexrelease> \let\do\@makeother \dospecials +%<latexrelease> \obeylines \verbatim@font \@noligs +%<latexrelease> \hyphenchar\font\m@ne +%<latexrelease> \everypar \expandafter{\the\everypar \unpenalty}% +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verbatim} +% \begin{macro}{\endverbatim} +% (RmS 93/09/19) Protected against `missing item' error message +% triggered by empty verbatim environment. +% \begin{macrocode} +\def\verbatim{\@verbatim \frenchspacing\@vobeyspaces \@xverbatim} +\def\endverbatim{\if@newlist \leavevmode\fi\endtrivlist} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\verbatim@font} +% \changes{v0.9a}{1993/11/21}{Macro added} +% Macro to select the font used for verbatim typesetting. +% It also does other work if necessary for the font used. +% \changes{v0.9s}{1994/01/21}{Removed unnecessary category code +% hackery.} +% \begin{macrocode} +\def\verbatim@font{\normalfont\ttfamily} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\verbvisiblespace}{Setup visible space for verb}% +% \end{macrocode} +% +% +% \begin{macro}{\asciispace} +% The character in slot 32, in typewriter fonts (historically) a +% visible space but in other fonts a real space or something else +% \changes{v1.1o}{2018/10/11} +% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)} +% \begin{macrocode} +\DeclareRobustCommand\asciispace{\char 32 } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verbvisiblespace} +% This defines how to get a visible space in +% |\verb*| and friends. In classic \TeX{} this is just the +% slot 32, but in TU encoded fonts we switch fonts and take the +% character from cmtt. +% \changes{v1.1o}{2018/10/11} +% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)} +% \changes{v1.1o}{2018/10/11} +% {Provide \cs{verbvisiblespace} such that it is usable in normal text (github/70)} +% \begin{macrocode} +\ifx\Umathcode\@undefined + \let\verbvisiblespace\asciispace % Pdftex version +\else + \DeclareRobustCommand\verbvisiblespace + {\leavevmode{\usefont{OT1}{cmtt}{m}{n}\asciispace}} % xetex/luatex version +\fi +% \end{macrocode} +% \end{macro} +% +% + +% \begin{macro}{\@setupverbvisiblespace} +% +% In pdf\TeX{} a catcode 12 space will produce the character in +% slot 32 which is assumed to be a visible space character (in a +% typewriter font in OT1 or T1 encoding). In Xe\TeX{} or Lua\TeX{} a +% font in TU encoding is normally used and that has a real space in +% this slot. So what we do in this case is this: we check the +% definition of +% |\verbvisiblespace| and if it is |\asciispace| we assume that the +% char32 can be used (e.g., in pdf\TeX{}). We then redefine +% |\@xobeysp| so that after running |\@vobeyspaces| we get +% characters from slot 32 for each active space. +% +% \changes{v1.1o}{2018/10/11} +% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)} +% \begin{macrocode} +\def\@setupverbvisiblespace{% + \ifx\verbvisiblespace\asciispace + \let\@xobeysp\asciispace + \else +% \end{macrocode} Otherwise we measure the width of a character in +% the mon-spaced current font and place a +% |\verbvisiblespace| into a box of the right width which we are then +% using as the character for a space. By default this will be the space +% character from OT1 cmtt but by changing +% |\verbvisiblespace| one could use, for example, the |\textvisiblespace| +% of the current typewriter font. +% \begin{macrocode} + \setbox\z@\hbox{x}% + \setbox\@verbvisiblespacebox\hbox to\wd\z@{\hss\verbvisiblespace\hss}% + \def\@xobeysp{\leavevmode\copy\@verbvisiblespacebox}% + \fi +} +% \end{macrocode} +% \end{macro} +% + +% \begin{macro}{\@verbvisiblespacebox} +% The box to hold the visible space character if it isn't in slot +% 32 in the current typewriter font. +% \changes{v1.1o}{2018/10/11} +% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)} +% \begin{macrocode} +\newbox\@verbvisiblespacebox +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@sverb} +% \changes{v1.0j}{1994/05/10}{Slight change in error message text.} +% Definitions of |\@sverb| and |\@verb| changed so |\verb+ foo+| +% does not lose leading blanks when it comes at the beginning of a line. +% Change made 24 May 89. Suggested by Frank Mittelbach and Rainer +% Sch\"opf. +% \begin{macrocode} +\def\@sverb#1{% + \catcode`#1\active + \lccode`\~`#1% + \gdef\verb@balance@group{\verb@egroup + \@latex@error{\noexpand\verb illegal in command argument}\@ehc}% + \aftergroup\verb@balance@group + \lowercase{\let~\verb@egroup}% +% \end{macrocode} +% If |\@sverb| is called from |\@verb| then space is already active +% and supposed to produce a real space. In this case we do +% nothing. Otherwise we run |\@setupverbvisiblespace| to setup the +% right visible space char and afterwards |\@vobeyspaces| to make +% it the definition for the active space character. +% \changes{v1.1o}{2018/10/11} +% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)} +% \begin{macrocode} + \ifnum\catcode`\ =\active + \else \@setupverbvisiblespace \@vobeyspaces \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{verbatim*} +% For \texttt{verbatim*} we also set up the correct visible space +% character definition and then run |\@vobeyspaces|. As this code +% is not called as part of the normal verbatim environment (the +% method is done the other way around this time) we don't have to +% check if space is already active---it shouldn't be. +% \changes{v1.1o}{2018/10/11} +% {Provide visible space in \cs{verb*} also for XeTeX and LuaTeX (github/69)} +% \begin{macrocode} +\@namedef{verbatim*}{\@verbatim + \@setupverbvisiblespace + \frenchspacing\@vobeyspaces\@sxverbatim} +\expandafter\let\csname endverbatim*\endcsname =\endverbatim +% \end{macrocode} +% \end{environment} +% +% +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\verbvisiblespace}{Setup visible space for verb}% +%<latexrelease> +%<latexrelease>\@namedef{verbatim*}{\@verbatim\@sxverbatim} +%<latexrelease> +%<latexrelease>\let\asciispace \@undefined +%<latexrelease>\let\verbvisiblespace \@undefined +%<latexrelease>\let\@setupverbvisiblespace\@undefined +%<latexrelease>\let\@verbvisiblespacebox \@undefined +%<latexrelease> +%<latexrelease>\def\@sverb#1{% +%<latexrelease> \catcode`#1\active +%<latexrelease> \lccode`\~`#1% +%<latexrelease> \gdef\verb@balance@group{\verb@egroup +%<latexrelease> \@latex@error{\noexpand\verb illegal in command argument}\@ehc}% +%<latexrelease> \aftergroup\verb@balance@group +%<latexrelease> \lowercase{\let~\verb@egroup}}% +%<latexrelease> +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% +% +% \begin{macro}{\@makeother} +% \begin{macrocode} +\def\@makeother#1{\catcode`#112\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verb@balance@group} +% \changes{LaTeX2.09}{1993/09/07} +% {(RmS) Changed definition of \cs{verb} so that it detects a +% missing second delimiter.} +% \begin{macrocode} +\let\verb@balance@group\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verb@egroup} +% \begin{macrocode} +\def\verb@egroup{\global\let\verb@balance@group\@empty\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verb@eol@error} +% \begin{macrocode} +\begingroup + \obeylines% + \gdef\verb@eol@error{\obeylines% + \def^^M{\verb@egroup\@latex@error{% + \noexpand\verb ended by end of line}\@ehc}}% +\endgroup +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verb} +% \changes{LaTeX2.09}{1992/08/24} +% {Changed \cs{verb} and \cs{@sverb} to work correctly +% in math mode} +% \changes{v0.9a}{1993/11/21}{Use \cs{verbatim@font} instead of +% \cs{tt}.} +% \changes{v1.1a}{1995/09/19}{Put \cs{@noligs} after +% \cs{verbatim@font} where it belongs.} +% Typesetting a small piece verbatim. +% \changes{v1.1d}{1996/06/03}{Put setting of verbatim font after +% \cs{dospecials} +% so that \cs{dospecials} cannot reset the category code +% of characters handled by \cs{@noligs}.} +% \changes{v1.1m}{2017/03/09} +% {Use \cs{language} to stop hyphenation} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2017-04-15}{\verb}% +%<latexrelease> {Disable hyphenation in verb}% +\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi + \bgroup + \verb@eol@error \let\do\@makeother \dospecials + \verbatim@font\@noligs +% \end{macrocode} +% Set |\language| here to suppress hyphenation. Done this way rather +% than setting |\hyphenchar| as that is a global setting. +% \begin{macrocode} + \language\l@nohyphenation + \@ifstar\@sverb\@verb} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000-00-00}{\verb}% +%<latexrelease> {Disable hyphenation in verb}% +%<latexrelease>\def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi +%<latexrelease> \bgroup +%<latexrelease> \verb@eol@error \let\do\@makeother \dospecials +%<latexrelease> \verbatim@font\@noligs +%<latexrelease> \@ifstar\@sverb\@verb} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@verb} +% \begin{macrocode} +\def\@verb{\@vobeyspaces \frenchspacing \@sverb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\verbatim@nolig@list} +% \changes{LaTeX2.09}{1993/09/03} +% {Replaced \cs{@noligs} by extensible list} +% \begin{macrocode} +\def\verbatim@nolig@list{\do\`\do\<\do\>\do\,\do\'\do\-} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\do@noligs} +% \begin{macrocode} +\def\do@noligs#1{% + \catcode`#1\active + \begingroup + \lccode`\~`#1\relax + \lowercase{\endgroup\def~{\leavevmode\kern\z@\char`#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@noligs} +% To stay compatible with packages that use |\@noligs| we keep it. +% \changes{v0.9h}{1993/12/13}{Readded \cs{@noligs}} +% \begin{macrocode} +\def\@noligs{\let\do\do@noligs \verbatim@nolig@list} +% \end{macrocode} +% \end{macro} +% +% \changes{v0.9i}{1993/12/16}{\cs{literal} added} +% \changes{v1.0r}{1994/05/26/16}{\cs{literal} removed} +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews01.tex b/Master/texmf-dist/source/latex-dev/base/ltnews01.tex new file mode 100644 index 00000000000..92090e17d01 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews01.tex @@ -0,0 +1,152 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews01.tex + +% This is issue 1 of LaTeX News. + +\documentclass +% [type1fonts] + {ltnews} + +\publicationmonth{June} +\publicationyear{1994} +\publicationissue{1} + +\begin{document} + +\maketitle + +\section{Welcome to \LaTeXNews} + +An issue of \emph{\LaTeXNews} will accompany every future release of +\LaTeX. It will tell you about important events, such as major bug +fixes, newly available packages, or any other \LaTeX{} news. + +\section{\LaTeXe---the new \LaTeX{} release} + +The most important news is the release of \LaTeXe, the new version of +the \LaTeX{} software. This version has better support for fonts, +graphics and colour, and will be actively maintained by the \LaTeX3 +project team. Upgrades will be issued every six months, in June and +December. + +\section{Why a new \LaTeX?} + +Over the years many extensions have been developed for \LaTeX. This +is, of course, a sure sign of its continuing popularity but it has had +one unfortunate result: incompatible \LaTeX{} formats came into use at +different sites. Thus, to process documents from various places, a +site maintainer was forced to keep \LaTeX{} (with and without \NFSS), +\SLiTeX, \AmSLaTeX, and so on. In addition, when looking at a source +file it was not always clear for which format the document was written. + +To put an end to this unsatisfactory +situation a new release of \LaTeX{} was produced. +It brings all such extensions back under a single format and thus +prevents the proliferation of mutually incompatible dialects of +\LaTeX~2.09. The new release was available for several months as a +test version, and the final release of 1~June officially +replaces the old version. + +\section{Processing documents with \LaTeXe} + +Documents written for \LaTeX~2.09 will +still be read by \LaTeXe. Any such document is run in +\emph{\LaTeX~2.09 compatibility mode}. + +Unfortunately, compatibility mode comes with a price: it can run +up to 50\% slower than \LaTeX~2.09 did. If you want to run your document +in the faster \emph{native mode}, you should try replacing the line: +\begin{verbatim} + \documentstyle[<options>,<packages>]{<class>} +\end{verbatim} +with: +\begin{verbatim} + \documentclass[<options>]{<class>} + \usepackage{latexsym,<packages>} +\end{verbatim} +Unfortunately, this will not always work, because some \LaTeX~2.09 +packages will only work in \LaTeXe{} compatibility mode. You should find +out if there is a \LaTeXe{} version of the package available. + +\LaTeXe{} native mode also gives access to the new features of \LaTeXe, +described in \emph{\LaTeXe{} for authors}. + +\section{New packages} + +\LaTeXe{} has much better support for graphics, colour, fonts, and +multi-lingual typesetting. The following software should be available +from the distributor who brought you \LaTeXe: + +\begin{citations} +\item[babel] for typesetting in many languages. +\item[color] for colour support. +\item[graphics] for including images. +\item[mfnfss] for using bitmap fonts. +\item[psnfss] for using Type~1 fonts. +\item[tools] other packages by the \LaTeX3 team. +\end{citations} +The packages come with full documentation, and are also described in +\emph{\LaTeX: A Document Processing System} or +\emph{The \LaTeX{} Companion}. + +\section{Further information} + +More information about \LaTeXe{} is to be found in: + +\begin{citations} +\item[\LaTeX: A Document Preparation System] + Leslie Lamport, \AW, 2nd ed, 1994. +\item[The \LaTeX{} Companion] + Goossens, Mittelbach and Samarin, \AW, 1994. +\end{citations} +The \LaTeX{} distribution comes with documentation on the new features of +\LaTeX: + +\begin{citations} +\item[\LaTeXe{} for authors] + describes the new features of \LaTeX{} documents, + in the file \verb|usrguide.tex|. +\item[\LaTeXe{} for class and package writers] + describes the new features of \LaTeX{} classes and packages, + in the file \verb|clsguide.tex|. +\item[\LaTeXe{} font selection] + describes the new features of \LaTeX{} fonts for + class and package writers, + in the file \verb|fntguide.tex|. +\end{citations} +For more information on \TeX{} and \LaTeX, get in touch with your local +\TeX{} Users Group, or the international \TeX{} Users Group, +P.~O.~Box~869, Santa~Barbara, CA~93102-0869, USA, Fax:~+1~805~963~8358, +EMail:~tug@tug.org. + +\end{document} + + + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews02.tex b/Master/texmf-dist/source/latex-dev/base/ltnews02.tex new file mode 100644 index 00000000000..d46cb1b52f5 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews02.tex @@ -0,0 +1,154 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews02.tex + +% This is issue 2 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + +\publicationmonth{December} +\publicationyear{1994} +\publicationissue{2} + +\begin{document} + +\maketitle + +\section{Welcome to \LaTeXNews~2} + +An issue of \emph{\LaTeXNews} will accompany every future release of +\LaTeX. It will tell you about important events, such as major bug +fixes, newly available packages, or any other \LaTeX{} news. + +\section{December 1994 release of \LaTeX} + +December 1994 sees the second release of \LaTeXe. We are on schedule +to deliver a release of \LaTeX{} every six months, in December and +June. + +This release has seen quite a lot of activity, which is not too +surprising as it's only been a year since the first test release of +\LaTeXe. We don't expect so much activity in the next six months. + +Many of the changes are minor improvements and bug-fixes---see +\emph{\LaTeXe{} for authors} (\verb|usrguide.tex|), \emph{\LaTeXe{} +font selection} (\verb|fntguide.tex|) and our change log +(\verb|changes.txt|) for more details. + +However, there are two important new packages available for \LaTeX: +\texttt{inputenc} and AMS-\LaTeX. + +\section{Accented input} + +One of the problems with writing non-English documents in \LaTeX{} is +the accent commands. Reading documents containing text like +\verb|na\"\i ve| is frustrating, especially if your keyboard allows +you to type \texttt{na\"\i ve}. + +In the past, \LaTeX{} has not supported input containing accented +characters such as \texttt{\"\i}, because Windows, Macintosh and Unix +all have different ways of dealing with accented input, called +\emph{input encodings}. + +However, the \verb|inputenc| package allows you to specify which input +encoding your document is written with, for example to use the ISO +Latin-1 encoding, you type: +\begin{verbatim} + \usepackage[latin1]{inputenc} +\end{verbatim} +At the moment, \verb|inputenc| supports the \verb|ascii| and +\verb|latin1| input encodings, but more will be added with future +releases. + +The \verb|inputenc| package is +currently a test release. The user interface for the full release will +be upwardly compatible with the test version. + +\section{AMS-\LaTeX{}} + + AMS-\LaTeX{} is a set of miscellaneous extensions for \LaTeX{} + distributed by the American Mathematical Society. They provide superior + information structure and superior printed output for mathematical + documents. + + There are far too many features of AMS-\LaTeX{} to list here. + AMS-\LaTeX{} is described in the accompanying documentation, + and in \emph{The \LaTeX{} Companion}. + + Version 1.2beta of AMS-\LaTeX{} was released for testing by intrepid + users in October 1994. The full release of AMS-\LaTeX{}~1.2 is expected + in early January 1995. + + It will be divided into two bundles: + \begin{itemize} + + \item the \verb|amsfonts| packages, which give access to + hundreds of new mathematical symbols, and new math fonts + such as blackboard bold and fraktur. + + \item the \verb|amsmath| packages, which provide finer control over + mathematical typesetting, such as multi-line subscripts, + enhanced theorem and proof environments, + and improved displayed equations, + + \end{itemize} + For compatibility with older documents, an \verb|amstex| package will be + provided. + +\section{\LaTeX{} on the internet} + +\LaTeX{} has its own home page on the World Wide Web, with the URL: +\begin{verbatim} + http://www.tex.ac.uk/CTAN/latex/ +\end{verbatim} +This page describes \LaTeX{} and the \LaTeX3 project, and contains +pointers to other \LaTeX{} resources, such as the user guides, the +\TeX{} Frequently Asked Questions, and the \LaTeX{} bugs database. + +The electronic home of anything \TeX-related is the Comprehensive +\TeX{} Archive Network (CTAN). This is a network of cooperating ftp +sites, with over a gigabyte of \TeX{} material: +\begin{verbatim} + ftp://ftp.tex.ac.uk/tex-archive/ + ftp://ftp.shsu.edu/tex-archive/ + ftp://ftp.dante.de/tex-archive/ +\end{verbatim} +For more information, see the \LaTeX{} home page. + +\section{Further information} + +For more information on \TeX{} and \LaTeX, get in touch with your local +\TeX{} Users Group, or the international \TeX{} Users Group, +P.~O.~Box~869, Santa~Barbara, CA~93102-0869, USA, Fax:~+1~805~963~8358, +EMail:~tug@tug.org. + + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews03.tex b/Master/texmf-dist/source/latex-dev/base/ltnews03.tex new file mode 100644 index 00000000000..d7c8ff0b205 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews03.tex @@ -0,0 +1,145 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews03.tex + +% This is issue 3 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + +\publicationmonth{June} +\publicationyear{1995} +\publicationissue{3} + +\begin{document} + +\maketitle + +\section{Welcome to \LaTeXNews~3} + +An issue of \emph{\LaTeXNews} will accompany every future release of +\LaTeX. It will tell you about important events, such as major bug +fixes, newly available packages, or any other \LaTeX{} news. + +\section{June 1995 release of \LaTeX} + +June 1995 sees the third release of \LaTeXe. We are on schedule +to deliver a release of \LaTeX{} every six months, in December and +June. + +In the last \emph{\LaTeXNews}, we said ``we don't expect so much +activity in the next six months,'' which has turned out not to be +true! + +\section{Additional input encodings} + +In the last release of \LaTeX{} we distributed a test version of the +\texttt{inputenc} package which allows the use of input characters +other than just a--z and A--Z. The package has proved to be robust, +so we are now distributing an expanded version. +The new release comes with a number of input encodings: + +\begin{itemize} +\item \texttt{ascii} the standard encoding, +\item \texttt{latin1} the ISO Western European alphabet, +\item \texttt{latin2} the ISO Eastern European alphabet, +\item \texttt{cp437} the IBM codepage 437, +\item \texttt{cp850} the IBM codepage 850, and +\item \texttt{applemac} the Apple Macintosh encoding. +\end{itemize} +These can be used by specifying an option to the \texttt{inputenc} +package, for example: +\begin{verbatim} + \usepackage[latin1]{inputenc} +\end{verbatim} +The new input encodings are currently being tested, but we don't +expect any major changes. + +\section{\LaTeX\ getting smaller} + +In the past releases of \LaTeXe, the amount of memory \LaTeX{} +requires has increased, but we are pleased to say that this trend has +been reversed. We hope that future releases of \LaTeX{} will continue +to get smaller. + +For example, on this document, the December 1994 release used 52,622 +words of memory, and the June 1995 release uses 51,216 words of +memory, which is a 2.7\% reduction. + +We are currently experimenting with other ways of reducing the size of +\LaTeX. For example, we are experimenting with an option to remove +the \texttt{picture} and \texttt{tabbing} environments from the +\LaTeX{} kernel, and to load them from a file the first time they are +used. This should help \LaTeX{} to run on machines with limited +memory. See \texttt{autoload.txt} for details. + +\section{Distribution and modification} + +One topic of discussion that has kept us busy is the distribution and +modification conditions of \LaTeX. We are committed to keeping +\LaTeX{} as free reliable software, and ensuring that (as far as +possible) \LaTeX{} documents will produce the same results on all +systems. + +The modification conditions are currently under discussion, and we +would like to hear from anyone interested. Please read +\texttt{modguide.tex} for more information. + +\section{AMS-\LaTeX\ full release} + +The AMS-\LaTeX\ packages were still in beta test in the December 1994 +release of \LaTeX, and the full release came out in January 1995. + +AMS-\LaTeX\ is described in the \emph{User's Guide} +(\texttt{amsldoc.tex}) and in \emph{The \LaTeX{} Companion}. + +\section{PostScript fonts} + +There is a new test release of the PSNFSS packages for accessing +PostScript fonts in \LaTeXe. This includes an update to all of the +fonts, to remove many of the underfull and overfull \verb|\hbox| +warnings, and improve the setting of non-English languages. + +The new release of \LaTeX{} removes all of the `hidden' uses of +Computer Modern mathematics. For example, the footnote markers used +to use math mode, so always used Computer Modern digits rather than +ones from the current text font. This has now been fixed. + +\section{Further information} + +For more information on \TeX{} and \LaTeX, get in touch with your local +\TeX{} Users Group, or the international \TeX{} Users Group, +P.~O.~Box~869, Santa~Barbara, CA~93102-0869, USA, Fax:~+1~805~963~8358, +EMail:~tug@tug.org. + +The \LaTeX{} home page is \verb|http://www.tex.ac.uk/ctan/latex/| +and contains links to other WWW resources for \LaTeX. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews04.tex b/Master/texmf-dist/source/latex-dev/base/ltnews04.tex new file mode 100644 index 00000000000..15e95999521 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews04.tex @@ -0,0 +1,143 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews04.tex + +% This is issue 4 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + + +\publicationmonth{December} +\publicationyear{1995} +\publicationissue{4} + +\begin{document} + +\maketitle + +\section{Welcome to \LaTeXNews~4} + +An issue of \emph{\LaTeXNews} will accompany every future release of +\LaTeX. It will tell you about important events, such as major bug +fixes, newly available packages, or any other \LaTeX{} news. +This issue accompanies the fourth release of \LaTeXe. + + +\section{\LaTeX\ getting smaller} + +The last release in June started a trend of \LaTeX\ becoming +smaller, we are pleased to announce that this has continued with this +release. In particular the experimental `autoload' version described in +\texttt{autoload.txt} is much smaller as more parts of \LaTeX\ are +autoloaded. + +\section{New `concurrent' docstrip} + +The time taken to `unpack' this release from the documented sources +should be much reduced (roughly half the time, depending on +installation conditions). This is due to an improved version of the +docstrip program that has been contributed by Marcin Woli\'nski. +This can write up to 16 files at once. The +previous version could only write one file at a time which meant that +it was very slow when producing many small files from the same source +file as the source needed to be re-read for each file written. + +\section{New T1 encoded fonts} + +This year J\"org Knappen has completed a new release of the `Cork' +(T1) encoded Computer Modern fonts: the dc fonts release 1.2. + +This release of the dc fonts fixes many bugs (including the missing +\verb|?`| (?`) and \verb|!`| (!`) ligatures) and improves the fonts in +many other ways. It is strongly recommended that you upgrade as soon as +possible if currently you are using the old dc fonts, release 1.1 or +earlier. The new fonts are available from the CTAN archives, in +\texttt{tex-archive/fonts/dc}. + +The names of the font files are \emph{different}. This does not affect +\LaTeX\ documents but \emph{does} affect the installation procedure as +it assumes that you have the \emph{new} fonts, and will write suitable +`fd' files for those fonts. If you have not yet upgraded your dc fonts +then, after unpacking the distribution, you \emph{must} +\verb|latex olddc.ins| to produce `fd' files for the old dc fonts. +This must be done \emph{before} the format is made. Running the test +document at \texttt{ltxcheck.tex} the end of the installation will +inform you if the wrong set of `fd' files has been installed. + +Note that this change does not affect the standard `OT1' Computer +Modern fonts that \LaTeX\ uses by default. + +\section{More robust commands} + +The commands \verb|\cite| and \verb|\sqrt| are now robust. + +Although most commands with optional arguments are fragile, as +documented, such commands defined using the second optional argument +of \verb|\newcommand| and its derivatives are now \emph{robust}. + +\section{New Interface to building `extension' classes} + +The mechanism provided by \verb|\DeclareOption|, \verb|\ProcessOptions| +and \verb|\LoadClass| has proved to be a powerful and expressive means +of defining one class in terms of another `base' class. However there +have been some requests to simplify the declaration of the common case +where you want the `base' class to be called with \emph{all} the +options that were specified to the extension class. This is now +provided by the new command \verb|\LoadClassWithOptions|. A similar +command \verb|\RequirePackageWithOptions| is provided for package use. +More details of this feature are provided in \texttt{clsguide.tex} and +\texttt{ltclass.dtx}. + +\section{More Input Encodings} + +The experimental \texttt{inputenc} package allows a more natural style +of input of accented and other characters. + +Three new input encodings are now supported. +\begin{itemize} +\item \texttt{ansinew} the Windows ansi encoding, + as used in Microsoft Windows 3.x. +\item \texttt{cp437de} a variant of \texttt{cp437}, which uses \ss\ + rather than $\beta$ in the appropriate slot. +\item \texttt{next} the encoding used on Next computers. +\end{itemize} + +\section{Further information} + +For more information on \TeX{} and \LaTeX, get in touch with your local +\TeX{} Users Group, or the international \TeX{} Users Group, +1850 Union Street, \#1637, San Francisco, CA~94123, USA, +Fax:~+1~415~982~8559, +EMail:~tug@tug.org. +The \LaTeX{} home page is \verb|http://www.tex.ac.uk/ctan/latex/| +and contains links to other WWW resources for \LaTeX. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews05.tex b/Master/texmf-dist/source/latex-dev/base/ltnews05.tex new file mode 100644 index 00000000000..9416f0e4ed3 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews05.tex @@ -0,0 +1,158 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews05.tex + +% This is issue 5 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + +% \usepackage[T1]{fontenc} + +\publicationmonth{June} +\publicationyear{1996} +\publicationissue{5} + +\begin{document} + +\maketitle + +\section{Welcome to \LaTeXNews~5} +This issue of \emph{\LaTeXNews} accompanies the fifth release of the +new standard \LaTeX{}, \LaTeXe. + +\section{Extra possibilities for section headings} +Most \LaTeX\ sectioning commands are defined using +\verb|\@startsection|. +For example, the \textsf{article} class defines: +\begin{small} +\begin{verbatim} +\newcommand\section{\@startsection + {section}{1}{0pt}{-3.5ex plus-1ex minus-.2ex}% + {2.3ex plus.2ex}{\normalfont\Large\bfseries}} +\end{verbatim} +\end{small} +The last argument specifies the style in which the section heading is +to be typeset. + +The new feature added at this release is that at the \emph{end} of +this argument you may specify a command that \emph{takes an argument}. +This command will be applied to the section number and heading. +For example, one could use the \verb|\MakeUppercase| command to +produce uppercase headings. A package or class file could contain: +\begin{small} +\begin{verbatim} +\renewcommand\section{\@startsection + {section}{1}{0pt}{-3.5ex plus-1ex minus-.2ex}% + {2.3ex plus.2ex}{\normalfont\Large\MakeUppercase}} +\end{verbatim} +\end{small} +to produce section headings using uppercase medium weight text, rather +than the bold text used by \textsf{article}. Note that, like the font +choice, the uppercasing applies only to the actual heading (including +any automatically generated section number), not to the text as it may +appear in the running head or table of contents. + +\section{The `openany' option in the `book' class} +The \textsf{openany} option allows chapter and similar openings to +occur on left hand pages. Previously this option only affected +\verb|\chapter| and \verb|\backmatter|. It now also affects +\verb|\part|, \verb|\frontmatter| and \verb|\mainmatter|. + +\section{More font (output) encodings} +The font encoding name \texttt{T3} has been allocated to the encoding +used in the new 256-character \textsc{IPA} fonts (for the phonetic +alphabet) produced by Rei Fukui. His package, \textsf{tipa}, +gives access to these fonts and should soon be available. (The +encoding named \texttt{OT3} is the 128-character encoding used in the +\textsc{IPA} fonts produced by Washington State University.) + + + +\section{More input encodings supported} +The \textsf{inputenc} package now supports the IBM codepage~852 used +in Eastern Europe, with the option~\texttt{[cp852]} contributed by +Petr~Sojka. + +Also, the \textsf{inputenc} package now activates most `control codes' +with \textsc{ascii} values below 32. +Currently none of the encodings in the standard distribution makes use +of these positions. + +\section{Fixes and improvements} +The \LaTeX\ kernel has only had minor changes, apart from +\verb|\@startsection| mentioned above. +However, some small fixes have been incorporated removing the +following problems: + +\begin{itemize} +\item + In tabular and array, previous versions of \LaTeX\ `lost' the + inter-column space from an `\texttt{l}'-column, when that column + was completely empty. + +\item + Previously, the use of the \verb|\nofiles| command could change + the \emph{vertical spacing} in a document.\\ A side effect of fixing + this is that when \verb|\nofiles| is used, \verb|\label| puts a + blank line in the log file. + +\item + \LaTeX~often loads fonts `on demand'. Previously, this could + happen inside the argument of an accent command and this would + cause the accent to appear in the wrong place. + +\end{itemize} + +\section{Changes to the `tools' packages} + +\begin{itemize} +\item + The \textsf{longtable} package now uses a modified algorithm, + contributed by David Kastrup, to align the `chunks' of a table. + It is now unnecessary to edit the document to add + \verb|\setlongtables| before the final run of \LaTeX. + In certain cases of overlapping \verb|\multicolumn| entries, the new + algorithm will produce better column widths than the old (at the + price of extra passes through \LaTeX). + +\item + The \textsf{dcolumn} package now has the extra possibility of + specifying the number of digits both \emph{before} and after the + `decimal point'. This makes it easy to centre the column of numbers + under a wide heading. +\end{itemize} + +\section{New copy of the \LaTeX\ bug database} +\verb|http://www.tex.ac.uk/ctan/latex/bugs.html| will soon have links +to a copy of the searchable \LaTeX\ bugs database at Mainz (Germany) +as well as the original copy at Sussex (England). + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews06.tex b/Master/texmf-dist/source/latex-dev/base/ltnews06.tex new file mode 100644 index 00000000000..b5c7a28a245 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews06.tex @@ -0,0 +1,149 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews06.tex + +% This is issue 6 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + +% \usepackage[T1]{fontenc} + +\publicationmonth{December} +\publicationyear{1996} +\publicationissue{6} + +\begin{document} + +\maketitle + +\section{Welcome to \LaTeXNews~6} +This issue of \emph{\LaTeXNews} accompanies the sixth release of the +new standard \LaTeX{}, \LaTeXe. + +\section{Mono-case file names} +Previously \LaTeX\ has used some files with `mixed-case' file names +such as \texttt{T1cmr.fd} and \texttt{T1enc.def}. + +These file names cause problems on some systems (in particular they +are illegal on the ISO 9660 CDROM format) and so in this release +all file names have been made lowercase (for example +\texttt{t1cmr.fd} and \texttt{t1enc.def}). + +This change should \emph{not} affect any document. Within \LaTeX, +encodings still have the usual uppercase names in uses such as +\verb|\usepackage[T1]{fontenc}| and \verb|\fontencoding{T1}|. +\LaTeX\ will automatically convert to the lowercase form while +constructing the file name. +\LaTeX\ will input the `fd' file under the old name if it fails to +find the file with the new name, so existing collections of fd files +should still work with this new release. + +The change \emph{does} affect the configuration files that may be used +to make the \LaTeX\ format with initex. For example, the file +\texttt{fonttext.ltx} previously specified \verb|\input{T1cmr.fd}|. +It now has \verb|\input{t1cmr.fd}|. +If you use a local file \texttt{fonttext.cfg} +you will need to make similar changes, as \verb|\input{T1cmr.fd}| +will not work as \texttt{T1cmr.fd} is no longer in the distribution. + +The files affected by this change all have names of the form +\verb|*.fd| or \verb|*enc.def|. + +\section{Another input encoding} +Thanks to work by S\o ren Sandmann, the \textsf{inputenc} package now +supports the IBM codepage~865 used in Scandinavia. + +\section{Better user-defined math display environments} +Suppose that you want to define an environment for displaying text +that is numbered as an equation. A straightforward way to do this is +as follows: +\begin{verbatim} + \newenvironment{texteqn} + {\begin{equation} + \begin{minipage}{0.9\linewidth}} + {\end{minipage} + \end{equation}} +\end{verbatim} +However, if you have tried this then you will probably have noticed +that it does not work perfectly when used in the middle of a paragraph +because an inter-word space appears at the beginning of the first +line after the environment. + +There is now an extra command (with a very long name) available that +you can use to avoid this problem; it should be inserted as shown here: +\begin{verbatim} + \newenvironment{texteqn} + {\begin{equation} + \begin{minipage}{0.9\linewidth}} + {\end{minipage} + \end{equation} + \ignorespacesafterend} +\end{verbatim} + +\section{Docstrip improvements} +The \textsf{docstrip} program that is used to unpack the \LaTeX\ +sources has undergone further development. The new version should be +able to process all old `batchfiles' but it allows a simpler syntax in +new `batchfiles' (no need to define \verb|\def\batchfile{|\ldots). + +It also allows `target' directories to be specified when writing +files. This directory support is disabled by default unless activated +in a local \texttt{docstrip.cfg} configuration file. +See \texttt{docstrip.dtx} for details. + +\section{AMS \LaTeX\ update} +Since the last \LaTeX\ release in June, the American Mathematical +Society have re-issued the `AMS\LaTeX' classes and packages, fixing +several reported problems. + +\section{Graphics package update} +The \LaTeX\ color and graphics packages have been updated slightly, +principally to support more dvi drivers, see the readme file in the +\textsf{graphics} distribution. + +\section{EC Fonts released} +The first release of the Extended Computer Modern fonts has just been +made. (In January 1997.) + +This release of \LaTeX\ does \emph{not} default to these `ec' fonts +as its T1 encoded fonts. By default it will +use the `dc' fonts if the T1 encoding is requested. + +As noted in \texttt{install.txt} you may run \TeX\ on the install file +\texttt{ec.ins} \emph{after} unpacking the base distribution but +\emph{before} making the \LaTeX\ format. This will produce +suitable `fd' files making \LaTeX\ (including, for the first time, the +\textsf{slides} class) use the `ec' fonts as the default T1 encoded +font set. + + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews07.tex b/Master/texmf-dist/source/latex-dev/base/ltnews07.tex new file mode 100644 index 00000000000..81d0ed3143c --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews07.tex @@ -0,0 +1,146 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews07.tex + +% This is issue 7 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + +% \usepackage[T1]{fontenc} + +\publicationmonth{June} +\publicationyear{1997} +\publicationissue{7} + +\begin{document} + +\maketitle + +\section{T1 encoded Computer Modern fonts} +As in the last release the base \LaTeX\ distribution contains +three different sets of `fd' files for T1 encoded fonts. + +In this release the default installation uses \texttt{ec.ins} +and so installs files suitable for the current `EC fonts' +distribution. If you have still not updated to the EC fonts and +are using the earlier test versions, known as DC then you should +unpack \texttt{newdc.ins} (for DC release 1.2 or later) or +\texttt{olddc.ins} (for the original releases of the DC fonts). +This should be done after unpacking \texttt{unpack.ins} but +before making the format by running ini\TeX{} on \texttt{latex.ltx}. +There are further details in \texttt{install.txt}. + + +\section{T1 encoded Concrete fonts} +The Metafont sources for T1 encoded `Concrete' fonts have been +removed from the \textsf{mfnss} distribution as they were based +on the now obsolete DC fonts release 1.1. Similarly the +\textsf{cmextra.ins} install file in the \textsf{base} distribution no +longer generates fd files for the `Concrete' fonts. +To use these fonts in either T1 or OT1 encoding it is +recommended that you obtain Walter Schmidt's \textsf{ccfonts} package +and fonts from CTAN \texttt{macros/latex/contrib/supported/ccfonts}. + + +\section{Further input encodings} +Two more \textsf{inputenc} packages have been added: for latin5, +thanks to H. Turgut Uyar; and for latin3, thanks to J\"org Knappen. + + +\section{Normalising spacing after punctuation} +The command \verb|\normalsfcodes| was introduced at the last patch +release. This is normally given the correct definition automatically +and so need not be explicitly set. It is used to correct a problem, +reported by Donald Arseneau, that punctuation in page headers has +always (in all known \TeX\ formats) been potentially incorrect if the +page break happens while a local setting of the space codes (for +instance by the command \verb|\frenchspacing|) is in effect. A common +example of this happening in \LaTeX\ is in the \textsf{verbatim} +environment. + + +\section{Accessing Bold Math Symbols} +The \textsf{tools} distribution contains a new package, \textsf{bm}, +which defines a command \verb|\bm| that allows individual bold symbols +to be accessed within a math expression (in contrast to +\verb|\boldmath| which makes whole math expressions default to bold +fonts). It is more general than the existing \textsf{amsbsy} package; +however, to ease the translation of documents between these two +packages, \textsf{bm} makes \verb|\boldsymbol| an alias for +\verb|\bm|. + +This package was previously made available from the `contrib' area of +the CTAN archives, and as part of Y\&Y's \LaTeX\ support for the +MathTime fonts. + + +\section{Policy on standard classes} + +Many of the problem reports we receive concerning the standard classes +are not concerned with bugs but are suggesting, more or less politely, +that the design decisions embodied in them are `not optimal' and +asking us to modify them. + +There are several reasons why we have decided not to make such changes +to these files. +\begin{itemize} +\item + However misguided, the current behaviour is clearly what was + intended when these classes were designed. +\item + It is not good practice to change such aspects of `standard classes' + because many people will be relying on them. +\end{itemize} + +We have therefore decided not to even consider making such +modifications, nor to spend time justifying that decision. This does +not mean that we do not agree that there are many deficiencies in the +design of these classes, but we have many tasks with higher priority +than continually explaining why the standard classes for \LaTeX{} +cannot be changed. + +We would, of course, welcome the production of better classes, or of +packages that can be used to enhance these classes. + + +\section{New addresses for TUG} +For information about joining the \TeX{} Users Group, and about lots +of other \LaTeX-related matters, please contact +them at their new address: +\begin{quote}\small + \TeX{} Users Group, P.O. Box 1239,\\ + Three Rivers, CA~93271-1239, USA\\ + Fax:~+1~209~561~4584\\ + E-mail: \texttt{tug@mail.tug.org}\\ + URL: \texttt{http://www.tug.org/} +\end{quote} + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews08.tex b/Master/texmf-dist/source/latex-dev/base/ltnews08.tex new file mode 100644 index 00000000000..b43c4f53f9e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews08.tex @@ -0,0 +1,154 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews08.tex + +% This is issue 8 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews} + +% \usepackage[T1]{fontenc} + +\publicationmonth{December} +\publicationyear{1997} +\publicationissue{8} + +\begin{document} + +\maketitle + +\section{New supported font encodings} + +Two new font encodings are supported as options to the \textsf{fontenc} +package: +\begin{description} +\item [OT4] +This is a seven-bit encoding designed for Polish. The \LaTeX\ support +was developed by Mariusz Olko. +\item [TS1] This is the `Text Companion Encoding'; it contains symbols +designed to be used in text, as opposed to mathematical formulas, and +some accents designed for uppercase letters. It is currently +supported by the `tc' fonts, which match the T1 encoded `ec' text +fonts. A subset of the glyphs in this encoding is supported by +virtual fonts distributed with the PostScript font metrics on the +\textsc{ctan} archives. (This is the `8c' encoding in Karl Berry's +fontname scheme.) The \textsf{textcomp} package provides access to +this encoding but here is a warning to current users of that package: +some of the internal names for the characters have changed. +\end{description} + + +\section{New input encodings} + +These additions to the \textsf{inputenc} package are +\texttt{decmulti} (the DEC Multinational +Character Set, contributed by M.~Y.~Chartoire) +and \texttt{cp1250} (an MS-Windows encoding for Central and Eastern +Europe, contributed by Marcin Woli\'nski). There is also a +\texttt{cp1252} encoding that is identical to \texttt{ansinew}. + + +\section{Tools} + +The \textsf{calc} package (used in many examples in \emph{The \LaTeX\ +Companion}) has been contributed to this distribution by Kresten Krab +Thorup and Frank Jensen. This is essentially the same as the version +that has been available from the \textsc{ctan} archives for some time, +with one minor change: to use \LaTeX-style error messages. It enables +the use of arithmetic expressions within arguments to standard +\LaTeX{} commands where a length or a counter value is required. For +example: +\begin{verbatim} + \setcounter {page} { \value{page} * 2 + 1 } + \parbox { 3in - ( 2mm + \textwidth / 9 ) } +\end{verbatim} + +There have also been some improvements to several other packages in +this collection. In particular, \textsf{bm} now works correctly with +constructions such as \verb|\bm{f'}| involving \texttt{'} or other +characters which use \TeX's special ``\verb|\mathcode"8000|'' +feature. Also, \textsf{multicol} sets the length \verb|\columnwidth| +to an appropriate value; this enables it to work with classes that +support two-column setting, e.g.,~the AMS classes. + + +\section{Graphics} + +The special \verb|oztex.def| driver file has been removed, and Oz\TeX\ +support has been merged with dvips, following advice from +Andrew Trevorrow about Oz\TeX~3.x. + +The \textsf{keyval} package has had some internal improvements: to +use \LaTeX\ format error messages; and to avoid `\verb|#| doubling'. +This latter change means that the \verb|command| key for the +\textsf{graphicx} version of \verb|\includegraphics| should now be used +with one \verb|#| rather than two. For example, \verb|command = `gunzip #1|. +Fortunately this key is almost never used in practice, so few if any +documents should be affected by this change. + + +\section{\LaTeX3 experimental programming conventions} + +As announced at the \TeX\ Users Group meeting (Summer 1997), a group of +highly experimental packages will soon be released to allow experienced\\ +\TeX\ programmers to experiment with, and comment on, a proposed set +of syntax conventions and basic data-types that might form +the basis for programming large scale projects in \TeX. +They will be located in\\ +this CTAN directory: +\begin{verbatim} + CTAN:macros/latex/packages/expl3 +\end{verbatim} +The documentation of this material is as follows: individual package +files provide outline, draft documentation; there is an article that +gives an overview of the syntax and related concepts; there is a +\texttt{readme.txt} file containing a brief description of the +collection. + +All aspects of these packages are liable, indeed likely, to change. +They should not be used at this stage for anything +that requires a stable system. However, we do encourage people to +experiment with these packages, and to send comments on them to the +\texttt{LaTeX-L} mailing list. +To subscribe to this list, mail to: +\begin{verbatim} + listserv@urz.uni-heidelberg.de +\end{verbatim} +the following one line message: +\begin{verbatim} + subscribe LATEX-L <<first-name>> <<second-name>> +\end{verbatim} + +% Revert to this if gets too full. +% See \texttt{modguide.tex} for +% information on how to subscribe to \texttt{LaTeX-L}. + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews09.tex b/Master/texmf-dist/source/latex-dev/base/ltnews09.tex new file mode 100644 index 00000000000..c4f8b43ec87 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews09.tex @@ -0,0 +1,142 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews09.tex + +% This is issue 9 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews}[1999/02/23] + +%\usepackage[T1]{fontenc} + +\publicationmonth{June} +\publicationyear{1998} +\publicationissue{9} + +\begin{document} + +\maketitle + + +\section{New math font encodings} + +A joint working group of the \TeX{} Users Group and the \LaTeX3 +Project is developing a new 8-bit math font encoding for \TeX{}. +It is designed to overcome several limitations and implementation +problems of the old math font encodings and to simplify switching +between different sets of math fonts, much as the \LaTeX{} font +selection interface has simplified switching between text fonts. + +Since the work on this project relies entirely on volunteer work, we +cannot give a specific release date yet. However, a prototype +implementation already exists. This contains several sets of virtual +fonts, some \LaTeX{} packages and a kernel module; we hope to +integrate it into the main \LaTeX{} distribution for the next +release. + +Documents using only standard \LaTeX{} commands for math symbols +should not be affected by switching to the new math font encodings +However, documents, classes or packages making specific assumptions +about the encoding of math symbol fonts are likely to break. + +Further information about the Math Font Group may be found on +the World Wide Web at \texttt{http://www.tug.org/twg/mfg/}. + + +\section{A new math accent} + +A new math accent, \verb|\mathring|, has been added. This is a math mode +version of the ring accent (\r{}) which is available in text +mode with the command \verb|\r|. + +\section{Extended \cs{DeclareMathDelimiter}} + +The command \verb|\DeclareMathDelimiter| has been extended. +Normally this command takes six arguments. Previously, when being used +to declare a character (such as \texttt{[}) as a delimiter, a variant +form was used with only five arguments. The argument specifying the +default `math class' was omitted. Now the full six-argument form may be +used in this case. The extra information is used to implicitly declare +the character via \verb|\DeclareMathSymbol| for use when the symbol is +not used with \verb|\left| or \verb|\right|. + +The old five-argument form is detected and will work as before. + +\newpage + +\section{Tools distribution} + +The \texttt{multicol} package now supports the production of multiple +columns without balancing the last page. To get this effect use the +\texttt{multicols*} environment. + +The \texttt{layout} package was partly recoded by Hideo Umeki to +display page layout effects in a better way. + +As suggested by Donald Arseneau, the \texttt{calc} package was extended +to support the new commands \verb|\widthof{<text>}|, +\verb|\heightof{<text>}|, and \verb|\depthof{<text>}| within a +\texttt{calc}-expression. At the same time we modified a few kernel +commands so that \texttt{calc}-expressions can now be used in various +useful places such as the dimension arguments to the \texttt{tabular} +environment and the \verb|\rule| command. For many other standard +\LaTeX{} commands this was already possible. + + +\section{Support for Cyrillic encodings} + +We are very pleased that, after a lengthy period of development, a set +of fonts, encodings and support files for using \LaTeX\ with Cyrillic +characters will soon be available. + +Test versions of the `LH' fonts for these Cyrillic encodings, based on +the Computer Modern design, are available from CTAN archives in the +directory \texttt{fonts/cyrillic/lh-test}. The \LaTeX\ support files +(by Werner Lemberg and Vladimir Volovich) are also available from CTAN +archives in\\ + \texttt{macros/latex/contrib/supported/t2} + + +\section{Default docstrip header} + +Many \LaTeX\ users now distribute packages in documented source form +using the \textsf{docstrip} system. Docstrip allows a header to be +placed on generated package files, suitable for giving copyright +information, or distribution conditions. + +We have changed the default version of this header so that it allows +stripped files to be distributed in ready-to-run installations such as +the \TeX{}Live CD\@. If you use the default header for distributing +your files you should check that the new copyright text is acceptable +to you. The file \texttt{docstrip.dtx} explains how to produce your own +header if you wish to do so. + + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews10.tex b/Master/texmf-dist/source/latex-dev/base/ltnews10.tex new file mode 100644 index 00000000000..d9e0d4de530 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews10.tex @@ -0,0 +1,153 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews10.tex 12/01/1998 + +% This is issue 10 of LaTeX News. + +\documentclass +% [lw35fonts] + {ltnews}[1999/02/23] + +% \usepackage[T1]{fontenc} + +\publicationmonth{December} +\publicationyear{1998} +\publicationissue{10} + +\begin{document} + +\maketitle + + +\section{Five years of \LaTeXe} + +Since this is the 10th edition of \LaTeX{} News, the (no longer) New +Standard \LaTeX{} must have hit the streets almost this long ago. In +fact it was only the beta-version that some people got just in time for +Christmas~1993, and since then there has been a lot of tidying-up and +smoothing of rough edges (not to mention a few bug fixes!). + +Maybe it is time for something more radically different to emerge and +be hungrily adopted by the world; but don't panic, we shall be +maintaining what you have now for a long time yet. Amongst the more +polite things that have been written about our efforts, we found that this +quote (somewhat censored to protect the guilty) well reflects some of +our feelings about working on \LaTeX{} over the years: \textit{the mere +existence of \LaTeXe{} is a great miracle}. + + + \section{Restructuring the \LaTeX{} distribution} + + Since the (once) `new' standard \LaTeX{} has reached such a venerable + age, we are reviewing the way in which the system is presented to the + world. + + An early intention is to define, given the wide variety of good + packages now available, what now constitutes a useful installation of + \LaTeX{}. We also hope that such a definition will help document + portability if it leads to a future in which a \LaTeX{} class + designer can reasonably assume that a known list of + facilities will be there for all users (so that each class + need not supply them). + + As a first small step towards this definition, we shall replace the + \texttt{latex/packages} subdirectory on \ctan{}. + This directory was a curious mixture of the important, such as the + \LaTeX{} \texttt{tools}, that any self-respecting \LaTeX{} + installation ought to have, and the esoteric or experimental. + + The esoterica from \texttt{packages} will be moved to + new locations, as follows: + \begin{quote} + \texttt{expl3} to \texttt{latex/exptl/project}\\ + \texttt{mfnfss} to \texttt{latex/contrib/supported/mfnfss} + \end{quote} + + The subdirectory that replaces \texttt{packages} will be called + \texttt{latex/required}; all the other sub-directories of + \texttt{packages} will be moved there. + +\vspace{17pt} +\pagebreak + + \section{\LaTeX\ Project on the Internet} +A new \texttt{latex-project.org} domain has been registered. +The web site is not yet fully functional but the old \LaTeX\ pages from +\ctan\ are available at \texttt{http://www.latex-project.org/} and the +\LaTeX\ bug reporting address has been changed to +\texttt{latex-bugs@latex-project.org}. + + \section{Restructuring the \LaTeX{} package licenses} + +Several people have requested an easy mechanism for the distribution +of \LaTeX\ packages and other software ``under the same conditions as +\LaTeX''. The old \texttt{legal.txt} file was unsuitable as a general +licence as it referred to specific \LaTeX\ authors, and to specific +files. + +Therefore, in this release \texttt{legal.txt} contains just the +copyright notice and a reference to the new \emph{\LaTeX\ Project +Public License} (LPPL) for the distribution and modification +conditions. The \texttt{tools}, \texttt{graphics}, and \texttt{mfnfss} +packages also now refer to this license in their distribution notices. + + \section{Support for Cyrillic encodings} + +Basic Cyrillic support, as announced in \LaTeX{} News~9, is now +finally an official part of \LaTeX{}. It includes support for the +following standard Cyrillic font encodings (this list may +grow):~\mbox{\texttt{T2A T2B T2C X2}}. + +It also includes various Cyrillic input encodings (20~in total, +including commonly used variants and Mongolian Cyrillic +encodings). This provides platform independent and +sophisticated basic support for high-quality typesetting in various +Cyrillic-based languages. + +For further information see the file \texttt{cyrguide.tex}. + +\section{Tools distribution} + +The \texttt{varioref} package has been extended to support textual +page references to a range of objects: e.g.,~if \texttt{eq-first} +and \texttt{eq-last} are the label names for the first and last +equation in a sequence, then you can now write +\begin{verbatim} + see~\vrefrange{eq-first}{eq-last} +\end{verbatim} +This results in different text depending on whether both +labels fall on the same page. + +Some additional user commands, as well as building-blocks for writing +private extensions, are described in the accompanying documentation. + + + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews11.tex b/Master/texmf-dist/source/latex-dev/base/ltnews11.tex new file mode 100644 index 00000000000..6587a691af9 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews11.tex @@ -0,0 +1,141 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews11.tex 01/06/1999 +% This is issue 11 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Times + {ltnews} + +% \usepackage[T1]{fontenc} + +\publicationmonth{June} +\publicationyear{1999} +\publicationissue{11} + +\begin{document} + +\maketitle + +\section{Back in sync} + +The last release of \LaTeX{} was delayed even longer than you have +come to expect. We hope that it proved worth waiting for. It +required a major integration of the code from several people and, +independently, the introduction of the LPPL (see \LaTeX{} News~10) plus +several related changes to our internal systems. It therefore seemed +sensible to wait until everything was complete rather than do things +in too much hurry. + +This seem to have been a successful strategy as +the recent patch release was related to an isolated change that was +done many months previously. If this release does not appear a lot +closer to its nominal date then \ldots~well, you will not be reading +this sentence! + +\section{Yearly release cycles} + +With the year 2000 rapidly approaching, we intend to switch to a +release frequency of just one per year (with patches if necessary) for +the core of \LaTeXe{}. These days the system is sufficiently stable +that the original update policy is costing everybody more time than is +now warranted. + +\section{LPPL update} + +Thanks to extensive and valuable input from Matt Swift +(\email{swift@alum.mit.edu}) we now have a clearer and more detailed +form of the \LaTeX{} Project Public Licence. This release contains +both the original version (in \file{lppl-1-0.txt}) and the updated +version, LPPL~1.1. + +\section{The future of Sli\TeX{}} + +We still get a very small trickle of reports about this part of the +system (if you are no longer able to recall \LaTeX~2.09 then you will +know it as the \class{slides} class). We have not classified them (in +our minds at least) as bugs since we have always known that there are +many problems with this class. It is clear to us that the only +sensible action would be to redesign the system completely; in +particular, to remove much of its complexity whose purpose is to +support 10-year-old overlay technology. However, this would take a +lot too much time and would be completely out of proportion to its +current usage. + +We are therefore planning to make the \class{slides} class +unsupported in the sense that any problem related to the use of +invisible fonts is considered to be a feature (The \LaTeXe{} manual by +Leslie Lamport doesn't even describe this part of the class any more). +Of course, if it still has its enthusiasts then we are happy to cede +it to their loving care (somewhat like a preserved steam locomotive, +in some parts of the world). + +\section{Fontenc package peculiarities} + +The \verb=\usepackage= interface normally ensures that a package is +loaded only once. The \pkg{fontenc} package has become an +exception to this rule: it can be loaded several times using different +options, e.g., allowing the user to add a font encoding in the +preamble. This comes at a price for package writers: the low-level +commands (see \file{ltclass.dtx}) used to check if a package was +loaded, and with which options, do not work for the \pkg{fontenc} +package. + +\section{New math font encodings} + +As we announced in \LaTeX{} News~9, a joint working group of the +\TeX{} Users Group and the \LaTeX3 Project has developed a new +\mbox{8-bit} math font encoding for \TeX{}. +The reason why this work is not yet released is because of other +exciting developments in the world of math fonts and math characters. +It is obviously wise to ensure that the encoding work is fully +integrated with the available fonts. + +Those interested are reminded that further information about the Math +Font Group may be found on the World Wide Web at:\\ +\url{http://www.tug.org/twg/mfg/}. + +\section{Tools distribution} + +The \pkg{multicol} package has now got a small but useful extension +which allows you to force a column break where this is really +necessary. This is done with the command \verb=\columnbreak=, which +can be used like \verb=\pagebreak= (e.g.,~within paragraphs) except +that it cannot have an optional argument and thus it always forces a +new column. + +\section{Coming soon} + +Major work on a new class file structure to support flexible +designs is well under way; some of this work will be presented at the +TUG'99 conference in Vancouver, Canada. With a bit of luck much of +this work could be ready for integration into the next release---so +watch this space! + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews12.tex b/Master/texmf-dist/source/latex-dev/base/ltnews12.tex new file mode 100644 index 00000000000..47609689cea --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews12.tex @@ -0,0 +1,154 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews12.tex +% +% This is issue 12 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Times + {ltnews}[1999/12/01] + +% \usepackage[T1]{fontenc} + +\publicationmonth{December} +\publicationyear{1999} +\publicationissue{12} + +% Should go to .cls: +\newcommand{\acro}[1]{\textsc{\MakeLowercase{#1}}} + +\begin{document} + +\maketitle + +\section{LPPL update} + +Since the release of the \LaTeX{} Project Public Licence version~1.1, +we have received a small number of queries which resulted in some +minor changes to improve the wording or explain the intentions better. +As a consequence this release now contains LPPL~1.2 in the file +\file{lppl.txt} and the previous versions as \file{lppl-1-0.txt} and +\file{lppl-1-1.txt}. + +\section{fixltx2e package} + + This package provides fixes to \LaTeXe{} which are desirable but + cannot be integrated into the \LaTeXe{} kernel directly as they + would produce a version incompatible to earlier releases (either + in formatting or functionality). + + By having these fixes in the form of a package, users can benefit + from them without the danger that their documents will fail, or + produce unexpected results, at other sites; this works because a + document will contain a clear indication (the \verb=\usepackage= + line, preferably with a required date) that at least some of these + fixes are required to format it. + +\section{Outcome of TUG '99 (Vancouver)} + +The slides from the \acro{TUG}'99 presentation we gave on \emph{a +new interface for \LaTeX\ class designers} are available from the +\LaTeX\ Project website; look for the file \verb|tug99.pdf| at: +\begin{quote} + \url{http://www.latex-project.org/talks/} +\end{quote} + +Please note that this document was intended only to be informal +``speaker's notes'' for our own use. We decided to make them available (the +speaker's notes as well as the slides that were presented) because several +people requested copies after the talk. However, they are \emph{not} in +a polished copy-edited form and are not intended for publication. + +Prototype implementations of parts of this interface are now available from: +\begin{quote} + \url{http://www.latex-project.org/code/experimental/} +\end{quote} + +We are continuing to add new material at this location so as to +stimulate further discussion of the underlying concepts. As of +December 1, 1999 +the following parts can be downloaded. +\begin{description} + + \item[xparse] Prototype implementation of the interface for declaring + document command syntax. See the \texttt{.dtx} files for + documentation. + + \item[template] Prototype implementation of the template interface + (needs parts of \texttt{xparse}). + + The file \texttt{template.dtx} in that directory has a large section + of documentation at the front describing the commands in the + interface and giving a `worked example' building up some templates + for caption formatting. + + \item[xcontents] Interface description for table of contents data (no + code yet). Coding examples have been thoroughly discussed on the + \texttt{latex-l} list. + + \item[xfootnote] Working examples for generating footnotes, + etc. Needs \texttt{xparse} and \texttt{template}. + + \end{description} +All examples are organised in subdirectories and additionally + available as \texttt{gzip} \texttt{tar} files. + + Please remember +that this material is intended only for experimentation and comments; +thus any aspect of it, e.g., the user interface or the functionality, +may change and, in fact, is very likely to change. +For this reason it is explicitly forbidden to place this material on +\acro{CD-ROM} distributions or public servers. + +These concepts, as well as their implementation, are under discussion +on the list \texttt{LATEX-L}. You can join this list, which is +intended solely for discussing ideas and concepts for future versions +of \LaTeX, by sending mail to +%\begin{quote} + \email{listserv@URZ.UNI-HEIDELBERG.DE} +%\end{quote} +containing the line + \begin{quote} + \texttt{SUBSCRIBE LATEX-L} \textit{Your Name} + \end{quote} + +This list is archived and, after subscription, you can retrieve older +posts to it by sending mail to the above address, containing a command +such as: +\begin{quote} +\texttt{GET LATEX-L LOGyymm} +\end{quote} +where \texttt{yy}=Year and \texttt{mm}=Month, e.g. +\begin{quote} +\texttt{GET LATEX-L LOG9910} +\end{quote} +for all messages sent in October 1999. + + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews13.tex b/Master/texmf-dist/source/latex-dev/base/ltnews13.tex new file mode 100644 index 00000000000..ae08f3d90d1 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews13.tex @@ -0,0 +1,201 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews13.tex +% +% This is issue 13 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Palatino + {ltnews}[2000/07/21] + +% \usepackage[T1]{fontenc} + +\publicationmonth{June} +\publicationyear{2000} +\publicationissue{13} + + +\begin{document} + +\maketitle + +\raisefirstsection +\section{Yearly release cycle} + +We announced in \textit{\LaTeX{} News~11} that we intended to switch +to a 12-monthly release schedule. With the present (June~2000) +release, this switch is being made: thus the next release of \LaTeX{} +will be dated June~2001. We shall of course continue, as in the past, +to release patches as needed to fix significant bugs. + + +\section{PSNFSS: \small Quote of the Month} + +\begin{quote} + You should say in the \LaTeX{} News that Walter Schmidt has taken over + \PSNFSS{} from me. It gives me a certain pleasure to be able to draw a + line under that part of my life\ldots + + \begin{latexonly} + \vspace{-\baselineskip} + \end{latexonly} + + \begin{flushright} + Sebastian Rahtz + \end{flushright} +\end{quote} + +\begin{latexonly} + \vspace{-\baselineskip} +\end{latexonly} + +\noindent +The \PSNFSS{} material, which supports the use\latex{\\} +of common PostScript fonts with \LaTeX{}, has been thoroughly updated. +Most noticeably, the \package{mathpple} package, which used to be +distributed separately, is now part of the basic \PSNFSS{} bundle; +this package provides mathematical typesetting with the Palatino +typeface family. In addition, numerous bugs and flaws have been fixed +and the distribution has been `cleaned up'. The file +\file{changes.txt} contains a detailed list of these changes. +\latex{\looseness=-1} %%!!!!! It worked! + +The documentation (in \file{psnfss2e.pdf}) has been completely +rewritten to provide a comprehensive introduction to the use +of PostScript fonts. + +Notice that the new \PSNFSS{} needs updated files for font metrics, +virtual fonts and font definitions. If you received the new +version~(8.1) as part of a complete \TeX{} system then these new font +files should also have been installed. However, if you intend to +install or update \PSNFSS{} yourself, please read the instructions in +the file \file{00readme.txt} of the new \PSNFSS{} distribution. + +Support for commercial PostScript fonts, such as +Lucida~Bright, has been removed from the basic distribution; +it is now available from \ctan{}: +\begin{latexonly} + \file{\ctanhttp macros/latex/\\ + contrib/supported/psnfssx}. +\end{latexonly} +\begin{htmlonly} + \url{http://www.tex.ac.uk/tex-archive/macros/latex/contrib/supported/psnfssx}. +\end{htmlonly} + +\section{New AMS-\LaTeX{}} + +Version 2.0 of AMS-\LaTeX{} was released on December 1, 1999. It can +be obtained via \url{ftp://ftp.ams.org/pub/tex/} or +\url{http://www.ams.org/tex/amslatex.html}, as well from \ctan{}: +\begin{latexonly} + \file{\ctanhttp macros/latex/\\ + required/amslatex}. +\end{latexonly} +\begin{htmlonly} + \url{http://www.tex.ac.uk/tex-archive/macros/latex/required/amslatex}. +\end{htmlonly} + +This release consists chiefly of bug fixes and consolidation of the +existing features. The division of AMS-\LaTeX{} into two main parts +(the math packages;\latex{\\} +the AMS document classes) has been made more pronounced. +The files \file{diffs-m.txt}, \file{diffs-c.txt}, +\file{amsmath.faq}, and \file{amsclass.faq} describe the\latex{\\} +changes and address some common questions. + +The primary documentation files remain \file{amsldoc.tex}, for the +\package{amsmath} package, and \file{instr-l.tex}, for the AMS +document classes.\latex{\\} +The documentation for the \package{amsthm} package,\latex{\\} +however, has been moved from \file{amsldoc.tex}\latex{\\} +to a separate document \file{amsthdoc.tex}. + +\begin{latexonly} + \vfill +\end{latexonly} + +\section{New input encoding \package{latin4}} + +The package \package{inputenc} has, thanks to Hana Skoumalov\'a, +been extended to cover the \package{latin4} input encoding; this +covers Baltic and Scandinavian languages as well as Greenland +Inuit and Lappish. + +\begin{latexonly} + \vfill +\end{latexonly} + +\section{New experimental code} + +In \textit{\LaTeX{} News~12} we announced some ongoing work towards a +`Designer Interface for \LaTeX' and we presented some early results +thereof. Since then, at Gutenberg\,2000 in Toulouse and TUG\,2000 in +Oxford, we described a new output routine and an improved method of +handling vertical mode material between paragraphs. In combination +these support higher quality \emph{automated}\footnote + {The stress here is on automated!} +page-breaking and page make-up\latex{\\} +for complex pages---the best yet achieved with \TeX{}! + +A paper describing the new output routine is +\begin{latexonly} + at\\ + \file{http://www.latex-project.org/papers/xo-pfloat.pdf% + \hspace*{-16pt}}\\ +\end{latexonly} +\begin{htmlonly} + at \url{http://www.latex-project.org/papers/xo-pfloat.pdf}. +\end{htmlonly} +All code examples and documentation are available +\begin{latexonly} + at\\ + \file{http://www.latex-project.org/code/experimental/% + \latex{\hspace*{-5pt}}}.\\[3pt] +\end{latexonly} +\begin{htmlonly} + at \url{http://www.latex-project.org/code/experimental/}. + +\end{htmlonly} +This directory has been extended to contain +\begin{description} + \item[galley] Prototype implementation of the interface\latex{\\} + for manipulating vertical material in galleys. + \item[xinitials] Prototype implementation of the interface\latex{\\} + for paragraph initials (needs the \texttt{galley} package. + \item[xtheorem] Contributed example using the \texttt{template} + package to provide a designer interface for theorem environments. + \item[xoutput] A prototype implementation of the new output routine + as described in the \texttt{xo-pfloat.pdf} paper. Expected + availability: at or shortly after\latex{\\} + the TUG\,2000 conference. +\end{description} + +\end{document} + + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews14.tex b/Master/texmf-dist/source/latex-dev/base/ltnews14.tex new file mode 100644 index 00000000000..1e5c8d72c8f --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews14.tex @@ -0,0 +1,169 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews14.tex +% +% This is issue 14 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Palatino + {ltnews}[2001/07/12] + +% \usepackage[T1]{fontenc} + +\publicationmonth{June} +\publicationyear{2001} +\publicationissue{14} + + +\begin{document} + +\maketitle + +\raisefirstsection +\section{Future releases} + +We are currently exploring how to best support the very large +community of individuals, organisations and enterprises that depend on +the robustness and availability of the current standard \LaTeX{} +distribution. The results of this may lead to some changes in the +regular release schedule and the handling of bug reports during the +next year. + +\section{New release of \textsf{Babel} (required)} + +Earlier this year a new release of \textsf{Babel} (3.7) became +available. You can read about its new features in +\begin{latexonly} + \file{http://www.ctan.org/tex-archive/macros/}\\ + \hspace*{4em}\file{latex/required/babel/announce.txt} +\end{latexonly} +\begin{htmlonly} + \url{http://www.ctan.org/tex-archive/macros/latex/required/babel/announce.txt} +\end{htmlonly} + +One of the bugs that got fixed in this release deals with how labels +are handled by \LaTeX{}. Because this part of the kernel is modified +by \textsf{babel}, the relevant changes need to be coordinated. +Therefore to use \textsf{Babel} with this release of \LaTeX{} you will +need to update your version of \textsf{babel} to at least 3.7. + +\section{New input encoding \package{latin9}} + +The package \package{inputenc} has, thanks to Karsten Tinnefeld, been +extended to cover the \package{latin9} input encoding. The +ISO-Latin~9 encoding is a useful modern replacement for ISO-Latin~1 +that contains a few characters needed for French and Finnish. Of wider +interest, it also contains the euro currency sign; this could be the +killer argument for many 8-bit texts to use Latin-9 in the future. + +According to a Linux manpage, ISO~Latin-9 supports Albanian, Basque, +Breton, Catalan, Danish, Dutch, English, Estonian, Faroese, Finnish, +French, Frisian, Galician, German, Greenlandic, Icelandic, Irish +Gaelic, Italian, Latin, Luxembourgish, Norwegian, Portuguese, +Rhaeto-Romanic, Scottish Gaelic, Spanish and Swedish.\\ +The characters added in \package{latin9} are (in \LaTeX{} notation):\\ +\begin{small} +\verb| \texteuro \v S \v s \v Z \v z \OE \oe \" Y | +\end{small}\\ +They displace the following characters from \package{latin1}:\\ +\begin{small} +\verb| \textcurrency \textbrokenbar \"{} \'{} \c{} |\\ +\verb| \textonequarter \textonehalf \textthreequarters | +\end{small} + + +\section{New tools} + +The new package \package{trace} provides many commands to control +\LaTeX{}'s tracing and debugging output, including the excellent new +information available with \eTeX{} such as the extremely useful +tracing of local assignments. You will find it in the tools +distribution. + +It offers the command \verb|\traceon|, which is similar to +\verb|\tracingall| but suppresses uninteresting stuff such as font +loading by NFSS (which can go on for pages if you are unlucky). It +also offers \verb|\traceoff| to \ldots\ guess what! Full details are +in the documented source file, \file{trace.dtx}. + +In the base \package{ifthen} package we have added +the uppercase synonyms \verb|\NOT| \verb|\AND| and \verb|\OR|. + +\section{New experimental code} + +In \textit{\LaTeX{} News~12} we announced some ongoing work towards a +`Designer Interface for \LaTeX' and we presented some early results +thereof. Since then, at Gutenberg\,2000 in Toulouse and TUG\,2000 in +Oxford, we described a new output routine and an improved method of +handling vertical mode material between paragraphs. In combination +these support higher quality \emph{automated}\footnote + {The stress here is on automated!} +page-breaking and page make-up\latex{\\} +for complex pages---the best yet achieved with \TeX{}! + +More recently we have added material to handle the complex front +matter requirements of journal articles; this was presented at +Gutenberg\,2001 in Metz. + +A paper describing the new output routine is +\begin{latexonly} + at\\ +\begin{small} + \file{http://www.latex-project.org/papers/xo-pfloat.pdf}\\ +\end{small} +\end{latexonly} +\begin{htmlonly} + at \url{http://www.latex-project.org/papers/xo-pfloat.pdf}. +\end{htmlonly} +All code examples and documentation are available +\begin{latexonly} + at\\ +\begin{small} + \file{http://www.latex-project.org/code/experimental} +\end{small} +\end{latexonly} +\begin{htmlonly} + at \url{http://www.latex-project.org/code/experimental/}. +\end{htmlonly} + +This directory has been extended to contain the following. +\begin{description} + \item[galley] Prototype implementation of the interface\latex{\\} + for manipulating vertical material in galleys. + \item[xinitials] Prototype implementation of the interface\latex{\\} + for paragraph initials (needs the \texttt{galley} package). + \item[xtheorem] Contributed example using the \texttt{template} + package to provide a designer interface for theorem environments. + \item[xor] A prototype implementation of the new output routine + as described in the \texttt{xo-pfloat.pdf} paper. + \item[xfrontm] A prototype version of + the new font matter interface. +\end{description} + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews15.tex b/Master/texmf-dist/source/latex-dev/base/ltnews15.tex new file mode 100644 index 00000000000..389ed6334d9 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews15.tex @@ -0,0 +1,169 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews15.tex +% +% This is issue 15 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Palatino + {ltnews}[2004/02/28] + +% \usepackage[T1]{fontenc} + +\publicationmonth{December} +\publicationyear{2003} +\publicationissue{15} + +\begin{document} + +\maketitle + +%\raisefirstsection + +\section{Anniversary release} + +Yes, it's now 10~years since the first release in this series and, for +Knuthists, this release also contains \textit{Issue 16}\,! + +Meanwhile this \textit{Issue~15} describes the major new features in +the current release whilst \textit{Issue~16} looks\newline +a little way into the future of \LaTeX{}. + + +\section{LPPL -- new version} + +Most importantly, there is now a new version, 1.3, of the \LaTeX{} +Project Public Licence. Many of you will\newline +be thrilled to know that, following the exchange of over 1600 e-mail +messages dissecting various aspects of its philosophy such as `how +many angels can appear in the name of a file before it becomes +non-free', this version\newline +is now officially a DFSG (Debian Free Software Guidelines) approved license. +The discussions start at +\url{http://lists.debian.org/debian-legal/2002/debian-legal-200207/threads.html} +with high traffic throughout August to October~2002 and further +heated discussions starting in April~2003 and concluding +around June at +\url{http://lists.debian.org/debian-legal/2003/debian-legal-200306/msg00206.html}. + +The important features of the new version are useful clarifications in +the wording, and revised procedures\newline +for making a change to the Current Maintainer of a package. Special +thanks to all those people from\newline Debian Legal who worked +constructively with us\newline +on this onerous task, especially but not exclusively\newline +Jeff Licquia and Branden Robinson. + + +\section{Small updates to varioref} + +The English has been corrected in \verb|\reftextbefore| +(an incompatible change). There are other extensions +such as \verb|\labelformat|, \verb|\Ref|, \verb|\Vref| and \verb|\vpagerefnum|. +Some Dutch text has also been changed and two\newline +new options added: \package{slovak} and \package{slovene}. + + +\section{New and more robust commands} + +Many of the math mode commands for compound symbols have been made +robust and a new robust command has been added: \verb|\nobreakdashes|. +This last is a low-level command, borrowed from the \package{amsmath} +package, for use only before hyphens or dashes. It prevents the line +break that is normally allowed\newline +after the following sequence of dashes. + + +\section{Fixing font sizes} + +The new \package{fix-cm} package, by Walter Schmidt, changes the CM font +definition (\texttt{.fd}) files so that similar design sizes are used +in both the \texttt{OT1} and \texttt{T1} encodings. + + +\section{Font encodings} + +A number of options have been added to the \package{textcomp} package, +enabling only available glyphs to be used. +Also, the `NFSS font families' are now divided into five different groups +according to the subset of glyphs each provides from the full +collection of symbols in the TS1 encoding. +Given sufficient information about a font family +\package{textcomp} will use this in order to limit the\newline +typesetting to those glyphs that are available. + +Use of this mechanism has also enhanced \verb|\oldstylenums| +to use the current font if possible. + + +\section{Displaying font tables} + +With the \package{nfssfont} package you can now +specify the font to display by giving its `NFSS classification', +rather than needing to know its external font file's name. +It is also now possible to generate large collections of font +tables in batch mode by providing a suitable input file. + + +\section{New input encodings} + +The \package{inputenc} package has been extended as follows: +\package{macce} input encoding +(Apple Central European), +thanks to Radek Tryc and Marcin Wolinski; \package{cp1257}\newline +for Baltic languages; \package{latin10}, +thanks to Ionel Ciob\^{i}c\u{a}.\newline +The euro symbol has by +now been added to several encodings: +\package{ansinew}, \package{cp1250} +and \package{cp1252} (which also\newline +has another addition), whilst \package{cp858} +adds it to \package{cp850}. + + +\section{Unicode input} + +Partial, experimental support for text files that use the Unicode +encoding form UTF-8 is now provided by the option \package{utf8} for +the \package{inputenc} package. + +The only Unicode text file characters supported by the current version +are those based on the most common inputs for glyphs from the small +collection\newline +of standard \LaTeX{} Latin encodings. + + +\section{And finally \ldots\ pict2e} + +The old, non-functional version of this package has been removed + as there is now a fully working version from Hubert G\"a{\ss}lein + and Rolf Niepraschk. It is described + in \textit{The \LaTeX{} Manual}. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews16.tex b/Master/texmf-dist/source/latex-dev/base/ltnews16.tex new file mode 100644 index 00000000000..69e05973a8e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews16.tex @@ -0,0 +1,161 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews16.tex +% +% This is issue 16 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Palatino + {ltnews}[2004/02/28] + +% \usepackage[T1]{fontenc} + +\publicationmonth{December} +\publicationyear{2003} +\publicationissue{16} + +\begin{document} + +\maketitle + +%\raisefirstsection + +\section{Anniversary news} + +This anniversary \textit{Issue~16} takes a brief look into the future work of +the \LaTeX3 Project Team, both short and and longer range. Please let +us know if you want %\newline +to get involved with us in any of this work (see below). + +An overview of the 10th Anniversary Release, dated 2003/12/01, is +can be found in \textit{Issue~15}. + + +\section{TLC2: The \LaTeX{} Companion -- 2nd edition!} + +Since you are reading this newsletter, there is a good chance that +you, or a friend, has already bought this encyclopedic volume: the +incomparable Second\newline +Edition of this work that is every \LaTeX{}ie's\newline +ultimate lucky charm. + +If by some chance you have not yet purchased your own copy then get +into training, get shopping, and get flexing your muscles (both +physical---it's $1100+$~pages,\newline +and intellectual) by using it to discover +masses of invaluable `insider information' about: +\begin{itemize} +\item the latest release of Standard \LaTeX{}; +\item over~200~extension packages; +\item plus related software and systems. +\end{itemize} +For more information on this all new (??\ldots OK,\newline +not \emph{all}, but over 90\%!!), +all accurate (we hope!)\newline +10th~Anniversary Edition, check out\newline + \mbox{\url{http://www.awprofessional.com/titles/0201362996}}. + + +\section{Future maintenance} + +We are currently exploring how best to support the very large and +rapidly growing community of individuals, organisations and +enterprises that depend on the robustness and availability of the +current standard \LaTeX{} distribution. Although we remain firmly\newline +resolved not to make changes in the base distribution (the kernel) of +Standard \LaTeX{}, there is still much that needs doing to maintain +its reliability and utility and to keep up the necessary level of +communication with users and supporters. Also, as with all advanced +software systems, bugs are still turning up occasionally so %\newline +some fixes are still essential. + +One major impediment to providing adequate service levels in this area +is, of course, the difficulties inherent in obtaining the time and +commitment of skilled minds---hence the appeal above to anyone +interested %\newline +in getting involved. + + +\section{LPPL certification} + +There are still some outstanding diplomatic tasks around the +\LaTeX{} Project Public Licence: these include +e.g.,~getting it `OSF certified' and ensuring that it gains +more support and wider use, even in the FSF world\newline +where it has long been tolerated. + + +\section{Use of \eTeX/pdf\TeX} + +We expect that within the next two years, releases of \LaTeX{} will +change modestly in order to run best under an extended \TeX{} engine +that contains the \eTeX{} primitives, e.g., \eTeX{} or pdf\TeX{}. +The details of this possible upgrade need further work so we are not +making a definite announcement yet. + +Although the current release does not \emph{require} \eTeX{} features, +we certainly recommend using an extended \TeX{}, especially if you +need to debug macros. + + +\section{End of `autoload' support} + +As computer systems generally grow in capacity, requirements change +and so we believe that the \package{autoload} variant of \LaTeX{} is +no longer required. Thus, although the code remains it is no longer +supported. We hope this does not cause any problems. + + +\section{New models, new code} + +In the period 1999--2001 we published many results of our work over +the previous decade on the development of new concepts and models +for automated typesetting based on \TeX{} as the underlying platform. +These can be found at \url{http://www.latex-project.org/papers/} +and +\mbox{\url{http://www.latex-project.org/code/experimental/}}. + +Since then a very large proportion of the The Team's efforts have been +diverted to provide the core author team for TLC2, which provides +over 1000 pages of carefully researched and tested documentation of +many aspects of the vast world of \LaTeX{} related software that +was developed over that same time period and that continues +to grow and improve prodigiously. + +Completion of that task \ldots\ until TLC3!! \ldots\ presents the +possibility of getting back to this more exciting development work, +or even to more radical work on non-\TeX{}-based models and +implementations. + +Of course, any such ideas are predicated on our ability to organise +(with you, we hope) an efficient\newline +but responsive maintenance and support system\newline +for Standard \LaTeX{}. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews17.tex b/Master/texmf-dist/source/latex-dev/base/ltnews17.tex new file mode 100644 index 00000000000..99267429bc4 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews17.tex @@ -0,0 +1,230 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews17.tex +% +% This is issue 17 of LaTeX News. + +\documentclass +% [lw35fonts] % uncomment this line to get Palatino + {ltnews}[2004/02/28] + +% \usepackage[T1]{fontenc} + + +\publicationmonth{December} +\publicationyear{2005} +\publicationissue{17} + +\begin{document} + +\maketitle + +% \raisefirstsection + +\section{Project licence news} + +The \LaTeX{} Project Public License has been updated slightly so that +it is now version 1.3c. In the warranty section the +phrase ``unless required by applicable law'' has been reinstated, +having got lost at some point. Also, +it now contains three clarifications: of the difference between +``maintained'' and ``author-maintained''; of the +term ``Base Interpreter''; and when clause 6b and 6d shall not apply. + +Following requests, we now also provide the text of the licence as a +\LaTeX{} document (in the file \texttt{lppl.tex}). This file can be +processed either as a stand-alone document or it can be included +(without any modification) into another \LaTeX{} document, e.g., as an +appendix, using \verb|\input| or \verb|\include|. + + +\section{New guide on font encodings} + +Way back in 1995 work was started on a guide to document the +officially allocated \LaTeX{} font encoding names. However, for one +reason or another this guide (named \textit{\LaTeX{} font encodings}) +was, until now, not added to the distribution. It describes the major +7-bit and 8-bit font encodings used in the \LaTeX{} world and explains +the restrictions required of conforming text font encodings. It also +lists all the `encoding specific commands' (the LICR or \LaTeX{} +Internal Character Representation) for characters supported by the +encodings \texttt{OT1} and \texttt{T1}. + +When the file \texttt{encguide.tex} is processed by \LaTeX{}, it will +attempt to typeset an encoding table for each encoding it describes. +For this to be possible, \LaTeX{} must be able to find \texttt{.tfm} +files for a representative example font for each encoding. If +\LaTeX{} cannot find such a file then a warning is issued and the +corresponding table is omitted. + + +\section{Robust commands in math} + +The font changing commands in text-mode have been robust commands for years, +but the same has not been true for the math versions such as +\verb|\mathbf|. While the math-mode commands worked correctly in +section heads, they could cause problems in other places such as index +entries. With this release, these math-mode commands are now robust in +the same way as their text-mode counterparts. + +%% +\pagebreak +%% + + +\section{Updates of required packages} + +Several of the packages in the \package{tools} bundle have been updated +for this release. + +The \package{xspace} package has some new features. One is an +interface for adding and removing the exceptions it knows about and +another is that it works with active characters. These remove problems +of incompatibility with the \package{babel} system. + +In \textit{\LaTeX\ News~16} we announced that some packages might +begin to take advantage of \eTeX{} extensions on systems where these +are available: and the latest version of \package{xspace} does just +that. Note also that \package{fixltx2e} will make use of the +facilities in \eTeX{} whenever these are present (see below). + +The \package{calc} package has also been given an update with a few +extra commands. +The commands \verb|\maxof| and \verb|\minof|, each with two +brace-delimited arguments, provide the usual numeric $\max$ and $\min$ +operations. The commands \verb|\settototalheight| and +\verb|\totalheightof| work like \verb|\settoheight| and +\verb|\heightof|. There are also some internal improvements to make +\package{calc} work with some more primitive \TeX\ constructs, such as +\verb|\ifcase|. + +The \package{varioref} package has acquired a few more default +strings but there are still a number of languages for +which good strings are still missing. + +The \package{showkeys} package has also been updated slightly to work +with more recent developments in \package{varioref}. Also, it now +provides an easy way to define the look of the printed labels with +the command \verb|\showkeyslabelformat|. + +\section{Work on \LaTeX{} fixes} + +The package known as \package{fixltx2e} has three new additions. A new +command \verb|\textsubscript| has been added as a complement to the +command \verb|\textsuperscript| in the kernel. Secondly, a new form of +\verb|\DeclareMathSizes| that allows all of its arguments to have a +dimension suffix. This means you can now use expressions such as +\verb|\DeclareMathSizes{9.5dd}{9.5dd}{7.4dd}{6.6dd}|. + +The third new +addition is the robust command \verb|\TextOrMath| which takes two +arguments and executes one of them when typesetting in text or math +mode respectively. This command also takes advantage of \eTeX{} +extensions if available; more specifically, +%% +%%\pagebreak +%% +when the \eTeX{} extensions are available, it does not +destroy kerning between previous letters and the text to be typeset. +The command is also used +internally in \package{fixltx2e} to resolve a problem with +\verb|\fnsymbol|. + +Also, further work has been done on reimplementing +the command \verb|\addpenalty|, which is used internally in several +places: we hope it is an improvement! + +\section{The graphics bundle} + +The \package{graphics} bundle now supports the +\package{dvipdfmx} post-processor and Jonathan Kew's XE\TeX\ +program. By support we mean that the graphics packages recognize the +new options \texttt{xetex} and \texttt{dvipdfmx} but we do not +distribute the respective driver files. + +This leads elegantly to a description of the +new policy concerning such driver files in the \package{graphics} bundle. +Most driver files for our graphics packages are maintained by the +developers of the associated post-processor or \TeX\ programs. +The teams developing these packages are working very hard: their rapid +development offers a stark contrast to the current schedule of \LaTeX\ +releases. It is therefore no longer practical +for the \LaTeX\ Team to be responsible for distributing the +latest versions of these driver files. + +Therefore the installation files for \package{graphics} have been +split: there is now \file{graphics.ins} to install the package files and +\file{graphics-drivers.ins} for the driver files (located in +\file{drivers.dtx}). +There is no need +to install all those provided in the file \file{drivers.dtx}. + +Please also note that, as requested by the maintainers of +\package{PStricks}, we have removed the package \package{pstcol} as +current versions of \package{PSTricks} make it obsolete. + +%% +\newpage +%% + + +\section{Future development} + +The title of this section is a little misleading as it actually +describes \emph{current} development. In 1998 the \package{expl3} +bundle of packages was put on \ctan\ to demonstrate a possible \LaTeX3 +programming environment. These packages have been lying dormant for some +time while the \LaTeX\ Project Team were preoccupied by other things +such as developing the experimental packages \package{xor}, +\package{template}, etc., (and also writing that indispensable +and encyclopaedic volume,\\ +The \LaTeX{} Companion -- 2nd edition). + +In October 2004 work on this code base was resumed with the goal of +some day turning it into a kernel for \LaTeX3. This work can now +also make full use of the widely accepted \eTeX\ extensions. Currently +two areas are central to this work. + +\begin{itemize} +\item Extending the + kernel code of \LaTeX3. +\item Converting the experimental packages + such as \package{xor}, \package{template} to use the new + syntax internally. +\end{itemize} + +Beware! Development of +\package{expl3} is happening so fast that the descriptions above might +be out of date when you read this! If you wish to see what's going on +then go to +\url{http://www.latex-project.org/code.html} where you can download + fully working code (we hope!). + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews18.tex b/Master/texmf-dist/source/latex-dev/base/ltnews18.tex new file mode 100644 index 00000000000..4e6090c02b8 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews18.tex @@ -0,0 +1,51 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews18.tex +% +% This is issue 18 of LaTeX News. + +\documentclass + [lw35fonts] % uncomment this line to get Palatino + {ltnews}[2004/02/28] + +% \usepackage[T1]{fontenc} + + +\publicationmonth{December} +\publicationyear{2007} +\publicationissue{18} + +\begin{document} + +\maketitle + +\noindent This news never existed. + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews19.tex b/Master/texmf-dist/source/latex-dev/base/ltnews19.tex new file mode 100644 index 00000000000..6441449c2a8 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews19.tex @@ -0,0 +1,116 @@ +% \iffalse meta-comment +% +% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews19.tex +% +% This is issue 19 of LaTeX News. + +\documentclass{ltnews} + +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url} + +\publicationmonth{September} +\publicationyear{2009} + +\publicationissue{19} + +\begin{document} + +\maketitle + +\section{New \LaTeX\ release} + +This issue of \LaTeX~News marks the first release of a new version of +\LaTeXe\ since the publication of The \LaTeX\ Companion in 2005--2006. + +Just in time for \TeX\ Live 2009, this version is a maintenance +release and introduces no new features. A number of small changes have +been made to correct minor bugs in the kernel, slightly extend the Unicode +support, and improve various +aspects of some of the \texttt{tools} packages. + +\section{New code repository} + +Since the last \LaTeX\ release, the entire code base has been moved +to a public \textsc{svn} repository% +\footnote{\url{http://www.latex-project.org/svnroot/latex2e-public/}} +and the entire build architecture re-written. In fact, it has only +been possible for us to consider a new \LaTeX\ release since earlier +this year when the test suite was finally set up with the new system. +In the process, a bug in the \LaTeX\ picture fonts distributed with +\TeX\ Live was discovered, proving that the +tests are working and are still very valuable. + +Now that we can easily generate new packaged versions of the \LaTeXe\ +distribution, we expect to be able to roll out bug fixes in a much +more timely manner than over the last few years. New versions should +be distributed yearly with \TeX\ Live. Having said this, the +maintenance of the \LaTeXe\ kernel is slowing down as the bugs become +fewer and more subtle. Remember that we cannot change any of the +underlying architecture of the kernel or any design decisions of the +standard classes because we must preserve backwards compatibility with +legacy documents at all costs. + +Even new features cannot be added, because any new documents using +them will not compile in systems (such as journal production engines) +that are generally not updated once they've been proven to work as +necessary. + +None of this is to say that we consider \LaTeXe\ to be any less +relevant for document production than in years past: a stable system +is a useful one. +Moreover, the package system continues to provide a flourishing and stable +means +for the development of a wide range of extensions. + +\newpage + +\section{Babel} + +One area of the \LaTeXe\ code base that is still receiving feedback to +be incorporated into the main distribution is the Babel system for +multilingual typesetting. +While the Babel sources have already been added to the \textsc{svn} repository the +integration of the test system for Babel is still outstanding. + + +\section{The future} + +While work on \LaTeXe\ tends to maintenance over active development, +the \LaTeX3 project is +seeing new life. Our goals here are to provide a transition from the +\LaTeXe\ document processing model to one with a more flexible +foundation. Work is continuing in the \textsf{expl3} programming +language and the \textsf{xpackages} for document design. Future +announcements +about \LaTeX3 will be available via the \LaTeX\ Project +website and in TUGboat. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews20.tex b/Master/texmf-dist/source/latex-dev/base/ltnews20.tex new file mode 100644 index 00000000000..b095411c676 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews20.tex @@ -0,0 +1,153 @@ +% \iffalse meta-comment +% +% Copyright 1993--2011 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews20.tex +% +% This is issue 20 of LaTeX News. + +\documentclass{ltnews} + +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url} + +\publicationmonth{June} +\publicationyear{2011} + +\publicationissue{20} + +\begin{document} + +\maketitle + +\section{Scheduled \LaTeX\ bug-fix release} + +This issue of \LaTeX~News marks the first bug-fix release of +\LaTeXe\ since shifting to a new build system in 2009. +Provided sufficient changes are made each year, we expect to +repeat such releases once per year to stay in sync with \TeX\ Live. +Due to the excitement of \TeX's $2^5$-th birthday last year, +we missed our window of opportunity to do so for 2010. +This situation has been rectified this year! + +\section{Continued development} + +The \LaTeXe\ program is no longer being actively developed, as any non-negligible changes now could have dramatic backwards compatibility issues with old documents. Similarly, new features cannot be added to the kernel since any new documents written now would then be incompatible with legacy versions of \LaTeX. + +The situation on the package level is quite different though. While most of us have stopped developing packages for \LaTeXe{} there are many contributing developers that continue to enrich \LaTeXe{} by providing or extending add-on packages with new or better functionality. + +However, the \LaTeX\ team certainly recognises that there are improvements to be made to the kernel code; over the last few years we have been working on building, expanding, and solidifying the \textsf{expl3} programming layer for future \LaTeX\ development. We are using \textsf{expl3} to build new interfaces for package development and tools for document design. Progress here is continuing. + +\section{Release notes} + +In addition to a few small documentation fixes, the following changes have been made to the \LaTeXe\ code; in accordance with the philosophy of minimising forwards and backwards compatibility problems, most of these will not be noticeable to the regular \LaTeX\ user. + +\paragraph{Font subsets covered by Latin Modern and \TeX\ Gyre} + +The Latin Modern and \TeX\ Gyre fonts are a modern suite of families based +on the well-known Computer Modern and `PostScript 16' families with many additional +characters for high-quality multilingual typesetting.% +\footnote{% + See their respective TUGboat articles for more information:\\ + \url{http://www.tug.org/TUGboat/tb24-1/jackowski.pdf}\\ + \url{http://www.tug.org/TUGboat/tb27-2/tb87hagen-gyre.pdf}% +} + +Information about their symbol coverage in the \verb|TS1| encoding is now included +in \texttt{textcomp}'s default font definitions. + +% \paragraph{Private conditional switch in italic correction} +% negligible improvement/only useful to LaTeX programmers: not worth documenting I think? + +% \paragraph{Improve formatting in \texttt{doc} for filenames with some punctuation} +% negligible improvement, again? + +\paragraph{Redefinition of \cs{enddocument}} + +Inside the definition of \verb=\end{document}= the \texttt{.aux} file is read back in to resolve cross-references and build the table of contents etc. From 2.09 days this was done using \verb=\input= without any surrounding braces which could lead to some issues in boundary cases, especially if \verb=\input= was redefined by some package. It was therefore changed to use \LaTeXe{}'s internal name for this function. As a result, packages that modify \verb=\enddocument= other than through the officially provided hooks may need to get updated. + +\paragraph{Small improvement with split footnotes in \texttt{ftnright}} + +If in the first column there is more than a full column worth of footnote +material the material will be split resulting in footnotes out of +order. This issue is now at least detected and generates an error but the algorithm used by the package is +unable to gracefully handle it in an automated fashion (some alternatives for resolving the problem if it happens are given in the package documentation). + +\paragraph{Improvement in \texttt{xspace} and font-switching} + +The \texttt{xspace} package provides the command \verb|\xspace| +which attempts to be clever about inserting spaces automatically +after user-defined control sequences. +An important bug fix has been made to this command to correct its +behaviour when used in conjunction with font-switching commands +such as \verb|\emph| and \verb|\textbf|. +Previously, writing +\begin{verbatim} + \newcommand\foo{foo\xspace} + ... \emph{\foo} bar baz + ... \emph{\foo}, bar baz +\end{verbatim} +would result in an extraneous space being inserted after `foo' in +both cases; this has now been corrected. + + +\paragraph{RTL in \texttt{multicol}} + + The 1.7 release of \texttt{multicol} adds support for languages that are typeset + right-to-left. For those languages the order of the columns on the page + also needs to be reversed---something that wasn't possible in earlier releases. + +The new feature is supported through the +commands \verb|\RLmulticolcolumns| (switching to right-to-left typesetting) +and \verb|\LRmulticolcolumns| (switching to left-to-right typesetting) the +latter being the default. + +\paragraph{Improve French \texttt{babel} interaction with \texttt{varioref}} + + Extracting and saving the page number turned out to be a source of subtle + bugs. Initially it was done through an \verb"\edef" with a bunch of +\verb"\expandafter" commands inside. This posed a problem if the page number + itself contained code which needed protection (e.g., pr/4080) so this got + changed in the last release to use \verb"\protected@edef". However, that in turn failed with Babel +(bug report/4093) if the label contained active characters, e.g., a ``:'' in French. So now +we use (after one failed attempt pr/4159) even more \verb"\expandafter" commands and \verb"\romannumeral" trickery to avoid any expansion other + than what is absolutely required---making the code in that space absolutely unreadable. +\begin{verbatim} + \expandafter\def\expandafter#1\expandafter{% + \romannumeral + \expandafter\expandafter\expandafter + \z@ + \expandafter \@cdr + \romannumeral + \expandafter\expandafter\expandafter + \z@ + \csname r@#2\endcsname\@nil}% +\end{verbatim} +Code like this nicely demonstrates the limitations in the programming layer of \LaTeXe{} and the advantages that \textsf{expl3} will offer on this level. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews21.tex b/Master/texmf-dist/source/latex-dev/base/ltnews21.tex new file mode 100644 index 00000000000..b7c87d6f324 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews21.tex @@ -0,0 +1,255 @@ +% \iffalse meta-comment +% +% Copyright 2014 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews21.tex +% +% This is issue 21 of LaTeX News. + +\documentclass{ltnews} +\def\ConTeXt{C\kern-.0333emon\-\kern-.0667em\TeX\kern-.0333emt} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\publicationmonth{May} +\publicationyear{2014} + +\publicationissue{21} + +\begin{document} + +\maketitle + +\section{Scheduled \LaTeX\ bug-fix release} + +This issue of \LaTeX~News marks the second bug-fix release of +\LaTeXe\ (standard \LaTeX) since shifting to a new build system in 2009. +Provided sufficient changes are made, we expect to +make such releases yearly or every two years, in sync with \TeX\ Live. + + + +\subsection{Release notes} + +This release makes no changes to the core code in the \LaTeXe\ format +but there are a small number of documentation fixes (not listed +here). In addition several packages in the \textsf{base} and +\textsf{required} areas have been updated as detailed below. + + +This has been done in accordance with the philosophy of minimising +problems in both forwards and backwards compatibility, so most of +these changes should not be noticed by the regular \LaTeX\ user. + +References in the text below of the form ``graphics/3873'' are to +bug reports listed +at:\\ \url{http://latex-project.org/cgi-bin/ltxbugs2html} + + +\let\paragraph\subsubsection + +\paragraph{\textsf{fixltx2e} updates} + + + +There are a number of bugs and faulty design decisions in \LaTeXe{} +that should have been corrected long ago in the kernel code. However, +such corrections cannot be done as this would break backwards +compatibility in the following sense. A large number of documents +exist by now that have worked around the bug or have even made use of +a particular misfeature. Thus changing the kernel code would break +too many existing documents. + +The corrections for these types of bug have therefore been collected together +in a package that can be loaded only when needed; its name is \textsf{fixltx2e}. +For this release we made the following changes to this package: +\begin{itemize} +\item + Misspelled float placement specifiers such as + \verb=\begin{figure}[tv]= instead of \texttt{tb} are silently + ignored by the kernel code. Now we test for such letters and issue + an error message. +\item + \LaTeX's float handling algorithm can get out of sync if you mix + single and double-column floats (as they are placed independently + of each other). This was corrected in \textsf{fixltx2e} a few years ago + but the fix was not perfect as one situation using + \verb=\enlargethispage= generated a low-level \TeX{} error. + This behaviour of the package is now improved. +\end{itemize} + + + + +\paragraph{New \textsf{fltrace} package} + +For years the file \texttt{ltoutput.dtx} contained some hidden code to +trace the detailed behaviour of the float placement algorithm of +\LaTeX. Prompted by questions on StackExchange we now extract this +code into a new \textsf{fltrace} package. To see the float algorithm +in action (or to understand why it decides to place all your floats at +the very end of the document) use +\begin{verbatim} + \usepackage{fltrace} \tracefloats +\end{verbatim} +To stop tracing somewhere in the document use +\verb=\tracefloatsoff= and to see the current value of various float +parameters use \verb=\tracefloatvals=. As the package is identical to +the kernel code with tracing added, it may or may not work if you load any +other package that manipulates that part of the kernel code. In such a +case your best bet is to load \textsf{fltrace} first. + +\paragraph{\textsf{inputenc} package updates} + +The \textsf{inputenc} package allows different input encodings for +\LaTeX\ documents to be specified including the important +\texttt{utf8} option used to specify the Unicode UTF-8 encoding. A +common mistake in documents has been to also include this option when +using the Unicode-based \TeX\ engines \hologo{LuaTeX} and \hologo{XeTeX} +producing strange errors as these engines natively deal with UTF-8 +characters. + +If a document stored in an 8bit encoding is processed by +\hologo{pdfTeX}, it needs the \textsf{inputenc} package to work +correctly. However, if such a document is processed unchanged by +\hologo{LuaTeX} or \hologo{XeTeX}, then accented characters may +silently get dropped from the output. + +The package has been modified so that if used with \hologo{LuaTeX} or +\hologo{XeTeX}, then it just issues a warning if \texttt{utf8} or +\texttt{ascii} is specified, and stops with an error for any other +encoding requested. + + + +One further improvement has been made to the encoding definition files +(\texttt{.def}) used by \textsf{inputenc}: the catcode of \texttt{@} +is now saved and restored when reading them instead of always using +\verb=\makeatother= inside the files (latex/4192). + + + +\paragraph{The tools directory} + +In the past each of the sub-directories in the ``required'' section of +the \LaTeX{} distribution contained a single \texttt{.ins} file to +generate the code files from the source files. We have now +started to provide individual \texttt{.ins} files for each of those +packages that are likely to require updates outside a major +\LaTeX{} release. + +\paragraph{\textsf{multicol} updates} + +Version 1.8 of \textsf{multicol} implements some improvements/fixes +and one extension. In the past the balancing algorithm enlarged the +column height until it found a solution that satisfied all +constraints. If there were insufficient break points then the final +column height could have been much larger than expected and if that +happened near the end of the page it resulted in the text overflowing +into the bottom margin. This situation is now detected and in that +case a normal page is cut and balancing is resumed on the next +page. Some overflow is still allowed and controlled via the parameter +\verb=\maxbalancingoverflow=. + +The use of \verb=\enlargethispage= is now properly supported within +the environment. Finally a new command \verb=\docolaction= was added +to allow the execution of code depending on the column in which the +command is executed. See the documentation for details. + +Bug fixes: the new version fixes both a color leak that could happen +in certain situations and the problem that \texttt{multicols} could +mess up the positioning of \verb=\marginpar=s that followed the +environment. + + +\paragraph{\textsf{tabularx} updates} + +The restrictions on embedding \verb|\tabularx| \verb|\endtabularx| +into the definition of a new environment have been relaxed +slightly. See the package documentation for details. + +\paragraph{\textsf{showkeys} updates} + +The \textsf{showkeys} package has been updated to fix problems if used +at the start of list items, and to work if brace groups (\verb|{| and +\verb|}|) are used in the optional argument of +\verb|\cite|. (tools/4162, tools/4173) + + +\paragraph{\textsf{color} updates} + +The \verb|\nopagecolor| command suggested by Heiko Oberdiek, +available for some years in the \textsf{pdftex} option, has been +added to the core package as suggested in graphics/3873. Currently +this is supported in the driver files for \textsf{dvips} and +\textsf{pdftex}. Patches to support other drivers are welcome. + + \paragraph{\textsf{graphicx} updates} + +The \textsf{graphicx} version of \verb|\rotatebox| now allows +\verb|\par| (and blank lines) in values, to match the change made +to the \textsf{graphics} version some years ago. See graphics/4296. + + +\paragraph{\textsf{keyval} updates} + +All parsing used in the \textsf{keyval} package has been changed +to allow \verb|\par| (and blank lines) in values. +(A second change, to parsing of brace groups +in a construct such as \texttt{key=\{\{\{value\}\}\}}, was reverted in v1.15.) +See graphics/3446. + + + + +\vfill + +\section{Standard \LaTeX\ (\LaTeXe) and \textsf{expl3}} + +The substantial collection of innovative code in \textsf{expl3} +implements a new programming language that has for a while now been +used by some writers of \LaTeXe\ packages. This code has recently +also been made available for use on top of plain \TeX\ or {\ConTeXt}, +largely to support generic packages that are supposed to work with +different flavours of \TeX. These uses in no way affect authors of +\LaTeX\ documents and such \LaTeXe\ packages will continue to work as +advertised by their authors with standard \LaTeX. + +This code base will also become an important foundation for the kernel +of \LaTeX3 and so the new programming language can be described as +`The \LaTeX3 Programming Language'. However, if you see or hear that a +package `uses \LaTeX3' then it remains very unlikely (as yet) to mean +that the package is part of some `new version of \LaTeX'. + +News about the development and use of \textsf{expl3} and about other +developments in the \LaTeX3 code base is reported regularly in the +\LaTeX3~News series (\url{http://latex-project.org/l3news/}), the most +recent issue of which was published in March 2014. + + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews22.tex b/Master/texmf-dist/source/latex-dev/base/ltnews22.tex new file mode 100644 index 00000000000..c574f60568e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews22.tex @@ -0,0 +1,244 @@ +% \iffalse meta-comment +% +% Copyright 2015 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews22.tex +% +% This is issue 22 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\publicationmonth{January} +\publicationyear{2015} + +\publicationissue{22} + +\begin{document} + +\maketitle + +\section{New \LaTeXe\ bug-fix policy} + +\subsection{Introduction} + +For some years we have supplied bug fixes to the \LaTeXe\ kernel via the +\textsf{fixltx2e} package. This +kept the kernel stable, but at the expense of meaning that most users did not +benefit from bug fixes, and that some compromises +which were made to save space in the +machines of the time are still affecting most users today. + +In this release we have started a new update policy. All the fixes previously +available via \textsf{fixltx2e} are now enabled \emph{by default} in the +format, as are some further extensions for extended \TeX\ engines, \eTeX, +\hologo{XeTeX} and \hologo{LuaTeX}. Compatibility and stability are still +important considerations, and while most users will not notice these +improvements, or will want to benefit from them, a new \textsf{latexrelease} +package is provided that will revert all the changes and re-instate the +definitions from earlier releases. The package can also be used with older +releases to effectively \emph{update} the kernel to be equivalent to this 2015 +release. + +A new document, \textsf{latexchanges}, is distributed with the release +that documents all the changes to documented commands since the 2014 +\LaTeX\ release, and will be updated in future releases if further +changes have been made. + +\subsection{The \textsf{latexrelease} package} + +As noted above a new package is available to manage differences between \LaTeX\ +releases. If you wish to revert all changes back to the definitions as they +were in previous releases you may start your document requesting the \LaTeX{} release from May~2014: +\begin{verbatim} +\RequirePackage[2014/05/01]{latexrelease} +\documentclass{article} +\end{verbatim} +Conversely if you start a large project now and want to protect yourself +against possible future changes, you may start your document +\begin{verbatim} +\RequirePackage[2015/01/01]{latexrelease} +\documentclass{article} +\end{verbatim} +Then the version of \textsf{latexrelease} distributed with any future \LaTeX\ +release will revert any changes made in that format, and revert to the +definitions as they where at the beginning of 2015. + +If you wish to share a document using the latest features with a +user restricted to using an older +format, you may use the form above and make the \textsf{latexrelease} package +available on the older installation. The package will then update the format +definitions as needed to enable the older format to work as if dated on the date +specified in the package option. + +\subsection{The \cs{IncludeInRelease} command} + +The mechanism used in the \textsf{latexrelease} package is available for use in +package code. If in your \textsf{zzz} package you have +\begin{verbatim} +\RequirePackage{latexrelease} +\IncludeInRelease{2015/06/01} + {\zzz}{\zzz definition} + \def\zzz......new code +\EndIncludeInRelease +\IncludeInRelease{0000/00/00} + {\zzz}{\zzz definition} + \def\zzz....original +\EndIncludeInRelease +\end{verbatim} +then in a document using a format dated 2015/06/01 or later, the ``new code'' +will be used, and for documents being processed with an older format, the +``original'' code will be used. Note the format date here may be the original +format date as shown at the start of every \LaTeX\ run, or a format date +specified as a package option to the \textsf{latexrelease} package. + +So if the document has +\begin{verbatim} +\RequirePackage[2014/05/01]{latexrelease} +\documentclass{article} +\usepackage{zzz} +\end{verbatim} +then it will use the \emph{original} definition of \verb|\zzz| even if +processed with the current format, as the format acts as if dated 2014/05/01. + + +\subsection{Limitations of the approach} + +The new concept provides full backward and forward compatibility for +the \LaTeX{} format, i.e., with the help of a current +\textsf{latexrelease} package the kernel can emulate all released +formats (starting with 2014/06/01\footnote{Patching an older format + most likely works too, given that the changes in the past have been + minimal, though this isn't guaranteed and hasn't been tested.}). + + +However, this is not necessarily true for all packages. + Only if a package makes use of the \cs{IncludeInRelease} +functionality will it adjust to the +requested \LaTeX{} release date. Initially this will only be true for +a few selected packages and in general it may not even be advisable for packages +that have their own well-established release cycles and methods. + +Thus, to regenerate a document with 100\,\% compatible behavior +it will still be necessary +to archive it together with all its inputs, for example, by archiving +the base distribution trees (and any modifications made). However, the +fact that a document requests a specific \LaTeX{} release date should +help identifying what release tree to use to achieve perfect accuracy. + + +\section{Updates to the kernel} + +\subsection{Updates incorporated from \textsf{fixltx2e}} + +The detailed list of changes incorporated from \textsf{fixltx2e} is +available in the new \textsf{latexchanges} document that is +distributed with this release. The main changes are that $2$-column +floats are kept in sequence with one column floats, corrections are +made to the \verb|\mark| system to ensure correct page headings in +$2$-column documents, several additional commands are made robust. + +\subsection{\eTeX\ register allocation} + +\LaTeX\ has traditionally used allocation routines inherited from plain \TeX\ +that allocated registers in the range $0$--$255$. Almost all distributions have +for some years used \eTeX\ based formats (or \hologo{XeTeX} or \hologo{LuaTeX}) +which have $2^{15}$ registers of each type ($2^{16}$ in the case of +\hologo{LuaTeX}). The \textsf{etex} package has been available to provided an +allocation mechanism for these extended registers but now the format will by +default allocate in a range suitable for the engine being used. The new +allocation mechanism is different than the \textsf{etex} package mechanism, and +supports \hologo{LuaTeX}'s full range and an allocation mechanism for \LaTeX\ +floats as described below. + +On \eTeX\ based engines, an additional command, \verb|\newmarks| is available +(as with the \textsf{etex} package) that allocates extended \eTeX\ marks, and +similarly if \hologo{XeTeX} is detected a new command +\verb|\newXeTeXintercharclass| is available, this is similar to the command +previously defined in the \texttt{xelatex.ini} file used to build the +\texttt{xelatex} format. + +\subsection{Additional \LaTeX{} float storage} + +\LaTeX's float placement algorithm needs to store floats (figures and tables) +until it finds a suitable page to output them. It allocates $18$ registers for +this storage, but this can often be insufficient. + The contributed \textsf{morefloats} package has +been available to extend this list; however, it also only allocates from the +standard range $0$--$255$ so cannot take advantage of the extended registers. +The new allocation mechanism in this release incorporates a new command +\verb|\extrafloats|. If you get the error: +\mbox{\texttt{Too many unprocessed floats.}} +then you can add (say) \verb|\extrafloats{500}| to the document preamble to +make many more boxes available to hold floats. + + +\subsection{Built-in support for Unicode engines} + +The kernel sources now detect the engine being used and adjust definitions +accordingly, this reduces the need for the ``\texttt{.ini}'' files used to make +the formats to patch definitions defined in \texttt{latex.ltx}. + +As noted above the format now includes extended allocation routines. + +The distribution includes a file \textsf{unicode-letters.def} derived from the +Unicode Consortium's Unicode Character Data files that details the upper and +lower case transformation data for the full Unicode range. This is used to set +the \verb|lccode| and \verb|uccode| values if a Unicode engine is being used, +rather than the values derived from the T1 font encoding which are used with +8-bit engines. + +Finally \verb|\typein| is modified if \hologo{LuaTeX} is detected +such that it works with this engine. + +\section{l3build} + +This release has been tested and built using a new build system implemented in +\textsf{Lua}, intended to be run on the \textsf{texlua} interpreter distributed +with modern \TeX\ distributions. It is already separately available +from CTAN. This replaces earlier build systems (based at various times on +\textsf{make}, \textsf{cons}, and Windows \textsf{bat} files). It allows the +sources to be tested and packaged on a range of platforms (within the team, +OS X, Windows, Linux and Cygwin platforms are used). It also allows the +format to be tested on \hologo{XeTeX} and \hologo{LuaTeX} as well as the +standard \hologo{pdfTeX}/\eTeX\ engines. + +\section{Hyperlinked documentation and TDS zip files} + +As well as updating the build system, the team have looked again at exactly +what gets released to \textsc{ctan}. Taking inspiration from Heiko Oberdiek's +\textsf{latex-tds} bundle, the PDF documentation provided now includes +hyperlinks where appropriate. This has been done without modifying the sources +such that users without \textsf{hyperref} available can still typeset the +documentation using only the core distribution. At the same time, the release +now includes ready-to-install TDS-style zip files. This will be of principal +interest to \TeX\ system maintainers, but end users with older machines who +wish to manually update \LaTeX\ will also benefit. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews23.tex b/Master/texmf-dist/source/latex-dev/base/ltnews23.tex new file mode 100644 index 00000000000..149bd1a74bb --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews23.tex @@ -0,0 +1,257 @@ +% \iffalse meta-comment +% +% Copyright 2015 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews23.tex +% +% This is issue 23 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\makeatletter % -- provide command introduced in new release + % so this typesets with an old format + +% Check we are not in the preamble of a composite document +\def\@tempa{\@latex@error{Can be used only in preamble}\@eha} +\ifx\DeclareTextCommandDefault\@tempa +\else + \DeclareTextCommandDefault\textcommabelow[1] + {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex + \hbox{\check@mathfonts\fontsize\ssf@size\z@ + \math@fontsfalse\selectfont,}\hidewidth}\egroup} +\fi +\makeatother + +\publicationmonth{October} +\publicationyear{2015} + +\publicationissue{23} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{Enhanced support for \hologo{LuaTeX}} + +As noted in \LaTeX\ News 22, the 2015/01/01 release of \LaTeX{} +introduced built-in support for extended \TeX\ systems. + +The range of allocated register numbers (for example, for count +registers) is now set according to the underlying engine capabilities +to 256, 32768 or 65536. Additional allocators were also added for the +facilities added by \hologo{eTeX} (\verb|\newmark|) and \hologo{XeTeX} +(\verb|\newXeTeXintercharclass|). At that time, however, the work to +incorporate additional allocators for \hologo{LuaTeX} was not ready for +distribution. + +The main feature of this release is that by default it includes +allocators for \hologo{LuaTeX}-provided features, such as Lua +functions, bytecode registers, catcode tables and Lua callbacks. +Previously these features have been provided by the contributed +\package{luatex} (Heiko Oberdiek) and \package{luatexbase} +(\'{E}lie Roux, + Manuel P\'{e}gouri\'{e}-Gonnard and Philipp Gesang) +packages. However, just as +noted with the \package{etex} package in the previous release, it is +better if allocation is handled by the format to avoid problems with +conflicts between different allocation schemes, or definitions made +before a package-defined allocation scheme is enabled. + +The facilities incorporated into the format with this release, and +described below, are closely modelled on the \package{luatexbase} +package and we thank the authors, and especially \'{E}lie Roux, for +help in arranging this transition. + +The implementation of these \hologo{LuaTeX} features has been +redesigned to match the allocation system introduced in the 2015/01/01 +\LaTeX\ release, and there are some other differences from the previous +\package{luatexbase} package. However, as noted below, +\package{luatexbase} is being updated in line with this \LaTeX\ release +to provide the previous interface as a wrapper around the new +implementation, so we expect the majority of documents using +\package{luatexbase} to work without change. + +\subsection{Names of \hologo{LuaTeX} primitive commands} + +The 2015/01/01 \LaTeX\ release for the first time initialised +\hologo{LuaTeX} in \textsf{latex.ltx} if \hologo{LuaTeX} is being +used. Following the convention used in the contributed +\textsf{lualatex.ini} file used to set up the format for earlier +releases, most \hologo{LuaTeX}-specific primitives were defined with +names prefixed by \texttt{luatex}. This was designed to minimize name +clashes but had the disadvantage that names did not match the +\hologo{LuaTeX} manual, or the names used in other formats, and +produced some awkward command names such as \verb|\luatexluafunction|. +From this release the names are enabled without the \texttt{luatex} +prefix. + +In practice this change should not affect many documents; relatively +few packages access the primitive commands, and many of those are +already set up to work with prefixed or unprefixed names, so that they +work with multiple formats. + +For package writers, if you want to ensure that your code works with +this and earlier releases, use unprefixed names in the package and +ensure that they are defined by using code such as: +\begin{verbatim} +\directlua{tex.enableprimitives("", + tex.extraprimitives( + "omega", "aleph", "luatex"))} +\end{verbatim} +Conversely if your document uses a package relying on prefixed names +then you can add: +\begin{verbatim} +\directlua{tex.enableprimitives("luatex", + tex.extraprimitives( + "omega", "aleph", "luatex"))} +\end{verbatim} +to your document. + +Note the compatibility layer offered by the \package{luatexbase} package +described below makes several commands available under both names. + +As always, this change can be reverted using:\\ +\verb|\RequirePackage[2015/01/01]{latexrelease}|\\ +at the start of the document. + + + +\subsection{\TeX\ commands for allocation in \hologo{LuaTeX}} +For detailed descriptions of the new allocation commands see the +documented sources in \textsf{ltluatex.dtx} or chapter N of +\textsf{source2e}; however, the following new allocation commands are +defined by default in \hologo{LuaTeX}: +\verb|\newattribute|, +\verb|\newcatcodetable|, +\verb|\newluafunction| and +\verb|\newwhatsit|. +In addition, the commands \verb|\setattribute| and +\verb|\unsetattribute| are defined to set and unset Lua attributes +(integer values similar to counters, but attached to nodes). Finally +several catcode tables are predefined: +\verb|\catcodetable@initex|, +\verb|\catcodetable@string|, +\verb|\catcodetable@latex|, +\verb|\catcodetable@atletter|. + +\subsection{Predefined Lua functions} +If used with \hologo{LuaTeX}, \LaTeX\ will initialise a Lua table, +\textsf{luatexbase}, with functions supporting allocation and also +the registering of Lua callback functions. + +\subsection{Support for older releases and plain \TeX} +The \hologo{LuaTeX} allocation functionality made available in this +release is also available in plain \TeX\ and older \LaTeX\ releases +in the files \textsf{ltluatex.tex} and \textsf{ltluatex.lua} which may be +used simply by including the \TeX\ file: \verb|\input{ltluatex}|. +An alternative for old \LaTeX\ releases is to use:\\ +\verb|\RequirePackage[2015/10/01]{latexrelease}|\\ +which will update the kernel to the current release, including +\hologo{LuaTeX} support. + +\subsection{Additional \hologo{LuaTeX} support packages} +In addition to the base \LaTeX\ release two packages have been +contributed to the \textsf{contrib} area on CTAN. The +\package{ctablestack} package offers some commands to help package +writers control the \hologo{LuaTeX} \textsf{catcodetable} +functionality, and the \package{luatexbase} package replaces the +previously available package of the same name, providing a compatible +interface but implemented over the \package{ltluatex} code. + +\section{More Floats and Inserts} +If \hologo{eTeX} is available, the number of registers allocated in +the format to hold floats such as figures is increased from 18 to 52. + +The extended allocation system introduced in 2015/01/01 means that in +most cases it is no longer necessary to load the \package{etex} +package. Many classes and packages that previously loaded this package +no longer do so. Unfortunately in some circumstances where a package +or class previously used the \package{etex} \verb|\reserveinserts| +command, it is possible for a document that previously worked to +generate an error ``no room for a new insert''. In practice this error +can always be avoided by declaring inserts earlier, before the +registers below 256 are all allocated. However, it is better not +to require packages to be re-ordered and in some cases the re-ordering +is complicated due to delayed allocations in \verb|\AtBeginDocument|. + +In this release, a new implementation of +\verb|\newinsert| is used which allocates inserts from the previously +allocated float lists once the classical register allocation has run +out. This allows an extra 52 (or in \hologo{LuaTeX}, 64~thousand) +insert allocations which is more than enough for practical documents +(by default, \LaTeX\ only uses two insert allocations). + +\section{Updated Unicode data} + + +The file \textsf{unicode-letters.def} recording catcodes, upper and +lower case mappings and other properties for Unicode characters has +been regenerated using the data files from Unicode~8.0.0. + +\section{Support for Comma Accent} +The command \verb|\textcommabelow| has been added to the format. +This is mainly used for the Romanian letters +\textcommabelow{S}\textcommabelow{s}\textcommabelow{T}\textcommabelow{t}. +This was requested in latex/4414 in the \LaTeX\ bug tracker. + +\section{Extended \package{inputenc}} +The \texttt{utf8} option for \package{inputenc} has been extended to support +the letters s and t with comma accent, +U+0218\,--\,U+021b. Similarly circumflex w and y U+0174\,--\,U+0177 are defined. +Also U+00a0 and U+00ad are declared by default, and defined to be +\verb|\nobreakspace| and \verb|\-| respectively. + +The error message given on undefined UTF-8 input characters +now displays the Unicode number +in U+\textit{hex} format in addition +to showing the character. + +\section{Pre-release Releases} +The patch level mechanism has been used previously to identify \LaTeX\ +releases that have small patches applied to the main release, without +changing the main format date. + +The mechanism has now been extended to allow identification of +pre-release versions of the software (which may or may not be released +via CTAN) but can be identified with a banner such as\\ +{\catcode`\<=13 \def<{\string<} \catcode`\>=13 \def>{\string>}% +\verb|LaTeX2e <2015/10/01> pre-release-1|}\\ +Internally this is identified as a patch release with a negative patch +level. + +\section{Updates in tools} + +The \package{multicol} package has been updated to fix the interaction +with ``here'' floats that land on the same page as the start or end of +a \textsf{multicols} environment. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews24.tex b/Master/texmf-dist/source/latex-dev/base/ltnews24.tex new file mode 100644 index 00000000000..573f1e87c87 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews24.tex @@ -0,0 +1,263 @@ +% \iffalse meta-comment +% +% Copyright 2015,2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews24.tex +% +% This is issue 24 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\makeatletter % -- provide command introduced in new release + % so this typesets with an old format + +% Check we are not in the preamble of a composite document +\def\@tempa{\@latex@error{Can be used only in preamble}\@eha} +\ifx\DeclareTextCommandDefault\@tempa +\else + \DeclareTextCommandDefault\textcommabelow[1] + {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex + \hbox{\check@mathfonts\fontsize\ssf@size\z@ + \math@fontsfalse\selectfont,}\hidewidth}\egroup} + \DeclareTextCommandDefault\textcommaabove[1]{% + \hmode@bgroup + \ooalign{% + \hidewidth + \raise.7ex\hbox{% + \check@mathfonts\fontsize\ssf@size\z@\math@fontsfalse\selectfont`% + }% + \hidewidth\crcr + \null#1\crcr + }% + \egroup + } +\fi + +\makeatother + +\publicationmonth{February} +\publicationyear{2016} + +\publicationissue{24} + +\begin{document} + +\maketitle + +\tableofcontents + +\section{\hologo{LuaTeX} support} + +This release refines the \hologo{LuaTeX} support introduced in the +2015/10/01 release. A number of patches have been added to improve the +behavior of \package{ltluatex} (thanks largely to code review by Philipp Gesang). +The kernel code has been adjusted to +allow for changes in \hologo{LuaTeX} v0.85--v0.88. Most notably, newer +\hologo{LuaTeX} releases allow more than $16$ write streams and these are now +enabled for use by \verb|\newwrite|, but also the experimental +\texttt{newtoken} Lua library has been renamed back to \texttt{token} +which required small adjustments in the \hologo{LuaTeX} setup. + +The biggest change in \hologo{LuaTeX} v0.85--v0.87 compared to previous +versions is that all the primitives (originally defined in +\hologo{pdfTeX}) dealing with the PDF ``back end'' +are no longer defined, being replaced by a much smaller set of new primitives. +This does not directly affect the core \LaTeX{} +files in this release but has required major changes to the +\texttt{.ini} files used by \TeX{} Live and similar distributions to +set up the format files. These changes in the \hologo{LuaTeX} engine +will affect any packages using these back end commands (packages such +as \package{graphics}, \package{color}, \package{hyperref}, etc.). +Until all contributed packages are updated to the new syntax users may +need to add aliases for the old \hologo{pdfTeX} commands. A new +\package{luapdftexalias} package has been contributed to CTAN (not part of the +core \LaTeX\ release) that may be used for this purpose. + +See also the sections below for related changes in the +\textsf{tools} and \textsf{graphics} bundles. + + +\section{Unicode data} + +As noted in \LaTeX{} News~22, the 2015/01/01 release of \LaTeX{} introduced +built-in support for extended \TeX{} systems. In particular, the kernel now +loads appropriate data from the Unicode Consortium to set \verb|\lccode|, +\verb|\uccode|, \verb|\catcode| and \verb|\sfcode| values in an automated +fashion for the entire Unicode range. + +The initial approach taken by the team was to incorporate the existing model +used by (plain) \hologo{XeTeX} and to pre-process the ``raw'' Unicode data into +a ready-to-use form as \verb|unicode-letters.def|. However, the relationship +between the Unicode Consortium files and \TeX{} data structures is non-trivial and still +being explored. As such, it is preferable to directly parse the original +(\verb|.txt|) files at point of use. The team has therefore ``spun-out'' both +the data and the loading to a new generic package, \package{unicode-data}. This +package makes the original Unicode Consortium data files available in the +\verb|texmf| tree (in \verb|tex/generic/unicode-data|) and provides generic +loaders suitable for reading this data into the plain, \LaTeXe{}, and other, +formats. + +At present, the following data files are included in this new package: +\begin{itemize}\parskip=0pt + \item \verb|CaseFolding.txt| + \item \verb|EastAsianWidth.txt| + \item \verb|LineBreak.txt| + \item \verb|MathClass.txt| + \item \verb|SpecialCasing.txt| + \item \verb|UnicodeData.txt| +\end{itemize} +These files are used either by \LaTeXe{} or by \package{expl3} +(i.e.~they represent the set currently required by the team). The +Unicode Consortium provides various other data files and we would be happy to add +these to the generic package, as it is intended to provide a single place +to collect this material in the \verb|texmf| tree. Such requests can be +mailed to the team as~usual or logged at the package home page: +\url{https://github.com/latex3/unicode-data}. + +The new approach extends use of Unicode data in setting \TeX{} information in +two ways. First, the \verb|\sfcode| of all end-of-quotation/closing punctuation +is now set to $0$ (transparent to \TeX{}). Second, \verb|\Umathcode| values are +now set using \verb|MathClass.txt| rather than setting up only letters (which +was done using an arbitrary plane~$0$/plane~$1$ separation). There are also +minor refinements to the existing code setting, particularly splitting the +concepts of case and letter/non-letter category codes. + +For \hologo{XeTeX}, users should note that \verb|\xtxHanGlue| and +\verb|\xtxHanSpace| are \emph{no longer defined}, that no assignments are made +to \verb|\XeTeXinterchartoks| and that no \verb|\XeTeXintercharclass| data is +loaded into the format. The values which were previously inherited from +the plain \hologo{XeTeX} setup files are \emph{not} suitable for properly +typesetting East Asian text. There are third-party packages addressing this +area well, notably those in the \package{CTeX} bundle. Third-party packages +may need adjustment to load the data themselves; see the \textsf{unicode-data} +package for one possible loader. + +\section{More support for east European accents} + +As noted in \LaTeX{} News~23, comma accent support was added for \texttt{s} and +\texttt{t} in the 2015/10/01 release. In this release a matching +\verb|\textcommaabove| accent has been added for U+0123 (\verb|\c{g}|, +\textcommaabove{g}) which is the lower case of U+0122 (\verb|\c{G}|, +\textcommabelow{G}). In the OT1 and T1 encodings the combinations are +declared as composites with the \verb|\c| command, which matches the +Unicode names ``\textsf{latin (capital|small) letter g with cedilla}'' and +also allows \verb|\MakeUppercase{\c{g}}| to produce \verb|\c{G}|, as +required. In T1 encoding, the composite of \verb|\c| with \texttt{k}, \texttt{l}, +\texttt{n} and \texttt{r} are also +declared to use the comma below accent rather than cedilla to match the +conventional use of these letters. + +The UTF-8 \texttt{inputenc} option \texttt{utf8} has been extended to +support all latin combinations that can be reasonably constructed with a +(single) accent command an a base character for the T1 encoding so +\textcommaabove{g}, \k{u} and similar characters may be directly input +using UTF-8 encoding. + +\section{Changes in Graphics} + +The changes in \hologo{LuaTeX}~v0.87 mean that the \package{color} and +\package{graphics} packages no longer share the \texttt{pdftex.def} file +between \hologo{LuaTeX} and \hologo{pdfTeX}. A separate file +\texttt{luatex.def} (distributed separately) has been produced, and +distributions are encouraged to modify \texttt{graphics.cfg} and +\texttt{color.cfg} configuration files to default to the \texttt{luatex} +option if \hologo{LuaTeX}~v0.87 or later is being used. The team has +contributed suitable \texttt{.cfg} files to CTAN to be used +as models. + +Normally it is best to let the local \texttt{graphics.cfg} +automatically supply the right option depending on the \TeX\ engine +being used; however the \package{color} and \package{graphics} (and so +\package{graphicx}) packages have been extended to have an explicit +\texttt{luatex} option comparable to the existing \texttt{pdftex} and +\texttt{xetex} options. + +The \package{trig} package has been updated so that pre-computed values +such as $\sin(90)$ now expand to digits (\texttt{1} rather than the +internal token \verb|\@one| in this case). This allows them to be used +directly in PDF literal strings. + +\section{Changes in Tools} + +\hologo{LuaTeX} from version v0.87 no longer supports the +\verb|\write18| syntax to access system commands. A new package +\package{shellesc} has been added to \textsf{tools} that defines a new +command \verb|\ShellEscape| that may be used in all \TeX\ variants to +provide a consistent access to system commands. The package also +defines \verb|\write18| in \hologo{LuaTeX} so that it continues to access +system commands as before; see the package documentation for details. + +\section{Improving support for Unicode engines} + +\looseness=-1 +Stability concerns are always paramount when considering any change to +the \LaTeXe{} kernel. At the same time, it is important that the format +remains usable and gives reliable results for users. For the Unicode +\TeX{} engines \hologo{XeTeX} and \hologo{LuaTeX} there are important +differences in behavior from classical ($8$-bit) \TeX{} engines which +mean that identical default behaviors are not appropriate. Over the +past 18 months the team has addressed the most pressing of these +considerations (as detailed above and in \LaTeX{} News~22 and 23), +primarily by integrating existing patches into the kernel. There are, +though, important areas which still need consideration, and which +\emph{may} result in refinements to kernel support in this area in +future releases. + +The default font setup in \LaTeXe{} at present is to use the \texttt{OT1} +encoding. This assumes that hyphenation patterns have been read using +appropriate codes: the \texttt{T1} encoding is assumed. The commonly-used +hyphenation patterns today, \package{hyph-utf8}, are set up in this +way for $8$-bit engines (\hologo{pdfTeX}) but for Unicode engines use +Unicode code points. This means that hyphenation will be incorrect +with Unicode engines unless a Unicode font is loaded. This requires +a concept of a Unicode font encoding, which is currently provided by +the \package{fontspec} package in two versions, \texttt{EU1} and +\texttt{EU2}. The team is working to fully understand what is meant +by a ``Unicode font encoding'', as unlike a classical \TeX{} encoding +it is essentially impossible to know what glyphs will be provided +(though each slot is always defined with the same meaning). There +is also an overlap between this area and ideas of language and writing +system, most obviously in documents featuring mixed scripts (for example +Latin and Cyrillic). + +As well as these font considerations, the team is also exploring +to what extent it is possible to allow existing ($8$-bit) +documents to compile directly with Unicode engines without requiring +changes in the sources. Whether this is truly possible remains an open +question. + +It is important to stress that changes will only be made in this area where +they do \emph{not} affect documents processed with +\hologo{eTeX}/\hologo{pdfTeX} (i.e.~documents which are written for +``classical'' $8$-bit \TeX{} engines). Changes will also be made only where +they clearly address deficiencies in the current setup for Unicode engines +(i.e.~where current behaviors are wrong). + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews25.tex b/Master/texmf-dist/source/latex-dev/base/ltnews25.tex new file mode 100644 index 00000000000..e32187e702f --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews25.tex @@ -0,0 +1,137 @@ +% \iffalse meta-comment +% +% Copyright 2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews25.tex +% +% This is issue 25 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + + +\publicationmonth{March} +\publicationyear{2016} + +\publicationissue{25} + +\begin{document} + +\maketitle + +\section{Lua\TeX} +This \LaTeX\ release sees several internal changes designed to ensure +that the system is still usable with Lua\TeX\ versions greater than +0.80, which have introduced many changes into the engine, most notably +the removal or renaming of most of the primitive commands introduced by +pdf\TeX. Also the lists of Lua callbacks handled by the callback +allocation mechanism has been updated to match the callbacks defined +in Lua\TeX\ version 0.90. + +These changes have also required updates in \textsf{tools} +and \textsf{amsmath} as described below. + +This is the first release of \LaTeX\ for which the test suite reports +no failures when used with Lua\TeX. + +\section{Documentation checksums} +The \package{doc} package has always provided two mechanisms that were +mainly intended to guard against file truncation or corruption when +files were commonly distributed by email through unreliable mail +gateways: a Character Table of the ASCII character set could be +inserted (and checked) and a ``checksum'' (count of the number of +backslashes in the code sections) could be checked. These features +are not really needed with modern distribution mechanisms and can be a +distraction when reading the source code and so have been removed. The +\package{doc} package has been updated so that if you use a +\verb|\CheckSum| command then, as before, the number is checked; +however, if you omit the command then no error or warning is given. + + +\section{Updates to \package{inputenc}} + +The UTF-8 support in \package{inputenc} has been further extended with +support for non-breaking hyphens and more dashes. + +\section{Updates in Tools} + +The \package{varioref} package has been updated with improved +documentation of multi\-lingual support, and avoiding unnecessary warnings in +some cases with \verb|\reftextfaraway|. + +The \package{tabularx} package's handling of \verb|\endtabularx| in +environment definitions has been fixed to again match its documentation. + +The \package{bm} package has been updated as required by the changes +to \verb|\mathchardef| in Lua\TeX. + + +\section{amsmath} + +Since the launch of \LaTeXe\ in 1993, the \textsf{amsmath} bundle has +been part of the \emph{required} packages in the core \LaTeX\ +distribution, with bug reports handled by the \LaTeX\ bug database at +\url{https://latex-project.org/bugs-upload.html}. + +The \textsf{amsmath} packages and the \textsf{amscls} classes have +been maintained by the American Mathematical Society. + +With this release a new arrangement has been agreed between the +American Mathematical Society and the \LaTeX3 project. The \LaTeX3 +project will take over maintenance of the \textsf{amsmath} bundle, +with the American Mathematical Society retaining maintenance of +\textsf{amscls}. + +The recommended installation of these files in the \TeX\ directory +structure remains unchanged as \path|tex/latex/amsmath| and +\path|tex/latex/amscls| respectively. + +This release of \package{amsmath} includes several updates so that +\package{amsmath} does not generate errors when math is used with +Lua\TeX\ v0.87+, which has changes to \verb|\mathchardef| that are +incompatible with the previous version of \package{amsmath}. It also +improves \verb|\dots| handling so that \verb|\long| macros are +correctly handled (for example, \verb|\dots \Rightarrow| now +uses centered dots), as well as commands expanding to character tokens +(for example, \verb|\times \dots \times| will use centered dots with +\verb|\times| defined as in the \package{unicode-math} package). + +\section{Related updates} +In addition to the updates in the core \LaTeX\ release, some files in +the CTAN ``contrib'' area have also been updated. Notably there have +been further updates to the \textsf{unicode-data} files; also, the +files required to build plain and \LaTeX\ formats have now been +submitted to CTAN as \textsf{tex-ini-files}. The +addition of a new \texttt{luatex} option for \textsf{graphics}-related +packages (\textsf{luatex-def} on CTAN) has required updates to the +configuration files to select a +default option and these have similarly been uploaded to CTAN as +\textsf{graphics-cfg}. (Previously these files were maintained +directly in the \TeX\ Live repository, and were not available on CTAN.) +\end{document}
\ No newline at end of file diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews26.tex b/Master/texmf-dist/source/latex-dev/base/ltnews26.tex new file mode 100644 index 00000000000..3dc40ffb73e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews26.tex @@ -0,0 +1,239 @@ +% \iffalse meta-comment +% +% Copyright 2017 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews26.tex +% +% This is issue 26 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\publicationmonth{January} +\publicationyear{2017} + +\publicationissue{26} + +\begin{document} + +\maketitle +\tableofcontents + +\setlength\rightskip{0pt plus 3em} +\section{\eTeX{}} + +In \LaTeX{} News~16 (December 2003) the team announced +\begin{quotation} +We expect that within the next two years, releases of \LaTeX{} will +change modestly in order to run best under an extended \TeX{} engine +that contains the \eTeX{} primitives, e.g., \eTeX{} or pdf\TeX{}. +\end{quotation} +and also said +\begin{quotation} +Although the current release does not \emph{require} \eTeX{} features, we +certainly recommend using an extended \TeX{}, especially if you need to debug +macros. +\end{quotation} + +For many years the team have worked on the basis that users will have \eTeX{} +available but had not revisited the above statements formally. As of the +January 2017 release of \LaTeXe{}, \eTeX{} is \emph{required} to build the +format, and attempting to build a format without the extensions will fail. + +Practically, modern \TeX{} distributions provide the extensions in all engines +other than the ``pure'' Knuth \texttt{tex}, and indeed parts of the +format-building process already require \eTeX{}, most notably some of the UTF-8 +hyphenation patterns. As such, there should be no noticeable effect on users of +this change. + +The team expect to make wider use of \eTeX{} within the kernel in future; +details will be announced where they impact on end users in a visible way. + +\section{Default encodings in \hologo{XeLaTeX} and \hologo{LuaLaTeX}} +The default encoding in \LaTeX\ has always been the original +128-character encoding \texttt{OT1}. For Unicode based \TeX\ engines, this +is not really suitable, and is especially problematic with +\hologo{XeLaTeX} as in the major distributions this is built with +Unicode based hyphenation patterns in the format. In practice this has +not been a major problem as documents use the contributed +\textsf{fontspec} package in order to switch to a +Unicode encoded font. + +In this release we are adding \texttt{TU} as a new supported +encoding in addition to the previously supported encodings such as \texttt{OT1} +and \texttt{T1}. This denotes a Unicode based font encoding. It is essentially +the same as the \texttt{TU} encoding that has been on trial with the +experimental \texttt{tuenc} option to \textsf{fontspec} for the past +year. + +The \hologo{XeLaTeX} and \hologo{LuaLaTeX} formats will now default +to \texttt{TU} encoding and \texttt{lmr} (Latin Modern) family. In the +case of \hologo{LuaLaTeX} the contributed \textsf{luaotfload} Lua +module will be loaded at the start of each run to enable the loading +of OpenType fonts. + +The \textsf{fontspec} package is being adjusted in a companion release +to recognise the new encoding default arrangements. + +Note that in practice no font supports the full Unicode range, and so +\texttt{TU} encoded fonts, unlike fonts specified for \texttt{T1}, may be +expected to be incomplete in various ways. In the current release the file +\texttt{tuenc.def} that implements the \texttt{TU} encoding-specific commands +has made some basic assumptions for (for example) default handling of +accent commands, and the set of command names is derived from the +command names used for the UTF-8 support in the \textsf{inputenc} package, +restricted roughly to the character ranges classically provided by +the \texttt{T1} and \texttt{TS1} encodings, but is part of a longer term plan +seen over recent releases to increase support for Unicode based \TeX\ engines +into the core \LaTeX\ support. + + + +If for any reason you need to process a document with the previous +default \texttt{OT1} encoding, you may switch encoding in the usual ways, for +example +\begin{verbatim} +\usepackage[OT1]{fontenc} +\end{verbatim} +or you may roll back all the changes for this release by starting the +document with +\begin{verbatim} +\RequirePackage[2016/12/31]{latexrelease} +\end{verbatim} + +\section{\cs{showhyphens} in \hologo{XeLaTeX}} +Due to the way \hologo{XeLaTeX} interfaces to font libraries, the +standard definition of \cs{showhyphens} does not work. A variant +definition has been available in the contributed \textsf{xltxtra} +package, however a (slightly different) definition for \cs{showhyphens} +is now included in \hologo{XeLaTeX} by default. As usual +this change will be undone if an earlier +release is specified using the \textsf{latexrelease} package. + +\section{The \textsf{fixltx2e} package} +As described in \LaTeX{} News~22, the \textsf{fixltx2e} package has become +obsolete with the new update policy. Since 2015 it has just made a +warning and exited. In this release we have re-introduced all +the code from the original fixes in the 2014 \LaTeX\ but guarded by +\verb|\IncludeInRelease{2015/01/01}|. +So for current releases \textsf{fixltx2e} still just displays a warning +but for old releases, whether that is an old format, or a format with +the version date reset via the \textsf{latexrelease} package, the +fixes in the original \textsf{fixltx2e} will be applied. + +This improves the ability to run old documents in a way that is compatible +with contemporary formats. If you have a 2014 document that used +\verb|\usepackage{fixltx2e}| and you add +\verb|\RequirePackage[2014/01/01]{latexrelease}| and process it with the +current format then \textsf{latexrelease} will undo most changes made +since 2014, but now when the document includes \textsf{fixltx2e} it +will act like a 2014 version of the package and apply the code fixes, +not just give a warning that the package is obsolete. + +\section{The \textsf{latexbug} package} + +As explained in more detail +at the \LaTeX\ Project + website\footnote{\url{https://www.latex-project.org/bugs/}} +a new package, \textsf{latexbug}, has been produced to help produce +test files to accompany bug reports on the core \LaTeX\ distribution. +This is being published separately to CTAN at the same time as this +release. By using the \textsf{latexbug} package you can easily check +that the packages involved in the test are all part of the core +release. The \LaTeX\ project cannot handle bug reports on contributed +packages, which should be directed to the package maintainer as given +in the package documentation. + +\section{Updates to \textsf{amsmath}} +The \textsf{amsmath} package has two updates at this release. +\begin{itemize} +\item The spacing to the left of the \texttt{aligned} and + \texttt{gathered} environments has been fixed: the spurious thin + space is no longer added by default. Package options control this + to revert to the original behaviour where required; see the + \textsf{amsldoc} guide for further details. +\item The large delimiters around generalised fractions (for example + in the \cs{binom} construct) did not work in previous releases if + using \hologo{LuaTeX} or \hologo{XeTeX} with OpenType math fonts. This is + related to the lack of specific metrics for this use in the OpenType Math + table. In principle \hologo{LuaTeX} has two additional named metrics + to control the delimiters but these are not initialised by default, + and in \hologo{XeTeX} it does not seem possible to make them work at all. + So for Unicode \TeX\ systems, a new implementation of + \cs{genfrac} is used at this release that uses \verb|\left\right| + internally but parameterised to give spacing as close to the + original as possible. The implementation in (pdf)\TeX\ is + unaffected. +\end{itemize} + +\section{Updates to \textsf{tools}} +The \textsf{array} package has been updated to fix a longstanding but +previously unreported issue with unwanted interactions between tables +in the page head or foot and the body of the page, as reported in +\href{http://www.latex-project.org/cgi-bin/ltxbugs2html?pr=tools/4488}{PR + tools/4488}. +There is also an update to the \hologo{LuaTeX} support in \textsf{bm}. + +\section{An addendum to the release changes in 2015: page breaks and vertical spacing} + +In 2015 we announced the introduction of the roll-back\slash +roll-forward concept to manage bug fixes and additions to core +\LaTeX{} in a manageable way. We also announced at that time +that we now incorporate all fixes from \textsf{fixltx2e} into the +kernel (as the old mechanism produced problems instead of improving +the situation). Refer to +\href{https://www.latex-project.org/news/latex2e-news/ltnews22.pdf}{\texttt{ltnews22.pdf}} +for details. + +One of the fixes from \textsf{fixltx2e} was for a glaring bug in +\cs{addvspace} that was originally detected in the mid-nineties and +back then added to the \textsf{fixltx2e} support package. In certain +situations \cs{addvspace} would result in a page/column break below +the baseline of the last line. As a result documents using +\cs{flushbottom} would show a clear misalignment (even more prominent +when typesetting in two-column mode). + +Starting with release 2015/01/01 this is now finally corrected already +in the kernel and not only in \textsf{fixltx2e}. In nearly all +circumstances this will either make no difference to existing +documents, or it will locally improve the visual appearance of that +document without changing anything on other pages. However, by the +nature of the change it is also possible that there are further +non-local changes to the page breaks due to the different break +positions introduced by the fix. + +Thus, for documents that have been written before 2015 and that should +be preserved unchanged at all costs you may have to add +\begin{verbatim} +\RequirePackage[2014/01/01]{latexrelease} +\end{verbatim} +at the top of the document, to roll back the format to a date before +the policy change. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews27.tex b/Master/texmf-dist/source/latex-dev/base/ltnews27.tex new file mode 100644 index 00000000000..93281c19126 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews27.tex @@ -0,0 +1,135 @@ +% \iffalse meta-comment +% +% Copyright 2017 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews27.tex +% +% This is issue 27 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\publicationmonth{April} +\publicationyear{2017} + +\publicationissue{27} + +\begin{document} + +\maketitle +\tableofcontents + +\setlength\rightskip{0pt plus 3em} + +\section{ISO 8601 Date format} +Since before the first releases of \LaTeXe, \LaTeX\ has used a date +format in the form \textsc{yyyy/mm/dd}. This has many advantages over more +conventional formats, as it is easy to sort and avoids the unfortunate +ambiguity between different communities as to whether 01/02/2017 is the +1st of February or 2nd of January. + +However there is another date format, formalised by the +International Standard ISO~8601. The basic format defined by this +standard is functionally equivalent to the \LaTeX\ format, but using +\texttt{-} rather than \texttt{/}. This date format is now supported +in many Operating Systems and applications +(for example the \verb|date --iso-8601| command in Linux and similar systems). + +From this release, \LaTeX\ will accept ISO format date strings in the +date argument of \verb|\ProvidesPackage|, \verb|\usepackage|, etc. +Currently we recommend that you do not use this format in any packages +that need to work with older \LaTeX\ releases; +the \textsf{latexrelease} package may be used with older releases to + add this functionality. This change is handled in a special way by + \textsf{latexrelease}: The package always adds support for ISO dates +whatever format date is requested; this is required so that the +necessary date comparisons may be made. + +The new functionality can be seen in the startup banner which +advertises \texttt{LaTeX2e <2017-04-15>}. + +\section{Further TU encoding improvements} +The 2017/01/01 release saw the introduction of the new TU encoding for +specifying Unicode fonts with \hologo{LuaTeX} and +\hologo{XeTeX}. There were a number of small corrections and additions +in the patch releases updating 2017/01/01, and a further addition in +this release, notably extended support for the dot-under accent, +\verb|\d|. + + +\section{Disabling hyphenation} +The existing \LaTeX\ code for \verb|\verb| and \verb|verbatim| had some +issues when used with fonts that were not loaded with hyphenation +disabled via setting \verb|\hyphenchar| to $-1$. In this release these +verbatim environments use a \verb|\language| setting, +\verb|\l@nohyphenation|, that has no hyphenation patterns associated. + +The format ensures that a language has been allocated with this name. +For most users this will in fact be no change as the standard +\textsf{babel} language has for a long time allocated a language with +this name. + +In order that page breaks in \texttt{verbatim} do not influence the +language used in the page head and foot, the format now normalises the +language used in the output routine to a default language as described +below. + +\section{Discretionary hyphenation} +The \LaTeX\ definition of \verb|\-| has been adjusted so that it will +insert the current font's \verb|\hyphenchar|, as would the +\TeX\ primitive. A comment in \textsf{source2e} has given +this new definition since the first releases of \LaTeXe, and in this +release we finally acted upon this comment. Previously \verb|\-| +always inserted a \texttt{-} at a break point even if a different +character would be used for automatic hyphenation with the current font. + +\section{Default document language} + +A new integer parameter \verb|\document@default@language| is +introduced; this is initialised to $-1$ but is set at +\verb|\begin{document}| to the language in force at that time if it + has not been set by preamble code. This is very similar to the + handling of the default color, and is used in a similar way to + normalise the settings for page head and foot as described above. +Users should not normally need to set this explicitly but it is expected that +language packages such as \textsf{babel} may set this if the default +behaviour is not suitable. + +\section{Line spacing in parboxes} +Inside a \verb|\parbox| +\LaTeX\ normalises the baseline spacing. However it has not +previously reset \verb|\lineskiplimit|. This meant that +lines of a paragraph that have ascenders or descenders could be set +with \emph{closer} line spacing than lines without. This can easily +happen if you use a \verb|\parbox| in an AMS alignment, as they use a +relatively large value of \verb|\lineskiplimit|. +As usual, the \textsf{latexrelease} package may be used to +force the older behavior. + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews28.tex b/Master/texmf-dist/source/latex-dev/base/ltnews28.tex new file mode 100644 index 00000000000..92c087e6b02 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews28.tex @@ -0,0 +1,365 @@ +% \iffalse meta-comment +% +% Copyright 2017-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews28.tex +% +% This is issue 28 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\providecommand\acro[1]{\textsc{#1}} +\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$} + + +\publicationmonth{April} +\publicationyear{2018} + +\publicationissue{28} + +\begin{document} + +\maketitle +\tableofcontents + +\setlength\rightskip{0pt plus 3em} + +\section{A new home for \LaTeXe{} sources} + +In the past the development version of the \LaTeXe{} source files has +been managed in a Subversion source control system with read access +for the public. This way it was possible to download in an emergency +the latest version even before it was released to CTAN and made its +way into the various distributions. + +We have recently changed this setup and now manage the sources using +Git and placed the master sources on GitHub at +\begin{quote} +\url{https://github.com/latex3/latex2e} +\end{quote} +where we already store the sources +for \pkg{expl3} and other work. As before, direct write access is restricted +to \LaTeX{} Project Team members, but everything is publicly accessible +including the ability to download, clone (using Git) or checkout +(using SVN). More details are given in~\cite{Mittelbach:TB39-1}. + +\section{Bug reports for core \LaTeXe{}} + +For more than two decades we used GNATS, an open source bug tracking +system developed by the FSF. While that has served us well in the past +it started to show its age more and more. So as part of this move we +also decided to finally retire the old \LaTeX{} bug database and replace +it with the standard ``Issue Tracker'' available at Github. + +The requirements and the workflow for reporting a bug in the core +\LaTeX{} software is documented at +\begin{quote} +\url{https://www.latex-project.org/bugs/} +\end{quote} +and with further details also discussed in~\cite{Mittelbach:TB39-1}. + + +\section{UTF-8: the new default input encoding} + +The first \TeX{} implementations only supported reading 7-bit +\acro{ascii} files---any accented or otherwise ``special'' character +had to be entered using commands, if it could be represented at +all. For example to obtain an ``\"a'' one would enter \verb=\"a=, and to +typeset a ``\ss'' the command \verb=\ss=. Furthermore fonts at that +time had 128 glyphs inside, holding the \acro{ascii} characters, some +accents to build composite glyphs from a letter and an accent, and a +few special symbols such as parentheses, etc. + +With 8-bit \TeX{} engines such as \hologo{pdfTeX} this situation changed +somewhat: it was now possible to process 8-bit files, i.e., files that +could encode 256 different characters. However, 256 is still a fairly +small number and with this limitation it is only possible to encode a +few languages and for other languages one would need to change the +encoding (i.e., interpret the character positions 0--255 in a +different way). The first code points 0--127 were essentially normed +(corresponding to \acro{ascii}) while the second half 128--255 would +vary by holding different accented characters to support a certain set +of languages. + +Each computer used one of these encodings when storing or interpreting +files and as long as two computers used the same encoding it was +(easily) possible to exchange files between them and have them +interpreted and processed correctly. + +But different computers may have used different encodings and given +that a computer file is simply a sequence of bytes with no indication for +which encoding is intended, chaos could easily happen and has +happened. For example, the German word ``Gr\"o\ss e'' (height) entered on a +German keyboard could show up as ``Gr\v T\`ae'' on a different +computer using a different encoding by default. + +So in summmary the situation wasn't at all good and it was clear in +the early nineties that \LaTeXe{} (that was being developed to provide +a \LaTeX{} version usable across the world) had to provide a solution +to this issue. + +The \LaTeXe{} answer was the introduction of the \package{inputenc} +package~\cite{Mittelbach:Brno95} through which it is possible to +provide support for multiple encodings. It also allows to correctly +process a file written in one encoding on a computer using a different +encoding and even supports documents where the encoding changes +midway. + +Since the first release of \LaTeXe{} in 1994, \LaTeX{} documents that +used any characters outside \acro{ascii} in the source (i.e. any +characters in the range of 128--255) were supposed to load +\package{inputenc} and specify in which file encoding they were +written and stored. +% +If the \package{inputenc} package was not loaded then \LaTeX{} used a +``raw'' encoding which essentially took each byte from the input file +and typeset the glyph that happened to be in that position in the +current font---something that sometimes produces the right result but +often enough will not. + +In 1992 Ken Thompson and Rob Pike developed the UTF-8 encoding scheme +which enables the encoding of all Unicode characters within 8-bit sequences. +Over time this encoding has gradually taken over the world, +replacing the legacy 8-bit encodings used before. These days all major +computer operating systems use UTF-8 to store their files and it +requires some effort to explicitly store files in one of the legacy +encodings. + +As a result, whenever \LaTeX{} users want to use any accented +characters from their keyboard (instead of resorting to \verb=\"a= and +the like) they always have to use +\begin{verbatim} + \usepackage[utf8]{inputenc} +\end{verbatim} +in the preamble of their documents as otherwise \LaTeX{} will produce +gibberish. + +\subsection{The new default} + +With this release, the default encoding for \LaTeX\ files has been +changed from the ``fall through raw'' encoding to UTF-8 if used with +classic \TeX\ or \hologo{pdfTeX}. The implementation is essentially +the same as the existing UTF-8 support from +\verb|\usepackage[utf8]{inputenc}|. + +The \hologo{LuaTeX} and \hologo{XeTeX} engines always supported the +UTF-8 encoding as their native (and only) input encoding, so with +these engines \package{inputenc} was always a no-op. + +This means that with new documents one can assume UTF-8 input and it +is no longer required to always specify +\verb|\usepackage[utf8]{inputenc}|. But if this line is present it +will not hurt either. + + +\subsection{Compatibility} + +For most existing documents this change will be transparent: +\begin{itemize} +\item documents using only \acro{ascii} in the input file and + accessing accented characters via commands; +\item documents that specified the encoding of their file via an + option to the \package{inputenc} package and then used 8-bit + characters in that encoding; +\item documents that already had been stored in UTF-8 (whether or not + specifying this via \package{inputenc}). +\end{itemize} +Only documents that have been stored in a legacy encoding and used +accented letters from the keyboard \emph{without} loading +\package{inputenc} (relying on the similarities between the input used +and the T1 font encoding) are affected. + +These documents will now generate an error that they contain invalid +UTF-8 sequences. However, such documents may be easily processed by +adding the new command \verb|\UseRawInputEncoding| as the first line +of the file. This will re-instate the previous ``raw'' encoding +default. + +\verb|\UseRawInputEncoding| may also be used on the command line to +process existing files without requiring the file to be edited +\begin{verbatim} + pdflatex '\UseRawInputEncoding \input' file +\end{verbatim} +will process the file using the previous default encoding. + +Possible alternatives are reencoding the file to UTF-8 using a tool +(such as recode or iconv or an editor) or adding the line +\begin{flushleft} +\verb= \usepackage[=\meta{encoding}\verb=]{inputenc}= +\end{flushleft} +to the preamble specifying the \meta{encoding} that fits the file +encoding. In many cases this will be \texttt{latin1} or +\texttt{cp1252}. For other encoding names and their meaning see the +\package{inputenc} documentation. + +As usual, this change may also be reverted via the more general +\package{latexrelease} package mechanism, by speciying a release date +earlier than this release. + + +\subsection{BOM: byte order mark handling} + +When using Unicode the first bytes of a file may be a, so called, BOM +character (byte order mark) to indicate the byte oder used in the +file. While this is not required with UTF-8 encoded files (where the +byte order is known) it is nevertheless allowed by the standard and +some editors add that byte sequence to the beginning of a file. In the +past such files would have generated a ``Missing begin document'' +error or displayed strange characters when loaded at a later stage. + +With the addition of UTF-8 support to the kernel it is now possible to +identify and ignore such BOMs characters even before +\verb=\documentclass= so that these issues will no longer be showing +up. + + + +\section[A general rollback concept] + {A general rollback concept for packages and classes} + + In 2015 a rollback concept for the \LaTeX{} kernel was introduced. + Providing this feature allowed us to make corrections to the + software (which more or less didn't happen for nearly two decades) + while continuing to maintain backward compatibility to the highest + degree. + + In this release we have now extended this concept to + the world of packages and classes which was not covered + initially. As the classes and the extension packages have different + requirements compared to the kernel, the approach is different (and + simplified). This should make it easy for package developers to + apply it to their packages and authors to use when necessary. + + The documentation of this new feature is given in an article + submitted to TUGboat and also available from our + website~\cite{Mittelbach:TB39-2}. + + +\section[Integration of \pkg{remreset} and \pkg{chngcntr} packages] + {Integration of \pkg{remreset} and \pkg{chngcntr} packages + into the kernel} + +With the optional argument to \cs{newcounter} \LaTeX{} offers to +automatically reset counters when some counter is stepped, e.g., +stepping a \texttt{chapter} counter resets the \texttt{section} +counter (and recursively all other heading counters). However, what +was until now missing was a way to undo such a link between counters +or to link two counters after they have been defined. + +This can be now be done with \cs{counterwithin} and \cs{counterwithout}, +respectively. In the past one had to load the \pkg{chngcntr} package +for this. For the programming level we also added +\cs{@removefromreset} as the counterpart of the already existing +\cs{@addtoreset} command. Up to now this was offered by the +\pkg{remreset} package. + +\section{Testing for undefined commands} +\LaTeX\ packages often use a test \verb|\@ifundefined| to test if a command +is defined. Unfortunately this had the side effect of \emph{defining} +the command to \verb|\relax| in the case that it had no definition. + The new release uses a modified definition +(using extra testing possibilities available in \hologo{eTeX}. The new definition +is more natural, however code that was relying on the side effect of the +command being tested being defined if it was previously undefined may have to add +\verb|\let\|\meta{command}\verb|\relax|. + + +\section{Changes to packages in the tools category} + +\subsection{\LaTeX{} table columns with fixed widths} + +Frank published a short paper in +TUGboat~\cite{Mittelbach:TB38-2-213} on producing tables that have +columns with fixed widths. The outlined approach using column +specifiers ``\texttt{w}'' and ``\texttt{W}'' has now been integrated +into the \pkg{array} package. + +\subsection{Obscure overprinting with \pkg{multicol} fixed} + +A rather peculiar bug was reported on StackExchange for +\pkg{multicol}. If the column/page breaking was fully controlled by +the user (through \cs{columnbreak}) instead of letting the environment +do its job and if then more \cs{columnbreak} commands showed up on the +last page then the balancing algorithm was thrown off track. +As a result some parts of the columns did overprint each other. + +The fix required a redesign of the output routines used by +\pkg{multicol} and while it ``should'' be transparent in other cases +(and all tests in the regession test suite came out fine) there is the +off-chance that code that hooked into internals of \pkg{multicol} +needs adjustment. + + +\section{Changes to packages in the amsmath category} + +With this release of \LaTeX{} a few minor issues with \pkg{amsmath} +have been corrected. + +\subsection{Updated user's guide} + +Furthermore, \texttt{amsldoc.pdf}, the AMS user's +guide for the \pkg{amsmath} package~\cite{amsldoc}, has been updated +from version~2.0 to~2.1 to incorporate changes and corrections made +between 2016 and 2018. + + +\begin{thebibliography}{9} + +\bibitem{Mittelbach:TB39-1} Frank Mittelbach: + \emph{New rules for reporting bugs in the \LaTeX{} core software}. + In: TUGboat, 39\#1, 2018. + \url{https://www.latex-project.org/publications/} + +\bibitem{Mittelbach:Brno95} Frank Mittelbach: + \emph{\LaTeXe{} Encoding Interface --- Purpose, concepts, and + Open Problems}. + Talk given in Brno June 1995. + \url{https://www.latex-project.org/publications/} + +\bibitem{Mittelbach:TB39-2} Frank Mittelbach: + \emph{A rollback concept for packages and classes}. + Submitted to TUGboat. + \url{https://www.latex-project.org/publications/} + +\bibitem{Mittelbach:TB38-2-213} Frank Mittelbach: + \emph{\LaTeX{} table columns with fixed widths}. + In: TUGboat, 38\#2, 2017. + \url{https://www.latex-project.org/publications/} + +\bibitem{amsldoc} American Mathematical Society and The \LaTeX3 Project: + \emph{User's Guide for the \texttt{amsmath} package} (Version 2.1). + April 2018. + Available from + \url{https://www.ctan.org} + and distributed as part of every \LaTeX{} distribution. + +\end{thebibliography} + +\end{document} diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews29.tex b/Master/texmf-dist/source/latex-dev/base/ltnews29.tex new file mode 100644 index 00000000000..1cc856aaed5 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews29.tex @@ -0,0 +1,526 @@ +% \iffalse meta-comment +% +% Copyright 2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews29.tex +% +% This is issue 29 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\usepackage{csquotes} + +\providecommand\acro[1]{\textsc{#1}} +\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$} + + +\providecommand\XeTeX{\hologo{XeTeX}} +\providecommand\LuaTeX{\hologo{LuaTeX}} +\providecommand\pdfTeX{\hologo{pdfTeX}} + +\newcommand\githubissue[2][]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(% + \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}% + {github issue#1 #2}% + )}% + \par} + +% simple solution right now (just link to the first issue if there are more) +\def\getfirstgithubissue#1 #2\relax{#1} + +\newcommand\sxissue[1]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par} + +\let\cls\pkg +\newcommand\env[1]{\texttt{#1}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\iffalse % only for TUB production +\usepackage{graphicx} +\makeatletter +% 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 Eplain.) Also, at Barbara's suggestion, if the current +% font is slanted, we rotate by 180 instead of reflecting so there is at +% least a 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 for \string\XeTeX}% + }{% + \ifdim \fontdimen1\font>0pt + \raise 1.6ex \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} +\DeclareRobustCommand{\Xe}{\leavevmode + \tubhideheight{\hbox{X% + \setbox0=\hbox{\TeX}\setbox1=\hbox{E}% + \ifdim \fontdimen1\font>0pt \def\XekernbeforeE{0em}\fi + \lower\dp0\hbox{\raise\dp1\hbox{\kern\XekernbeforeE\tubreflect{E}}}% + \kern\XekernafterE}}} +\def\XeTeX{\Xe\TeX} +\def\XeLaTeX{\Xe{\kern.11em \LaTeX}} +\fi +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\publicationmonth{December} +\publicationyear{2018} + +\publicationissue{29} + +\begin{document} + +%\addtolength\textheight{4.2pc} % only for TUB + +\maketitle +\tableofcontents + +\setlength\rightskip{0pt plus 3em} + +\bigskip + +\section{Introduction} + +The December 2018 release of \LaTeX{} is a maintenance release in +which we have fixed a few bugs in the software: some are old, some +newer, and they are mostly rather obscure. + +\section[Bug reports for core \LaTeXe{} and packages] + {Bug reports for core \LaTeXe{} and packages maintained by the Project Team} + +In Spring 2018 we established a new issue tracking system +(Github issues at \url{https://github.com/latex3/latex2e/issues}) for both +the \LaTeX{} core and the packages maintained by the +\LaTeX{} Project Team, with an updated procedure for how to report a +bug or problem. + +Initial experience with this system is good, with people who report +problems following the guidelines and including helpful working +examples to show the problem---thanks for doing this. + +The detailed requirements and the workflow for reporting a bug in the +core \LaTeX{} software is documented at +\begin{quote} +\url{https://www.latex-project.org/bugs/} +\end{quote} +with further details and discussion in~\cite{29:Mittelbach:TB39-1}. + + +\section{Changes to the \LaTeX{} kernel} + +\subsection{UTF-8:\ updates to the default input encoding} + +In the April 2018 release of \LaTeX{} we changed the default encoding +from 7-bit \acro{ascii} to \acro{utf}-8 when using classic \TeX\ or +\hologo{pdfTeX}; see \textit{\LaTeX{} News~28}~\cite{29:ltnews28} for +details. + +Now, after half a year of experience with +this new default, +we have +made a small number of adjustments to further improve the user experience. +These include: +\begin{itemize} +\item + Some improvements when displaying error messages about \acro{utf}-8 + characters that have not been set up for use with \LaTeX{}, + or are invalid for some other reason; +% +\githubissue[s]{60, 62 and 63} +% +\item + The addition of a number of previously missing declarations for + characters that are in fact available with the default fonts, e.g., + \cs{j} \enquote{\j} (0237), \cs{SS} \enquote{\SS} (1E9E), + \verb=\k{}= \enquote{\k{ }} (02DB) and \verb=\.{}= \enquote{\.{ }} + (02D9); +\item + Correcting the names for \cs{guillemetleft} + \enquote{\guillemotleft} and \cs{guillemetright} + \enquote{\guillemotright} in all encoding files. These correct + names are in addition to the old (but wrong) Adobe names: Adobe + mistakenly called them Guillemot, which is a sea bird. +% + \githubissue{65} +% +\item + Added \cs{Hwithstroke} (\enquote{\Hwithstroke}) and \cs{hwithstroke} + (\enquote{\hwithstroke}) necessary for typesetting Maltese. +% + \sxissue{q/460110} +\end{itemize} + + + +\subsection{Fixed \cs{verb*} and friends in \texorpdfstring{\XeTeX}{XeTeX} and \LuaTeX{}} + + +The original \cs{verb*} and \texttt{verbatim*} in \LaTeX{} were coded +under the assumption that the position of the space character (i.e., +\acro{ascii} 32) in a typewriter font contains a visible space glyph +``\verb*= =''. This is correct for \pdfTeX{} with the most used font +encodings \texttt{OT1} and \texttt{T1}. However, this unfortunately +does not work for Unicode engines using the \texttt{TU} encoding since +the space character slot (\acro{ascii} 32) then usually contains a real +(normal) space, which has the effect that \cs{verb*} produces the same +results as \cs{verb}. + +The \cs{verb*} code now always uses the newly introduced command +\cs{verbvisiblespace} to produce the visible space character and this +command will get appropriate definitions for use with the different +engines. With \pdfTeX{} it will simply use \cs{asciispace}, which is +a posh name for ``select character 32 in the current font'', but with +Unicode engines the default definition is +\begin{verbatim} + \DeclareRobustCommand\verbvisiblespace + {\leavevmode + {\usefont{OT1}{cmtt}{m}{n}\asciispace}} +\end{verbatim} +which uses the visible space from the font Computer Modern Typewriter, +regardless of the currently chosen typewriter font. Internally the +code ensures that the character used has exactly the same width as the +other characters in the current (monospaced) font; thus, for example, +code displays line up properly. + +It is possible to redefine this command to select your own character, +for example +\begin{verbatim} + \DeclareRobustCommand\verbvisiblespace + {\textvisiblespace} +\end{verbatim} +will select the the ``official'' visible space character of the +current font. This may look like the natural default, but it wasn't +chosen as our default because many fonts just don't have that Unicode +character, or they have one with a strange shape. +% +\githubissue[s]{69 and 70} + + +\subsection{Error message corrected} +Trying to redefine an undefined command could in a few cases generate +an error message with a missing space, e.g., +\verb=\renewcommand\1{...}= gave +\begin{verbatim} + LaTeX Error: \1undefined. +\end{verbatim} +This is now fixed. +% +\githubissue{41} + + +\subsection{Fixed fatal link error with \pkg{hyperref}} + +If an \cs{href} link text gets broken across pages, \pdfTeX{} and +\LuaTeX{} will generate a fatal error unless both parts of the link +are internally at the same boxing level. In two-column mode that was +not the case if one of the pages had spanning top floats. This has now +been changed so that the error is avoided. +% +\githubissue{94} + + +\subsection{Avoid page breaks caused by invisible commands} + +Commands like \cs{label} or \cs{index} could generate a potential page +break in places where a page break was otherwise prohibited, e.g., +when used between two consecutive headings. This has now been +corrected. If for some reason you really want a break and you relied +on this faulty behavior, you can always add one using \cs{pagebreak}, +with or without an optional argument. +% +\githubissue{81} + + + +\subsection{Prevent spurious spaces when reading table of contents data} + +When table of contents data is read in from a \texttt{.toc} file, the +new-line character at the end of each line is converted by \TeX{} to a +space. In normal processing this is harmless (as \TeX{} is doing this +input reading whilst in vertical mode and each line in the file +represents a single line (paragraph) in the table of contents. If, +however, this is done in horizontal mode, which is sometimes the case, +then these spaces will appear in the output. If you then omit some of +the input lines (e.g., because you do not display \acro{toc} data below a +certain level), then these spaces accumulate in the typeset output and +you get surprising, and unwanted, gaps inside the text. + +The new code now adds a \texttt{\%} sign at the end of problematic +lines in the \texttt{.toc} file so that \TeX{} will not generate such +spaces that may survive to spoil the printed result. As some third +party packages have augmented or changed the core \LaTeX{} +functionality in that area (for example, by adding additional +arguments to the commands in \acro{toc} files) the code uses a conservative +approach and the \texttt{\%} signs are added only when certain +conditions are met. Therefore some packages might require updates if +they want to benefit from this correction, especially if they +unconditionally overwrite \LaTeX{}'s \cs{addcontentsline} definition. +% +\githubissue{73} + + +\subsection{Prevent protrusion in table of contents lines} + +In \TeX{}'s internal processing model, +paragraph data is one of the +major data structures. As a result, +many things are internally modeled +as paragraphs even if they are not conceptually +``text paragraphs'' in +the traditional sense. +In a few cases this has some surprising effects +that are not always +for the better. One example is +standard \acro{toc} entries, +where you have +heading data followed by some dot leaders and a page +number at the right, produced, for example, from this: +\begin{quote} + \contentsline {subsection}{Error message corrected}{2}{section*.7} +\end{quote} +The space reserved for the page number is of a fixed width, so that +the dots always end in the same place. Well, they did end in the same +place until the advent of protrusion support in the \TeX{} engines. +Now, with the \pkg{microtype} package loaded, it is possible that the +page number will protrude slightly into the margin (even though it’s +typeset inside a box) and as a result this page number box gets +shifted. With enough bad luck this can get you another dot in the +line, sticking out like the proverbial sore thumb, as exhibited in the +question on StackExchange that triggered the correction. + +\LaTeX{} now takes care that there will be no protrusion happening on +such lines, even if it is generally enabled for the whole document. +% +\sxissue{q/172785} + + + +\subsection{Start L-R mode for \cs{thinspace} and friends} + +In \LaTeX{}, commands that are intended only for paragraph (L-R) mode +are generally careful to start paragraph mode if necessary; thus they +can be used at the start of a paragraph without surprising and +unwanted consequences. This important requirement had been overlooked +for a few horizontal spacing commands, such as \cs{thinspace} +(a.k.a.\ ``\cs{,}''), and for some other support commands such as +\cs{smash} or \cs{phantom}. Thus they ended up adding vertical space +when used at the beginning of a paragraph or, in the case of +\cs{smash}, creating a paragraph of their own. This has now been +corrected, and a corresponding update has been made to the +\pkg{amsmath} package, in which these commands are also defined. +% +\githubissue[s]{49 and 50} + + + +\subsection{Guarding \cs{pfill} in \pkg{doc}} + +For presenting index entries pointing to +code fragments and the like, +the \pkg{doc} package has a \cs{pfill} command that +generates within the index a line of dots leading from +the command name to the page or code line numbers. +If necessary it would automatically split the entry +over two lines. That worked well enough for a quarter century, but we +discovered recently that it is broken inside +the \cls{ltugboat} class, +where it sometimes produces +bad spacing within continuation lines. + +The reason turned out to be a redefinition of the \LaTeX{} command +\cs{nobreakspace} (\verb=~=) inside the class \cls{ltugboat}, which +removed any preceding space (and thus unfortunately also removed the +dots on the continuation line). While one can argue that this is a +questionable redefinition (if only done by a single class and not generally), +it has been in the class so long that changing it would +certainly break older documents. So instead we now guard against that +removal of space. +% +\githubissue[s]{25 and 75} + + + + + +\section{Changes to packages in the \pkg{tools} category} + +\subsection{Sometimes the \pkg{trace} package turned off too much} + +The \pkg{trace} package is a useful little tool for tracing macro +execution: it hides certain lengthy and typically uninteresting +expansions resulting from font changes and similar activities. +However, it had the problem that it also reset other tracing settings +such as \cs{showoutput} in such situations, so that you couldn't use +\cs{showoutput} in the preamble to get symbolic output of all the +pages in the document. This has now been corrected. + + + + +\subsection{Update to \pkg{xr}} + +The \pkg{xr} package has been updated so that the code that reads the +\texttt{.aux} file has been made more robust. It now correctly +ignores conditionals (added by \pkg{hyperref} and other packages) +rather than generating low level parsing errors. +\sxissue{a/452321} + + +\subsection{Column data for \env{multicols*} sometimes vanished} + +In certain situations involving \env{multicols*}, when there are more +explicit \cs{columnbreak} requests than there are columns on the +current page, data could vanish due to the removal of an internal +penalty marking the end of the environment. This has been corrected by +explicitly reinserting that penalty if necessary. +% +\githubissue{53} + +\subsection{Extension to \cs{docolaction} in \pkg{multicol}} + +The \cs{docolaction} command can be used to carry out actions +depending on the column you are currently in, i.e., first, any inner +one (if more than two) or last. However, if the action generates text +then there is the question: is this text part of the current column or +the one after? That is, on the next run, do we test before or after it, +to determine in which column we are? + +This is now resolved as follows: if you use \cs{docolaction*} any +generated text by the chosen action is considered to be after the test +point. But if you use the command without the star then all the material +it generates will be placed before the test point to determine the +current column, i.e., the text will become part of the current column +and may affect the test result on the next run. + + + +\subsection{Prevent color leak in \pkg{array}} + +In some cases the color used inside a \env{tabular} cell could ``leak +out'' into the surrounding text. This has been corrected. +% +\githubissue{72} + +\subsection{Support fragile commands in \texttt{array} or \texttt{tabular} column templates} + +The preamble specifiers \texttt{p}, \texttt{m} and \texttt{b} each receives +a user supplied argument: the width of the paragraph column. Normally +that is something harmless, like a length or a simple length +expression. But in more complicated settings involving the \pkg{calc} +package it could break with a low-level error message. This has now +been corrected. +% +\sxissue{q/459285} + + + +\section{Changes to packages in the amsmath category} + +The changes in the kernel made for \cs{thinspace}, \cs{smash}, +etc.\ (see above) have been reflected in the \pkg{amsmath} package +code, so that loading this package doesn't revert them. +% +\githubissue[s]{49 and 50} + + + + + +\section{Website updates} + +\subsection{Publications area reorganized and extended} + +To help readers to find relevant information in more convenient and +easy ways, the area of the website covering publications by the +\LaTeX{} Project Team was reorganized and extended (many more +abstracts added). We now provide the articles, talks and supplementary +data structured both by year and also by major +topics~\cite{29:site-pub}. Feel free to take a look. + +\subsection{Japanese translations of the user's guide} + +Yukitoshi Fujimura has kindly translated +into Japanese two documents that are +distributed with standard \LaTeX{}. +These are: +\begin{itemize} +\item + \LaTeXe{} for authors; +\item + User's Guide for the \pkg{amsmath}~Package~\cite{29:amsldoc}. +\end{itemize} +They can be found on the website documentation page~\cite{29:site-doc}. +You will now also find there a typeset version of the full \LaTeXe{} +source code (with index etc.\@) and a number of other goodies. + + + + +\begin{thebibliography}{9} + +\bibitem{29:Mittelbach:TB39-1} Frank Mittelbach: + \emph{New rules for reporting bugs in the \LaTeX{} core software}. + In: TUGboat, 39\#1, 2018. + \url{https://latex-project.org/publications/} + +\bibitem{29:ltnews28} + \emph{\LaTeX{} News, Issue 28}. + In: TUGboat, 39\#1, 2018.\\ + \rlap{\url{https://latex-project.org/news/latex2e-news/}} + +\bibitem{29:site-doc} + \emph{\LaTeX{} documentation on the \LaTeX{} Project Website}.\\ + \url{https://latex-project.org/documentation/} + +\bibitem{29:site-pub} + \emph{\LaTeX{} Project publications on the \LaTeX{} Project Website}.\\ + \url{https://latex-project.org/publications/} + +\bibitem{29:amsldoc} American Mathematical Society and The \LaTeX3 Project: + \emph{User's Guide for the \texttt{amsmath} Package} (Version 2.1). + April 2018. + Available from + \url{https://www.ctan.org} + and distributed as part of every \LaTeX{} distribution. + +\end{thebibliography} + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltnews30.tex b/Master/texmf-dist/source/latex-dev/base/ltnews30.tex new file mode 100644 index 00000000000..7b4b282cc9e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltnews30.tex @@ -0,0 +1,297 @@ +% \iffalse meta-comment +% +% Copyright 2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% Filename: ltnews30.tex +% +% This is issue 30 of LaTeX News. + +\documentclass{ltnews} +\usepackage[T1]{fontenc} + +\usepackage{lmodern,url,hologo} + +\usepackage{csquotes} + +\providecommand\acro[1]{\textsc{#1}} +\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$} + + +\providecommand\XeTeX{\hologo{XeTeX}} +\providecommand\LuaTeX{\hologo{LuaTeX}} +\providecommand\pdfTeX{\hologo{pdfTeX}} + +\providecommand\githubissue[2][]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(% + \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}% + {github issue#1 #2}% + )}% + \par} + +% simple solution right now (just link to the first issue if there are more) +\def\getfirstgithubissue#1 #2\relax{#1} + +\providecommand\sxissue[1]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par} + +\providecommand\gnatsissue[2]{\ifhmode\unskip\fi + \quad\penalty500\strut\nobreak\hfill + \mbox{\small\slshape(% + \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=#1\%2F#2}% + {gnats issue #1/#2}% + )}% + \par} + +\let\cls\pkg +\providecommand\env[1]{\texttt{#1}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\iffalse % only for TUB production +\usepackage{graphicx} +\makeatletter +% 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 Eplain.) Also, at Barbara's suggestion, if the current +% font is slanted, we rotate by 180 instead of reflecting so there is at +% least a 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 for \string\XeTeX}% + }{% + \ifdim \fontdimen1\font>0pt + \raise 1.6ex \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} +\DeclareRobustCommand{\Xe}{\leavevmode + \tubhideheight{\hbox{X% + \setbox0=\hbox{\TeX}\setbox1=\hbox{E}% + \ifdim \fontdimen1\font>0pt \def\XekernbeforeE{0em}\fi + \lower\dp0\hbox{\raise\dp1\hbox{\kern\XekernbeforeE\tubreflect{E}}}% + \kern\XekernafterE}}} +\def\XeTeX{\Xe\TeX} +\def\XeLaTeX{\Xe{\kern.11em \LaTeX}} +\fi +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\publicationmonth{Pre-release Version --- unfinished} +\publicationyear{2019} + +\publicationissue{30} + +\begin{document} + +%\addtolength\textheight{4.2pc} % only for TUB + +\maketitle +\tableofcontents + +\setlength\rightskip{0pt plus 3em} + +\bigskip + +\section{Introduction} + +This document is under construction \ldots + + +\section{Improving Unicode handling in \pdfTeX{}} + +The perhaps most important improvement in this release is an even +better support for UTF-8 characters when using \pdfTeX{}.\footnote{The + Japanese engines e-p\TeX{} and e-up\TeX{} can't use these features + yet as they don't support the primitive \cs{ifincsname}. Work is + under way to resolve this in the engines.} + +In Unicode engines any Unicode character (that is not acting as a +command, i.e., is \enquote{active}) can be used as part of the +\cs{label}/\cs{ref} mechanism or can be displayed in a message or +written to a file. In 8-bit engines, however, this was severely +restricted, essentially you had to limit yourself to using +\acro{ascii} letters, digits and a few punctuation symbols. With the +new release most of these restrictions have been removed and you now +can write labels such as +\begin{verbatim} + \label{eq:größer} +\end{verbatim} +or use accented characters, etc.\ as part of a \cs{typeout} message. +The only requirement remaining is that only those UTF-8 characters +that are also available for typesetting can be used, i.e., only those +which which adequate font support is loaded. Otherwise you will get an +error message stating that a particular Unicode character is not set +up for use with \LaTeX{}. + +What is not possible with an 8-bit engine such as \pdfTeX{} is to use +characters other than \acro{ascii} letters as part of a command +name. This is due to the fact that all other characters in such +engines are not single character tokens, but in fact consist of a +sequence of bytes and this is not supported in command names. + +\section{Improving file name handling in \pdfTeX{}} + +A related change is that file names used as part of \cs{input}, \cs{includegraphics}, etc.\ can now contain Unicode characters as well as spaces. In this case even characters that can't be typeset because of missing font support can be used. + + + + +\section{Other changes to the \LaTeX{} kernel} + + +\subsection{Guard against \cs{unskip} at the start of a tabular cell} + +If a \env{tabular} or \env{array} cell started with command that +issued an \cs{unskip} as its first action centering the column got +broken because the space on the left got removed. This got corrected +by adding a minuscule additional space after the stretching space that +could be safely removed in such a case without being noticeable. + +This change was also applied in the \pkg{array} package. + +\githubissue{102} + + +\subsection{Fixes to Unicode table data} + +\texttt{U+012F} which is \enquote{i with ogonek} should produce an +\enquote{i} and not a\enquote{dotless i}. This has been corrected. + +\githubissue{122} + +The Unicode slots \texttt{27E8} and \texttt{27E9} have been mapped to +\cs{textlangle} and \cs{textrangle} which is the recommended mapping. + +\githubissue{110} + +When doing cut-and-paste from other documents f-ligatures might show +up as Unicode characters. In the past those got rejected. We now +translate them back to individual characters so that they get +accepted. If supported by the font (which is normally the case) they +are then reconstructed as ligatures and thus come out as +desired. Otherwise they will come out as individual characters which +is fine too. + +\githubissue{154} + + +\subsection{Improve \cs{InputIfFileExists}'s handling of file names} + +In rare circumstances it was possible that \cs{InputIfFileExists} +would work incorrectly, e.g., a construction such as +\begin{verbatim} +\InputIfFileExists{foo}{\input{bar}}{} +\end{verbatim} +Would not load the files \texttt{foo.tex} and \texttt{bar.tex} but +would load \texttt{foo.tex} twice. This has been corrected. + +\githubissue{109} + + +\subsection{Improve wording of a warning message} + +\emph{write} + +\githubissue{107} + + +\subsection{Avoid \cs{DeclareErrorFont} side effects} + +\emph{write} + +\gnatsissue{latex}{4399} + + + +\subsection{\pkg{nfssfont}: Generate a font table as the default action} + +With the small file \texttt{nfssfont.tex} it is possible to produce +font tables and other font tests in the style set up by Don Knuth. As +in nearly all cases producing a font table is the desired action this +action has been made the default so that one can simply hit enter +instead of having to write \verb=\table\bye=. + + + + + + +\section{Changes to packages in the \pkg{tools} category} + +\subsection{\pkg{multicol}: Introduce \texttt{minrows} counter for balancing} + +When there are only a few lines of text on a page at the end of a +\env{multicols} environment balancing them looks rather odd, e.g., if +you then end up with three columns each containing a single line. This +can now be controlled through the counter \texttt{minrows} (default is +1) which requires at least that many lines in the first column during +balancing. Thus, if you set it to \texttt{2} one would get a +distribution of \texttt{2+1+0} lines and if set it to three, the result +would have been \texttt{3+0+0} instead of the default \texttt{1+1+1}. + +What is most appropriate really depends on the circumstances, but this +now gives you the tools to make local or global adjustments. + + + +\section{Changes to packages in the \pkg{amsmath} category} + +\subsection{\pkg{amsmath}: Introduce \texttt{overunderset} command} + +\emph{describe} + + + +\section{Documentation updates} + +\subsection{High-lighting the standard NFSS codes for series} + +\emph{describe} + + +\begin{thebibliography}{9} + +\bibitem{29:site-doc} + \emph{\LaTeX{} documentation on the \LaTeX{} Project Website}.\\ + \url{https://latex-project.org/documentation/} + +\bibitem{29:site-pub} + \emph{\LaTeX{} Project publications on the \LaTeX{} Project Website}.\\ + \url{https://latex-project.org/publications/} + +\end{thebibliography} + +\end{document} + diff --git a/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx b/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx new file mode 100644 index 00000000000..86135e96c84 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltoutenc.dtx @@ -0,0 +1,4239 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltoutenc.dtx +%\NeedsTeXFormat{LaTeX2e}[2000/06/01] +%<OT1>\ProvidesFile{ot1enc.def} +%<T1>\ProvidesFile{t1enc.def} +%<OMS>\ProvidesFile{omsenc.def} +%<OML>\ProvidesFile{omlenc.def} +%<OT4>\ProvidesFile{ot4enc.def} +%<TS1>\ProvidesFile{ts1enc.def}[2001/06/05 v3.0e (jk/car/fm) +%<TU>\ProvidesFile{tuenc.def} +%<package>\ProvidesPackage{fontenc} +%<TS1sty>\ProvidesPackage{textcomp} +%<OT1|T1|OMS|OML|OT4|TU|package|TS1sty> [2018/08/11 v2.0j +%<OT1|T1|OMS|OML|OT4|TS1|TU> Standard LaTeX file] +%<package|TS1sty> Standard LaTeX package] +% +%<*driver> +% \fi +\ProvidesFile{ltoutenc.dtx} + [2018/11/18 v2.0k LaTeX Kernel (font encodings)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltoutenc.dtx} +\title{\filename} +\date{\filedate} +\author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\usepackage{textcomp} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% +% \changes{v1.99e}{2004/02/13}{Documentation fixes: typos} +% \changes{v1.9k}{1998/01/12}{Added \cs{ProvidesPackage} +% for textcomp.sty} +% \changes{v1.9i}{1997/12/19}{Documentation corrections.} +% \changes{v1.9h}{1997/12/17}{Documentation changes and additions.} +% \changes{v1.9h}{1997/12/17}{Added textcomp.sty.} +% \changes{v1.9f}{1997/08/29}{Added OT4 encoding, +% provided by Marcin Woli\'nski.} +% \changes{v1.7r}{1995/11/28}{doc fixes} +% \changes{v1.7h}{1995/04/21}{Added \cs{null} \cs{k} latex/1274} +% \changes{v1.7f}{1994/12/14}{Added braces to \cs{copyright} so it +% works unbraced in subscripts.} +% \changes{v1.7f}{1994/12/14}{Added check for math mode in +% \cs{@changed@cmd}.} +% \changes{v1.7f}{1994/12/14}{Commented out \cs{textasciicircum}, +% \cs{textasciitilde}, \cs{textbackslash}, \cs{textbar}, +% \cs{textgreater}, \cs{texthyphenchar}, \cs{texthyphen} and +% \cs{textless} to save memory.} +% \changes{v1.7e}{1994/12/10}{Added documentation for the OML encoding.} +% \changes{v1.7e}{1994/12/10}{Replaced width with \cs{@width} and +% ditto height in vrules.} +% \changes{v1.7d}{1994/12/08}{Added \cs{null} and \cs{sh@ft} to \cs{b} +% and \cs{d}.} +% \changes{v1.7c}{1994/12/05}{Added braces to \cs{textcircled}.} +% \changes{v1.7b}{1994/12/02}{Fixed a bug with \cs{a}.} +% \changes{v1.7a}{1994/11/30}{Added new code for encoding-specific +% commands. These now expand in the mouth, which means that +% ligaturing and kerning can happen.} +% \changes{v1.6i}{1994/11/22}{Fixed empty accents. Again.} +% \changes{v1.6i}{1994/11/22}{Corrected \cs{dots} so that there's no +% kerning in monowidth fonts.} +% \changes{v1.6i}{1994/11/22}{Corrected typo with +% \cs{mathunderscore}.} +% \changes{v1.6h}{1994/11/17}{(DPC) \cs{@tempa} to \cs{reserved@a}} +% \changes{v1.6d}{1994/11/02}{Wrapped lines longer than 70 characters.} +% \changes{v1.6d}{1994/10/30}{Added math commands.} +% \changes{v1.6d}{1994/10/30}{Added OML encoding.} +% \changes{v1.6d}{1994/10/30}{Added \cs{textcircled}.} +% \changes{v1.6d}{1994/10/30}{Added \cs{DeclareTextCompositeCommand}.} +% \changes{v1.6c}{1994/10/29}{Renamed \cs{P}, \cs{S}, \cs{dag} and +% \cs{ddag} to \cs{textparagraph}, \cs{textsection}, +% \cs{textdagger} and \cs{textdaggerdbl}.} +% \changes{v1.6b}{1994/10/27}{Removed the enc.def files} +% \changes{v1.6a}{1994/10/25}{Added \cs{ProvideTextCommand}, +% \cs{UseTextSymbol}, +% \cs{UseTextAccent}, +% \cs{DeclareTextSymbolDefault}, +% \cs{DeclareTextAccentDefault}, +% \cs{DeclareTextCommandDefault}, and +% \cs{ProvideTextCommandDefault}.} +% \changes{v1.5m}{1994/10/18}{Added new definitions of \cs{patterns} +% and \cs{hyphenation}.} +% \changes{v1.5l}{1994/10/07}{Moved the ogonek accent.} +% \changes{v1.5k}{1994/05/18}{Removed braces from \cs{pounds} and +% \cs{dollar}.} +% \changes{v1.5k}{1994/05/18}{Replaced \cs{defaultencoding} with +% \cs{encodingdefault}.} +% \changes{v1.5k}{1994/05/18}{Made dotted-i produce `i'.} +% \changes{v1.5j}{1994/05/17}{Added braces to \cs{pounds} so it works +% as a subscript.} +% \changes{v1.5i}{1994/05/16}{Fixed a bug with \cs{d}.} +% \changes{v1.5h}{1994/05/16}{Added \cs{NG}, \cs{ng}, \cs{TH}, +% \cs{th}, \cs{DH}, \cs{dh}, \cs{DJ} and \cs{dj}.} +% \changes{v1.5h}{1994/05/16}{Added \cs{r} (ring accent) and \cs{k} +% (ogonek) accents.} +% \changes{v1.5h}{1994/05/16}{Removed \cs{P} from the OT1 definitions +% file.} +% \changes{v1.5h}{1994/05/16}{Fixed a bug with \cs{pounds}.} +% \changes{v1.5g}{1994/05/16}{Made fontenc.sty use the new mixed-case +% encoding files.} +% \changes{v1.5f}{1994/05/16}{Revert code so that the encoding +% given is used in \cs{DeclareTextCommand} (FMi)} +% \changes{v1.5f}{1994/05/16}{enc files now have uc encoding name +% parts (FMi)} +% \changes{v1.5e}{1994/05/14}{Replaced \cs{ENC@cmd} by \cs{ENC-cmd}.} +% \changes{v1.5d}{1994/05/14}{Rewrote \cs{DeclareTextCommand} to define +% its argument to use the current encoding by default, rather than +% the encoding provided to \cs{DeclareTextCommand}.} +% \changes{v1.5d}{1994/05/14}{Tidied up the documentation.} +% \changes{v1.5c}{1994/05/14}{Added the fontenc package.} +% \changes{v1.5c}{1994/05/14}{Fixed a bug which caused an infinite loop +% if \cs{f@encoding} was incorrectly set.} +% \changes{v1.5c}{1994/05/14}{Moved fontsmpl to its own dtx file.} +% \changes{v1.5b}{1994/05/13}{Added \cmd\{, \cmd\} and \cmd\$.} +% \changes{v1.5b}{1994/05/13} +% {Replaces \cs{space} by `~' in \cs{csname}.} +% \changes{v1.5b}{1994/05/13}{Renamed \cs{DeclareProtectedCommand} to +% \cs{DeclareRobustCommand}.} +% \changes{v1.5a}{1994/05/11}{Renamed the commands again. Made the +% encoding part of the command syntax. Added the +% \cs{DeclareTextCommand} interface. Used +% \cs{DeclareProtectedCommand}.} +% \changes{v1.4a}{1994/05/01}{Renamed the commands, removed the +% \cs{EncodingSpecific} command. Turned all slots into decimal. +% Added \cs{a}.} +% \changes{v1.4a}{1994/05/01}{Removed Rokicki's encoding.} +% \changes{v1.3d}{1993/12/18}{Some T1 stuff had drifted into the OT1 +% file.} +% \changes{v1.3c}{1993/12/18}{A new syntax, separating +% accent-definitions from encoding-specific definitions, and +% allowing encoding-specific \cs{chardef}, \cs{let}, etc.} +% \changes{v1.3c}{1993/12/18}{Rewrote for the new syntax of +% \cs{EncodingSpecific}.} +% \changes{v1.3b}{1993/12/18}{Corrected typos.} +% \changes{v1.3b}{1993/12/18}{Replaced the missing last argument to +% \cs{DeclareFontEncoding}.} +% \changes{v1.3a}{1993/12/18}{Replaced OT3 by XXX} +% \changes{v1.3}{1993/12/17}{Added \cs{EncodingSpecificAccent}, +% \cs{EncodingSpecificAccentedLetter} and +% \cs{EncodingSpecificCommand}.} +% \changes{v1.3}{1993/12/17}{Made Rokicki's encoding a proper encoding +% scheme rather than a variant of OT1.} +% \changes{v1.2b}{1993/12/13}{Corrected file name in driver code.} +% \changes{v1.2a}{1993/12/11}{Corrected for t1enc, math.} +% \changes{v1.2}{1993/12/10}{Added source code for t1enc.sty.} +% \changes{v1.1}{1993/12/07}{Made all character numbers decimal.} +% \changes{v1.1}{1993/12/07}{Removed a lot of equal signs and the +% like.} +% \changes{v1.99m}{2015/02/21} +% {Removed autoload code} +% +% +% \section{Font encodings} +% +% This section of the kernel contains commands for declaring +% encoding-specific +% commands, such as accents. It also contains the code for some of +% the encoding files, including |omlenc.def|, +% |omsenc.def|, |t1enc.def| and |ot1enc.def| files, which define +% the |OLM|, +% |OMS|, |T1| and |OT1| encodings, and the |fontenc| package +% for selecting encodings. +% +% The |fontenc| package has options for encodings, of which the +% last option is the default encoding. For example, to use the +% |OT2|, |OT3| and |T1| encodings, with |T1| as the default, you +% say: +%\begin{verbatim} +% \usepackage[OT2,OT3,T1]{fontenc} +%\end{verbatim} +% The standard kernel set-up loads font encoding files and selects +% an encoding as follows. +%\begin{verbatim} +% \input {omlenc.def} +% \input {t1enc.def} +% \input {ot1enc.def} +% \input {omsenc.def} +% \fontencoding{OT1} +%\end{verbatim} +% Note that the files in the standard |inputenc| package depend on +% this behaviour of the kernel. +% +% The syntax for declaring encoding-specific commands is: +% \begin{quote} +% |\DeclareTextCommand{|^^A +% \meta{command}|}{|^^A +% \meta{encoding}|}|\\\hspace*{\fill}|[|^^A +% \meta{number}|][|^^A +% \meta{default}|]{|^^A +% \meta{commands}|}| +% \end{quote} +% This command is like |\newcommand|, except that it defines a +% command which is specific to one encoding. The resulting command +% is always robust, even if its definition is fragile. For example, +% the definition of |\l| in the |OT1| encoding is: +%\begin{verbatim} +% \DeclareTextCommand{\l}{OT1}{{\@xxxii l}} +%\end{verbatim} +% |\DeclareTextCommand| takes the same optional arguments as +% |\newcommand|. +% \begin{quote} +% |\ProvideTextCommand{|^^A +% \meta{command}|}{|^^A +% \meta{encoding}|}|\\\hspace*{\fill}|[|^^A +% \meta{number}|][|^^A +% \meta{default}|]{|^^A +% \meta{commands}|}| +% \end{quote} +% This acts like |\DeclareTextCommand|, but does nothing if the +% command is already defined. +% \begin{quote} +% |\DeclareTextSymbol{|^^A +% \meta{command}|}{|^^A +% \meta{encoding}|}{|^^A +% \meta{slot}|}| +% \end{quote} +% This command defines a text symbol, with a particular slot in that +% encoding. The commands: +% \changes{v1.9h}{1997/12/17}{Example corrected, braces removed.} +%\begin{verbatim} +% \DeclareTextSymbol{\ss}{OT1}{25} +% \DeclareTextCommand{\ss}{OT1}{\char25 } +%\end{verbatim} +% have the same effect, but the |\DeclareTextSymbol| is faster. +% \begin{quote} +% |\DeclareTextAccent{|^^A +% \meta{command}|}{|^^A +% \meta{encoding}|}{|^^A +% \meta{slot}|}| +% \end{quote} +% \changes{v1.8e}{1996/11/23}{Corrected description} +% \changes{v1.9k}{1997/12/31}{Further correction} +% This command declares a text accent. The commands: +%\begin{verbatim} +% \DeclareTextAccent{\"}{OT1}{127} +% \DeclareTextCommand{\"}{OT1}{\add@accent {127}} +%\end{verbatim} +% have the same effect. +% \changes{v1.8c}{1996/10/27} +% {Corrected syntax descriptions} +% \begin{quote} +% |\DeclareTextComposite{|^^A +% \meta{command}|}|\\\hspace*{\fill}|{|^^A +% \meta{encoding}|}{|^^A +% \meta{argument}|}{|^^A +% \meta{slot}|}| +% \end{quote} +% This command declares a composite letter, for example in the |T1| +% encoding |\'{a}| is slot 225, which is declared by: +%\begin{verbatim} +% \DeclareTextComposite{\'}{T1}{a}{225} +%\end{verbatim} +% \changes{v1.8e}{1996/11/23} +% {Corrected description} +% The \emph{command} will normally have been declared with +% |\DeclareTextAccent|, or as a one-argument |\DeclareTextCommand|. +% +% |\DeclareTextComposite| is the most common example of using +% the more general declaration +% |\DeclareTextCompositeCommand|, which can define a composite +% to be an arbitrary piece of text. +% \begin{quote} +% |\DeclareTextCompositeCommand{|^^A +% \meta{command}|}|\\\hspace*{\fill}|{|^^A +% \meta{encoding}|}{|^^A +% \meta{argument}|}{|^^A +% \meta{text}|}| +% \end{quote} +% For example, in the OT1 encoding \r A has a hand-crafted +% definition this is declared as follows +%\begin{verbatim} +% \DeclareTextCompositeCommand{\r}{OT1}{A} +% {\leavevmode\setbox\z@\hbox{!}\dimen@\ht\z@\advance\dimen@-1ex% +% \rlap{\raise.67\dimen@\hbox{\char23}}A} +%\end{verbatim} +% \changes{v1.8e}{1996/11/23} +% {Corrected description} +% The \emph{command} will normally have been declared with +% |\DeclareTextAccent|, or as a one-argument |\DeclareTextCommand|. +% +% The commands defined using the above declarations can be used in +% two ways. +% Normally they are used by just calling the command in the +% appropriate encoding, for example |\ss|. However, sometimes you +% may wish to use a command in an encoding where it is not defined. +% If the command has no arguments, then you can use it in another +% encoding by calling |\UseTextSymbol|: +% \begin{quote} +% |\UseTextSymbol{|^^A +% \meta{encoding}|}{|^^A +% \meta{command}|}| +% \end{quote} +% +% \task{?}{Document the problems of these commands, see pr/3160} +% \changes{v1.9e}{1997/08/05}{Corrected order of arguments in +% \cs{UseTextSymbol} example.} +% For example, |\UseTextSymbol{OT1}{\ss}| has the same effect as: +%\begin{verbatim} +% {\fontencoding{OT1}\selectfont\ss} +%\end{verbatim} +% If the command has one argument then you can use it in another +% encoding by calling +% |\UseTextAccent|: +% \begin{quote} +% |\UseTextAccent{|^^A +% \meta{encoding}|}{|^^A +% \meta{command}|}{|^^A +% \meta{text}|}| +% \end{quote} +% For example, if the current encoding is |OT2| then +% |\UseTextAccent{OT1}{\'}{a}| has the same effect as: +%\begin{verbatim} +% {\fontencoding{OT1}\selectfont\'{\fontencoding{OT2}\selectfont a}} +%\end{verbatim} +% \changes{v1.8e}{1996/11/23} +% {Extended description} +% You can also declare a default definition for a text command, which +% will be used if the current encoding has no appropriate definition. +% Such use will also set the definition for this command in the +% current encoding to equal this default definition; this makes +% subsequent uses of the command much faster. +% \begin{quote} +% |\DeclareTextCommandDefault{|^^A +% \meta{command}|}{|^^A +% \meta{definition}|}| +% \end{quote} +% For example, the default definition of the command +% |\textonequarter| (which produces the fraction $\frac14$) could be +% built using math mode: +%\begin{verbatim} +% \DeclareTextCommandDefault{\textonequarter}{\ensuremath {\frac14}} +%\end{verbatim} +% There is a matching |\Provide| command which will not override an +% existing default definition: +% \begin{quote} +% |\ProvideTextCommandDefault{|^^A +% \meta{command}|}{|^^A +% \meta{definition}|}| +% \end{quote} +% The most common use for these commands is to use symbols from +% other encodings, so there are some optimizations provided: +% \begin{quote} +% |\DeclareTextSymbolDefault{|^^A +% \meta{command}|}|^^A +% \meta{encoding}|}|\\ +% |\DeclareTextAccentDefault{|^^A +% \meta{command}|}|^^A +% \meta{encoding}|}| +% \end{quote} +% are short for: +% \begin{quote} +% |\DeclareTextCommandDefault{|^^A +% \meta{command}|}|\\\hspace*{\fill}^^A +% |{\UseTextSymbol{|^^A +% \meta{encoding}|}{|\meta{command}|}}| \\ +% |\DeclareTextCommandDefault[1]{|^^A +% \meta{command}|}|\\\hspace*{\fill}^^A +% |{\UseTextAccent{|^^A +% \meta{encoding}|}{|\meta{command}|}{#1}}| +% \end{quote} +% For example, to make |OT1| the default encoding for |\ss| and +% |\'| you say: +%\begin{verbatim} +% \DeclareTextSymbolDefault{\ss}{OT1} +% \DeclareTextAccentDefault{\'}{OT1} +%\end{verbatim} +% Note that you can use these commands on any zero- or one-argument +% commands declared with |\DeclareText*| or |\ProvideText*|, not +% just those defined using |\DeclareTextSymbol| or +% |\DeclareTextAccent|. +% +% \subsection{Removing encoding-specific commands} +% \label{sec:removeencspec} +% +% \changes{v1.9o}{1998/03/20}{Documentation added for pr/2783} +% +% In some cases encoding definitions are given to provide some limited +% support since nothing better is available, for example, the definition +% for |\textdollar| in \texttt{OT1} is a hack since \$ and \pounds{} +% actually share the same slot in this encoding. Thus if such a glyph +% becomes available in a different encoding (e.g., \texttt{TS1}) one +% would like to get rid of the flacky one and make the default +% definition point to the new encoding. In such a case defining +%\begin{verbatim} +% \DeclareTextSymbol{\textdollar}{TS1}{36} +% \DeclareTextSymbolDefault{\textdollar}{TS1} +%\end{verbatim} +% is not enough since if typesetting in \texttt{OT1} \LaTeX{} will +% still find the encoding specific-definition for \texttt{OT1} and +% therefore ignore the new default. +% Therefore to ensure that in this case the \texttt{TS1} version is +% used we have to remove the \texttt{OT1} declaration: +%\begin{verbatim} +% \UndeclareTextCommand{\textdollar}{OT1} +%\end{verbatim} +% +% Since the \$ sign is a proper glyph in the \texttt{T1} encoding there +% is no point removing its definition and forcing \LaTeX{} to pick up +% the \texttt{TS1} version if typesetting in this encoding. +% However, assume you want to use the variant dollar sign, +% i.e., \textdollaroldstyle{} +% for your dollars. In that case you have to get rid of the \texttt{T1} +% declaration as well, e.g., the following would do that for you: +%\begin{verbatim} +% \UndeclareTextCommand{\textdollar}{OT1} +% \UndeclareTextCommand{\textdollar} {T1} +% \DeclareTextCommandDefault{\textdollar} +% {\UseTextSymbol{TS1}\textdollaroldstyle} +%\end{verbatim} +% +% \subsection{The order of declarations}\label{sec:orderofdecls} +% +% \changes{v1.9o}{1998/03/20}{Documentation added about order of decls} +% +% If an encoding-specific command is defined for more than one encoding, +% then it will execute fastest in the encoding in which it was defined +% last since its top-level definition will be set up to execute in that +% encoding without any overhead. +% +% For this reason the file \texttt{fonttext.ltx} currently first loads +% the definitions for the \texttt{T1} encoding and then those for the +% \texttt{OT1} encoding so that typesetting in \texttt{OT1} is optimized +% since that is (still) the default. However, when \texttt{T1} is +% explicitly requested (via |\usepackage[T1]{fontenc}|) the +% top-level definitions are automatically changed to favour +% \texttt{T1} since its declarations are reloaded in the process. +% +% For the same reason default declarations should never come last since +% they are implemented as a special encoding themselves (with the +% name |?|). +% Specifying them last would simply mean to make those encoding-specific +% commands equally inefficient in all encodings. Therefore the +% \texttt{textcomp} package, for example, first sets up all defaults +% to point to \texttt{TS1} and then declares the commands in the +% \texttt{TS1} encoding. +% +% +% \StopEventually{} +% +% \subsection{Docstrip modules} +% +% This |.dtx| file is be used to generate several related files +% containing font encoding definitions. The mutually exclusive +% docstrip options are listed here. +% \begin{center} +% \begin{tabular}{lp{10cm}} +% |T1| & generates |t1enc.def| for the Cork encoding. \\ +% |TS1| & generates |ts1enc.def| for the Text Companion +% encoding. \\ +% |TS1sty| & generates |textcomp.sty|, package that sets up use +% of the Text Companion encoding. \\ +% |OT1| & generates |ot1enc.def| for Knuth's CM encoding. \\ +% |OMS| & generates |omsenc.def| for Knuth's +% math symbol encoding. \\ +% |OML| & generates |omlenc.def| for Knuth's +% math letters encoding. \\ +% |OT4| & generates |ot4enc.def| for the Polish extension to +% the OT1 encoding, created by B.~Jackowski and +% M.~Ry\'cko for use with the Polish version of +% Computer Modern and Computer Concrete.\\ +% |TU| & generates |tuenc.def| for Unicode font +% encoding. \\ +% |package| & generates |fontenc.sty| for +% selecting encodings. \\ +% |2ekernel| & for the kernel commands.\\ +% \end{tabular} +% \end{center} +% \changes{1.0d}{1993/07/17}{changed \cs{catcoding} @} +% \changes{1.0f}{1993/08/13}{Protected against active @ sign.} +% \changes{1.0g}{1993/08/16}{Needs space after \cs{string}} +% \changes{1.1}{1993/12/07}{Protected all special characters with +% \cs{string}.} +% \changes{1.3}{1993/12/17}{Removed the catcode hackery, since the file +% is only read as a package in the preamble, and removed all the +% messages on the screen, which just confuse users. Replaced them +% by the appropriate \cs{ProvidesPackage} commands. Added XXXenc.} +% \changes{1.3b}{1993/12/18} +% {Fixed typos with \cs{ProvidesPackage} lines. +% Added the \cs{NeedsTeXFormat} line. Added the last argument to +% \cs{DeclareEncoding}. Moved the use of the encodings to after their +% declaration. } +% \changes{1.4a}{1994/04/29}{Removed Rokicki's OT1 variant encoding. +% Moved the driver to the top.} +% \changes{1.5a}{1994/05/11}{Made T1 and OT1 generate packages rather +% than def files. Renamed the `package' module to `teststy'.} +% \changes{1.5d}{1994/05/14}{Moved the driver to the top.} +% +% \subsection{Definitions for the kernel} +% +% \subsubsection{Declaration commands} +% +% \changes{1.3}{1993/12/17}{Added this section} +% \changes{1.3c}{1993/12/18}{Split \cs{EncodingSpecificAccent} up into +% \cs{EncodingSpecific} and \cs{DeclareAccent}.} +% \changes{1.4a}{1994/04/29}{Removed \cs{EncodingSpecific}. Renamed +% all the commands. Added \cs{DeclareTextGlyph} and +% \cs{UndeclareTextCommand}.} +% \changes{v1.5a}{1994/05/11}{Reimplemented \cs{DeclareTextCommand} +% using \cs{@changed@cmd} and \cs{DeclareProtectedCommand}.} +% \changes{v1.5c}{1994/05/14}{Fixed a bug which caused an infinite loop +% if \cs{f@encoding} was incorrectly set.} +% \changes{v1.5d}{1994/05/14}{Rewrote \cs{DeclareTextCommand} to define +% its argument to use the current encoding by default, rather than +% the encoding provided to \cs{DeclareTextCommand}.} +% \changes{v1.6a}{1994/10/25}{Added the \cs{Provide} commands, +% and the default definitions.} +% +% This section contains definitions for commands such as accents which +% depend on the current encoding. These commands will usually be kept +% in |.def| files, for example |ot1enc.def| contains the definitions +% for the |OT1| encoding. +% \begin{macrocode} +%<*2ekernel> +\message{font encodings,} +% \end{macrocode} +% +% \changes{v1.5d}{1994/10/27}{Rewrote \cs{DeclareTextSymbol} to define +% its argument to use the current encoding by default, to fit with +% \cs{DeclareTextCommand}.} +% +% \changes{v1.7a}{1994/11/30}{Redefined \cs{@changed@cmd} to expand in +% the mouth.} +% \changes{v1.7a}{1994/11/30}{Removed \cs{@changed@x@mouth} since +% \cs{@changed@x} now expands in the mouth.} +% +% \changes{v1.7r}{1995/11/28}{Renamed \cs{@changed@x@err} to +% \cs{TextSymbolUnavailable}.} +% \changes{v1.7r}{1995/11/28}{Added math mode checks to text commands.} +% Far too many macros in one block here! +% \begin{macro}{\DeclareTextCommand} +% \begin{macro}{\ProvideTextCommand} +% \begin{macro}{\DeclareTextSymbol} +% \begin{macro}{\@dec@text@cmd} +% \begin{macro}{\chardef@text@cmd} +% \begin{macro}{\@changed@cmd} +% \begin{macro}{\@changed@x} +% \begin{macro}{\TextSymbolUnavailable} +% \begin{macro}{\@inmathwarn} +% If you say: +%\begin{verbatim} +% \DeclareTextCommand{\foo}{T1}... +%\end{verbatim} +% then |\foo| is defined to be |\T1-cmd \foo \T1\foo|, +% where |\T1\foo| is \emph{one} control sequence, not two! +% We then call |\newcommand| to define |\T1\foo|. +% \begin{macrocode} +\def\DeclareTextCommand{% + \@dec@text@cmd\newcommand} +% \end{macrocode} +% +% \begin{macrocode} +\def\ProvideTextCommand{% + \@dec@text@cmd\providecommand} +% \end{macrocode} +% +% \begin{macrocode} +\def\@dec@text@cmd#1#2#3{% + \expandafter\def\expandafter#2% + \expandafter{% + \csname#3-cmd\expandafter\endcsname + \expandafter#2% + \csname#3\string#2\endcsname + }% + \let\@ifdefinable\@rc@ifdefinable + \expandafter#1\csname#3\string#2\endcsname} +% \end{macrocode} +% \changes{v1.99d}{2004/02/06}{New command added to fix +% severe bug: pr/3563} +% This command was introduced to fix a major bug +% in |\@dec@text@cmd| without changing that command itself. +% This was thought to be necessary because it is defined +% in more than one package. (Perhaps the more serious bug is to put +% complex low-level commands like this in packages?) +% +% The problem it solves is that whereas both |\newcommand| and +% |\providecommand| (used just above) both handle the +% resetting of |\@ifdefinable| (following its disabling in +% |\@dec@text@cmd|), the primitive |\chardef| neither needs the +% disabling, nor does the resetting. +% +% \begin{macrocode} +\def\chardef@text@cmd{% + \let\@ifdefinable\@@ifdefinable + \chardef + } +\def\DeclareTextSymbol#1#2#3{% + \@dec@text@cmd\chardef@text@cmd#1{#2}#3\relax + } +% \end{macrocode} +% +% The declarations are only available before |\begin{document}|. +% \changes{v1.7h}{1995/05/21}{Added several \cs{@onlypreamble}} +% \changes{v1.7k}{1995/06/05}{Removed \cs{protected@cmd} and replaced +% with explicit \cs{noexpand}.} +% \begin{macrocode} +\@onlypreamble\DeclareTextCommand +\@onlypreamble\DeclareTextSymbol +% \end{macrocode} +% The sneaky bit in all this is what |\T1-cmd \foo \T1\foo| does. +% There are five possibilities, depending on the current values of +% |\protect|, |\cf@encoding| and |\ifmmode|: +% \begin{itemize} +% \item If |\protect| is |\@typeset@protect| and |\cf@encoding| is +% |T1|, then we execute |\T1\foo|. This should be the normal +% behaviour, and is optimized for speed. +% \item If |\protect| is |\@typeset@protect|, |\cf@encoding| is +% (say) |OT1|, and |\OT1\foo| is defined, then we execute +% |\OT1\foo|. +% \item If |\protect| is |\@typeset@protect|, |\cf@encoding| is +% (say) |OT1|, we're in text mode, +% and |\OT1\foo| is undefined, then we define +% |\OT1\foo| to be the default value of |\foo|, and execute +% |\OT1\foo|. +% \item If |\protect| is |\@typeset@protect|, |\cf@encoding| is +% (say) |OT1|, we're in math mode, +% and |\OT1\foo| is undefined, then we execute the default value +% of |\foo|. (This is necessary so that things like +% |$X_\copyright$| work properly.) +% \item If |\protect| is not |\@typeset@protect| then we execute +% |\noexpand\foo|. For example, if we are writing to a file, +% then this results in |\foo| being written. If we are in a +% |\mark|, then |\foo| will be put in the mark---since |\foo| is +% robust, it will then survive all the things which may happen +% to it whilst it's a |\mark|. +% \end{itemize} +% So after all that, we will either execute the appropriate +% definition of |\foo| for the current encoding, or we will execute +% |\noexpand\foo|. +% +% The default value of |\foo| is |\?\foo| if it is defined, and an +% error message otherwise. +% +% When the encoding is changed from |T1| to |OT1|, |\T1-cmd| is +% defined to be |\@changed@cmd| and |\OT1-cmd| is defined to be +% |\@current@cmd|. This means that the test for what the current +% encoding is can be performed quickly. +% \begin{macrocode} +\def\@current@cmd#1{% + \ifx\protect\@typeset@protect + \@inmathwarn#1% + \else + \noexpand#1\expandafter\@gobble + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\@changed@cmd#1#2{% + \ifx\protect\@typeset@protect + \@inmathwarn#1% + \expandafter\ifx\csname\cf@encoding\string#1\endcsname\relax + \expandafter\ifx\csname ?\string#1\endcsname\relax + \expandafter\def\csname ?\string#1\endcsname{% + \TextSymbolUnavailable#1% + }% + \fi + \global\expandafter\let + \csname\cf@encoding \string#1\expandafter\endcsname + \csname ?\string#1\endcsname + \fi + \csname\cf@encoding\string#1% + \expandafter\endcsname + \else + \noexpand#1% + \fi} +% \end{macrocode} +% \changes{v1.7m}{1995/10/09}{Autoload error} +% \changes{v1.7v}{1995/12/05}{Changed \cs{TextSymbolUnavailable} text} +% \begin{macrocode} +\gdef\TextSymbolUnavailable#1{% + \@latex@error{% + Command \protect#1 unavailable in encoding \cf@encoding% + }\@eha} +% \end{macrocode} +% The command |\@inmathwarn| produces a warning message if we are +% currently in math mode. Note that since this command is used +% inside text commands, it can't call |\relax| before the +% |\ifmmode|. This means that it is possible for the warning to +% fail to be issued at the beginning of a row of an halign whose +% template enters math mode. This is probably a bad feature, but +% there's not much that can be done about it, since adding a |\relax| +% would break ligatures and kerning between text symbols. +% +% A more efficient solution would be to make |\@inmathwarn| and +% |\@inmatherr| equal to |\@empty| and |\relax| by default, and +% to have +% |\everymath| reset them to their usual definitions. This is left +% for future investigation (for example it may break some third +% party code). +% \begin{macrocode} +\def\@inmathwarn#1{% + \ifmmode + \@latex@warning{Command \protect#1 invalid in math mode}% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \changes{v1.7k}{1995/06/05}{Allowed \cs{ProvideTextCommandDefault} +% after the preamble.} +% +% \begin{macro}{\DeclareTextCommandDefault} +% \begin{macro}{\ProvideTextCommandDefault} +% These define commands with encoding |?|. +% +% Note that |\DeclareTextCommandDefault| can only be used in the +% preamble, but that the |\Provide| version is allowed in inputenc +% |.def| files, so is allowed anywhere. +% \begin{macrocode} +\def\DeclareTextCommandDefault#1{% + \DeclareTextCommand#1?} +% \end{macrocode} +% +% \begin{macrocode} +\def\ProvideTextCommandDefault#1{% + \ProvideTextCommand#1?} +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareTextCommandDefault +%\@onlypreamble\ProvideTextCommandDefault +% \end{macrocode} +% They require |\?-cmd| to be initialized as |\@changed@cmd|. +% \begin{macrocode} +\expandafter\let\csname?-cmd\endcsname\@changed@cmd +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\DeclareTextAccent} +% \changes{v1.5a}{1994/05/11} +% {Reimplemented using \cs{DeclareTextCommand}.} +% \changes{v1.7z}{1996/05/23} +% {Reimplemented using \cs{add@accent} to save space latex/2133} +% This is just a disguise for defining a \TeX~|\accent| command. +% \begin{macrocode} +\def\DeclareTextAccent#1#2#3{% + \DeclareTextCommand#1{#2}{\add@accent{#3}}} +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareTextAccent +% \end{macrocode} +% \end{macro} +% +% \changes{v1.7a}{1994/11/30}{Rewrote \cs{@text@composite} so it +% allows an empty argument, or an argument containing lots of +% commands.} +% +% \begin{macro}{\add@accent} +% \changes{v1.7z}{1996/05/23}{macro added. latex/2133} +% \changes{v1.91}{2000/08/30}{Rearranged but no change to final code, +% CAR (pr/3160)} +% To save space this code is shared between all text accents that are +% set using the |\accent| primitive. +% The argument is pre-set in a box so that any +% font loading that is needed is already done within the box. +% This is needed because font-loading involves grouping and that would +% prevent the accent mechanism from working so that the accent would +% not be positioned over the argument. +% Declarations that change the font should be allowed (only low-level +% ones are at present) inside the argument of an accent command, +% but not size changes, as they involve |\setbox| operations which +% also inhibit the mechanism of the |\accent| primitive. +% +% Note that the whole process is within a group. +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% For a detailed discussion of this reimplementation and its +% deficiencies, see pr/3160. +% \task{?}{Improve this and document its problems, see pr/3160} +% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)} +% \begin{macrocode} +\def\add@accent#1#2{\hmode@bgroup +% \end{macrocode} +% Turn off the group in |\UseTextSymbol| in case this is used +% inside the argument of |\add@accent|. +% \begin{macrocode} + \let\hmode@start@before@group\@firstofone + \setbox\@tempboxa\hbox{#2% +% \end{macrocode} +% When presetting the argument in a box we record its |\spacefactor| +% for later use after the accent got typeset. This way something like +% |\`A| gets the spacefactor of |A| (i.e., 999) rather than the +% default value of 1000. +% \changes{v1.9q}{1998/06/12} +% {Explicitly set \cs{spacefactor} after \cs{accent} (pr/2877)} +% \begin{macrocode} + \global\mathchardef\accent@spacefactor\spacefactor}% + \accent#1 #2\egroup\spacefactor\accent@spacefactor} +% \end{macrocode} +% Default definition for |\accent@spacefactor| prevents a horrible +% death of the above macro inside an unprotected |\edef|. +% \changes{v1.9w}{1999/10/28}{Give \cs{accent@spacefactor} a default +% definition (pr/3084)} +% \begin{macrocode} +\let\accent@spacefactor\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hmode@bgroup} +% \changes{v1.9y}{2000/01/30}{Macro added} +% \begin{macrocode} +\def\hmode@bgroup{\leavevmode\bgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\DeclareTextCompositeCommand} +% \changes{v1.7z}{1996/05/23} +% {Modified to cope with new \cs{add@accent} command: required +% removal of check for one argument-command} +% \changes{v2.0h}{2017/02/24}{% +% add check whether the accent command is defined for this encoding} +% \changes{v2.0i}{2017/04/05}{% +% Declare accent command if not already declared when declaring a composite.} +% \begin{macro}{\DeclareTextComposite} +% \changes{v1.7l}{1995/06/09}{Rewrote \cs{DeclareTextComposite} to +% define the composite as a no-argument command rather than a +% two-argument command.} +% \begin{macro}{\@text@composite} +% \begin{macro}{\@text@composite@x} +% \begin{macro}{\@strip@args} +% \changes{v1.8c}{1996/10/27} +% {Removed macro} +% Another amusing game to play with |\expandafter|, |\csname|, and +% |\string|. When you say +% |\DeclareTextCompositeCommand{\foo}{T1}{a}{bar}|, we look to see +% if the expansion of |\T1\foo| begins with |\@text@composite|, and +% if it doesn't, we redefine |\T1\foo| to be: +%\begin{verbatim} +% #1 -> \@text@composite \T1\foo #1\@empty \@text@composite {...} +%\end{verbatim} +% where |...| is the +% previous definition of |\T1\foo|. Finally, we define |\\T1\foo-a| +% to expand to |bar|. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/04/15}{\DeclareTextCompositeCommand} +%<latexrelease> {test for undeclared accent}% +%<*2ekernel|latexrelease> +\def\DeclareTextCompositeCommand#1#2#3#4{% + \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname + \ifx\reserved@a\relax + \DeclareTextCommand#1{#2}{% + \@latex@error{\string#1 undeclared in encoding #2}\@eha}% + \@latex@info{Composite with undeclared \string#1 in encoding #2}% + \expandafter\let\expandafter\reserved@a\csname#2\string#1\endcsname + \fi + \expandafter\expandafter\expandafter\ifx + \expandafter\@car\reserved@a\relax\relax\@nil \@text@composite \else + \edef\reserved@b##1{% + \def\expandafter\noexpand + \csname#2\string#1\endcsname####1{% + \noexpand\@text@composite + \expandafter\noexpand\csname#2\string#1\endcsname + ####1\noexpand\@empty\noexpand\@text@composite + {##1}}}% + \expandafter\reserved@b\expandafter{\reserved@a{##1}}% + \fi + \expandafter\def\csname\expandafter\string\csname + #2\endcsname\string#1-\string#3\@empty\endcsname{#4}% + } +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\DeclareTextCompositeCommand} +%<latexrelease> {test for undeclared accent}% +%<latexrelease>\def\DeclareTextCompositeCommand#1#2#3#4{% +%<latexrelease> \expandafter\let\expandafter\reserved@a +%<latexrelease> \csname#2\string#1\endcsname +%<latexrelease> \expandafter\expandafter\expandafter\ifx +%<latexrelease> \expandafter\@car\reserved@a\relax\relax\@nil +%<latexrelease> \@text@composite \else +%<latexrelease> \edef\reserved@b##1{% +%<latexrelease> \def\expandafter\noexpand +%<latexrelease> \csname#2\string#1\endcsname####1{% +%<latexrelease> \noexpand\@text@composite +%<latexrelease> \expandafter\noexpand\csname#2\string#1\endcsname +%<latexrelease> ####1\noexpand\@empty\noexpand\@text@composite +%<latexrelease> {##1}}}% +%<latexrelease> \expandafter\reserved@b\expandafter{\reserved@a{##1}}% +%<latexrelease> \fi +%<latexrelease> \expandafter\def\csname\expandafter\string\csname +%<latexrelease> #2\endcsname\string#1-\string#3\@empty\endcsname{#4}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareTextCompositeCommand +% \end{macrocode} +% This all works because: +%\begin{verbatim} +% \@text@composite \T1\foo A\@empty \@text@composite {...} +%\end{verbatim} +% expands to +% |\\T1\foo-A| if |\\T1\foo-A| has been defined, and |{...}| +% otherwise. +% +% Note that |\@text@composite| grabs the first token of the +% argument and puts just that in the +% csname. This is so that |\'{\textit{e}}| will work---it checks +% whether |\\T1\'-\textit| is defined (which presumably it isn't) +% and so expands to |{\accent 1 \textit{e}}|. +% +% This trick won't always work, for example |\'{{\itshape e}}| will +% expand to (with spaces added for clarity): +%\begin{verbatim} +% \csname \string \T1\' - \string {\itshape e} \@empty \endcsname +%\end{verbatim} +% which will die pretty horribly. Unfortunately there's not much +% can be done about this if we're going to use |\csname| lookups as a +% fast way of accessing composites. +% +% This has an unfortunate `misfeature' though, which is that in +% the T1 encoding, |\'{aa}| produces \'a. This is not the expected +% behaviour, and should perhaps be fixed if the fix doesn't affect +% performance too badly. +% +% Finally, it's worth noting that the |\@empty| is used in +% |\@text@composite| so that accents will work even when the +% argument is empty. If you say |\'{}| then this looks up +% |\\T1\'-\@empty|, which ought to be |\relax|, and so all is well. +% If we didn't include the |\@empty|, then |\'{}| would expand to: +%\begin{verbatim} +% \csname \string \T1\' - \string \endcsname +%\end{verbatim} +% so the |\endcsname| would be |\string|'ed and the whole of the +% rest of the document would be put inside the |\csname|. This +% would not be good. +% \begin{macrocode} +\def\@text@composite#1#2#3\@text@composite{% + \expandafter\@text@composite@x + \csname\string#1-\string#2\endcsname} +% \end{macrocode} +% +% \changes{v1.7z}{1996/05/23} +% {\cs{expandafter} added to match other changes for latex/2133} +% \changes{v1.9r}{1999/01/06}{New impl for latex/2930} +% \changes{v1.9s}{1999/01/13}{Simplified solution for latex/2930} +% Originally the |\@text@composite@x| macro had two arguments and if +% |#1| was not |\relax| it was executed, otherwise |#2| was executed. +% All this happened within the |\ifx| code so that neither |#1| +% nor |#2| could have picked up any additional arguments form +% the input stream. +% This has now being changed using the typical |\@firstoftwo| / +% |\@secondoftwo| coding. This way the +% final expansion will happen without any |\else| or |\fi| +% intervening in the case that we need to get a further token +% from the input stream. +% \begin{macrocode} +\def\@text@composite@x#1{% + \ifx#1\relax + \expandafter\@secondoftwo + \else + \expandafter\@firstoftwo + \fi + #1} +% \end{macrocode} +% The command |\DeclareTextComposite| uses +% |\DeclareTextCompositeCommand| to declare a command which +% expands out to a single glyph. +% \changes{v1.8a}{1996/07/19} +% {Use char 0 not @ as carrier for \cs{lowercase} /2197} +% \begin{macrocode} +\catcode\z@=11\relax +% \end{macrocode} +% +% \begin{macrocode} +\def\DeclareTextComposite#1#2#3#4{% + \def\reserved@a{\DeclareTextCompositeCommand#1{#2}{#3}}% + \bgroup + \lccode\z@#4% + \lowercase{% + \egroup + \reserved@a ^^@}} +% \end{macrocode} +% +% \begin{macrocode} +\catcode\z@=15\relax +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareTextComposite +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\UseTextAccent} +% \begin{macro}{\UseTextSymbol} +% \changes{v1.7p}{1995/11/17}{Support \cs{@wrong@font@char} latex/1676} +% \changes{v1.7q}{1995/11/18}{Modify message slightly} +% \begin{macro}{\@use@text@encoding} +% \changes{v1.91}{2000/08/30}{Rearranged but no change to final code, +% CAR (pr/3160)} +% These fragile commands access glyphs from different encodings. +% They use grotty low-level calls to the font selection scheme for +% speed, and in order to make sure that |\UseTextSymbol| doesn't +% do anything which you're not allowed to do between an |\accent| +% and its glyph. +% +% For a detailed discussion of this reimplementation and its +% deficiencies, see pr/3160. +% \task{?}{Improve this and document its problems, see pr/3160} +% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)} +% \begin{macrocode} +\def\UseTextAccent#1#2#3{% + \hmode@start@before@group + {% +% \end{macrocode} +% Turn off the group in |\UseTextSymbol| in case this is used +% inside the arguments of |\UseTextAccent|. +% \begin{macrocode} + \let\hmode@start@before@group\@firstofone + \let\@curr@enc\cf@encoding + \@use@text@encoding{#1}% + #2{\@use@text@encoding\@curr@enc#3}% + }} +% \end{macrocode} +% +% \changes{v1.9z}{2000/01/30}{Macro reimplemented (pr/3160)} +% \begin{macrocode} +\def\UseTextSymbol#1#2{% + \hmode@start@before@group + {% + \def\@wrong@font@char{\MessageBreak + for \noexpand\symbol`\string#2'}% + \@use@text@encoding{#1}% + #2% + }% + } +% \end{macrocode} +% +% \begin{macrocode} +\def\@use@text@encoding#1{% + \edef\f@encoding{#1}% + \xdef\font@name{% + \csname\curr@fontshape/\f@size\endcsname}% + \pickup@font + \font@name + \@@enc@update} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\hmode@start@before@group} +% The |\hmode@start@before@group| starts hmode and should be +% immediately followed by an explicit |{...}|. Its purpose is to +% ensure that hmode is started before this group is opened. Inside +% |\add@accent| and |\UseTextAccent| it is redefined to remove this +% group so that it doesn't conflict with the |\accent| primitive. +% +% For a detailed discussion see pr/3160. +% \changes{v1.9z}{2000/01/30}{Macro added (pr/3160)} +% \begin{macrocode} +\let\hmode@start@before@group\leavevmode +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\DeclareTextSymbolDefault} +% \begin{macro}{\DeclareTextAccentDefault} +% Some syntactic sugar. Again, these should probably be optimized +% for speed. +% \begin{macrocode} +\def\DeclareTextSymbolDefault#1#2{% + \DeclareTextCommandDefault#1{\UseTextSymbol{#2}#1}} +% \end{macrocode} +% +% \begin{macrocode} +\def\DeclareTextAccentDefault#1#2{% + \DeclareTextCommandDefault#1{\UseTextAccent{#2}#1}} +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareTextSymbolDefault +\@onlypreamble\DeclareTextAccentDefault +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\UndeclareTextCommand} +% This command safely removes an encoding specific declaration +% for a given encoding. It is helpful if one intends to use the +% default definition always and therefore wants to get rid of +% a declaration for some specific encoding. +% \changes{v1.9o}{1998/03/20}{Macro added for pr/2783} +% \begin{macrocode} +\def\UndeclareTextCommand#1#2{% +% \end{macrocode} +% If there is no declaration for the current encoding do nothing. +% (This makes a hash table entry but without e\TeX{} we can't do +% anything about that). +% \begin{macrocode} + \expandafter\ifx\csname#2\string#1\endcsname\relax + \else +% \end{macrocode} +% Else: throw away that declaration. +% \begin{macrocode} + \global\expandafter\let\csname#2\string#1\endcsname + \@undefined +% \end{macrocode} +% But this is unfortunately not enough, we have to take a look +% at the top-level definition of the encoding specific command +% which for a command |\foo| would look similar to +% |\T1-cmd \foo \T1\foo| (three tokens). +% +% Of course, instead of |T1| one could see a different encoding name; +% which one depends the encoding for which |\foo| was declared +% last. +% +% Now assume we have just removed the declaration for |\foo| in |T1| +% and the top-level of |\foo| expands to the above. Then we better +% change that pretty fast otherwise we do get an ``undefined csname +% error'' when we try to typeset |\foo| within |T1| instead of +% getting the default definition for |\foo|. +% And what is the best way to change that top-level definition? Well, +% the only ``encoding'' we know for sure will still be around is +% the default encoding denoted by |?|. +% +% Thus in case the last token of the top-level expansion +% is now undefined we change the declaration to look like +% |\?-cmd \foo \?\foo| which is done by the following +% (readable?) code: +% \begin{macrocode} + \expandafter\expandafter\expandafter + \ifx\expandafter\@thirdofthree#1\@undefined + \expandafter\gdef\expandafter#1\expandafter + {\csname ?-cmd\expandafter\endcsname\expandafter + #1\csname?\string#1\endcsname}% + \fi + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\UndeclareTextCommand +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Hyphenation} +% +% \changes{v1.5l}{1994/10/18}{Added new definitions of \cs{patterns} +% and \cs{hyphenation}.} +% \changes{v1.6g}{1994/11/05}{Added setting of \cs{@typeset@protect} +% to \cs{patterns} and \cs{hyphenation}.} +% \changes{v1.6g}{1994/11/30}{Removed new definitions of \cs{patterns} +% and \cs{hyphenation}, since encoding-specific commands now expand +% in the mouth.} +% +% \begin{macro}{\patterns} +% \begin{macro}{\@@patterns} +% \begin{macro}{\hyphenation} +% \begin{macro}{\@@hyphenation} +% We redefine |\patterns| and |\hyphenation| to allow the use of +% commands declared with |\DeclareText*| to be used inside them. +% \begin{macrocode} +%\let\@@patterns\patterns +%\let\@@hyphenation\hyphenation +%\def\patterns{% +% \bgroup +% \let\protect\@empty +% \let\@typeset@protect\@empty +% \let\@changed@x\@changed@x@mouth +% \afterassignment\egroup +% \@@patterns +%} +%\def\hyphenation{% +% \bgroup +% \let\protect\@empty +% \let\@typeset@protect\@empty +% \let\@changed@x\@changed@x@mouth +% \afterassignment\egroup +% \@@hyphenation +%} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Miscellania} +% +% \changes{1.4a}{1994/05/01}{Added the \cs{a} command.} +% \changes{1.7a}{1994/11/30}{Redefined \cs{a} for the new scheme.} +% \changes{1.7b}{1994/12/02}{Redefined \cs{a} properly.} +% \changes{1.7g}{1995/03/03}{Corrected an error in documentation +% referring to the tabular rather than the tabbing +% environment.} +% \changes{v1.7n}{1995/11/02}{Changed internal name \cs{a} to +% \cs{@tabacckludge} to protect against redefinition by malicious +% users.} +% +% \begin{macro}{\a} +% The |\a| command is used to access the accent commands even when +% they have been redefined (for example by the |tabbing| +% environment). Its internal name is |\@tabacckludge|. +% +% The |\string| within the |\csname| guards against something +% like |'| being active at the point of use. +% \changes{v1.9r}{1998/09/19}{Added \cs{string} (pr/2878)} +% \begin{macrocode} +\def\@tabacckludge#1{\expandafter\@changed@cmd + \csname\string#1\endcsname\relax} +\let\a=\@tabacckludge +% \end{macrocode} +% \end{macro} +% +% \changes{v1.6a}{1994/10/25}{Added the files OT1enc.def, T1enc.def and +% OMSenc.def.} +% \changes{v1.6b}{1994/10/27}{Removed the files OT1enc.def, T1enc.def +% and OMSenc.def.} +% +% \subsubsection{Default encodings} +% +% We define the default encodings for most commands to be either OT1, +% OML or OMS. These defaults are in the kernel and therefore +% fonts with these encodings must be available unless these +% defaults are redefined elsewhere. Recall that the standard kernel +% loads the encoding files for these encodings, and also that for +% the T1 encoding. +% +% The naming conventions in the kernel are not what we would use if we +% were starting from scratch\dots\ +% Those defined by DEK (like |\ae| and |\ss|) or by the \TeX{} Users +% Group Technical Working Group on multi-lingual typesetting (like +% |\th| and |\ng|) have short names. Those which were added to the +% kernel in 1993 and early 1994 are named after their Adobe glyph +% names (like |\guillemotleft| and |\quotedblbase|). Unfortunately, +% this naming scheme won't work for all glyphs, since some names (like +% |\space|) are already used, and some (like |\endash|) are very +% likely to be defined by users. So we're now using the naming scheme +% of |\text| followed by the Adobe name, (like |\textendash| and +% |\textsterling|). Except that some glyphs don't have Adobe names, +% so we're using the names used by fontinst for those (like +% |\textcompwordmark|). Sigh. +% +% \changes{v1.6a}{1994/10/25}{Added the defaults.} +% \changes{v1.6b}{1994/10/27}{Added more defaults for OT1.} +% \changes{v1.6c}{1994/10/29}{Added commands like \cs{dots} for use in +% text and math.} +% +% Some accents from OT1: +% \begin{macrocode} +\DeclareTextAccentDefault{\"}{OT1} +\DeclareTextAccentDefault{\'}{OT1} +\DeclareTextAccentDefault{\.}{OT1} +\DeclareTextAccentDefault{\=}{OT1} +\DeclareTextAccentDefault{\H}{OT1} +\DeclareTextAccentDefault{\^}{OT1} +\DeclareTextAccentDefault{\`}{OT1} +\DeclareTextAccentDefault{\b}{OT1} +\DeclareTextAccentDefault{\c}{OT1} +\DeclareTextAccentDefault{\d}{OT1} +\DeclareTextAccentDefault{\r}{OT1} +\DeclareTextAccentDefault{\u}{OT1} +\DeclareTextAccentDefault{\v}{OT1} +\DeclareTextAccentDefault{\~}{OT1} +% \end{macrocode} +% Some symbols from OT1: +% \changes{v1.8c}{1996/10/27} +% {Removed \cs{aa} and \cs{AA}} +% \begin{macrocode} +%\DeclareTextSymbolDefault{\AA}{OT1} +\DeclareTextSymbolDefault{\AE}{OT1} +\DeclareTextSymbolDefault{\L}{OT1} +\DeclareTextSymbolDefault{\OE}{OT1} +\DeclareTextSymbolDefault{\O}{OT1} +%\DeclareTextSymbolDefault{\aa}{OT1} +\DeclareTextSymbolDefault{\ae}{OT1} +\DeclareTextSymbolDefault{\i}{OT1} +\DeclareTextSymbolDefault{\j}{OT1} +% \end{macrocode} +% \changes{v1.99h}{2005/11/08} +% {Added \cs{ij} and \cs{IJ} from babel. (pr/3771)} +% \begin{macrocode} +\DeclareTextSymbolDefault{\ij}{OT1} +\DeclareTextSymbolDefault{\IJ}{OT1} +% \end{macrocode} +% \begin{macrocode} +\DeclareTextSymbolDefault{\l}{OT1} +\DeclareTextSymbolDefault{\oe}{OT1} +\DeclareTextSymbolDefault{\o}{OT1} +\DeclareTextSymbolDefault{\ss}{OT1} +\DeclareTextSymbolDefault{\textdollar}{OT1} +\DeclareTextSymbolDefault{\textemdash}{OT1} +\DeclareTextSymbolDefault{\textendash}{OT1} +\DeclareTextSymbolDefault{\textexclamdown}{OT1} +%\DeclareTextSymbolDefault{\texthyphenchar}{OT1} +%\DeclareTextSymbolDefault{\texthyphen}{OT1} +\DeclareTextSymbolDefault{\textquestiondown}{OT1} +\DeclareTextSymbolDefault{\textquotedblleft}{OT1} +\DeclareTextSymbolDefault{\textquotedblright}{OT1} +\DeclareTextSymbolDefault{\textquoteleft}{OT1} +\DeclareTextSymbolDefault{\textquoteright}{OT1} +\DeclareTextSymbolDefault{\textsterling}{OT1} +% \end{macrocode} +% Some symbols from OMS: +% \changes{v1.7t}{1995/11/29}{Added \cs{textbackslash} and +% \cs{textbar}.} +% \changes{v1.8c}{1996/10/27} +% {Added \cs{textasteriskcentered}} +% \changes{v1.95}{2002/06/16}{Added default for \cs{textbardbl} (pr/3400)} +% \begin{macrocode} +\DeclareTextSymbolDefault{\textasteriskcentered}{OMS} +\DeclareTextSymbolDefault{\textbackslash}{OMS} +\DeclareTextSymbolDefault{\textbar}{OMS} +\DeclareTextSymbolDefault{\textbardbl}{OMS} +\DeclareTextSymbolDefault{\textbraceleft}{OMS} +\DeclareTextSymbolDefault{\textbraceright}{OMS} +\DeclareTextSymbolDefault{\textbullet}{OMS} +\DeclareTextSymbolDefault{\textdaggerdbl}{OMS} +\DeclareTextSymbolDefault{\textdagger}{OMS} +\DeclareTextSymbolDefault{\textparagraph}{OMS} +\DeclareTextSymbolDefault{\textperiodcentered}{OMS} +\DeclareTextSymbolDefault{\textsection}{OMS} +\DeclareTextAccentDefault{\textcircled}{OMS} +% \end{macrocode} +% +% \changes{v1.6d}{1994/10/30}{Added OML encoding.} +% \changes{v1.6d}{1994/10/30}{Made \cs{textless} and \cs{textgreater} +% come from OML.} +% \changes{v1.6d}{1994/10/30}{Added \cs{t}.} +% \changes{v1.7k}{1995/06/05}{Commented out \cs{textless} and +% \cs{textgreater}.} +% +% Some symbols from OML: +% \changes{v1.7t}{1995/11/29}{Added \cs{textless} and +% \cs{textgreater}.} +% \begin{macrocode} +\DeclareTextSymbolDefault{\textless}{OML} +\DeclareTextSymbolDefault{\textgreater}{OML} +\DeclareTextAccentDefault{\t}{OML} +% \end{macrocode} +% +% \changes{v1.6d}{1994/10/30}{Added \cs{textcircled}.} +% \changes{v1.6d}{1994/10/30}{Rewrote \cs{copyright} to use +% \cs{textcircled}.} +% \changes{v1.6d}{1994/10/30}{Removed \cs{textregistered}.} +% \changes{v1.7k}{1995/06/05}{Save some tokens in +% \cs{textvisiblespace} and \cs{textunderscore}.} +% \changes{v1.7t}{1995/11/29}{Added \cs{textasciicircum}, +% \cs{textasciitilde}, \cs{textregistered} and \cs{texttrademark}.} +% \changes{v1.7u}{1995/12/01}{Made \cs{SS} a Default, rather than +% having the default point to the OT1 definition.} +% \changes{v1.7w}{1995/12/11}{Modified \cs{copyright}} +% \changes{v1.9a}{1997/04/30}{Introduced \cs{textcopyright} and modified +% \cs{copyright}} +% +% Some defaults we can fake. +% +% The interface for defining |\copyright| changed, it used to +% use |\expandafter| to add braces at the appropriate points. +% \begin{macrocode} +\DeclareTextCommandDefault{\textcopyright}{\textcircled{c}} +% \expandafter\def\expandafter +% \copyright\expandafter{\expandafter{\copyright}} +% \end{macrocode} +% +% \changes{v1.9a}{1997/04/30}{Modified \cs{textunderscore}, removing +% \cs{mathunderscore}} +% \changes{v1.9b}{1997/04/30}{Added \cs{leavevmode} to +% \cs{textunderscore}} +% \changes{v1.9d}{1997/05/07}{Added \cs{leavevmode} to +% \cs{textcompwordmark}} +% \begin{macrocode} +\DeclareTextCommandDefault{\textasciicircum}{\^{}} +\DeclareTextCommandDefault{\textasciitilde}{\~{}} +\DeclareTextCommandDefault{\textcompwordmark}{\leavevmode\kern\z@} +\DeclareTextCommandDefault{\textunderscore}{% + \leavevmode \kern.06em\vbox{\hrule\@width.3em}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCommandDefault{\textvisiblespace}{% + \mbox{\kern.06em\vrule \@height.3ex}% + \vbox{\hrule \@width.3em}% + \hbox{\vrule \@height.3ex}} +% \end{macrocode} +% +% Using |\fontdimen3| in the next definition is some sort of a +% kludge (since it is the interword stretch) but it makes the +% ellipsis come out right in mono-spaced fonts too (since there it +% is zero). +% \begin{macrocode} +\DeclareTextCommandDefault{\textellipsis}{% + .\kern\fontdimen3\font + .\kern\fontdimen3\font + .\kern\fontdimen3\font} +% \end{macrocode} +% +% \changes{v1.9a}{1997/04/30}{Changed \cs{textsc} to \cs{scshape}} +% \changes{v1.95}{2002/06/18}{Changed def for \cs{textregistered} to +% avoid small caps (pr/3420)} +% \begin{macrocode} +%\DeclareTextCommandDefault{\textregistered}{\textcircled{\scshape r}} +\DeclareTextCommandDefault{\textregistered}{\textcircled{% + \check@mathfonts\fontsize\sf@size\z@\math@fontsfalse\selectfont R}} +\DeclareTextCommandDefault{\texttrademark}{\textsuperscript{TM}} +\DeclareTextCommandDefault{\SS}{SS} +% \end{macrocode} +% +% \changes{v1.9n}{1998/03/05}{Added masc/fem ords as in pr/2579} +% \begin{macrocode} +\DeclareTextCommandDefault{\textordfeminine}{\textsuperscript{a}} +\DeclareTextCommandDefault{\textordmasculine}{\textsuperscript{o}} +% \end{macrocode} +% +% \subsubsection{Math material} +% +% Some commands can be used in both text and math mode: +% \begin{macrocode} +\DeclareRobustCommand{\$}{\ifmmode\mathdollar\else\textdollar\fi} +\DeclareRobustCommand{\{}{\ifmmode\lbrace\else\textbraceleft\fi} +\DeclareRobustCommand{\}}{\ifmmode\rbrace\else\textbraceright\fi} +\DeclareRobustCommand{\P}{\ifmmode\mathparagraph\else\textparagraph\fi} +\DeclareRobustCommand{\S}{\ifmmode\mathsection\else\textsection\fi} +\DeclareRobustCommand{\dag}{\ifmmode{\dagger}\else\textdagger\fi} +\DeclareRobustCommand{\ddag}{\ifmmode{\ddagger}\else\textdaggerdbl\fi} +% \end{macrocode} +% +% For historical reasons |\copyright| +% needs |{}| around the definition in maths. +% +% \changes{v1.6f}{1994/11/04}{Added \cmd\_.} +% +% \changes{v1.9a}{1997/04/30}{Modified \cs{underscore}, removing +% \cs{mathunderscore}} +% \changes{v1.9a}{1997/04/30}{Introduced \cs{textcopyright} and modify +% \cs{copyright}} +% \begin{macrocode} +\DeclareRobustCommand{\_}{% + \ifmmode\nfss@text{\textunderscore}\else\textunderscore\fi} +\DeclareRobustCommand{\copyright}{% + \ifmmode{\nfss@text{\textcopyright}}\else\textcopyright\fi} +\DeclareRobustCommand{\pounds}{% + \ifmmode\mathsterling\else\textsterling\fi} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareRobustCommand{\dots}{% + \ifmmode\mathellipsis\else\textellipsis\fi} +% \end{macrocode} +% +% \begin{macrocode} +\let\ldots\dots +% \end{macrocode} +% \changes{v1.99m}{2015/02/16}{Added \cs{textcommabelow} latex/4414} +% Default definition of the commabelow accent. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/10/01}{\textcommabelow}{comma accent}% +%<*2ekernel|latexrelease> +\DeclareTextCommandDefault\textcommabelow[1] + {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex + \hbox{\check@mathfonts\fontsize\ssf@size\z@ + \math@fontsfalse\selectfont,}\hidewidth}\egroup} +%<latexrelease>\EndIncludeInRelease +%</2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{0000/00/00}{\textcommabelow}{comma accent}% +%<latexrelease>\let\textcommabelow\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-G\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-K\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-k\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-L\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-l\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-N\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-n\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-R\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-r\endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \changes{v1.99n}{2015/02/16}{Added \cs{textcommaabove}} +% Default definition of the commaabove accent(E.G.). +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2016/02/01}{\textcommaabove}{comma above}% +%<*2ekernel|latexrelease> +\DeclareTextCommandDefault\textcommaabove[1]{% + \hmode@bgroup + \ooalign{% + \hidewidth + \raise.7ex\hbox{% + \check@mathfonts\fontsize\ssf@size\z@\math@fontsfalse\selectfont`% + }% + \hidewidth\crcr + \null#1\crcr + }% + \egroup +} +%<latexrelease>\EndIncludeInRelease +%</2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{0000/00/00}{\textcommaabove}{comma above}% +%<latexrelease>\let\textcommaabove\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\OT1\string\c-g\endcsname\@undefined +%<latexrelease>\expandafter +%<latexrelease> \let\csname\string\T1\string\c-g\endcsname\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \changes{v1.6d}{1994/10/30}{Moved math commands here from ltmath.} +% \changes{v1.6f}{1994/11/04}{Added \cs{mathunderscore}.} +% \changes{v1.7k}{1995/06/05}{Moved math commands to fontdef.dtx.} +% +% +% \changes{1.4a}{1994/05/01}{Added the \cs{SaveAtCatcode} and +% \cs{RestoreAtCatcode} commands.} +% +% \changes{1.5a}{1994/05/12}{Removed the \cs{SaveAtCatcode} and +% \cs{RestoreAtCatcode} commands.} +% +% +% \subsection{Definitions for the OT1 encoding} +% +% \changes{1.3}{1993/12/17}{Removed all the hackery for use in +% \cs{DeclareFontEncoding}, and redid everything using +% \cs{DeclareTextFoo}.} +% \changes{1.3b}{1993/12/18}{Replaced the missing last argument to +% \cs{DeclareFontEncoding}.} +% \changes{1.3c}{1993/12/18}{Rewrote for the new syntax of +% \cs{EncodingSpecific}.} +% \changes{1.4a}{1994/05/01}{Rewrote for the new syntax.} +% \changes{1.5a}{1994/05/12}{Rewrote for the new syntax.} +% \changes{1.5h}{1994/05/16}{\cs{pounds} was still using u rather than +% ui shape.} +% \changes{1.6b}{1994/10/27}{Added: +% \cs{textemdash} +% \cs{textendash} +% \cs{textexclamdown} +% \cs{texthyphenchar} +% \cs{texthyphen} +% \cs{textquestiondown} +% \cs{textquotedblleft} +% \cs{textquotedblright} +% \cs{textquoteleft} +% \cs{textquoteright} +% } +% +% The definitions for the `\TeX{} text' (OT1) encoding. +% +% Declare the encoding. +% \begin{macrocode} +%<*OT1> +\DeclareFontEncoding{OT1}{}{} +% \end{macrocode} +% Declare the accents. +% \begin{macrocode} +\DeclareTextAccent{\"}{OT1}{127} +\DeclareTextAccent{\'}{OT1}{19} +\DeclareTextAccent{\.}{OT1}{95} +\DeclareTextAccent{\=}{OT1}{22} +\DeclareTextAccent{\^}{OT1}{94} +\DeclareTextAccent{\`}{OT1}{18} +\DeclareTextAccent{\~}{OT1}{126} +\DeclareTextAccent{\H}{OT1}{125} +\DeclareTextAccent{\u}{OT1}{21} +\DeclareTextAccent{\v}{OT1}{20} +\DeclareTextAccent{\r}{OT1}{23} +% \end{macrocode} +% Some accents have to be built by hand: +% Note that |\ooalign| and |\o@lign| must be inside a group. +% \changes{v1.7j}{1995/05/21}{Updated some plain macros} +% \changes{v1.7o}{1995/11/07}{Added \cs{leavevmode} at start of +% \cs{c}, otherwise the output routine might be invoked within the +% macro.} +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \changes{v1.99g}{2005/09/27}{Replace \cs{sh@ft} by \cs{ltx@sh@ft}} +% In these definitions we no longer use the helper function |\sh@ft| +% from plain.tex since that now has two incompatible definitions. +% \begin{macrocode} +\DeclareTextCommand{\b}{OT1}[1] + {\hmode@bgroup\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-3ex}% + \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}\egroup} +\DeclareTextCommand{\c}{OT1}[1] + {\leavevmode\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% + \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi} +\DeclareTextCommand{\d}{OT1}[1] + {\hmode@bgroup + \o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup} +% \end{macrocode} +% +% Declare the text symbols. +% \begin{macrocode} +\DeclareTextSymbol{\AE}{OT1}{29} +\DeclareTextSymbol{\OE}{OT1}{30} +\DeclareTextSymbol{\O}{OT1}{31} +\DeclareTextSymbol{\ae}{OT1}{26} +\DeclareTextSymbol{\i}{OT1}{16} +\DeclareTextSymbol{\j}{OT1}{17} +\DeclareTextSymbol{\oe}{OT1}{27} +\DeclareTextSymbol{\o}{OT1}{28} +\DeclareTextSymbol{\ss}{OT1}{25} +\DeclareTextSymbol{\textemdash}{OT1}{124} +\DeclareTextSymbol{\textendash}{OT1}{123} +% \end{macrocode} +% Using the ligatures helps with OT1 fonts that have +% |\textexclamdown| and |\textquestiondown| in unusual positions. +% \changes{v1.95}{2002/06/17}{Definition of \cs{textexclamdown} changed (pr/3368)} +% \changes{v1.95}{2002/06/17}{Definition of \cs{textquestiondown} changed (pr/3368)} +% \begin{macrocode} +%\DeclareTextSymbol{\textexclamdown}{OT1}{60} +%\DeclareTextSymbol{\textquestiondown}{OT1}{62} +\DeclareTextCommand{\textexclamdown}{OT1}{!`} +\DeclareTextCommand{\textquestiondown}{OT1}{?`} +%\DeclareTextSymbol{\texthyphenchar}{OT1}{`\-} +%\DeclareTextSymbol{\texthyphen}{OT1}{`\-} +\DeclareTextSymbol{\textquotedblleft}{OT1}{92} +\DeclareTextSymbol{\textquotedblright}{OT1}{`\"} +\DeclareTextSymbol{\textquoteleft}{OT1}{`\`} +\DeclareTextSymbol{\textquoteright}{OT1}{`\'} +% \end{macrocode} +% Some symbols which are faked from others: +% \changes{v1.7o}{1995/11/07}{Changed \cs{char}32 to \cs{@xxxii} (two +% tokens less).} +% \changes{v1.7o}{1995/11/07}{Replaced octal number 27 by decimal +% number 23 to protect against the quote character being active.} +% \changes{v1.7o}{1995/11/07}{Replaced some 0's by \cs{z@} (faster).} +% \changes{v1.8c}{1996/10/27} +% {Removed \cs{aa} and \cs{AA}} +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \begin{macrocode} +% \DeclareTextCommand{\aa}{OT1} +% {{\accent23a}} +\DeclareTextCommand{\L}{OT1} + {\leavevmode\setbox\z@\hbox{L}\hb@xt@\wd\z@{\hss\@xxxii L}} +\DeclareTextCommand{\l}{OT1} + {\hmode@bgroup\@xxxii l\egroup} +% \DeclareTextCommand{\AA}{OT1} +% {\leavevmode\setbox\z@\hbox{h}\dimen@\ht\z@\advance\dimen@-1ex% +% \rlap{\raise.67\dimen@\hbox{\char23}}A} +% \end{macrocode} +% In the OT1 encoding \r A has a hand-crafted definition, so we +% have here the first recorded explicit use of +% |\DeclareTextCompositeCommand|. +% \changes{v1.8c}{1996/10/27} +% {Added \cs{r} A} +% \changes{v1.96}{2002/10/28}{% +% coding change, to follow bug fix by DEK in plain.tex (pr/3469)} +% \changes{v2.0f}{2017/02/19}{% +% add \cs{@empty} to guard against 3rd argument being empty} +% \begin{macrocode} +\DeclareTextCompositeCommand{\r}{OT1}{A} + {\leavevmode\setbox\z@\hbox{!}\dimen@\ht\z@\advance\dimen@-1ex% + \rlap{\raise.67\dimen@\hbox{\char23}}A} +% \end{macrocode} +% \changes{v1.99h}{2005/11/08} +% {Added \cs{ij} and \cs{IJ} from babel. (pr/3771)} +% The dutch language uses the letter `ij'. It is available in +% \texttt{T1} encoded fonts, but not in the \texttt{OT1} encoded +% fonts. Therefor we fake it for the \texttt{OT1} encoding. +% \begin{macrocode} +\DeclareTextCommand{\ij}{OT1}{% + \nobreak\hskip\z@skip i\kern-0.02em j\nobreak\hskip\z@skip} +\DeclareTextCommand{\IJ}{OT1}{% + \nobreak\hskip\z@skip I\kern-0.02em J\nobreak\hskip\z@skip} +% \end{macrocode} +% In the OT1 encoding, \pounds~and \$ share a slot. +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \begin{macrocode} +\DeclareTextCommand{\textdollar}{OT1}{\hmode@bgroup + \ifdim \fontdimen\@ne\font >\z@ + \slshape + \else + \upshape + \fi + \char`\$\egroup} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCommand{\textsterling}{OT1}{\hmode@bgroup + \ifdim \fontdimen\@ne\font >\z@ + \itshape + \else + \fontshape{ui}\selectfont + \fi + \char`\$\egroup} +% \end{macrocode} +% +% Here we are adding some more composite commands to the |OT1| +% encoding. This makes the use of certain accents with |i| +% compatible with their use with the |T1| encoding; this +% enables them to become true \LaTeX{} internal representations. +% However, it will make these accents work a little less fast since +% a check will always be made for the existence of a composite. +% +% \changes{v1.93}{2001/05/28}{Added composites for compatibility with +% T1, pr/3295} +% \changes{v1.94}{2001/06/05}{Text composite Commands need kludges for +% `,' -- see tlb1903.lvt} +% \begin{macrocode} +\DeclareTextComposite{\.}{OT1}{i}{`\i} +\DeclareTextComposite{\.}{OT1}{\i}{`\i} +\DeclareTextCompositeCommand{\`}{OT1}{i}{\@tabacckludge`\i} +\DeclareTextCompositeCommand{\'}{OT1}{i}{\@tabacckludge'\i} +\DeclareTextCompositeCommand{\^}{OT1}{i}{\^\i} +\DeclareTextCompositeCommand{\"}{OT1}{i}{\"\i} +% \end{macrocode} +% +% T1 encoding is given more extensive set of overloads for \verb|\c| +% But here we just adjust \verb|\c{g}|. +% \changes{v1.99n}{2015/02/16}{Added composites for \cs{c}} +% \changes{v1.99m}{2016/06/19}{OT1 definition (was duplicate T1 definition)} +% \begin{macrocode} +\ifx\textcommaabove\@undefined\else +\DeclareTextCompositeCommand{\c}{OT1}{g}{\textcommaabove{g}} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</OT1> +% \end{macrocode} +% +% \subsection{Definitions for the T1 encoding} +% +% \changes{1.3}{1993/12/17}{Removed all the hackery for use in +% \cs{DeclareFontEncoding}, and redid everything using +% \cs{DeclareTextFoo}.} +% \changes{1.3b}{1993/12/18}{Replaced the missing last argument to +% \cs{DeclareFontEncoding}.} +% \changes{1.3c}{1993/12/18}{Rewrote for the new syntax of +% \cs{EncodingSpecific}.} +% \changes{1.4a}{1994/05/01}{Rewrote for the new syntax.} +% \changes{1.5a}{1994/05/12}{Rewrote for the new syntax.} +% \changes{1.6a}{1994/10/25}{Added \cs{textdollar}, +% \cs{textlbrace}, \cs{textrbrace}, \cs{textsterling}, +% \cs{textunderline}.} +% \changes{1.6a}{1994/10/25}{Removed +% \cs{textlbrace}, \cs{textrbrace}, \cs{textunderline} to give them +% their proper names.} +% \changes{1.6b}{1994/10/27}{Added +% \cs{textasciicircum} +% \cs{textasciitilde} +% \cs{textbackslash} +% \cs{textbar} +% \cs{textbraceleft} +% \cs{textbraceright} +% \cs{textcompwordmark} +% \cs{textemdash} +% \cs{textendash} +% \cs{textexclamdown} +% \cs{textgreater} +% \cs{texthyphenchar} +% \cs{texthyphen} +% \cs{textless} +% \cs{textquestiondown} +% \cs{textquotedblleft} +% \cs{textquotedblright} +% \cs{textquotedbl} +% \cs{textquoteleft} +% \cs{textquoteright} +% \cs{textunderscore} +% \cs{textvisiblespace} +% } +% \changes{v1.9h}{1997/12/17} +% {Added \cs{textperthousand} and \cs{textpertenthousand}} +% +% The definitions for the `Extended \TeX{} text' (T1) encoding. +% +% Declare the encoding. +% \begin{macrocode} +%<*T1> +\DeclareFontEncoding{T1}{}{} +% \end{macrocode} +% Declare the accents. +% \begin{macrocode} +\DeclareTextAccent{\`}{T1}{0} +\DeclareTextAccent{\'}{T1}{1} +\DeclareTextAccent{\^}{T1}{2} +\DeclareTextAccent{\~}{T1}{3} +\DeclareTextAccent{\"}{T1}{4} +\DeclareTextAccent{\H}{T1}{5} +\DeclareTextAccent{\r}{T1}{6} +\DeclareTextAccent{\v}{T1}{7} +\DeclareTextAccent{\u}{T1}{8} +\DeclareTextAccent{\=}{T1}{9} +\DeclareTextAccent{\.}{T1}{10} +% \end{macrocode} +% Some accents have to be built by hand. +% Note that |\ooalign| and |\o@lign| must be inside a group. +% \changes{v1.9h}{1997/12/17}{As in OT1, Added \cs{leavevmode} at +% start of \cs{c}, otherwise the output routine might be invoked +% within the macro.} +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \changes{v1.95}{2002/06/17}{Corrected \cs{c} for T1 (pr/3442)} +% \changes{v1.99b}{2004/01/03}{Use \cs{ooalign} for \cs{k} (pr/3532)} +% \changes{v1.99b}{2004/01/03}{Added \cs{textogonekcentered} (pr/3532)} +% \changes{v1.99c}{2004/01/04}{More adjustments for ogonek (pr/3532)} +% \changes{v1.99g}{2005/09/27}{Replace \cs{sh@ft} by \cs{ltx@sh@ft}} +% In these definitions we no longer use the helper function |\sh@ft| +% from plain.tex since that now has two incompatible definitions. +% \begin{macrocode} +\DeclareTextCommand{\b}{T1}[1] + {\hmode@bgroup\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-3ex}% + \vbox to.2ex{\hbox{\char9}\vss}\hidewidth}\egroup} +\DeclareTextCommand{\c}{T1}[1] + {\leavevmode\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent11 #1% + \else{\ooalign{\unhbox\z@\crcr + \hidewidth\char11\hidewidth}}\fi} +\DeclareTextCommand{\d}{T1}[1] + {\hmode@bgroup + \o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup} +\DeclareTextCommand{\k}{T1}[1] + {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\char12}\egroup} +\DeclareTextCommand{\textogonekcentered}{T1}[1] + {\hmode@bgroup\ooalign{% + \null#1\crcr\hidewidth\char12\hidewidth}\egroup} +% \end{macrocode} +% +% Some symbols are constructed. +% +% \changes{v1.9h}{1997/12/17} +% {Added \cs{textperthousand} and \cs{textpertenthousand}} +% Slot 24 contains a small circle intended for construction of +% these two glyphs. +% +% \begin{macrocode} +\DeclareTextCommand{\textperthousand}{T1} + {\%\char 24 } % space or `relax as delimiter? +\DeclareTextCommand{\textpertenthousand}{T1} + {\%\char 24\char 24 } % space or `relax as delimiter? +% \end{macrocode} +% +% For Maltese, \cs{Hwithstroke} and \cs{hwithstroke} are needed. +% +% \changes{v2.0k}{2018/11/19} +% {Added \cs{Hwithstroke} and \cs{hwithstroke}} +% +% \begin{macrocode} +\DeclareTextCommand{\Hwithstroke}{T1} + {% + \hmode@bgroup + \vphantom{H}% + \sbox\z@{H}% + \ooalign{% + H\cr + \hidewidth + \vrule + height \dimexpr 0.7\ht\z@+0.1ex\relax + depth -0.7\ht\z@ + width 0.8\wd\z@ + \hidewidth\cr + }% + \egroup + } +\DeclareTextCommand{\hwithstroke}{T1} + {% + \hmode@bgroup + \vphantom{h}% + \sbox\z@{h}% + \ooalign{% + h\cr + \kern0.075\wd\z@ + \vrule + height \dimexpr 0.7\ht\z@+0.1ex\relax + depth -0.7\ht\z@ + width 0.4\wd\z@ + \hidewidth\cr + }% + \egroup + } +% \end{macrocode} +% +% Declare the text symbols. +% \changes{v1.7t}{1995/11/29}{Added \cs{textasciicircum}, +% \cs{textasciitilde}, \cs{textbackslash}, \cs{textbar}, +% \cs{textgreater} and \cs{textless}.} +% \changes{v1.8c}{1996/10/27} +% {Removed \cs{aa} and \cs{AA}} +% \changes{v1.99h}{2005/11/08} +% {Added \cs{ij} and \cs{IJ} from babel. (pr/3771)} +% +% \begin{macrocode} +%\DeclareTextSymbol{\AA}{T1}{197} +\DeclareTextSymbol{\AE}{T1}{198} +\DeclareTextSymbol{\DH}{T1}{208} +\DeclareTextSymbol{\DJ}{T1}{208} +\DeclareTextSymbol{\L}{T1}{138} +\DeclareTextSymbol{\NG}{T1}{141} +\DeclareTextSymbol{\OE}{T1}{215} +\DeclareTextSymbol{\O}{T1}{216} +\DeclareTextSymbol{\SS}{T1}{223} +\DeclareTextSymbol{\TH}{T1}{222} +%\DeclareTextSymbol{\aa}{T1}{229} +\DeclareTextSymbol{\ae}{T1}{230} +\DeclareTextSymbol{\dh}{T1}{240} +\DeclareTextSymbol{\dj}{T1}{158} +% \end{macrocode} +% \changes{v2.0j}{2018/08/11}{Provide \cs{guillemetleft} and \cs{guillemetright}} +% \begin{macrocode} +\DeclareTextSymbol{\guillemetleft}{T1}{19} +\DeclareTextSymbol{\guillemetright}{T1}{20} +% old Adobe names +\DeclareTextSymbol{\guillemotleft}{T1}{19} +\DeclareTextSymbol{\guillemotright}{T1}{20} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextSymbol{\guilsinglleft}{T1}{14} +\DeclareTextSymbol{\guilsinglright}{T1}{15} +\DeclareTextSymbol{\i}{T1}{25} +\DeclareTextSymbol{\j}{T1}{26} +\DeclareTextSymbol{\ij}{T1}{188} +\DeclareTextSymbol{\IJ}{T1}{156} +\DeclareTextSymbol{\l}{T1}{170} +\DeclareTextSymbol{\ng}{T1}{173} +\DeclareTextSymbol{\oe}{T1}{247} +\DeclareTextSymbol{\o}{T1}{248} +\DeclareTextSymbol{\quotedblbase}{T1}{18} +\DeclareTextSymbol{\quotesinglbase}{T1}{13} +\DeclareTextSymbol{\ss}{T1}{255} +\DeclareTextSymbol{\textasciicircum}{T1}{`\^} +\DeclareTextSymbol{\textasciitilde}{T1}{`\~} +\DeclareTextSymbol{\textbackslash}{T1}{`\\} +\DeclareTextSymbol{\textbar}{T1}{`\|} +\DeclareTextSymbol{\textbraceleft}{T1}{`\{} +\DeclareTextSymbol{\textbraceright}{T1}{`\}} +\DeclareTextSymbol{\textcompwordmark}{T1}{23} +\DeclareTextSymbol{\textdollar}{T1}{`\$} +\DeclareTextSymbol{\textemdash}{T1}{22} +\DeclareTextSymbol{\textendash}{T1}{21} +\DeclareTextSymbol{\textexclamdown}{T1}{189} +\DeclareTextSymbol{\textgreater}{T1}{`\>} +%\DeclareTextSymbol{\texthyphenchar}{T1}{127} +%\DeclareTextSymbol{\texthyphen}{T1}{`\-} +\DeclareTextSymbol{\textless}{T1}{`\<} +\DeclareTextSymbol{\textquestiondown}{T1}{190} +\DeclareTextSymbol{\textquotedblleft}{T1}{16} +\DeclareTextSymbol{\textquotedblright}{T1}{17} +\DeclareTextSymbol{\textquotedbl}{T1}{`\"} +\DeclareTextSymbol{\textquoteleft}{T1}{`\`} +\DeclareTextSymbol{\textquoteright}{T1}{`\'} +\DeclareTextSymbol{\textsection}{T1}{159} +\DeclareTextSymbol{\textsterling}{T1}{191} +\DeclareTextSymbol{\textunderscore}{T1}{95} +\DeclareTextSymbol{\textvisiblespace}{T1}{32} +\DeclareTextSymbol{\th}{T1}{254} +% \end{macrocode} +% Declare the composites. +% \changes{v1.93}{2001/05/28}{Changed the effect of +% \cs{.}\cs{i}, pr/3295} +% \begin{macrocode} +\DeclareTextComposite{\.}{T1}{i}{`\i} +\DeclareTextComposite{\.}{T1}{\i}{`\i} +% \end{macrocode} +% \changes{v1.9c}{1997/05/04}{Added `hex index tabs'} +% "80 = 128 +% \begin{macrocode} +\DeclareTextComposite{\u}{T1}{A}{128} +\DeclareTextComposite{\k}{T1}{A}{129} +\DeclareTextComposite{\'}{T1}{C}{130} +\DeclareTextComposite{\v}{T1}{C}{131} +\DeclareTextComposite{\v}{T1}{D}{132} +\DeclareTextComposite{\v}{T1}{E}{133} +\DeclareTextComposite{\k}{T1}{E}{134} +\DeclareTextComposite{\u}{T1}{G}{135} +% \end{macrocode} +% "88 = 136 +% \begin{macrocode} +\DeclareTextComposite{\'}{T1}{L}{136} +\DeclareTextComposite{\v}{T1}{L}{137} +\DeclareTextComposite{\'}{T1}{N}{139} +\DeclareTextComposite{\v}{T1}{N}{140} +\DeclareTextComposite{\H}{T1}{O}{142} +\DeclareTextComposite{\'}{T1}{R}{143} +% \end{macrocode} +% "90 = 144 +% \begin{macrocode} +\DeclareTextComposite{\v}{T1}{R}{144} +\DeclareTextComposite{\'}{T1}{S}{145} +\DeclareTextComposite{\v}{T1}{S}{146} +\DeclareTextComposite{\c}{T1}{S}{147} +\DeclareTextComposite{\v}{T1}{T}{148} +\DeclareTextComposite{\c}{T1}{T}{149} +\DeclareTextComposite{\H}{T1}{U}{150} +\DeclareTextComposite{\r}{T1}{U}{151} +% \end{macrocode} +% "98 = 152 +% \begin{macrocode} +\DeclareTextComposite{\"}{T1}{Y}{152} +\DeclareTextComposite{\'}{T1}{Z}{153} +\DeclareTextComposite{\v}{T1}{Z}{154} +\DeclareTextComposite{\.}{T1}{Z}{155} +\DeclareTextComposite{\.}{T1}{I}{157} +% \end{macrocode} +% "A0 = 160 +% \begin{macrocode} +\DeclareTextComposite{\u}{T1}{a}{160} +\DeclareTextComposite{\k}{T1}{a}{161} +\DeclareTextComposite{\'}{T1}{c}{162} +\DeclareTextComposite{\v}{T1}{c}{163} +\DeclareTextComposite{\v}{T1}{d}{164} +\DeclareTextComposite{\v}{T1}{e}{165} +\DeclareTextComposite{\k}{T1}{e}{166} +\DeclareTextComposite{\u}{T1}{g}{167} +% \end{macrocode} +% "A8 = 168 +% \begin{macrocode} +\DeclareTextComposite{\'}{T1}{l}{168} +\DeclareTextComposite{\v}{T1}{l}{169} +\DeclareTextComposite{\'}{T1}{n}{171} +\DeclareTextComposite{\v}{T1}{n}{172} +\DeclareTextComposite{\H}{T1}{o}{174} +\DeclareTextComposite{\'}{T1}{r}{175} +% \end{macrocode} +% "B0 = 176 +% \begin{macrocode} +\DeclareTextComposite{\v}{T1}{r}{176} +\DeclareTextComposite{\'}{T1}{s}{177} +\DeclareTextComposite{\v}{T1}{s}{178} +\DeclareTextComposite{\c}{T1}{s}{179} +\DeclareTextComposite{\v}{T1}{t}{180} +\DeclareTextComposite{\c}{T1}{t}{181} +\DeclareTextComposite{\H}{T1}{u}{182} +\DeclareTextComposite{\r}{T1}{u}{183} +% \end{macrocode} +% "B8 = 184 +% \begin{macrocode} +\DeclareTextComposite{\"}{T1}{y}{184} +\DeclareTextComposite{\'}{T1}{z}{185} +\DeclareTextComposite{\v}{T1}{z}{186} +\DeclareTextComposite{\.}{T1}{z}{187} +% \end{macrocode} +% "C0 = 192 +% \begin{macrocode} +\DeclareTextComposite{\`}{T1}{A}{192} +\DeclareTextComposite{\'}{T1}{A}{193} +\DeclareTextComposite{\^}{T1}{A}{194} +\DeclareTextComposite{\~}{T1}{A}{195} +\DeclareTextComposite{\"}{T1}{A}{196} +\DeclareTextComposite{\r}{T1}{A}{197} +\DeclareTextComposite{\c}{T1}{C}{199} +% \end{macrocode} +% "C8 = 200 +% \begin{macrocode} +\DeclareTextComposite{\`}{T1}{E}{200} +\DeclareTextComposite{\'}{T1}{E}{201} +\DeclareTextComposite{\^}{T1}{E}{202} +\DeclareTextComposite{\"}{T1}{E}{203} +\DeclareTextComposite{\`}{T1}{I}{204} +\DeclareTextComposite{\'}{T1}{I}{205} +\DeclareTextComposite{\^}{T1}{I}{206} +\DeclareTextComposite{\"}{T1}{I}{207} +% \end{macrocode} +% "D0 = 208 +% \begin{macrocode} +\DeclareTextComposite{\~}{T1}{N}{209} +\DeclareTextComposite{\`}{T1}{O}{210} +\DeclareTextComposite{\'}{T1}{O}{211} +\DeclareTextComposite{\^}{T1}{O}{212} +\DeclareTextComposite{\~}{T1}{O}{213} +\DeclareTextComposite{\"}{T1}{O}{214} +% \end{macrocode} +% "D8 = 216 +% \begin{macrocode} +\DeclareTextComposite{\`}{T1}{U}{217} +\DeclareTextComposite{\'}{T1}{U}{218} +\DeclareTextComposite{\^}{T1}{U}{219} +\DeclareTextComposite{\"}{T1}{U}{220} +\DeclareTextComposite{\'}{T1}{Y}{221} +% \end{macrocode} +% "E0 = 224 +% \begin{macrocode} +\DeclareTextComposite{\`}{T1}{a}{224} +\DeclareTextComposite{\'}{T1}{a}{225} +\DeclareTextComposite{\^}{T1}{a}{226} +\DeclareTextComposite{\~}{T1}{a}{227} +\DeclareTextComposite{\"}{T1}{a}{228} +\DeclareTextComposite{\r}{T1}{a}{229} +\DeclareTextComposite{\c}{T1}{c}{231} +% \end{macrocode} +% "E8 = 232 +% \begin{macrocode} +\DeclareTextComposite{\`}{T1}{e}{232} +\DeclareTextComposite{\'}{T1}{e}{233} +\DeclareTextComposite{\^}{T1}{e}{234} +\DeclareTextComposite{\"}{T1}{e}{235} +\DeclareTextComposite{\`}{T1}{i}{236} +\DeclareTextComposite{\`}{T1}{\i}{236} +\DeclareTextComposite{\'}{T1}{i}{237} +\DeclareTextComposite{\'}{T1}{\i}{237} +\DeclareTextComposite{\^}{T1}{i}{238} +\DeclareTextComposite{\^}{T1}{\i}{238} +\DeclareTextComposite{\"}{T1}{i}{239} +\DeclareTextComposite{\"}{T1}{\i}{239} +% \end{macrocode} +% "F0 = 240 +% \begin{macrocode} +\DeclareTextComposite{\~}{T1}{n}{241} +\DeclareTextComposite{\`}{T1}{o}{242} +\DeclareTextComposite{\'}{T1}{o}{243} +\DeclareTextComposite{\^}{T1}{o}{244} +\DeclareTextComposite{\~}{T1}{o}{245} +\DeclareTextComposite{\"}{T1}{o}{246} +% \end{macrocode} +% "F8 = 248 +% \begin{macrocode} +\DeclareTextComposite{\`}{T1}{u}{249} +\DeclareTextComposite{\'}{T1}{u}{250} +\DeclareTextComposite{\^}{T1}{u}{251} +\DeclareTextComposite{\"}{T1}{u}{252} +\DeclareTextComposite{\'}{T1}{y}{253} +% \end{macrocode} +% \changes{v1.99b}{2004/01/03}{Added composites for \cs{k} (pr/3532)} +% \begin{macrocode} +\DeclareTextCompositeCommand{\k}{T1}{o}{\textogonekcentered{o}} +\DeclareTextCompositeCommand{\k}{T1}{O}{\textogonekcentered{O}} +% \end{macrocode} +% \changes{v1.99n}{2015/02/16}{Added composites for \c{c}} +% \begin{macrocode} +\ifx\textcommaabove\@undefined\else +\DeclareTextCompositeCommand{\c}{T1}{g}{\textcommaabove{g}} +\fi +\ifx\textcommabelow\@undefined\else +\DeclareTextCompositeCommand{\c}{T1}{G}{\textcommabelow{G}} +\DeclareTextCompositeCommand{\c}{T1}{K}{\textcommabelow{K}} +\DeclareTextCompositeCommand{\c}{T1}{k}{\textcommabelow{k}} +\DeclareTextCompositeCommand{\c}{T1}{L}{\textcommabelow{L}} +\DeclareTextCompositeCommand{\c}{T1}{l}{\textcommabelow{l}} +\DeclareTextCompositeCommand{\c}{T1}{N}{\textcommabelow{N}} +\DeclareTextCompositeCommand{\c}{T1}{n}{\textcommabelow{n}} +\DeclareTextCompositeCommand{\c}{T1}{R}{\textcommabelow{R}} +\DeclareTextCompositeCommand{\c}{T1}{r}{\textcommabelow{r}} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</T1> +% \end{macrocode} +% +% \changes{1.4a}{1994/05/01}{Removed the uc/lc table settings, since +% the T1 uc/lc table is now the default.} +% +% \subsection{Definitions for the OMS encoding} +% +% \changes{v1.6a}{1994/10/25}{Added the OMS encoding.} +% \changes{v1.6b}{1994/10/27}{Renamed \cs{textlbrace} to +% \cs{textbraceleft} and \cs{textrbrace} to \cs{textbraceright}.} +% \changes{v1.6b}{1994/10/27}{Added \cs{textbackslash}.} +% \changes{v1.6d}{1994/10/30}{Added \cs{textcircled}.} +% +% The definitions for the `\TeX{} math symbol' (OMS) encoding. Even +% though this is meant to be a math font, it includes some of the +% standard \LaTeX{} text symbols. +% +% Declare the encoding. +% \begin{macrocode} +%<*OMS> +\DeclareFontEncoding{OMS}{}{} +% \end{macrocode} +% Declare the symbols. +% \changes{v1.7t}{1995/11/29}{Added \cs{textbackslash} and +% \cs{textbar}.} +% \changes{v1.8c}{1996/10/27} +% {Added \cs{textasteriskcentered}} +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \changes{v1.95}{2002/06/16}{Added \cs{textbardbl} (pr/3400)} +% \changes{v1.99}{2004/02/02}{Added \cs{textbigcircle}} +% Note that slot 13 has in places been named |\Orb|: please root +% out and destroy this impolity wherever you find it! +% \begin{macrocode} +\DeclareTextSymbol{\textasteriskcentered}{OMS}{3} % "03 +\DeclareTextSymbol{\textbackslash}{OMS}{110} % "6E +\DeclareTextSymbol{\textbar}{OMS}{106} % "6A +\DeclareTextSymbol{\textbardbl}{OMS}{107} % "6B +\DeclareTextSymbol{\textbraceleft}{OMS}{102} % "66 +\DeclareTextSymbol{\textbraceright}{OMS}{103} % "67 +\DeclareTextSymbol{\textbullet}{OMS}{15} % "0F +\DeclareTextSymbol{\textdaggerdbl}{OMS}{122} % "7A +\DeclareTextSymbol{\textdagger}{OMS}{121} % "79 +\DeclareTextSymbol{\textparagraph}{OMS}{123} % "7B +\DeclareTextSymbol{\textperiodcentered}{OMS}{1} % "01 +\DeclareTextSymbol{\textsection}{OMS}{120} % "78 +\DeclareTextSymbol{\textbigcircle}{OMS}{13} % "0D +\DeclareTextCommand{\textcircled}{OMS}[1]{\hmode@bgroup + \ooalign{% + \hfil \raise .07ex\hbox {\upshape#1}\hfil \crcr + \char 13 % "0D + }% + \egroup} +%</OMS> +% \end{macrocode} +% +% \subsection{Definitions for the OML encoding} +% +% \changes{v1.6d}{1994/10/30}{Added the OML encoding.} +% +% The definitions for the `\TeX{} math italic' (OML) encoding. Even +% though this is meant to be a math font, it includes some of the +% standard \LaTeX{} text symbols. +% +% Declare the encoding. +% \begin{macrocode} +%<*OML> +\DeclareFontEncoding{OML}{}{} +% \end{macrocode} +% Declare the symbols. +% \changes{v1.7t}{1995/11/29}{Added \cs{textless} and +% \cs{textgreater}.} +% \changes{v1.9h}{1997/12/17}{Changed to decimal codes.} +% \changes{v1.9m}{1998/01/16}{fixed decimal codes. latex/2734} +% \begin{macrocode} +\DeclareTextSymbol{\textless}{OML}{`\<} +\DeclareTextSymbol{\textgreater}{OML}{`\>} +\DeclareTextAccent{\t}{OML}{127} % "7F +%</OML> +% \end{macrocode} +% +% \subsection{Definitions for the OT4 encoding} +% +% These definitions are for the Polish extension to the +% `\TeX\ text' (OT1) encoding. +% This encoding was created by B.~Jackowski and M.~Ry\'cko +% for use with the Polish version of Computer Modern and Computer +% Concrete. In positions 0--127 it is identical to OT1 but it +% contains some additional characters in the upper half. The \LaTeX{} +% support was developed by Mariusz Olko. +% +% The PL fonts that use it are available as follows:\\ +% Metafont sources +% \texttt{ftp://ftp.gust.org.pl/TeX/language/polish/pl-mf.zip}; +% +% Font files +% \texttt{ftp://ftp.gust.org.pl/TeX/language/polish/pl-tfm.zip}. +% +% Declare the encoding. +% \begin{macrocode} +%<*OT4> +\DeclareFontEncoding{OT4}{}{} +\DeclareFontSubstitution{OT4}{cmr}{m}{n} +% \end{macrocode} +% Declare the accents. +% \begin{macrocode} +\DeclareTextAccent{\"}{OT4}{127} +\DeclareTextAccent{\'}{OT4}{19} +\DeclareTextAccent{\.}{OT4}{95} +\DeclareTextAccent{\=}{OT4}{22} +\DeclareTextAccent{\^}{OT4}{94} +\DeclareTextAccent{\`}{OT4}{18} +\DeclareTextAccent{\~}{OT4}{126} +\DeclareTextAccent{\H}{OT4}{125} +\DeclareTextAccent{\u}{OT4}{21} +\DeclareTextAccent{\v}{OT4}{20} +\DeclareTextAccent{\r}{OT4}{23} +% \end{macrocode} +% The ogonek accent is available only under a e A \& E. But we +% have to provide some definition for \cs{k}. Some other accents +% have to be built by hand as in OT1: +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \begin{macrocode} +\DeclareTextCommand{\k}{OT4}[1]{% + \TextSymbolUnavailable{\k{#1}}#1} +% \end{macrocode} +% In these definitions we no longer use the helper function |\sh@ft| +% from plain.tex since that now has two incompatible definitions. +% \changes{v1.99g}{2005/09/27}{Replace \cs{sh@ft} by \cs{ltx@sh@ft}} +% \begin{macrocode} +\DeclareTextCommand{\b}{OT4}[1] + {\hmode@bgroup\o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-3ex}% + \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}\egroup} +\DeclareTextCommand{\c}{OT4}[1] + {\leavevmode\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% + \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi} +\DeclareTextCommand{\d}{OT4}[1] + {\hmode@bgroup + \o@lign{\relax#1\crcr\hidewidth\ltx@sh@ft{-1ex}.\hidewidth}\egroup} +% \end{macrocode} +% Declare the text symbols. +% \begin{macrocode} +\DeclareTextSymbol{\AE}{OT4}{29} +\DeclareTextSymbol{\OE}{OT4}{30} +\DeclareTextSymbol{\O}{OT4}{31} +\DeclareTextSymbol{\L}{OT4}{138} +\DeclareTextSymbol{\ae}{OT4}{26} +% \end{macrocode} +% \changes{v2.0j}{2018/08/11}{Provide \cs{guillemetleft} and \cs{guillemetright}} +% \begin{macrocode} +\DeclareTextSymbol{\guillemetleft}{OT4}{174} +\DeclareTextSymbol{\guillemetright}{OT4}{175} +% old Adobe names +\DeclareTextSymbol{\guillemotleft}{OT4}{174} +\DeclareTextSymbol{\guillemotright}{OT4}{175} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextSymbol{\i}{OT4}{16} +\DeclareTextSymbol{\j}{OT4}{17} +\DeclareTextSymbol{\l}{OT4}{170} +\DeclareTextSymbol{\o}{OT4}{28} +\DeclareTextSymbol{\oe}{OT4}{27} +\DeclareTextSymbol{\quotedblbase}{OT4}{255} +\DeclareTextSymbol{\ss}{OT4}{25} +\DeclareTextSymbol{\textemdash}{OT4}{124} +\DeclareTextSymbol{\textendash}{OT4}{123} +\DeclareTextSymbol{\textexclamdown}{OT4}{60} +%\DeclareTextSymbol{\texthyphenchar}{OT4}{`\-} +%\DeclareTextSymbol{\texthyphen}{OT4}{`\-} +\DeclareTextSymbol{\textquestiondown}{OT4}{62} +\DeclareTextSymbol{\textquotedblleft}{OT4}{92} +\DeclareTextSymbol{\textquotedblright}{OT4}{`\"} +\DeclareTextSymbol{\textquoteleft}{OT4}{`\`} +\DeclareTextSymbol{\textquoteright}{OT4}{`\'} +% \end{macrocode} +% Definition for \r A as in OT1: +% \changes{v1.96}{2002/10/28}{% +% coding change, to follow bug fix by DEK in plain.tex (pr/3469)} +% \begin{macrocode} +\DeclareTextCompositeCommand{\r}{OT4}{A} + {\leavevmode\setbox\z@\hbox{!}\dimen@\ht\z@\advance\dimen@-1ex% + \rlap{\raise.67\dimen@\hbox{\char23}}A} +% \end{macrocode} +% In the OT4 encoding, \pounds~and \$ share a slot. +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \begin{macrocode} +\DeclareTextCommand{\textdollar}{OT4}{\hmode@bgroup + \ifdim \fontdimen\@ne\font >\z@ + \slshape + \else + \upshape + \fi + \char`\$\egroup} +\DeclareTextCommand{\textsterling}{OT4}{\hmode@bgroup + \ifdim \fontdimen\@ne\font >\z@ + \itshape + \else + \fontshape{ui}\selectfont + \fi + \char`\$\egroup} +% \end{macrocode} +% Declare the composites. +% \begin{macrocode} +\DeclareTextComposite{\k}{OT4}{A}{129} +\DeclareTextComposite{\'}{OT4}{C}{130} +\DeclareTextComposite{\k}{OT4}{E}{134} +\DeclareTextComposite{\'}{OT4}{N}{139} +\DeclareTextComposite{\'}{OT4}{S}{145} +\DeclareTextComposite{\'}{OT4}{Z}{153} +\DeclareTextComposite{\.}{OT4}{Z}{155} +\DeclareTextComposite{\k}{OT4}{a}{161} +\DeclareTextComposite{\'}{OT4}{c}{162} +\DeclareTextComposite{\k}{OT4}{e}{166} +\DeclareTextComposite{\'}{OT4}{n}{171} +\DeclareTextComposite{\'}{OT4}{s}{177} +\DeclareTextComposite{\'}{OT4}{z}{185} +\DeclareTextComposite{\.}{OT4}{z}{187} +\DeclareTextComposite{\'}{OT4}{O}{211} +\DeclareTextComposite{\'}{OT4}{o}{243} +%</OT4> +% \end{macrocode} +% +% +% \subsection{Definitions for the TS1 encoding} +% +% \changes{v1.9c}{1997/05/04}{Added TS1 encoding v2.2.beta} +% \changes{v1.9g}{1997/11/23} +% {Use \cs{textperthousand}, \cs{textpertenthousand} and +% \cs{textfractionsolidus} not +% \cs{textpermill}, \cs{textpertenmill} and \cs{textfraction}. +% /2673 } +% \changes{v1.9h}{1997/12/17} +% {Removed default settings, see next section.} +% +% \begin{macrocode} +%<*TS1> +\DeclareFontEncoding{TS1}{}{} +\DeclareFontSubstitution{TS1}{cmr}{m}{n} +% \end{macrocode} +% Some accents have to be built by hand. +% Note that |\ooalign| and |\o@lign| must be inside a group. +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \begin{macrocode} +\DeclareTextCommand{\capitalcedilla}{TS1}[1] + {\hmode@bgroup + \ooalign{\null#1\crcr\hidewidth\char11\hidewidth}\egroup} +\DeclareTextCommand{\capitalogonek}{TS1}[1] + {\hmode@bgroup + \ooalign{\null#1\crcr\hidewidth\char12\hidewidth}\egroup} +% \end{macrocode} +% +% Accents for capital letters. +% +% These commands can be used by the end user either directly or through +% definitions of the type +% \begin{verbatim} +% \DeclareTextCompositeCommand{\'}{T1}{X}{\capitalacute X} +% \end{verbatim} +% None of the latter definitions are provided by default, since they +% are probably rarely used. +% +% "00 = 0 +% \begin{macrocode} +\DeclareTextAccent{\capitalgrave}{TS1}{0} +\DeclareTextAccent{\capitalacute}{TS1}{1} +\DeclareTextAccent{\capitalcircumflex}{TS1}{2} +\DeclareTextAccent{\capitaltilde}{TS1}{3} +\DeclareTextAccent{\capitaldieresis}{TS1}{4} +\DeclareTextAccent{\capitalhungarumlaut}{TS1}{5} +\DeclareTextAccent{\capitalring}{TS1}{6} +\DeclareTextAccent{\capitalcaron}{TS1}{7} +% \end{macrocode} +% "08 = 8 +% \begin{macrocode} +\DeclareTextAccent{\capitalbreve}{TS1}{8} +\DeclareTextAccent{\capitalmacron}{TS1}{9} +\DeclareTextAccent{\capitaldotaccent}{TS1}{10} +% \end{macrocode} +% Tie accents. +% +% The tie accent was borrowed from the |cmmi| font. The tc fonts +% now provide four tie accents, the first two are done in the +% classical way with assymetric glyphs hanging out of their boxes; +% the new ties are centered in their boxes like all other accents. +% They need a name: please tell us if you know what to call them. +% +% " = +% \begin{macrocode} +\DeclareTextAccent{\t}{TS1}{26} +\DeclareTextAccent{\capitaltie}{TS1}{27} +\DeclareTextAccent{\newtie}{TS1}{28} +\DeclareTextAccent{\capitalnewtie}{TS1}{29} +% \end{macrocode} +% +% Compund word marks. +% +% The text companion fonts contain two compound word marks of +% different heights, one has |cap_height|, the other |asc_height|. +% +% \begin{macrocode} +\DeclareTextSymbol{\textcapitalcompwordmark}{TS1}{23} +\DeclareTextSymbol{\textascendercompwordmark}{TS1}{31} +% \end{macrocode} +% +% The text companion symbols. +% +% \begin{macrocode} +\DeclareTextSymbol{\textquotestraightbase}{TS1}{13} +% \end{macrocode} +% "10 = 16 +% \begin{macrocode} +\DeclareTextSymbol{\textquotestraightdblbase}{TS1}{18} +\DeclareTextSymbol{\texttwelveudash}{TS1}{21} +\DeclareTextSymbol{\textthreequartersemdash}{TS1}{22} +% \end{macrocode} +% "18 = 24 +% \begin{macrocode} +\DeclareTextSymbol{\textleftarrow}{TS1}{24} +\DeclareTextSymbol{\textrightarrow}{TS1}{25} +% \end{macrocode} +% "20 = 32 +% \begin{macrocode} +\DeclareTextSymbol{\textblank}{TS1}{32} +\DeclareTextSymbol{\textdollar}{TS1}{36} +\DeclareTextSymbol{\textquotesingle}{TS1}{39} +% \end{macrocode} +% "28 = 40 +% \begin{macrocode} +\DeclareTextSymbol{\textasteriskcentered}{TS1}{42} +% \end{macrocode} +% Note that '054 is a comma and '056 is a full stop: these make +% numbers using oldstyle digits easier to input. +% \begin{macrocode} +\DeclareTextSymbol{\textdblhyphen}{TS1}{45} +\DeclareTextSymbol{\textfractionsolidus}{TS1}{47} +% \end{macrocode} +% +% Oldstyle digits. +% +% "30 = 48 +% \begin{macrocode} +\DeclareTextSymbol{\textzerooldstyle}{TS1}{48} +\DeclareTextSymbol{\textoneoldstyle}{TS1}{49} +\DeclareTextSymbol{\texttwooldstyle}{TS1}{50} +\DeclareTextSymbol{\textthreeoldstyle}{TS1}{51} +\DeclareTextSymbol{\textfouroldstyle}{TS1}{52} +\DeclareTextSymbol{\textfiveoldstyle}{TS1}{53} +\DeclareTextSymbol{\textsixoldstyle}{TS1}{54} +\DeclareTextSymbol{\textsevenoldstyle}{TS1}{55} +% \end{macrocode} +% "38 = 56 +% \begin{macrocode} +\DeclareTextSymbol{\texteightoldstyle}{TS1}{56} +\DeclareTextSymbol{\textnineoldstyle}{TS1}{57} +% \end{macrocode} +% +% More text companion symbols. +% +% \begin{macrocode} +\DeclareTextSymbol{\textlangle}{TS1}{60} +\DeclareTextSymbol{\textminus}{TS1}{61} +\DeclareTextSymbol{\textrangle}{TS1}{62} +% \end{macrocode} +% "48 = 72 +% \begin{macrocode} +\DeclareTextSymbol{\textmho}{TS1}{77} +% \end{macrocode} +% +% \changes{v1.9r}{1999/01/06}{Minor documentation fix.} +% The big circle is here to define the command \cs{textcircled}. +% Formerly it was taken from the |cmsy| font. +% \changes{v1.9h}{1997/12/17}{Changed to decimal codes in \cs{ooalign}.} +% \changes{v1.9k}{1998/01/12}{Adding missing braces and \cs{ushape}.} +% \changes{v1.9y}{2000/01/30}{Use \cs{hmode@bgroup} where applicable +% (pr/3160)} +% \begin{macrocode} +\DeclareTextSymbol{\textbigcircle}{TS1}{79} +\DeclareTextCommand{\textcircled}{TS1}[1]{\hmode@bgroup + \ooalign{% + \hfil \raise .07ex\hbox {\upshape#1}\hfil \crcr + \char 79 % '117 = "4F + }% + \egroup} +% \end{macrocode} +% +% More text companion symbols. +% +% "50 = 80 +% \begin{macrocode} +\DeclareTextSymbol{\textohm}{TS1}{87} +% \end{macrocode} +% "58 = 88 +% \begin{macrocode} +\DeclareTextSymbol{\textlbrackdbl}{TS1}{91} +\DeclareTextSymbol{\textrbrackdbl}{TS1}{93} +\DeclareTextSymbol{\textuparrow}{TS1}{94} +\DeclareTextSymbol{\textdownarrow}{TS1}{95} +% \end{macrocode} +% "60 = 96 +% \begin{macrocode} +\DeclareTextSymbol{\textasciigrave}{TS1}{96} +\DeclareTextSymbol{\textborn}{TS1}{98} +\DeclareTextSymbol{\textdivorced}{TS1}{99} +\DeclareTextSymbol{\textdied}{TS1}{100} +% \end{macrocode} +% "68 = 104 +% \begin{macrocode} +\DeclareTextSymbol{\textleaf}{TS1}{108} +\DeclareTextSymbol{\textmarried}{TS1}{109} +\DeclareTextSymbol{\textmusicalnote}{TS1}{110} +% \end{macrocode} +% "78 = 120 +% \begin{macrocode} +\DeclareTextSymbol{\texttildelow}{TS1}{126} +% \end{macrocode} +% +% This glyph, |\textdblhyphenchar| is hanging, like the hyphenchar of +% the ec fonts. +% +% \begin{macrocode} +\DeclareTextSymbol{\textdblhyphenchar}{TS1}{127} +% \end{macrocode} +% "80 = 128 +% \begin{macrocode} +\DeclareTextSymbol{\textasciibreve}{TS1}{128} +\DeclareTextSymbol{\textasciicaron}{TS1}{129} +% \end{macrocode} +% +% This next glyph is \emph{not} the same as |\textquotedbl|. +% +% \changes{v1.9p}{1998/06/12}{Corrected 130 and 131, see pr/2834} +% \begin{macrocode} +\DeclareTextSymbol{\textacutedbl}{TS1}{130} +\DeclareTextSymbol{\textgravedbl}{TS1}{131} +\DeclareTextSymbol{\textdagger}{TS1}{132} +\DeclareTextSymbol{\textdaggerdbl}{TS1}{133} +\DeclareTextSymbol{\textbardbl}{TS1}{134} +\DeclareTextSymbol{\textperthousand}{TS1}{135} +% \end{macrocode} +% "88 = 136 +% \begin{macrocode} +\DeclareTextSymbol{\textbullet}{TS1}{136} +\DeclareTextSymbol{\textcelsius}{TS1}{137} +\DeclareTextSymbol{\textdollaroldstyle}{TS1}{138} +\DeclareTextSymbol{\textcentoldstyle}{TS1}{139} +\DeclareTextSymbol{\textflorin}{TS1}{140} +\DeclareTextSymbol{\textcolonmonetary}{TS1}{141} +\DeclareTextSymbol{\textwon}{TS1}{142} +\DeclareTextSymbol{\textnaira}{TS1}{143} +% \end{macrocode} +% "90 = 144 +% \begin{macrocode} +\DeclareTextSymbol{\textguarani}{TS1}{144} +\DeclareTextSymbol{\textpeso}{TS1}{145} +\DeclareTextSymbol{\textlira}{TS1}{146} +\DeclareTextSymbol{\textrecipe}{TS1}{147} +\DeclareTextSymbol{\textinterrobang}{TS1}{148} +\DeclareTextSymbol{\textinterrobangdown}{TS1}{149} +\DeclareTextSymbol{\textdong}{TS1}{150} +\DeclareTextSymbol{\texttrademark}{TS1}{151} +% \end{macrocode} +% "98 = 152 +% \begin{macrocode} +\DeclareTextSymbol{\textpertenthousand}{TS1}{152} +\DeclareTextSymbol{\textpilcrow}{TS1}{153} +\DeclareTextSymbol{\textbaht}{TS1}{154} +\DeclareTextSymbol{\textnumero}{TS1}{155} +% \end{macrocode} +% This next name may change. +% For the following sign we know only a german name, which is +% abz\"uglich. The meaning is something like ``commercial minus''. +% An ASCII ersatz is ./. (dot slash dot). +% The temporary English name is |\textdiscount|. +% \begin{macrocode} +\DeclareTextSymbol{\textdiscount}{TS1}{156} +\DeclareTextSymbol{\textestimated}{TS1}{157} +\DeclareTextSymbol{\textopenbullet}{TS1}{158} +\DeclareTextSymbol{\textservicemark}{TS1}{159} +% \end{macrocode} +% "A0 = 160 +% \begin{macrocode} +\DeclareTextSymbol{\textlquill}{TS1}{160} +\DeclareTextSymbol{\textrquill}{TS1}{161} +\DeclareTextSymbol{\textcent}{TS1}{162} +\DeclareTextSymbol{\textsterling}{TS1}{163} +\DeclareTextSymbol{\textcurrency}{TS1}{164} +\DeclareTextSymbol{\textyen}{TS1}{165} +\DeclareTextSymbol{\textbrokenbar}{TS1}{166} +\DeclareTextSymbol{\textsection}{TS1}{167} +% \end{macrocode} +% "A8 = 168 +% \begin{macrocode} +\DeclareTextSymbol{\textasciidieresis}{TS1}{168} +\DeclareTextSymbol{\textcopyright}{TS1}{169} +\DeclareTextSymbol{\textordfeminine}{TS1}{170} +\DeclareTextSymbol{\textcopyleft}{TS1}{171} +\DeclareTextSymbol{\textlnot}{TS1}{172} +% \end{macrocode} +% +% The meaning of the circled-P is ``sound recording copyright''. +% +% \changes{v1.9p}{1998/06/12}{Renamed \cs{textmacron} pr/2840} +% \begin{macrocode} +\DeclareTextSymbol{\textcircledP}{TS1}{173} +\DeclareTextSymbol{\textregistered}{TS1}{174} +\DeclareTextSymbol{\textasciimacron}{TS1}{175} +% \end{macrocode} +% "B0 = 176 +% \begin{macrocode} +\DeclareTextSymbol{\textdegree}{TS1}{176} +\DeclareTextSymbol{\textpm}{TS1}{177} +\DeclareTextSymbol{\texttwosuperior}{TS1}{178} +\DeclareTextSymbol{\textthreesuperior}{TS1}{179} +\DeclareTextSymbol{\textasciiacute}{TS1}{180} +\DeclareTextSymbol{\textmu}{TS1}{181} % micro sign +\DeclareTextSymbol{\textparagraph}{TS1}{182} +\DeclareTextSymbol{\textperiodcentered}{TS1}{183} +% \end{macrocode} +% "B8 = 184 +% \begin{macrocode} +\DeclareTextSymbol{\textreferencemark}{TS1}{184} +\DeclareTextSymbol{\textonesuperior}{TS1}{185} +\DeclareTextSymbol{\textordmasculine}{TS1}{186} +\DeclareTextSymbol{\textsurd}{TS1}{187} +\DeclareTextSymbol{\textonequarter}{TS1}{188} +\DeclareTextSymbol{\textonehalf}{TS1}{189} +\DeclareTextSymbol{\textthreequarters}{TS1}{190} +\DeclareTextSymbol{\texteuro}{TS1}{191} +% \end{macrocode} +% "E0 = 208 +% \begin{macrocode} +\DeclareTextSymbol{\texttimes}{TS1}{214} +% \end{macrocode} +% "F0 = 240 +% \begin{macrocode} +\DeclareTextSymbol{\textdiv}{TS1}{246} +%</TS1> +% \end{macrocode} +% +% \subsection{Definitions for the TU encoding} +% +% \changes{v2.0a}{2016/12/04}{Added TU encoding} +% \changes{v2.0b}{2017/01/23}{Added TU specific commands in ASCII range pr/4500} +% \changes{v2.0c}{2017/01/24}{TeX ligature syntax for xetex and luatex reversed} +% \changes{v2.0c}{2017/01/24}{Make \cs{textasteriskcentered} U+2217 not U+204E} +% \changes{v2.0c}{2017/01/24}{Declare TU composites for i and j} +% \changes{v2.0d}{2017/01/24}{Declare macron composites for YyGg} +% \changes{v2.0e}{2017/02/12}{Declare fallback code for \cs{textasteriskcentered}} +% \changes{v2.0f}{2017/02/19}{% +% declare composites with empty base for hat and tilde, +% use same slots for \cs{textasciicircum} ans \cs{textasciitilde}} +% \changes{v2.0f}{2017/02/19}{% +% declare straight quotes using new \cs{remove@tlig} command} +% \changes{v2.0g}{2017/02/22}{Fix typo introduced at 2.0f} +% \changes{v2.0h}{2017/02/24}{introduce \cs{DeclareUnicodeAccent}}% +% The TU encoding was originally introduced in the contributed +% package \texttt{fontspec} as a Unicode encoding for XeTeX and +% LuaTeX. +% +% Normally for these engines, the input consists of Unicode characters +% encoded in UTF-8. There is therefore little need to use the +% traditional (ASCII) encoding-specific commands +% +% However, sometimes (e.g. for backwards compatibility) it can be +% useful to access these Unicode characters via such ASCII-based +% markup. The commands provided here +% Cover the characters in the T1 and TS1 encodings, but specified in +% Unicode position. Almost all the command names have been +% mechanically extracted form the \texttt{inputenc} UTF-8 support, +% which is essentially doing a reverse mapping from UTF-8 data to +% \LaTeX\ LICR commands. +% +% A few additional names for character which were supported in the +% original \texttt{fontspec} version of this file have also been +% added, even though they are not currently in the default +% \texttt{inputenc} UTF-8 declarations. +% +% \begin{macrocode} +%<*TU> +% \end{macrocode} +% In the base interface the Unicode encoding is always known as TU +% But we parameterise the encoding name to allow for modelling +% differences in Unicode support by different fonts. +% \begin{macrocode} +\providecommand\UnicodeEncodingName{TU} +% \end{macrocode} +% As the Unicode encoding, TU, is only currently available with XeTeX +% or LuaTeX, we detect these engines first, and make adjustments for the +% differing font loading syntax. For other engines, we issue a warning +% then abort this file, switching back to T1 encoding. +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname XeTeXrevision\endcsname\relax +% \end{macrocode} +% +% \begin{macrocode} + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname directlua\endcsname\relax +% \end{macrocode} +% +% Not LuaTeX or XeTeX, abort with a warning. +% \begin{macrocode} + \PackageWarningNoLine{fontenc} + {\UnicodeEncodingName\space + encoding is only available with XeTeX and LuaTeX.\MessageBreak + Defaulting to T1 encoding} + \def\encodingdefault{T1} + \expandafter\expandafter\expandafter\endinput +% \end{macrocode} +% +% \begin{macrocode} + \else +% \end{macrocode} +% +% LuaTeX. +% \begin{macrocode} + \def\UnicodeFontTeXLigatures{+tlig;} +% \end{macrocode} +% +% \begin{macrocode} + \def\reserved@a#1{% + \def\@remove@tlig##1{\@remove@tlig@##1\@nil#1\@nil\relax} + \def\@remove@tlig@##1#1{\@remove@tlig@@##1}} + \edef\reserved@b{\detokenize{+tlig;}} + \expandafter\reserved@a\expandafter{\reserved@b} + \def\@remove@tlig@@#1\@nil#2\relax{#1} +% \end{macrocode} +% +% \begin{macrocode} + \def\remove@tlig#1{% + \begingroup + \font\remove@tlig + \expandafter\@remove@tlig\expandafter{\fontname\font}% + \remove@tlig + \char#1\relax + \endgroup + } +% \end{macrocode} +% +% \begin{macrocode} + \fi +\else +% \end{macrocode} +% +% XeTeX +% \begin{macrocode} + \def\UnicodeFontTeXLigatures{mapping=tex-text;} +% \end{macrocode} +% +% \begin{macrocode} + \def\remove@tlig#1{\XeTeXglyph\numexpr\XeTeXcharglyph#1\relax} +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \begin{macrocode} +\def\UnicodeFontFile#1#2{"[#1]:#2"} +\def\UnicodeFontName#1#2{"#1:#2"} +% \end{macrocode} +% +% Declare the encoding +% \begin{macrocode} +\DeclareFontEncoding\UnicodeEncodingName{}{} +% \end{macrocode} +% +% Declare accent command to use a postpended combining character +% rather than the TeX |\accent| primitive +% \begin{macrocode} +\def\add@unicode@accent#1#2{% + \if\relax\detokenize{#2}\relax^^a0\else#2\fi + \char#1\relax} +% \end{macrocode} +% +% \begin{macrocode} +\def\DeclareUnicodeAccent#1#2#3{% + \DeclareTextCommand{#1}{#2}{\add@unicode@accent{#3}}% +} +% \end{macrocode} +% +% Wrapper around |\DeclareTextCompositeCommand| that uses the declared +% composite if it exists in the current font or falls back to the default +% definition for the TU accent if not. +% \begin{macrocode} +{ +\catcode\z@=11\relax +\gdef\DeclareUnicodeComposite#1#2#3{% + \def\reserved@a##1##2{% + \DeclareTextCompositeCommand#1\UnicodeEncodingName{#2}{% + \iffontchar\font#3 ##2% + \else ##1\fi}}% + \expandafter\expandafter\expandafter\extract@default@composite + \csname\UnicodeEncodingName\string#1\endcsname{#2}\@nil + \bgroup + \lccode\z@#3 % + \lowercase{\egroup + \expandafter\reserved@a\expandafter{\reserved@b}{^^@}}}% +} +% \end{macrocode} +% +% \begin{macrocode} +\def\extract@default@composite#1{% + \ifx\@text@composite#1% + \expandafter\extract@default@composite@a + \else + \expandafter\extract@default@composite@b\expandafter#1% + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\extract@default@composite@a#1\@text@composite#2\@nil{% + \def\reserved@b{#2}} +\def\extract@default@composite@b#1#2\@nil{% + \def\reserved@b{#1#2}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextCommand\textquotesingle \UnicodeEncodingName{% + \remove@tlig{"0027}} +\DeclareTextCommand\textasciigrave \UnicodeEncodingName{% + \remove@tlig{"0060}} +\DeclareTextCommand\textquotedbl \UnicodeEncodingName{% + \remove@tlig{"0022}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextSymbol{\textdollar} \UnicodeEncodingName{"0024} +\DeclareTextSymbol{\textless} \UnicodeEncodingName{"003C} +\DeclareTextSymbol{\textgreater} \UnicodeEncodingName{"003E} +\DeclareTextSymbol{\textbackslash} \UnicodeEncodingName{"005C} +\DeclareTextSymbol{\textasciicircum} \UnicodeEncodingName{"005E} +\DeclareTextSymbol{\textunderscore} \UnicodeEncodingName{"005F} +\DeclareTextSymbol{\textbraceleft} \UnicodeEncodingName{"007B} +\DeclareTextSymbol{\textbar} \UnicodeEncodingName{"007C} +\DeclareTextSymbol{\textbraceright} \UnicodeEncodingName{"007D} +\DeclareTextSymbol{\textasciitilde} \UnicodeEncodingName{"007E} +\DeclareTextSymbol{\textexclamdown} \UnicodeEncodingName{"00A1} +\DeclareTextSymbol{\textcent} \UnicodeEncodingName{"00A2} +\DeclareTextSymbol{\textsterling} \UnicodeEncodingName{"00A3} +\DeclareTextSymbol{\textcurrency} \UnicodeEncodingName{"00A4} +\DeclareTextSymbol{\textyen} \UnicodeEncodingName{"00A5} +\DeclareTextSymbol{\textbrokenbar} \UnicodeEncodingName{"00A6} +\DeclareTextSymbol{\textsection} \UnicodeEncodingName{"00A7} +\DeclareTextSymbol{\textasciidieresis} \UnicodeEncodingName{"00A8} +\DeclareTextSymbol{\textcopyright} \UnicodeEncodingName{"00A9} +\DeclareTextSymbol{\textordfeminine} \UnicodeEncodingName{"00AA} +% \end{macrocode} +% \changes{v2.0j}{2018/08/11}{Provide \cs{guillemetleft} and \cs{guillemetright}} +% \begin{macrocode} +\DeclareTextSymbol{\guillemetleft} \UnicodeEncodingName{"00AB} +% old Adobe name +\DeclareTextSymbol{\guillemotleft} \UnicodeEncodingName{"00AB} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextSymbol{\textlnot} \UnicodeEncodingName{"00AC} +\DeclareTextSymbol{\textregistered} \UnicodeEncodingName{"00AE} +\DeclareTextSymbol{\textasciimacron} \UnicodeEncodingName{"00AF} +\DeclareTextSymbol{\textdegree} \UnicodeEncodingName{"00B0} +\DeclareTextSymbol{\textpm} \UnicodeEncodingName{"00B1} +\DeclareTextSymbol{\texttwosuperior} \UnicodeEncodingName{"00B2} +\DeclareTextSymbol{\textthreesuperior} \UnicodeEncodingName{"00B3} +\DeclareTextSymbol{\textasciiacute} \UnicodeEncodingName{"00B4} +\DeclareTextSymbol{\textmu} \UnicodeEncodingName{"00B5} +\DeclareTextSymbol{\textparagraph} \UnicodeEncodingName{"00B6} +\DeclareTextSymbol{\textperiodcentered} \UnicodeEncodingName{"00B7} +\DeclareTextSymbol{\textonesuperior} \UnicodeEncodingName{"00B9} +\DeclareTextSymbol{\textordmasculine} \UnicodeEncodingName{"00BA} +% \end{macrocode} +% \changes{v2.0j}{2018/08/11}{Provide \cs{guillemetleft} and \cs{guillemetright}} +% \begin{macrocode} +\DeclareTextSymbol{\guillemetright} \UnicodeEncodingName{"00BB} +% old Adobe name +\DeclareTextSymbol{\guillemotright} \UnicodeEncodingName{"00BB} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareTextSymbol{\textonequarter} \UnicodeEncodingName{"00BC} +\DeclareTextSymbol{\textonehalf} \UnicodeEncodingName{"00BD} +\DeclareTextSymbol{\textthreequarters} \UnicodeEncodingName{"00BE} +\DeclareTextSymbol{\textquestiondown} \UnicodeEncodingName{"00BF} +\DeclareTextSymbol{\AE} \UnicodeEncodingName{"00C6} +\DeclareTextSymbol{\DH} \UnicodeEncodingName{"00D0} +\DeclareTextSymbol{\texttimes} \UnicodeEncodingName{"00D7} +\DeclareTextSymbol{\O} \UnicodeEncodingName{"00D8} +\DeclareTextSymbol{\TH} \UnicodeEncodingName{"00DE} +\DeclareTextSymbol{\ss} \UnicodeEncodingName{"00DF} +\DeclareTextSymbol{\ae} \UnicodeEncodingName{"00E6} +\DeclareTextSymbol{\dh} \UnicodeEncodingName{"00F0} +\DeclareTextSymbol{\textdiv} \UnicodeEncodingName{"00F7} +\DeclareTextSymbol{\o} \UnicodeEncodingName{"00F8} +\DeclareTextSymbol{\th} \UnicodeEncodingName{"00FE} +\DeclareTextSymbol{\DJ} \UnicodeEncodingName{"0110} +\DeclareTextSymbol{\dj} \UnicodeEncodingName{"0111} +\DeclareTextSymbol{\i} \UnicodeEncodingName{"0131} +\DeclareTextSymbol{\IJ} \UnicodeEncodingName{"0132} +\DeclareTextSymbol{\ij} \UnicodeEncodingName{"0133} +\DeclareTextSymbol{\L} \UnicodeEncodingName{"0141} +\DeclareTextSymbol{\l} \UnicodeEncodingName{"0142} +\DeclareTextSymbol{\NG} \UnicodeEncodingName{"014A} +\DeclareTextSymbol{\ng} \UnicodeEncodingName{"014B} +\DeclareTextSymbol{\OE} \UnicodeEncodingName{"0152} +\DeclareTextSymbol{\oe} \UnicodeEncodingName{"0153} +\DeclareTextSymbol{\textflorin} \UnicodeEncodingName{"0192} +\DeclareTextSymbol{\j} \UnicodeEncodingName{"0237} +\DeclareTextSymbol{\textasciicaron} \UnicodeEncodingName{"02C7} +\DeclareTextSymbol{\textasciibreve} \UnicodeEncodingName{"02D8} +\DeclareTextSymbol{\textacutedbl} \UnicodeEncodingName{"02DD} +\DeclareTextSymbol{\textgravedbl} \UnicodeEncodingName{"02F5} +\DeclareTextSymbol{\texttildelow} \UnicodeEncodingName{"02F7} +\DeclareTextSymbol{\textbaht} \UnicodeEncodingName{"0E3F} +\DeclareTextSymbol{\SS} \UnicodeEncodingName{"1E9E} +\DeclareTextSymbol{\textcompwordmark} \UnicodeEncodingName{"200C} +\DeclareTextSymbol{\textendash} \UnicodeEncodingName{"2013} +\DeclareTextSymbol{\textemdash} \UnicodeEncodingName{"2014} +\DeclareTextSymbol{\textbardbl} \UnicodeEncodingName{"2016} +\DeclareTextSymbol{\textquoteleft} \UnicodeEncodingName{"2018} +\DeclareTextSymbol{\textquoteright} \UnicodeEncodingName{"2019} +\DeclareTextSymbol{\quotesinglbase} \UnicodeEncodingName{"201A} +\DeclareTextSymbol{\textquotedblleft} \UnicodeEncodingName{"201C} +\DeclareTextSymbol{\textquotedblright} \UnicodeEncodingName{"201D} +\DeclareTextSymbol{\quotedblbase} \UnicodeEncodingName{"201E} +\DeclareTextSymbol{\textdagger} \UnicodeEncodingName{"2020} +\DeclareTextSymbol{\textdaggerdbl} \UnicodeEncodingName{"2021} +\DeclareTextSymbol{\textbullet} \UnicodeEncodingName{"2022} +\DeclareTextSymbol{\textellipsis} \UnicodeEncodingName{"2026} +\DeclareTextSymbol{\textperthousand} \UnicodeEncodingName{"2030} +\DeclareTextSymbol{\textpertenthousand} \UnicodeEncodingName{"2031} +\DeclareTextSymbol{\guilsinglleft} \UnicodeEncodingName{"2039} +\DeclareTextSymbol{\guilsinglright} \UnicodeEncodingName{"203A} +\DeclareTextSymbol{\textreferencemark} \UnicodeEncodingName{"203B} +\DeclareTextSymbol{\textinterrobang} \UnicodeEncodingName{"203D} +\DeclareTextSymbol{\textfractionsolidus} \UnicodeEncodingName{"2044} +\DeclareTextSymbol{\textlquill} \UnicodeEncodingName{"2045} +\DeclareTextSymbol{\textrquill} \UnicodeEncodingName{"2046} +\DeclareTextSymbol{\textdiscount} \UnicodeEncodingName{"2052} +\DeclareTextSymbol{\textcolonmonetary} \UnicodeEncodingName{"20A1} +\DeclareTextSymbol{\textlira} \UnicodeEncodingName{"20A4} +\DeclareTextSymbol{\textnaira} \UnicodeEncodingName{"20A6} +\DeclareTextSymbol{\textwon} \UnicodeEncodingName{"20A9} +\DeclareTextSymbol{\textdong} \UnicodeEncodingName{"20AB} +\DeclareTextSymbol{\texteuro} \UnicodeEncodingName{"20AC} +\DeclareTextSymbol{\textpeso} \UnicodeEncodingName{"20B1} +\DeclareTextSymbol{\textcelsius} \UnicodeEncodingName{"2103} +\DeclareTextSymbol{\textnumero} \UnicodeEncodingName{"2116} +\DeclareTextSymbol{\textcircledP} \UnicodeEncodingName{"2117} +\DeclareTextSymbol{\textrecipe} \UnicodeEncodingName{"211E} +\DeclareTextSymbol{\textservicemark} \UnicodeEncodingName{"2120} +\DeclareTextSymbol{\texttrademark} \UnicodeEncodingName{"2122} +\DeclareTextSymbol{\textohm} \UnicodeEncodingName{"2126} +\DeclareTextSymbol{\textmho} \UnicodeEncodingName{"2127} +\DeclareTextSymbol{\textestimated} \UnicodeEncodingName{"212E} +\DeclareTextSymbol{\textleftarrow} \UnicodeEncodingName{"2190} +\DeclareTextSymbol{\textuparrow} \UnicodeEncodingName{"2191} +\DeclareTextSymbol{\textrightarrow} \UnicodeEncodingName{"2192} +\DeclareTextSymbol{\textdownarrow} \UnicodeEncodingName{"2193} +\DeclareTextSymbol{\textminus} \UnicodeEncodingName{"2212} + +% \end{macrocode} +% \changes{v2.0k}{2018/11/18}{Provide \cs{Hwithstroke} and \cs{hwithstroke}} +% \begin{macrocode} +\DeclareTextSymbol{\Hwithstroke} \UnicodeEncodingName{"0126} +\DeclareTextSymbol{\hwithstroke} \UnicodeEncodingName{"0127} +% \end{macrocode} +% +% Not all fonts have U+2217 but using U+002A requires some adjustment. +% \begin{macrocode} +\DeclareTextCommand{\textasteriskcentered}\UnicodeEncodingName{% + \iffontchar\font"2217 \char"2217 \else + \begingroup + \fontsize + {\the\dimexpr1.2\dimexpr\f@size pt\relax}% + {\f@baselineskip}% + \selectfont + \raisebox{-0.6ex}[\dimexpr\height-0.6ex][0pt]{*}% + \endgroup + \fi +} +% \end{macrocode} +% \begin{macrocode} +\DeclareTextSymbol{\textsurd} \UnicodeEncodingName{"221A} +\DeclareTextSymbol{\textlangle} \UnicodeEncodingName{"2329} +\DeclareTextSymbol{\textrangle} \UnicodeEncodingName{"232A} +\DeclareTextSymbol{\textblank} \UnicodeEncodingName{"2422} +\DeclareTextSymbol{\textvisiblespace} \UnicodeEncodingName{"2423} +\DeclareTextSymbol{\textopenbullet} \UnicodeEncodingName{"25E6} +\DeclareTextSymbol{\textbigcircle} \UnicodeEncodingName{"25EF} +\DeclareTextSymbol{\textmusicalnote} \UnicodeEncodingName{"266A} +\DeclareTextSymbol{\textmarried} \UnicodeEncodingName{"26AD} +\DeclareTextSymbol{\textdivorced} \UnicodeEncodingName{"26AE} +\DeclareTextSymbol{\textinterrobangdown} \UnicodeEncodingName{"2E18} +% \end{macrocode} +% Accents must be declared before the composites that use them. +% \begin{macrocode} +\DeclareUnicodeAccent{\`} \UnicodeEncodingName{"0300} +\DeclareUnicodeAccent{\'} \UnicodeEncodingName{"0301} +\DeclareUnicodeAccent{\^} \UnicodeEncodingName{"0302} +\DeclareUnicodeAccent{\~} \UnicodeEncodingName{"0303} +\DeclareUnicodeAccent{\=} \UnicodeEncodingName{"0304} +\DeclareUnicodeAccent{\u} \UnicodeEncodingName{"0306} +\DeclareUnicodeAccent{\.} \UnicodeEncodingName{"0307} +\DeclareUnicodeAccent{\"} \UnicodeEncodingName{"0308} +\DeclareUnicodeAccent{\r} \UnicodeEncodingName{"030A} +\DeclareUnicodeAccent{\H} \UnicodeEncodingName{"030B} +\DeclareUnicodeAccent{\v} \UnicodeEncodingName{"030C} +\DeclareUnicodeAccent{\b} \UnicodeEncodingName{"0332} +\DeclareUnicodeAccent{\d} \UnicodeEncodingName{"0323} +\DeclareUnicodeAccent{\c} \UnicodeEncodingName{"0327} +\DeclareUnicodeAccent{\k} \UnicodeEncodingName{"0328} +\DeclareTextCommand\textcommabelow \UnicodeEncodingName[1] + {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex + \hbox{\check@mathfonts\fontsize\ssf@size\z@ + \math@fontsfalse\selectfont,}\hidewidth}\egroup} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareUnicodeComposite{\^} {}{"005E} +\DeclareUnicodeComposite{\~} {}{"007E} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareUnicodeComposite{\`} {A}{"00C0} +\DeclareUnicodeComposite{\'} {A}{"00C1} +\DeclareUnicodeComposite{\^} {A}{"00C2} +\DeclareUnicodeComposite{\~} {A}{"00C3} +\DeclareUnicodeComposite{\"} {A}{"00C4} +\DeclareUnicodeComposite{\r} {A}{"00C5} +\DeclareUnicodeComposite{\c} {C}{"00C7} +\DeclareUnicodeComposite{\`} {E}{"00C8} +\DeclareUnicodeComposite{\'} {E}{"00C9} +\DeclareUnicodeComposite{\^} {E}{"00CA} +\DeclareUnicodeComposite{\"} {E}{"00CB} +\DeclareUnicodeComposite{\`} {I}{"00CC} +\DeclareUnicodeComposite{\'} {I}{"00CD} +\DeclareUnicodeComposite{\^} {I}{"00CE} +\DeclareUnicodeComposite{\"} {I}{"00CF} +\DeclareUnicodeComposite{\~} {N}{"00D1} +\DeclareUnicodeComposite{\`} {O}{"00D2} +\DeclareUnicodeComposite{\'} {O}{"00D3} +\DeclareUnicodeComposite{\^} {O}{"00D4} +\DeclareUnicodeComposite{\~} {O}{"00D5} +\DeclareUnicodeComposite{\"} {O}{"00D6} +\DeclareUnicodeComposite{\`} {U}{"00D9} +\DeclareUnicodeComposite{\'} {U}{"00DA} +\DeclareUnicodeComposite{\^} {U}{"00DB} +\DeclareUnicodeComposite{\"} {U}{"00DC} +\DeclareUnicodeComposite{\'} {Y}{"00DD} +\DeclareUnicodeComposite{\`} {a}{"00E0} +\DeclareUnicodeComposite{\'} {a}{"00E1} +\DeclareUnicodeComposite{\^} {a}{"00E2} +\DeclareUnicodeComposite{\~} {a}{"00E3} +\DeclareUnicodeComposite{\"} {a}{"00E4} +\DeclareUnicodeComposite{\r} {a}{"00E5} +\DeclareUnicodeComposite{\c} {c}{"00E7} +\DeclareUnicodeComposite{\`} {e}{"00E8} +\DeclareUnicodeComposite{\'} {e}{"00E9} +\DeclareUnicodeComposite{\^} {e}{"00EA} +\DeclareUnicodeComposite{\"} {e}{"00EB} +\DeclareUnicodeComposite{\`} \i {"00EC} +\DeclareUnicodeComposite{\`} {i}{"00EC} +\DeclareUnicodeComposite{\'} \i {"00ED} +\DeclareUnicodeComposite{\'} {i}{"00ED} +\DeclareUnicodeComposite{\^} \i {"00EE} +\DeclareUnicodeComposite{\^} {i}{"00EE} +\DeclareUnicodeComposite{\"} \i {"00EF} +\DeclareUnicodeComposite{\"} {i}{"00EF} +\DeclareUnicodeComposite{\~} {n}{"00F1} +\DeclareUnicodeComposite{\`} {o}{"00F2} +\DeclareUnicodeComposite{\'} {o}{"00F3} +\DeclareUnicodeComposite{\^} {o}{"00F4} +\DeclareUnicodeComposite{\~} {o}{"00F5} +\DeclareUnicodeComposite{\"} {o}{"00F6} +\DeclareUnicodeComposite{\`} {u}{"00F9} +\DeclareUnicodeComposite{\'} {u}{"00FA} +\DeclareUnicodeComposite{\^} {u}{"00FB} +\DeclareUnicodeComposite{\"} {u}{"00FC} +\DeclareUnicodeComposite{\'} {y}{"00FD} +\DeclareUnicodeComposite{\"} {y}{"00FF} +\DeclareUnicodeComposite{\=} {A}{"0100} +\DeclareUnicodeComposite{\=} {a}{"0101} +\DeclareUnicodeComposite{\u} {A}{"0102} +\DeclareUnicodeComposite{\u} {a}{"0103} +\DeclareUnicodeComposite{\k} {A}{"0104} +\DeclareUnicodeComposite{\k} {a}{"0105} +\DeclareUnicodeComposite{\'} {C}{"0106} +\DeclareUnicodeComposite{\'} {c}{"0107} +\DeclareUnicodeComposite{\^} {C}{"0108} +\DeclareUnicodeComposite{\^} {c}{"0109} +\DeclareUnicodeComposite{\.} {C}{"010A} +\DeclareUnicodeComposite{\.} {c}{"010B} +\DeclareUnicodeComposite{\v} {C}{"010C} +\DeclareUnicodeComposite{\v} {c}{"010D} +\DeclareUnicodeComposite{\v} {D}{"010E} +\DeclareUnicodeComposite{\v} {d}{"010F} +\DeclareUnicodeComposite{\=} {E}{"0112} +\DeclareUnicodeComposite{\=} {e}{"0113} +\DeclareUnicodeComposite{\u} {E}{"0114} +\DeclareUnicodeComposite{\u} {e}{"0115} +\DeclareUnicodeComposite{\.} {E}{"0116} +\DeclareUnicodeComposite{\.} {e}{"0117} +\DeclareUnicodeComposite{\k} {E}{"0118} +\DeclareUnicodeComposite{\k} {e}{"0119} +\DeclareUnicodeComposite{\v} {E}{"011A} +\DeclareUnicodeComposite{\v} {e}{"011B} +\DeclareUnicodeComposite{\^} {G}{"011C} +\DeclareUnicodeComposite{\^} {g}{"011D} +\DeclareUnicodeComposite{\u} {G}{"011E} +\DeclareUnicodeComposite{\u} {g}{"011F} +\DeclareUnicodeComposite{\.} {G}{"0120} +\DeclareUnicodeComposite{\.} {g}{"0121} +\DeclareUnicodeComposite{\c} {G}{"0122} +\DeclareUnicodeComposite{\c} {g}{"0123} +\DeclareUnicodeComposite{\^} {H}{"0124} +\DeclareUnicodeComposite{\^} {h}{"0125} +\DeclareUnicodeComposite{\~} {I}{"0128} +\DeclareUnicodeComposite{\~} \i {"0129} +\DeclareUnicodeComposite{\~} {i}{"0129} +\DeclareUnicodeComposite{\=} {I}{"012A} +\DeclareUnicodeComposite{\=} \i {"012B} +\DeclareUnicodeComposite{\=} {i}{"012B} +\DeclareUnicodeComposite{\u} {I}{"012C} +\DeclareUnicodeComposite{\u} \i {"012D} +\DeclareUnicodeComposite{\u} {i}{"012D} +\DeclareUnicodeComposite{\k} {I}{"012E} +\DeclareUnicodeComposite{\k} \i {"012F} +\DeclareUnicodeComposite{\k} {i}{"012F} +\DeclareUnicodeComposite{\.} {I}{"0130} +\DeclareUnicodeComposite{\^} {J}{"0134} +\DeclareUnicodeComposite{\^} \j {"0135} +\DeclareUnicodeComposite{\^} {j}{"0135} +\DeclareUnicodeComposite{\c} {K}{"0136} +\DeclareUnicodeComposite{\c} {k}{"0137} +\DeclareUnicodeComposite{\'} {L}{"0139} +\DeclareUnicodeComposite{\'} {l}{"013A} +\DeclareUnicodeComposite{\c} {L}{"013B} +\DeclareUnicodeComposite{\c} {l}{"013C} +\DeclareUnicodeComposite{\v} {L}{"013D} +\DeclareUnicodeComposite{\v} {l}{"013E} +\DeclareUnicodeComposite{\'} {N}{"0143} +\DeclareUnicodeComposite{\'} {n}{"0144} +\DeclareUnicodeComposite{\c} {N}{"0145} +\DeclareUnicodeComposite{\c} {n}{"0146} +\DeclareUnicodeComposite{\v} {N}{"0147} +\DeclareUnicodeComposite{\v} {n}{"0148} +\DeclareUnicodeComposite{\=} {O}{"014C} +\DeclareUnicodeComposite{\=} {o}{"014D} +\DeclareUnicodeComposite{\u} {O}{"014E} +\DeclareUnicodeComposite{\u} {o}{"014F} +\DeclareUnicodeComposite{\H} {O}{"0150} +\DeclareUnicodeComposite{\H} {o}{"0151} +\DeclareUnicodeComposite{\'} {R}{"0154} +\DeclareUnicodeComposite{\'} {r}{"0155} +\DeclareUnicodeComposite{\c} {R}{"0156} +\DeclareUnicodeComposite{\c} {r}{"0157} +\DeclareUnicodeComposite{\v} {R}{"0158} +\DeclareUnicodeComposite{\v} {r}{"0159} +\DeclareUnicodeComposite{\'} {S}{"015A} +\DeclareUnicodeComposite{\'} {s}{"015B} +\DeclareUnicodeComposite{\^} {S}{"015C} +\DeclareUnicodeComposite{\^} {s}{"015D} +\DeclareUnicodeComposite{\c} {S}{"015E} +\DeclareUnicodeComposite{\c} {s}{"015F} +\DeclareUnicodeComposite{\v} {S}{"0160} +\DeclareUnicodeComposite{\v} {s}{"0161} +\DeclareUnicodeComposite{\c} {T}{"0162} +\DeclareUnicodeComposite{\c} {t}{"0163} +\DeclareUnicodeComposite{\v} {T}{"0164} +\DeclareUnicodeComposite{\v} {t}{"0165} +\DeclareUnicodeComposite{\~} {U}{"0168} +\DeclareUnicodeComposite{\~} {u}{"0169} +\DeclareUnicodeComposite{\=} {U}{"016A} +\DeclareUnicodeComposite{\=} {u}{"016B} +\DeclareUnicodeComposite{\u} {U}{"016C} +\DeclareUnicodeComposite{\u} {u}{"016D} +\DeclareUnicodeComposite{\r} {U}{"016E} +\DeclareUnicodeComposite{\r} {u}{"016F} +\DeclareUnicodeComposite{\H} {U}{"0170} +\DeclareUnicodeComposite{\H} {u}{"0171} +\DeclareUnicodeComposite{\k} {U}{"0172} +\DeclareUnicodeComposite{\k} {u}{"0173} +\DeclareUnicodeComposite{\^} {W}{"0174} +\DeclareUnicodeComposite{\^} {w}{"0175} +\DeclareUnicodeComposite{\^} {Y}{"0176} +\DeclareUnicodeComposite{\^} {y}{"0177} +\DeclareUnicodeComposite{\"} {Y}{"0178} +\DeclareUnicodeComposite{\'} {Z}{"0179} +\DeclareUnicodeComposite{\'} {z}{"017A} +\DeclareUnicodeComposite{\.} {Z}{"017B} +\DeclareUnicodeComposite{\.} {z}{"017C} +\DeclareUnicodeComposite{\v} {Z}{"017D} +\DeclareUnicodeComposite{\v} {z}{"017E} +\DeclareUnicodeComposite{\v} {A}{"01CD} +\DeclareUnicodeComposite{\v} {a}{"01CE} +\DeclareUnicodeComposite{\v} {I}{"01CF} +\DeclareUnicodeComposite{\v} \i {"01D0} +\DeclareUnicodeComposite{\v} {i}{"01D0} +\DeclareUnicodeComposite{\v} {O}{"01D1} +\DeclareUnicodeComposite{\v} {o}{"01D2} +\DeclareUnicodeComposite{\v} {U}{"01D3} +\DeclareUnicodeComposite{\v} {u}{"01D4} +\DeclareUnicodeComposite{\=} \AE{"01E2} +\DeclareUnicodeComposite{\=} \ae{"01E3} +\DeclareUnicodeComposite{\v} {G}{"01E6} +\DeclareUnicodeComposite{\v} {g}{"01E7} +\DeclareUnicodeComposite{\v} {K}{"01E8} +\DeclareUnicodeComposite{\v} {k}{"01E9} +\DeclareUnicodeComposite{\k} {O}{"01EA} +\DeclareUnicodeComposite{\k} {o}{"01EB} +\DeclareUnicodeComposite{\v} \j {"01F0} +\DeclareUnicodeComposite{\v} {j}{"01F0} +\DeclareUnicodeComposite{\'} {G}{"01F4} +\DeclareUnicodeComposite{\'} {g}{"01F5} +\DeclareUnicodeComposite{\textcommabelow}{S}{"0218} +\DeclareUnicodeComposite{\textcommabelow}{s}{"0219} +\DeclareUnicodeComposite{\textcommabelow}{T}{"021A} +\DeclareUnicodeComposite{\textcommabelow}{t}{"021B} +\DeclareUnicodeComposite{\=} {Y}{"0232} +\DeclareUnicodeComposite{\=} {y}{"0232} +\DeclareUnicodeComposite{\.} {B}{"1E02} +\DeclareUnicodeComposite{\.} {b}{"1E03} +\DeclareUnicodeComposite{\d} {B}{"1E04} +\DeclareUnicodeComposite{\d} {b}{"1E05} +\DeclareUnicodeComposite{\d} {D}{"1E0C} +\DeclareUnicodeComposite{\d} {d}{"1E0D} +\DeclareUnicodeComposite{\=} {G}{"1E20} +\DeclareUnicodeComposite{\=} {g}{"1E21} +\DeclareUnicodeComposite{\d} {H}{"1E24} +\DeclareUnicodeComposite{\d} {h}{"1E25} +\DeclareUnicodeComposite{\d} {K}{"1E32} +\DeclareUnicodeComposite{\d} {k}{"1E33} +\DeclareUnicodeComposite{\d} {L}{"1E36} +\DeclareUnicodeComposite{\d} {l}{"1E37} +\DeclareUnicodeComposite{\d} {M}{"1E42} +\DeclareUnicodeComposite{\d} {m}{"1E43} +\DeclareUnicodeComposite{\d} {N}{"1E46} +\DeclareUnicodeComposite{\d} {n}{"1E47} +\DeclareUnicodeComposite{\d} {R}{"1E5A} +\DeclareUnicodeComposite{\d} {r}{"1E5B} +\DeclareUnicodeComposite{\d} {S}{"1E62} +\DeclareUnicodeComposite{\d} {s}{"1E63} +\DeclareUnicodeComposite{\d} {T}{"1E6C} +\DeclareUnicodeComposite{\d} {t}{"1E6D} +\DeclareUnicodeComposite{\d} {V}{"1E7E} +\DeclareUnicodeComposite{\d} {v}{"1E7F} +\DeclareUnicodeComposite{\d} {W}{"1E88} +\DeclareUnicodeComposite{\d} {w}{"1E89} +\DeclareUnicodeComposite{\d} {Z}{"1E92} +\DeclareUnicodeComposite{\d} {z}{"1E93} +\DeclareUnicodeComposite{\d} {A}{"1EA0} +\DeclareUnicodeComposite{\d} {a}{"1EA1} +\DeclareUnicodeComposite{\d} {E}{"1EB8} +\DeclareUnicodeComposite{\d} {e}{"1EB9} +\DeclareUnicodeComposite{\d} {I}{"1ECA} +\DeclareUnicodeComposite{\d} {i}{"1ECB} +\DeclareUnicodeComposite{\d} {O}{"1ECC} +\DeclareUnicodeComposite{\d} {o}{"1ECD} +\DeclareUnicodeComposite{\d} {U}{"1EE4} +\DeclareUnicodeComposite{\d} {u}{"1EE5} +\DeclareUnicodeComposite{\d} {Y}{"1EF4} +\DeclareUnicodeComposite{\d} {y}{"1EF5} +% \end{macrocode} +% +% \begin{macrocode} +%</TU> +% \end{macrocode} +% +% \section{Package files} +% +% \changes{v1.9h}{1997/12/17}{Added section.} +% \changes{v1.9h}{1997/12/17}{Added code for textcomp.sty.} +% This file now also contains some packages that provide access to +% the more specialised encodings. +% +% \subsection{The fontenc package} +% +% \changes{v1.5c}{1994/05/14}{Added the fontenc package} +% \changes{v1.5g}{1994/05/16}{Removed the lowercasing of the filename.} +% \changes{v1.7a}{1994/11/30}{Always load the enc.def file, so that +% the default encoding for the commands will change.} +% \changes{v1.7x}{1996/05/18}{Produce error if encoding not found. +% pr/2054} +% \changes{v1.7y}{1996/05/21}{Corrected error message (CAR)} +% \changes{v1.8d}{1996/11/18} +% {(DPC) lowercase external file names. internal/1044}% +% This package allows authors to specify which encodings they will use. +% For each encoding |FOO|, the package looks to see if the encoding +% |FOO| has already been declared. If it has not, the file |fooenc.def| +% is loaded. The default encoding is set to be |FOO|. +% +% In addition the package at the moment contains extra code to extend +% the |\@uclclist| (list of upper/lower case pairs) for encodings that +% involve cyrillic characters. THIS IS A TEMPORARY SOLUTION and will not +% stay this way forever (or so we hope) but right now we are missing a +% proper interface for this and didn't wanted to rush it. +% \changes{v1.9r}{1999/01/07}{Hackery to temp support cyrillic uc/lc} +% \changes{v1.9t}{1999/02/24}{Corrected hackery cyrillic uc/lc list} +% \changes{v1.9x}{1999/12/08}{Changed \cs{CYRRHOOK} and \cs{cyrrhook} +% to\cs{CYRRHK} and \cs{cyrrhk} as name changed in the cyrillic +% bundle for naming consistency with other ``hook'' glyphs.} +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% Here we define a macro that extends the |\@uclclist| if needed and +% afterwards turns itself in a noop. +% \begin{macrocode} +\def\update@uclc@with@cyrillic{% + \expandafter\def\expandafter\@uclclist\expandafter + {\@uclclist + \cyra\CYRA\cyrabhch\CYRABHCH\cyrabhchdsc\CYRABHCHDSC\cyrabhdze + \CYRABHDZE\cyrabhha\CYRABHHA\cyrae\CYRAE\cyrb\CYRB\cyrbyus + \CYRBYUS\cyrc\CYRC\cyrch\CYRCH\cyrchldsc\CYRCHLDSC\cyrchrdsc + \CYRCHRDSC\cyrchvcrs\CYRCHVCRS\cyrd\CYRD\cyrdelta\CYRDELTA + \cyrdje\CYRDJE\cyrdze\CYRDZE\cyrdzhe\CYRDZHE\cyre\CYRE\cyreps + \CYREPS\cyrerev\CYREREV\cyrery\CYRERY\cyrf\CYRF\cyrfita + \CYRFITA\cyrg\CYRG\cyrgdsc\CYRGDSC\cyrgdschcrs\CYRGDSCHCRS + \cyrghcrs\CYRGHCRS\cyrghk\CYRGHK\cyrgup\CYRGUP\cyrh\CYRH + \cyrhdsc\CYRHDSC\cyrhhcrs\CYRHHCRS\cyrhhk\CYRHHK\cyrhrdsn + \CYRHRDSN\cyri\CYRI\cyrie\CYRIE\cyrii\CYRII\cyrishrt\CYRISHRT + \cyrishrtdsc\CYRISHRTDSC\cyrizh\CYRIZH\cyrje\CYRJE\cyrk\CYRK + \cyrkbeak\CYRKBEAK\cyrkdsc\CYRKDSC\cyrkhcrs\CYRKHCRS\cyrkhk + \CYRKHK\cyrkvcrs\CYRKVCRS\cyrl\CYRL\cyrldsc\CYRLDSC\cyrlhk + \CYRLHK\cyrlje\CYRLJE\cyrm\CYRM\cyrmdsc\CYRMDSC\cyrmhk\CYRMHK + \cyrn\CYRN\cyrndsc\CYRNDSC\cyrng\CYRNG\cyrnhk\CYRNHK\cyrnje + \CYRNJE\cyrnlhk\CYRNLHK\cyro\CYRO\cyrotld\CYROTLD\cyrp\CYRP + \cyrphk\CYRPHK\cyrq\CYRQ\cyrr\CYRR\cyrrdsc\CYRRDSC\cyrrhk + \CYRRHK\cyrrtick\CYRRTICK\cyrs\CYRS\cyrsacrs\CYRSACRS + \cyrschwa\CYRSCHWA\cyrsdsc\CYRSDSC\cyrsemisftsn\CYRSEMISFTSN + \cyrsftsn\CYRSFTSN\cyrsh\CYRSH\cyrshch\CYRSHCH\cyrshha\CYRSHHA + \cyrt\CYRT\cyrtdsc\CYRTDSC\cyrtetse\CYRTETSE\cyrtshe\CYRTSHE + \cyru\CYRU\cyrushrt\CYRUSHRT\cyrv\CYRV\cyrw\CYRW\cyry\CYRY + \cyrya\CYRYA\cyryat\CYRYAT\cyryhcrs\CYRYHCRS\cyryi\CYRYI\cyryo + \CYRYO\cyryu\CYRYU\cyrz\CYRZ\cyrzdsc\CYRZDSC\cyrzh\CYRZH + \cyrzhdsc\CYRZHDSC}% + \let\update@uclc@with@cyrillic\relax +} +% \end{macrocode} +% +% Here we process each option: +% \begin{macrocode} +\DeclareOption*{% + \let\encodingdefault\CurrentOption + \edef\reserved@f{% + \lowercase{\def\noexpand\reserved@f{\CurrentOption enc.def}}}% + \reserved@f + \InputIfFileExists\reserved@f + {}{\PackageError{fontenc}% + {Encoding file `\reserved@f' not found.% + \MessageBreak + You might have misspelt the name of the encoding}% + {Necessary code for this encoding was not + loaded.\MessageBreak + Thus calling the encoding later on will + produce further error messages.}}% + \let\reserved@f\relax +% \end{macrocode} +% +% In case the current encoding is one of a list of known +% cyrillic ones we extend the |\@uclclist|: +% \begin{macrocode} + \expandafter\in@\expandafter{\CurrentOption}% + {T2A,T2B,T2C,X2,LCY,OT2}% + \ifin@ +% \end{macrocode} +% +% But only if it hasn't already been extended. This might happen if +% there are several calls to fontenc loading one of the above +% encodings. If we don't do this check the |\@uclclist| gets +% unnecessarily big, slowing down the processing at runtime. +% \changes{v1.9v}{1999/06/12}{Extend \cs{@uclclist} only once} +% \begin{macrocode} + \expandafter\in@\expandafter\cyra\expandafter + {\@uclclist}% + \ifin@ + \else + \update@uclc@with@cyrillic + \fi + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\ProcessOptions* +% \end{macrocode} +% +% \begin{macrocode} +\fontencoding\encodingdefault\selectfont +% \end{macrocode} +% +% To save some space we get rid of the macro extending the +% |\@uclclist| (might have happened already). +% \begin{macrocode} +\let\update@uclc@with@cyrillic\relax +% \end{macrocode} +% +% Finally we pretend that the fontenc package wasn't read in. This +% allows for using it several times, e.g., in a class file and in the +% preamble (at the cost of not getting any version info). +% That kind of hackery shows that using a general purpose +% package just for loading an encoding is not the right kind +% of interface for setting up encodings --- it will get replaced at +% some point in the future. +% \changes{v1.9r}{1999/01/07}{Hackery to allow using fontenc several +% times} +% \changes{v1.9u}{1999/06/10}{Ensure that we also forget old options +% (pr/2888)} +% \begin{macrocode} +\global\expandafter\let\csname ver@fontenc.sty\endcsname\relax +\global\expandafter\let\csname opt@fontenc.sty\endcsname\relax +\global\let\@ifl@ter@@\@ifl@ter +\def\@ifl@ter#1#2#3#4#5{\global\let\@ifl@ter\@ifl@ter@@} +%</package> +% \end{macrocode} +% +% +% \subsection{The textcomp package} +% +% This one is for the |TS1| encoding which contains text symbols +% for use with the |T1|-encoded text fonts. It therefore first +% inputs the file |TS1enc.def| and then sets (or resets) the +% defaults for the symbols it contains. The result of this is that +% when one of these symbols is accessed and the current encoding +% does not provide it, the symbol will be supplied by a silent, +% local change to this encoding. +% +% \begin{macrocode} +%<*TS1sty> +% \end{macrocode} +% Since many PostScript fonts only implement a subset of |TS1| many +% commands only produce black blobs of ink. To resolve the +% resulting problems a number of options have been introduced and +% some code has been developed to distinguish sub-encodings. +% +% The sub-encodings have a numerical id and are defined as follows +% for \texttt{TS1}: +% \begin{description} +% +% \item[\#5] those \texttt{TS1} symbols that are also in the ISO-Adobe +% character set; without \verb=textcurrency=, which is often +% misused for the Euro. Older Type1 fonts from the non-\TeX{} +% world provide only this subset. +% +% \item[\#4] = \#5 + \verb=\texteuro=. Most newer fonts provide this. +% +% \item[\#3] = \#4 + \verb=\textomega=. Can also be described as +% $\texttt{TS1} \cap (\texttt{ISO-Adobe} \cup +% \texttt{MacRoman})$. (Except for the missing "currency".) + +% +% \item[\#2] = \#3 + \verb=\textestimated= + \verb=\textcurrency=. Can +% also be described as $\texttt{TS1} \cap +% \texttt{Adobe-Western-2}$. This may be relevant for OpenType +% fonts, which usually show the Adobe-Western-2 character set. +% +% \item[\#1] = \texttt{TS1} without \verb=\textcircled= and \verb=\t=. +% These two glyphs are often not implemented and if their kernel +% defaults are changed commands like \verb=\copyright= +% unnecessarily fail. +% +% \item[\#0] = full \texttt{TS1} +% \end{description} +% +% And here a summary to go in the transcript file: +% \begin{macrocode} +\PackageInfo{textcomp}{Sub-encoding information:\MessageBreak + \space\space 5 = only ISO-Adobe without + \string\textcurrency\MessageBreak + \space\space 4 = 5 + \string\texteuro\MessageBreak + \space\space 3 = 4 + \string\textohm\MessageBreak + \space\space 2 = 3 + \noexpand\textestimated+ + \string\textcurrency\MessageBreak + \space\space 1 = TS1 - \noexpand\textcircled- + \string\t\MessageBreak + \space\space 0 = TS1 (full)\MessageBreak + Font families with sub-encoding setting implement\MessageBreak + only a restricted character set as indicated.\MessageBreak + Family '?' is the default used for unknown fonts.\MessageBreak + See the documentation for details\@gobble} +% \end{macrocode} +% +% \begin{macro}{\DeclareEncodingSubset} +% An encoding subset to which a font family belongs is declared by +% the command |\DeclareEncodingSubset| that takes the major encoding as the +% first argument (e.g., |TS1|), the family name as the second +% argument (e.g., |cmr|), and the subset encoding id as a third, +% (e.g., |0| for |cmr|). +% +% The default encoding subset to use when nothing is known about +% the current font family is named |?|. +% \begin{macrocode} +\def\DeclareEncodingSubset#1#2#3{% + \@ifundefined{#1:#2}% + {\PackageInfo{textcomp}{Setting #2 sub-encoding to #1/#3}}% + {\PackageInfo{textcomp}{Changing #2 sub-encoding to #1/#3}}% + \@namedef{#1:#2}{#3}} +\@onlypreamble\DeclareEncodingSubset +% \end{macrocode} +% \end{macro} +% +% +% The options for the package are the following: +% \begin{description} +% \item[safe] +% for unknown font families enables only symbols that are also +% in the ISO-Adobe character set; without "currency", which is +% often misused for the Euro. Older Type1 fonts from the +% non-TeX world provide only this subset. +% +% \item[euro] +% enables the ``safe'' symbols plus the |\texteuro| +% command. Most newer fonts provide this. +% +% \item[full] enables all |TS1| commands; useful only with fonts +% like EC or CM bright. +% +% \item[almostfull] +% same as ``full'', except that |\textcircled| +% and |\t| are \emph{not} redefined from their defaults to avoid +% that commands like |\copyright| suddenly no longer work. +% +% \item[force] +% ignore all subset encoding definitions stored in the package +% itself or in the configuration file and always use the default +% subset as specified by one of the other options (seldom useful, +% only dangerous). +% \end{description} + +% \begin{macro}{\iftc@forced} +% Switch used to implement the \texttt{force} option +% \begin{macrocode} +\newif\iftc@forced \tc@forcedfalse +% \end{macrocode} +% \end{macro} + +% This is implemented by defining the default subset: +% \begin{macrocode} +\DeclareOption{full}{\DeclareEncodingSubset{TS1}{?}{0}} +\DeclareOption{almostfull}{\DeclareEncodingSubset{TS1}{?}{1}} +\DeclareOption{euro}{\DeclareEncodingSubset{TS1}{?}{4}} +\DeclareOption{safe}{\DeclareEncodingSubset{TS1}{?}{5}} +% \end{macrocode} +% The default is ``almostfull'' which means that old documents will +% work except that |\textcircled| and |\t| will use the kernel +% defaults (with the advantage that this also works if the current +% font (as often the case) doesn't implement these glyphs. +% +% The ``force'' option simply sets the switch to true. +% \begin{macrocode} +\DeclareOption{force}{\tc@forcedtrue} +% \end{macrocode} +% +% The suggestions to user is to use the ``safe'' option always +% unless that balks in which case they could switch to +% ``almostfull'' but then better check their output manually. +% +% \begin{macrocode} +\def\tc@errorwarn{\PackageError} +\DeclareOption{warn}{\gdef\tc@errorwarn#1#2#3{\PackageWarning{#1}{#2}}} +% \end{macrocode} +% +% \begin{macrocode} +\ExecuteOptions{almostfull} +\ProcessOptions\relax +% \end{macrocode} +% +% \begin{macro}{\CheckEncodingSubset} +% The command |\CheckEncodingSubset| will check if the current font +% family has the right encoding subset to typeset a certain +% command. It takes five arguments as follows: +% first argument is either |\UseTextSymbol|, |\UseTextAccent| +% depending on whether or not the symbol is a text symbol or a text +% accent. + +% The second argument is the encoding from which this symbol should +% be fetched. +% +% The third argument is either a fake accessor command or an error +% message. the code in that argument (if ever executed) receives +% two arguments: |#2| and |#5| of |\CheckEncodingSubset|. +% +% Argument four is the subset encoding id to test against: if this +% value is higher than the subset id of the current font family +% then we typeset the symbol, i.e., execute |#1{#2}#5| otherwise +% it runs |#3#5|, e.g., to produce an error message or fake the +% glyph somehow. +% +% Argument five is the symbol or accent command that is being +% checked. +% +% For usage examples see definitions below. +% \begin{macrocode} +\iftc@forced +% \end{macrocode} +% If the ``force'' option was given we always use the default for +% testing against. +% \begin{macrocode} +\def\CheckEncodingSubset#1#2#3#4#5{% + \ifnum #4>% + 0\csname #2:?\endcsname + \relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {#1{#2}}{#3}% + #5% +} +% \end{macrocode} +% In normal circumstances the test is a bit more complicated: first +% check if there exists a macro +% |\|\meta{arg2}|:|\meta{current-family} and if so use that value +% to test against, otherwise use the default to test against. +% \begin{macrocode} +\else +\def\CheckEncodingSubset#1#2#3#4#5{% + \ifnum #4>% + \expandafter\ifx\csname #2:\f@family\endcsname\relax + 0\csname #2:?\endcsname + \else + \csname #2:\f@family\endcsname + \fi + \relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi + {#1{#2}}{#3}% + #5% +} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tc@subst} +% \begin{macrocode} +\def\tc@subst#1{% + \tc@errorwarn{textcomp}% % should be latex error if general + {Symbol \string#1 not provided by\MessageBreak + font family \f@family\space + in TS1 encoding.\MessageBreak Default family used instead}\@eha + \bgroup\fontfamily\textcompsubstdefault\selectfont#1\egroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textcompsubstdefault} +% \begin{macrocode} +\def\textcompsubstdefault{cmr} +% \end{macrocode} +% \end{macro} + +% \begin{macro}{\tc@error} +% |\tc@error| is going to be used in arg |#3| of +% |\CheckEncodingSubset| when a symbol is not available in a +% certain font family. It gets pass the encoding it normally lives +% in (arg one) and the name of the symbol or accent that has a +% problem. +% +% \begin{macrocode} +% error commands take argument: +% #1 symbol to be used +\def\tc@error#1{% + \PackageError{textcomp}% % should be latex error if general + {Accent \string#1 not provided by\MessageBreak + font family \f@family\space + in TS1 encoding}\@eha +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tc@fake@euro} +% |\tc@fake@euro| is an example of a ``fake'' definition to use in arg |#3| of +% |\CheckEncodingSubset| when a symbol is not available in a +% certain font family. Here we produce an Euro symbol by combining +% a ``C'' with a ``=''. +% \begin{macrocode} +\def\tc@fake@euro#1{% + \leavevmode + \PackageInfo{textcomp}{Faking \noexpand#1for font family + \f@family\MessageBreak in TS1 encoding}% + \valign{##\cr + \vfil\hbox to 0.07em{\dimen@\f@size\p@ + \math@fontsfalse + \fontsize{.7\dimen@}\z@\selectfont=\hss}% + \vfil\cr% + \hbox{C}\crcr + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tc@check@symbol} +% \begin{macro}{\tc@check@accent} +% These are two abbreviations that we use below to check symbols +% and accents in TS1. Only there to save some space, e.g., we can +% then write +%\begin{verbatim} +%\DeclareTextCommandDefault{\textcurrency}{\tc@check@symbol3\textcurrency} +%\end{verbatim} +% to ensure that |\textcurrency| is only typeset if the current +% font has a \texttt{TS1} subset id of less than 3. Otherwise +% |\tc@error| is called telling the user that for this font family +% |\textcurreny| is not available. +% \begin{macrocode} +\def\tc@check@symbol{\CheckEncodingSubset\UseTextSymbol{TS1}\tc@subst} +\def\tc@check@accent{\CheckEncodingSubset\UseTextAccent{TS1}\tc@error} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% We start with the commands that are ``safe'' and which can be +% unconditionally set up, first the accents\ldots +% \begin{macrocode} +\DeclareTextAccentDefault{\capitalcedilla}{TS1} +\DeclareTextAccentDefault{\capitalogonek}{TS1} +\DeclareTextAccentDefault{\capitalgrave}{TS1} +\DeclareTextAccentDefault{\capitalacute}{TS1} +\DeclareTextAccentDefault{\capitalcircumflex}{TS1} +\DeclareTextAccentDefault{\capitaltilde}{TS1} +\DeclareTextAccentDefault{\capitaldieresis}{TS1} +\DeclareTextAccentDefault{\capitalhungarumlaut}{TS1} +\DeclareTextAccentDefault{\capitalring}{TS1} +\DeclareTextAccentDefault{\capitalcaron}{TS1} +\DeclareTextAccentDefault{\capitalbreve}{TS1} +\DeclareTextAccentDefault{\capitalmacron}{TS1} +\DeclareTextAccentDefault{\capitaldotaccent}{TS1} +% \end{macrocode} +% \ldots and then the other glyphs. +% \changes{v1.9p}{1998/06/12}{Renamed \cs{textmacron} pr/2840} +% \begin{macrocode} +\DeclareTextSymbolDefault{\textcapitalcompwordmark}{TS1} +\DeclareTextSymbolDefault{\textascendercompwordmark}{TS1} +\DeclareTextSymbolDefault{\textquotestraightbase}{TS1} +\DeclareTextSymbolDefault{\textquotestraightdblbase}{TS1} +\DeclareTextSymbolDefault{\texttwelveudash}{TS1} +\DeclareTextSymbolDefault{\textthreequartersemdash}{TS1} +\DeclareTextSymbolDefault{\textdollar}{TS1} +\DeclareTextSymbolDefault{\textquotesingle}{TS1} +\DeclareTextSymbolDefault{\textasteriskcentered}{TS1} +\DeclareTextSymbolDefault{\textfractionsolidus}{TS1} +\DeclareTextSymbolDefault{\textminus}{TS1} +\DeclareTextSymbolDefault{\textlbrackdbl}{TS1} +\DeclareTextSymbolDefault{\textrbrackdbl}{TS1} +\DeclareTextSymbolDefault{\textasciigrave}{TS1} +\DeclareTextSymbolDefault{\texttildelow}{TS1} +\DeclareTextSymbolDefault{\textasciibreve}{TS1} +\DeclareTextSymbolDefault{\textasciicaron}{TS1} +\DeclareTextSymbolDefault{\textgravedbl}{TS1} +\DeclareTextSymbolDefault{\textacutedbl}{TS1} +\DeclareTextSymbolDefault{\textdagger}{TS1} +\DeclareTextSymbolDefault{\textdaggerdbl}{TS1} +\DeclareTextSymbolDefault{\textbardbl}{TS1} +\DeclareTextSymbolDefault{\textperthousand}{TS1} +\DeclareTextSymbolDefault{\textbullet}{TS1} +\DeclareTextSymbolDefault{\textcelsius}{TS1} +\DeclareTextSymbolDefault{\textflorin}{TS1} +\DeclareTextSymbolDefault{\texttrademark}{TS1} +\DeclareTextSymbolDefault{\textcent}{TS1} +\DeclareTextSymbolDefault{\textsterling}{TS1} +\DeclareTextSymbolDefault{\textyen}{TS1} +\DeclareTextSymbolDefault{\textbrokenbar}{TS1} +\DeclareTextSymbolDefault{\textsection}{TS1} +\DeclareTextSymbolDefault{\textasciidieresis}{TS1} +\DeclareTextSymbolDefault{\textcopyright}{TS1} +\DeclareTextSymbolDefault{\textordfeminine}{TS1} +\DeclareTextSymbolDefault{\textlnot}{TS1} +\DeclareTextSymbolDefault{\textregistered}{TS1} +\DeclareTextSymbolDefault{\textasciimacron}{TS1} +\DeclareTextSymbolDefault{\textdegree}{TS1} +\DeclareTextSymbolDefault{\textpm}{TS1} +\DeclareTextSymbolDefault{\texttwosuperior}{TS1} +\DeclareTextSymbolDefault{\textthreesuperior}{TS1} +\DeclareTextSymbolDefault{\textasciiacute}{TS1} +\DeclareTextSymbolDefault{\textmu}{TS1} +\DeclareTextSymbolDefault{\textparagraph}{TS1} +\DeclareTextSymbolDefault{\textperiodcentered}{TS1} +\DeclareTextSymbolDefault{\textonesuperior}{TS1} +\DeclareTextSymbolDefault{\textordmasculine}{TS1} +\DeclareTextSymbolDefault{\textonequarter}{TS1} +\DeclareTextSymbolDefault{\textonehalf}{TS1} +\DeclareTextSymbolDefault{\textthreequarters}{TS1} +\DeclareTextSymbolDefault{\texttimes}{TS1} +\DeclareTextSymbolDefault{\textdiv}{TS1} +% \end{macrocode} +% +% The |\texteuro| is only available for subsets with id 4 or +% less. Otherwise we fake the glyph using |\tc@fake@euro| +% \begin{macrocode} +\DeclareTextCommandDefault{\texteuro} + {\CheckEncodingSubset\UseTextSymbol{TS1}\tc@fake@euro5\texteuro} +% \end{macrocode} +% +% The |\textohm| is only available for subsets with id 3 or +% less. Otherwise we produce an error. +% \begin{macrocode} +\DeclareTextCommandDefault{\textohm}{\tc@check@symbol4\textohm} +% \end{macrocode} +% The |\textestimated| and |\textcurrency| are only provided for +% fonts with subset encoding with id 2 or less. +% \begin{macrocode} +\DeclareTextCommandDefault{\textestimated}% + {\tc@check@symbol3\textestimated} +\DeclareTextCommandDefault{\textcurrency}% + {\tc@check@symbol3\textcurrency} +% \end{macrocode} +% Nearly all of the remaining glyphs are provided only with fonts +% with id 1 or 0, i.e., are essentially complete. +% \begin{macrocode} +\DeclareTextCommandDefault{\capitaltie}% + {\tc@check@accent2\capitaltie} +\DeclareTextCommandDefault{\newtie}% + {\tc@check@accent2\newtie} +\DeclareTextCommandDefault{\capitalnewtie}% + {\tc@check@accent2\capitalnewtie} +\DeclareTextCommandDefault{\textleftarrow}% + {\tc@check@symbol2\textleftarrow} +\DeclareTextCommandDefault{\textrightarrow}% + {\tc@check@symbol2\textrightarrow} +\DeclareTextCommandDefault{\textblank}% + {\tc@check@symbol2\textblank} +\DeclareTextCommandDefault{\textdblhyphen}% + {\tc@check@symbol2\textdblhyphen} +\DeclareTextCommandDefault{\textzerooldstyle}% + {\tc@check@symbol2\textzerooldstyle} +\DeclareTextCommandDefault{\textoneoldstyle}% + {\tc@check@symbol2\textoneoldstyle} +\DeclareTextCommandDefault{\texttwooldstyle}% + {\tc@check@symbol2\texttwooldstyle} +\DeclareTextCommandDefault{\textthreeoldstyle}% + {\tc@check@symbol2\textthreeoldstyle} +\DeclareTextCommandDefault{\textfouroldstyle}% + {\tc@check@symbol2\textfouroldstyle} +\DeclareTextCommandDefault{\textfiveoldstyle}% + {\tc@check@symbol2\textfiveoldstyle} +\DeclareTextCommandDefault{\textsixoldstyle}% + {\tc@check@symbol2\textsixoldstyle} +\DeclareTextCommandDefault{\textsevenoldstyle}% + {\tc@check@symbol2\textsevenoldstyle} +\DeclareTextCommandDefault{\texteightoldstyle}% + {\tc@check@symbol2\texteightoldstyle} +\DeclareTextCommandDefault{\textnineoldstyle}% + {\tc@check@symbol2\textnineoldstyle} +\DeclareTextCommandDefault{\textlangle}% + {\tc@check@symbol2\textlangle} +\DeclareTextCommandDefault{\textrangle}% + {\tc@check@symbol2\textrangle} +\DeclareTextCommandDefault{\textmho}% + {\tc@check@symbol2\textmho} +\DeclareTextCommandDefault{\textbigcircle}% + {\tc@check@symbol2\textbigcircle} +\DeclareTextCommandDefault{\textuparrow}% + {\tc@check@symbol2\textuparrow} +\DeclareTextCommandDefault{\textdownarrow}% + {\tc@check@symbol2\textdownarrow} +\DeclareTextCommandDefault{\textborn}% + {\tc@check@symbol2\textborn} +\DeclareTextCommandDefault{\textdivorced}% + {\tc@check@symbol2\textdivorced} +\DeclareTextCommandDefault{\textdied}% + {\tc@check@symbol2\textdied} +\DeclareTextCommandDefault{\textleaf}% + {\tc@check@symbol2\textleaf} +\DeclareTextCommandDefault{\textmarried}% + {\tc@check@symbol2\textmarried} +\DeclareTextCommandDefault{\textmusicalnote}% + {\tc@check@symbol2\textmusicalnote} +\DeclareTextCommandDefault{\textdblhyphenchar}% + {\tc@check@symbol2\textdblhyphenchar} +\DeclareTextCommandDefault{\textdollaroldstyle}% + {\tc@check@symbol2\textdollaroldstyle} +\DeclareTextCommandDefault{\textcentoldstyle}% + {\tc@check@symbol2\textcentoldstyle} +\DeclareTextCommandDefault{\textcolonmonetary}% + {\tc@check@symbol2\textcolonmonetary} +\DeclareTextCommandDefault{\textwon}% + {\tc@check@symbol2\textwon} +\DeclareTextCommandDefault{\textnaira}% + {\tc@check@symbol2\textnaira} +\DeclareTextCommandDefault{\textguarani}% + {\tc@check@symbol2\textguarani} +\DeclareTextCommandDefault{\textpeso}% + {\tc@check@symbol2\textpeso} +\DeclareTextCommandDefault{\textlira}% + {\tc@check@symbol2\textlira} +\DeclareTextCommandDefault{\textrecipe}% + {\tc@check@symbol2\textrecipe} +\DeclareTextCommandDefault{\textinterrobang}% + {\tc@check@symbol2\textinterrobang} +\DeclareTextCommandDefault{\textinterrobangdown}% + {\tc@check@symbol2\textinterrobangdown} +\DeclareTextCommandDefault{\textdong}% + {\tc@check@symbol2\textdong} +\DeclareTextCommandDefault{\textpertenthousand}% + {\tc@check@symbol2\textpertenthousand} +\DeclareTextCommandDefault{\textpilcrow}% + {\tc@check@symbol2\textpilcrow} +\DeclareTextCommandDefault{\textbaht}% + {\tc@check@symbol2\textbaht} +\DeclareTextCommandDefault{\textnumero}% + {\tc@check@symbol2\textnumero} +\DeclareTextCommandDefault{\textdiscount}% + {\tc@check@symbol2\textdiscount} +\DeclareTextCommandDefault{\textopenbullet}% + {\tc@check@symbol2\textopenbullet} +\DeclareTextCommandDefault{\textservicemark}% + {\tc@check@symbol2\textservicemark} +\DeclareTextCommandDefault{\textlquill}% + {\tc@check@symbol2\textlquill} +\DeclareTextCommandDefault{\textrquill}% + {\tc@check@symbol2\textrquill} +\DeclareTextCommandDefault{\textcopyleft}% + {\tc@check@symbol2\textcopyleft} +\DeclareTextCommandDefault{\textcircledP}% + {\tc@check@symbol2\textcircledP} +\DeclareTextCommandDefault{\textreferencemark}% + {\tc@check@symbol2\textreferencemark} +\DeclareTextCommandDefault{\textsurd}% + {\tc@check@symbol2\textsurd} +% \end{macrocode} +% The |\textcircled| and |\t| are handled specially, unless the +% current font has a subset id of 0 (i.e. full \texttt{TS1}) we +% pick the symbols up from the the math font encodings, i.e., the +% third argument to |\CheckEncodingSubset| uses |\UseTextAccent| to +% get them from there. +% \begin{macrocode} +\DeclareTextCommandDefault{\textcircled} + {\CheckEncodingSubset\UseTextAccent{TS1}% + {\UseTextAccent{OMS}}1\textcircled} +\DeclareTextCommandDefault{\t} + {\CheckEncodingSubset\UseTextAccent{TS1}% + {\UseTextAccent{OML}}1\t} +% \end{macrocode} + + +% +% Finally input the encoding-specific definitions for +% \texttt{TS1} thus making the top-level definitions +% optimised for this encoding (and not for the default +% encoding, see section~\ref{sec:orderofdecls}). +% \changes{v1.9o}{1998/03/20}{Load decls after defaults for speed.} +% \begin{macrocode} +\input{ts1enc.def} +% \end{macrocode} +% Now having the new glyphs available we also want to make sure +% that they are used. For most cases this will automatically happen +% but for some glyphs there are inferior definitions already known +% to \LaTeX{} which will prevent the usage of the \texttt{TS1} +% versions (see section~\ref{sec:removeencspec} above). So we better +% get rid of them: +% \changes{v1.9o}{1998/03/20}{Added various \cs{UndeclareTextCommand} +% declarations for pr/2783} +% \begin{macrocode} +\UndeclareTextCommand{\textsterling}{OT1} +\UndeclareTextCommand{\textdollar} {OT1} +% \end{macrocode} +% Similar declarations should probably be made for other encodings +% like \texttt{OT4} if they are in use. +% \begin{macrocode} +%\UndeclareTextCommand{\textsterling}{OT4} +%\UndeclareTextCommand{\textdollar} {OT4} +% \end{macrocode} +% From the \texttt{T1} encoding there are two candidates for removal: +% \textperthousand{} and \textpertenthousand{} since these are both +% constructed from \% followed by a tiny +% `{\fontencoding{T1}\selectfont \char 24}' +% rather than being a single glyph. The problem with this +% approach is that in PostScript fonts this small zero is usually not +% available resulting in \%\rule{3pt}{3pt} rather than +% \textperthousand{} while the real glyph (at least for +% |\textperthousand|) is available in the PostScript version of +% \texttt{TS1}. So for the moment we compromise by removing the +% \texttt{T1} declaration for |\textperthousand| but keeping the one +% for |\textpertenthousand|. This will have the effect that with +% Computer Modern fonts everything will come out (although +% \textperthousand{} and \textpertenthousand{} are not taken from the +% same physical font) and with PostScript fonts \textperthousand{} +% will come out correctly while \textpertenthousand{} will most +% likely look like \%\rule{6pt}{3pt} --- which is probably an +% improvement over just getting a single `\rule{3pt}{3pt}' to +% indicate a completely missing glyph, which would happen if we +% also `undeclared' |\textpertenthousand|. +% \begin{macrocode} +\UndeclareTextCommand{\textperthousand}{T1} +%\UndeclareTextCommand{\textpertenthousand}{T1} +% \end{macrocode} +% +% +% \subsubsection{Supporting oldstyle digits} +% +% \begin{macrocode} +\DeclareRobustCommand\oldstylenums[1]{% + \begingroup + \ifmmode + \mathgroup\symletters #1% + \else + \CheckEncodingSubset\@use@text@encoding{TS1}% + {\PackageWarning{textcomp}% + {Oldstyle digits unavailable for + family \f@family.\MessageBreak + Lining digits used instead}}% + \tw@{#1}% + \fi + \endgroup +} +% \end{macrocode} +% +% \subsubsection{Subset encoding defaults} +% +% For many font families commonly used in the \TeX{} world we +% provide the subset encoding data here. Users can add additional +% font families in the file \texttt{textcomp.cfg} if they own other +% fonts. +% +% However, if the option ``forced'' was given then all subset +% encoding specifications are ignored, so there is no point in +% setting any of them up: +% \begin{macrocode} +\iftc@forced \else +% \end{macrocode} +% +% Computer modern based fonts (e.g., CM, CM-Bright, Concrete): +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{cmr} {0} +\DeclareEncodingSubset{TS1}{cmss} {0} +\DeclareEncodingSubset{TS1}{cmtt} {0} +\DeclareEncodingSubset{TS1}{cmvtt} {0} +\DeclareEncodingSubset{TS1}{cmbr} {0} +\DeclareEncodingSubset{TS1}{cmtl} {0} +\DeclareEncodingSubset{TS1}{ccr} {0} +% \end{macrocode} +% +% PSNFSS fonts: +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{ptm} {4} +\DeclareEncodingSubset{TS1}{pcr} {4} +\DeclareEncodingSubset{TS1}{phv} {4} +\DeclareEncodingSubset{TS1}{ppl} {3} +\DeclareEncodingSubset{TS1}{pag} {4} +\DeclareEncodingSubset{TS1}{pbk} {4} +\DeclareEncodingSubset{TS1}{pnc} {4} +\DeclareEncodingSubset{TS1}{pzc} {4} +\DeclareEncodingSubset{TS1}{bch} {4} +\DeclareEncodingSubset{TS1}{put} {5} +% \end{macrocode} +% +% Other CTAN fonts (probably not complete): +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{uag} {5} +\DeclareEncodingSubset{TS1}{ugq} {5} +\DeclareEncodingSubset{TS1}{ul8} {4} +\DeclareEncodingSubset{TS1}{ul9} {4} % (LuxiSans, one day) +\DeclareEncodingSubset{TS1}{augie} {5} +\DeclareEncodingSubset{TS1}{dayrom} {3} +\DeclareEncodingSubset{TS1}{dayroms} {3} +\DeclareEncodingSubset{TS1}{pxr} {0} +\DeclareEncodingSubset{TS1}{pxss} {0} +\DeclareEncodingSubset{TS1}{pxtt} {0} +\DeclareEncodingSubset{TS1}{txr} {0} +\DeclareEncodingSubset{TS1}{txss} {0} +\DeclareEncodingSubset{TS1}{txtt} {0} +% \end{macrocode} +% +% Latin Modern and TeX Gyre: +% \changes{v1.99k}{2009/10/28}{Added Latin Modern and TeX Gyre subsets} +% \changes{v1.99l}{2009/11/04}{Added more Latin Modern and TeX Gyre subsets} +% \changes{v1.99m}{2015/02/16}{Added lmtt (Heiko Oberdiek) latex/4415} +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{lmr} {0} +\DeclareEncodingSubset{TS1}{lmdh} {0} +\DeclareEncodingSubset{TS1}{lmss} {0} +\DeclareEncodingSubset{TS1}{lmssq} {0} +\DeclareEncodingSubset{TS1}{lmvtt} {0} +\DeclareEncodingSubset{TS1}{lmtt} {0} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{qhv} {0} +\DeclareEncodingSubset{TS1}{qag} {0} +\DeclareEncodingSubset{TS1}{qbk} {0} +\DeclareEncodingSubset{TS1}{qcr} {0} +\DeclareEncodingSubset{TS1}{qcs} {0} +\DeclareEncodingSubset{TS1}{qpl} {0} +\DeclareEncodingSubset{TS1}{qtm} {0} +\DeclareEncodingSubset{TS1}{qzc} {0} +\DeclareEncodingSubset{TS1}{qhvc} {0} +% \end{macrocode} +% +% Fourier-GUTenberg: +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{futs} {4} +\DeclareEncodingSubset{TS1}{futx} {4} +\DeclareEncodingSubset{TS1}{futj} {4} +% \end{macrocode} +% +% Y\&Y's Lucida Bright +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{hlh} {3} +\DeclareEncodingSubset{TS1}{hls} {3} +\DeclareEncodingSubset{TS1}{hlst} {3} +% \end{macrocode} +% The remaining settings for Lucida are conservative: the following +% fonts contain the |\textohm| character but not the |\texteuro|, +% i.e., belong to neither subset~4 nor subset~3. If you want to +% use the |\textohm| with these fonts copy these definition to +% \texttt{textcomp.cfg} and change the subset to~3. However in that +% case make sure that you do not use the |\texteuro|. +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{hlct} {5} +\DeclareEncodingSubset{TS1}{hlx} {5} +\DeclareEncodingSubset{TS1}{hlce} {5} +\DeclareEncodingSubset{TS1}{hlcn} {5} +\DeclareEncodingSubset{TS1}{hlcw} {5} +\DeclareEncodingSubset{TS1}{hlcf} {5} +% \end{macrocode} +% +% Other commercial families\ldots +% \begin{macrocode} +\DeclareEncodingSubset{TS1}{pplx} {3} +\DeclareEncodingSubset{TS1}{pplj} {3} +\DeclareEncodingSubset{TS1}{ptmx} {4} +\DeclareEncodingSubset{TS1}{ptmj} {4} +% \end{macrocode} +% +% If the file \texttt{textcomp.cfg} exists it will be loaded at +% this point. This allows to define further subset encodings for +% font families not covered by default. +% +% \begin{macrocode} +\InputIfFileExists{textcomp.cfg} + {\PackageInfo{textcomp}{Local configuration file used}}{} +% \end{macrocode} +% +% \begin{macrocode} +\fi +%</TS1sty> +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins b/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins new file mode 100644 index 00000000000..62e35e77073 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltoutenc.ins @@ -0,0 +1,107 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generate{ + \file{ot1enc.def}{ + \from{ltoutenc.dtx}{OT1}} + \file{omsenc.def}{ + \from{ltoutenc.dtx}{OMS}} + \file{omlenc.def}{ + \from{ltoutenc.dtx}{OML}} + \file{t1enc.def}{ + \from{ltoutenc.dtx}{T1}} + \file{ot4enc.def}{ + \from{ltoutenc.dtx}{OT4}} + \file{ts1enc.def}{ + \from{ltoutenc.dtx}{TS1}} + \file{tuenc.def}{ + \from{ltoutenc.dtx}{TU}} + \file{textcomp.sty}{ + \from{ltoutenc.dtx}{TS1sty}} + \file{fontenc.sty}{ + \from{ltoutenc.dtx}{package}} +} + +\endbatchfile + + diff --git a/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx b/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx new file mode 100644 index 00000000000..d1fe26b90a0 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltoutput.dtx @@ -0,0 +1,5035 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltoutput.dtx +%<flafter>\ProvidesPackage{flafter} +%<fltrace>\ProvidesPackage{fltrace} +%<flafter,fltrace> [2018/11/28 v1.4d +%<flafter> Standard LaTeX floats after reference (FMi)] +%<fltrace> Tracing LaTeX floats algorithm (FMi)] +% +%<*driver> +% \fi +\ProvidesFile{ltoutput.dtx} + [2018/11/28 v1.4d LaTeX Kernel (Output Routine)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltoutput.dtx} +\title{\filename} +\date{\filedate} +\author{Leslie Lamport, Frank Mittelbach, Chris Rowley} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% +% \iffalse +% LATEX VERSION 2e +% Copyright (C) 1992 by Leslie Lamport +% Copyright (C) 1994-2000 by Leslie Lamport, LaTeX3 project +% +% LaTeX 2e kernel file for the output routine. +% +% Part of this file is the latest (not greatest, it still +% deserves its name) version of kludge.sty. +% +% It also contains a few enhancements and many changes (corrections +% and tidyings) to the float mechanism and other parts of the output +% routine. +% +% The tracing in the file at present is mainly to help in testing the +% code but it may well be developed into a full float tracing +% package one day. +% +% ============================ +% \fi +% +% \changes{v1.1p}{1995/08/25}{Support autoloading feature (FMi).} +% \task{CAR}{Update documentation.} +% \changes{v1.0k}{1994/02/08}{Documentation and tasks tidied.} +% \changes{v1.0l}{1994/03/15}{Driver added and further tidying.} +% \changes{v1.0l}{1994/03/15}{Some boxmaxdepth settings removed.} +% \changes{v1.0l}{1994/03/15}{Added some warnings when page gets full of +% top floats.} +% \changes{v1.0l}{1994/03/15}{Removed duplicated code and corrected +% docstrip options.} +% \changes{v1.0m}{1994/04/24}{Removed some long lines and other +% aesthetic changes.} +% \changes{v1.0m}{1994/04/24}{Corrected unverbed commands in +% documentation.} +% \changes{v1.0m}{1994/04/24}{Changed \cs{@normalsize} to +% \cs{normalsize}.} +% \changes{v1.0m}{1994/04/24}{Warning messages changed/corrected.} +% \changes{v1.0n}{1994/04/30}{Added \cs{col@number}.} +% \changes{v1.0n}{1994/04/30}{Fixed bug from \cs{dblfigrule} with +% \cs{@topnewpage}.} +% \changes{v1.0n}{1994/04/30}{Documentation tidied.} +% \changes{v1.0n}{1994/04/30}{\cs{@activechar@warning} changed to an +% info message.} +% \changes{v1.0n}{1994/04/30}{Full of floats action improved.} +% \changes{v1.0n}{1994/04/30}{Empty column action added.} +% \changes{v1.0o}{1994/05/02}{Code of \cs{@resethfps} shortened.} +% \changes{v1.0p}{1994/05/12}{\cs{normalcolor}added in various +% places (DPC).} +% \changes{v1.0q}{1994/05/16}{Changed setting of accents (FMi).} +% \changes{v1.0s}{1994/05/20}{Added setting of \cs{protect} +% during \cs{shipout}.} +% \changes{v1.0t}{1994/05/22}{Changed warnings and infos to +% new commands.} +% \changes{v1.0u}{1994/05/23}{Added \cs{MessageBreak}.} +% \changes{v1.0u}{1994/05/23}{Changed resetting of \cs{protect} after +% shipout.} +% \changes{v1.0v}{1994/05/25}{Extra documentation.} +% \changes{v1.0w}{1994/06/01}{Tidied up typesetting.} +% +% \changes{v1.1f}{1994/11/14}{Removed old definition of \cs{@testfp}.} +% \changes{v1.1h}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}.} +% \changes{v1.1m}{1995/05/07}{Use \cs{hb@xt@}.} +% \changes{v1.2n}{2015/02/21} +% {Removed autoload code} +% +% \StopEventually{} +% +% \def \ie {i.e.~} +% \def \eg {e.g.~} +% +% \section{Output Routine} +% +% \subsection{Floats} +% +% The `2ekernel' code ensures that a |\usepackage{autoout1}| is +% essentially ignored if a `full' format is being used that has +% the autoload file mode already in the format. +% \begin{macrocode} +%<defx>\begingroup +%<defx>\makeatletter +%<defx>\nfss@catcodes +%<2ekernel>\expandafter\let\csname ver@autoout1.sty\endcsname\fmtversion +% \end{macrocode} +% +% +% \begin{oldcomments} +% \begin{macrocode} +%<*2ekernel> +\message{output,} +% \end{macrocode} +% **************************************** +% * OUTPUT * +% **************************************** +% +% +% PAGE LAYOUT PARAMETERS +% +% \topmargin : Extra space added to top of page. +% @twoside : boolean. T if two-sided printing +% \oddsidemargin : IF @twoside = T +% THEN extra space added to left of odd-numbered +% pages. +% ELSE extra space added to left of all pages. +% \evensidemargin : IF @twoside = T +% THEN extra space added to left of even-numbered +% pages. +% \headheight : height of head +% \headsep : separation between head and text +% \footskip : distance separation between baseline of last +% line of text and baseline of foot. +% Note difference between \footSKIP and \headSEP. +% \textheight : height of text on page, excluding head and foot +% \textwidth : width of printing on page +% \columnsep : IF @twocolumn = T +% THEN width of space between columns +% \columnseprule : IF @twocolumn = T +% THEN width of rule between columns (0 if none). +% \columnwidth : IF @twocolumn = T +% THEN (\textwidth - \columnsep)/2 +% ELSE \textwidth +% It is set by the \twocolumn and +% \onecolumn commands. +% \@textbottom : Command executed at bottom of vbox holding text of +% page (including figures). The \raggedbottom +% command almost \let's this to \vfil (actually sets +% it to \vskip \z@ plus.0001fil). +% Should have depth 0pt. +% +% \@texttop : Command executed at top of vbox holding text of +% page (including figures). Used by letter style; +% can also be used to produce centered pages. +% Let to \relax by \raggedbottom and \flushbottom. +% +% Page layout must initialize \@colht and \@colroom to \textheight. +% +% PAGE STYLE PARAMETERS: +% +% \floatsep : Space left between floats. +% \textfloatsep : Space between last top float or first bottom float +% and the text. +% \topfigrule : Command to place rule (or whatever) between floats +% at top of page and text. Executed in inner +% vertical mode right before the \textfloatsep skip +% separating the floats from the text. Must occupy +% zero vertical space. (See \footnoterule.) +% \botfigrule : Same as \topfigrule, but put after the +% \textfloatsep skip separating text from the +% floats at bottom of page. +% \intextsep : Space left on top and bottom of an in-text float. +% \dblfloatsep : Space between double-column floats. +% \dbltextfloatsep : Space between top double-column floats +% and text. +% \dblfigrule : Similar to \topfigrule, but for double-column +% floats. +% \@fptop : Glue to go at top of float column -- must be 0pt + +% stretch +% \@fpsep : Glue to go between floats in a float column. +% \@fpbot : Glue to go at bottom of float column +% -- must be 0pt + +% stretch +% \@dblfptop, \@dblfpsep, \@dblfpbot +% : Analogous for double-column float page in +% two-column format. +% +% FOOTNOTES: As in PLAIN, footnotes use \insert\footins. +% +% PAGE LAYOUT SWITCHES AND MACROS +% +% @twocolumn : Boolean. T if two columns per page globally. +% +% PAGE STYLE MACROS AND SWITCHES +% +% \@oddhead : IF @twoside = T +% THEN macro to generate head of odd-numbered +% pages. +% ELSE macro to generate head of all pages. +% \@evenhead : IF @twoside = T +% THEN macro to generate head of even-numbered +% pages. +% \@oddfoot : IF @twoside = T +% THEN macro to generate foot of odd-numbered +% pages. +% ELSE macro to generate foot of all pages. +% \@evenfoot : IF @twoside = T +% THEN macro to generate foot of even-numbered +% pages. +% @specialpage : boolean. T if current page is to have a special +% format. +% \@specialstyle : If its value is foo then +% IF @specialpage = T +% THEN the command \ps@foo is executed to +% temporarily reset the page style parameters +% before composing the current page. +% This command should execute only \def's and +% \edef's, making only local definitions. +% +% FLOAT PLACEMENT PARAMETERS +% +% The following parameters are set by the macro \@floatplacement. +% When \@floatplacement is called, +% \@colht is the height of the page or column being built. I.e.: +% * For single-column page it equals \textheight. +% * For double-column page it equals \textheight - height +% of double-column floats on page. +% Note that some are set globally and some locally: +% \@topnum :=G Maximum number of floats allowed on the top of a +% column. +% \@toproom :=G Maximum amount of top of column devoted to floats-- +% excluding \textfloatsep separation below the floats +% and \floatsep separation between them. For +% two-column output, should be computed as a function +% of \@colht. +% \@botnum, \@botroom +% : Analogous to above. +% \@colnum :=G Maximum number of floats allowed in a column, +% including in-text floats. +% \@textmin :=L Minimum amount of text (excluding footnotes) that +% must appear on a text page. +% %% 27 Sep 85 : made local to +% %% \@addtocurcol and \@addtonextcol +% It is now also used locally in processing double +% floats. +% \@fpmin :=L Minimum height of floats in a float column. +% +% The macro \@dblfloatplacement sets the following parameters. +% \@dbltopnum :=G Maximum number of double-column floats allowed at +% the top of a two-column page. +% \@dbltoproom :=G Maximum height of double-column floats allowed at +% top of two-column page. +% \@fpmin :=L Minimum height of floats in a float column. +% It should also perform the following local assignments where necessary +% -- i.e., where the new value differs from the old one: +% \@fptop :=L \@dblfptop +% \@fpsep :=L \@dblfpsep +% \@fpbot :=L \@dblfpbot +% +% OUTPUT ROUTINE VARIABLES +% +% \@colht : The total height of the current column. In single column +% style, it equals \textheight. In two-column style, it is +% \textheight minus the height of the double-column floats +% on the current page. MUST BE INITIALIZED TO \textheight. +% +% \@colroom : The height available in the current column for text and +% footnotes. It equals \@colht minus the height of all +% floats committed to the top and bottom of the current +% column. +% +% \@textfloatsheight : The total height of in-text floats on the +% current page. +% +% \footins : Footnote insertion number. +% +% \@maxdepth : Saved value of TeX's \maxdepth. Must be set +% when any routine sets \maxdepth. +% +% CALLING THE OUTPUT ROUTINE +% -------------------------- +% +% The output routine is called either by TeX's normal page-breaking +% mechanism, or by a macro putting a penalty < or = -10000 in the output +% list. In the latter case, the penalty indicates why the output +% routine was called, using the following code. +% +% penalty reason +% ------- ------ +% -10000 \pagebreak +% \newpage +% -10001 \clearpage (\penalty -10000 \vbox{} \penalty -10001) +% -10002 float insertion, called from horizontal mode +% -10003 float insertion, called from vertical mode. +% -10004 float insertion. +% +% Note: A float or marginpar puts the following sequence in the output +% list: (i) a penalty of -10004, +% (ii) a null \vbox +% (iii) a penalty of -10002 or -10003. +% This solves two special problems: +% 1. If the float comes right after a \newpage or \clearpage, +% then the first penalty is ignored, but the second one +% invokes the output routine. +% 2. If there is a split footnote on the page, the second 'page' +% puts out the rest of the footnote. +% +% THE OUTPUT ROUTINE +% ------------------ +% +% FUNCTIONS USED IN THE OUTPUT ROUTINE: +% +% \@outputpage : Produces an output page with the contents of box +% \@outputbox as the text part. +% Also sets \@colht :=G \textheight. +% The page style is determined as follows. +% IF @thispagestyle = true +% THEN use \thispagestyle style +% ELSE use ordinary page style. +% +% \@tryfcolumn\FLIST : Tries to form a float column composed of floats +% from \FLIST (if nonempty) with the following parameters: +% \@colht : height of box +% \@fpmin : minimum height of floats in the box +% \@fpsep : interfloat space +% \@fptop : glue at top of box +% \@fpbot : glue at bottom of box. +% If it succeeds, then it does the following: +% * \@outputbox :=L the composed float box. +% * @fcolmade :=G true +% * \FLIST :=G \FLIST - floats put in box +% * \@freelist :=G \@freelist + floats put in box +% If it fails, then: +% * @fcolmade :=G false +% NOTE: BIT MUST BE A SINGLE TOKEN! +% +% \@makefcolumn \FLIST : Same as \@tryfcolumn except that it +% fails to make a float column only if \FLIST is empty. +% Otherwise, it makes a float column containing at least +% the first box in \FLIST, disregarding \@fpmin. +% +% \@startcolumn : +% Calls \@tryfcolumn\@deferlist. If \@tryfcolumn returns with +% (globally set) @fcolmade = false, then: +% * Globally sets \@toplist and \@botlist to floats +% from \@deferlist to go at top and bottom of column, +% deleting them from \@deferlist. It does +% this using \@colht as the total height, the page +% style parameters \@floatsep and \@textfloatsep, and +% the float placement parameters \@topnum, \@toproom, +% \@botnum, \@botroom, \@colnum and \textfraction. +% * Globally sets \@colroom to \@colht minus the height +% of the added floats. +% +% \@startdblcolumn : +% Calls \@tryfcolumn\@dbldeferlist{8}. If \@tryfcolumn returns +% with (globally set) @fcolmade = false, then: +% * Globally sets \@dbltoplist to floats from +% \@dbldeferlist to go at top and bottom of column, +% deleting them from \@dbldeferlist. +% It does this using \textheight as the +% total height, and the parameters \@dblfloatsep, etc. +% * Globally sets \@colht to \textheight minus the height +% of the added floats. +% +% \@combinefloats : Combines the text from box +% \@outputbox with the floats from \@toplist and \@botlist, +% putting the new box in \@outputbox. It uses \floatsep +% and \textfloatsep for the appropriate separations. +% It puts the elements of \TOPLIST and \BOTLIST onto +% \@freelist, and makes those lists null. +% +% \@makecol : Makes the contents of \box255 plus the accumulated +% footnotes, plus the floats in \@toplist and \@botlist, +% into a single column of height \@colht (unless the page +% height has been locally changed), which it puts +% into box \@outputbox. It puts boxes in \@midlist back +% onto \@freelist and restores \maxdepth. +% +% \@opcol : Outputs a column whose text is in box \@outputbox +% If @twocolumn = false, then it calls \@outputpage, +% sets \@colht :=G \textheight, and calls \@floatplacement. +% +% If @twocolumn = true, then: +% If @firstcolumn = true, then it puts box \@outputbox +% into \@leftcolumn and sets @firstcolumn :=G false. +% +% If @firstcolumn = false, then it puts out the current +% two-column page, any possible two-column float pages, +% and determines \@dbltoplist for the next page. +% +% +% +% USER COMMANDS THAT CALL OR AFFECT THE OUTPUT ROUTINE +% ---------------------------------------------------- +% +% \newpage == BEGIN \par\vfil\penalty -10000 END +% +% \clearpage == BEGIN \newpage +% \write -1{} % Part of hack to make sure no +% \vbox{} % \write's get lost. +% \penalty -10001 +% END +% +% \cleardoublepage == BEGIN \clearpage +% if @twoside = true and c@page is even +% then \hbox{} \newpage fi +% END +% +% +% \twocolumn[BOX] : starts a new page, changing to twocolumn setting +% and puts BOX in a parbox of width \textwidth across the top. +% Useful for full-width titles for double-column pages. +% SURPRISE: The stretch from \@dbltextfloatsep will be inserted +% between the BOX and the top of the two columns. +% +% +% FLOAT-HANDLING MECHANISMS +% ------------------------- +% +% The float environment obtains an insertion number B from the +% \@freelist (see below for a description of list manipulation), puts +% the float into box B and sets \count B to a FLOAT SPECIFIER. For +% a normal (not double-column) float, it then causes a page break +% in one of the following two ways: +% - In outer hmode: \vadjust{\penalty -10002} +% - In vmode : \penalty -10003. +% For a double-column float, it puts B onto the \@dbldeferlist. +% The float specifier has two components: +% * A PLACEMENT SPECIFICATION, describing where the float may +% be placed. +% * A TYPE, which is a power of two--e.g., figures might be +% type 1 floats, tables type 2 floats, programs type 4 floats, etc. +% The float specifier is encoded as follows, where bit 0 is the least +% significant bit. +% +% Bit Meaning +% --- ------- +% 0 1 iff the float may go where it appears in the text. +% 1 1 iff the float may go on the top of a page. +% 2 1 iff the float may go on the bottom of a page. +% 3 1 iff the float may go on a float page. +% 4 1 unless the PLACEMENT includes a ! +% 5 1 iff a type 1 float +% 6 1 iff a type 2 float +% etc. +% +% A negative float specifier is used to indicate a marginal note. +% +% MACROS AND DATA STRUCTURES FOR PROCESSING FLOATS +% ------------------------------------------------ +% +% A FLOAT LIST consisting of the floats in boxes \boxa ... \boxN has +% the form: +% \@elt \boxa ... \@elt \boxN +% where \boxI is defined by +% \newinsert\boxI +% Normally, \@elt is \let to \relax. A test can be performed on the +% entire float list by locally \def'ing \@elt appropriately and +% executing the list. +% This is a lot more efficient than looping through the list. +% +% The following macros are used for manipulating float lists. +% +% \@next \CS \LIST {NONEMPTY}{EMPTY} == %% NOTE: ASSUME \@elt = \relax +% BEGIN assume that \LIST == \@elt \B1 ... \@elt \Bn +% if n = 0 +% then EMPTY +% else \CS :=L \B1 +% \LIST :=G \@elt \B2 ... \@elt \Bn +% NONEMPTY +% fi +% END +% +% +% \@bitor\NUM\LIST : Globally sets switch @test to the disjunction for +% all I of bit log2 \NUM of the float specifiers of all the +% floats in \LIST. +% I.e., @test is set to true iff there is at least one +% float in \LIST having bit log2 \NUM of its float specifier +% equal to 1. +% +% Note: log2 [(\count I)/32] is the bit number corresponding to the +% type of float I. To see if there is any float in \LIST having +% the same type as float I, you run \@bitor with +% \NUM = [(\count I)/32] * 32. +% +% \@bitor\NUM\LIST == +% BEGIN +% @test :=G false +% { \@elt \CTR == if \NUM <> 0 then +% if \count\CTR / \NUM is odd +% then @test := true fi fi +% \LIST +% } +% END +% +% +% \@cons\LIST\NUM : Globally sets \LIST := \LIST * \@elt \NUM +% +% \@cons\LIST\NUM == +% BEGIN { \@elt == \relax +% \LIST :=G \LIST \@elt \NUM +% } +% +% BOX LISTS FOR FLOAT-PLACEMENT ALGORITHMS +% +% \@freelist : List of empty boxes for placing new floats. +% \@toplist : List of floats to go at top of current column. +% \@midlist : List of floats in middle of current column. +% \@botlist : List of floats to go at bottom of current column. +% \@deferlist : List of floats to go after current column. +% \@dbltoplist : List of double-col. floats to go at top of current +% page. +% \@dbldeferlist : List of double-column floats to go on subsequent +% pages. +% +% FLOAT-PLACEMENT ALGORITHMS +% +% +% \@addtobot : Tries to put insert \@currbox on \@botlist. +% Called only when: +% * \ht BOX < \@colroom +% * type of \@currbox not on \@deferlist +% * \@colnum > 0 +% * @insert = false +% If it succeeds, then: +% * sets @insert true +% * decrements \@botroom by \ht BOX +% * decrements \@botnum and \@colnum by 1 +% * decrements \@colroom by \ht BOX + either \floatsep +% or \textfloatsep, as appropriate. +% * sets \maxdepth to 0pt +% +% \@addtotoporbot : Tries to put insert \@currbox on \@toplist or +% \@botlist. +% Called only under same conditions as \@addtobot. +% If it succeeds, then: +% * sets @insert true +% * decrements \@toproom or \@botroom by \ht BOX +% * decrements \@colnum and either \@topnum or +% \@botnum by 1 +% * decrements \@colroom by \ht BOX + \floatsep +% or \textfloatsep, as appropriate. +% +% \@addtocurcol : Tries to add \@currbox to current column, setting +% @insert true if it succeeds, false otherwise. +% It will add \@currbox to top only if bit 0 of +% \count \@currbox is 0, and to the bottom only if +% bit 0 = 0 or an earlier float of the same type is +% put on the bottom. +% If the float is put in the text, then +% \penalty\interlinepenalty is put +% right after the float, before the following \vskip, +% and \outputpenalty :=L 0. +% +% \@addtonextcol : Tries to add \@currbox to the next column, setting +% @insert true if it succeeds, false otherwise. +% +% \@addtodblcol : Tries to add \@currbox to the next double-column page, +% adding it to \@dbltoplist if it succeeds and +% \@dbldeferlist if it fails. +% +% +% \@addmarginpar == +% BEGIN +% if \@currlist nonempty +% then remove \@marbox from \@currlist +% add \@marbox and \@currbox to \@freelist +% %% NOTE: \@currbox = left box +% else LaTeX error: ? %% shouldn't happen +% fi +% \@tempcnta := 1 %% 1 = right, -1 = left +% if @twocolumn = true +% then if @firstcolumn = true +% then \@tempcnta := -1 +% fi +% else if @mparswitch = true +% then if count0 odd +% else \@tempcnta := -1 +% fi +% fi +% if @reversemargin = true +% then \@tempcnta := -\@tempcnta +% fi +% fi +% if \@tempcnta < 0 then \box\@marbox :=G \box\@currbox +% fi +% \@tempdima :=L maximum(\@mparbottom - \@pageht +% + ht of \@marbox, 0) +% if \@tempdima > 0 then LaTeX warning: 'marginpar moved' fi +% \@mparbottom :=G \@pageht + \@tempdima + depth of \@marbox +% + \marginparpush +% \@tempdima :=L \@tempdima - ht of \@marbox +% \box\@marbox :=G \box\@currbox +% \vbox { \vskip \@tempdima +% \box\@marbox +% } +% height of \@marbox :=G depth of \@marbox :=G 0 +% \kern -\@pagedp +% \nointerlineskip +% \hbox{ if @tempcnta > 0 then \hskip \columnwidth +% \hskip \marginparsep +% else \hskip -\marginparsep +% \hskip -\marginparwidth +% fi +% \box\@marbox \hss +% } +% \nobreak +% \nointerlineskip +% \hbox{\vrule height 0 width 0 depth \@pagedp} +% END +% +% Floats and marginpars add a lot of dead cycles. +% \end{oldcomments} +% \begin{macrocode} +\maxdeadcycles = 100 +% \end{macrocode} +% +% \begin{macrocode} +\let\@elt\relax +% \end{macrocode} +% +% \begin{macrocode} +\def\@next#1#2#3#4{\ifx#2\@empty #4\else + \expandafter\@xnext #2\@@#1#2#3\fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\@xnext \@elt #1#2\@@#3#4{\def#3{#1}\gdef#4{#2}} +% \end{macrocode} +% +% \changes{v1.1v}{1996/07/26}{put \cs{global} into definition} +% \begin{macrocode} +\def\@testfalse{\global\let\if@test\iffalse} +\def\@testtrue {\global\let\if@test\iftrue} +\@testfalse +% \end{macrocode} +% +% \changes{v1.1v}{1996/07/26}{remove \cs{global} before \cs{@test...}} +% \begin{macrocode} +\def\@bitor#1#2{\@testfalse {\let\@elt\@xbitor + \@tempcnta #1\relax #2}} +% \end{macrocode} +% RmS 91/11/22: Added test for |\count#1 = 0|. +% Suggested by Chris Rowley. +% +% +% \changes{v1.1v}{1996/07/26}{remove \cs{global} before \cs{@test...}} +% \begin{macrocode} +\def\@xbitor #1{\@tempcntb \count#1 + \ifnum \@tempcnta =\z@ + \else + \divide\@tempcntb\@tempcnta + \ifodd\@tempcntb \@testtrue\fi + \fi} +% \end{macrocode} +% +% DEFINITION OF FLOAT BOXES: +% \changes{v1.3a}{2015/09/205} +% {extended \cs{@freelist}} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/10/01}% +%<latexrelease> {\bx@ZZ}{Extended float list}% +%<*2ekernel|latexrelease> +\let\@elt\newinsert +%<*2ekernel> +\def\@freelist{% + \@elt\bx@A\@elt\bx@B\@elt\bx@C\@elt\bx@D\@elt\bx@E + \@elt\bx@F\@elt\bx@G\@elt\bx@H\@elt\bx@I\@elt\bx@J + \@elt\bx@K\@elt\bx@L\@elt\bx@M\@elt\bx@N + \@elt\bx@O\@elt\bx@P\@elt\bx@Q\@elt\bx@R} +\@freelist +%</2ekernel> +\ifx\numexpr\@undefined\else +\def\reserved@a{% + \@elt\bx@S\@elt\bx@T\@elt\bx@U\@elt\bx@V + \@elt\bx@W\@elt\bx@X\@elt\bx@Y\@elt\bx@Z + \@elt\bx@AA\@elt\bx@BB\@elt\bx@CC\@elt\bx@DD\@elt\bx@EE + \@elt\bx@FF\@elt\bx@GG\@elt\bx@HH\@elt\bx@II\@elt\bx@JJ + \@elt\bx@KK\@elt\bx@LL\@elt\bx@MM\@elt\bx@NN + \@elt\bx@OO\@elt\bx@PP\@elt\bx@QQ\@elt\bx@RR + \@elt\bx@SS\@elt\bx@TT\@elt\bx@UU\@elt\bx@VV + \@elt\bx@WW\@elt\bx@XX\@elt\bx@YY\@elt\bx@ZZ} +\reserved@a +\def\@elt{\noexpand\@elt\noexpand} +\edef\@freelist{\@freelist\reserved@a} +\fi +\let\reserved@a\relax +\let\@elt\relax +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\bx@ZZ}{Extended float list}% +%<latexrelease>\def\@freelist{% +%<latexrelease> \@elt\bx@A\@elt\bx@B\@elt\bx@C\@elt\bx@D\@elt\bx@E +%<latexrelease> \@elt\bx@F\@elt\bx@G\@elt\bx@H\@elt\bx@I\@elt\bx@J +%<latexrelease> \@elt\bx@K\@elt\bx@L\@elt\bx@M\@elt\bx@N +%<latexrelease> \@elt\bx@O\@elt\bx@P\@elt\bx@Q\@elt\bx@R} +%<latexrelease> \insc@unt=234 +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macrocode} +\gdef\@toplist{} +\gdef\@botlist{} +\gdef\@midlist{} +\gdef\@currlist{} +\gdef\@deferlist{} +\gdef\@dbltoplist{} +% \end{macrocode} +% \changes{v1.2m}{2015/03/12} +% {initialise \cs{@dbldeferlist} again} +% The new algorithm stores page wide floats together with column floats +% in a single |\@deferlist| list. We keep |\@dbldeferlist| +% initialised as empty so that packages that are testing for +% deferred floats can use the same code for old or new float +% handling. +% \begin{macrocode} +\gdef\@dbldeferlist{} +% \end{macrocode} +% +% PAGE LAYOUT PARAMETERS +% \begin{macrocode} +\newdimen\topmargin +\newdimen\oddsidemargin +\newdimen\evensidemargin +\let\@themargin=\oddsidemargin +\newdimen\headheight +\newdimen\headsep +\newdimen\footskip +\newdimen\textheight +\newdimen\textwidth +\newdimen\columnwidth +\newdimen\columnsep +\newdimen\columnseprule +\newdimen\marginparwidth +\newdimen\marginparsep +\newdimen\marginparpush +% \end{macrocode} +% +% \begin{macro}{\AtBeginDvi} +% \changes{v1.1c}{1994/11/05} +% {Added macro} +% \begin{macro}{\@begindvibox} +% \changes{v1.1c}{1994/11/05} +% {Added macro} +% \changes{v1.1f}{1994/11/14}{Use normal box register: why a box?} +% \changes{v1.1l}{1995/04/24}{Add \cs{vbox} latex/1392} +% +% We use a box register in which to put +% stuff that must appear before anything else in the +% |.dvi| file. +% +% The stuff in the box should not add any typeset material to the +% page when it is unboxed. +% \begin{macrocode} +\newbox\@begindvibox +\def \AtBeginDvi #1{% + \global \setbox \@begindvibox + \vbox{\unvbox \@begindvibox #1}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@maxdepth} +% This is not the right place to set this; it needs to be set in a +% class/style file when |\maxdepth| is set. +% +% Also, many settings to |\maxdepth| should be to |\@maxdepth|, +% probably? +% \task{All}{Sort out maxdepth: both should be set in the class files.} +% \begin{macrocode} +\newdimen\@maxdepth +\@maxdepth = \maxdepth +% \end{macrocode} +% \end{macro} +% \begin{macro}{\paperheight} +% \changes{v0.1a}{1993/11/23}{Register added} +% \begin{macro}{\paperwidth} +% \changes{v0.1a}{1993/11/23}{Register added} +% New |\paper|\ldots\ registers. +% \begin{macrocode} +\newdimen\paperheight +\newdimen\paperwidth +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@insert} +% \begin{macro}{\if@fcolmade} +% \begin{macro}{\if@specialpage} +% \begin{macro}{\if@firstcolumn} +% \begin{macro}{\if@twocolumn} +% \begin{macro}{\if@twoside} +% \begin{macro}{\if@reversemarginpar} +% \begin{macro}{\if@mparswitch} +% \begin{macro}{\col@number} +% \changes{v1.0n}{1994/04/30}{Added \cs{col@number}} +% Local switches first: +% \begin{macrocode} +\newif \if@insert +% \end{macrocode} +% These should definitely be global: +% \begin{macrocode} +\newif \if@fcolmade +\newif \if@specialpage \@specialpagefalse +% \end{macrocode} +% These should be global but are not always set globally in other +% files. +% \begin{macrocode} +\newif \if@firstcolumn \@firstcolumntrue +\newif \if@twocolumn \@twocolumnfalse +% \end{macrocode} +% Not sure about these: two questions. +% Should things which must apply to a whole document be local or +% global (they probably should be `preamble only' commands)? +% Are these three such things? +% \begin{macrocode} +\newif \if@twoside \@twosidefalse +\newif \if@reversemargin \@reversemarginfalse +\newif \if@mparswitch \@mparswitchfalse +% \end{macrocode} +% This counter has been imported from `multicol'. +% \begin{macrocode} +\newcount \col@number +\col@number \@ne +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{oldcomments} +% INTERNAL REGISTERS +% +% \begin{macrocode} +\newcount\@topnum +\newdimen\@toproom +\newcount\@dbltopnum +\newdimen\@dbltoproom +\newcount\@botnum +\newdimen\@botroom +\newcount\@colnum +\newdimen\@textmin +\newdimen\@fpmin +\newdimen\@colht +\newdimen\@colroom +\newdimen\@pageht +\newdimen\@pagedp +\newdimen\@mparbottom \@mparbottom\z@ +\newcount\@currtype +\newbox\@outputbox +\newbox\@leftcolumn +\newbox\@holdpg +% \end{macrocode} +% +% \begin{macrocode} +\def\@thehead{\@oddhead} % initialization +\def\@thefoot{\@oddfoot} +% \end{macrocode} +% \end{oldcomments} +% +% \begin{macro}{\clearpage} +% \changes{v1.1r}{1995/10/11}{Added a check so that it does not lose +% the argument of \cs{twocolumn[...]}} +% +% The tests at the beginning are an experimental attempt to avoid a +% completely empty page after a |\twocolumn[...]|. This prevents the +% text from the argument vanishing into a float box, never to be seen +% again. We hope that it does not produce wrong formatting in other +% cases. +% \changes{v1.1v}{1996/07/26}{add number of missing percents} +% \begin{macrocode} +\def\clearpage{% + \ifvmode + \ifnum \@dbltopnum =\m@ne + \ifdim \pagetotal <\topskip + \hbox{}% + \fi + \fi + \fi + \newpage + \write\m@ne{}% + \vbox{}% + \penalty -\@Mi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cleardoublepage} +% +% \begin{macrocode} +\def\cleardoublepage{\clearpage\if@twoside \ifodd\c@page\else + \hbox{}\newpage\if@twocolumn\hbox{}\newpage\fi\fi\fi} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\onecolumn} +% \changes{v1.0n}{1994/04/30}{Added setting of \cs{col@number}} +% \begin{macrocode} +%<*2ekernel|fltrace> +\def\onecolumn{% + \clearpage + \global\columnwidth\textwidth + \global\hsize\columnwidth + \global\linewidth\columnwidth + \global\@twocolumnfalse + \col@number \@ne + \@floatplacement} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newpage} +% \changes{v1.1x}{1996/09/29}{Checks for noskipsec and inlabel added} +% \changes{v1.1x}{1996/09/29}{Checks for noskipsec and inlabel added} +% \changes{v1.1y}{1996/09/30}{Checks for noskipsec and inlabel removed +% pending further tests} +% \changes{v1.1z}{1996/10/24}{Better checks for noskipsec and +% inlabel added, plus nobreak} +% \changes{v1.2a}{1996/10/25}{Reset all flags explicitly} +% \changes{v2.4a}{2017/04/11}{account for the depth of the last row of the page} +% The two checks at the beginning ensure that an item label or +% run-in section title immediately before a |\newpage| get printed +% on the correct page, the one before the page break. +% +% All three tests are largely to make error processing more robust; +% that is why they all reset the flags explicitly, even when it +% would appear that this would be done by a |\leavevmode|. +% \begin{macrocode} +%</2ekernel|fltrace> +%<latexrelease>\IncludeInRelease{2017/04/15}% +%<latexrelease> {\newpage}{Check depth of page}% +%<*2ekernel|latexrelease|fltrace> +\def \newpage {% + \if@noskipsec + \ifx \@nodocument\relax + \leavevmode + \global \@noskipsecfalse + \fi + \fi + \if@inlabel + \leavevmode + \global \@inlabelfalse + \fi + \if@nobreak \@nobreakfalse \everypar{}\fi + \par +% \end{macrocode} +% The |\vfil| at the end of the macro before the break penalty will +% normally result in the page being run short, even with |\flushbottom| +% in effect (in contrast to the behavior +% of |\pagebreak|). However, if there +% is some explicit stretch on the page, say, a |\vfill|, it has the undesired +% side-effect, that the last line will not align at its baseline if it +% contains characters going below the baseline, as the value of |\prevdepth| +% is no longer taken into account by \TeX{}. So we back up by that amount +% (or by |\maxdepth| if it is really huge), to mimic the normal behavior +% without the |\newpage|. +% \begin{macrocode} + \ifdim\prevdepth>\z@ + \vskip -% + \ifdim\prevdepth>\maxdepth + \maxdepth + \else + \prevdepth + \fi + \fi + \vfil + \penalty -\@M} +%</2ekernel|latexrelease|fltrace> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\newpage}{Check depth of page}% +%<latexrelease>\def \newpage {% +%<latexrelease> \if@noskipsec +%<latexrelease> \ifx \@nodocument\relax +%<latexrelease> \leavevmode +%<latexrelease> \global \@noskipsecfalse +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \if@inlabel +%<latexrelease> \leavevmode +%<latexrelease> \global \@inlabelfalse +%<latexrelease> \fi +%<latexrelease> \if@nobreak \@nobreakfalse \everypar{}\fi +%<latexrelease> \par +%<latexrelease> \vfil +%<latexrelease> \penalty -\@M} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@emptycol} +% \changes{v1.0n}{1994/04/30}{Empty column action added: +% \cs{@emptycol}} +% It may be better to use an invisible rule rather than an empty +% box here. +% \begin{macrocode} +\def \@emptycol {\vbox{}\penalty -\@M} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\twocolumn} +% \begin{macro}{\@topnewpage} +% \changes{v1.0f}{1993/12/05}{Commands changed} +% \changes{v1.0g}{1993/12/06}{\cs{@floatplacement} placement bug +% fixed} +% \changes{v1.0j}{1993/12/17}{check for vsize too small added} +% \changes{v1.2c}{1997/11/09}{Documentation of vsize check enhanced} +% There are several bug fixes to the two-column stuff here. +% +% \changes{v1.0n}{1994/04/30}{Added setting of \cs{col@number}} +% \begin{macrocode} +\def \twocolumn {% + \clearpage + \global\columnwidth\textwidth + \global\advance\columnwidth-\columnsep + \global\divide\columnwidth\tw@ + \global\hsize\columnwidth + \global\linewidth\columnwidth + \global\@twocolumntrue + \global\@firstcolumntrue + \col@number \tw@ +% \end{macrocode} +% There is no reason to put a |\@dblfloatplacement| here since +% |\@topnewpage| ignores these settings. +% The |\@floatplacement| is needed in case this comes after some +% changes. +% \changes{v1.0h}{1993/12/12}{braces removed} +% \begin{macrocode} + \@ifnextchar [\@topnewpage\@floatplacement +} +% \end{macrocode} +% +% Note that here, getting a box from the freelist can assume +% success since this comes just after a |\clearpage|. +% \changes{v1.0n}{1994/04/30}{Added setting of \cs{col@number}} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Use \cs{color@begingroup} for colour} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Use \cs{normalcolor}} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Extra box added to remove colour resetting from vmode} +% \changes{v1.1b}{1994/11/05} +% {Use new \cs{color@hbox} concept.} +% \changes{v1.1i}{1994/11/21}{Changed to \cs{color@vbox}} +% \changes{v1.1z}{1996/10/24}{Added \cs{@nodocument} to trap +% \cs{twocolumn} in the preamble} +% \begin{macrocode} +\long\def \@topnewpage [#1]{% + \@nodocument + \@next\@currbox\@freelist{}{}% + \global \setbox\@currbox + \color@vbox + \normalcolor + \vbox {% + \hsize\textwidth + \@parboxrestore + \col@number \@ne + #1% + \vskip -\dbltextfloatsep + }% + \color@endbox +% \end{macrocode} +% Added size test and warning message; perhaps we should use +% an error message. +% \changes{v1.0l}{1994/03/15}{Corrected and amended warning message} +% \changes{v1.0m}{1994/04/24}{Warning message removed as it will be +% generated later} +% \begin{macrocode} + \ifdim \ht\@currbox>\textheight + \ht\@currbox \textheight + \fi +% \end{macrocode} +% This next line is not essential but it is more robust to make this +% value non-zero, in case of weird errors. +% +% This next bit is what is needed from |\@addtodblcol|, plus some +% extra checks for error trapping. +% \begin{macrocode} + \global \count\@currbox \tw@ + \@tempdima -\ht\@currbox + \advance \@tempdima -\dbltextfloatsep + \global \advance \@colht \@tempdima + \ifx \@dbltoplist \@empty + \else + \@latexerr{Float(s) lost}\@ehb + \let \@dbltoplist \@empty + \fi + \@cons \@dbltoplist \@currbox +% \end{macrocode} +% This setting of |\@dbltopnum| is used only to change the +% typesetting in\\ |\@combinedblfloats|. +% \begin{macrocode} + \global \@dbltopnum \m@ne +%<*trace> + \fl@trace{dbltopnum set to -1 (= \the \@dbltopnum) (topnewpage)}% +%</trace> +% \end{macrocode} +% At points such as this we need to check that there is still a +% minimal amount of room left on the page; this uses an arbitrary +% small value at present; but note that this value is larger than +% that used when checking that page is too full of normal floats. +% +% If there is little room left we just force a page-break, OK? +% This involves producing two empty columns. The second empty +% column may be produced by |\output|, in which case an extra, +% misleading, warning will be generated, OK? (This happens only +% when there is too little room left on the page for any float.) +% Otherwise (\ie if the size is such that it is allowed as a normal +% float) the extra |\@emptycol| will be invoked in the second +% column by the conditional code guarded by the |\if@firstcolumn| +% test. +% +% I now think that the cut-off point here should be |3\baselineskip|, +% but we make it a bit less so that 3 lines of text will be +% allowed, OK? +% +% Since this happens only when there is nothing on the page but the +% `top-box', the empty box should not cause any problem other than +% some overfull box messages, which is not entirely misleading. +% +% Here we need two page-ends since both columns need to be empty. +% \task{???}{Make it less arbitrary?} +% \changes{v1.0j}{1993/12/17}{Page room test added} +% \changes{v1.0l}{1994/03/15}{Warning added: it should be improved} +% \changes{v1.0m}{1994/04/24}{Message changed to give more info} +% \changes{v1.0n}{1994/04/30}{Message changed for Frank} +% \changes{v1.0n}{1994/04/30}{Empty column action added: +% \cs{@emptycol}} +% \changes{v1.0n}{1994/04/30}{Cut-off point changed to +% 3\cs{baselineskip}} +% \changes{v1.1t}{1996/05/24}{Cut-off point changed to +% 2.5\cs{baselineskip}} +% \begin{macrocode} + \ifdim \@colht<2.5\baselineskip + \@latex@warning@no@line {Optional argument of \noexpand\twocolumn + too tall on page \thepage}% + \@emptycol + \if@firstcolumn + \else + \@emptycol + \fi + \else + \global \vsize \@colht + \global \@colroom \@colht + \@floatplacement + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\output} +% \changes{v1.0f}{1993/12/05}{Command changed} +% \begin{macro}{\@specialoutput} +% \changes{v0.1c}{1993/11/23}{Command changed} +% \changes{v1.0f}{1993/12/06}{Unboxing of 255 added to rescue writes} +% This needs some small adjustments. We cannot +% guarantee that the float mechanism will interact correctly with +% this stuff, but that mechanism does not always work properly +% with footnotes already. +% +% RmS 91/09/29: +% +% added reset of |\par| to the output routine. +% This avoids problems when the output routine is +% called within a list where |\par| may be a no-op. +% +% \begin{macrocode} +\output {% + \let \par \@@par + \ifnum \outputpenalty<-\@M + \@specialoutput + \else + \@makecol + \@opcol +% \end{macrocode} +% Moved to |\@opcol|: |\@floatplacement|. +% \begin{macrocode} + \@startcolumn +% \end{macrocode} +% This loop could be replaced by an |\expandafter| tail +% recursion in |\@startcolumn|. +% \begin{macrocode} + \@whilesw \if@fcolmade \fi + {% +%<*trace> + \fl@trace{PAGE: float \if@twocolumn column \else page \fi + completed}% +%</trace> + \@opcol\@startcolumn}% + \fi + \ifnum \outputpenalty>-\@Miv +% \end{macrocode} +% At points such as this we need to check that there is still a +% minimal amount of room left on the page; this uses an arbitrary +% small value at present. If there is little room left we just +% force a page-break, OK? +% +% This bit is essential only if a float has just been processed so +% maybe it should be moved; but this is the natural place at which +% to set the vsize and a test would need to be done anyway. A +% check has been added to ensure that there really has been a +% change in the value of |\@colroom|. +% +% Since this happens only when there is nothing on the page but +% floats, the empty box should not cause any problem other than +% some overfull box messages, which is not entirely misleading. +% +% The twocolumn case does not need any extra code here since this +% is the |\output| itself; in the second column there will still +% not be enough room left so |\@emptycol| will be executed again +% when the OR is called by the-page builder when it gets to the +% penalty inserted by the first execution. (The page-builder is +% never invoked whilst the OR is being executed since it builds a +% inner vlist; thus any conditional code for the two-column case +% within |\output| may not get executed with the correct value of +% |\if@firstcolumn|. +% +% \task{???}{Make it less arbitrary?} +% \changes{v1.0j}{1993/12/17}{Page room test added} +% \changes{v1.0m}{1994/04/24}{Message changed to give more info and +% `top' removed} +% \changes{v1.0n}{1994/04/30}{Extra empty column added for +% twocolumn case (wrong, see below)} +% \changes{v1.0n}{1994/04/30}{Extra empty column added for +% twocolumn case} +% \changes{v1.0n}{1994/04/30}{Empty column action added: +% \cs{@emptycol}} +% \changes{v1.0n}{1994/04/30}{Cut-off point changed to +% 2\cs{baselineskip}} +% \changes{v1.1t}{1996/05/24}{Cut-off point changed to +% 1.5\cs{baselineskip}} +% \changes{v1.1t}{1996/05/24}{Check that \cs{@colroom} is less +% than \cs{vsize}, indicating that a float has been added} +% \changes{v1.1u}{1996/05/25}{Correct the above check} +% \changes{v1.2c}{1997/11/09}{Remove incorrect code: only one +% \cs{@emptycol} is needed here} +% \begin{macrocode} + \ifdim \@colroom<1.5\baselineskip + \ifdim \@colroom<\textheight + \@latex@warning@no@line {Text page \thepage\space + contains only floats}% + \@emptycol +% \if@twocolumn +% \if@firstcolumn +% \else +% \@emptycol +% \fi +% \fi + \else + \global \vsize \@colroom + \fi + \else + \global \vsize \@colroom + \fi + \else + \global \vsize \maxdimen + \fi +} +% \end{macrocode} +% +% \begin{oldcomments} +% CHANGES TO \@specialoutput: +% * \penalty\z@ changed to \penalty\interlinepenalty so \samepage +% works properly with figure and table environments. +% (Changed 23 Oct 86) +% +% * Definition of \@specialoutput changed 26 Feb 88 so \@pageht and +% \@pagedp aren't changed for a marginal note. +% (Change suggested by Chris Rowley.) +% \end{oldcomments} +% +% \begin{macrocode} +\gdef\@specialoutput{% + \ifnum \outputpenalty>-\@Mii + \@doclearpage + \else + \ifnum \outputpenalty<-\@Miii + \ifnum \outputpenalty<-\@MM \deadcycles \z@ \fi + \global \setbox\@holdpg \vbox {\unvbox\@cclv}% + \else +% \end{macrocode} +% Note that |\boxmaxdepth| should not be set here since we wish to +% record the natural depth of the holdpg box. +% +% This is changed so as to not lose anything, such as writes +% and marks, which may get into box 255 and should be returned to +% the list. This should only happen when the first penalty in the +% mechanism is discarded and therefore |\@holdpg| should always be +% void in this case. This can happen because a penalty is +% discarded whenever there is no box on the list. +% +% It was just: |\setbox\@tempboxa \box \@cclv|. +% +% The last box which is removed is the box put there by the +% double-penalty mechanism. The |\unskip| then removes the +% |\topskip| which is put there since the box is the first on the +% page. +% \task{CAR/FMi}{Is it more efficient to check whether the holdpg box +% is void and then act accordingly?} +% \begin{macrocode} + \global \setbox\@holdpg \vbox{% + \unvbox\@holdpg + \unvbox\@cclv +% \end{macrocode} +% We must now remove the box added by the float mechanism and the +% |\topskip| glue therefore added above it by \TeX. +% \begin{macrocode} + \setbox\@tempboxa \lastbox + \unskip + }% +% \end{macrocode} +% These two are needed as separate dimensions only by +% |\@addmarginpar|; for other purposes we put the whole size into +% |\@pageht| (see below). +% \begin{macrocode} + \@pagedp \dp\@holdpg + \@pageht \ht\@holdpg + \unvbox \@holdpg + \@next\@currbox\@currlist{% + \ifnum \count\@currbox>\z@ +% \end{macrocode} +% Putting the whole size into |\@pageht| (see above). +% \begin{macrocode} + \advance \@pageht \@pagedp + \ifvoid\footins \else + \advance \@pageht \ht\footins + \advance \@pageht \skip\footins + \advance \@pageht \dp\footins + \fi + \ifvbox \@kludgeins +% \end{macrocode} +% We want to make the adjustment due to this insert only if the +% non-star form is used. The *-form will probably not work with +% floats, but maybe it still could make some adjustment here even +% so? +% \begin{macrocode} + \ifdim \wd\@kludgeins=\z@ + \advance \@pageht \ht\@kludgeins +%<*trace> + \fl@trace {Extra size added: \the \ht\@kludgeins}% +%</trace> + \fi + \fi +% \end{macrocode} +% This version puts the inserts back just before the additional +% material; it could be moved earlier, before unboxing the +% page-so-far. Neither is guaranteed not to put things on the wrong +% page. This version is similar to the original version. +% \begin{macrocode} + \@reinserts + \@addtocurcol + \else + \@reinserts + \@addmarginpar + \fi + }\@latexbug +% \end{macrocode} +% A 2e change: use |\addpenalty| instead of |\penalty| here. Some +% penalty is needed to create a potential break-point immediately +% after the reinserts (or the marginal). Otherwise there can be no +% possibility to break here and this can cause the reinserts or the +% marginal to appear on the next page (which is often incorrect). +% However, if the nobreak flag is true, a |\nobreak| must be +% correct. +% \changes{v1.1i}{1994/11/21}{Added \cs{if@nobreak} test} +% \changes{v1.1z}{1996/10/24}{Added \cs{nobreak} as appropriate} +% \begin{macrocode} + \ifnum \outputpenalty<\z@ + \if@nobreak + \nobreak + \else + \addpenalty \interlinepenalty + \fi + \fi + \fi + \fi +} +%</2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@testwrongwidth} +% \begin{macro}{\f@depth} +% \changes{v1.2n}{2015/02/21}{macro added(latexrelease)} +% +% Test if the float box has the wrong width when trying to place it +% into some area. (Actually +% the test is for a conventional depth setting rather than for the +% width of the float. For that reason the box depth was explicitly +% tailored when the float was created). +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\@testwrongwidth}{float order in 2-column}% +%<*2ekernel|latexrelease|fltrace> +% \end{macrocode} +% +% \begin{macrocode} +\def\@testwrongwidth #1{% + \ifdim\dp#1=\f@depth +%<*trace> + \fl@trace{\string#1 + \ifdim\f@depth=\z@ single \else double \fi + column float -- ok}% +%</trace> + \else + \global\@testtrue +%<*trace> + \fl@trace{\string#1 + \ifdim\f@depth=\z@ double \else single \fi + column float -- wrong}% +%</trace> + \fi}% +% \end{macrocode} +% +% Normally looking for single column floats, which have zero depth. +% \begin{macrocode} +\let\f@depth\z@ +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease|fltrace> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@testwrongwidth}{float order in 2-column}% +%<latexrelease>\let\@testwrongwidth\@undefined +%<latexrelease>\let\f@depth\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@doclearpage} +% \task{CAR/FMi}{Investigate better float clearance} +% \task{CAR/FMi}{Put non-boxes back in the `right place', or nowhere?} +% This is a very much an emergency action, just dumping everything: +% footnotes first then floats. A more sophisticated version is +% needed; but even more urgent is a bug-free version (see, for +% example, pr/3528). +% +% Also, it puts any left-over non-boxes (writes, specials, etc.) back +% after any float pages created: this is a very bad bug since, +% for example, a kludge insert will be in quite the wrong place +% and, worse, be irremovable and uncancelable. +% +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% All the remaining changes are replacing the double column defer list +% or inserting the extra test |\@testwrongwidth|\marg{box} at suitable +% places. That is at places where a box is taken off the deferlist. +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}{\@doclearpage}% +%<latexrelease> {float order in 2-column}% +%<*2ekernel|latexrelease> +\def \@doclearpage {% + \ifvoid\footins +% \end{macrocode} +% \changes{v1.2n}{2015/01/14}{Empty kludgeins box if necessary, pr/3528} +% \begin{macrocode} + \ifvbox\@kludgeins + {\setbox \@tempboxa \box \@kludgeins}% +%<*trace> + \fl@trace {kludgeins box made void}% +%</trace> + \fi + \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa + \setbox\@tempboxa\box\@cclv + \xdef\@deferlist{\@toplist\@botlist\@deferlist}% + \global \let \@toplist \@empty + \global \let \@botlist \@empty + \global \@colroom \@colht + \ifx \@currlist\@empty + \else + \@latexerr{Float(s) lost}\@ehb + \global \let \@currlist \@empty + \fi + \@makefcolumn\@deferlist + \@whilesw\if@fcolmade \fi{\@opcol\@makefcolumn\@deferlist}% + \if@twocolumn + \if@firstcolumn +% \end{macrocode} +% +% \begin{macrocode} + \xdef\@deferlist{\@dbltoplist\@deferlist}% +% \end{macrocode} +% +% \begin{macrocode} + \global \let \@dbltoplist \@empty + \global \@colht \textheight + \begingroup + \@dblfloatplacement +% \end{macrocode} +% +% \begin{macrocode} + \@makefcolumn\@deferlist + \@whilesw\if@fcolmade \fi{\@outputpage + \@makefcolumn\@deferlist}% +% \end{macrocode} +% +% \begin{macrocode} + \endgroup + \else + \vbox{}\clearpage + \fi + \fi +% \end{macrocode} +% the next line is needed to avoid losing floats in certain +% circumstances a single call to the original |\doclearpage| +% will now no longer output all floats. +% \changes{v1.2b}{2000/09/24}{FMi: ensure \cs{doclearpage} +% is called again until all floats are output.} +% \begin{macrocode} + \ifx\@deferlist\@empty \else\clearpage \fi + \else + \setbox\@cclv\vbox{\box\@cclv\vfil}% + \@makecol\@opcol + \clearpage + \fi +}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\@doclearpage}% +%<latexrelease> {float order in 2-column}% +%<latexrelease>\def \@doclearpage {% +%<latexrelease> \ifvoid\footins +% \end{macrocode} +% \changes{v1.2l}{2004/02/07}{Empty kludgeins box if necessary, pr/3528} +% We empty any left over kludge insert box here; this is a temporary fix. +% It should perhaps be applied to one page of cleared floats, but +% who cares? The whole of this stuff needs completely redoing for +% many such reasons. +% \begin{macrocode} +%<latexrelease> \ifvbox\@kludgeins +%<latexrelease> {\setbox \@tempboxa \box \@kludgeins}% +%<*trace> +%<latexrelease> \fl@trace {kludgeins box made void}% +%</trace> +%<latexrelease> \fi +%<latexrelease> \setbox\@tempboxa\vsplit\@cclv to\z@ \unvbox\@tempboxa +%<latexrelease> \setbox\@tempboxa\box\@cclv +%<latexrelease> \xdef\@deferlist{\@toplist\@botlist\@deferlist}% +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} +%<latexrelease> \global \let \@toplist \@empty +%<latexrelease> \global \let \@botlist \@empty +%<latexrelease> \global \@colroom \@colht +%<latexrelease> \ifx \@currlist\@empty +%<latexrelease> \else +%<latexrelease> \@latexerr{Float(s) lost}\@ehb +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} +%<latexrelease> \global \let \@currlist \@empty +%<latexrelease> \fi +%<latexrelease> \@makefcolumn\@deferlist +%<latexrelease> \@whilesw\if@fcolmade \fi +%<latexrelease> {\@opcol\@makefcolumn\@deferlist}% +%<latexrelease> \if@twocolumn +%<latexrelease> \if@firstcolumn +%<latexrelease> \xdef\@dbldeferlist{\@dbltoplist\@dbldeferlist}% +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} +%<latexrelease> \global \let \@dbltoplist \@empty +%<latexrelease> \global \@colht \textheight +%<latexrelease> \begingroup +%<latexrelease> \@dblfloatplacement +%<latexrelease> \@makefcolumn\@dbldeferlist +%<latexrelease> \@whilesw\if@fcolmade \fi +%<latexrelease> {\@outputpage\@makefcolumn\@dbldeferlist}% +%<latexrelease> \endgroup +%<latexrelease> \else +%<latexrelease> \vbox{}\clearpage +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \else +%<latexrelease> \setbox\@cclv\vbox{\box\@cclv\vfil}% +%<latexrelease> \@makecol\@opcol +%<latexrelease> \clearpage +%<latexrelease> \fi +%<latexrelease> }% +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@opcol} +% \changes{v1.0f}{1993/12/05}{Command changed} +% \changes{v1.0f}{1993/12/05}{Hook added} +% \changes{v1.0j}{1993/12/17}{Hook removed} +% Several changes in detail here. +% +% \begin{macrocode} +%<*2ekernel|fltrace> +\def \@opcol {% + \if@twocolumn + \@outputdblcol + \else + \@outputpage +%<*trace> + \fl@trace{PAGE: one column (float? see above) page completed}% +%</trace> +% \end{macrocode} +% Not needed since it comes after |\@outputpage|: +% \begin{macrocode} +% \global\@colht\textheight + \fi +% \end{macrocode} +% These do not need to be done every time |\@opcol| is used: they +% should be grouped together since they all need to be done at the +% end of the non-special output routine, or at the end of a clearpage +% one. +% \begin{macrocode} + \global \@mparbottom \z@ \global \@textfloatsheight \z@ + \@floatplacement +} +%</2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@makecol} +% \changes{v0.1c}{1993/11/23}{Command changed} +% \changes{v1.0b}{1993/11/29}{\cs{@makespecialcolbox} added} +% We must rewrite this macro to alllow for variations in page-makeup +% required by changes in page-length. +% +% This uses a different macro if a special-length column is being +% produced. +% +% \begin{macrocode} +%<*2ekernel> +\gdef \@makecol {% + \ifvoid\footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox {% +% \end{macrocode} +% This |\boxmaxdepth| setting is to ensure that deep footnotes +% do not overwrite the footer (on account of the negative skip +% added later): it should use |\@maxdepth| otherwise the change is +% pointless when there are footnotes. +% \task{CAR}{Investigate providing an option to put the footnotes +% below the bottom floats.} +% +% But see also its use when combining floats. +% \changes{v1.0l}{1994/03/15}{\cs{maxdepth} changed to \cs{@maxdepth}} +% \begin{macrocode} + \boxmaxdepth \@maxdepth +% \end{macrocode} +% +% \changes{v1.2e}{1999/01/06}{Added negative vskip, as when processing +% outputbox below: suggested by Fred Bartlett pr/2892} +% \changes{1.2i}{2000/07/12}{Removed negative vskip, as it gives +% unacceptable results when the depth is large: pr/3189} +% \changes{v1.2m}{2004/10/20}{Removed dead code} +% \task{CAR}{As can be seen from the above two changes, getting a good +% layout here is difficult: fix!} +% \begin{macrocode} +% \@tempdima\dp\@cclv + \unvbox \@cclv +% \vskip-\@tempdima + \vskip \skip\footins +% \end{macrocode} +% \changes{v1.1a}{1994/10/31} +% {(DPC/CAR) Colour resetting moved to here} +% \begin{macrocode} + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi +% \end{macrocode} +% The h floats have now been finally committed to this page so we +% can reset their list. The top and bottom floats are then added +% to the page. +% \changes{v1.2k}{2003/12/16}{Ensure that \cs{@elt} has a defined +% state (pr/3586)} +% \begin{macrocode} + \let\@elt\relax + \xdef\@freelist{\@freelist\@midlist}% +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} + \global \let \@midlist \@empty + \@combinefloats +% \end{macrocode} +% The variations start here in case |\enlargethispage| has +% been used. +% \begin{macrocode} + \ifvbox\@kludgeins + \@makespecialcolbox + \else +% \end{macrocode} +% This extra reboxing is only needed to add the +% |\@texttop| and |\@textbotttom| but this could be done earlier, +% when the floats are added. +% +% The |\boxmaxdepth| resetting here will have no effect unless +% |\@textbottom| ends with a box or rule. So is this (or possibly +% |\@maxdepth|) the correct value? +% +% The |\vskip -\dimen@| +% ensures that the visible depth of the box does not +% affect the placement of anything on the page. +% Thus very deep pages will overprint the footer; but these should +% have been prevented by suitable settings of the maxdepths at +% appropriate times. +% +% If |\@textbottom| ends with a box or rule of non-zero depth +% then this skip adjustment should be done again after it. +% +% I think that the final boxing of the main text page could have a +% common ending which may make it simpler to see what is going on. +% +% This needs further investigation, especially in the `special +% case'. +% \task{CAR}{Further investigation of makecol} +% +% Also, the |\boxmaxdepth| setting here affects what happens within +% |\@texttop| and |\@textbottom|, should it? Is it needed at all? +% \changes{v1.0l}{1994/03/15}{Removed boxmaxdepth setting.} +% +% RmS 91/10/22: Replaced |\dimen128| by |\dimen@|. +% +% \begin{macrocode} + \setbox\@outputbox \vbox to\@colht {% +% \boxmaxdepth \maxdepth %?? + \@texttop + \dimen@ \dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@ + \@textbottom + }% + \fi + \global \maxdepth \@maxdepth +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@reinserts} +% \changes{v1.0e}{1993/12/01}{Command added} +% This is the code which reinserts the inserts. It puts them all +% in one place; this can make some of them come out on the wrong +% page. +% It has been put into a separate macro to expedite experimentation. +% \begin{macrocode} +\gdef \@reinserts{% + \ifvoid\footins\else\insert\footins{\unvbox\footins}\fi + \ifvbox\@kludgeins\insert\@kludgeins + {\unvbox\@kludgeins}\fi +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@makespecialcolbox} +% \changes{v1.0b}{1993/11/29}{Command added} +% This implements certain variations in page-makeup. +% \begin{macrocode} +%<*2ekernel|fltrace> +\gdef \@makespecialcolbox {% +%<*trace> + \fl@trace{Kludgeins ht \the\ht\@kludgeins\space + dp \the\dp\@kludgeins\space + wd \the\wd\@kludgeins}% +%</trace> +% \end{macrocode} +% First we find the natural height of the column. +% +% See above for discussion of what is happening here. +% +% This needs further investigation, especially in this `special +% case'. +% \changes{v1.0k}{1994/02/08}{boxmaxdepth setting removed} +% \begin{macrocode} + \setbox\@outputbox \vbox {% + \@texttop + \dimen@ \dp\@outputbox + \unvbox\@outputbox + \vskip-\dimen@ + }% + \@tempdima \@colht + \ifdim \wd\@kludgeins>\z@ +% \end{macrocode} +% Note that in this case (the *-version), the height of the +% |\@kludgeins| box is not used since its value is somewhat +% arbitrary: it need only be big enough to ensure that the +% page-break is not taken prematurely. +% +% Here we calculate how much vertical space needs to be added in +% order to enable the column to fit into a box of size |\@colht| +% using the best information we have about the amount of shrink +% available (another thing which is known internally about a box, +% but cannot be accessed at the \TeX{} level!). +% +% This needs \TeX3 otherwise |\pageshrink| is zero anyway; it may +% not be exactly the figure we wish as it is the total available +% from the all the material collected before the page-break +% decision is made. It will, we think, always be an overestimate +% of the actual shrink in the box; therefore this should always +% force the shortest possible column with the possibility of an +% overfull box. +% +% This should work for bothe flush- and ragged-bottom setting since +% it makes the contents no smaller than the size (|\@colht|) of the +% box into which they are put. +% +% Their should perhaps be an upper limit, of 0pt?, on the extra +% space added to force shrinking. +% \task{CAR}{Further investigation of kludge-* space} +% +% See above for a discussion of the |\boxmaxdepth| setting here. +% +% \changes{v1.0k}{1994/02/08}{boxmaxdepth setting added} +% \changes{v1.0l}{1994/03/15}{Removed boxmaxdepth setting.} +% \begin{macrocode} + \advance \@tempdima -\ht\@outputbox + \advance \@tempdima \pageshrink +%<*trace> + \fl@trace {Natural ht of col: \the \ht\@outputbox}% + \fl@trace {\string \@colht: \the \@colht}% + \fl@trace {Pageshrink added: \the \pageshrink}% + \fl@trace {Hence, space added: \the \@tempdima}% +%</trace> + \setbox\@outputbox \vbox to \@colht {% +% \boxmaxdepth \maxdepth + \unvbox\@outputbox + \vskip \@tempdima + \@textbottom + }% +% \end{macrocode} +% For the unstarred version, the final size of the page is +% precisely specified. Therefore, at least for the flush-bottom +% case, we need to ensure that, visually, it has this size exactly. +% +% Thus we calculate this size and set the material in a box of this +% size, which is then put into a box of size |\@colht| with |\vss| +% at the bottom. +% \begin{macrocode} + \else + \advance \@tempdima -\ht\@kludgeins +%<*trace> + \fl@trace {Natural ht of col: \the \ht\@outputbox}% + \fl@trace {\string \@colht: \the \@colht}% + \fl@trace {Extra size added: -\the \ht \@kludgeins}% + \fl@trace {Hence, height of inner box: \the \@tempdima}% + \fl@trace {Max? pageshrink available: \the \pageshrink}% +%</trace> +% \end{macrocode} +% This type of final packaging could be done always; this may +% simplify all of this page-makeup. +% +% It is not necessary to set |\boxmaxdepth| here since the +% |\@outputbox| ends with glue. +% \changes{v1.0k}{1994/02/03}{correct mistakes in the documentation} +% \begin{macrocode} + \setbox \@outputbox \vbox to \@colht {% + \vbox to \@tempdima {% + \unvbox\@outputbox + \@textbottom}% + \vss}% + \fi +% \end{macrocode} +% Finally we need to explicitly make the insert box void. +% \begin{macrocode} + {\setbox \@tempboxa \box \@kludgeins}% +%<*trace> + \fl@trace {kludgeins box made void}% +%</trace> +} +%</2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@texttop} +% \begin{macro}{\@textbottom} +% These do nothing as a default. +% \begin{macrocode} +%<*2ekernel> +\let \@texttop \relax +\let \@textbottom \relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@resetactivechars} +% \begin{macro}{\@activechar@info} +% +% \changes{v1.0n}{1994/04/30}{\cs{@activechar@warning} changed to +% \cs{@activechar@info}} +% RmS 93/09/06: +% added hook to protect against certain active characters in the +% output routine. Default checks are for active space and end-of-line. +% \changes{v1.0u}{1994/05/23}{Added \cs{MessageBreak}} +% \begin{macrocode} +\def\@activechar@info #1{% + \@latex@info@no@line {Active #1 character found while + output routine is active + \MessageBreak + This may be a bug in a package file + you are using}% +} +% \end{macrocode} +% +% Do not put any spaces in this next bit! +% \changes{1.2f}{1999/10/09}{Reset definition of active prime +% character (used in math mode)} +% \begin{macrocode} +\begingroup +\obeylines\obeyspaces% +\catcode`\'\active% +\gdef\@resetactivechars{% +\def^^M{\@activechar@info{EOL}\space}% +\def {\@activechar@info{space}\space}% +\let'\active@math@prime}% +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@outputpage} +% \changes{v1.0f}{1993/12/05}{Command changed} +% \begin{macro}{\@shipoutsetup} +% \changes{v1.0f}{1993/12/05}{Command added} +% \changes{v1.1s}{1995/11/10}{Command removed} +% \begin{macro}{\@writesetup} +% \changes{v1.1s}{1995/11/10}{Command removed} +% \changes{v1.1o}{1995/07/21}{Command added} +% \changes{v1.0f}{1993/12/05}{\cs{@startpagehook} added} +% \changes{v1.0j}{1993/12/17}{---and then removed} +% \changes{v1.0p}{1994/05/12}{\cs{normalcolor}added} +% \changes{v1.0s}{1994/05/20}{Added setting of \cs{protect} +% during \cs{shipout}.} +% \changes{v1.0u}{1994/05/23}{Changed resetting of \cs{protect} after +% shipout to use \cs{aftergroup}} +% \changes{v1.1b}{1994/11/05} +% {Use new \cs{color@hbox} concept.} +% \changes{v1.1b}{1994/11/05} +% {Change protect settings for new-style, protect-free +% aux-files.} +% \changes{v1.1c}{1994/11/05} +% {Add new \cs{AtBeginDvi} concept} +% \changes{v1.1e}{1994/11/10} +% {Modify \cs{protect} setting} +% \changes{v1.1f}{1994/11/14} +% {Modify new \cs{AtBeginDvi} concept} +% \changes{v1.1o}{1995/07/21} +% {New, experimental, versions: need in-lining} +% \changes{v1.1s}{1995/11/10}{In-lined} +% \changes{v1.1w}{1996/09/21}{Added \cs{@parboxrestore} and made +% consequent deletions: wait for the howls of protest} +% +% The |\color@hbox| hooks here are used to avoid putting just a +% colour special into an otherwise empty box (in a header or +% footer). These boxes are often set to be completely empty and so +% adding a special produces a very underfull box message. +% +% There has been extensive tidying up of the old code here; +% including the removal of a level of grouping. +% +% The setting of |\protect| immediately before the |\shipout| +% is needed so that protected commands within |\write|s are +% handled correctly. +% +% Within shipout's vbox it is reset to its default value, |\relax|. +% +% Resetting it to its default value after the shipout has been +% completed (and the contents of the writes have been expanded) +% must be done by use of |\aftergroup|. +% This is because it must have the value |\relax| +% before macros coming from other uses of |\aftergroup| within +% this box are expanded. +% +% Putting this into the |\aftergroup| token list does not affect +% the definition used in expanding the |\write|s because the +% aftergroup token list is only constructed when popping the +% save-stack, it is not expanded until after the shipout is +% completed. +% +% Question: should things from an |\aftergroup| within the shipped +% out box be executed in the environment set up for the writes, or +% after it finishes? +% +% A lot of this code has been in-lined to prevent mis-use of +% internal commands as hooks. +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2017/04/15}% +%<latexrelease> {\@outputpage}{Reset language for hyphenation}% +%<*2ekernel|latexrelease> +\def\@outputpage{% +% \end{macrocode} +% The |\endgroup| is put in by |\aftergroup|. +% \begin{macrocode} +\begingroup +% \end{macrocode} +% Now all the set-up stuff has been in-lined for Frank. +% +% First the stuff for the writes. +% +% From here \ldots\ was in the command |\@writesetup|. +% \begin{macrocode} + \let \protect \noexpand +% \end{macrocode} +% +% RmS 93/08/19: Redefined accents to allow changes in font encoding; +% but exactly why was this needed? +% +% \changes{v1.3c}{2017/03/10}{Reset \cs{language}} +% Reset |\language| to the value current at |\begin{document}|. +% In particular this ensures that a pagebreak in |verbatim| does not +% prevent hyphenation in the page head. +% \begin{macrocode} + \language\document@default@language +% \end{macrocode} +% +% The |\catcode`\ = 10| was removed as it was considered useless +% (presumably because nothing gets tokenised during shipout). +% +% This was put in as some error produced active spaces in a mark, I +% think. +% +% Why was the hyphen reset? +% +% \begin{macrocode} + \@resetactivechars +% \end{macrocode} +% If a page break happens between the start of a list and its first +% item the |@newlist| will be true and this will mess up any list +% that is used in the header or footer of the page. So we have to +% reset that flag. +% \changes{v1.2h}{2000/07/19} +% {Reset and restore \cs{@if@newlist} for internal/3231} +% \changes{v1.2j}{2001/01/07} +% {And do it in the right macro! (pr/3286)} +% \begin{macrocode} + \global\let\@@if@newlist\if@newlist + \global\@newlistfalse +% \end{macrocode} +% +% \changes{v1.0q}{1994/05/16}{Changed setting of accents (FMi): +% with the new encoding setup they can use \cs{let}. +% It could also use the new internal commands?} +% \changes{v1.1l}{1995/04/24}{Reset \cmd\\ latex/1451 (DPC)} +% This next hook replaces the following: +% \begin{verbatim} +% \let\-\@dischyph +% \let\'\@acci\let\`\@accii\let\=\@acciii +% \let\\\@normalcr +% \let\par\@@par %% 15 Sep 87 (this was once inside the box) +% \end{verbatim} +% and it does more than they did; in particular it sets: +% \begin{verbatim} +% \parindent\z@ +% \parskip\z@skip +% \everypar{}% +% \leftskip\z@skip +% \rightskip\z@skip +% \parfillskip\@flushglue +% \lineskip\normallineskip +% \baselineskip\normalbaselineskip +% \sloppy +% \end{verbatim} +% +% \begin{macrocode} + \@parboxrestore +% \end{macrocode} +% \ldots\ to here was in the command |\@writesetup|. +% \begin{macrocode} + \shipout \vbox{% + \set@typeset@protect + \aftergroup \endgroup +% \end{macrocode} +% Correct? or just restore by ending the group? +% \begin{macrocode} + \aftergroup \set@typeset@protect +% \end{macrocode} +% This first bit has been moved inside the shipped out box. +% +% Now the setup inside the shipped out box; this should contain all +% the stuff that could only affect typesetting; other stuff may need +% to be reset for the writes also. +% +% From here \ldots\ was in the command |\@shipoutsetup|. +% \begin{macrocode} + \if@specialpage + \global\@specialpagefalse\@nameuse{ps@\@specialstyle}% + \fi + \if@twoside + \ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot + \let\@themargin\oddsidemargin + \else \let\@thehead\@evenhead + \let\@thefoot\@evenfoot \let\@themargin\evensidemargin + \fi + \fi +% \end{macrocode} +% +% The rest was always inside the box. +% +% RmS 91/08/15: aded this line: +% \begin{macrocode} + \reset@font +% \end{macrocode} +% RmS 93/08/06 Added |\lineskiplimit=0pt| to guard against it being +% nonzero: e.g. by |\offinterlineskip| being in effect. +% +% There are probably lots of other things that may need resetting. +% +% \begin{macrocode} + \normalsize +% \end{macrocode} +% Reset the space factors. +% \changes{v1.2b}{1997/04/14} +% {Call \cs{normalsfcodes} (from patch file) latex/2404} +% \begin{macrocode} + \normalsfcodes +% \end{macrocode} +% +% Reset these here (previously reset separately for head and foot) +% \changes{v1.2b}{1997/04/14} +% {Move \cs{label} and \cs{index} (from patch file)} +% \begin{macrocode} + \let\label\@gobble + \let\index\@gobble + \let\glossary\@gobble +% \end{macrocode} +% +% \begin{macrocode} + \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@ +% \end{macrocode} +% \ldots\ to here was in the command |\@shipoutsetup|. +% \begin{macrocode} + \@begindvi + \vskip \topmargin + \moveright\@themargin \vbox {% + \setbox\@tempboxa \vbox to\headheight{% + \vfil + \color@hbox + \normalcolor + \hb@xt@\textwidth{\@thehead}% + \color@endbox +% \end{macrocode} +% 22 Feb 87 +% \begin{macrocode} + }% + \dp\@tempboxa \z@ + \box\@tempboxa + \vskip \headsep + \box\@outputbox + \baselineskip \footskip + \color@hbox + \normalcolor + \hb@xt@\textwidth{\@thefoot}% + \color@endbox + }% + }% +% \end{macrocode} +% |\endgroup| now inserted by |\aftergroup| +% +% Restore |\if@newlist| +% \begin{macrocode} + \global\let\if@newlist\@@if@newlist +% \end{macrocode} +% +% \begin{macrocode} + \global \@colht \textheight + \stepcounter{page}% +% \end{macrocode} +% It is now clear that this does something useful, thanks to Piet +% van Oostrum. It is needed because a float page is made without +% using TeX's page-builder; thus the output routine is never called +% so the marks are not updated. +% \begin{macrocode} + \let\firstmark\botmark +} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@outputpage}{Reset language for hyphenation}% +%<latexrelease>\def\@outputpage{% +%<latexrelease>\begingroup +%<latexrelease> \let \protect \noexpand +%<latexrelease> \@resetactivechars +%<latexrelease> \global\let\@@if@newlist\if@newlist +%<latexrelease> \global\@newlistfalse +%<latexrelease> \@parboxrestore +%<latexrelease> \shipout \vbox{% +%<latexrelease> \set@typeset@protect +%<latexrelease> \aftergroup \endgroup +%<latexrelease> \aftergroup \set@typeset@protect +%<latexrelease> \if@specialpage +%<latexrelease> \global\@specialpagefalse\@nameuse{ps@\@specialstyle}% +%<latexrelease> \fi +%<latexrelease> \if@twoside +%<latexrelease> \ifodd\count\z@ +%<latexrelease> \let\@thehead\@oddhead \let\@thefoot\@oddfoot +%<latexrelease> \let\@themargin\oddsidemargin +%<latexrelease> \else \let\@thehead\@evenhead +%<latexrelease> \let\@thefoot\@evenfoot \let\@themargin\evensidemargin +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \reset@font +%<latexrelease> \normalsize +%<latexrelease> \normalsfcodes +%<latexrelease> \let\label\@gobble +%<latexrelease> \let\index\@gobble +%<latexrelease> \let\glossary\@gobble +%<latexrelease> \baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@ +%<latexrelease> \@begindvi +%<latexrelease> \vskip \topmargin +%<latexrelease> \moveright\@themargin \vbox {% +%<latexrelease> \setbox\@tempboxa \vbox to\headheight{% +%<latexrelease> \vfil +%<latexrelease> \color@hbox +%<latexrelease> \normalcolor +%<latexrelease> \hb@xt@\textwidth{\@thehead}% +%<latexrelease> \color@endbox +%<latexrelease> }% +%<latexrelease> \dp\@tempboxa \z@ +%<latexrelease> \box\@tempboxa +%<latexrelease> \vskip \headsep +%<latexrelease> \box\@outputbox +%<latexrelease> \baselineskip \footskip +%<latexrelease> \color@hbox +%<latexrelease> \normalcolor +%<latexrelease> \hb@xt@\textwidth{\@thefoot}% +%<latexrelease> \color@endbox +%<latexrelease> }% +%<latexrelease> }% +%<latexrelease> \global\let\if@newlist\@@if@newlist +%<latexrelease> \global \@colht \textheight +%<latexrelease> \stepcounter{page}% +%<latexrelease> \let\firstmark\botmark +%<latexrelease>} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@begindvi} +% \changes{v1.1c}{1994/11/05} +% {Added macro} +% \changes{v1.1f}{1994/11/14}{Use normal box register: why a box?} +% +% This unboxes stuff that must appear before anything else in the +% |.dvi| file, then returns that box register to the free list and +% cancels itself. +% +% The stuff in the box should not add any typeset material to the +% page. +% \begin{macrocode} +\def \@begindvi{% + \unvbox \@begindvibox + \global\let \@begindvi \@empty +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@combinefloats} +% \begin{macro}{\@cflt} +% \changes{v1.0h}{1993/12/12}{name changed} +% \begin{macro}{\@cflb} +% The |\boxmaxdepth| setting here was not made local to +% a box so was dangerous. It is needed only within the box made +% by |\@cflt| (and not normally even there), so it has been +% moved there; this also agrees with the original pseudocode. +% +% \changes{v1.0h}{1993/12/12}{boxmaxdepth setting moved} +% \begin{macrocode} +\def \@combinefloats {% +% \boxmaxdepth \maxdepth + \ifx \@toplist\@empty \else \@cflt \fi + \ifx \@botlist\@empty \else \@cflb \fi +} +% \end{macrocode} +% +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} +\def \@cflt{% + \let \@elt \@comflelt + \setbox\@tempboxa \vbox{}% + \@toplist + \setbox\@outputbox \vbox{% + \boxmaxdepth \maxdepth + \unvbox\@tempboxa + \vskip -\floatsep + \topfigrule + \vskip \textfloatsep + \unvbox\@outputbox + }% + \let\@elt\relax + \xdef\@freelist{\@freelist\@toplist}% + \global\let\@toplist\@empty +} +% \end{macrocode} +% +% \begin{macrocode} +\def \@cflb {% + \let\@elt\@comflelt + \setbox\@tempboxa \vbox{}% + \@botlist + \setbox\@outputbox \vbox{% + \unvbox\@outputbox + \vskip \textfloatsep + \botfigrule + \unvbox\@tempboxa + \vskip -\floatsep + }% + \let\@elt\relax + \xdef\@freelist{\@freelist\@botlist}% + \global \let \@botlist\@empty +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@comflelt} +% \begin{macro}{\@comdblflelt} +% \begin{macro}{\@combinedblfloats} +% +% \begin{macrocode} +\def\@comflelt#1{\setbox\@tempboxa + \vbox{\unvbox\@tempboxa\box #1\vskip\floatsep}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@comdblflelt#1{\setbox\@tempboxa + \vbox{\unvbox\@tempboxa\box #1\vskip\dblfloatsep}} +% \end{macrocode} +% +% \begin{macrocode} +\def \@combinedblfloats{% + \ifx \@dbltoplist \@empty + \else + \setbox\@tempboxa \vbox{}% + \let \@elt \@comdblflelt + \@dbltoplist + \let \@elt \relax + \xdef \@freelist {\@freelist\@dbltoplist}% + \global\let \@dbltoplist \@empty + \setbox\@outputbox \vbox to\textheight +% \end{macrocode} +% +% The setting of |\boxmaxdepth| here has no effect since the +% |\@outputbox| should already have depth zero. Even so, it would +% have no effect on the layout of the page. +% \changes{v1.0l}{1994/03/15}{Removed boxmaxdepth setting.} +% \begin{macrocode} + {%\boxmaxdepth\maxdepth %% probably not needed, CAR + \unvbox\@tempboxa\vskip-\dblfloatsep +% \end{macrocode} +% Here we need different typesetting if the top float comes from +% |\@topnewpage|. +% \changes{v1.0n}{1994/04/30}{Removed rule in topnewpage case} +% \begin{macrocode} + \ifnum \@dbltopnum>\m@ne + \dblfigrule + \fi + \vskip \dbltextfloatsep +% \end{macrocode} +% If pdf links are present in the galley and those links get broken +% across pages they have to end up being on the same level of boxing +% (even if not actually in the same structure) due to some engine +% restrictions in pdf\TeX\ and Lua\TeX. We therefore unbox +% |\@outputbox| here (which only contains a single |\hbox|) so that +% this case has the same boxing level as a normal twocolumn page +% without top floats. +% \changes{v1.4d}{2018/11/28}{Unbox \cs{@outputbox} to preserve boxing +% level (github/94)} +% \begin{macrocode} + \unvbox\@outputbox + }% + \fi +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@startcolumn} +% \changes{v1.0f}{1993/12/05}{Command changed} +% \begin{macro}{\@startdblcolumn} +% \changes{v1.0f}{1993/12/05}{Command changed} +% +% We could combine (most of) these two into |\@startcol <list>|. +% Note that |\@xstartcol| was only used once (\ie in +% |\@startcolumn|); it has therefore been removed. This is not quite +% as efficient but it now has the same structure as +% |\@startdblcolumn|. +% +% The empty-list test has been moved to |\@tryfcolumn|. +% +% \begin{macrocode} +%<*2ekernel|fltrace> +\def \@startcolumn {% + \global \@colroom \@colht + \@tryfcolumn \@deferlist + \if@fcolmade +%<*trace> + \fl@trace{PAGE: float \if@twocolumn column \else page \fi + completed}% +%</trace> + \else +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} + \begingroup + \let \reserved@b \@deferlist + \global \let \@deferlist \@empty + \let \@elt \@scolelt + \reserved@b + \endgroup + \fi +} +% \end{macrocode} +% +% This one does not need to set |\@colht|. +% +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%</2ekernel|fltrace> +%<latexrelease|fltrace>\IncludeInRelease{2015/01/01}% +%<latexrelease|fltrace> {\@startdblcolumn}{float order in 2-column}% +%<*2ekernel|latexrelease|fltrace> +\def \@startdblcolumn {% + \@tryfcolumn \@deferlist + \if@fcolmade +%<fltrace> \fl@trace{PAGE: double float page completed}% + \else + \begingroup + \let \reserved@b \@deferlist + \global \let \@deferlist \@empty + \let \@elt \@sdblcolelt + \reserved@b + \endgroup + \fi +}% +%</2ekernel|latexrelease|fltrace> +%<latexrelease|fltrace>\EndIncludeInRelease +%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}% +%<latexrelease|fltrace> {\@startdblcolumn}{float order in 2-column}% +%<latexrelease|fltrace>\def \@startdblcolumn {% +% \end{macrocode} +% Not needed since this always comes after |\@outputpage|: +% \begin{macrocode} +%<latexrelease|fltrace>% \global \@colht \textheight +%<latexrelease|fltrace> \@tryfcolumn \@dbldeferlist +%<latexrelease|fltrace> \if@fcolmade +%<*trace> +%<latexrelease|fltrace> \fl@trace{PAGE: double float page completed}% +%</trace> +%<latexrelease|fltrace> \else +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} +%<latexrelease|fltrace> \begingroup +%<latexrelease|fltrace> \let \reserved@b \@dbldeferlist +%<latexrelease|fltrace> \global \let \@dbldeferlist \@empty +%<latexrelease|fltrace> \let \@elt \@sdblcolelt +%<latexrelease|fltrace> \reserved@b +%<latexrelease|fltrace> \endgroup +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace>}% +%<latexrelease|fltrace>\EndIncludeInRelease +%<*2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@tryfcolumn} +% \changes{v1.0f}{1993/12/05}{Command changed} +% Now tests if its list is empty before any further exertion. +% +% \begin{macrocode} +\def \@tryfcolumn #1{% + \global \@fcolmadefalse + \ifx #1\@empty + \else +%<*trace> + \fl@trace{PAGE: try float \if@twocolumn column/page\else page\fi + ---\string #1}% + \fl@trace{----- \string #1: #1}% +%</trace> +% \end{macrocode} +% \changes{v1.0h}{1993/12/12}{defs changed to lets} +% \begin{macrocode} + \xdef\@trylist{#1}% + \global \let \@failedlist \@empty + \begingroup + \let \@elt \@xtryfc \@trylist + \endgroup + \if@fcolmade + \@vtryfc #1% + \fi + \fi +} +%</2ekernel|fltrace> +% \end{macrocode} +% +% \end{macro} +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% \begin{macro}{\@scolelt} +% \begin{macrocode} +\def\@scolelt#1{\def\@currbox{#1}\@addtonextcol} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@sdblcolelt} +% \begin{macrocode} +\def\@sdblcolelt#1{\def\@currbox{#1}\@addtodblcol} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@vtryfc} +% \changes{v1.2d}{1997/11/19}{Reindent code, to be understandable(DPC).} +% \begin{macrocode} +\def\@vtryfc #1{% + \global\setbox\@outputbox\vbox{}% + \let\@elt\@wtryfc + \@flsucceed + \global\setbox\@outputbox \vbox to\@colht{% + \vskip \@fptop + \vskip -\@fpsep + \unvbox \@outputbox + \vskip \@fpbot}% + \let\@elt\relax + \xdef #1{\@failedlist\@flfail}% + \xdef\@freelist{\@freelist\@flsucceed}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@wtryfc} +% \begin{macrocode} +\def\@wtryfc #1{% + \global\setbox\@outputbox\vbox{% + \unvbox\@outputbox + \vskip\@fpsep + \box #1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xtryfc} +% \changes{v1.1v}{1996/07/26}{remove \cs{global} before \cs{@test...}} +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{\@xtryfc}% +%<latexrelease> {float order in 2-column}% +%<*2ekernel|latexrelease> +\def\@xtryfc #1{% + \@next\reserved@a\@trylist{}{}% + \@currtype \count #1% + \divide\@currtype\@xxxii + \multiply\@currtype\@xxxii + \@bitor \@currtype \@failedlist + \@testfp #1% +% \end{macrocode} +% +% \begin{macrocode} + \@testwrongwidth #1% +% \end{macrocode} +% +% \begin{macrocode} + \ifdim \ht #1>\@colht + \@testtrue + \fi + \if@test + \@cons\@failedlist #1% + \else + \@ytryfc #1% + \fi}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\@xtryfc}% +%<latexrelease> {float order in 2-column}% +%<latexrelease>\def\@xtryfc #1{% +%<latexrelease> \@next\reserved@a\@trylist{}{}% +%<latexrelease> \@currtype \count #1% +%<latexrelease> \divide\@currtype\@xxxii +%<latexrelease> \multiply\@currtype\@xxxii +%<latexrelease> \@bitor \@currtype \@failedlist +%<latexrelease> \@testfp #1% +%<latexrelease> \ifdim \ht #1>\@colht +%<latexrelease> \@testtrue +%<latexrelease> \fi +%<latexrelease> \if@test +%<latexrelease> \@cons\@failedlist #1% +%<latexrelease> \else +%<latexrelease> \@ytryfc #1% +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ytryfc} +% \begin{macrocode} +\def\@ytryfc #1{% + \begingroup + \gdef\@flsucceed{\@elt #1}% + \global\let\@flfail\@empty + \@tempdima\ht #1% + \let\@elt\@ztryfc + \@trylist + \ifdim \@tempdima >\@fpmin + \global\@fcolmadetrue + \else + \@cons\@failedlist #1% + \fi + \endgroup + \if@fcolmade + \let\@elt\@gobble + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ztryfc} +% \changes{v1.1v}{1996/07/26}{remove \cs{global} before \cs{@test...}} +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}{@ztryfc}% +%<latexrelease> {float order in 2-column}% +%<*2ekernel|latexrelease> +\def\@ztryfc #1{% + \@tempcnta\count #1% + \divide\@tempcnta\@xxxii + \multiply\@tempcnta\@xxxii + \@bitor \@tempcnta {\@failedlist \@flfail}% + \@testfp #1% +% \end{macrocode} +% +% not in fixfloats? +% \begin{macrocode} + \@testwrongwidth #1% +% \end{macrocode} +% +% \begin{macrocode} + \@tempdimb\@tempdima + \advance\@tempdimb\ht #1% + \advance\@tempdimb\@fpsep + \ifdim \@tempdimb >\@colht + \@testtrue + \fi + \if@test + \@cons\@flfail #1% + \else + \@cons\@flsucceed #1% + \@tempdima\@tempdimb + \fi}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{@ztryfc}% +%<latexrelease> {float order in 2-column}% +%<latexrelease>\def\@ztryfc #1{% +%<latexrelease> \@tempcnta \count#1% +%<latexrelease> \divide\@tempcnta\@xxxii +%<latexrelease> \multiply\@tempcnta\@xxxii +%<latexrelease> \@bitor \@tempcnta {\@failedlist \@flfail}% +%<latexrelease> \@testfp #1% +%<latexrelease> \@tempdimb\@tempdima +%<latexrelease> \advance\@tempdimb \ht#1% +%<latexrelease> \advance\@tempdimb\@fpsep +%<latexrelease> \ifdim \@tempdimb >\@colht +%<latexrelease> \@testtrue +%<latexrelease> \fi +%<latexrelease> \if@test +%<latexrelease> \@cons\@flfail #1% +%<latexrelease> \else +%<latexrelease> \@cons\@flsucceed #1% +%<latexrelease> \@tempdima\@tempdimb +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% +% The major changes for float suppression and the changes to the float +% mechanism to make it conform to the documentation are in these next +% macros. +% +% \begin{macro}{\@addtobot} +% \changes{v1.0f}{1993/12/05}{Command changed} +% Lots of changes. +% +% \begin{macrocode} +%<*2ekernel|fltrace> +\def \@addtobot {% +%<*trace> + \fl@trace{***Start addtobot}% +%</trace> + \@getfpsbit 4\relax +%<*trace> + \fl@trace{fpstype \ifodd \@tempcnta OK \else not \fi bot: + \the \@fpstype}% +%</trace> + \ifodd \@tempcnta + \@flsetnum \@botnum + \ifnum \@botnum>\z@ + \@tempswafalse + \@flcheckspace \@botroom \@botlist + \if@tempswa +% \end{macrocode} +% This next line means that this page is produced with box 255 +% having depth zero, rather than the normal maxdepth: is this +% needed, useful? +% \task{CAR/FMi}{Investigate resetting of maxdepth: I do not think it is +% necessary here; Frank does.} +% \begin{macrocode} + \global \maxdepth \z@ + \@flupdates \@botnum \@botroom \@botlist +%<*trace> + \fl@trace{colroom (after-bot) = \the \@colroom}% + \fl@trace{colnum (after-bot) = \the \@colnum}% + \fl@trace{botnum (after-bot) = \the \@botnum}% + \fl@trace{***Success: bot}% +%</trace> + \@inserttrue + \fi +%<*trace> + \else + \fl@trace{Fail: botnum = \the \@botnum: + fpstype \the \@fpstype=ORD?}% + \ifnum \@fpstype<\sixt@@n + \fl@trace{ERROR: !b float not successful (addtobot)}% + \fi +%</trace> + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtotoporbot} +% \changes{v1.0f}{1993/12/05}{Command changed} +% Lots of changes. +% +% \begin{macrocode} +\def \@addtotoporbot {% +%<*trace> + \fl@trace{***Start addtotoporbot}% +%</trace> + \@getfpsbit \tw@ +%<*trace> + \fl@trace{fpstype \ifodd \@tempcnta OK \else not \fi top: + \the \@fpstype}% +%</trace> + \ifodd \@tempcnta + \@flsetnum \@topnum + \ifnum \@topnum>\z@ + \@tempswafalse + \@flcheckspace \@toproom \@toplist + \if@tempswa + \@bitor\@currtype{\@midlist\@botlist}% +%<*trace> + \fl@trace{(mid+bot)list: \@midlist, \@botlist: + (addtotoporbot-before)}% +%</trace> + \if@test +%<*trace> + \fl@trace{type already on list: mid or bot---sent to addtobot}% +%</trace> + \else + \@flupdates \@topnum \@toproom \@toplist +%<*trace> + \fl@trace{colroom (after-top) = \the \@colroom}% + \fl@trace{colnum (after-top) = \the \@colnum}% + \fl@trace{topnum (after-top) = \the \@topnum}% + \fl@trace{***Success: top}% +%</trace> + \@inserttrue + \fi + \fi +%<*trace> + \else + \fl@trace{Fail: topnum = \the \@topnum: fpstype + \the \@fpstype=ORD?}% + \ifnum \@fpstype<\sixt@@n + \fl@trace{ERROR: !t float not successful (addtotoporbot)}% + \fi +%</trace> + \fi + \fi + \if@insert + \else +%<*trace> + \fl@trace{sent to addtobot (addtotoporbot)}% +%</trace> + \@addtobot + \fi +} +%</2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtocurcol} +% \changes{v1.0f}{1993/12/05}{Command changed} +% \task{CAR}{Add rules around h floats for FMi} +% \task{CAR}{Investigate pagebreak option possibilities} +% Lots of changes. +% +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%<latexrelease|fltrace|flafter>\IncludeInRelease{2015/01/01}% +%<latexrelease|fltrace|flafter> {\@addtocurcol}{float order in 2-column}% +%<*2ekernel|latexrelease|fltrace|flafter> +\def \@addtocurcol {% +%<*trace> + \fl@trace{***Start addtocurcol}% +%</trace> + \@insertfalse + \@setfloattypecounts + \ifnum \@fpstype=8 +%<*trace> + \fl@trace{fpstype !p only (addtocurcol): \the \@fpstype = 8?}% +%</trace> + \else + \ifnum \@fpstype=24 +%<*trace> + \fl@trace{fpstype p only (addtocurcol): \the \@fpstype = 24?}% +%</trace> + \else + \@flsettextmin +% \end{macrocode} +% This is a new adjustment which is quite a major change in +% functionality; but it implements the documentation. +% Note that |\@reqcolroom| will include the whole of the +% page-so-far, and hence includes |\@textfloatsheight| of floats, +% so before comparing it with |\@textmin|, we add this to +% |\@textmin| also. +% \begin{macrocode} +%<*trace> + \fl@trace{textfloatsheight (before) = \the \@textfloatsheight}% +%</trace> + \advance \@textmin \@textfloatsheight + \@reqcolroom \@pageht +% \end{macrocode} +% This line must be removed since |\@specialoutput| changed. +% \begin{macrocode} +% \advance \@reqcolroom \@pagedp +%<*trace> + \fl@trace{textmin + textfloatsheight: \the \@textmin}% + \fl@trace{page-so-far: \the \@reqcolroom}% +%</trace> + \ifdim \@textmin>\@reqcolroom + \@reqcolroom \@textmin +%<*trace> + \fl@trace{ORD? textmin being used}% +%</trace> + \fi + \advance \@reqcolroom \ht\@currbox +%<*trace> + \fl@trace{float size = \the \ht \@currbox (addtocurcol)}% + \fl@trace{colroom = \the \@colroom (addtocurcol)}% + \fl@trace{reqcolroom = \the \@reqcolroom (addtocurcol)}% +%</trace> + \ifdim \@colroom>\@reqcolroom + \@flsetnum \@colnum + \ifnum \@colnum>\z@ + \@bitor\@currtype\@deferlist +% \end{macrocode} +% We need to defer the float also if its width +% doesn't fit. +% \changes{v1.2n}{2000/09/24}{FMi: test for wide float was +% in wrong place} +% \begin{macrocode} + \@testwrongwidth\@currbox +% \end{macrocode} +% +% \begin{macrocode} +%<*trace> + \fl@trace{deferlist: \@deferlist: (addtocurcol-before)}% +%</trace> + \if@test +%<*trace> + \fl@trace{type already on list: defer (addtocurcol)}% +%</trace> + \else + \@bitor\@currtype\@botlist +%<*trace> + \fl@trace{botlist: \@botlist: (addtocurcol-before)}% +%</trace> + \if@test +%<*trace> + \fl@trace{type already on list: bot---sent to addtobot}% +%</trace> + \@addtobot + \else +%<*trace> + \fl@trace{fpstype \ifodd \@tempcnta OK \else not \fi + here: \the \@fpstype}% +%</trace> + \ifodd \count\@currbox + \advance \@reqcolroom \intextsep + \ifdim \@colroom>\@reqcolroom + \global \advance \@colnum \m@ne + \global \advance \@textfloatsheight \ht\@currbox +% \end{macrocode} +% This may sometimes give an overestimate. +% \begin{macrocode} + \global \advance \@textfloatsheight 2\intextsep + \@cons \@midlist \@currbox +%<*trace> + \fl@trace{***Success: here}% + \fl@trace{textfloatsheight (after-here) = + \the \@textfloatsheight}% + \fl@trace{colnum (after-here) = \the \@colnum}% +%</trace> +% \end{macrocode} +% +% CHANGE TO |\@addtocurcol|: +% +% |\penalty\z@| changed to |\penalty\interlinepenalty| so |\samepage| +% works properly with figure and table environments. +% (Changed 23 Oct 86) +% +% There is also an |\addpenalty\interlinepenalty| above. +% +% Since in 2e |\samepage| is no longer supported, these could be +% removed. +% +% Although it is best to use |\addvspace| in case two h floats come +% together, this makes other spacing more difficult to adjust; whereas +% if a user specifies two h floats together then they can more easily +% get the spacing correct by ad hoc commands. +% +% It is necessary to adjust for the addition of |\parskip| here in +% case the float is added between paragraphs (\ie when in vertical +% mode). +% +% If the nobreak switch is true we need to reset it and clear +% |\everypar| since the float may not reset the flag and cannot reset +% the |\everypar| globally. +% \changes{v1.0l}{1994/03/15}{Changed \cs{addvspace} to \cs{vskip}} +% \changes{v1.1i}{1994/11/21} +% {Added \cs{if@nobreak} test before float box} +% \changes{v1.1z}{1996/10/24}{Added \cs{nobreak}, etc as appropriate} +% +% Typesetting starts here (we are in vertical mode). +% \begin{macrocode} + \if@nobreak + \nobreak + \@nobreakfalse + \everypar{}% + \else + \addpenalty \interlinepenalty + \fi + \vskip \intextsep + \box\@currbox + \penalty\interlinepenalty + \vskip\intextsep + \ifnum\outputpenalty <-\@Mii \vskip -\parskip\fi +% \end{macrocode} +% Typesetting ends here. +% \begin{macrocode} + \outputpenalty \z@ + \@inserttrue +%<*trace> + \else + \fl@trace{Fail---no room at 2nd test of colroom + (addtocorcol \string\intextsep)}% +%</trace> + \fi + \fi + \if@insert + \else +% \end{macrocode} +% Next set of docstrip guards are a bit weird, essentially +% |\@addtotoporbot| ends up inside the kernel and the +% \texttt{fltrace} package and |\@addtobot| shows up in the +% \texttt{flafter} package. Guess that could have been done a bit +% more obvious :-) +% \begin{macrocode} +%<*2ekernel|fltrace|latexrelease> +%<*trace> + \fl@trace{not here: sent to addtotoporbot}% +%</trace> + \@addtotoporbot +%</2ekernel|fltrace|latexrelease> +%<*!2ekernel&!fltrace&!latexrelease> +%<*trace> + \fl@trace{not here: sent to addtobot}% +%</trace> + \@addtobot +%</!2ekernel&!fltrace&!latexrelease> + \fi + \fi + \fi +%<*trace> + \else + \fl@trace{Fail: colnum = \the \@colnum: + fpstype \the \@fpstype=ORD?}% + \ifnum \@fpstype<\sixt@@n + \fl@trace{ERROR: BANG float not successful (addtocurcol)}% + \fi +%</trace> + \fi +%<*trace> + \else + \fl@trace{Fail---no room: fl box ht: \the \ht \@currbox + (addtocurcol)}% +%</trace> + \fi + \fi + \fi + \if@insert + \else + \@resethfps +%<*trace> + \fl@trace{put on deferlist (addtocurcol)}% +%</trace> + \@cons\@deferlist\@currbox +%<*trace> + \fl@trace{deferlist: \@deferlist: (addtocurcol-after)}% +%</trace> + \fi +}% +%</2ekernel|latexrelease|fltrace|flafter> +%<latexrelease|fltrace|flafter>\EndIncludeInRelease +%<latexrelease|fltrace|flafter>\IncludeInRelease{0000/00/00}% +%<latexrelease|fltrace|flafter> {\@addtocurcol}{float order in 2-column}% +%<latexrelease|fltrace|flafter>\def \@addtocurcol {% +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{***Start addtocurcol}% +%</trace> +%<latexrelease|fltrace|flafter> \@insertfalse +%<latexrelease|fltrace|flafter> \@setfloattypecounts +%<latexrelease|fltrace|flafter> \ifnum \@fpstype=8 +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{fpstype !p only (addtocurcol): +%<latexrelease|fltrace|flafter> \the \@fpstype = 8?}% +%</trace> +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \ifnum \@fpstype=24 +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{fpstype p only (addtocurcol): +%<latexrelease|fltrace|flafter> \the \@fpstype = 24?}% +%</trace> +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \@flsettextmin +% \end{macrocode} +% This is a new adjustment which is quite a major change in +% functionality; but it implements the documentation. +% Note that |\@reqcolroom| will include the whole of the +% page-so-far, and hence includes |\@textfloatsheight| of floats, +% so before comparing it with |\@textmin|, we add this to +% |\@textmin| also. +% \begin{macrocode} +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{textfloatsheight (before) = +%<latexrelease|fltrace|flafter> \the \@textfloatsheight}% +%</trace> +%<latexrelease|fltrace|flafter> \advance \@textmin \@textfloatsheight +%<latexrelease|fltrace|flafter> \@reqcolroom \@pageht +% \end{macrocode} +% This line must be removed since |\@specialoutput| changed. +% \begin{macrocode} +% \advance \@reqcolroom \@pagedp +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{textmin + textfloatsheight: +%<latexrelease|fltrace|flafter> \the \@textmin}% +%<latexrelease|fltrace|flafter> \fl@trace{page-so-far: \the \@reqcolroom}% +%<latexrelease|fltrace|flafter> +%</trace> +%<latexrelease|fltrace|flafter> \ifdim \@textmin>\@reqcolroom +%<latexrelease|fltrace|flafter> \@reqcolroom \@textmin +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{ORD? textmin being used}% +%</trace> +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \advance \@reqcolroom \ht\@currbox +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{float size = +%<latexrelease|fltrace|flafter> \the \ht \@currbox (addtocurcol)}% +%<latexrelease|fltrace|flafter> \fl@trace{colroom = +%<latexrelease|fltrace|flafter> \the \@colroom (addtocurcol)}% +%<latexrelease|fltrace|flafter> \fl@trace{reqcolroom = +%<latexrelease|fltrace|flafter> \the \@reqcolroom (addtocurcol)}% +%</trace> +%<latexrelease|fltrace|flafter> \ifdim \@colroom>\@reqcolroom +%<latexrelease|fltrace|flafter> \@flsetnum \@colnum +%<latexrelease|fltrace|flafter> \ifnum \@colnum>\z@ +%<latexrelease|fltrace|flafter> \@bitor\@currtype\@deferlist +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{deferlist: +%<latexrelease|fltrace|flafter> \@deferlist: (addtocurcol-before)}% +%</trace> +%<latexrelease|fltrace|flafter> \if@test +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{type already on list: +%<latexrelease|fltrace|flafter> defer (addtocurcol)}% +%</trace> +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \@bitor\@currtype\@botlist +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{botlist: \@botlist: +%<latexrelease|fltrace|flafter> (addtocurcol-before)}% +%</trace> +%<latexrelease|fltrace|flafter> \if@test +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{type already on list: +%<latexrelease|fltrace|flafter> bot---sent to addtobot}% +%</trace> +%<latexrelease|fltrace|flafter> \@addtobot +%<latexrelease|fltrace|flafter> \else +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{fpstype +%<latexrelease|fltrace|flafter> \ifodd \@tempcnta OK \else not \fi +%<latexrelease|fltrace|flafter> here: \the \@fpstype}% +%</trace> +%<latexrelease|fltrace|flafter> \ifodd \count\@currbox +%<latexrelease|fltrace|flafter> \advance \@reqcolroom \intextsep +%<latexrelease|fltrace|flafter> \ifdim \@colroom>\@reqcolroom +%<latexrelease|fltrace|flafter> \global \advance \@colnum \m@ne +%<latexrelease|fltrace|flafter> \global \advance +%<latexrelease|fltrace|flafter> \@textfloatsheight\ht\@currbox +% \end{macrocode} +% This may sometimes give an overestimate. +% \begin{macrocode} +%<latexrelease|fltrace|flafter> \global \advance +%<latexrelease|fltrace|flafter> \@textfloatsheight 2\intextsep +%<latexrelease|fltrace|flafter> \@cons \@midlist \@currbox +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{***Success: here}% +%<latexrelease|fltrace|flafter> \fl@trace{textfloatsheight +%<latexrelease|fltrace|flafter> (after-here) = +%<latexrelease|fltrace|flafter> \the \@textfloatsheight}% +%<latexrelease|fltrace|flafter> \fl@trace{colnum (after-here) = +%<latexrelease|fltrace|flafter> \the \@colnum}% +%</trace> +% \end{macrocode} +% +% CHANGE TO |\@addtocurcol|: +% +% |\penalty\z@| changed to |\penalty\interlinepenalty| so |\samepage| +% works properly with figure and table environments. +% (Changed 23 Oct 86) +% +% There is also an |\addpenalty\interlinepenalty| above. +% +% Since in 2e |\samepage| is no longer supported, these could be +% removed. +% +% Although it is best to use |\addvspace| in case two h floats come +% together, this makes other spacing more difficult to adjust; whereas +% if a user specifies two h floats together then they can more easily +% get the spacing correct by ad hoc commands. +% +% It is necessary to adjust for the addition of |\parskip| here in +% case the float is added between paragraphs (\ie when in vertical +% mode). +% +% If the nobreak switch is true we need to reset it and clear +% |\everypar| since the float may not reset the flag and cannot reset +% the |\everypar| globally. +% \changes{v1.0l}{1994/03/15}{Changed \cs{addvspace} to \cs{vskip}} +% \changes{v1.1i}{1994/11/21} +% {Added \cs{if@nobreak} test before float box} +% \changes{v1.1z}{1996/10/24}{Added \cs{nobreak}, etc as appropriate} +% +% Typesetting starts here (we are in vertical mode). +% \begin{macrocode} +%<latexrelease|fltrace|flafter> \if@nobreak +%<latexrelease|fltrace|flafter> \nobreak +%<latexrelease|fltrace|flafter> \@nobreakfalse +%<latexrelease|fltrace|flafter> \everypar{}% +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \addpenalty\interlinepenalty +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \vskip \intextsep +%<latexrelease|fltrace|flafter> \box\@currbox +%<latexrelease|fltrace|flafter> \penalty\interlinepenalty +%<latexrelease|fltrace|flafter> \vskip\intextsep +%<latexrelease|fltrace|flafter> \ifnum\outputpenalty +%<latexrelease|fltrace|flafter> <-\@Mii \vskip +%<latexrelease|fltrace|flafter> -\parskip\fi +% \end{macrocode} +% Typesetting ends here. +% \begin{macrocode} +%<latexrelease|fltrace|flafter> \outputpenalty \z@ +%<latexrelease|fltrace|flafter> \@inserttrue +%<*trace> +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \fl@trace{Fail---no room at 2nd test of colroom +%<latexrelease|fltrace|flafter> (addtocorcol \string\intextsep)}% +%</trace> +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \if@insert +%<latexrelease|fltrace|flafter> \else +% \end{macrocode} +% Next set of docstrip guards are a bit weird, essentially +% |\@addtotoporbot| ends up inside the kernel and the +% \texttt{fltrace} package and |\@addtotoporbot| shows up in the +% \texttt{flafter} package. Guess that could have been done a bit +% more obvious :-) +% \begin{macrocode} +%<*2ekernel|fltrace> +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{not here: sent to addtotoporbot}% +%</trace> +%<latexrelease|fltrace|flafter> \@addtotoporbot +%</2ekernel|fltrace> +%<*!2ekernel&!autoload&!fltrace> +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{not here: sent to addtobot}% +%</trace> +%<latexrelease|fltrace|flafter> \@addtobot +%</!2ekernel&!autoload&!fltrace> +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \fi +%<*trace> +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \fl@trace{Fail: colnum = \the \@colnum: +%<latexrelease|fltrace|flafter> fpstype \the \@fpstype=ORD?}% +%<latexrelease|fltrace|flafter> \ifnum \@fpstype<\sixt@@n +%<latexrelease|fltrace|flafter> \fl@trace{ERROR: BANG float not successful +%<latexrelease|fltrace|flafter> (addtocurcol)}% +%<latexrelease|fltrace|flafter> \fi +%</trace> +%<latexrelease|fltrace|flafter> \fi +%<*trace> +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \fl@trace{Fail---no room: fl box ht: +%<latexrelease|fltrace|flafter> \the \ht \@currbox (addtocurcol)}% +%</trace> +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> \if@insert +%<latexrelease|fltrace|flafter> \else +%<latexrelease|fltrace|flafter> \@resethfps +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{put on deferlist (addtocurcol)}% +%</trace> +%<latexrelease|fltrace|flafter> \@cons\@deferlist\@currbox +%<*trace> +%<latexrelease|fltrace|flafter> \fl@trace{deferlist: \@deferlist: +%<latexrelease|fltrace|flafter> (addtocurcol-after)}% +%</trace> +%<latexrelease|fltrace|flafter> \fi +%<latexrelease|fltrace|flafter> }% +%<latexrelease|fltrace|flafter>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtonextcol} +% \changes{v1.0f}{1993/12/05}{Command changed} +% Lots of changes. +% +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% \changes{v1.4b}{2017/12/17}{fix doc guards} +% \begin{macrocode} +%<latexrelease|fltrace>\IncludeInRelease{2015/01/01} +%<latexrelease|fltrace> {\@addtonextcol}{float order in 2-column}% +%<*2ekernel|latexrelease|fltrace> +\def\@addtonextcol{% + \begingroup +%<*trace> + \fl@trace{***Start addtonextcol}% +%</trace> + \@insertfalse + \@setfloattypecounts + \ifnum \@fpstype=8 +%<*trace> + \fl@trace{fpstype not curcol: \the \@fpstype = 8?}% +%</trace> + \else + \ifnum \@fpstype=24 +%<*trace> + \fl@trace{fpstype not curcol: \the \@fpstype = 24?}% +%</trace> + \else + \@flsettextmin +%<*trace> + \fl@trace{text-so-far: 0pt (top of col)}% +%</trace> + \@reqcolroom \ht\@currbox +%<*trace> + \fl@trace{float size: \the \@reqcolroom (addtonextcol)}% +%</trace> + \advance \@reqcolroom \@textmin +%<*trace> + \fl@trace{colroom = \the \@colroom (addtonextcol)}% + \fl@trace{reqcolroom = \the \@reqcolroom (addtonextcol)}% +%</trace> + \ifdim \@colroom>\@reqcolroom + \@flsetnum \@colnum + \ifnum\@colnum>\z@ + \@bitor\@currtype\@deferlist +%<*trace> + \fl@trace{deferlist: \@deferlist: (addtonextcol-before)}% +%</trace> +% \end{macrocode} +% +% \begin{macrocode} + \@testwrongwidth\@currbox +% \end{macrocode} +% +% \begin{macrocode} + \if@test +%<*trace> + \fl@trace{type already on list: defer (addtonextcol)}% +%</trace> + \else +%<*trace> + \fl@trace{sent to addtotoporbot (addtonextcol)}% +%</trace> + \@addtotoporbot + \fi + \fi +%<*trace> + \else + \fl@trace{Fail---no room: fl box ht: \the \ht \@currbox + (addtonextcol)}% +%</trace> + \fi + \fi + \fi + \if@insert + \else +%<*trace> + \fl@trace{put back on deferlist (addtonextcol)}% +%</trace> + \@cons\@deferlist\@currbox +%<*trace> + \fl@trace{deferlist: \@deferlist: (addtonextcol-after)}% +%</trace> + \fi +%<*trace> + \fl@trace{End of addtonextcol -- locally counts:}% + \fl@trace{col: \the\@colnum. top: \the \@topnum. bot: \the \@botnum.}% +%</trace> + \endgroup +%<*trace> + \fl@trace{End of addtonextcol -- globally counts:}% + \fl@trace{col: \the\@colnum. top: \the \@topnum. bot: \the \@botnum.}% +%</trace> +}% +%</2ekernel|latexrelease|fltrace> +%<latexrelease|fltrace>\EndIncludeInRelease +%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}% +%<latexrelease|fltrace> {\@addtonextcol}{float order in 2-column}% +%<latexrelease|fltrace>\def\@addtonextcol{% +%<latexrelease|fltrace> \begingroup +%<*trace> +%<latexrelease|fltrace> \fl@trace{***Start addtonextcol}% +%</trace> +%<latexrelease|fltrace> \@insertfalse +%<latexrelease|fltrace> \@setfloattypecounts +%<latexrelease|fltrace> \ifnum \@fpstype=8 +%<*trace> +%<latexrelease|fltrace> \fl@trace{fpstype not curcol: +%<latexrelease|fltrace> \the \@fpstype = 8?}% +%</trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \ifnum \@fpstype=24 +%<*trace> +%<latexrelease|fltrace> \fl@trace{fpstype not curcol: +%<latexrelease|fltrace> \the \@fpstype = 24?}% +%</trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \@flsettextmin +%<*trace> +%<latexrelease|fltrace> \fl@trace{text-so-far: 0pt (top of col)}% +%</trace> +%<latexrelease|fltrace> \@reqcolroom \ht\@currbox +%<*trace> +%<latexrelease|fltrace> \fl@trace{float size: +%<latexrelease|fltrace> \the \@reqcolroom (addtonextcol)}% +%<latexrelease|fltrace> +%</trace> +%<latexrelease|fltrace> \advance \@reqcolroom \@textmin +%<*trace> +%<latexrelease|fltrace> \fl@trace{colroom = +%<latexrelease|fltrace> \the \@colroom (addtonextcol)}% +%<latexrelease|fltrace> \fl@trace{reqcolroom = +%<latexrelease|fltrace> \the \@reqcolroom (addtonextcol)}% +%</trace> +%<latexrelease|fltrace> \ifdim \@colroom>\@reqcolroom +%<latexrelease|fltrace> \@flsetnum \@colnum +%<latexrelease|fltrace> \ifnum\@colnum>\z@ +%<latexrelease|fltrace> \@bitor\@currtype\@deferlist +%<*trace> +%<latexrelease|fltrace> \fl@trace{deferlist: \@deferlist: +%<latexrelease|fltrace> (addtonextcol-before)}% +%</trace> +%<latexrelease|fltrace> \if@test +%<*trace> +%<latexrelease|fltrace> \fl@trace{type already on list: +%<latexrelease|fltrace> defer (addtonextcol)}% +%</trace> +%<latexrelease|fltrace> \else +%<*trace> +%<latexrelease|fltrace> \fl@trace{sent to addtotoporbot +%<latexrelease|fltrace> (addtonextcol)}% +%</trace> +%<latexrelease|fltrace> \@addtotoporbot +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \fi +%<*trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \fl@trace{Fail---no room: fl box ht: +%<latexrelease|fltrace> \the \ht \@currbox (addtonextcol)}% +%</trace> +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \if@insert +%<latexrelease|fltrace> \else +%<*trace> +%<latexrelease|fltrace> \fl@trace{put back on deferlist +%<latexrelease|fltrace> (addtonextcol)}% +%</trace> +%<latexrelease|fltrace> \@cons\@deferlist\@currbox +%<*trace> +%<latexrelease|fltrace> \fl@trace{deferlist: \@deferlist: +%<latexrelease|fltrace> (addtonextcol-after)}% +%</trace> +%<latexrelease|fltrace> \fi +%<*trace> +%<latexrelease|fltrace> \fl@trace{End of addtonextcol -- +%<latexrelease|fltrace> locally counts:}% +%<latexrelease|fltrace> \fl@trace{col: \the \@colnum. +%<latexrelease|fltrace> top: \the \@topnum. bot: \the \@botnum.}% +%</trace> +%<latexrelease|fltrace> \endgroup +%<*trace> +%<latexrelease|fltrace> \fl@trace{End of addtonextcol -- +%<latexrelease|fltrace> globally counts:}% +%<latexrelease|fltrace> \fl@trace{col: \the \@colnum. +%<latexrelease|fltrace> top: \the \@topnum. bot: \the \@botnum.}% +%</trace> +%<latexrelease|fltrace>}% +%<latexrelease|fltrace>\EndIncludeInRelease +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\@addtodblcol} +% \changes{v1.0f}{1993/12/05}{Command changed} +% Lots of changes. +% +% \changes{v1.2n}{2015/01/14}{float order in 2-column (latexrelease)} +% \begin{macrocode} +%<latexrelease|fltrace>\IncludeInRelease{2015/01/01}% +%<latexrelease|fltrace> {\@addtodblcol}{float order in 2-column}% +%<*2ekernel|latexrelease|fltrace> +\def\@addtodblcol{% + \begingroup +%<*trace> + \fl@trace{***Start addtodblcol}% +%</trace> + \@insertfalse + \@setfloattypecounts + \@getfpsbit \tw@ +%<*trace> + \fl@trace{fpstype \ifodd \@tempcnta OK \else not \fi dbltop: + \the \@fpstype}% +%</trace> + \ifodd\@tempcnta + \@flsetnum \@dbltopnum + \ifnum \@dbltopnum>\z@ + \@tempswafalse + \ifdim \@dbltoproom>\ht\@currbox + \@tempswatrue +%<*trace> + \fl@trace{Space OK: \@dbltoproom = + \the \@dbltoproom > \the \ht \@currbox + (dbltoproom)}% +%</trace> + \else +%<*trace> + \fl@trace{fpstype: \the \@fpstype (addtodblcol)}% +%</trace> + \ifnum \@fpstype<\sixt@@n +%<*trace> + \fl@trace{BANG float ignoring \@dbltoproom}% + \fl@trace{\@spaces \@dbltoproom = \the \@dbltoproom. + Ht float: \the \ht \@currbox-BANG}% +%</trace> +% \end{macrocode} +% Need to check that there is room on the page, using the local value +% of |\@textmin| to make the necessary adjustment to |\@dbltoproom|. +% \begin{macrocode} + \advance \@dbltoproom \@textmin +%<*trace> + \fl@trace{Local value of texmin: \the\@textmin}% + \fl@trace{\@spaces space on page = \the \@dbltoproom. + Ht float: \the \ht \@currbox-BANG}% +%</trace> + \ifdim \@dbltoproom>\ht\@currbox + \@tempswatrue +%<*trace> + \fl@trace{Space OK BANG: space on page = + \the \@dbltoproom > \the \ht \@currbox}% + \else + \fl@trace{fpstype: \the \@fpstype}% + \fl@trace{Fail---no room dbltoproom-BANG?:}% + \fl@trace{\@spaces space on page = \the \@dbltoproom. + Ht float: \the \ht \@currbox}% +%</trace> + \fi + \advance \@dbltoproom -\@textmin +%<*trace> + \else + \fl@trace{fpstype: \the \@fpstype}% + \fl@trace{Fail---no room dbltoproom-ORD?:}% + \fl@trace{\@spaces \@dbltoproom = \the \@dbltoproom. + Ht float: \the \ht \@currbox}% +%</trace> + \fi + \fi + \if@tempswa + \@bitor \@currtype \@deferlist +%<*trace> + \fl@trace{(dbl)deferlist: \@deferlist: (before)}% +%</trace> +% \end{macrocode} +% +% not in fixfloats? +% \begin{macrocode} + \@testwrongwidth\@currbox +% \end{macrocode} +% +% \begin{macrocode} + \if@test +%<*trace> + \fl@trace{type already on list: (dbl)defer}% +%</trace> + \else + \@tempdima -\ht\@currbox + \advance\@tempdima + -\ifx \@dbltoplist\@empty \dbltextfloatsep \else + \dblfloatsep \fi + \global \advance \@dbltoproom \@tempdima + \global \advance \@colht \@tempdima + \global \advance \@dbltopnum \m@ne + \@cons \@dbltoplist \@currbox +%<*trace> + \fl@trace{dbltopnum (after) = \the \@dbltopnum}% + \fl@trace{***Success: dbltop}% +%</trace> + \@inserttrue + \fi + \fi +%<*trace> + \else + \fl@trace{Fail: dbltopnum = \the \@dbltopnum: fpstype + \the \@fpstype=ORD?}% + \ifnum \@fpstype<\sixt@@n + \fl@trace{ERROR: !t float not successful (addtodblcol)}% + \fi +%</trace> + \fi + \fi + \if@insert + \else +%<*trace> + \fl@trace{put on deferlist}% +%</trace> + \@cons\@deferlist\@currbox +%<*trace> + \fl@trace{(dbl)deferlist: \@deferlist: (after)}% +%</trace> + \fi +%<*trace> + \fl@trace{End of addtodblcol -- locally count:}% + \fl@trace{ dbltop: \the \@dbltopnum.}% +%</trace> + \endgroup +%<*trace> + \fl@trace{End of addtodblcol -- globally count:}% + \fl@trace{dbltop: \the \@dbltopnum.}% +%</trace> +}% +%</2ekernel|latexrelease|fltrace> +%<latexrelease|fltrace>\EndIncludeInRelease +%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}% +%<latexrelease|fltrace> {\@addtodblcol}{float order in 2-column}% +%<latexrelease|fltrace>\def\@addtodblcol{% +%<latexrelease|fltrace> \begingroup +%<*trace> +%<latexrelease|fltrace> \fl@trace{***Start addtodblcol}% +%</trace> +%<latexrelease|fltrace> \@insertfalse +%<latexrelease|fltrace> \@setfloattypecounts +%<latexrelease|fltrace> \@getfpsbit \tw@ +%<*trace> +%<latexrelease|fltrace> \fl@trace{fpstype \ifodd \@tempcnta OK +%<latexrelease|fltrace> \else not \fi dbltop: \the \@fpstype}% +%</trace> +%<latexrelease|fltrace> \ifodd\@tempcnta +%<latexrelease|fltrace> \@flsetnum \@dbltopnum +%<latexrelease|fltrace> \ifnum \@dbltopnum>\z@ +%<latexrelease|fltrace> \@tempswafalse +%<latexrelease|fltrace> \ifdim \@dbltoproom>\ht\@currbox +%<latexrelease|fltrace> \@tempswatrue +%<*trace> +%<latexrelease|fltrace> \fl@trace{Space OK: \@dbltoproom = +%<latexrelease|fltrace> \the \@dbltoproom > \the \ht \@currbox +%<latexrelease|fltrace> (dbltoproom)}% +%</trace> +%<latexrelease|fltrace> \else +%<*trace> +%<latexrelease|fltrace> \fl@trace{fpstype: \the \@fpstype (addtodblcol)}% +%</trace> +%<latexrelease|fltrace> \ifnum \@fpstype<\sixt@@n +%<*trace> +%<latexrelease|fltrace> \fl@trace{BANG float ignoring \@dbltoproom}% +%<latexrelease|fltrace> \fl@trace{\@spaces \@dbltoproom = +%<latexrelease|fltrace> \the \@dbltoproom. +%<latexrelease|fltrace> Ht float: \the \ht \@currbox-BANG}% +%</trace> +% \end{macrocode} +% Need to check that there is room on the page, using the local value +% of |\@textmin| to make the necessary adjustment to |\@dbltoproom|. +% \begin{macrocode} +%<latexrelease|fltrace> \advance \@dbltoproom \@textmin +%<*trace> +%<latexrelease|fltrace> \fl@trace{Local value of texmin: \the\@textmin}% +%<latexrelease|fltrace> \fl@trace{\@spaces space on page = +%<latexrelease|fltrace> \the \@dbltoproom. +%<latexrelease|fltrace> Ht float: \the \ht \@currbox-BANG}% +%</trace> +%<latexrelease|fltrace> \ifdim \@dbltoproom>\ht\@currbox +%<latexrelease|fltrace> \@tempswatrue +%<*trace> +%<latexrelease|fltrace> \fl@trace{Space OK BANG: space on page = +%<latexrelease|fltrace> \the\@dbltoproom > \the\ht\@currbox}% +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \fl@trace{fpstype: \the \@fpstype}% +%<latexrelease|fltrace> \fl@trace{Fail---no room dbltoproom-BANG?:}% +%<latexrelease|fltrace> \fl@trace{\@spaces space on page = +%<latexrelease|fltrace> \the \@dbltoproom. +%<latexrelease|fltrace> Ht float: \the \ht \@currbox}% +%</trace> +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \advance \@dbltoproom -\@textmin +%<*trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \fl@trace{fpstype: \the \@fpstype}% +%<latexrelease|fltrace> \fl@trace{Fail---no room dbltoproom-ORD?:}% +%<latexrelease|fltrace> \fl@trace{\@spaces \@dbltoproom = +%<latexrelease|fltrace> \the \@dbltoproom. +%<latexrelease|fltrace> Ht float: \the \ht \@currbox}% +%</trace> +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \if@tempswa +%<latexrelease|fltrace> \@bitor \@currtype \@dbldeferlist +%<*trace> +%<latexrelease|fltrace> \fl@trace{dbldeferlist: +%<latexrelease|fltrace> \@dbldeferlist: (before)}% +%</trace> +%<latexrelease|fltrace> \if@test +%<*trace> +%<latexrelease|fltrace> \fl@trace{type already on list: dbldefer}% +%</trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \@tempdima -\ht\@currbox +%<latexrelease|fltrace> \advance\@tempdima +%<latexrelease|fltrace> -\ifx \@dbltoplist\@empty +%<latexrelease|fltrace> \dbltextfloatsep +%<latexrelease|fltrace> \else \dblfloatsep \fi +%<latexrelease|fltrace> \global \advance \@dbltoproom \@tempdima +%<latexrelease|fltrace> \global \advance \@colht \@tempdima +%<latexrelease|fltrace> \global \advance \@dbltopnum \m@ne +%<latexrelease|fltrace> \@cons \@dbltoplist \@currbox +%<*trace> +%<latexrelease|fltrace> \fl@trace{dbltopnum (after) = +%<latexrelease|fltrace> \the \@dbltopnum}% +%<latexrelease|fltrace> \fl@trace{***Success: dbltop}% +%</trace> +%<latexrelease|fltrace> \@inserttrue +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \fi +%<*trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \fl@trace{Fail: dbltopnum = \the \@dbltopnum: +%<latexrelease|fltrace> fpstype \the \@fpstype=ORD?}% +%<latexrelease|fltrace> \ifnum \@fpstype<\sixt@@n +%<latexrelease|fltrace> \fl@trace{ERROR: !t float not successful +%<latexrelease|fltrace> (addtodblcol)}% +%<latexrelease|fltrace> \fi +%</trace> +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace> \if@insert +%<latexrelease|fltrace> \else +%<*trace> +%<latexrelease|fltrace> \fl@trace{put on dbldeferlist}% +%</trace> +%<latexrelease|fltrace> \@cons\@dbldeferlist\@currbox +%<*trace> +%<latexrelease|fltrace> \fl@trace{dbldeferlist: \@dbldeferlist: (after)}% +%</trace> +%<latexrelease|fltrace> \fi +%<*trace> +%<latexrelease|fltrace> \fl@trace{End of addtodblcol -- locally count:}% +%<latexrelease|fltrace> \fl@trace{ dbltop: \the \@dbltopnum.}% +%</trace> +%<latexrelease|fltrace> \endgroup +%<*trace> +%<latexrelease|fltrace> \fl@trace{End of addtodblcol -- globally count:}% +%<latexrelease|fltrace> \fl@trace{dbltop: \the \@dbltopnum.}% +%</trace> +%<latexrelease|fltrace>}% +%<latexrelease|fltrace>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@addmarginpar} +% \begin{macrocode} +%<*2ekernel> +\def\@addmarginpar{\@next\@marbox\@currlist{\@cons\@freelist\@marbox + \@cons\@freelist\@currbox}\@latexbug\@tempcnta\@ne + \if@twocolumn + \if@firstcolumn \@tempcnta\m@ne \fi + \else + \if@mparswitch + \ifodd\c@page \else\@tempcnta\m@ne \fi + \fi + \if@reversemargin \@tempcnta -\@tempcnta \fi + \fi + \ifnum\@tempcnta <\z@ \global\setbox\@marbox\box\@currbox \fi + \@tempdima\@mparbottom + \advance\@tempdima -\@pageht + \advance\@tempdima\ht\@marbox + \ifdim\@tempdima >\z@ + \@latex@warning@no@line {Marginpar on page \thepage\space moved}% + \else + \@tempdima\z@ + \fi + \global\@mparbottom\@pageht + \global\advance\@mparbottom\@tempdima + \global\advance\@mparbottom\dp\@marbox + \global\advance\@mparbottom\marginparpush + \advance\@tempdima -\ht\@marbox +% \end{macrocode} +% Putting box movement inside the `marbox': +% \begin{macrocode} + \global\setbox \@marbox + \vbox {\vskip \@tempdima + \box \@marbox}% + \global \ht\@marbox \z@ + \global \dp\@marbox \z@ +% \end{macrocode} +% Sticking (rather than gluing:-) the `marbox' to the line above, +% changed vskip to kern: +% \begin{macrocode} + \kern -\@pagedp + \nointerlineskip + \hb@xt@\columnwidth + {\ifnum \@tempcnta >\z@ + \hskip\columnwidth \hskip\marginparsep + \else + \hskip -\marginparsep \hskip -\marginparwidth + \fi + \box\@marbox \hss}% +% \end{macrocode} +% For this reason the following code can vanish: +%\begin{verbatim} +% \nobreak %% No longer needed. CAR92/12 +% \vskip -\@tempdima %% No longer needed. CAR92/12 +%\end{verbatim} +% \begin{macrocode} + \nointerlineskip + \hbox{\vrule \@height\z@ \@width\z@ \@depth\@pagedp}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Kludgeins} +% +% This part of the file is part of the implementation of the following +% two new commands for \LaTeX2e{}. +% +% +% \begin{verbatim} +% \enlargethispage{<dim>} +% \end{verbatim} +% +% Adds |<dim>| to the height of the current column only. On the printed +% page the bottom of this column is extended downwards by exactly +% |<dim>| without having any effect on the placement of the footer; this +% may result in an overprinting. +% +% \begin{verbatim} +% \enlargethispage*{<dim>} +% \end{verbatim} +% +% Similar to |\enlargethispage| but it tries to squeeze the column to +% be printed in as small a space as possible, ie it uses any +% shrinkability in the column. If the column was not explicitly broken +% (\eg with |\pagebreak|) this may result in an overfull box message but +% execpt for this it will come out as expected (if you know what to +% expect). +% +% The star form of this command is dedicated to Leslie Lamport, the +% other we need for ourselves (FMi, CAR). +% +% These commands may well have unwanted effects if used soon +% before a |\clearpage|: please give keep them clear of such places. +% +% \begin{macro}{\@kludgeins} +% \changes{v0.1c}{1993/11/23}{Insert added} +% The insert which makes \TeX{} do a lot of the necessary work. +% All we need to put into it is the amount by which the pagegoal +% should be changed. +% \begin{macrocode} +\newinsert \@kludgeins +\global\dimen\@kludgeins \maxdimen +\global\count\@kludgeins 1000 +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\enlargethispage} +% \begin{macro}{\enlargethispage*} +% \changes{v0.1c}{1993/11/23}{Commands added} +% The user command. +% \begin{macrocode} +\gdef \enlargethispage {% + \@ifstar + {% +%<*trace> + \fl@trace{Enlarging page height * }% +%</trace> + \@enlargepage{\hbox{\kern\p@}}}% + {% +%<*trace> + \fl@trace{Enlarging page height exactly---}% +%</trace> + \@enlargepage\@empty}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@enlargepage} +% \changes{v0.1c}{1993/11/23}{Command added} +% This actually inserts the insert, after checking for extreme +% values of the change. +% \begin{macrocode} +\gdef\@enlargepage#1#2{% +%<*trace> + \fl@trace{\@spaces\@spaces by #2}% +%</trace> + \@tempskipa#2\relax + \ifdim \@tempskipa>.5\maxdimen + \@latexerr{Suggested\space extra\space height\space + (\the\@tempskipa)\space dangerously\space + large}\@eha + \else + \ifdim \vsize<.5\maxdimen +%<*trace> + \fl@trace {Kludgeins added--pagegoal before: \the\pagegoal}% +%</trace> + \@bsphack + \insert\@kludgeins{#1\vskip-\@tempskipa}% + \@esphack +% \end{macrocode} +% This next bit is for tracing only: +% \begin{macrocode} +%<*trace> + \ifvmode \par + \fl@trace {Kludgeins added--pagegoal after: \the \pagegoal}% + \fi +%</trace> + \else + \@latexerr{Page\space height\space already\space + too\space large}\@eha + \fi + \fi +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Float control} +% +% This part implements controllable floats and other changes +% to the float mechanism. +% +% It provides, at the document level, the following command for +% inclusion in \LaTeX2e{}. +% +% \begin{verbatim} +% \suppressfloats +% \end{verbatim} +% +% This suppresses all further floats on the current page. +% +% With an optional argument it suppresses only floats only in certain +% positions on the current page. +% \begin{quote} +% |[t]|\quad suppresses only floats at the top of the page +% |[b]|\quad suppresses only floats at the bottom of the page +% \end{quote} +% +% It also enables the use of an extra specifier, {\tt !}, in the +% location optional argument of a float. If this is present then, +% just for this particular float, whenever it is processed by the float +% mechanism the followinhg are ignored: +% +% \begin{itemize} +% \item all restrictions on the number of floats which can appear; +% \item all explicit restrictions on the amount of space which should +% (not) be occupied by floats and/or text. +% \end{itemize} +% +% The mechanism will still attempt to ensure that pages are not +% overfull. +% +% These specifiers override, for the single float, the suppression +% commands described above. +% +% +% In its current form, it also supplies a reasonably exhaustive, and +% somewhat baroque, means of tracing some aspects of the float +% mechanism. +% +% More tracing. +% \begin{macro}{\fl@trace} +% \begin{macro}{\tracefloatsoff} +% \begin{macro}{\tracefloats} +% \begin{macro}{\fl@traceval} +% \begin{macro}{\tracefloatvals} +% \begin{macro}{\fl@tracemessage} +% \changes{v1.0c}{1993/11/30}{Commands added} +% \changes{v1.0h}{1993/12/12}{Commands changed} +% \changes{v1.0j}{1993/12/17}{tracefloatvals made a document command} +% Set-up tracing for floats independent of other tracing as it +% produces mega-output. Default is no tracing. +% \changes{v1.1j}{1995/04/24} +% {Do not add to kernel unless `trace' specified} +% \changes{v1.2n}{2014/04/24} +% {Renamed internal trace commands; provide as package} +% +% \begin{macrocode} +%<*fltrace> +\def \fl@tracemessage #1{{\let\@elt\@empty\typeout{LaTeX2e: #1}}} +\def \tracefloats{\let \fl@trace \fl@tracemessage} +\def \tracefloatsoff {\let \fl@trace \@gobble} +\tracefloatsoff +\def \fl@traceval #1{\fl@trace{\string #1 = \the #1}} +\IncludeInRelease{2015/01/01}{\tracefloatvals}% + {trace float vals}% +\def \tracefloatvals{% +% \end{macrocode} +% As |\@dblfloatplacement| sets |\f@depth| it needs to be run +% inside a group, otherwise the float placement will test for the +% wrong value.\footnote{This is a somewhat questionable design.} +% \begin{macrocode} + \begingroup + \@dblfloatplacement + \@floatplacement + \fl@trace{***Float placement parameters:}% + \fl@traceval\@colnum + \fl@traceval\@colroom + \fl@traceval\@topnum + \fl@traceval\@toproom + \fl@traceval\@botnum + \fl@traceval\@botroom + \fl@traceval\@fpmin + \fl@trace{\string\textfraction = \textfraction}% + \fl@traceval\@dbltopnum + \fl@traceval\@dbltoproom + \fl@trace{\string\textfraction = \textfraction}% + \fl@trace{toplist: \@toplist}% + \fl@trace{botlist: \@botlist}% + \fl@trace{midlist: \@midlist}% + \fl@trace{deferlist: \@deferlist}% + \fl@trace{dbltoplist: \@dbltoplist}% +%FMi \fl@trace{dbldeferlist: \@dbldeferlist}% + \endgroup +} +\EndIncludeInRelease +\IncludeInRelease{0000/00/00}{\tracefloatvals}% + {trace float vals}% +\def \tracefloatvals{% + \begingroup + \@dblfloatplacement + \@floatplacement + \fl@trace{***Float placement parameters:}% + \fl@traceval\@colnum + \fl@traceval\@colroom + \fl@traceval\@topnum + \fl@traceval\@toproom + \fl@traceval\@botnum + \fl@traceval\@botroom + \fl@traceval\@fpmin + \fl@trace{\string\textfraction = \textfraction}% + \fl@traceval\@dbltopnum + \fl@traceval\@dbltoproom + \fl@trace{\string\textfraction = \textfraction}% + \fl@trace{toplist: \@toplist}% + \fl@trace{botlist: \@botlist}% + \fl@trace{midlist: \@midlist}% + \fl@trace{deferlist: \@deferlist}% + \fl@trace{dbltoplist: \@dbltoplist}% +% next line only in old releases + \fl@trace{dbldeferlist: \@dbldeferlist}% + \endgroup +} +\EndIncludeInRelease +% \end{macrocode} +% We need to make sure that \texttt{fltrace} comes before +% \texttt{flafter} to make the tracing work. +% \begin{macrocode} +\@ifpackageloaded{flafter} + {\PackageWarningNoLine + {fltrace}{Load 'fltrace' before 'flafter'\MessageBreak + Attempting to recover by reloading 'flafter'}% +% \end{macrocode} +% Hide the fact that \texttt{flafter} was already loaded and then +% request it anew. +% \changes{v1.2m}{2015/01/20}{Reset \cs{IncludeInRelease} flags} +% \begin{macrocode} + \expandafter\let\csname ver@flafter.sty\endcsname\relax + \def\reserved@a#1{% + \expandafter\let\csname\string#1+flafter+IIR\endcsname\relax}% + \reserved@a\@addtocurcol + \reserved@a\@addtonextcol + \RequirePackage{flafter}}{} +%</fltrace> +% \end{macrocode} +% As the code for \texttt{flafter} will contain tracing calls so +% that it works in conjunction with \texttt{fltrace} we need to +% provide a dummy definition for |\fl@trace| in that package. +% \begin{macrocode} +%<*flafter> +\providecommand\fl@trace[1]{} +%</flafter> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\suppressfloats} +% \begin{macro}{\@flstop} +% \changes{v1.0f}{1993/12/05}{Commands added} +% Float suppression commands: these set the relevant counter +% globally to zero. Thus they are overridden for a particular float +% by an ! specifier. +% +% \begin{macrocode} +%<*2ekernel> +\def \suppressfloats {% + \@ifnextchar [% + \@flstop + {\global \@colnum \z@}% +} +% \end{macrocode} +% Maybe this should be a loop over |#1|? +% \begin{macrocode} +\def \@flstop [#1]{% + \if t#1% + \global \@topnum \z@ + \fi + \if b#1% + \global \@botnum \z@ + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% Manipulation of float placement and type; both their strings and the +% corresponding count registers. +% +% \begin{macro}{\@fpstype} +% \begin{macro}{\@reqcolroom} +% \begin{macro}{\@textfloatsheight} +% \changes{v1.0f}{1993/12/05}{Commands added} +% First a new count register to go with |\@currtype|. +% +% Then a new skip register, for information needed to remove the +% |\@maxsep| conservatism: it is possible that this could use a +% temporary register. +% +% Finally a dimension register to hold the total height of in-text +% floats on the current page. This is needed to implement a +% major change in the functionality of |\@addtocurcol| which is, +% nevertheless, a bug fix. +% It is not local and therefore cannot be a temporary register. +% +% \begin{macrocode} +\newcount \@fpstype +\newdimen \@reqcolroom +\newdimen \@textfloatsheight +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@fpsadddefault} +% \changes{v1.0f}{1993/12/05}{Command added} +% Adds the default placement to what is already there. +% +% Should not need to change this, but could do it as follows: +% \begin{verbatim} +%\def \@fpsadddefault {% +% \@temptokena \expandafter\expandafter\expandafter +% {\csname fps@\@captype \endcsname}% +% \edef \reserved@a {\the\@temptokena}% +% \@onelevel@sanitize \reserved@a +% \edef \@fps {\@fps\reserved@a}% +%} +% \end{verbatim} +% +% \begin{macrocode} +%<*2ekernel|fltrace> +\def \@fpsadddefault {% +%<*trace> + \fl@trace{fps changed from: \@fps}% +%</trace> + \edef \@fps {\@fps\csname fps@\@captype \endcsname}% + \@latex@warning {% + No positions in optional float specifier.\MessageBreak + Default added (so using `\@fps')}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@setfloattypecounts} +% \changes{v1.0f}{1993/12/05}{Command added} +% Sets counters |\@fpstype| and |\@currtype|. +% +% BANG $==$ bit4 of $|\count\@currbox| = 0$. +% +% \begin{macrocode} +\def \@setfloattypecounts {% + \@currtype \count\@currbox + \@fpstype \count\@currbox + \divide\@currtype\@xxxii \multiply\@currtype\@xxxii + \advance \@fpstype -\@currtype +%<*trace> + \fl@trace{(mod 32) fpstype: \the \@fpstype}% + \fl@trace{(mult of 32) currtype: \the \@currtype}% +% Tracing only: but some should be changed into real errors/warnings? + \ifnum \@fpstype<\sixt@@n + \ifnum \@fpstype=\z@ + \fl@trace{ERROR: no PLACEMENT, fpstype = \the \@fpstype = 0?}% + \fi + \ifnum \@fpstype=\@ne + \fl@trace{WARNING: only h, fpstype = \the \@fpstype = 1?}% + \fi + \fl@trace{BANG float}% + \else + \ifnum \@fpstype=\sixt@@n + \fl@trace{ERROR: no PLACEMENT, fpstype = \the \@fpstype = 16?}% + \fi + \ifnum \@fpstype=17 + \fl@trace{WARNING: only h, fpstype = \the \@fpstype = 17?}% + \fi + \fl@trace{ORD float}% + \fi +%</trace> +} +%</2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% +% Macros for getting, testing and setting bits of the fps. +% +% +% \begin{macro}{\@getfpsbit} +% \changes{v1.0f}{1993/12/05}{Command added} +% Sets |\@tempcnta| to required bit of |\count\@currbox|. +% +% \begin{macrocode} +%<*2ekernel> +\def \@getfpsbit {% + \@boxfpsbit \@currbox +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@boxfpsbit} +% \changes{v1.0f}{1993/12/05}{Command added} +% Used above. +% \begin{macrocode} +\def \@boxfpsbit #1#2{% + \@tempcnta \count#1% + \divide \@tempcnta #2\relax +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@testfp} +% \changes{v1.0f}{1993/12/05}{Command added} +% New definition of the float page test. +% +% \changes{v1.1v}{1996/07/26}{remove \cs{global} before \cs{@test...}} +% \begin{macrocode} +\def \@testfp #1{% + \@boxfpsbit #18\relax % Really `#1 8' for human readers! + \ifodd \@tempcnta + \else + \@testtrue + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@setfpsbit} +% \changes{v1.0f}{1993/12/05}{Command added} +% Sets required bit of |\@tempcnta| (to 1). +% +% \begin{macrocode} +\def \@setfpsbit #1{% + \@tempcntb \@tempcnta + \divide \@tempcntb #1\relax + \ifodd \@tempcntb + \else + \advance \@tempcnta #1\relax + \fi +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@resethfps} +% \changes{v1.0f}{1993/12/05}{Command added} +% \changes{v1.0h}{1993/12/12}{Warnings added: minimal} +% \changes{v1.0m}{1994/04/24}{Warning changed} +% \changes{v1.0m}{1994/04/24}{Number 2 changed to \cs{tw@}} +% \changes{v1.0o}{1994/05/02}{Code shortened} +% Globally adds t as a possible location for an h or !h only placement: +% this must be done using the count. +% +% Although it will leave |\@fpstype| set to 17 even if it was +% originally 1, this does not matter since it is the last thing in +% |\@addtocurcol|. +% \begin{macrocode} +%<*2ekernel|fltrace> +\def \@resethfps {% + \let\reserved@a\@empty + \ifnum \@fpstype=\@ne + \def \reserved@a {!}% + \@fpstype 17 + \fi + \ifnum \@fpstype=17 + \global \advance \count\@currbox \tw@ + \@latex@warning@no@line {% + `\reserved@a h' float specifier changed to `\reserved@a ht'}% +%<*trace> + \fl@trace{% + `t' added to `\reserved@a h'- new Count: \the \count\@currbox}% +%</trace> + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% Special stuff for BANG floats. +% +% \begin{macro}{\@flsetnum} +% \changes{v1.0f}{1993/12/05}{Command added} +% +% Ignores any zero float counter value in case BANG. +% +% It uses a local assignment to the normally global counter: a bit +% naughty, perhaps? +% +% These assignments are safe so long as the counter involved is only +% consulted once (\ie only for the `bang float') with the changed value. +% This is the case within |\@addtocurcol| because it is used only +% once within a call of the output routine (which forms a group). +% +% For |\@addtonextcol| this is achieved by putting a group around its +% code; this is needed because it is called (by |\@startcolumn|) for +% each float which was on the deferlist. Almost identical +% considerations pertain to |\@addtodblcol|. There may be more +% efficient ways to handle this, but the group seems to be the simplest. +% +% \changes{v1.0n}{1994/04/30}{Rogue space removed} +% \begin{macrocode} +\def \@flsetnum #1{% +%<*trace> + \fl@trace{fpstype: \the \@fpstype (flsetnum \string#1)}% +%</trace> + \ifnum \@fpstype<\sixt@@n + \ifnum #1=\z@ +%<*trace> + \fl@trace{BANG float resetting \string#1 to 1}% +%</trace> + #1\@ne + \fi + \fi +%<*trace> + \fl@trace{#1 (before) = \the #1}% +%</trace> +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@flsettextmin} +% \changes{v1.0f}{1993/12/05}{Command added} +% This ignores |\textfraction| space restriction in case BANG. +% +% \begin{macrocode} +\def \@flsettextmin {% +%<*trace> + \fl@trace{fpstype: \the \@fpstype (flsettextmin)}% +%</trace> + \ifnum \@fpstype<\sixt@@n +%<*trace> + \fl@trace{BANG ignoring textmin}% +%</trace> + \@textmin \z@ + \else + \@textmin \textfraction\@colht +%<*trace> + \fl@trace{ORD textmin = \the \@textmin}% +%</trace> + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@flcheckspace} +% \changes{v1.0f}{1993/12/05}{Command added} +% This ignores space restriction in case BANG; this is still slightly +% conservative since it does not allow for the fact that, if there is +% no text in the column then |\textfloatsep| is not needed. +% Sets |@tempswa| true if there is room for |\@currbox|. +% +% \begin{macrocode} +\def \@flcheckspace #1#2{% + \advance \@reqcolroom + \ifx #2\@empty \textfloatsep \else \floatsep \fi +%<*trace> + \fl@trace{colroom = \the \@colroom + (flcheckspace \string#1 \string#2)}% + \fl@trace{reqcolroom = \the \@reqcolroom + (flcheckspace \string#1 \string#2)}% +%</trace> + \ifdim \@colroom>\@reqcolroom + \ifdim #1>\ht\@currbox + \@tempswatrue +%<*trace> + \fl@trace{Space OK: #1 = \the #1 > \the \ht \@currbox + (flcheckspace \string#1 \string#2)}% +%</trace> + \else +%<*trace> + \fl@trace{fpstype: \the \@fpstype + (flcheckspace \string#1 \string#2)}% +%</trace> + \ifnum \@fpstype<\sixt@@n +%<*trace> + \fl@trace{BANG float ignoring #1 + (flcheckspace \string#1 \string#2):}% + \fl@trace{\@spaces #1 = \the #1. Ht float: \the \ht \@currbox + BANG}% +%</trace> + \@tempswatrue +%<*trace> + \else + \fl@trace{Fail---no room (flcheckspace \string#1 \string#2) + (fpstype \the \@fpstype=ORD?):}% + \fl@trace{\@spaces #1 = \the #1. Ht float: \the \ht \@currbox + ORD?}% +%</trace> + \fi + \fi +%<*trace> + \else + \fl@trace{Fail---no room at 2nd test of colroom + (flcheckspace \string#1 \string#2)}% +%</trace> + \fi +} +%</2ekernel|fltrace> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@flupdates} +% \changes{v1.0f}{1993/12/05}{Command added} +% This updates everything when a float is placed. +% +% \begin{macrocode} +%<*2ekernel> +\def \@flupdates #1#2#3{% + \global \advance #1\m@ne + \global \advance \@colnum \m@ne + \@tempdima -\ht\@currbox + \advance \@tempdima + -\ifx #3\@empty \textfloatsep \else \floatsep \fi + \global \advance #2\@tempdima + \global \advance \@colroom \@tempdima + \@cons #3\@currbox +} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% Interesting facts about float mechanisms past and present, together +% with a summary of various features, some unresolved: +% +% \begin{enumerate} +% \item The value |\textfraction| does not affect the processing +% of doublecol floats: this seems sensible, but should be +% documented. +% \item |\twocolumn| floatplacement was wrong: dbl not needed, ord +% needed. +% \item |\@floatplacement| was not called after |\@startdblcol| +% or |\@topnewpage|. This has been changed; it is clearly a bug +% fix. +% \item The use |\@topnewpage| when |\dblfigrule| is non-trivial +% produced a rule in the wrong place. This has been fixed by not +% using |\dblfigrule| when processing the `float' from +% |\@topnewpage|. +% \item If the specifier was just h and the float could not be put +% here, it went on the deferlist and stayed there until a clearpage. +% It now gets changed to a `th': this is only an error-recovery +% action, putting just h or !h should be deprecated. +% \item |\@dblmaxsep| was `the maximum of |\dblfloatsep| and +% |\dbltexfloatsep|'. But it was never used! Now gone completely, +% like |\@maxsep|. +% \item After an h float is put on a page, it was counted as text when +% applying the |\textfraction| test; this is possibly too big a +% change although it is a bug fix? +% \item Two consecutive h floats are separated by twice |\intextsep|: +% this could be changed to one by use of |\addvspace|, OK? +% Note that it would also mean that less space is put in if an h +% float immediately follows other spaces. This is also possibly +% too big a change, at least for compatibility mode? +% Or it may be simply wrong! It has not been changed. +% \item Now |\@addtocurcol| checks first for just p fps. I think +% that this is an increase in efficiency, but maybe the coding +% should be made even more efficient. +% \item |\@tryfcolumn| now tests if the list is empty first, otherwise +% lots of wasted time! Thus this test has been removed from +% |\@startcolumn|. +% As Frank pointed out, this makes |\@startcolumn| less +% efficient. But it is now the same as |\@startdblcolumn|: I can +% see no reason why they should be different, but which is best? +% \item Why is |\@colroom| set in |\@doclearpage|? +% \item Footnotes. Check what |\clearpage| does when footnotes are +% left over. Footnotes are not put on float pages and, also, +% |\@addtonextcol| ignores the existence of held-over footnotes +% in deciding what floats can go on the page. Not changed. +% \item |\clearpage| can still lose non-boxes, at least when floats +% are involved. It also moves some to the `wrong page', but this +% may be a coding problem. +% \item The ! option makes it necessary to check in |\output| that +% there is enough room left on the page after adding a float. (This +% would have been necessary anyway if anyone set |\@textmin| too +% close to zero! A similar danger existed also if the text in a +% |\twocolumn[text]| entity gets too large.) +% The current implementation of this also makes the normal case a +% little less efficient, OK? +% Not enough room means, at present, less than |\baselineskip|, +% with a warning: is this OK? Should it be made generic (another +% parameter)? +% \item There are four possibilities for supporting this: +% +% |\twocolumn[\maketitle more text]| +% +% One is to change +% |\maketitle| slightly to allow this. Another is to change +% |\@topnewpage| so that more than one |\twocolumn[]| command is +% allowed; in this case |\maketitle\twocolumn[more text]| will work. +% The former is more robust from the user's viewpoint, but makes the +% code for |\maketitle| rather ad hoc (maybe it is already?). +% Another is to misuse the global twocolumn flag locally within +% |\@topnewpage|. +% Yet another is to move the column count register from the multicol +% package into the kernel. This has been done. +% \item Where should the reinserts be put to maximise the +% probability that footmotes come out on the correct page? +% Or should we go for as much compatibility as possible (but see +% next item)? +% \item Should we continue to support (as much as possible) +% |\samepage|? Some of its intended functionality is now advertised +% as being provided by |\enlargethispage|. Use of either is likely +% to result in wrongly placed footnotes, marginals, etc. +% Which should have priority: obeying the pagination instructions, +% or correct placement of notes/marginalia? +% \item Is the adjustment of space to cause shrinking in the +% kludge-* case correct? Should it be limited to 0pt? +% \item Is the setting of |\boxmaxdepth| in makecol and friends +% needed? It only has any effect if |\@textbottom| ends with a box +% or rule, in which case the vskip to allow for its depth should +% also be added. If it is kept, it should probably be the last +% thing in the box. It has now been removed. +% +% It would perhaps be better to document that |\@textbottom| +% and |\@texttop| must have natural height 0pt. +% \item I cannot see why the vskip adjustment for the depth +% is needed if boxmaxdepth is used to ensure that there is never +% a too deep box. +% \item The value of |\boxmaxdepth| should be explicitly set +% whenever necessary: it is too risky to assume that it has any +% particular value. Care is needed in deciding what to set it to. +% +% It is interesting to note that the value of |\boxmaxdepth| is +% unique in being read before the local settings for the box group +% are reset; all other parameter settings which affect the box +% construction use their values outside the box group. +% \item Should |\@maxdepth| store the setting of |\maxdepth| from +% lplain? Or should we provide a proper interface to class files +% for setting these? +% \end{enumerate} +% +% An analysis of various other macros. +% +% |\@opcol| should do |\@floatplacement|, but where? Right at the +% end, since it always occurs at the start of a column. +% \begin{verbatim} +% \def\@opcol{% +% % Why is this done first? +% \global \@mparbottom \z@ +% \if@twocolumn +% \@outputdblcol +% \else +% \@outputpage +% % This is not needed since it is done at the end of +% % |\@outputpage|: +% \global \@colht \textheight +% \fi} +% \end{verbatim} +% +% Only tracing has been added to these. +% +% \begin{macrocode} +%<latexrelease|fltrace>\IncludeInRelease{2017/01/01}% +%<latexrelease|fltrace> {\@makefcolumn}{negative height floats}% +%<*2ekernel|fltrace|latexrelease> +\def\@makefcolumn #1{% + \begingroup +% \end{macrocode} +% \changes{v1.3b}{2017/01/01}{make fpmin negative so ignored even if float height is negative} +% \begin{macrocode} + \@fpmin -\maxdimen +% \end{macrocode} +% +% \begin{macrocode} + \let \@testfp \@gobble + \@tryfcolumn #1% + \endgroup +%<*trace> + \if@fcolmade + \fl@trace{PAGE: in \string\clearpage + \if@twocolumn ---twocolumn\fi---}% + \fl@trace{----- float column/page completed from \string#1}% + \fi +%</trace> +} +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease|fltrace>\EndIncludeInRelease +%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}% +%<latexrelease|fltrace> {\@makefcolumn}{negative height floats}% +%<latexrelease|fltrace>\def\@makefcolumn #1{% +%<latexrelease|fltrace> \begingroup +%<latexrelease|fltrace> \@fpmin \z@ +%<latexrelease|fltrace> \let \@testfp \@gobble +%<latexrelease|fltrace> \@tryfcolumn #1% +%<latexrelease|fltrace> \endgroup +%<*trace> +%<latexrelease|fltrace> \if@fcolmade +%<latexrelease|fltrace> \fl@trace{PAGE: in \string\clearpage +%<latexrelease|fltrace> \if@twocolumn ---twocolumn\fi---}% +%<latexrelease|fltrace> \fl@trace{----- float column/page completed +%<latexrelease|fltrace> from \string#1}% +%<latexrelease|fltrace> \fi +%</trace> +%<latexrelease|fltrace>} +%<latexrelease|fltrace>\EndIncludeInRelease +%</2ekernel|fltrace|latexrelease> +% \end{macrocode} +% This will line up the last baselines in the two +% columns provided they are constructed in the normal way: \ie ending +% in a skip of minus the original depth, with |\@textbottom| adding +% nothing. +% +% Thus again it is essential for |\@textbottom| to have depth 0pt. +% \changes{1.2g}{2000/07/12}{Ensure that rule is in \cs{normalcolor}} +% \changes{v1.2m}{2014/12/30}{Command updated (latexrelease)} +% \begin{macrocode} +%<latexrelease|fltrace>\IncludeInRelease{2015/01/01}% +%<latexrelease|fltrace> {\@outputdblcol}{2 column marks}% +%<*2ekernel|fltrace|latexrelease> +% \end{macrocode} +% +% +% This is just a change to the single command |\@outputdblcol| +% so that it saves mark information for the first column and restores +% it in the second column. +% \begin{macrocode} +\def\@outputdblcol{% + \if@firstcolumn + \global\@firstcolumnfalse +% \end{macrocode} +% Save the left column +% \begin{macrocode} + \global\setbox\@leftcolumn\copy\@outputbox +%<fltrace> \fl@trace{PAGE: first column boxed}% +% \end{macrocode} +% +% Remember the marks from the first column +% \begin{macrocode} + \splitmaxdepth\maxdimen + \vbadness\maxdimen +% \end{macrocode} +% In case of |\enlargethispage| we will have infinite negative glue +% at the bottom of the page (coming from |\vss|) and that will earn +% us an error message if we |\vsplit| to get at the marks. So we +% need to remove the last glue (if any) at the end of |\@outputbox| +% as we are only interested in marks that change doesn't matter. +% \changes{v1.1o}{2014/04/18}{Handle infinite glue from +% \cs{enlargethispage} (pr/4023)} +% \begin{macrocode} + \setbox\@outputbox\vbox{\unvbox\@outputbox\unskip}% + \setbox\@outputbox\vsplit\@outputbox to\maxdimen +% \end{macrocode} +% +% One minor difference from the current |fixmarks| package, pass the +% marks through a token register to stop any |#| tokens causing an +% error in a |\def|. +% \begin{macrocode} + \toks@\expandafter{\topmark}% + \xdef\@firstcoltopmark{\the\toks@}% + \toks@\expandafter{\splitfirstmark}% + \xdef\@firstcolfirstmark{\the\toks@}% +% \end{macrocode} +% +% This test does not work if truly empty marks have been inserted, but +% \LaTeX\ marks should always have (at least) two brace groups. +% (Except before the first mark is used, when the marks are empty, +% but that is OK here.) +% \begin{macrocode} + \ifx\@firstcolfirstmark\@empty + \global\let\@setmarks\relax + \else + \gdef\@setmarks{% + \let\firstmark\@firstcolfirstmark + \let\topmark\@firstcoltopmark}% + \fi +% \end{macrocode} +% +% End of change +% \begin{macrocode} + \else + \global\@firstcolumntrue + \setbox\@outputbox\vbox{% + \hb@xt@\textwidth{% + \hb@xt@\columnwidth{\box\@leftcolumn \hss}% + \hfil +% \end{macrocode} +% \changes{v1.1m}{2006/09/13}{Ensure that rule is in \cs{normalcolor}} +% The color of the \cs{vrule} should be \cs{normalcolor} as to not +% inherit the color from the column. +% \begin{macrocode} + {\normalcolor\vrule \@width\columnseprule}% + \hfil + \hb@xt@\columnwidth{\box\@outputbox \hss}}}% +%<fltrace> \fl@trace{PAGE: second column also boxed}% + \@combinedblfloats +% \end{macrocode} +% Override current first and top with those of first column if necessary +% \begin{macrocode} + \@setmarks +% \end{macrocode} +% End of change +% \begin{macrocode} + \@outputpage +%<fltrace> \fl@trace{PAGE: two column page completed}% + \begingroup + \@dblfloatplacement + \@startdblcolumn + \@whilesw\if@fcolmade \fi{\@outputpage +%<fltrace> \fl@trace{PAGE: double float page completed}% + \@startdblcolumn}% + \endgroup + \fi}% +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease|fltrace>\EndIncludeInRelease +%<latexrelease|fltrace>\IncludeInRelease{0000/00/00}% +%<latexrelease|fltrace> {\@outputdblcol}{2 column marks}% +%<latexrelease|fltrace>\def\@outputdblcol{% +%<latexrelease|fltrace> \if@firstcolumn +%<latexrelease|fltrace> \global \@firstcolumnfalse +%<latexrelease|fltrace> \global \setbox\@leftcolumn \box\@outputbox +%<*trace> +%<latexrelease|fltrace> \fl@trace{PAGE: first column boxed}% +%</trace> +%<latexrelease|fltrace> \else +%<latexrelease|fltrace> \global \@firstcolumntrue +%<latexrelease|fltrace> \setbox\@outputbox \vbox {% +%<latexrelease|fltrace> \hb@xt@\textwidth {% +%<latexrelease|fltrace> \hb@xt@\columnwidth {% +%<latexrelease|fltrace> \box\@leftcolumn \hss}% +%<latexrelease|fltrace> \hfil +%<latexrelease|fltrace> {\normalcolor\vrule +%<latexrelease|fltrace> \@width\columnseprule}% +%<latexrelease|fltrace> \hfil +%<latexrelease|fltrace> \hb@xt@\columnwidth {% +%<latexrelease|fltrace> \box\@outputbox \hss}% +%<latexrelease|fltrace> }% +%<latexrelease|fltrace> }% +%<*trace> +%<latexrelease|fltrace> \fl@trace{PAGE: second column also boxed}% +%</trace> +%<latexrelease|fltrace> \@combinedblfloats +%<latexrelease|fltrace> \@outputpage +%<*trace> +%<latexrelease|fltrace> \fl@trace{PAGE: two column page completed}% +%</trace> +%<latexrelease|fltrace> \begingroup +%<latexrelease|fltrace> \@dblfloatplacement +%<latexrelease|fltrace> \@startdblcolumn +% \end{macrocode} +% This loop could be replaced by an |\expandafter| tail +% recursion in\\ |\@startdblcolumn|. +% \begin{macrocode} +%<latexrelease|fltrace> \@whilesw\if@fcolmade \fi +%<latexrelease|fltrace> {\@outputpage +%<*trace> +%<latexrelease|fltrace> \fl@trace{PAGE: double float page completed}% +%</trace> +%<latexrelease|fltrace> \@startdblcolumn}% +%<latexrelease|fltrace> \endgroup +%<latexrelease|fltrace> \fi +%<latexrelease|fltrace>}% +%<latexrelease|fltrace>\EndIncludeInRelease +%</2ekernel|fltrace|latexrelease> +% \end{macrocode} +% +% \subsubsection{Float placement parameters} +% \changes{v1.0i}{1993/12/14}{Section added to declare all parameters} +% +% The main purpose of this section is to ensure that all the +% float-placement parameters which need to be set in a class file or +% package have been declared. It also describes their use and sets +% values for them which are reasonable for typical documents using +% US letter or A4 sized paper. +% +% \paragraph{Limits for the placement of floating objects} +% +% \begin{macro}{\c@topnumber} +% This counter holds the maximum number of +% floats that can appear at the top of a text page or column. +% \begin{macrocode} +%<*2ekernel> +\newcount\c@topnumber +\setcounter{topnumber}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\topfraction} +% This macro holds the maximum proportion (as a decimal number) of +% a text page or column that can be occupied by floats at the top. +% \begin{macrocode} +\newcommand\topfraction{.7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@bottomnumber} +% This counter holds the maximum number of +% floats that can appear at the bottom of a text page or column. +% \begin{macrocode} +\newcount\c@bottomnumber +\setcounter{bottomnumber}{1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bottomfraction} +% This macro holds the maximum proportion (as a decimal number) of +% a text page or column that can be occupied by floats at the bottom. +% \begin{macrocode} +\newcommand\bottomfraction{.3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@totalnumber} +% This counter holds the maximum number of floats that can appear on +% any text page or column. +% \begin{macrocode} +\newcount\c@totalnumber +\setcounter{totalnumber}{3} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textfraction} +% This macro holds the minimum proportion (as a decimal number) of +% a text page or column that must be occupied by text. +% \begin{macrocode} +\newcommand\textfraction{.2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\floatpagefraction} +% This macro holds the minimum proportion (as a decimal number) of +% a page or column that must be occupied by floating objects before a +% `float page' is produced. +% \begin{macrocode} +\newcommand\floatpagefraction{.5} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@dbltopnumber} +% This counter holds the maximum number of double-column floats that +% can appear on the top of a two-column text page. +% \begin{macrocode} +\newcount\c@dbltopnumber +\setcounter{dbltopnumber}{2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dbltopfraction} +% This macro holds the maximum proportion (as a decimal number) of +% a two-column text page that can be occupied by double-column floats +% at the top. +% \begin{macrocode} +\newcommand\dbltopfraction{.7} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\dblfloatpagefraction} +% This macro holds the minimum proportion (as a decimal number) of +% a page that must be occupied by double-column floating objects +% before a `double-column float page' is produced. +% \begin{macrocode} +\newcommand\dblfloatpagefraction{.5} +% \end{macrocode} +% \end{macro} +% +% \paragraph{Floats on a text page} +% +% \begin{macro}{\floatsep} +% \begin{macro}{\textfloatsep} +% \begin{macro}{\intextsep} +% When a floating object is placed on a page with text, these +% parameters control the separation between the float and the other +% objects on the page. These parameters are used for both +% one-column mode and single-column floats in two-column mode. +% They are all rubber lengths. +% +% |\floatsep| is the space between adjacent floats that are placed +% at the top or bottom of the text page or column. +% +% |\textfloatsep| is the space between the main text and floats +% at the top or bottom of the page or column. +% +% |\intextsep| is the space between in-text floats and the text. +% \begin{macrocode} +\newskip\floatsep +\newskip\textfloatsep +\newskip\intextsep +\setlength\floatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\textfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +\setlength\intextsep {12\p@ \@plus 2\p@ \@minus 2\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\dblfloatsep} +% \begin{macro}{\dbltextfloatsep} +% When double-column floats (floating objects that span the whole +% |\textwidth|) are placed at the top of a text page in two-column +% mode, the separation between the float and the text is controlled +% by |\dblfloatsep| and |\dbltextfloatsep|. They are rubber lengths. +% +% |\dblfloatsep| is the space between adjacent double-column floats +% placed at the top of the text page. +% +% |\dbltextfloatsep| is the space between the main text and +% double-column floats at the top of the page. +% \begin{macrocode} +\newskip\dblfloatsep +\newskip\dbltextfloatsep +\setlength\dblfloatsep {12\p@ \@plus 2\p@ \@minus 2\p@} +\setlength\dbltextfloatsep{20\p@ \@plus 2\p@ \@minus 4\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \paragraph{Floats on their own page or column} +% +% \begin{macro}{\@fptop} +% \begin{macro}{\@fpsep} +% \begin{macro}{\@fpbot} +% When floating objects are placed on a separate page or column, +% called a `float page', the layout of the page is controlled by +% these parameters, which are rubber lengths. +% +% At the top of the page |\@fptop| is inserted; +% typically this supplies some stretchable whitespace. +% At the bottom of the page |\@fpbot| ais inserted. +% Between adjacent floats |\@fpsep| is inserted. +% +% These parameters are used for all floating objects on a +% `float page' in one-column mode, and for single-column +% floats in two-column mode. +% +% Note that at least one of the two parameters |\@fptop| and +% |\@fpbot| should contain a |plus ...fil| so as to fill the +% remaining empty space. +% \begin{macrocode} +\newskip\@fptop +\newskip\@fpsep +\newskip\@fpbot +\setlength\@fptop{0\p@ \@plus 1fil} +\setlength\@fpsep{8\p@ \@plus 2fil} +\setlength\@fpbot{0\p@ \@plus 1fil} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dblfptop} +% \begin{macro}{\@dblfpsep} +% \begin{macro}{\@dblfpbot} +% Double-column `float pages' in two-column mode use similar +% parameters. +% \begin{macrocode} +\newskip\@dblfptop +\newskip\@dblfpsep +\newskip\@dblfpbot +\setlength\@dblfptop{0\p@ \@plus 1fil} +\setlength\@dblfpsep{8\p@ \@plus 2fil} +\setlength\@dblfpbot{0\p@ \@plus 1fil} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\topfigrule} +% \begin{macro}{\botfigrule} +% \begin{macro}{\dblfigrule} +% The macros can be used to put in rules between floats and text; +% whatever they insert should be vertical mode material which takes +% up zero space. +% \task{CAR}{Add more rules (for Frank in addtocurcol)} +% \begin{macrocode} +\let\topfigrule=\relax +\let\botfigrule=\relax +\let\dblfigrule=\relax +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltpage.dtx b/Master/texmf-dist/source/latex-dev/base/ltpage.dtx new file mode 100644 index 00000000000..4d5601556db --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltpage.dtx @@ -0,0 +1,334 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltpage.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltpage.dtx} + [2000/06/02 v1.0k LaTeX Kernel (page style setup)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltpage.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Page styles and related commands} +% +% +% \changes{v1.0a}{1994/03/07}{Initial version, split from ltherest.dtx} +% \changes{v1.0b}{1994/04/19}{Improve documentation} +% \changes{v1.0i}{1996/04/18}{Improve documentation} +% +% +% \subsection{Page Style Commands} +% +% |\pagestyle|\marg{style} : sets the page style of the +% current and succeeding pages to \emph{style} +% +% |\thispagestyle|\marg{style} : sets the page style of the +% current page only to \emph{style}. +% +% To define a page style \emph{style}, you must define +% |\ps@|\emph{style} to set the page style parameters. +% +% \subsection{How a page style makes running heads and feet} +% +% The |\ps@|\ldots command defines the macros |\@oddhead|, |\@oddfoot|, +% |\@evenhead|, and |\@evenfoot| to define the running heads and feet. +% (See output routine.) To make headings determined by the sectioning +% commands, the page style defines the commands |\chaptermark|, +% |\sectionmark|, etc., where |\chaptermark|\marg{text} is called by +% |\chapter| to set a mark. The |\...mark| commands and the |\...head| +% macros are defined with the help of the following macros. +% +% (All the |\...mark| commands should be initialized to no-ops.) +% +% \subsection{marking conventions} +% +% \LaTeX\ extends \TeX's |\mark| facility by producing two kinds of marks +% a `left' and a `right' mark, using the following commands:\\ +% |\markboth|\marg{left}\marg{right} : Adds both marks.\\ +% |\markright|\marg{right} : Adds a 'right' mark.\\ +% |\leftmark| : +% Used in the output routine, gets the current `left' mark. +% Works like \TeX's |\botmark.|\\ +% |\rightmark| : +% Used in the output routine, gets the current `right' mark. +% Works like \TeX's |\firstmark|. +% The marking commands work reasonably well for right marks `numbered +% within' left marks---e.g., the left mark is changed by a |\chapter| +% command and the right mark is changed by a |\section| command. +% However, it does produce somewhat anomalous results if 2 |\markboth|'s +% occur on the same page. +% +% Commands like |\tableofcontents| that should set the marks in some +% page styles use a |\@mkboth| command, which is |\let| by the pagestyle +% command (|\ps@...|) to |\markboth| for setting the heading or to +% |\@gobbletwo| to do nothing. +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +% \end{macrocode} +% +% \begin{macro}{\pagestyle} +% User command to set the page style for this and following pages. +% \changes{LaTeX2e}{1994/01/24} +% {(DPC) Complain if pagestyle is undefined.} +% \changes{LaTeX2e}{1994/02/01} +% {(DPC) Modify to get nicer error message} +% \begin{macrocode} +\def\pagestyle#1{% + \@ifundefined{ps@#1}% + \undefinedpagestyle + {\@nameuse{ps@#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thispagestyle} +% User command to set the page style for this page only. +% \changes{LaTeX2e}{1994/02/01} +% {(DPC) Modify to get nicer error message} +% \begin{macrocode} +\def\thispagestyle#1{% + \@ifundefined{ps@#1}% + \undefinedpagestyle + {\global\@specialpagetrue\gdef\@specialstyle{#1}}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ps@empty} +% The empty page style: No head or foot line. +% \begin{macrocode} +\def\ps@empty{% + \let\@mkboth\@gobbletwo\let\@oddhead\@empty\let\@oddfoot\@empty + \let\@evenhead\@empty\let\@evenfoot\@empty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@plain} +% \changes{v1.0g}{1995/05/26}{removed \cs{rmfamily} (PR 1578)} +% The plain page style: No head, centred page number in foot. +% \begin{macrocode} +\def\ps@plain{\let\@mkboth\@gobbletwo + \let\@oddhead\@empty\def\@oddfoot{\reset@font\hfil\thepage + \hfil}\let\@evenhead\@empty\let\@evenfoot\@oddfoot} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@leftmark} +% \begin{macro}{\@rightmark} +% We implement |\@leftmark| and |\@rightmark| in terms of already +% defined commands to save token space. We can't get rid of them +% since they are sometimes used in applications. +% \begin{macrocode} +\let\@leftmark\@firstoftwo +\let\@rightmark\@secondoftwo +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\markboth} +% \begin{macro}{\markright} +% \changes{v1.0d}{1994/05/20}{Changed setting for \cs{protect}.} +% \changes{v1.0e}{1994/11/04}{Added \cs{@unexpandable@protect}. +% ASAJ.} +% +% User commands for setting \LaTeX\ marks. +% +% Test for |\@nobreak| added 15 Apr 86 in |\markboth| and |\markright| +% letting |\label| and |\index| to |\relax| added 22 Feb 86 so these +% commands can appear in sectioning command arguments +% RmS 91/06/21 Same for |\glossary| +% \changes{v1.0k}{2000/06/02}{Tidied 1.0j reimplementation, CAR} +% \changes{v1.0k}{2000/06/02}{Small adjustment to give slightly less +% expansion, CAR} +% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion +% error (pr/3203).} +% \begin{macrocode} +\def\markboth#1#2{% + \begingroup + \let\label\relax \let\index\relax \let\glossary\relax + \unrestored@protected@xdef\@themark {{#1}{#2}}% + \@temptokena \expandafter{\@themark}% + \mark{\the\@temptokena}% + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi} +\def\markright#1{% + \begingroup + \let\label\relax \let\index\relax \let\glossary\relax +% \end{macrocode} +% Protection is handled inside |\@markright|. +% \begin{macrocode} + \expandafter\@markright\@themark {#1}% + \@temptokena \expandafter{\@themark}% + \mark{\the\@temptokena}% + \endgroup + \if@nobreak\ifvmode\nobreak\fi\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@markright} +% \changes{v1.0j}{2000/05/26}{Reimplementation to fix expansion +% error (pr/3203).} +% \changes{v1.0k}{2000/06/02}{Small adjustment to give slightly less +% expansion, CAR} +% \begin{macro}{\leftmark} +% \changes{v1.0j}{2000/05/26}{Use \cs{@empty} instead of brace group +% (pr/3203).} +% \begin{macro}{\rightmark} +% \changes{LaTeX2e}{1993/12/17}{Stopgap solution to mark \cs{leftmark} +% and \cs{rightmark} work without initializing mark until +% the problem is solved.} +% \changes{v1.0j}{2000/05/26}{Use \cs{@empty} instead of brace group +% (pr/3203).} +% \task{???}{mark initialisation solved?} +% \begin{macrocode} +\def\@markright#1#2#3{\@temptokena {#1}% + \unrestored@protected@xdef\@themark{{\the\@temptokena}{#3}}} +\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty} +\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@themark} +% Initialise \LaTeX's marks without setting a \TeX\ mark \meta{whatsit}. +% \begin{macrocode} +\def\@themark{{}{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mark} +% Test versions of \LaTeXe\ initialised \TeX's |\mark| system +% at this point, but this was removed before the first release. +% \changes{LaTeX2e}{1993/12/16}{Init \cs{mark} at begin document} +% \changes{LaTeX2e}{1993/12/17}{Removed init \cs{mark} at begin +% document, since it doesn't work.} +%\begin{verbatim} +%\AtBeginDocument{\mark{{}{}}} +%\end{verbatim} +% \end{macro} +% +% +% \begin{macro}{\raggedbottom} +% |\raggedbottom| typesets pages with no vertical stretch, so they have +% their natural height instead of all being exactly the +% same height. (Uses a space of .0001fil to avoid +% interfering with the 1fil space of |\newpage|.) +% +% \begin{macrocode} +\def\raggedbottom{% + \def\@textbottom{\vskip \z@ \@plus.0001fil}\let\@texttop\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\flushbottom} +% |\flushbottom|: +% Inverse of |\raggedbottom| --- makes all pages the same height. +% \begin{macrocode} +\def\flushbottom{% + \let\@textbottom\relax \let\@texttop\relax} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\sloppy} +% |\sloppy| will never (well, hardly ever) produce overfull boxes, but +% may produce underfull ones. (14 June 85) +% \changes{LaTeX2e}{1993/12/18}{Added \cs{emergencystretch}} +% \changes{v1.0h}{1994/07/20}{Save a few tokens} +% \begin{macrocode} +\def\sloppy{% + \tolerance 9999% + \emergencystretch 3em% + \hfuzz .5\p@ + \vfuzz\hfuzz} +% \end{macrocode} +% \end{macro} +% +% \begin{environment}{sloppypar} +% A sloppypar environment is equivalent to |{\par \sloppy ... \par}|. +% \begin{macrocode} +\def\sloppypar{\par\sloppy} +\def\endsloppypar{\par} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\fussy} +% \changes{v1.0f}{1995/04/24}{reset \cs{emergencystretch} latex/1344} +% Resets \TeX's parameters to their normal finicky values. +% \begin{macrocode} +\def\fussy{% + \emergencystretch\z@ + \tolerance 200% + \hfuzz .1\p@ + \vfuzz\hfuzz} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\overfullrule} +% \LaTeX\ default is no overfull box rule. Changed by document +% class option. +% \begin{macrocode} +\overfullrule 0pt +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx b/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx new file mode 100644 index 00000000000..da1d574b158 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltpageno.dtx @@ -0,0 +1,101 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltpageno.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltpageno.dtx} + [1994/05/19 v1.1a LaTeX Kernel (Page Numbering)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltpageno.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0c}{1994/03/29} +% {Create file ltcntlen from parts of ltmiscen and ltherest.} +% \changes{v1.1a}{1994/05/19} +% {Extract file ltpageno from ltcntlen.} +% +% \section{Page Numbering} +% Page numbers are produced by a page counter, used just like any other +% counter. The only difference is that |\c@page| contains the number of +% the next page to be output (the one currently being produced), rather +% than one minus it. Thus, it is normally initialized to~1 rather +% than~0. |\c@page| is defined to be |\count0|, rather than a count +% assigned by |\newcount|. +% +% \DescribeMacro{\pagenumbering} +% The user sets the pagenumber style with the |\pagenumbering|\marg{foo} +% command, which sets the page counter to 1 and defines |\thepage| to be +% |\foo|. For example, |\pagenumbering{roman}| causes pages to be +% numbered i, ii, etc. +% +% +% \StopEventually{} +% +% \begin{macrocode} +%<*2ekernel> +\message{page nos.,} +% \end{macrocode} +% +% +% \begin{macrocode} +\countdef\c@page=0 \c@page=1 +\def\cl@page{} +\def\pagenumbering#1{% + \global\c@page \@ne \gdef\thepage{\csname @#1\endcsname + \c@page}} +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltpar.dtx b/Master/texmf-dist/source/latex-dev/base/ltpar.dtx new file mode 100644 index 00000000000..3b72b43a9cc --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltpar.dtx @@ -0,0 +1,181 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltpar.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltpar.dtx} + [1995/04/29 v1.1c LaTeX Kernel (paragraphs)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltpar.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Tobias Oetiker \thanks{Tobi did the documentation update}\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% +% \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.1b}{1995/04/29}{(TO) Comments clean-up.} +% +% \section{Paragraphs} +% +% This section of the kernel declares the commands used to set +% |\par| and |\everypar| when ever their function needs to be +% changed for a long time. +% +% \StopEventually{} +% +% \subsection{Implementation} +% +% +% There are two situations in which |\par| may be changed: +% +% \begin{itemize} +% \item Long-term changes, in which the new value is to remain in effect +% until the current environment is left. The environments that +% change |\par| in this way are the following: +% \begin{itemize} +% \item All list environments (itemize, quote, etc.) +% \item Environments that turn |\par| into a noop: +% tabbing, array and tabular. +% \end{itemize} +% \item Temporary changes, in which |\par| is restored to its previous +% value the next time it is executed. The following are all such uses. +% \begin{itemize} +% \item |\end| when preceded by |\@endparenv|, which is called by +% |\endtrivlist| +% \item The mechanism for avoiding page breaks and getting the +% spacing right after section heads. +% \end{itemize} +% \end{itemize} +% +% \DescribeMacro{\@setpar} +% To permit the proper interaction of these two situations, long-term +% changes are made by the |\@setpar{|\meta{VAL}|}| command. +% It's function is: +% \begin{quote} +% To set |\par|. It |\def|'s |\par| and |\@par| to \meta{VAL}. +% \end{quote} +% +% \DescribeMacro{\@restorepar} +% Short-term changes are made by the usual |\def\par| commands. +% The original values are restored after a short-term change +% by the |\@restorepar| commands. +% +% \DescribeMacro{\@@par} +% |\@@par| always is defined to be the original \TeX{} |\par|. +% +% \DescribeMacro{\everypar} +% |\everypar| is changed only for the short term. Whenever |\everypar| +% is set non-null, it should restore itself to null when executed. +% +% The following commands change |\everypar| in this way: +% \begin{itemize} +% \item |\item| +% \item |\end| when preceded by |\@endparenv|, which is called by +% |endtrivlist| +% \item |\minipage| +% \end{itemize} +% +% When dealing with |\par| and |\everypar| remember the following two +% warnings: +% \begin{enumerate} +% \item Commands that make short-term changes to |\par| and |\everypar| +% must take account of the possibility that the new commands and the +% ones that do the restoration may be executed inside a group. In +% particular, |\everypar| is executed inside a group whenever a new +% paragraph begins with a left brace. The |\everypar| command +% that restores its definition should be local to the current +% group (in case the command +% is inside a minipage used inside someplace where |\everypar| has +% been redefined). Thus, if |\everypar| is redefined to do an +% |\everypar{}| it could take several executions of |\everypar| +% before the restoration ``holds''. This usually causes no problem. +% However, to prevent the extra executions from doing harm, +% use a global switch to keep anything harmful in the new +% |\everypar| from being done twice. +% \item Commands that change |\everypar| should remember that +% |\everypar| might be supposed to set the following switches false: +% \begin{itemize} +% \item |@nobreak| +% \item |@minipage| +% \end{itemize} +% they should do the setting if necessary. +% \end{enumerate} +% \begin{macrocode} +%<*2ekernel> +\message{par,} +% \end{macrocode} +% +% +% \begin{macro}{\@setpar} +% \begin{macro}{\@par} +% Initiate a long-term change to |\par|. +% \begin{macrocode} +\def\@setpar#1{\def\par{#1}\def\@par{#1}} +% \end{macrocode} +% +% The default definition of |\@par| will ensure that if +% |\@restorepar| defines |\par| to execute |\@par| it will redefine +% itself to the primitive |\@@par| after one iteration. +% \begin{macrocode} +\def\@par{\let\par\@@par\par} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@restorepar} +% Restore from a short-term change to |\par|. +% \begin{macrocode} +\def\@restorepar{\def\par{\@par}} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +\endinput + diff --git a/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx b/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx new file mode 100644 index 00000000000..6b84231ab5b --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltpictur.dtx @@ -0,0 +1,1542 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltpictur.dtx +%<*driver> +% \fi + \ProvidesFile{ltpictur.dtx} + [2016/03/29 v1.1l LaTeX Kernel (Picture Mode)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltpictur.dtx} +\title{\filename} +\date{\filedate} +\author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0g}{1995/05/07}{Use \cs{hb@xt@}} +% \changes{v1.1a}{1995/05/19}{Support autoloading feature} +% \changes{v1.1b}{1995/06/13}{Use \cs{ProvidesFile} in autoload} +% \changes{v1.1d}{1995/07/12}{allow 2e commands in 209 mode. latex/1737} +% \changes{v1.1e}{1995/10/03}{New autoload code} +% \changes{v1.1h}{1999/04/15}{Replaced octal numbers, CAR} +% \changes{v1.1k}{2015/02/21}{Removed autoload code} +% +% \section{Picture Mode} +% Picture mode commands. In addition to the commands available in +% \LaTeX2.09, This section adds the new |\qbezier| command for +% drawing curves. +% +% \DescribeMacro{\qbezier} +% |\qbezier|\oarg{N}\parg{AX,AY}\parg{BX,BY}\parg{CX,CY} +% plots a quadratic Bezier curve from \parg{AX,AY} to \parg{CX,CY}, +% with \parg{BX,BY} as the third Bezier point, using $N+1$ points +% equally spaced parametrically. +% If $N = 0$ (the default value), then a sufficient number of points +% are used to draw a connected curve--except that at most +% $|\qbeziermax| + 1$ points are drawn. A ``point'' is a square of +% side |\@wholewidth|. +% +% \DescribeMacro{\bezier} +% In addition, to be compatible with the old |bezier| package, a +% variant of this command, |\bezier|, is defined, in which the first +% argument is not optional. +% +% \StopEventually{} +% +% +% \changes{v0.1a}{1994/03/07}{Initial version, split from latex.dtx} +% \changes{v0.1a}{1994/03/07}{Long lines wrapped to 72 columns} +% \changes{v0.1b}{1994/04/24} +% {Removed surplus spaces after \cs{hbox to } in several cases} +% \changes{v0.1d}{1994/05/13} +% {Removed surplus braces from \cs{@if..} constructions} +% \changes{v0.1e}{1994/05/22}{Use new warning cmds} +% \changes{v1.0f}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% +% \begin{oldcomments} +% +% \unitlength = value of dimension argument +% \@wholewidth = current line width +% \@halfwidth = half of current line width +% \@linefnt = font for drawing lines +% \@circlefnt = font for drawing circles +% +% \linethickness{DIM} : Sets the width of horizontal and vertical lines +% in a picture to DIM. Does not change width of slanted lines +% or circles. Width of all lines reset by \thinlines and +% \thicklines +% +% \picture(XSIZE,YSIZE)(XORG,YORG) +% BEGIN +% \@picht :=L YSIZE * \unitlength +% box \@picbox := +% \hb@xt@ XSIZE * \unitlength +% {\hskip -XORG * \unitlength +% \lower YORG * \unitlength +% \hbox{ +% \ignorespaces %% added 13 June 89 +% END +% +% \endpicture == +% BEGIN +% } \hss } +% height of \@picbox := \@picht +% depth of \@picbox := 0 +% \mbox{\box\@picbox} %% change 26 Aug 91 +% END +% +% \put(X, Y){OBJ} == +% BEGIN +% \@killglue +% \raise Y * \unitlength \hb@xt@ 0pt { \hskip X * \unitlength +% OBJ \hss } +% \ignorespaces +% END +% +% \multiput(X,Y)(DELX,DELY){N}{OBJ} == +% BEGIN +% \@killglue +% \@multicnt := N +% \@xdim := X * \unitlength +% \@ydim := Y * \unitlength +% while \@multicnt > 0 +% do \raise \@ydim \hb@xt@ 0pt { \hskip \@xdim +% OBJ \hss } +% \@multicnt := \@multicnt - 1 +% \@xdim := \@xdim + DELX * \unitlength +% \@ydim := \@ydim + DELY * \unitlength +% od +% \ignorespaces +% END +% +% \shortstack[POS]{TEXT} : Makes a \vbox containing TEXT stacked as +% a one-column array, positioned l, r or c as indicated by POS. +% +% \end{oldcomments} +% +% The `2ekernel' code ensures that a |\usepackage{autopict}| is +% essentially ignored if a `full' format is being used that has +% picture mode already in the format. +% \begin{macrocode} +%<2ekernel>\expandafter\let\csname ver@autopict.sty\endcsname\fmtversion +% \end{macrocode} +% +% \begin{macro}{\@wholewidth} +% \begin{macro}{\@halfwidth} +% \begin{macrocode} +%<*2ekernel> +\newdimen\@wholewidth +\newdimen\@halfwidth +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\unitlength} +% \begin{macrocode} +\newdimen\unitlength \unitlength =1pt +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@picbox} +% \begin{macro}{\@picht} +% \begin{macrocode} +\newbox\@picbox +\newdimen\@picht +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\picture} +% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces before (} +% |#1| should be white space. +% \begin{macro}{\pictur@} +% \changes{v1.0h}{1995/05/12}{Macro added for latex/1355} +% |#1| should be a |(| (eating any white space before the bracket), +% \begin{macrocode} +\long\gdef\picture#1{\pictur@#1} +\gdef\pictur@(#1){% + \@ifnextchar({\@picture(#1)}{\@picture(#1)(0,0)}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@picture} +% \begin{macrocode} +\gdef\@picture(#1,#2)(#3,#4){% + \@picht#2\unitlength + \setbox\@picbox\hb@xt@#1\unitlength\bgroup + \hskip -#3\unitlength + \lower #4\unitlength\hbox\bgroup + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endpicture} +% \changes{LaTeX2.09}{1991/08/26} +% {(RmS \& FMi) extra boxing level around \cs{@picbox} +% to guard against unboxing in math mode +% (proposed by John Hobby)} +% +% \begin{macrocode} +\gdef\endpicture{% + \egroup\hss\egroup + \ht\@picbox\@picht\dp\@picbox\z@ + \mbox{\box\@picbox}} +% \end{macrocode} +% \end{macro} +% +% In the definitions of |\put| and |\multiput|, |\hskip| was replaced by +% |\kern| just in case arg |#3| = ``plus''. (Bug detected by Don Knuth. +% changed 20 Jul 87). +% +% \begin{macrocode} +\long\gdef\put(#1,#2)#3{% + \@killglue\raise#2\unitlength + \hb@xt@\z@{\kern#1\unitlength #3\hss}% + \ignorespaces} +% \end{macrocode} +% +% +% \begin{macro}{\multiput} +% \changes{v0.1c}{1994/04/28}{(DPC) Ignore spaces between )(} +% |#3| had better be a |(|. +% \begin{macrocode} +\gdef\multiput(#1,#2)#3{% + \@xdim #1\unitlength + \@ydim #2\unitlength + \@multiput(} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\multiput} +% \changes{v0.1c}{1994/04/28}{(DPC) Macro added} +% \begin{macrocode} +\long\gdef\@multiput(#1,#2)#3#4{% + \@killglue\@multicnt #3\relax + \@whilenum \@multicnt >\z@\do + {\raise\@ydim\hb@xt@\z@{\kern\@xdim #4\hss}% + \advance\@multicnt\m@ne + \advance\@xdim#1\unitlength\advance\@ydim#2\unitlength}% + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@killglue} +% \begin{macrocode} +\gdef\@killglue{\unskip\@whiledim \lastskip >\z@\do{\unskip}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thinlines} +% \begin{macro}{\thicklines} +% \begin{macrocode} +\gdef\thinlines{\let\@linefnt\tenln \let\@circlefnt\tencirc + \@wholewidth\fontdimen8\tenln \@halfwidth .5\@wholewidth} +\gdef\thicklines{\let\@linefnt\tenlnw \let\@circlefnt\tencircw + \@wholewidth\fontdimen8\tenlnw \@halfwidth .5\@wholewidth} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\linethickness} +% \begin{macrocode} +\gdef\linethickness#1{\@wholewidth #1\relax \@halfwidth .5\@wholewidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ishortstack} +% \begin{macrocode} +\gdef\shortstack{\@ifnextchar[\@shortstack{\@shortstack[c]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ishortstack} +% \begin{macrocode} +\gdef\@shortstack[#1]{% + \leavevmode + \vbox\bgroup + \baselineskip-\p@\lineskip 3\p@ + \let\mb@l\hss\let\mb@r\hss + \expandafter\let\csname mb@#1\endcsname\relax + \let\\\@stackcr + \@ishortstack} +% \end{macrocode} +% \end{macro} +% +% +% \changes{LaTeX2.09}{1991/08/14} +% {(RmS) inserted extra braces around entry for NFSS} +% \changes{LaTeX2.09}{1993/11/03} +% {(RmS) changed \cs{halign} to \cs{ialign} to initialize +% \cs{tabskip} and \cs{everycr}} +% +% \begin{macro}{\@ishortstack} +% \begin{macrocode} +\gdef\@ishortstack#1{\ialign{\mb@l {##}\unskip\mb@r\cr #1\crcr}\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@stackcr} +% \begin{macro}{\@ixstackcr} +% \begin{macrocode} +\gdef\@stackcr{\@ifstar\@ixstackcr\@ixstackcr} +\gdef\@ixstackcr{\@ifnextchar[\@istackcr{\cr\ignorespaces}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@istackcr} +% \begin{macrocode} +\gdef\@istackcr[#1]{\cr\noalign{\vskip #1}\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{oldcomments} +% \line(X,Y){LEN} == +% BEGIN +% \@xarg := X +% \@yarg := Y +% \@linelen := LEN * \unitlength +% if \@xarg = 0 +% then \@vline +% else if \@yarg = 0 +% then \@hline +% else \@sline +% if +% if +% END +% +% \@sline == +% BEGIN +% if \@xarg < 0 +% then @negarg := T +% \@xarg := -\@xarg +% \@yyarg := -\@yarg +% else @negarg := F +% \@yyarg := \@yarg +% fi +% \@tempcnta := |\@yyarg| +% if \@tempcnta > 6 +% then error: 'LATEX ERROR: Illegal \line or \vector argument.' +% \@tempcnta := 0 +% fi +% \box\@linechar := \hbox{\@linefnt \@getlinechar(\@xarg,\@yyarg) } +% if \@yarg > 0 then \@upordown = \raise +% \@clnht := 0 +% else \@upordown = \lower +% \@clnht := height of \box\@linechar +% fi +% \@clnwd := width of \box\@linechar +% if @negarg +% then \hskip - width of \box\@linechar +% \reserved@a == \hskip - 2* width of box \@linechar +% else \reserved@a == \relax +% fi +% %% Put out integral number of line segments +% while \@clnwd < \@linelen +% do \@upordown \@clnht \copy\@linechar +% \reserved@a +% \@clnht := \@clnht + ht of \box\@linechar +% \@clnwd := \@clnwd + width of \box\@linechar +% od +% +% %% Put out last segment +% \@clnht := \@clnht - height of \box\@linechar +% \@clnwd := \@clnwd - width of \box\@linechar +% \@tempdima := \@linelen - \@clnwd +% \@tempdimb := \@tempdima - width of \box\@linechar +% if @negarg then \hskip -\@tempdimb +% else \hskip \@tempdimb +% fi +% \@tempdima := 1000 * \@tempdima +% \@tempcnta := \@tempdima / width of \box\@linechar +% \@tempdima := (\@tempcnta * ht of \box\@linechar)/1000 +% \@clnht := \@clnht + \@tempdima +% if \@linelen < width of box\@linechar +% then \hskip width of box\@linechar +% else \hbox{\@upordown \@clnht \copy\@linechar} +% fi +% END +% +% \@hline == +% BEGIN +% if \@xarg < 0 then \hskip -\@linelen \fi +% \vrule height \@halfwidth depth \@halfwidth width \@linelen +% if \@xarg < 0 then \hskip -\@linelen \fi +% END +% +% \@vline == if \@yarg < 0 \@downline else \@upline fi +% +% +% \@getlinechar(X,Y) == +% BEGIN +% \@tempcnta := 8*X - 9 +% if Y > 0 +% then \@tempcnta := \@tempcnta + Y +% else \@tempcnta := \@tempcnta - Y + 64 +% fi +% \char\@tempcnta +% END +% +% \vector(X,Y){LEN} == +% BEGIN +% \@xarg := X +% \@yarg := Y +% \@linelen := LEN * \unitlength +% if \@xarg = 0 +% then \@vvector +% else if \@yarg = 0 +% then \@hvector +% else \@svector +% if +% if +% END +% +% \@hvector == +% BEGIN +% \@hline +% {\@linefnt if \@xarg < 0 then \@getlarrow(1,0) +% else \@getrarrow(1,0) +% fi} +% END +% +% \@vvector == if \@yarg < 0 \@downvector else \@upvector fi +% +% \@svector == +% BEGIN +% \@sline +% \@tempcnta := |\@yarg| +% if \@tempcnta < 5 +% then \hskip - width of \box\@linechar +% \@upordown \@clnht \hbox +% {\@linefnt +% if @negarg then \@getlarrow(\@xarg,\@yyarg) +% else \@getrarrow(\@xarg,\@yyarg) +% fi } +% else error: 'LATEX ERROR: Illegal \line or \vector argument.' +% fi +% END +% +% \@getlarrow(X,Y) == +% BEGIN +% if Y = 0 +% then \@tempcnta := '33 +% else \@tempcnta := 16 * X - 9 +% \@tempcntb := 2 * Y +% if \@tempcntb > 0 +% then \@tempcnta := \@tempcnta + \@tempcntb +% else \@tempcnta := \@tempcnta - \@tempcntb + 64 +% fi +% fi +% \char\@tempcnta +% END +% +% \@getrarrow(X,Y) == +% BEGIN +% \@tempcntb := |Y| +% case of \@tempcntb +% 0 : \@tempcnta := '55 +% 1 : if X < 3 +% then \@tempcnta := 24*X - 6 +% else if X = 3 +% then \@tempcnta := 49 +% else \@tempcnta := 58 fi +% fi +% 2 : if X < 3 +% then \@tempcnta := 24*X - 3 +% else \@tempcnta := 51 % X must = 3 +% fi +% 3 : \@tempcnta := 16*X - 2 +% 4 : \@tempcnta := 16*X + 7 +% endcase +% if Y < 0 +% then \@tempcnta := \@tempcnta + 64 +% fi +% \char\@tempcnta +% END +% \end{oldcomments} +% +% \begin{macro}{\if@negarg} +% \begin{macrocode} +\newif\if@negarg +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\line} +% \begin{macrocode} +\gdef\line(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax + \@linelen #3\unitlength + \ifdim\@linelen<\z@\@badlinearg\else + \ifnum\@xarg =\z@ \@vline + \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@sline} +% \begin{macrocode} +\gdef\@sline{% + \ifnum\@xarg<\z@ \@negargtrue \@xarg -\@xarg \@yyarg -\@yarg + \else \@negargfalse \@yyarg \@yarg \fi +\ifnum \@yyarg >\z@ \@tempcnta\@yyarg \else \@tempcnta -\@yyarg \fi +\ifnum\@tempcnta>6 \@badlinearg\@tempcnta\z@ \fi +\ifnum\@xarg>6 \@badlinearg\@xarg \@ne \fi +\setbox\@linechar\hbox{\@linefnt\@getlinechar(\@xarg,\@yyarg)}% +% \end{macrocode} +% If we have something like |\line(5,5){30}| the |\@linechar| will +% not contain a char and later on we will end in an infinite loop. +% So we check the width of the box and put in something as an +% emergency fix if necessary. +% \changes{v1.1k}{2003/08/27}{check for \cs{@linechar} being empty pr/3570} +% \begin{macrocode} +\ifdim\wd\@linechar=\z@ + \setbox\@linechar\hbox{.}% + \@badlinearg +\fi +\ifnum \@yarg >\z@ \let\@upordown\raise \@clnht\z@ + \else\let\@upordown\lower \@clnht \ht\@linechar\fi +\@clnwd \wd\@linechar +\if@negarg + \hskip -\wd\@linechar \def\reserved@a{\hskip -2\wd\@linechar}% +\else + \let\reserved@a\relax +\fi +\@whiledim \@clnwd <\@linelen \do + {\@upordown\@clnht\copy\@linechar + \reserved@a + \advance\@clnht \ht\@linechar + \advance\@clnwd \wd\@linechar}% +\advance\@clnht -\ht\@linechar +\advance\@clnwd -\wd\@linechar +\@tempdima\@linelen\advance\@tempdima -\@clnwd +\@tempdimb\@tempdima\advance\@tempdimb -\wd\@linechar +\if@negarg \hskip -\@tempdimb \else \hskip \@tempdimb \fi +\multiply\@tempdima \@m +\@tempcnta \@tempdima +\@tempdima \wd\@linechar \divide\@tempcnta \@tempdima +\@tempdima \ht\@linechar \multiply\@tempdima \@tempcnta +\divide\@tempdima \@m +\advance\@clnht \@tempdima +\ifdim \@linelen <\wd\@linechar + \hskip \wd\@linechar +% \end{macrocode} +% Warn if line gets so short that it can't be printed. +% \changes{v1.1g}{1997/09/15}{Warn if lines become invisible pr/2524} +% But don't warn if it is exactly zero since that was probably +% deliberate (e.g., to get a vector head only). +% \changes{v1.1j}{2001/06/04}{Don't warn for exactly zero pr/3318} +% \begin{macrocode} + \ifdim \@linelen = \z@ + \else + \@picture@warn + \fi + \else\@upordown\@clnht\copy\@linechar\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@hline} +% \begin{macrocode} +\gdef\@hline{\ifnum \@xarg <\z@ \hskip -\@linelen \fi +\vrule \@height \@halfwidth \@depth \@halfwidth \@width \@linelen +\ifnum \@xarg <\z@ \hskip -\@linelen \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@getlinechar} +% \begin{macrocode} +\gdef\@getlinechar(#1,#2){\@tempcnta#1\relax\multiply\@tempcnta 8% + \advance\@tempcnta -9\ifnum #2>\z@ \advance\@tempcnta #2\relax\else + \advance\@tempcnta -#2\relax\advance\@tempcnta 64 \fi + \char\@tempcnta} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\vector} +% \begin{macrocode} +\gdef\vector(#1,#2)#3{\@xarg #1\relax \@yarg #2\relax + \@tempcnta \ifnum\@xarg<\z@ -\@xarg\else\@xarg\fi + \ifnum\@tempcnta<5\relax + \@linelen #3\unitlength + \ifdim\@linelen<\z@\@badlinearg\else + \ifnum\@xarg =\z@ \@vvector + \else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi + \fi + \fi + \else\@badlinearg\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@hvector} +% \begin{macrocode} +\gdef\@hvector{\@hline\hb@xt@\z@{\@linefnt + \ifnum \@xarg <\z@ \@getlarrow(1,0)\hss\else + \hss\@getrarrow(1,0)\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@vvector} +% \begin{macrocode} +\gdef\@vvector{\ifnum \@yarg <\z@ \@downvector \else \@upvector \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@svector} +% \begin{macrocode} +\gdef\@svector{\@sline + \@tempcnta\@yarg \ifnum\@tempcnta <\z@ \@tempcnta -\@tempcnta\fi + \ifnum\@tempcnta <5% + \hskip -\wd\@linechar + \@upordown\@clnht \hbox{\@linefnt \if@negarg + \@getlarrow(\@xarg,\@yyarg)\else \@getrarrow(\@xarg,\@yyarg)\fi}% + \else\@badlinearg\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@getlarrow} +% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR} +% \begin{macrocode} +\gdef\@getlarrow(#1,#2){\ifnum #2=\z@ \@tempcnta 27 % '33 + \else + \@tempcnta #1\relax\multiply\@tempcnta \sixt@@n + \advance\@tempcnta -9 \@tempcntb #2\relax\multiply\@tempcntb \tw@ + \ifnum \@tempcntb >\z@ \advance\@tempcnta \@tempcntb + \else\advance\@tempcnta -\@tempcntb\advance\@tempcnta 64 + \fi\fi\char\@tempcnta} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR} +% \begin{macro}{\@getrarrow} +% \begin{macrocode} +\gdef\@getrarrow(#1,#2){\@tempcntb #2\relax +\ifnum\@tempcntb <\z@ \@tempcntb -\@tempcntb\relax\fi +\ifcase \@tempcntb\relax \@tempcnta 45 % '55 +\or +\ifnum #1<\thr@@ \@tempcnta #1\relax\multiply\@tempcnta +24\advance\@tempcnta -6 \else \ifnum #1=\thr@@ \@tempcnta 49 +\else\@tempcnta 58 \fi\fi\or +\ifnum #1<\thr@@ \@tempcnta=#1\relax\multiply\@tempcnta +24\advance\@tempcnta -\thr@@ \else \@tempcnta 51 \fi\or +\@tempcnta #1\relax\multiply\@tempcnta +\sixt@@n \advance\@tempcnta -\tw@ \else +\@tempcnta #1\relax\multiply\@tempcnta +\sixt@@n \advance\@tempcnta 7 \fi\ifnum #2<\z@ \advance\@tempcnta 64 \fi +\char\@tempcnta} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@vline} +% \begin{macrocode} +\gdef\@vline{\ifnum \@yarg <\z@ \@downline \else \@upline\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@upline} +% \begin{macrocode} +\gdef\@upline{% + \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth + \@height \@linelen \@depth \z@\hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@downline} +% \begin{macrocode} +\gdef\@downline{% + \hb@xt@\z@{\hskip -\@halfwidth \vrule \@width \@wholewidth + \@height \z@ \@depth \@linelen \hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@upvector} +% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR} +% \changes{v1.1i}{2000/01/15}{Removed space at end-of-line, CAR} +% \begin{macrocode} +\gdef\@upvector{\@upline\setbox\@tempboxa\hbox{\@linefnt\char 54}% '66 + \raise \@linelen \hb@xt@\z@{\lower \ht\@tempboxa\box\@tempboxa\hss}} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.1h}{1999/04/15}{Replaced octal number, CAR} +% \begin{macro}{\@downvector} +% \begin{macrocode} +\gdef\@downvector{\@downline\lower \@linelen + \hb@xt@\z@{\@linefnt\char 63 % '77 + \hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{oldcomments} +% \dashbox{D}(X,Y) == +% BEGIN +% leave vertical mode +% \hb@xt@ 0pt { +% \baselineskip := 0pt +% \lineskip := 0pt +% %% HORIZONTAL DASHES +% \@dashdim := X * \unitlength +% \@dashcnt := \@dashdim + 200 % to prevent roundoff error +% \@dashdim := D * \unitlength +% \@dashcnt := \@dashcnt / \@dashdim +% if \@dashcnt is odd +% then \@dashdim := 0pt +% \@dashcnt := (\@dashcnt + 1) / 2 +% else \@dashdim := \@dashdim / 2 +% \@dashcnt := \@dashcnt / 2 - 1 +% \box\@dashbox := \hbox{\vrule height \@halfwidth +% depth \@halfwidth width \@dashdim} +% \put(0,0){\copy\@dashbox} +% \put(0,Y){\copy\@dashbox} +% \put(X,0){\hskip -\@dashdim\copy\@dashbox} +% \put(X,Y){\hskip -\@dashdim\box\@dashbox} +% \@dashdim := 3 * \@dashdim +% fi +% \box\@dashbox := \hbox{\vrule height \@halfwidth +% depth \@halfwidth width D * \unitlength +% \hskip D * \unitlength} +% \@tempcnta := 0 +% \put(0,0){\hskip \@dashdim +% while \@tempcnta < \@dascnt +% do \copy\@dashbox +% \@tempcnta := \@tempcnta + 1 +% od +% } +% \@tempcnta := 0 +% put(0,Y){\hskip \@dashdim +% while \@tempcnta < \@dascnt +% do \copy\@dashbox +% \@tempcnta := \@tempcnta + 1 +% od +% } +% +% %% vertical dashes +% \@dashdim := Y * \unitlength +% \@dashcnt := \@dashdim + 200 % to prevent roundoff error +% \@dashdim := D * \unitlength +% \@dashcnt := \@dashcnt / \@dashdim +% if \@dashcnt is odd +% then \@dashdim := 0pt +% \@dashcnt := (\@dashcnt + 1) / 2 +% else \@dashdim := \@dashdim / 2 +% \@dashcnt := \@dashcnt / 2 - 1 +% \box\@dashbox := \hbox{\hskip -\@halfwidth +% \vrule width \@wholewidth +% height \@dashdim } +% \put(0,0){\copy\@dashbox} +% \put(X,0){\copy\@dashbox} +% \put(0,Y){\lower\@dashdim\copy\@dashbox} +% \put(X,Y){\lower\@dashdim\copy\@dashbox} +% \@dashdim := 3 * \@dashdim +% fi +% \box\@dashbox := \hbox{\vrule width \@wholewidth +% height D * \unitlength } +% \@tempcnta := 0 +% put(0,0){\hskip -\halfwidth +% \vbox{while \@tempcnta < \@dashcnt +% do \vskip D*\unitlength +% \copy\@dashbox +% \@tempcnta := \@tempcnta + 1 +% od +% \vskip \@dashdim +% } } +% \@tempcnta := 0 +% put(X,0){\hskip -\halfwidth +% \vbox{while \@tempcnta < \@dashcnt +% do \vskip D*\unitlength +% \copy\@dashbox +% \@tempcnta := \@tempcnta + 1 +% od +% \vskip \@dashdim +% } +% } +% } % END DASHES +% +% \@imakepicbox(X,Y) +% END +% \end{oldcomments} +% +% \begin{macro}{\dashbox} +% \begin{macrocode} +\gdef\dashbox#1(#2,#3){\leavevmode\hb@xt@\z@{\baselineskip \z@skip +\lineskip \z@skip +\@dashdim #2\unitlength +\@dashcnt \@dashdim \advance\@dashcnt 200 +\@dashdim #1\unitlength\divide\@dashcnt \@dashdim +\ifodd\@dashcnt\@dashdim \z@ +\advance\@dashcnt \@ne \divide\@dashcnt \tw@ +\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@ +\advance\@dashcnt \m@ne +\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth +\@width \@dashdim}\put(0,0){\copy\@dashbox}% +\put(0,#3){\copy\@dashbox}% +\put(#2,0){\hskip-\@dashdim\copy\@dashbox}% +\put(#2,#3){\hskip-\@dashdim\box\@dashbox}% +\multiply\@dashdim \thr@@ +\fi +\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth +\@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@ +\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt +\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@ +\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt +\do{\copy\@dashbox\advance\@tempcnta \@ne }}% +\@dashdim #3\unitlength +\@dashcnt \@dashdim \advance\@dashcnt 200 +\@dashdim #1\unitlength\divide\@dashcnt \@dashdim +\ifodd\@dashcnt \@dashdim \z@ +\advance\@dashcnt \@ne \divide\@dashcnt \tw@ +\else +\divide\@dashdim \tw@ \divide\@dashcnt \tw@ +\advance\@dashcnt \m@ne +\setbox\@dashbox\hbox{\hskip -\@halfwidth +\vrule \@width \@wholewidth +\@height \@dashdim}\put(0,0){\copy\@dashbox}% +\put(#2,0){\copy\@dashbox}% +\put(0,#3){\lower\@dashdim\copy\@dashbox}% +\put(#2,#3){\lower\@dashdim\copy\@dashbox}% +\multiply\@dashdim \thr@@ +\fi +\setbox\@dashbox\hbox{\vrule \@width \@wholewidth +\@height #1\unitlength}\@tempcnta\z@ +\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt +\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% +\vskip\@dashdim}}\@tempcnta\z@ +\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta<\@dashcnt +\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% +\vskip\@dashdim}}}\@makepicbox(#2,#3)} +% \end{macrocode} +% \end{macro} +% +% \begin{oldcomments} +% CIRCLES AND OVALS +% +% USER COMMANDS: +% +% \circle{D} : Produces the circle with the diameter as close as +% possible to D * \unitlength. \put(X,Y){\circle{D}} +% puts the circle with its center at (X,Y). +% +% \oval(X,Y) : Makes an oval as round as possible that fits in the +% rectangle of width X * \unitlength and height +% Y * \unitlength. The reference point is the center. +% +% \oval(X,Y)[POS] : Save as \oval(X,Y) except it draws only the +% half or quadrant of the oval indicated by POS. +% E.G., \oval(X,Y)[t] draws just the top half +% and \oval(X,Y)[br] draws just the bottom right +% quadrant. In all cases, the reference point is +% the same as the unqualified \oval(X,Y) command. +% +% \@ovvert {DELTA1} {DELTA2} : Makes a vbox containing either the left +% side or the right side of the oval being constructed. The baseline +% will coincide with the outside bottom edge of the oval; the left +% side of the box will coincide with the left edge of the vertical +% rule. The width of the box will be \@tempdima. +% DELTA1 and DELTA2 are added to the character number in \@tempcnta +% to get the characters for the top and bottom quarter circle pieces. +% +% \@ovhorz : Makes an hbox containing the straight rule for either the +% top or the bottom of the oval being constructed. The baseline +% will coincide with bottom edge of the rule; the left side of +% the box will coincide with the left side of the oval. +% The width of the box will be \@ovxx. +% +% \@getcirc {DIAM} : Sets \@tempcnta to the character number +% of the top-right quarter circle with the largest +% diameter less than or equal to DIAM. +% Sets \@tempboxa to an hbox containing that character. +% Sets \@tempdima to \wd \@tempboxa, which is the distance +% from the circle's left outside edge to its right +% inside edge. +% (These characters are like those described in the +% TeXbook, pp. 389-90.) +% +% \@getcirc {DIAM} == +% BEGIN +% \@tempcnta := integer coercion of (DIAM + 2pt) +% + 2pt added 1 Nov 88 +% \@tempcnta := \@tempcnta / integer coercion of 4pt +% if \@tempcnta > 10 +% then \@tempcnta := 10 fi +% if \@tempcnta > 0 +% then \@tempcnta := \@tempcnta-1 +% else LaTeX Warning: Oval too small. +% fi +% \@tempcnta := 4 * \@tempcnta +% \@tempboxa := \hbox{\@circlefnt \char \@tempcnta} +% \@tempdima := \wd \@tempboxa +% END +% +% \@put{X}{Y}{OBJ} == +% BEGIN +% \raise Y \hb@xt@ 0pt{\hskip X OBJ \hss} +% END +% +% \@oval(X,Y)[POS] == +% BEGIN +% \begingroup +% \boxmaxdepth := \maxdimen +% @ovt := @ovb := @ovl := @ovr := true +% for all E in POS +% do @ovE := false od +% \@ovxx := X * \unitlength +% \@ovyy := Y * \unitlength +% \@tempdimb := min(\@ovxx,\@ovyy) +% \@getcirc{\@tempdimb-2pt} %% "-2pt" added 7 Dec 89 +% \@ovro := \ht \@tempboxa +% \@ovri := \dp \@tempboxa +% \@ovdx := \@ovxx - \@tempdima +% \@ovdx := \@ovdx/2 +% \@ovdy := \@ovyy - \@tempdima +% \@ovdy := \@ovyy/2 +% \@circlefnt +% \@tempboxa := +% \hbox{ +% if @ovr +% then \@ovvert{3}{2} \kern -\@tempdima +% fi +% if @ovl +% then \kern \@ovxx \@ovvert{0}{1} \kern -\@tempdima +% \kern -\@ovxx +% fi +% if @ovt +% then \@ovhorz \kern -\@ovxx +% fi +% if @ovb +% then \raise \@ovyy \@ovhorz +% fi +% } +% \@ovdx := \@ovdx + \@ovro +% \@ovdy := \@ovdy + \@ovro +% \ht\@tempboxa := \dp\@tempboxa := 0 +% \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa} +% \endgroup +% END +% +% \@ovvert {DELTA1} {DELTA2} == +% BEGIN +% \vbox to \@ovyy { +% if @ovb +% then \@tempcntb := \@tempcnta + DELTA1 +% \kern -\@ovro +% \hbox { \char \@tempcntb } +% \nointerlineskip +% else \kern \@ovri \kern \@ovdy +% fi +% \leaders \vrule width \@wholewidth \vfil +% \nointerlineskip +% if @ovt +% then \@tempcntb := \@tempcnta + DELTA2 +% \hbox { \char \@tempcntb } +% else \kern \@ovdy \kern \@ovro +% fi +% } +% END +% +% \@ovhorz == +% BEGIN +% \hb@xt@ \@ovxx{ +% \kern \@ovro +% if @ovr +% then +% else \kern \@ovdx +% fi +% \leaders \hrule height \@wholewidth \hfil +% if @ovl +% then +% else \kern \@ovdx +% fi +% \kern \@ovri +% } +% END +% +% \circle{DIAM} == +% BEGIN +% \begingroup +% \boxmaxdepth := maxdimen +% \@tempdimb := DIAM *\unitlength +% if \@tempdimb > 15.5pt +% then \@getcirc{\@tempdimb} +% \@ovro := \ht \@tempboxa +% \@tempboxa := \hbox{ +% \@circlefnt +% \@tempcnta := \@tempcnta + 2 +% \char \@tempcnta +% \@tempcnta := \@tempcnta - 1 +% \char \@tempcnta +% \kern -2\@tempdima +% \@tempcnta := \@tempcnta + 2 +% \raise \@tempdima \hbox { \char \@tempcnta } +% \raise \@tempdima \box\@tempboxa +% } +% \ht\@tempboxa := \dp\@tempboxa := 0 +% \@put{-\@ovro}{-\@ovro}{\@tempboxa} +% else +% \@circ{\@tempdimb}{96} +% fi +% \endgroup +% END +% +% \circle*{DIAM} == \@dot{DIAM} == \@circ{DIAM*\unitlength}{112} +% +% \@circ{DIAM}{CHAR} == +% BEGIN +% \@tempcnta := integer coercion of (DIAM + .5pt)/1pt. +% if \@tempcnta > 15 then \@tempcnta := 15 fi +% if \@tempcnta > 1 then \@tempcnta := \@tempcnta - 1 fi +% \@tempcnta := \@tempcnta + CHAR +% \@circlefnt +% \char \@tempcnta +% END +% \end{oldcomments} +% +% +% \begin{macro}{\if@ovt} +% \begin{macro}{\if@ovb} +% \begin{macro}{\if@ovl} +% \begin{macro}{\if@ovr} +% If producing the Top Bottom Left or Right of an oval. +% \begin{macrocode} +\newif\if@ovt +\newif\if@ovb +\newif\if@ovl +\newif\if@ovr +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@ovxx} +% \begin{macro}{\@ovyy} +% \begin{macro}{\@ovdx} +% \begin{macro}{\@ovdy} +% \begin{macro}{\@ovro} +% \begin{macro}{\@ovri} +% \begin{macrocode} +\newdimen\@ovxx +\newdimen\@ovyy +\newdimen\@ovdx +\newdimen\@ovdy +\newdimen\@ovro +\newdimen\@ovri +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% |\advance\@tempdima 2pt\relax| added 1 Nov 88 to fix bug in which +% size of drawn circle not monotonic function of argument of |\circle|, +% caused by different rounding for dimensions of large and small +% circles. +% +% +% \begin{macro}{\@getcirc} +% \changes{v1.1j}{2003/12/30}{issue warning if circle size can't be met pr/3473} +% \begin{macrocode} +\gdef\@getcirc#1{\@tempdima #1\relax \advance\@tempdima 2\p@ + \@tempcnta\@tempdima + \@tempdima 4\p@ \divide\@tempcnta\@tempdima + \ifnum \@tempcnta >10\relax + \@picture@warn + \@tempcnta 10\relax + \fi + \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne +% \end{macrocode} +% Warn if requirements for oval or circle can't be met. +% \changes{v1.1g}{1997/09/15}{Warn if lines become invisible pr/2524} +% \begin{macrocode} + \else \@picture@warn \fi + \multiply\@tempcnta 4\relax + \setbox \@tempboxa \hbox{\@circlefnt + \char \@tempcnta}\@tempdima \wd \@tempboxa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@picture@warn} +% Generic warning for lines, vectors (used in |\@sline|) and +% oval or circle (used in |\@getcirc|) are not available at +% right size. +% \changes{v1.1g}{1997/09/15}{Macro added pr/2524} +% \begin{macrocode} +\def\@picture@warn{\@latex@warning{% + \string\oval, \string\circle, or \string\line\space + size unavailable}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@put} +% \begin{macrocode} +\gdef\@put#1#2#3{\raise #2\hb@xt@\z@{\hskip #1#3\hss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\oval} +% \begin{macrocode} +\gdef\oval(#1,#2){\@ifnextchar[{\@oval(#1,#2)}{\@oval(#1,#2)[]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2016/03/31}% +%<latexrelease> {\@ovhlinetrue}% +%<latexrelease> {Avoid almost zero length leaders}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macro}{\if@ovvline} +% \changes{v1.1l}{2016/03/29}{macro added (latex/4452)} +% \begin{macro}{\if@ovhline} +% \changes{v1.1l}{2016/03/29}{macro added (latex/4452)} +% Tests whether horizontal or vertical lines are needed. +% \begin{macrocode} +\newif\if@ovvline \@ovvlinetrue +\newif\if@ovhline \@ovhlinetrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@oval} +% \begin{macrocode} +\gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen + \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue +% \end{macrocode} +% \changes{v1.1l}{2016/03/29}{initialise tests} +% \begin{macrocode} + \@ovvlinefalse \@ovhlinefalse +% \end{macrocode} +% \begin{macrocode} + \@tfor\reserved@a :=#3\do{\csname @ov\reserved@a false\endcsname}% + \@ovxx #1\unitlength + \@ovyy #2\unitlength +% \end{macrocode} +% \changes{v1.1l}{2016/03/29}{add setting of line tests} +% \begin{macrocode} + \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx \@ovvlinetrue + \else \@ovyy \ifdim \@ovyy =\@ovxx \else \@ovhlinetrue \fi\fi +% \end{macrocode} +% \begin{macrocode} + \advance \@tempdimb -2\p@ + \@getcirc \@tempdimb + \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa + \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@ + \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@ +% \end{macrocode} +% \changes{v1.1l}{2016/03/29}{add setting of line tests} +% \begin{macrocode} + \ifdim \@ovdx >\z@ \@ovhlinetrue \fi + \ifdim \@ovdy >\z@ \@ovvlinetrue \fi +% \end{macrocode} +% \begin{macrocode} + \@circlefnt \setbox\@tempboxa + \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi + \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi + \if@ovt \@ovhorz \kern -\@ovxx \fi + \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro + \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@ + \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}% + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ovvert} +% \begin{macrocode} +\gdef\@ovvert#1#2{\vbox to\@ovyy{% + \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax + \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip + \else \kern \@ovri \kern \@ovdy \fi +% \end{macrocode} +% \changes{v1.1l}{2016/03/29} +% {use glue not leaders if vertical line not required} +% \begin{macrocode} + \if@ovvline \leaders\vrule \@width \@wholewidth \fi +% \end{macrocode} +% \begin{macrocode} + \vfil \nointerlineskip + \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax + \hbox{\char \@tempcntb}% + \else \kern \@ovdy \kern \@ovro \fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ovhorz} +% \begin{macrocode} +\gdef\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro + \if@ovr \else \kern \@ovdx \fi +% \end{macrocode} +% \changes{v1.1l}{2016/03/29} +% {use glue not leaders if horizontal line not required} +% \begin{macrocode} + \if@ovhline \leaders \hrule \@height \@wholewidth \fi +% \end{macrocode} +% \begin{macrocode} + \hfil + \if@ovl \else \kern \@ovdx \fi + \kern \@ovri}} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@ovhlinetrue}% +%<latexrelease> {Avoid almost zero length leaders}% +%<latexrelease>\let\if@ovvline\@undefined +%<latexrelease>\let\if@ovhline\@undefined +%<latexrelease>\gdef\@oval(#1,#2)[#3]{\begingroup\boxmaxdepth \maxdimen +%<latexrelease> \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue +%<latexrelease> \@tfor\reserved@a :=#3\do +%<latexrelease> {\csname @ov\reserved@a false\endcsname}% +%<latexrelease> \@ovxx #1\unitlength +%<latexrelease> \@ovyy #2\unitlength +%<latexrelease> \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx\else \@ovyy \fi +%<latexrelease> \advance \@tempdimb -2\p@ +%<latexrelease> \@getcirc \@tempdimb +%<latexrelease> \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa +%<latexrelease> \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@ +%<latexrelease> \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@ +%<latexrelease> \@circlefnt \setbox\@tempboxa +%<latexrelease> \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi +%<latexrelease> \if@ovl +%<latexrelease> \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx +%<latexrelease> \fi +%<latexrelease> \if@ovt \@ovhorz \kern -\@ovxx \fi +%<latexrelease> \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro +%<latexrelease> \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@ +%<latexrelease> \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}% +%<latexrelease> \endgroup} +%<latexrelease>\gdef\@ovvert#1#2{\vbox to\@ovyy{% +%<latexrelease> \if@ovb \@tempcntb \@tempcnta \advance \@tempcntb #1\relax +%<latexrelease> \kern -\@ovro \hbox{\char \@tempcntb}\nointerlineskip +%<latexrelease> \else \kern \@ovri \kern \@ovdy \fi +%<latexrelease> \leaders\vrule \@width \@wholewidth\vfil \nointerlineskip +%<latexrelease> \if@ovt \@tempcntb \@tempcnta \advance \@tempcntb #2\relax +%<latexrelease> \hbox{\char \@tempcntb}% +%<latexrelease> \else \kern \@ovdy \kern \@ovro \fi}} +%<latexrelease>\gdef\@ovhorz{\hb@xt@\@ovxx{\kern \@ovro +%<latexrelease> \if@ovr \else \kern \@ovdx \fi +%<latexrelease> \leaders \hrule \@height \@wholewidth \hfil +%<latexrelease> \if@ovl \else \kern \@ovdx \fi +%<latexrelease> \kern \@ovri}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% \begin{macro}{\circle} +% \changes{LaTeX2.09}{1993/08/05} +% {(RMS) Added error message if \cs{circle} is used in math mode.} +% \begin{macrocode} +\gdef\circle{\@inmatherr\circle\@ifstar\@dot\@circle} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@circle} +% \begin{macrocode} +\gdef\@circle#1{% + \begingroup \boxmaxdepth \maxdimen \@tempdimb #1\unitlength + \ifdim \@tempdimb >15.5\p@ \@getcirc\@tempdimb + \@ovro\ht\@tempboxa + \setbox\@tempboxa\hbox{\@circlefnt + \advance\@tempcnta\tw@ \char \@tempcnta + \advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima + \advance\@tempcnta\tw@ + \raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima + \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@ + \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}% + \else \@circ\@tempdimb{96}\fi\endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@dot} +% Internal form of |\circle*|. +% \begin{macrocode} +\gdef\@dot#1{\@tempdimb #1\unitlength \@circ\@tempdimb{112}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@circ} +% \begin{macrocode} +\gdef\@circ#1#2{\@tempdima #1\relax \advance\@tempdima .5\p@ + \@tempcnta\@tempdima \@tempdima \p@ + \divide\@tempcnta\@tempdima + \ifnum\@tempcnta >15\relax \@tempcnta 15\relax \fi + \ifnum \@tempcnta >\z@ \advance\@tempcnta\m@ne\fi + \advance\@tempcnta #2\relax + \@circlefnt \char\@tempcnta} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@xarg} +% \begin{macro}{\@yarg} +% \begin{macro}{\@yyarg} +% Counters used for manipulating the `slope' arguments. +% \begin{macrocode} +\newcount\@xarg +\newcount\@yarg +\newcount\@yyarg +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@multicnt} +% Counter used in |\multiput|, and also |\multicolumn|. +% \begin{macrocode} +\newcount\@multicnt +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xdim} +% \begin{macro}{\yxdim} +% Length registers. +% \begin{macrocode} +\newdimen\@xdim +\newdimen\@ydim +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@linechar} +% Box for holding a line segment character, for sloping lines. +% \begin{macrocode} +\newbox\@linechar +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@linelen} +% Length of the line currently being built. +% \begin{macrocode} +\newdimen\@linelen +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@clnwd} +% \begin{macro}{\@clnht} +% Height and width of current line segment. +% \begin{macrocode} +\newdimen\@clnwd +\newdimen\@clnht +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@dashdim} +% \begin{macro}{\@dashbox} +% \begin{macro}{\@dashcnt} +% |\dashbox| internal registers. +% \begin{macrocode} +\newdimen\@dashdim +\newbox\@dashbox +\newcount\@dashcnt +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Initialization: ``|\thinlines|'' +% \changes{v1.1f}{1995/10/27} +% {Move initialisation to kernel from autoload file} +% \begin{macrocode} +\let\@linefnt\tenln +\let\@circlefnt\tencirc +\@wholewidth\fontdimen8\tenln +\@halfwidth .5\@wholewidth +% \end{macrocode} +% +% +% +% \subsection{Curves} +% The new |\qbezier| command, based on the old |\bezier| defined in +% |bezier.sty|. +% \changes{v0.1c}{1994/04/28}{bezier curves added} +% +% \begin{oldcomments} +% +% \qbezier[N] == \bezier{N} +% +% \bezier{N}(AX,AY)(BX,BY)(CX,CY) == +% BEGIN +% IF N = 0 +% THEN \@xdima := |BX - AX| +% \@xb := |CX - BX| +% \@xa := Max(\@xa, \@xb) +% \@ya := |BY - AY| +% \@yb := |CY - BY| +% \@ya := Max(\@ya, \@yb) +% @sc := Max(\@xa, \@ya) +% %% The coefficient .5 below is the degree of overlap of +% %% successive points, where 1 is no overlap and 0 is +% %% complete overlap. A coefficient of C multiplies +% %% the number of points plotted by 1/C. +% %% +% \@xa := .5 * \@halfwidth +% @sc := @sc / \@halfwidth +% @sc := Max(@sc, qbeziermax) +% ELSE @sc := N +% @scp := @sc+1 +% \@xb := 2 * (BX - AX) * \unitlength +% \@xa := ((CX-AX)*\unitlength - \@xb)/@sc +% \@yb := 2 * (BY - AY) * \unitlength +% \@ya := ((CY-AY)*\unitlength - \@yb)/@sc +% \@pictdot := square rule of width \@wholewidth +% \count@ := 0 +% WHILE \count@ < @scp +% DO \@xdim := ((\count@*\@xa + @xb) / @sc) * \count@ +% \@ydim := ((\count@*\@ya + @yb) / @sc) * \count@ +% plot pt with relative coords (\@xdim,\@ydim) +% \count@ := \count@+1 +% OD +% +% \end{oldcomments} +% +% \begin{macro}{\qbeziermax} +% The maximum number of points to plot. +% \begin{macrocode} +\gdef\qbeziermax{500} +% \end{macrocode} +% \end{macro} +% +% +% In the code below, to save registers |\@a| \ldots\ are not used. +% Instead other registers are reused. +% +% |\newcounter{@sc} -> \c@multicnt|\par +% |\newcounter{@scp} -> \@tempcnta|\par +% |\newdimen\@xa -> \@ovxx|\par +% +% |\newdimen\@xb -> \@ovdx| +% +% |\newdimen\@ya -> \@ovyy|\par +% |\newdimen\@yb -> \@ovdy| +% +% |\newsavebox{\@pictdot} -> \@tempboxa| +% +% \begin{macro}{\qbezier} +% Main user-level command to plot quadratic bezier curves. +% |#2| should be |(|. +% \begin{macrocode} +\newcommand\qbezier[2][0]{\bezier{#1}#2} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bezier} +% Form of |\bezier| compatible with 2.09 |bezier.sty|, but modified to +% ignore spaces between its arguments. +% |#2| should be white space, and |#4| should be |(|. +% \begin{macrocode} +\gdef\bezier#1)#2(#3)#4({\@bezier#1)(#3)(} +% \end{macrocode} +% +% \begin{macro}{\@bezier} +% \begin{macrocode} +\gdef\@bezier#1(#2,#3)(#4,#5)(#6,#7){% + \ifnum #1=\z@ + \@ovxx #4\unitlength + \advance\@ovxx -#2\unitlength + \ifdim \@ovxx<\z@ \@ovxx -\@ovxx \fi + \@ovdx #6\unitlength + \advance\@ovdx -#4\unitlength + \ifdim \@ovdx<\z@ \@ovdx -\@ovdx \fi + \ifdim \@ovxx<\@ovdx \@ovxx \@ovdx \fi + \@ovyy #5\unitlength + \advance\@ovyy -#3\unitlength + \ifdim \@ovyy<\z@ \@ovyy -\@ovyy \fi + \@ovdy #7\unitlength + \advance\@ovdy -#5\unitlength + \ifdim \@ovdy<\z@ \@ovdy -\@ovdy \fi + \ifdim \@ovyy<\@ovdy \@ovyy \@ovdy \fi + \@multicnt + \ifdim \@ovxx>\@ovyy \@ovxx \else \@ovyy \fi + \@ovxx .5\@halfwidth \divide\@multicnt\@ovxx + \ifnum \qbeziermax<\@multicnt \@multicnt\qbeziermax\relax \fi + \else \@multicnt#1\relax \fi + \@tempcnta\@multicnt \advance\@tempcnta\@ne + \@ovdx #4\unitlength \advance\@ovdx -#2\unitlength + \multiply\@ovdx \tw@ + \@ovxx #6\unitlength \advance\@ovxx -#2\unitlength + \advance\@ovxx -\@ovdx \divide\@ovxx\@multicnt + \@ovdy #5\unitlength \advance\@ovdy -#3\unitlength + \multiply\@ovdy \tw@ + \@ovyy #7\unitlength \advance\@ovyy -#3\unitlength + \advance\@ovyy -\@ovdy \divide\@ovyy\@multicnt +% \end{macrocode} +% +% \changes{v1.1k}{2003/08/27}{added missing displacement pr/3566} +% \begin{macrocode} + \setbox\@tempboxa\hbox{% + \hskip -\@halfwidth + \vrule \@height\@halfwidth + \@depth \@halfwidth + \@width \@wholewidth}% + \put(#2,#3){% + \count@\z@ + \@whilenum{\count@<\@tempcnta}\do + {\@xdim\count@\@ovxx + \advance\@xdim\@ovdx + \divide\@xdim\@multicnt + \multiply\@xdim\count@ + \@ydim\count@\@ovyy + \advance\@ydim\@ovdy + \divide\@ydim\@multicnt + \multiply\@ydim\count@ + \raise \@ydim + \hb@xt@\z@{\kern\@xdim + \unhcopy\@tempboxa\hss}% + \advance\count@\@ne}}} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltplain.dtx b/Master/texmf-dist/source/latex-dev/base/ltplain.dtx new file mode 100644 index 00000000000..5c4050b734a --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltplain.dtx @@ -0,0 +1,1588 @@ +% \iffalse meta-comment +% +% Copyright 1993-2017 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +%%% From File: ltplain.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltplain.dtx} + [2017/04/10 v2.3c LaTeX Kernel (Plain TeX)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltplain.dtx} +\begin{document} +\title{\filename\\(The file plain.tex, modified for \LaTeX)} +\author{Donald~E.~Knuth\\ + Modified by + Leslie Lamport, Frank Mittelbach,\\ + Rainer Sch\"opf, David Carlisle} +\date{\filedate} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0a}{1994/03/08} +% {Remove need for a driver file.} +% \changes{v1.0b}{1994/03/12} +% {Name changed from lplain. The end of an era} +% \changes{v1.0e}{1994/03/12}{Replaced remaining width, height, depth +% by \LaTeX{} macro names to save tokens.} +% \changes{v1.1a}{1994/10/14} +% {Moved code to other files.} +% \changes{v1.1b}{1994/11/10} +% {(CAR) added patch to \cs{loop}.} +% \changes{v1.1f}{1994/11/25} +% {(DPC) Comment out lots of obsolete code} +% \changes{v1.1g}{1994/12/01} +% {(DPC) More doc changes} +% \changes{v1.1j}{1995/05/07}{Use \cs{hb@xt@}} +% \changes{v1.1j}{1995/05/21}{Moved some code to other files} +% \changes{v1.1n}{1995/07/02}{Removed surplus `by' and `\quotechar=' in +% various places} +% \changes{v1.1o}{1995/09/14}{Moved \cs{multispan} to lttab.dtx} +% \changes{v1.1r}{1995/10/10}{Autoload tracing code} +% \changes{v1.1u}{1996/10/28}{(CAR) More doc changes} +% \changes{v2.0e}{2015/02/21}{Removed autoload code} +% \changes{v2.2d}{2016/10/15}{Require e\TeX{}} +% \changes{v2.3b}{2016/11/06}{Drop \cs{outer} entirely} +% +% \section{Plain \TeX} +% +% \LaTeX\ includes almost all of the functionality of Knuth's original +% `Basic Macros' That is, the plain \TeX\ format described in Appendix~B +% of the \TeX{}Book. However, some of the user commands are not much +% use so, in order to save memory, we may remove them from the kernel +% into a package. Here is a list of the commands that may be removed +% (PROBABLY NOT COMPLETE). +% \begin{verbatim} +% \magstep \magstephalf +% \mathhexbox +% \vglue \vgl@ +% \hglue \hgl@ +% \end{verbatim} +% +% This file is by now very small as most of it has been moved to more +% appropriate kernel files: it may disappear completely one day. +% +% \LaTeX\ font definitions are done using NFSS2 so none of PLAIN's +% font definitions are in \LaTeX. +% +% \LaTeX\ has its own tabbing environment, so PLAIN's is disabled. +% +% \LaTeX{} uses its own output routine, so most of the plain one was +% removed. +% +% \StopEventually{} +% +% +% \begin{macrocode} +%<*2ekernel> +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\catcode`\$=3 % dollar sign is math shift +\catcode`\&=4 % ampersand is alignment tab +\catcode`\#=6 % hash mark is macro parameter character +\catcode`\^=7 % circumflex and uparrow are for superscripts +\catcode`\_=8 % underline and downarrow are for subscripts +\catcode`\^^I=10 % ascii tab is a blank space +\chardef\active=13 \catcode`\~=\active % tilde is active +\catcode`\^^L=\active \def^^L{\par}% ascii form-feed is \par +% \end{macrocode} +% +% \begin{macrocode} +\message{catcodes,} +% \end{macrocode} +% +% We had to define the |\catcodes| right away, before the message line, +% since |\message| uses the |{| and |}| characters. +% When INITEX (the \TeX\ initializer) starts up, +% it has defined the following |\catcode| values:\\ +% |\catcode`\^^@=9 % | ascii null is ignored\\ +% |\catcode`\^^M=5 % | ascii return is end-line\\ +% |\catcode`\\=0 % | backslash is TeX escape character\\ +% |\catcode`\%=14 % | percent sign is comment character\\ +% |\catcode`\ =10 % | ascii space is blank space\\ +% |\catcode`\^^?=15 %| ascii delete is invalid\\ +% |\catcode`\A=11 ... \catcode`\Z=11 %| uppercase letters\\ +% |\catcode`\a=11 ... \catcode`\z=11 %| lowercase letters\\ +% all others are type 12 (other) +% +% Here is a list of the characters that have been specially catcoded: +% \begin{macrocode} +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\_\do\%\do\~} +% \end{macrocode} +% (not counting ascii null, tab, linefeed, formfeed, return, delete) +% Each symbol in the list is preceded by \do, which can be defined +% if you want to do something to every item in the list. +% +% We make |@| signs act like letters, temporarily, to avoid conflict +% between user names and internal control sequences of plain format. +% \begin{macrocode} +\catcode`@=11 +% \end{macrocode} +% +% To make the plain macros more efficient in time and space, +% several constant values are declared here as control sequences. +% If they were changed, anything could happen; +% so they are private symbols. +% \begin{macro}{\@ne} +% \begin{macro}{\tw@} +% \begin{macro}{\thr@@} +% \begin{macro}{\sixt@@n} +% \begin{macro}{\@cclv} +% Small constants are defined using |\chardef|. +% \begin{macrocode} +\chardef\@ne=1 +\chardef\tw@=2 +\chardef\thr@@=3 +\chardef\sixt@@n=16 +\chardef\@cclv=255 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@cclvi} +% \begin{macro}{\@m} +% \begin{macro}{\@M} +% \begin{macro}{\@MM} +% Constants above 255 defined using |\mathchardef|. +% \begin{macrocode} +\mathchardef\@cclvi=256 +\mathchardef\@m=1000 +\mathchardef\@M=10000 +\mathchardef\@MM=20000 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Allocation of registers +% +% Here are macros for the automatic allocation of |\count|, |\box|, +% |\dimen|, |\skip|, |\muskip|, and |\toks| registers, as well as +% |\read| and |\write| stream numbers, |\fam| codes, |\language| codes, +% and |\insert| numbers. +% +% \begin{macrocode} +\message{registers,} +% \end{macrocode} +% +% When a register is used only temporarily, it need not be allocated; +% grouping can be used, making the value previously in the register +% return after the close of the group. The main use of these macros is +% for registers that are defined by one macro and used by others, +% possibly at different nesting levels. All such registers should be +% defined through these macros; otherwise conflicts may occur, +% especially when two or more macro packages are being used at +% the same time. +% +% \begin{oldcomments} +% The following counters are reserved: +% 0 to 9 page numbering +% 10 count allocation +% 11 dimen allocation +% 12 skip allocation +% 13 muskip allocation +% 14 box allocation +% 15 toks allocation +% 16 read file allocation +% 17 write file allocation +% 18 math family allocation +% 19 language allocation +% 20 insert allocation +% 21 the most recently allocated number +% 22 constant -1 +% \end{oldcomments} +% +% New counters are allocated starting with 23, 24, etc. Other registers +% are allocated starting with 10. This leaves 0 through 9 for the user +% to play with safely, except that counts 0 to 9 are considered to be +% the page and subpage numbers (since they are displayed during +% output). In this scheme, |\count| 10 always contains the number of the +% highest-numbered counter that has been allocated, |\count| 14 the +% highest-numbered box, etc. Inserts are given numbers 254, 253, etc., +% since they require a |\count|, |\dimen|, |\skip|, and |\box| all with +% the same number; |\count| 20 contains the lowest-numbered insert that +% has been allocated. Of course, |\box|255 is reserved for |\output|; +% |\count|255, |\dimen|255, and |\skip|255 can be used freely. +% +% It is recommended that macro designers always use +% |\global| assignments with respect to registers numbered\\ +% 1, 3, 5, 7, 9,\\ +% and always non-|\global| assignments with respect to registers\\ +% 0, 2, 4, 6, 8, 255.\\ +% This will prevent ``save stack buildup'' that might otherwise occur. +% +% \begin{macrocode} +\count10=22 % allocates \count registers 23, 24, ... +\count11=9 % allocates \dimen registers 10, 11, ... +\count12=9 % allocates \skip registers 10, 11, ... +\count13=9 % allocates \muskip registers 10, 11, ... +\count14=9 % allocates \box registers 10, 11, ... +\count15=9 % allocates \toks registers 10, 11, ... +\count16=-1 % allocates input streams 0, 1, ... +\count17=-1 % allocates output streams 0, 1, ... +\count18=3 % allocates math families 4, 5, ... +\count19=0 % allocates \language codes 1, 2, ... +\count20=255 % allocates insertions 254, 253, ... +% \end{macrocode} +% +% \begin{macro}{\insc@unt} +% \begin{macro}{\allocationnumber} +% The insertion counter and most recent allocation. +% \begin{macrocode} +\countdef\insc@unt=20 +\countdef\allocationnumber=21 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\m@ne} +% The constant $-1$. +% \begin{macrocode} +\countdef\m@ne=22 \m@ne=-1 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\wlog} +% Write on log file (only) +% \begin{macrocode} +\def\wlog{\immediate\write\m@ne} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\count@} +% \begin{macro}{\dimen@} +% \begin{macro}{\dimen@i} +% \begin{macro}{\dimen@ii} +% \begin{macro}{\skip@} +% \begin{macro}{\toks@} +% Here are abbreviations for the names of scratch registers +% that don't need to be allocated. +% \begin{macrocode} +\countdef\count@=255 +\dimendef\dimen@=0 +\dimendef\dimen@i=1 % global only +\dimendef\dimen@ii=2 +\skipdef\skip@=0 +\toksdef\toks@=0 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\newcount} +% \begin{macro}{\newdimen} +% \begin{macro}{\newskip} +% \begin{macro}{\newmuskip} +% \begin{macro}{\newbox} +% \begin{macro}{\newread} +% \begin{macro}{\newwrite} +% \begin{macro}{\newlanguage} +% \changes{v1.0c}{1994/03/28} +% {Remove some \cs{outer} declarations.} +% \changes{v1.1h}{1995/04/24} +% {Remove remaining \cs{outer} declarations.} +% Now, we define |\newcount|, |\newbox|, etc. so that you can say +% |\newcount\foo| and |\foo| will be defined (with |\countdef|) to +% be the next counter. +% +% To find out which counter |\foo| is, you can look at +% |\allocationnumber|. +% +% Since there's no |\boxdef| command, |\chardef| is used to define a +% |\newbox|, |\newinsert|, |\newfam|, and so on. +% +% \LaTeX\ change: remove |\outer| from |\newcount| and |\newdimen| (FMi) +% This is necessary to use |\newcount| inside |\if...| +% later on. Also remove from |\newskip|, |\newbox| +% |\newwrite| and |\newfam| (DPC) to save later redefinition. +% \changes{v2.0a}{2014/12/30}{New engine-specific allocation scheme (latexrelease)} +% \changes{v2.0f}{2015/03/02}{allow 255 math groups in Unicode engines} +% \changes{v2.0h}{2015/06/19}{Use $-1$ for first range to get contiguous allocation} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\newcount}{Extended Allocation}% +% \end{macrocode} +% +% \begin{macrocode} +\def\newcount {\e@alloc\count \countdef {\count10}\insc@unt\float@count} +\def\newdimen {\e@alloc\dimen \dimendef {\count11}\insc@unt\float@count} +\def\newskip {\e@alloc\skip \skipdef {\count12}\insc@unt\float@count} +\def\newmuskip + {\e@alloc\muskip\muskipdef{\count13}\m@ne\e@alloc@top} +% \end{macrocode} +% For compatibility use |\chardef| in the classical range. +% \begin{macrocode} +\def\newbox {\e@alloc\box + {\ifnum\allocationnumber<\@cclvi + \expandafter\chardef + \else + \expandafter\e@alloc@chardef + \fi} + {\count14}\insc@unt\float@count} +\def\newtoks {\e@alloc\toks \toksdef{\count15}\m@ne\e@alloc@top} +\def\newread {\e@alloc\read \chardef{\count16}\m@ne\sixt@@n} +% \end{macrocode} +% +% \changes{v2.2a}{2015/11/18} +% {Extended stream allocation in luatex (0.85)} +% \changes{v2.2b}{2015/11/19} +% {Only extend allocation of write streams (see luatex list)} +% \changes{v2.3c}{2017/04/10} +% {Correction to code to skip write18 in luatex} +% Skip |\write18| due to its traditional use as a shell-escape. +% \begin{macrocode} +\ifx\directlua\@undefined + \def\newwrite {\e@alloc\write \chardef{\count17}\m@ne\sixt@@n} +\else + \def\newwrite {\e@alloc\write + {\ifnum\allocationnumber=18 + \advance\count17\@ne + \allocationnumber\count17 % + \fi + \global\chardef}% + {\count17}% + \m@ne + {128}} +\fi +% \end{macrocode} +% +% \begin{macrocode} +\def\new@mathgroup + {\e@alloc\mathgroup\chardef{\count18}\m@ne\e@mathgroup@top} +\let\newfam\new@mathgroup +% \end{macrocode} +% +% \changes{v2.3a}{2016/10/16}{Allow languages up to 16383 in luatex} +% \begin{macrocode} +\ifx\directlua\@undefined + \def\newlanguage {\e@alloc\language \chardef{\count19}\m@ne\@cclvi} +\else + \def\newlanguage {\e@alloc\language \chardef{\count19}\m@ne{16384}} +\fi +%</2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\newcount}{Extended Allocation}% +%<latexrelease>\def\newcount{\alloc@0\count\countdef\insc@unt} +%<latexrelease>\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} +%<latexrelease>\def\newskip{\alloc@2\skip\skipdef\insc@unt} +%<latexrelease>\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi} +%<latexrelease>\def\newbox{\alloc@4\box\chardef\insc@unt} +%<latexrelease>\def\newtoks{\alloc@5\toks\toksdef\@cclvi} +%<latexrelease>\def\newread{\alloc@6\read\chardef\sixt@@n} +%<latexrelease>\def\newwrite{\alloc@7\write\chardef\sixt@@n} +%<latexrelease>\def\new@mathgroup{\alloc@8\fam\chardef\sixt@@n} +%<latexrelease>\def\newlanguage{\alloc@9\language\chardef\@cclvi} +%<latexrelease>\let\newfam\new@mathgroup +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +%\begin{macro}{\e@alloc@chardef} +% \changes{v2.0a}{2014/12/30}{macro added} +%\begin{macro}{\e@alloc@top} +% \changes{v2.0a}{2014/12/30}{macro added} +% The upper limit of extended registers, which leaves +% this number (eg |\dimen32767|) always unallocated +% by these macros. +% cf traditional |\dimen255|. +% \begin{macrocode} +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\e@alloc@chardef}{Extended Allocation}% +% \end{macrocode} +% +% \begin{macrocode} +\ifx\directlua\@undefined + \ifx\widowpenalties\@undefined +% \end{macrocode} +% classic tex has $2^8$ registers. +% \begin{macrocode} + \mathchardef\e@alloc@top=255 + \let\e@alloc@chardef\chardef + \else +% \end{macrocode} +% etex and xetex have $2^{15}$ registers. +% \begin{macrocode} + \mathchardef\e@alloc@top=32767 + \let\e@alloc@chardef\mathchardef + \fi +\else +% \end{macrocode} +% luatex has $2^{16}$ registers. +% \begin{macrocode} + \chardef\e@alloc@top=65535 + \let\e@alloc@chardef\chardef +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\e@alloc@chardef}{Extended Allocation}% +%<latexrelease>\let\e@alloc@top\@undefined +%<latexrelease>\let\e@alloc@chardef\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% \end{macro} +% +%\begin{macro}{\e@mathgroup@top} +% \changes{v2.0f}{2015/03/02}{macro added} +% The upper limit of extended math groups (|\fam|) +% 16 in classic \TeX\ and e-\TeX, but 256 in Unicode TeX variants. +% \begin{macrocode} +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\e@mathgroup@top}{Extended Allocation}% +% \end{macrocode} +% +% \begin{macrocode} +\ifx\Umathcode\@undefined +% \end{macrocode} +% classic and e tex have 16 fam (0--15). +% \begin{macrocode} + \chardef\e@mathgroup@top=16 +\else +% \end{macrocode} +% xetex and luatex have 256 fam (0--255). +% \begin{macrocode} + \chardef\e@mathgroup@top=256 +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\e@mathgroup@top}{Extended Allocation}% +%<latexrelease>\let\e@mathgroup@top\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\e@alloc} +% \changes{v2.0a}{2014/12/30}{macro added} +% A modified version of |\alloc@| that +% takes the count register rather than just the final digit of its number +% (assuming |\count|$1x$). +% It also has an extra argument to give the top of the extended range. +% +% | #1 #2 #3 #4 #5 #6 | +% +% | \e@alloc type defcmd current top extended-top newname| +% +% Note that if just a single allocation range is required +% (not omitting a range up to 255 for inserts) then $-1$ +% should be used for the first upper bound argument, |#4|. +% +% \begin{macrocode} +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/01/01}{\e@alloc}{Extended Allocation}% +% \end{macrocode} +% +% \changes{v2.0h}{2015/06/19}{extra braces in case arguments not single token} +% \begin{macrocode} +\def\e@alloc#1#2#3#4#5#6{% + \global\advance#3\@ne + \e@ch@ck{#3}{#4}{#5}#1% + \allocationnumber#3\relax + \global#2#6\allocationnumber + \wlog{\string#6=\string#1\the\allocationnumber}}% +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\e@alloc}{Extended Allocation}% +%<latexrelease>\let\e@alloc\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\e@ch@ck} +% \changes{v2.0a}{2014/12/30}{macro added} +% Extended check command. +% If the first range is exceeded, bump to 256 (or 266 for counts) +% and try again, testing the extended range. +%\begin{macro}{\extrafloats} +% \changes{v2.0a}{2014/12/30}{macro added} +% \changes{v2.0c}{2015/01/23}{reserve counts 256--265} +% Allocate matching registers from the top of the extended range +% and add to |\@freelist|. +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/10/01} +%<latexrelease> {\e@ch@ck}{Extended Allocation (checking)}% +% \end{macrocode} +% +% \begin{macrocode} +\gdef\e@ch@ck#1#2#3#4{% + \ifnum#1<#2\else +% \end{macrocode} +% +% If we've reached the classical top limit, bump to 256 +% or 266 for counts (count 256--265 are reserved by the allocation +% system). +% \changes{v2.1b}{2015/10/27} +% {Use global assignment when switching to extended range} +% \begin{macrocode} + \ifnum#1=#2\relax + \global#1\@cclvi + \ifx\count#4\global\advance#1 10 \fi + \fi +% \end{macrocode} +% Check we are below the extended limit. +% \changes{v2.0i}{2015/08/06} +% {Add \cs{string} in case argument is not an unexpandable primitive} +% \begin{macrocode} + \ifnum#1<#3\relax + \else + \errmessage{No room for a new \string#4}% + \fi + \fi}% +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\e@ch@ck}{Extended Allocation (checking)}% +%<latexrelease>\gdef\e@ch@ck#1#2#3#4{% +%<latexrelease> \ifnum#1<#2\else +%<latexrelease> \ifnum#1=#2\relax +%<latexrelease> #1\@cclvi +%<latexrelease> \ifx\count#4\advance#1 10 \fi +%<latexrelease> \fi +%<latexrelease> \ifnum#1<#3\relax +%<latexrelease> \else +%<latexrelease> \errmessage{No room for a new #4}% +%<latexrelease> \fi +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\e@ch@ck}{Extended Allocation (checking)}% +%<latexrelease>\let\e@ch@ck\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\extrafloats}{Extra floats}% +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\float@count\e@alloc@top +% \end{macrocode} +% +% \begin{macro}{\extrafloats} +% \changes{v2.2c}{2016/07/29}{use \cs{global} \cs{chardef}} +% \begin{macrocode} +\ifx\numexpr\@undefined +% \end{macrocode} +% In classic TeX use |\newinsert| to allocate float boxes. +% \begin{macrocode} +\def\extrafloats#1{% +\count@#1\relax +\ifnum\count@>\z@ +\newinsert\reserved@a +\global\expandafter\chardef + \csname bx@\the\allocationnumber\endcsname\allocationnumber +\@cons\@freelist{\csname bx@\the\allocationnumber\endcsname}% +\advance\count@\m@ne +\expandafter\extrafloats +\expandafter\count@ +\fi +}% +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% In e-tex take float boxes from the top of the extended range. +% \begin{macrocode} +\def\extrafloats#1{% +\ifnum#1>\z@ +\count@\numexpr\float@count-1\relax + \ch@ck0\count@\count + \ch@ck1\count@\dimen + \ch@ck2\count@\skip + \ch@ck4\count@\box +\global\e@alloc@chardef\float@count\count@ +\global\expandafter\e@alloc@chardef + \csname bx@\the\float@count\endcsname\float@count +\@cons\@freelist{\csname bx@\the\float@count\endcsname}% +\expandafter +\extrafloats\expandafter{\numexpr#1-1\relax}% +\fi}% +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\extrafloats}{Extra floats}% +%<latexrelease>\let\float@count\@undefined +%<latexrelease>\let\extrafloats\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\alloc@} +% \begin{macrocode} +\def\alloc@#1#2#3#4#5{\global\advance\count1#1\@ne + \ch@ck#1#4#2% + \allocationnumber\count1#1% + \global#3#5\allocationnumber + \wlog{\string#5=\string#2\the\allocationnumber}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\newinsert} +% \changes{v2.1a}{2015/08/30}{new \cs{newinsert} implementation} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2015/10/01} +%<latexrelease> {\newinsert}{Extended \newinsert}% +% \end{macrocode} +% \begin{macrocode} +\ifx\numexpr\@undefined +% \end{macrocode} +% If e-\TeX\ is not available use the original plain \TeX\ +% definition of |\newinsert|. +% \begin{macrocode} +\def\newinsert#1{\global\advance\insc@unt \m@ne + \ch@ck0\insc@unt\count + \ch@ck1\insc@unt\dimen + \ch@ck2\insc@unt\skip + \ch@ck4\insc@unt\box + \allocationnumber\insc@unt + \global\chardef#1\allocationnumber + \wlog{\string#1=\string\insert\the\allocationnumber}} +% \end{macrocode} +% \begin{macrocode} +\else +% \end{macrocode} +% The highest register allowed with |\insert|. +% \begin{macrocode} +\ifx\directlua\@undefined + \chardef\e@insert@top255 +\else + \chardef\e@insert@top\e@alloc@top +\fi +% \end{macrocode} +% If the classic registers are exausted, take an insert from the free float list +% and use |\extrafloats| to add a new float to that list. +% \changes{v2.2c}{2016/07/29}{fix for tlb-newinsert-001} +% \begin{macrocode} +\def\newinsert#1{% +\@tempswafalse +\global\advance\insc@unt\m@ne +\ifnum\count10<\insc@unt +\ifnum\count11<\insc@unt +\ifnum\count12<\insc@unt +\ifnum\count14<\insc@unt + \@tempswatrue +\fi\fi\fi\fi +\if@tempswa +\allocationnumber\insc@unt +\else +\global\advance\insc@unt\@ne + \extrafloats\@ne + \@next\@currbox\@freelist + {\ifnum\@currbox<\e@insert@top + \allocationnumber\@currbox + \else + \ch@ck0\m@ne\insert + \fi}% + {\ch@ck0\m@ne\insert}% +\fi +\global\chardef#1\allocationnumber +\wlog{\string#1=\string\insert\the\allocationnumber}% +} +% \end{macrocode} +% \begin{macrocode} +\fi +%</2ekernel|latexrelease> +% \end{macrocode} +% +% \begin{macrocode} +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\newinsert}{Extended \newinsert}% +%<latexrelease>\let\e@insert@top\@undefined +%<latexrelease>\def\newinsert#1{\global\advance\insc@unt \m@ne +%<latexrelease> \ch@ck0\insc@unt\count +%<latexrelease> \ch@ck1\insc@unt\dimen +%<latexrelease> \ch@ck2\insc@unt\skip +%<latexrelease> \ch@ck4\insc@unt\box +%<latexrelease> \allocationnumber\insc@unt +%<latexrelease> \global\chardef#1\allocationnumber +%<latexrelease> \wlog{\string#1=\string\insert\the\allocationnumber}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ch@ck} +% \begin{macrocode} +\gdef\ch@ck#1#2#3{% + \ifnum\count1#1<#2\else + \errmessage{No room for a new #3}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \changes{v2.0h}{2015/06/19}{delete spurious old definition of \cs{newtoks}} +% \begin{macro}{\newhelp} +% \begin{macrocode} +\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxdimen} +% \begin{macro}{\hideskip} +% Here are some examples of allocation. +% \begin{macrocode} +\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen> +\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\p@} +% \begin{macro}{\z@} +% \begin{macro}{\z@skip} +% \begin{macro}{\voidb@x} +% \begin{macrocode} +\newdimen\p@ \p@=1pt % this saves macro space and time +\newdimen\z@ \z@=0pt % can be used both for 0pt and 0 +\newskip\z@skip \z@skip=0pt plus0pt minus0pt +\newbox\voidb@x % permanently void box register +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Assign initial values to \TeX's parameters +% +% \begin{macrocode} +\message{parameters,} +% \end{macrocode} +% +% All of \TeX's numeric parameters are listed here, +% but the code is commented out if no special value needs to be set. +% INITEX makes all parameters zero except where noted. +% +% \begin{oldcomments} +% \begin{macrocode} +\pretolerance=100 +\tolerance=200 % INITEX sets this to 10000 +\hbadness=1000 +\vbadness=1000 +\linepenalty=10 +\hyphenpenalty=50 +\exhyphenpenalty=50 +\binoppenalty=700 +\relpenalty=500 +\clubpenalty=150 +\widowpenalty=150 +\displaywidowpenalty=50 +\brokenpenalty=100 +\predisplaypenalty=10000 +% \end{macrocode} +% \postdisplaypenalty=0 +% \interlinepenalty=0 +% \floatingpenalty=0, set during \insert +% \outputpenalty=0, set before TeX enters \output +% \begin{macrocode} +\doublehyphendemerits=10000 +\finalhyphendemerits=5000 +\adjdemerits=10000 +% \end{macrocode} +% \looseness=0, cleared by TeX after each paragraph +% \pausing=0 +% \holdinginserts=0 +% \tracingonline=0 +% \tracingmacros=0 +% \tracingstats=0 +% \tracingparagraphs=0 +% \tracingpages=0 +% \tracingoutput=0 +% \begin{macrocode} +\tracinglostchars=1 +% \end{macrocode} +% \tracingcommands=0 +% \tracingrestores=0 +% \language=0 +% \begin{macrocode} +\uchyph=1 +% \end{macrocode} +% \lefthyphenmin=2 \righthyphenmin=3 set below +% \globaldefs=0 +% \maxdeadcycles=25 % INITEX does this +% \hangafter=1 % INITEX does this, also TeX after each paragraph +% \fam=0 +% \mag=1000 % INITEX does this +% \escapechar=`\\ % INITEX does this +% \begin{macrocode} +\defaulthyphenchar=`\- +\defaultskewchar=-1 +% \end{macrocode} +% \endlinechar=`\^^M % INITEX does this +% \newlinechar=-1 \LaTeX\ sets this in ltdefns.dtx. +% \begin{macrocode} +\delimiterfactor=901 +% \end{macrocode} +% \time=now % TeX does this at beginning of job +% \day=now % TeX does this at beginning of job +% \month=now % TeX does this at beginning of job +% \year=now % TeX does this at beginning of job +% +% \end{oldcomments} +% In \LaTeX{} we don't want box information in the transcript +% unless we do a full tracing. +% \changes{v1.0g}{1994/04/28}{Turn off overfull box tracing in log} +% +% \begin{macrocode} +\showboxbreadth=-1 +\showboxdepth=-1 +\errorcontextlines=-1 +% \end{macrocode} +% +% \begin{macrocode} +\hfuzz=0.1pt +\vfuzz=0.1pt +\overfullrule=5pt +\maxdepth=4pt +\splitmaxdepth=\maxdimen +\boxmaxdepth=\maxdimen +% \end{macrocode} +% +% \begin{oldcomments} +% \lineskiplimit=0pt, changed by \normalbaselines +% \begin{macrocode} +\delimitershortfall=5pt +\nulldelimiterspace=1.2pt +\scriptspace=0.5pt +% \end{macrocode} +% \mathsurround=0pt +% \predisplaysize=0pt, set before TeX enters $$ +% \displaywidth=0pt, set before TeX enters $$ +% \displayindent=0pt, set before TeX enters $$ +% \begin{macrocode} +\parindent=20pt +% \end{macrocode} +% \hangindent=0pt, zeroed by TeX after each paragraph +% \hoffset=0pt +% \voffset=0pt +% +% \baselineskip=0pt, changed by \normalbaselines +% \lineskip=0pt, changed by \normalbaselines +% \begin{macrocode} +\parskip=0pt plus 1pt +\abovedisplayskip=12pt plus 3pt minus 9pt +\abovedisplayshortskip=0pt plus 3pt +\belowdisplayskip=12pt plus 3pt minus 9pt +\belowdisplayshortskip=7pt plus 3pt minus 4pt +% \end{macrocode} +% \leftskip=0pt +% \rightskip=0pt +% \begin{macrocode} +\topskip=10pt +\splittopskip=10pt +% \end{macrocode} +% \tabskip=0pt +% \spaceskip=0pt +% \xspaceskip=0pt +% \begin{macrocode} +\parfillskip=0pt plus 1fil +% \end{macrocode} +% \end{oldcomments} +% +% +% \begin{macro}{\normalbaselineskip} +% \begin{macro}{\normallineskip} +% \begin{macro}{\normallineskiplimit} +% We also define special registers that function like parameters: +% \begin{macrocode} +\newskip\normalbaselineskip \normalbaselineskip=12pt +\newskip\normallineskip \normallineskip=1pt +\newdimen\normallineskiplimit \normallineskiplimit=0pt +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\interfootlinepenalty} +% \begin{macrocode} +\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100 +% \end{macrocode} +% \end{macro} +% +% Definitions for preloaded fonts +% +% \begin{macro}{\magstephalf} +% \begin{macro}{\magstep} +% \begin{macrocode} +\def\magstephalf{1095 } +\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or + 2074\or 2488\fi\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% Macros for setting ordinary text +% +% \begin{macro}{\frenchspacing} +% \begin{macro}{\nonfrenchspacing} +% \begin{macrocode} +\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m + \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m} +\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000% + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\normalbaselines} +% \begin{macrocode} +\def\normalbaselines{\lineskip\normallineskip + \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\M} +% \begin{macro}{\I} +% \changes{v1.1m}{1995/09/01}{Use \cs{let} to save space} +% Save a bit of space by using |\let| here. +% \begin{macrocode} +\def\^^M{\ } % control <return> = control <space> +\let\^^I\^^M % same for <tab> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lq} +% \begin{macro}{\rq} +% \begin{macrocode} +\def\lq{`} +\def\rq{'} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\lbrack} +% \begin{macro}{\rbrack} +% \begin{macrocode} +\def\lbrack{[} +\def\rbrack{]} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\aa} +% \begin{macro}{\AA} +% These are not from plain.tex but they are similar to other commands +% found here and nowhere else, being alternate input forms for +% characters. +% \begin{macrocode} +\def \aa {\r a} +\def \AA {\r A} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\endgraf} +% \begin{macro}{\endline} +% \begin{macrocode} +\let\endgraf=\par +\let\endline=\cr +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\space} +% \begin{macrocode} +\def\space{ } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\empty} +% \changes{v1.1m}{1995/09/01}{Use \cs{let} to save space} +% This probably ought to go altogether, but let it to the \LaTeX\ +% version to save space. +% \begin{macrocode} +\let\empty\@empty +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\null} +% \begin{macrocode} +\def\null{\hbox{}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\bgroup} +% \begin{macro}{\egroup} +% \begin{macrocode} +\let\bgroup={ +\let\egroup=} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\obeylines} +% \begin{macro}{\obeyspaces} +% In |\obeylines|, we say |\let^^M=\par| instead of |\def^^M{\par}| +% since this allows, for example, |\let\par=\cr \obeylines \halign{...| +% \begin{macrocode} +{\catcode`\^^M=\active % these lines must end with % + \gdef\obeylines{\catcode`\^^M\active \let^^M\par}% + \global\let^^M\par} % this is in case ^^M appears in a \write +\def\obeyspaces{\catcode`\ \active} +{\obeyspaces\global\let =\space} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\loop} +% \changes{v1.0h}{1994/05/16}{Use Kabelschacht method} +% \begin{macro}{\iterate} +% \changes{v1.1b}{1994/11/10} +% {(CAR) added extra \cs{relax}} +% \changes{v1.1m}{1994/05/26} +% {(CAR) added \cs{long}} +% \begin{macro}{\repeat} +% We use Kabelschacht's method of doing loops, see TUB 8\#2 (1987). +% (unless that breaks something :-). It turned out to need an +% extra |\relax|: see pr/642 (|\loop| could do one iteration too much +% in certain cases). +% \begin{macrocode} +\long\def \loop #1\repeat{% + \def\iterate{#1\relax % Extra \relax + \expandafter\iterate\fi + }% + \iterate + \let\iterate\relax +} +% \end{macrocode} +% This setting of |\repeat| is needed to make |\loop...\if...\repeat| +% skippable within another |\if...|. +% \begin{macrocode} +\let\repeat=\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \LaTeX\ defines |\smallskip|, etc.\ in |ltspace.dtx|. +% +% \begin{macro}{\nointerlineskip} +% \begin{macro}{\offinterlineskip} +% \changes{v1.1n}{1995/07/02}{Replaced 1000 by \cs{@m}} +% \begin{macrocode} +\def\nointerlineskip{\prevdepth-\@m\p@} +\def\offinterlineskip{\baselineskip-\@m\p@ + \lineskip\z@ \lineskiplimit\maxdimen} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\vglue} +% \begin{macro}{\hglue} +% \begin{macrocode} +\def\vglue{\afterassignment\vgl@\skip@=} +\def\vgl@{\par \dimen@\prevdepth \hrule \@height\z@ + \nobreak\vskip\skip@ \prevdepth\dimen@} +\def\hglue{\afterassignment\hgl@\skip@=} +\def\hgl@{\leavevmode \count@\spacefactor \vrule \@width\z@ + \nobreak\hskip\skip@ \spacefactor\count@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \LaTeX\ defines |~| in |ltdefns.dtx|. +% +% \begin{macro}{\slash} +% This generates a |/| acting a bit like |-| but still allows hyphenation +% in the word part preceding it (but not after). +% \begin{macrocode} +\def\slash{/\penalty\exhyphenpenalty} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\break} +% \begin{macro}{\nobreak} +% \begin{macro}{\allowbreak} +% \begin{macrocode} +\def\break{\penalty-\@M} +\def\nobreak{\penalty \@M} +\def\allowbreak{\penalty \z@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\filbreak} +% \begin{macro}{\goodbreak} +% \begin{macrocode} +\def\filbreak{\par\vfil\penalty-200\vfilneg} +\def\goodbreak{\par\penalty-500 } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\eject} +% \changes{v1.1s}{1995/10/17}{Move \cs{supereject} to compat file} +% Define |\eject| as in plain \TeX\ but define |\supereject| only in +% the compatibility file. +% \begin{macrocode} +\def\eject{\par\break} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\removelastskip} +% \begin{macrocode} +\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\smallbreak} +% \begin{macro}{\medbreak} +% \begin{macro}{\bigbreak} +% \begin{macrocode} +\def\smallbreak{\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi} +\def\medbreak{\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi} +\def\bigbreak{\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\m@th} +% \changes{v1.0h}{1994/05/16}{Remove unnecessary space} +% \begin{macrocode} +\def\m@th{\mathsurround\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\underbar} +% Due to \LaTeX's redefinition of |\underline| plain \TeX's +% |\underbar| can be done in a simpler fashion (but do we +% need it at all?). +% \changes{v1.1m}{1994/05/26} +% {(CAR/FMi) changed to use box \cs{tw@}} +% \changes{v1.1p}{1994/05/26} +% {(DPC) changed to use \cs{sbox}} +% \begin{macrocode} +\def\underbar#1{\underline{\sbox\tw@{#1}\dp\tw@\z@\box\tw@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\strutbox} +% \begin{macro}{\strut} +% \LaTeX\ sets |\strutbox| in |\set@fontsize|. +% \begin{macrocode} +\newbox\strutbox +\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\hidewidth} +% For alignment entries that can stick out. +% \begin{macrocode} +\def\hidewidth{\hskip\hideskip} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0h}{1994/05/16}{Remove unnecessary def for \cs{item}} +% \changes{v1.1i}{1995/04/27} +% {Move \cs{hang} and \cs{textindent} to latex209.def} +% \changes{RmS}{1991/11/04}{Removed \cs{itemitem} since never +% needed/useful with \LaTeX.} +% +% \begin{macro}{\narrower} +% \begin{macrocode} +\def\narrower{% + \advance\leftskip\parindent + \advance\rightskip\parindent} +% \end{macrocode} +% \end{macro} +% +% \changes{v1.1c}{1994/11/12}{Comment out more encoding specific +% commands} +% \LaTeX\ defines |\ae| and similar commands elsewhere. +% +% \begin{macrocode} +\chardef\%=`\% +\chardef\&=`\& +\chardef\#=`\# +% \end{macrocode} +% +% Most text commands are actually encoding specific and therefore +% defined later, so commented out or removed from this file. +% \changes{v1.0h}{1994/05/16}{Comment out encoding specific commands} +% +% \begin{macro}{\leavevmode} +% begins a paragraph, if necessary +% \begin{macrocode} +\def\leavevmode{\unhbox\voidb@x} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mathhexbox} +% \begin{macrocode} +\def\mathhexbox#1#2#3{\mbox{$\m@th \mathchar"#1#2#3$}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\ialign} +% \begin{macrocode} +\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\oalign} +% \begin{macro}{\o@lign} +% \begin{macro}{\ooalign} +% \begin{macrocode} +\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex% + \ialign{##\crcr#1\crcr}}} +\def\o@lign{\lineskiplimit\z@ \oalign} +\def\ooalign{\lineskiplimit-\maxdimen \oalign} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\sh@ft} +% \changes{v1.1t}{1996/07/26}{replace \cs{dimen}\cs{z@} by +% \cs{dimen@}} +% \changes{v1.1y}{2005/09/27}{Macro no longer used but +% left for compatibility} +% The definition of this macro in plain.tex was improved in +% about 1997; but as a result its usage was changed and its new +% definition is not appropriate for \LaTeX{}. +% +% Since the version given here has been in use by +% \LaTeX{} for many years it does not seem prudent to remove it now. +% As far as we can tell it has only been used to define~|\b| and~|\d| +% but this cannot be certain. +% \begin{macrocode} +\def\sh@ft#1{\dimen@.00#1ex\multiply\dimen@\fontdimen1\font + \kern-.0156\dimen@} % compensate for slant in lowered accents +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ltx@sh@ft} +% \changes{v1.1y}{2005/09/27}{New macro} +% This is the \LaTeX{} version of the second incarnation of the plain +% macro |\sh@ft|, which takes a dimension as its argument. It shifts +% a pseudo-accent horizontally by an amount proportional to the product +% of its argument and the slant-per-point (fontdimen 1). +% +% \begin{macrocode} +\def\ltx@sh@ft #1{% + \dimen@ #1% + \kern \strip@pt + \fontdimen1\font \dimen@ + } % kern by #1 times the current slant +% \end{macrocode} +% \end{macro} +% +% +% +% \LaTeX{} change: the text commands such as +% |\d|, |\b|, |\c|, |\copyright|,~|\TeX| +% are now defined elsewhere. +% +% \changes{LaTeX2e} +% {1993/11/29}{All accents in decimals; suggested by Paul Taylor} +% \changes{v1.0d}{1994/04/12} +% {Define \cs{@acci}} +% \changes{v1.0h}{1994/05/16}{Remove \cs{@acci} and friends again} +% +% \LaTeX{} change: Make |\t| work in a moving argument. +% Now defined elsewhere. +% +% \begin{macro}{\hrulefill} +% \begin{macro}{\dotfill} +% \LaTeX\ change: |\kern\z@| added to end of +% |\hrulefill| and |\dotfill| +% to make them work in `tabular' and `array' environments. +% (Change made 24 July 1987). +% \LaTeX\ change: |\leavevmode| added at beginning of +% |\dotfill| and |\hrulefill| +% so that they work as expected in vertical mode. +% \begin{macrocode} +\def\hrulefill{\leavevmode\leaders\hrule\hfill\kern\z@} +% \end{macrocode} +% The box in |\dotfill| originally contained (in plain.tex):\\ +% |\mkern 1.5mu .\mkern 1.5mu|;\\ +% the width of .44em differs from this +% by .04pt which is probably an acceptable difference within leaders. +% \changes{v1.1u}{1996/10/28}{Removed math mode} +% \changes{v1.1v}{1996/10/29}{Got arithmetic correct (CAR)} +% \changes{v1.1w}{1996/11/03}{Saved tokens by using \cs{hb@xt@}} +% \begin{macrocode} +\def\dotfill{% + \leavevmode + \cleaders \hb@xt@ .44em{\hss.\hss}\hfill + \kern\z@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% INITEX sets |\sfcode x=1000| for all x, except that |\sfcode`X=999| +% for uppercase letters. The following changes are needed: +% \begin{macrocode} +\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0 +% \end{macrocode} +% The |\nonfrenchspacing| macro will make further changes to +% |\sfcode| values. +% +% +% Definitions related to output +% +% +% \changes{v1.1k}{1995/05/22}{Definitions of \cs{footins} and +% \cs{footnoterule} moved to ltfloat.} +% +% +% |\magnification| doesn't work in \LaTeX. +%\begin{verbatim} +%\def\magnification{\afterassignment\m@g\count@} +%\def\m@g{\mag\count@ +% \hsize6.5truein\vsize8.9truein\dimen\footins8truein} +%\end{verbatim} +% +% \begin{macro}{\showoverfull} +% \changes{v0.1k ltfinal}{1994/05/19}{used \cs{@ne} not 1} +% The following commands are used in debugging: +% \begin{macrocode} +\def\showoverfull{\tracingonline\@ne} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\showoutput} +% \changes{v0.1k ltfinal}{1994/05/19} +% {used \cs{maxdimen} not 99999} +% \changes{v1.1n}{1995/07/02}{Use \cs{showoverfull} to save space} +% \changes{v1.1x}{2002/02/24}{Use newly added \cs{loggingoutput}} +% \begin{macro}{\loggingoutput} +% \changes{v1.1x}{2002/02/24}{Macro added} +% \begin{macrocode} +\gdef\loggingoutput{\tracingoutput\@ne + \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode} +\gdef\showoutput{\loggingoutput\showoverfull} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\tracingall} +% \changes{LaTeX209}{1991/08/26}{Added +% \cs{errorcontextlines}!=\cs{maxdimen}, suggested by J. Schrod} +% \changes{v1.1n}{1995/07/02}{Use \cs{showoutput} to save space} +% \changes{v1.1x}{2002/02/24}{Use newly added \cs{loggingoutput}} +% \begin{macro}{\loggingall} +% \changes{v1.1x}{2002/02/24}{Macro added} +% \changes{v2.0b}{2012/01/20}{etex tracing if available} +% \changes{v2.0d}{2015/02/20}{Spell commands correctly :-)} +% \changes{v2.0g}{2015/03/10}{Reorganise to be less noisy} +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}{\loggingall}{etex tracing}% +%<*2ekernel|latexrelease> +\ifx\tracingscantokens\@undefined +\gdef\loggingall{% + \tracingstats\tw@ + \tracingpages\@ne + \tracinglostchars\@ne + \tracingparagraphs\@ne + \errorcontextlines\maxdimen + \loggingoutput + \tracingmacros\tw@ + \tracingcommands\tw@ + \tracingrestores\@ne + }% +\else +\gdef\loggingall{% + \tracingstats\tw@ + \tracingpages\@ne + \tracinglostchars\tw@ + \tracingparagraphs\@ne + \tracinggroups\@ne + \tracingifs\@ne + \tracingscantokens\@ne + \tracingnesting\@ne + \errorcontextlines\maxdimen + \loggingoutput + \tracingmacros\tw@ + \tracingcommands\thr@@ + \tracingrestores\@ne + \tracingassigns\@ne +}% +\fi +\gdef\tracingall{\showoverfull\loggingall} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\loggingall}{etex tracing}% +%<latexrelease>\gdef\loggingall{\tracingcommands\tw@\tracingstats\tw@ +%<latexrelease> \tracingpages\@ne\tracinglostchars\@ne +%<latexrelease> \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne +%<latexrelease> \errorcontextlines\maxdimen\loggingoutput} +%<latexrelease> \gdef\tracingall{\loggingall\showoverfull} +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\tracingnone} +% \changes{v2.0g}{2015/03/10}{macro added} +% \begin{macro}{\hideoutput} +% \changes{v2.0g}{2015/03/10}{macro added} +% \begin{macrocode} +%<latexrelease>\IncludeInRelease{2015/01/01}{\tracingnone}% +%<latexrelease> {turn off etex tracing}% +%<*2ekernel|latexrelease> +\ifx\tracingscantokens\@undefined +\def\tracingnone{% + \tracingonline\z@ + \tracingcommands\z@ + \showboxdepth\m@ne + \showboxbreadth\m@ne + \tracingoutput\z@ + \errorcontextlines\m@ne + \tracingrestores\z@ + \tracingparagraphs\z@ + \tracingmacros\z@ + \tracinglostchars\@ne + \tracingpages\z@ + \tracingstats\z@ +}% +\else +\def\tracingnone{% + \tracingassigns\z@ + \tracingrestores\z@ + \tracingonline\z@ + \tracingcommands\z@ + \showboxdepth\m@ne + \showboxbreadth\m@ne + \tracingoutput\z@ + \errorcontextlines\m@ne + \tracingnesting\z@ + \tracingscantokens\z@ + \tracingifs\z@ + \tracinggroups\z@ + \tracingparagraphs\z@ + \tracingmacros\z@ + \tracinglostchars\@ne + \tracingpages\z@ + \tracingstats\z@ +}% +\fi +% \end{macrocode} +% +% \begin{macrocode} +\def\hideoutput{% + \tracingoutput\z@ + \showboxbreadth\m@ne + \showboxdepth\m@ne + \tracingonline\m@ne +}% +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}{\tracingnone}% +%<latexrelease> {turn off etex tracing}% +%<latexrelease>\let\tracingnone\@undefined +%<latexrelease>\let\hideoutput\@undefined +%<latexrelease>\EndIncludeInRelease +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \LaTeX\ change: |\showhyphens| Defined later. +% +% Punctuation affects the spacing. +% \begin{macrocode} +%<*2ekernel> +\nonfrenchspacing +%</2ekernel> +% \end{macrocode} +% +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltsect.dtx b/Master/texmf-dist/source/latex-dev/base/ltsect.dtx new file mode 100644 index 00000000000..cb1c6d2c304 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltsect.dtx @@ -0,0 +1,948 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltsect.dtx +%<*driver> +% \fi +\ProvidesFile{ltsect.dtx}[2018/09/26 v1.1c LaTeX Kernel (Sectioning)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltsect.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Tobias Oetiker\thanks{Tobi updated + the comments to `doc' conventions}\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0o}{1995/05/07}{Use \cs{hb@xt@}} +% \changes{v1.0y}{1996/10/31}{Corrected and tidied documentation; +% removed long lines} +% +% +% \section{Sectioning Commands} +% +% This file defines the declarations such as |\author| which are used +% by |\maketitle|. |\maketitle| itself is defined by each class, not +% in the \LaTeX{} kernel. +% +% The second part of the file defines the generic commands used for +% defining sectioning commands such as |\chapter|. Again the actual +% document level commands are defined in the class files, in terms of +% these commands. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/04}{Initial version, split from latex.dtx} +% \changes{v1.0b}{1994/03/28}{Split further from ltherest.dtx} +% \changes{v1.0d}{1994/05/21}{Use new error commands} +% \changes{v1.0f}{1994/10/12}{Doc. typos} +% \changes{v1.0g}{1994/10/18}{Added \cs{normalcolor}} +% \changes{v1.0i}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% \changes{v1.0m}{1995/05/03}{TO: Promoted documentation to doc.sty +% standard} +% +% \begin{macrocode} +%<*2ekernel> +\message{title,} +% \end{macrocode} +% +% \subsection{The Title} +% +% \DescribeMacro{\title} +% The user defines the title and author by the declarations +% |\title|\marg{name}, +% \DescribeMacro{\author} +% |\author|\marg{name} +% +% \DescribeMacro{\date} +% Similarly the date is declared with +% |\date|\marg{date}. +% +% \DescribeMacro{\thanks} +% Inside these, the |\thanks|\marg{footnote text} command may be used +% to make acknowledgements, notice of address, etc.\ in a footnote. +% \DescribeMacro{\and} +% If there are multiple authors, they have to be separated with the +% |\and| command. +% +% \DescribeMacro{\maketitle} +% And finally, the |\maketitle| command produces the actual title, +% using the information previously saved with the other commands. +% +% \begin{macro}{\title} +% \begin{macro}{\@title} +% \changes{LaTeX2e}{1993/12/11}{Added default} +% |\title| for use in |\maketitle|. If not given |\maketitle| will +% produce an error message. +% \begin{macrocode} +\def\title#1{\gdef\@title{#1}} +\def\@title{\@latex@error{No \noexpand\title given}\@ehc} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\author} +% \begin{macro}{\@author} +% \changes{LaTeX2e}{1993/12/11}{Added default} +% +% |\author| for use in |\maketitle|. If not given |\maketitle| will +% produce a warning message. +% +% \begin{macrocode} +\def\author#1{\gdef\@author{#1}} +\def\@author{\@latex@warning@no@line{No \noexpand\author given}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\date} +% \begin{macro}{\@date} +% |\date| for use in |\maketitle|. If not given |\maketitle| will +% produce |\today| as the default. +% \begin{macrocode} +\def\date#1{\gdef\@date{#1}} +\gdef\@date{\today} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{1.0h}{1994/11/04}{(ASAJ) Added \cs{protected@xdef} to +% \cs{thanks}.} +% \begin{macro}{\thanks} +% \begin{macrocode} +\def\thanks#1{\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{#1}}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@thanks} +% \begin{macrocode} +\let\@thanks\@empty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\and} +% \begin{macrocode} +\def\and{% % \begin{tabular} + \end{tabular}% + \hskip 1em \@plus.17fil% + \begin{tabular}[t]{c}}% % \end{tabular} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\message{sectioning,} +% \end{macrocode} +% \subsection{Sectioning} +% +% +% \begin{macro}{\@secpenalty} +% \begin{macrocode} +\newcount\@secpenalty +\@secpenalty = -300 +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@noskipsec} +% \begin{macro}{\@noskipsectrue} +% \changes{1.0w}{1996/09/29}{Added documentation} +% Way back in 1991 (08/26) FMi \& RmS set the |\@noskipsec| switch +% to true for the preamble and to false in |\document|. +% This was done to trap lists and related text in the preamble but it +% does not catch everything. +% \begin{macrocode} +\newif\if@noskipsec \@noskipsectrue +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@startsection} +% +% The |\@startsection{|\meta{name}|}{|\meta{level}|}{|% +% \meta{indent}|}{|\meta{beforeskip}|}|\\ +% |{|\meta{afterskip}|}{|\meta{style}|}*[|\meta{altheading}% +% |]{|\meta{heading}|}| +% command is the mother of all the user level sectioning commands. +% The part after the |*|, including the |*| is optional. +% +% \begin{description} +% \item[name:] e.g., 'subsection' +% \item[level:] a number, denoting depth of section -- e.g., +% chapter = 0, section = 1, etc. +% \item[indent:] Indentation of heading from left margin +% \item[beforeskip:] Absolute value = skip to leave above the heading. +% If negative, then paragraph indent of text following +% heading is suppressed. +% \item[afterskip:] if positive, then skip to leave below heading, else +% negative of skip to leave to right of run-in heading. +% \item[style:] Commands to set style. Since June 1996 release the +% \emph{last} command in this argument may be a command +% such as |\MakeUppercase| or |\fbox| that takes an +% argument. The section heading will be supplied as the +% argument to this command. So setting |#6| to, say, +% |\bfseries\MakeUppercase| would produce bold, +% uppercase headings. +% \end{description} +% +% If `|*|' is missing, then increment the counter. If it is +% present, then there should be no |[|\meta{altheading}|]| argument. +% The command uses the counter 'secnumdepth'. It contains a pointer +% to the highest section level that is to be numbered. +% +% \textbf{Warning:} +% The |\@startsection| command should be at the same or higher +% grouping level as the text that follows it. For example, you should +% \emph{not} do something like +% \begin{verbatim} +% \def\foo{ \begingroup ... +% \paragraph{...} +% \endgroup} +% \end{verbatim} +% +% Pseudocode for the |\@startsection| command +% \begin{oldcomments} +% \@startsection {NAME}{LEVEL}{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} == +% BEGIN +% IF @noskipsec = T THEN \leavevmode FI +% % true if previous section had no body. +% +% \par +% \@tempskipa := BEFORESKIP +% @afterindent := T +% IF \@tempskipa < 0 THEN \@tempskipa := -\@tempskipa +% @afterindent := F +% FI +% IF @nobreak = true +% THEN \everypar == null +% ELSE \addpenalty{\@secpenalty} +% \addvspace{\@tempskipa} +% FI +% IF * next +% THEN \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE} +% ELSE \@dblarg{\@sect +% {NAME}{LEVEL}{INDENT} +% {BEFORESKIP}{AFTERSKIP}{STYLE}} +% FI +% END +% \end{oldcomments} +% +% \begin{macrocode} +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec \leavevmode \fi + \par + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty\addvspace\@tempskipa + \fi + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}}% + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@sect} +% Pseudocode for the |\@sect| command +% \begin{oldcomments} +% \@sect{NAME}{LEVEL} +% {INDENT}{BEFORESKIP}{AFTERSKIP} +% {STYLE}[ARG1]{ARG2} +% == +% BEGIN +% IF LEVEL > \c@secnumdepth +% THEN \@svsec :=L null +% ELSE \refstepcounter{NAME} +% \@svsec :=L BEGIN \@seccntformat{#1}\relax END +% FI +% IF AFTERSKIP > 0 +% THEN \begingroup +% STYLE +% \@hangfrom{\hskip INDENT\@svsec} +% {\interlinepenalty 10000 ARG2\par} +% \endgroup +% \NAMEmark{ARG1} +% \addcontentsline{toc}{NAME} +% { IF LEVEL > \c@secnumdepth +% ELSE \protect\numberline{\theNAME} FI +% ARG1 } +% ELSE \@svsechd == BEGIN STYLE +% \hskip INDENT\@svsec +% ARG2 +% \NAMEmark{ARG1} +% \addcontentsline{toc}{NAME} +% { IF LEVEL > \c@secnumdepth +% ELSE +% \protect\numberline{\theNAME} +% FI +% ARG1 } +% END +% FI +% \@xsect{AFTERSKIP} +% END +% \end{oldcomments} +% +% \changes{LaTeX2.09}{1992/08/25} +% {(FMi) replaced explicit setting of \cs{@svsec} +% by call to \cs{@seccntformat}} +% \changes{LaTeX2.09}{1993/08/05} +% {(RmS) Made sure that \cs{protect} works correctly in +% expansion of \cs{the} counter} +% \changes{1.0h}{1994/11/04} +% {(ASAJ) Added \cs{protected@edef}.} +% \begin{macrocode} +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% +% \end{macrocode} +% Since |\@seccntformat| might end with an improper |\hskip| which +% is scanning forward for |plus| or |minus| we end the definition +% of |\@svsec| with |\relax| as a precaution. +% \changes{1.0n}{1995/05/06}{Added \cs{relax} after +% \cs{@seccntformat} just in case} +% \begin{macrocode} + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup +% \end{macrocode} +% \changes{v1.0s}{1996/05/21} +% {(DPC) Moved brace to allow commands like +% \cs{MakeUppercase} in 6th argument. +% Changed \cs{par} to \cs{endgraf} to allow non-long +% commands. internal/2148} +% \changes{v1.0t}{1996/06/10} +% {(DPC) Changed \cs{endgraf} to \cs{@@par}} +% This |{| used to be after the argument to |\@hangfrom| but was moved +% here to allow commands such as |\MakeUppercase| to be used at the end +% of |#6|. +% \begin{macrocode} + #6{% + \@hangfrom{\hskip #3\relax\@svsec}% + \interlinepenalty \@M #8\@@par}% + \endgroup + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}% + \else +% \end{macrocode} +% |\relax| added 2 May 90 +% \changes{v1.0s}{1996/05/21} +% {(DPC) Added extra braces for internal/2148} +% \begin{macrocode} + \def\@svsechd{% + #6{\hskip #3\relax + \@svsec #8}% + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7}}% + \fi + \@xsect{#5}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xsect}% +% Pseudocode for the |\@xsect| command +% \begin{oldcomments} +% \@xsect{AFTERSKIP} == +% BEGIN +% IF AFTERSKIP > 0 +% THEN \par \nobreak +% \vskip AFTERSKIP +% \@afterheading +% ELSE @nobreak :=G F +% @noskipsec :=G T +% \everypar{ IF @noskipsec = T +% THEN @noskipsec :=G F +% \clubpenalty := 10000 % local +% \hskip -\parindent +% \begingroup +% \@svsechd +% \endgroup +% \unskip +% \hskip -AFTERSKIP \relax +% %% relax added 14 Jan 91 +% ELSE \clubpenalty := \@clubpenalty % local +% \everypar := NULL +% FI +% } +% FI +% +% END +% \end{oldcomments} +% +% \changes{0.0}{1992/08/19} +% {(RmS) corrected bug: stretch and shrink in argument to +% \cs{hskip} previously not negated} +% \begin{macrocode} +\def\@xsect#1{% + \@tempskipa #1\relax + \ifdim \@tempskipa>\z@ +% \end{macrocode} +% Why not combine |\@sect| and |\@xsect| and save doing the +% same test twice? It is not possible to change this now as these +% have become hooks! +% +% This |\par| seems unnecessary. +% \begin{macrocode} + \par \nobreak + \vskip \@tempskipa + \@afterheading + \else +% \end{macrocode} +% \changes{v1.0u}{1996/07/26}{Removed \cs{global} before +% \cs{@nobreak...}} +% \changes{v1.0x}{1996/10/23}{Replaced \cs{hskip...} with \cs{setbox...} +% as used in \cs{@afterheading}} +% \begin{macrocode} + \@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + {\setbox\z@\lastbox}% + \clubpenalty\@M + \begingroup \@svsechd \endgroup + \unskip + \@tempskipa #1\relax + \hskip -\@tempskipa + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi}% + \fi + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@seccntformat} +% This command formats the section number including the space +% following it. +% \changes{1.0n}{1995/05/06}{Use \cs{quad} instead of \cs{hskip}} +% \begin{macrocode} +\def\@seccntformat#1{\csname the#1\endcsname\quad} +% \end{macrocode} +% \end{macro} +% +% Pseudocode for the |\@ssect| command +% \begin{oldcomments} +% \@ssect{INDENT}{BEFORESKIP}{AFTERSKIP}{STYLE}{ARG} == +% BEGIN +% IF AFTERSKIP > 0 +% THEN \begingroup +% STYLE +% \@hangfrom{\hskip INDENT} +% {\interlinepenalty 10000 ARG\par} +% \endgroup +% ELSE \@svsechd == BEGIN STYLE +% \hskip INDENT +% ARG +% END +% FI +% \@xsect{AFTERSKIP} +% END +% \end{oldcomments} +% +% Pseudocode for the |\@afterheading| command +% \begin{oldcomments} +% \@afterheading == +% BEGIN +% @nobreak :=G true +% \everypar := BEGIN IF @nobreak = T +% THEN @nobreak :=G false +% \clubpenalty := 10000 % local +% IF @afterindent = F +% THEN remove \lastbox +% FI +% ELSE \clubpenalty := \@clubpenalty % local +% \everypar := NULL +% FI +% END +% END +% \end{oldcomments} +% +% +% \begin{macro}{\@ssect} +% \begin{macrocode} +\def\@ssect#1#2#3#4#5{% + \@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + \begingroup +% \end{macrocode} +% \changes{v1.0s}{1996/05/21} +% {(DPC) Moved brace to allow commands like +% \cs{MakeUppercase} in 4th argument. +% Changed \cs{par} to \cs{endgraf} to allow non-long +% commands. internal/2148} +% \changes{v1.0t}{1996/06/10} +% {(DPC) Changed \cs{endgraf} to \cs{@@par}} +% This |{| used to be after the argument to |\@hangfrom| but was moved +% here to allow commands such as |\MakeUppercase| to be used at the end +% of |#4|. +% \begin{macrocode} + #4{% + \@hangfrom{\hskip #1}% + \interlinepenalty \@M #5\@@par}% + \endgroup + \else +% \end{macrocode} +% \changes{v1.0s}{1996/05/21} +% {(DPC) Added extra braces for internal/2148} +% \begin{macrocode} + \def\@svsechd{#4{\hskip #1\relax #5}}% + \fi + \@xsect{#3}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@afterindent} +% \begin{macro}{\@afterindenttrue} +% \begin{macrocode} +\newif\if@afterindent \@afterindenttrue +% \end{macrocode} +% \end{macro}\end{macro} +% +% \begin{macro}{\@afterheading} +% \changes{v1.0v}{1996/08/02}{Removed \cs{global} +% before \cs{@nobreak...}} +% +% This hook is used in setting up custom-built headings in classes.dtx. +% +% \begin{macrocode} +\def\@afterheading{% + \@nobreaktrue + \everypar{% + \if@nobreak + \@nobreakfalse + \clubpenalty \@M + \if@afterindent \else + {\setbox\z@\lastbox}% + \fi + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@hangfrom} +% +% |\@hangfrom{|\meta{text}|}| : Puts \meta{text} in a box, and makes a +% hanging indentation of the following material up to the first +% |\par|. Should be used in vertical mode. +% +% \changes{v1.0a}{1994/03/07}{(DPC)Extra groups for colour} +% \begin{macrocode} +\def\@hangfrom#1{\setbox\@tempboxa\hbox{{#1}}% + \hangindent \wd\@tempboxa\noindent\box\@tempboxa} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@secnumdepth} +% \begin{macro}{\c@tocdepth} +% \begin{macrocode} +\newcount\c@secnumdepth +\newcount\c@tocdepth +% \end{macrocode} +% \end{macro}\end{macro} +% +% \begin{macro}{\secdef} +% +% |\secdef{|\meta{unstarcmds}|}{|\meta{unstarcmds}|}{|% +% \meta{starcmds}|}|\\ +% When defining a |\chapter| or |\section| command without using +% |\@startsection|, you can use |\secdef| as follows: +% \begin{enumerate} +% \item |\def\chapter{| \ldots |\secdef| +% |\|\meta{starcmd} |\|\meta{unstarcmd} |}| +% \item |\def\|\meta{starcmd}|[#1]#2{| \ldots |}| +% |%| Command to define |\chapter[|\ldots|]{|\ldots|}| +% \item |\def\|\meta{unstarcmd}|#1{| \ldots |}| +% |%| Command to define |\chapter*{|\ldots|}| +% \end{enumerate} +% +% \begin{macrocode} +\def\secdef#1#2{\@ifstar{#2}{\@dblarg{#1}}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Initializations} +% \begin{macro}{\sectionmark} +% \begin{macro}{\subsectionmark} +% \begin{macro}{\subsubsectionmark} +% \begin{macro}{\paragraphmark} +% \begin{macro}{\subparagraphmark} +% \changes{v1.0q}{1995/10/25}{Use \cs{let} not \cs{def} to save space.} +% \begin{macrocode} +\let\sectionmark\@gobble +\let\subsectionmark\@gobble +\let\subsubsectionmark\@gobble +\let\paragraphmark\@gobble +\let\subparagraphmark\@gobble +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\message{contents,} +% \end{macrocode} +% +% \subsection{Table of Contents etc.} +% +% \subsubsection{Convention} +% |\tf@|\meta{foo} = file number for output for table foo. +% The file is opened only if |@filesw| = |true|. +% +% \subsubsection{Commands} +% +% +% A |\l@|\meta{type}|{|\meta{entry}|}{|\meta{page}|}| Macro needs to +% defined by document style for making an entry of type \meta{type} +% in a table of contents, etc. E.g., the document style +% should define |\l@chapter|, |\l@section|, etc. +% +% \textbf{Note:} When the |\protect| command is +% used in the \meta{entry} or \meta{text} of one of the commands +% below, it causes the following control sequence to be written on +% the file without being expanded. The sequence will be expanded +% when the table of contents entry is processed. +% +% \textbf{Surprise:} Inside an |\addcontentsline| or |\addtocontents| +% command argument, the commands: |\index|, |\glossary|, and |\label| +% are no-ops . This could cause a problem if the user puts an +% |\index| or |\label| into one of the commands he writes, or into the +% optional `short version' argument of a |\section| or |\caption| +% command. +% +% \begin{macro}{\@starttoc} +% The |\@starttoc|\marg{ext} command is used to define the commands:\\ +% |\tableofcontents|, |\listoffigures|, etc. +% +% For example: +% |\@starttoc{lof}| is used in |\listoffigures|. This command +% reads the |.|\meta{ext} file and sets up to write the new +% |.|\meta{ext} file. +% +% \begin{oldcomments} +% \@starttoc{EXT} == +% BEGIN +% \begingroup +% \makeatletter +% read file \jobname.EXT +% IF @filesw = true +% THEN open \jobname.EXT as file \tf@EXT +% FI +% @nobreak :=G FALSE %% added 24 May 89 +% \endgroup +% END +% \end{oldcomments} +% +% \changes{0.0}{1992/01/14}{(RmS) added \cs{immediate} to \cs{openout} +% as all \cs{write} commands +% are also executed \cs{immediate}} +% \changes{v1.0u}{1996/07/26}{removed \cs{global} +% before \cs{@nobreak...}} +% \begin{macrocode} +\def\@starttoc#1{% + \begingroup + \makeatletter + \@input{\jobname.#1}% + \if@filesw + \expandafter\newwrite\csname tf@#1\endcsname + \immediate\openout \csname tf@#1\endcsname \jobname.#1\relax + \fi + \@nobreakfalse + \endgroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addcontentsline} +% The |\addcontentsline{|\meta{table}|}{|\meta{type}|}{|% +% \meta{entry}|}| command allows the user to add +% his/her own entry to a table of contents, etc. The command adds the +% entry |\contentsline{|\meta{type}|}{|\meta{entry}|}{|\meta{page}|}| +% to the |.|\meta{table} file. +% +% This macro is implemented as an application of |\addtocontents|. +% Note that |\thepage| is not expandable during |\protected@write| +% therefore one gets the page number at the time of the |\shipout|. +% +% \changes{v1.0c}{1994/05/20}{Correct setting of \cs{protect}.} +% \changes{v1.0j}{1995/04/23}{Use \cs{contentsline} internally.} +% \changes{v1.0h}{1994/11/04}{Added \cs{protected@write} to +% \cs{addcontentsline}. ASAJ.} +% \changes{v1.1c}{2018/09/26}{Sometimes mask the endline char when +% writing to files (github/73)} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\addcontentsline}{Mask line endings}% +\def\addcontentsline#1#2#3{% + \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}% +% \end{macrocode} +% We add \cs{protected@file@percent} at the end which is turned om +% \cs{@writefile} into a percent character to mask the newline after +% the closing argument brace. +% \begin{macrocode} + \protected@file@percent}} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\addcontentsline}{Mask line endings}% +%<latexrelease>\def\addcontentsline#1#2#3{% +%<latexrelease> \addtocontents{#1}{\protect\contentsline{#2}{#3}{\thepage}}} +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \changes{v1.0c}{1994/05/20}{Correct setting of \cs{protect}.} +% \changes{v1.0h}{1994/11/04}{Added \cs{protected@write} to +% \cs{addtocontents}. ASAJ.} +% \begin{macro}{\addtocontents} +% +% The |\addtocontents{|\meta{table}|}{|\meta{text}|}| command +% adds \meta{text} to the |.|\meta{table} file, with no +% page number. +% +% \begin{macrocode} +\long\def\addtocontents#1#2{% + \protected@write\@auxout + {\let\label\@gobble \let\index\@gobble \let\glossary\@gobble}% + {\string\@writefile{#1}{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\contentsline} +% The |\contentsline{|\meta{type}|}{|\meta{entry}|}{|\meta{page}|}| +% macro produces a \meta{type} entry in a table of contents, etc. +% It will appear in the |.toc| or other file. For example, +% The entry for subsection 1.4.3 in the table of contents for +% example, might be produced by: +% +% \begin{verbatim} +% \contentsline{subsection} +% {\makebox{30pt}[r]{1.4.3} Gnats and Gnus}{22} +% \end{verbatim} +% +% The |\protect| command causes command sequences to be written +% without expanding them. +% +% \begin{macrocode} +\def\contentsline#1{\csname l@#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% |\@dottedtocline{|\meta{level}|}{|\meta{indent}|}{|\meta{numwidth}% +% |}{|\meta{title}|}{|\meta{page}|}|: +% Macro to produce a table of contents line with the following +% parameters: +% \begin{description} +% \item[level] If \meta{level} $>$ |\c@tocdepth|, then no line +% produced. +% \item[indent] Total indentation from the left margin. +% \item[numwidth] Width of box for number if the \meta{title} has a +% |\numberline| command. +% As of 25 Jan 1988, this is also the amount of extra +% indentation added to second and later lines of a +% multiple line entry. +% \item[title] Contents of entry. +% \item[page] Page number. +% \end{description} +% +% Uses the following parameters, which must be set by the document +% style. They should be defined with |\def|'s. +% \begin{description} +% \item[|\@pnumwidth|] Width of box in which page number is set. +% \item[|\@tocrmarg|] Right margin indentation for all but last line +% of multiple-line entries. +% \item[|\@dotsep|] Separation between dots, in mu units. +% Should be |\def|'d to a number like 2 or 1.7 +% \end{description} +% +% \begin{macro}{\@dottedtocline} +% \changes{LaTeX2.09}{1991/09/29} +% {(RmS) added \cs{reset@font} for page number} +% \changes{v1.0e}{1994/05/25}{Put braces around argument 4 +% (the actual toc entry) to avoid font (and possibly other) +% changes leaking out to the leaders.} +% \changes{v1.0g}{1994/10/18}{Added \cs{normalcolor} for page number} +% \changes{v1.0z}{1996/12/20}{Added \cs{nobreak} for latex/2343} +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\@dottedtocline}{Prevent protrusion}% +\def\@dottedtocline#1#2#3#4#5{% + \ifnum #1>\c@tocdepth \else + \vskip \z@ \@plus.2\p@ + {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip + \parindent #2\relax\@afterindenttrue + \interlinepenalty\@M + \leavevmode + \@tempdima #3\relax +% \end{macrocode} +% \changes{v1.0z}{1996/12/20}{Added \cs{nobreak} for latex/2343} +% \begin{macrocode} + \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip + {#4}\nobreak + \leaders\hbox{$\m@th +% \end{macrocode} +% If a document uses fonts other than computer modern, the use of a +% dot from math can be very disturbing despite the fact that this +% might be the only place in a document that then uses computer +% modern. +% Therefore we surround the dot with an |\hbox| to escape to the +% surrounding text font. +% \changes{v1.0k}{1995/04/25}{Added \cs{hbox} around dots.} +% \changes{v1.0l}{1995/05/02}{Don't reset to \cs{rmfamily}} +% \begin{macrocode} + \mkern \@dotsep mu\hbox{.}\mkern \@dotsep + mu$}\hfill + \nobreak + \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5% +% \end{macrocode} +% We finish off by preventing +% any protrusion if that is enabled. If protrusion happens the +% number may shift to the right and as a result you may end up with +% an additional dot in the toc line in some situations. +% \changes{v1.1b}{2018/09/02}{Prevent protrusion +% (\url{https://tex.stackexchange.com/q/172785/10109})} +% \begin{macrocode} + \kern-\p@\kern\p@}% + \par}% + \fi} +% \end{macrocode} +% \end{macro} +% +% + +% \begin{macro}{\noprotrusion} +% This command, if placed directly to the right (or left) of a +% word, will prevent prevent protrusion of that word into the +% margin. It is used in the toc entry lines as they shouldn't +% protrude. It is implemented as to kerns that cancel each other +% but being there hide the word so that protrusion is not +% added. Note that a zero kern or an empty box would not work as +% the protrusion mechanism will skip over those. +% \begin{macrocode} +\DeclareRobustCommand\noprotrusion{\leavevmode\kern-\p@\kern\p@} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@dottedtocline}{Prevent protrusion}% +%<latexrelease>\def\@dottedtocline#1#2#3#4#5{% +%<latexrelease> \ifnum #1>\c@tocdepth \else +%<latexrelease> \vskip \z@ \@plus.2\p@ +%<latexrelease> {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip +%<latexrelease> \parindent #2\relax\@afterindenttrue +%<latexrelease> \interlinepenalty\@M +%<latexrelease> \leavevmode +%<latexrelease> \@tempdima #3\relax +%<latexrelease> \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip +%<latexrelease> {#4}\nobreak +%<latexrelease> \leaders\hbox{$\m@th +%<latexrelease> \mkern \@dotsep mu\hbox{.}\mkern \@dotsep +%<latexrelease> mu$}\hfill +%<latexrelease> \nobreak +%<latexrelease> \hb@xt@\@pnumwidth{\hfil\normalfont \normalcolor #5}% +%<latexrelease> \par}% +%<latexrelease> \fi} +%<latexrelease> +%<latexrelease>\let\noprotrusion\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% +% \textbf{Note:} |\nobreak|'s added 7 Jan 86 to prevent bad line break +% that left the page number dangling by itself at left edge of a new +% line. +% +% Changed 25 Jan 88 to use |\leftskip| instead of |\hangindent| so +% leaders of multiple-line contents entries would line up properly. +% \begin{macro}{\numberline} +% |\numberline{|\meta{number}|}|: For use in a |\contentsline| command. +% It puts \meta{number} flushleft in a box of width |\@tempdima| +% (Before 25 +% Jan 88 change, it also added |\@tempdima| to the hanging +% indentation.) +% +% \begin{macrocode} +\def\numberline#1{\hb@xt@\@tempdima{#1\hfil}} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltspace.dtx b/Master/texmf-dist/source/latex-dev/base/ltspace.dtx new file mode 100644 index 00000000000..6f212bba159 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltspace.dtx @@ -0,0 +1,1210 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltspace.dtx +%<*driver> +% \fi +\ProvidesFile{ltspace.dtx} + [2018/10/10 v1.3i LaTeX Kernel (spacing)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltspace.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.} +% \changes{v1.2f}{1995/05/25}{Macros moved to ltlists.dtx} +% \changes{v1.2n}{1996/04/22}{Documentation Improvements} +% \changes{v1.2o}{1996/06/22}{Documentation of problems added} +% \changes{v1.2q}{1996/07/27}{Further documentation of problems} +% \changes{v1.2r}{1996/07/27}{Correct documentation of problems} +% \changes{v1.2w}{1998/08/17}{Documentation fixes.} +% +% +% \section{Spacing} +% +% This section deals with spacing, and line- and page-breaking. +% +% \subsection{User Commands} +% +% \DescribeMacro\nopagebreak\oarg{i} : \meta{i} = 0,...,4. +% +% Default argument = 4. Puts a penalty into the vertical list +% output as follows:\\ +% 0 : penalty = 0\\ +% 1 : penalty = |\@lowpenalty|\\ +% 2 : penalty = |\@medpenalty|\\ +% 3 : penalty = |\@highpenalty|\\ +% 4 : penalty = 10000 +% +% \DescribeMacro\pagebreak\oarg{i} : +% same as \nopagebreak except negatives of its penalty +% +% \DescribeMacro\linebreak\oarg{i} : analog of the above +% +% \DescribeMacro\nolinebreak\oarg{i} : analog of the above +% +% \DescribeMacro\samepage : +% inhibits page breaking most places by setting the +% following penalties to 10000:\\ +% |\interlinepenalty|\\ +% |\postdisplaypenalty|\\ +% |\interdisplaylinepenalty|\\ +% |\@beginparpenalty|\\ +% |\@endparpenalty|\\ +% |\@itempenalty|\\ +% |\@secpenalty|\\ +% |\interfootnotelinepenalty| +% +% \DescribeMacro{\\} : initially defined to be |\newline| +% +% |\\|\oarg{length} : initially defined to be +% |\vspace|\marg{length}|\newline|\\ +% Note: |\\*| adds a |\vadjust{\penalty 10000}| +% +% OBSOLETE COMMANDS (which never made it into the manual): +% +% |\obeycr| : defines <CR> == |\\\relax|\\ +% |\restorecr| : restores <CR> to its usual meaning. +% +% +% \StopEventually{} +% +% \subsection{Chris' comments} +% +% There are several aspects of the handling of space in horizontal +% mode that are inconsistent or do not work well in some cases. +% These are largely concerned with ignoring the effect of space +% tokens that would otherwise typeset an inter-word space. +% +% Negating the effect of such space tokens is achieved by two +% mechanisms: +% \begin{itemize} +% \item |\unskip| is used to remove the glue just added by +% a space that has already had its effect; it is sometimes +% invoked after an |\ifdim| test on |\lastskip| (see below); +% \item |\ignorespaces| is used to ignore space-tokens yet to come. +% \end{itemize} +% +% The test done on |\lastskip| is sometimes for equality with zero and +% sometimes for being positive. Recall also that the test is only on +% the natural length of the glue and that no glue cannot be +% distinguished from glue whose natural length is zero: to summarise, +% a pretty awful test. It is not clear why these tests are not all +% the same; I think that they should all be for equality. One place +% where |\unskip| is often used is just before a |\par| (which itself +% internally does an |\unskip|) and one bit of code (in |\@item|) even +% has two |\unskips| before a |\par|. These uses may be fossil code +% but if they are necessary, maybe |\@killglue| would be even safer. +% +% Such removal of glue by |\unskip| may sometimes have the wrong result, +% removing not the glue from a space-token but other explicit glue; +% this is sometimes not what is intended. +% +% A common way to prevent such removal is to add an |\hskip\z@| after +% the glue that should not be removed. This protects that glue +% against one |\unskip| with no test but not against more than one. +% It does work for `tested |\unskip|s'. This is used +% by |\hspace*| but not by |\hspace|; this is inconsistent as the star +% is supposed to prevent removal only at the beginning of a line, not +% at the end, or in a tabular, etc. +% +% If this reason for removing glue were the only consideration then a +% tested-|\unskip| and protection by |\hskip\z@| would suffice but +% would need to be consistently implemented. +% +% However, the class of invisibles, commands and environments tries to +% be even cleverer: one of these tries to leave only one inter-word +% space whenever there is one before it and one after it; and it does +% this quite well. +% +% But problems can arise when there is not a space-token on +% both sides of it; in particular, when an invisible appears at the +% beginning or end of a piece of text the method still leaves one space +% token whereas usually in these cases it should leave none. +% +% Also, the current rules do not work well when more than one such +% command appears consecutively, separated by space-tokens; it leaves +% glue between every other invisible. +% +% There is also a question about what these commands should do when +% they occur next to spaces that do not come from space tokens but, +% for example, from |\hspace|. Should they still produce `just one +% space'? If so, which one? It is good to note that the manual +% is sufficiently cautious about invisibles that we are not obliged to +% make anything work. +% +% Another interesting side-road to explore is whether the space-tokens +% either side of an |\hspace{...}| should be ignored. +% +% One alternative to the current algorithm that is often suggested is +% that all glue around the invisible should be consolidated into a +% space after it (usually without stating how much glue should be put +% there). The command |\nolinebreak| is implemented this way (and +% |\linebreak| should also be). This does not work correctly for the +% following common case: +% \begin{verbatim} +% ... some text +% \index{some-word} +% some-word and more text. +% \end{verbatim} +% This is optimal coding since it is normal to index a word that gets +% split across a page-break on its starting page. This would, on the +% other hand, fix another common (and documented) failure of the +% current system: when the invisible is the last thing in a paragraph +% the space before it is not removed and, worse, it is also hidden +% from the paragraph-ending mechanism so that an `empty' line can be +% created at the end of the paragraph. +% +% Another deficiency (I think) of the current system is that the +% following is treated as having the |\index| command between the +% paragraphs, which is probably not what the author intended (since +% there is no empty line after it). +% \begin{verbatim} +% +% \index{beginnings} +% Beginnings of paragraphs ... +% \end{verbatim} +% +% I know of no algorithm that will handle satisfactorily even +% all the most common cases; note that it could be that the best +% algorithm may be different for different invisibles since, +% for example, the common uses and expected behaviour of +% |\index|, |\marginpar|, |\linebreak|, |\pagebreak| and +% |\vspace| are somewhat different. [For example, is +% |\vspace| ever used in the middle of a paragraph?] +% +% One method that can (and is) used to make invisible commands produce +% no space when used at the beginning of text is to put in some glue +% that is nearly enough the same as no glue or glue of zero length in +% all respects except for the precise test for not being exactly equal +% to zero; examples of such glue are |\hskip 1sp| and, possibly better +% but more complex, |\hskip -1sp \hskip 1sp|. However, this only works +% when it is known that user-supplied text is about to start. +% +% Some similar concerns apply to the handling of space and penalties +% in vertical mode; there is an extra hurdle here as |\unskip| does +% not work on the main vertical list. The complexity of the tests done +% by |\addvspace| have never been explained. +% +% The implementation of space hacks etc for vertical mode is another +% major area that needs further attention; my earlier experiments +% did not produce much improvement over the current unsatisfactory +% situation. +% +% One particular problem is what happens when the following very +% natural coding is used (part of the problem here is that this looks +% like an hmode problem, but it is not): +% \begin{verbatim} +% ... end of text. +% +% \begin{enumerate} +% \item \label{item:xxx} Item text. +% \end{enumerate} +% \end{verbatim} +% +% \subsection{Some immediate actions} +% +% \begin{itemize} +% \item Fix bug in |\linebreak|. +% \item Fix bug in |\\*|. +% \item Reimplement |\\|, etc, removing extra |\vadjust|s and getting +% better error trapping (this seems to involve a lot more tokens). +% \item Investigate whether |\\|, etc need to be errors in vmode; I +% think that they could be noops (maybe with a warning). +% \item Make all(?) |\unskips| include test for zero skip (rather than +% other tests or no test). +% \item Consider replacing |\hskip 1sp| by something better (here +% called an `infinitesimal' skip). +% \item Look at all |\hskip\z@| (or similar) to see if they should be +% changed to an `infinitesimal' skip. +% \item Resolve the inconsistency between |\hspace| and |\hspace*|. +% \item Remove unnecessary |\unskips|. +% \item Investigate and rationalise the `newline' code. +% \item Find better algorithms for all sorts of things or, easier(?), +% fix \TeX{} itself. +% \end{itemize} +% +% \subsection{The code} +% +% \begin{macrocode} +%<*2ekernel> +\message{spacing,} +% \end{macrocode} +% +% \begin{macro}{\pagebreak} +% \begin{macro}{\nopagebreak} +% \changes{v1.2h}{1995/07/05}{Reimplemented both using \cs{@no@pgbk}} +% \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911} +% \begin{macrocode} +\def\pagebreak{\@testopt{\@no@pgbk-}4} +\def\nopagebreak{\@testopt\@no@pgbk4} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@no@pgbk} +% \changes{v1.2h}{1995/07/05}{Macro replaces \cs{@pgbk} +% and \cs{@nopgbk}} +% \begin{macrocode} +\def\@no@pgbk #1[#2]{% + \ifvmode + \penalty #1\@getpen{#2}% + \else + \@bsphack + \vadjust{\penalty #1\@getpen{#2}}% + \@esphack + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\linebreak} +% \begin{macro}{\nolinebreak} +% \changes{v1.2u}{1996/10/29}{Reimplemented both using \cs{@no@lnbk}} +% \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911} +% \begin{macrocode} +\def\linebreak{\@testopt{\@no@lnbk-}4} +\def\nolinebreak{\@testopt\@no@lnbk4} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\@no@lnbk} +% \changes{v1.2u}{1996/10/29}{Macro replaces \cs{@lnbk} +% and \cs{@nolnbk}} +% \begin{macrocode} +\def\@no@lnbk #1[#2]{% + \ifvmode + \@nolnerr + \else + \@tempskipa\lastskip + \unskip + \penalty #1\@getpen{#2}% + \ifdim\@tempskipa>\z@ + \hskip\@tempskipa + \ignorespaces + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\samepage} +% \begin{macrocode} +\def\samepage{\interlinepenalty\@M + \postdisplaypenalty\@M + \interdisplaylinepenalty\@M + \@beginparpenalty\@M + \@endparpenalty\@M + \@itempenalty\@M + \@secpenalty\@M + \interfootnotelinepenalty\@M} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\\} +% \changes{v1.2a}{1994/11/11}{(DPC) Make robust} +% \changes{v1.2d}{1994/11/14}{(DPC) Macro modified} +% +% \changes{v1.2u}{1996/10/29}{Corrected and rationalised code} +% The purpose of the new code is to fix a few bugs; however, it also +% attempts to optimize the following, in order of priority: +% \begin{enumerate} +% \item efficient execution of plain |\\|; +% \item efficient execution of |\\[...]|; +% \item memory use; +% \item name-space use. +% \end{enumerate} +% The changes should make no difference to the typeset output. +% It appears to be safe to use |\reserved@e| and |\reserved@f| here +% (other reserved macros are somewhat disastrous). +% +% These changes made |\newline| even less robust than it had been, +% so now it is explicitly robust, like |\\|. +% \begin{macro}{\@normalcr} +% The internal definition of the `normal' definition of |\\|. +% \begin{macrocode} +\DeclareRobustCommand\\{% + \let \reserved@e \relax + \let \reserved@f \relax + \@ifstar{\let \reserved@e \vadjust \let \reserved@f \nobreak + \@xnewline}% + \@xnewline} +\expandafter\let\expandafter\@normalcr + \csname\expandafter\@gobble\string\\ \endcsname +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\newline} +% A simple form of the `normal' definition of |\\|. +% \changes{v1.2v}{1997/05/07}{Made completely robust.} +% \begin{macrocode} +\DeclareRobustCommand\newline{\@normalcr\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xnewline} +% \begin{macrocode} +\def\@xnewline{\@ifnextchar[% ] bracket matching + \@newline + {\@gnewline\relax}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@newline} +% \begin{macrocode} +\def\@newline[#1]{\let \reserved@e \vadjust + \@gnewline {\vskip #1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@gnewline} +% \changes{v1.2u}{1996/10/29}{Added macro} +% The |\nobreak| added to prevent null lines when |\\| +% ends an overfull line. Change made 24 May 89 as suggested by +% Frank Mittelbach and Rainer Sch\"opf +% \changes{v1.2h}{1995/07/05}{Use \cs{break}} +% \begin{macrocode} +\def\@gnewline #1{% + \ifvmode + \@nolnerr + \else + \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@getpen} +% \begin{macrocode} +\def\@getpen#1{\ifcase #1 \z@ \or \@lowpenalty\or + \@medpenalty \or \@highpenalty + \else \@M \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\if@nobreak} +% \changes{v1.2p}{1996/07/26}{put \cs{global} inside definition} +% Switch used to avoid page breaks caused by |\label| after a +% section heading, etc. It should be \textbf{GLOBALLY} set true +% after the |\nobreak| and \textbf{globally} set false by the +% next invocation of |\everypar|. +% +% Commands that reset |\everypar| should globally set it false if +% appropriate. +% \begin{macrocode} +\def\@nobreakfalse{\global\let\if@nobreak\iffalse} +\def\@nobreaktrue {\global\let\if@nobreak\iftrue} +\@nobreakfalse +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\@savsk} +% \begin{macro}{\@savsf} +% Registers used to save the space factor and last skip. +% \begin{macrocode} +\newdimen\@savsk +\newcount\@savsf +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% +% +% \begin{macro}{\@bsphack} +% \changes{LaTeX2e}{1993/12/08} +% {Command reimplemented; late birthday present for Chris} +% \changes{LaTeX2e}{1993/12/08}{Command reimplemented} +% \changes{LaTeX2e}{1993/12/16}{Corrected optimisation :-)} +% |\@bsphack| and |\@esphack| +% used by macros such as |\index| and +% |\begin{@float}| \ldots |\end{@float}| +% that want to be invisible --- i.e., +% not leave any extra space when used in the middle of text. Such +% a macro should begin with |\@bsphack| and end with |\@esphack| +% The macro in question should not create any text, nor change the +% mode. +% +% Before giving the current definition we give an extended definition +% that is currently not used (because it doesn't work as advertised:-) +% +% These are generalised hacks which attempt to do sensible things +% when `invisible commands' appear in vmode too. +% +% They need to cope with space in both hmode (plus spacefactor) and +% vmode, and also cope with breaks etc. In vmode this means +% ensuring that any following |\addvspace|, etc sees the correct +% glue in |\lastskip|. +% +% In fact, these improved versions should be used for other cases +% of `whatsits, thingies etc' which should be invisible. They are +% only for commands, not environments (see notes on |\@Esphack|). +% +% BTW, anyone know why the standard hacks are surrounded by +% |\ifmmode\else| rather than simply |\ifhmode|? +% +% And are there any cases where saving the spacefactor is +% essential? I have some extensions where it is, but it does not +% appear to be so in the standard uses. +%\begin{verbatim} +%\def \@bsphack{% +% \relax \ifvmode +% \@savsk \lastskip +% \ifdim \lastskip=\z@ +% \else +% \vskip -\lastskip +% \fi +% \else +% \ifhmode +% \@savsk \lastskip +% \@savsf \spacefactor +% \fi +% \fi +%} +%\end{verbatim} +% I think that, in vmode, it is the safest to put +% in a |\nobreak| immediately after such things since writes, +% inserts etc followed by glue give valid breakpoints and, in +% general, it is possible to create breaks but impossible to +% destroy them. +%\begin{verbatim} +%\def \@esphack{% +% \relax \ifvmode +% \nobreak +% \ifdim \@savsk=\z@ +% \else +% \vskip\@savsk +% \fi +% \else +% \ifhmode +% \spacefactor \@savsf +% \ifdim \@savsk>\z@ +% \ignorespaces +% \fi +% \fi +% \fi +%} +%\end{verbatim} +% For the moment we are going to ignore the vertical versions until +% they are correct. +% \changes{LaTeX2e}{1993/12/19}{There seem to be problems with selfmade +% birthday presents} +% \begin{macrocode} +\def\@bsphack{% + \relax + \ifhmode + \@savsk\lastskip + \@savsf\spacefactor + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@esphack} +% Companion to |\@bsphack|. If this command is not properly paired +% with |\@bsphack| one might end up with a low-level \TeX{} error: +% ``BAD spacefactor''. One possible cause is calling |\@bsphack| in +% vertical mode, then doing something that gets you (sometimes) into +% horizontal mode and finally calling |\@esphack|. Even if no error +% is generated that is wrong, because |\@esphack| will then use the +% saved values for |\@savsk| and |\@savsf| from some earlier +% invocation of |\@bsphack| which will have nothing to do with the +% current situation. +% \changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2018/10/10}% +%<latexrelease> {\@esphack}{hyphenation and nobreak after space hack}% +%<*2ekernel|latexrelease> +\def\@esphack{% + \relax + \ifhmode + \spacefactor\@savsf + \ifdim\@savsk>\z@ +% \end{macrocode} +% \changes{v1.3f}{2015/11/07} +% {Only space if there is no space at the end of the hlist latex/4443} +% \begin{macrocode} + \ifdim\lastskip=\z@ + \nobreak \hskip\z@skip + \fi + \ignorespaces + \fi +% \end{macrocode} +% \changes{v1.3i}{2018/10/10} +% {Don't introduce breakpoints if @nobreak is true and after sections} +% \begin{macrocode} + \else + \ifvmode + \if@nobreak\nobreak\else\if@noskipsec\nobreak\fi\fi + \fi +% \end{macrocode} +% +% \begin{macrocode} + \fi}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{2015/10/01}% +%<latexrelease> {\@esphack}{hyphenation and nobreak after space hack}% +%<latexrelease>\def\@esphack{% +%<latexrelease> \relax +%<latexrelease> \ifhmode +%<latexrelease> \spacefactor\@savsf +%<latexrelease> \ifdim\@savsk>\z@ +%<latexrelease> \ifdim\lastskip=\z@ +%<latexrelease> \nobreak \hskip\z@skip +%<latexrelease> \fi +%<latexrelease> \ignorespaces +%<latexrelease> \fi +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\@esphack}{hyphenation and nobreak after space hack}% +%<latexrelease>\def\@esphack{% +%<latexrelease> \relax +%<latexrelease> \ifhmode +%<latexrelease> \spacefactor\@savsf +%<latexrelease> \ifdim\@savsk>\z@ +%<latexrelease> \nobreak \hskip\z@skip +%<latexrelease> \ignorespaces +%<latexrelease> \fi +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@esphack}{hyphenation and nobreak after space hack}% +%<latexrelease>\def\@esphack{% +%<latexrelease> \relax +%<latexrelease> \ifhmode +%<latexrelease> \spacefactor\@savsf +%<latexrelease> \ifdim\@savsk>\z@ +%<latexrelease> \ignorespaces +%<latexrelease> \fi +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@Esphack} +% A variant of |\@esphack| that sets the |@ignore| switch to +% true (as |\@esphack| used to do previously). +% This is currently used only for floats and similar environments. +% \changes{v1.2s}{1996/08/02}{Remove \cs{global} before \cs{@ignore...}} +% \changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}w +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\@Esphack}{hyphenation after space hack}% +%<*2ekernel|latexrelease> +\def\@Esphack{% + \relax + \ifhmode + \spacefactor\@savsf + \ifdim\@savsk>\z@ + \nobreak \hskip\z@skip + \@ignoretrue + \ignorespaces + \fi + \fi}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@Esphack}{hyphenation after space hack}% +%<latexrelease>\def\@Esphack{% +%<latexrelease> \relax +%<latexrelease> \ifhmode +%<latexrelease> \spacefactor\@savsf +%<latexrelease> \ifdim\@savsk>\z@ +%<latexrelease> \@ignoretrue +%<latexrelease> \ignorespaces +%<latexrelease> \fi +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@vbsphack} +% \changes{LaTeX2e}{1993/12/08}{Command added} +% Another variant which is useful for invisible things which should +% not live in vmode (this is how some people feel about marginals). +% +% If it occurs in vmode then it enters hmode and ensures that +% |\@savsk| is nonzero so that the |\ignorespaces| is put in later. +% It is not used at present. +% \changes{v1.2f}{1995/05/25}{(CAR) not used so `removed'.} +%\begin{verbatim} +% \def \@vbsphack{ % +% \relax \ifvmode +% \leavevmode +% \@savsk 1sp +% \@savsf \spacefactor +% \else +% \ifhmode +% \@savsk \lastskip +% \@savsf \spacefactor +% \fi +% \fi +% } +%\end{verbatim} +% \end{macro} +% +% +% \subsection{Vertical spacing} +% +% +% \LaTeX\ supports the plain \TeX\ commands +% |\smallskip|, |\medskip| and |\bigskip|. +% However, it redefines them using |\vspace| instead of |\vskip|. +% +% Extra vertical space is added by the command +% |\addvspace|\marg{skip}, +% which adds a vertical skip of \meta{skip} to the document. +% The sequence\\ +% |\addvspace|\marg{s1} |\addvspace|\marg{s2} +% is equivalent to\\ +% |\addvspace|\marg{maximum of s1, s2}. +% +% |\addvspace| should be used only in vertical mode, and gives an +% error if it's not. The |\addvspace| command does \emph{not} add +% vertical space if |@minipage| is true. The minipage environment uses +% this to inhibit the addition of extra vertical space at the beginning. +% +% Penalties are put into the vertical list with the +% |\addpenalty|\marg{penalty} +% command. It works properly when |\addpenalty| and |\addvspace| +% commands are mixed. +% +% The |@nobreak| switch is set true used when in vertical mode and no +% page break should occur. (Right now, it is used only by the section +% heading commands to inhibit page breaking after a heading.) +% +% +%\begin{verbatim} +% \addvspace{SKIP} == +% BEGIN +% if vmode +% then if @minipage +% else if \lastskip =0 +% then \vskip SKIP +% else if \lastskip < SKIP +% then \vskip -\lastskip +% \vskip SKIP +% else if SKIP < 0 and \lastskip >= 0 +% then \vskip -\lastskip +% \vskip \lastskip + SKIP +% fi fi fi fi +% else useful error message (CAR). +% fi +% END +%\end{verbatim} +% +% \begin{macro}{\@xaddvskip} +% Internal macro for |\vspace| handling the case that space has +% previously been added. +% \begin{macrocode} +\def\@xaddvskip{% + \ifdim\lastskip<\@tempskipb + \vskip-\lastskip + \vskip\@tempskipb + \else + \ifdim\@tempskipb<\z@ + \ifdim\lastskip<\z@ + \else + \advance\@tempskipb\lastskip + \vskip-\lastskip + \vskip \@tempskipb + \fi + \fi + \fi} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\addvspace} +% \changes{v1.2b}{1994/11/12}{Corrected error message} +% \changes{v1.2c}{1994/11/13}{Recorrected error message} +% Add vertical space taking into account space already added, as +% described above. +% \begin{macrocode} +\def\addvspace#1{% + \ifvmode + \if@minipage\else + \ifdim \lastskip =\z@ + \vskip #1\relax + \else + \@tempskipb#1\relax + \@xaddvskip + \fi + \fi + \else + \@noitemerr + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\addpenalty} +% \changes{v1.2b}{1994/11/12}{Corrected error message} +% \changes{v1.2c}{1994/11/13}{Recorrected error message} +% \changes{v1.1h}{2015/01/09}{Donald Arseneau's fix from PR/377703 (latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\addpenalty}{\addpenalty}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% Fix provided by Donald (though the original fix was not good +% enough). In 2005 Plamen Tanovski discovered that this fix wasn't +% good enough either as the \cs{vskip} kept getting bigger if +% several \cs{addpenalty} commands followed each other. Donald +% kindly send a new fix. +% \begin{macrocode} +\def\addpenalty#1{% + \ifvmode + \if@minipage + \else + \if@nobreak + \else + \ifdim\lastskip=\z@ + \penalty#1\relax + \else + \@tempskipb\lastskip +% \end{macrocode} +% We have to make sure the final \cs{vskip} seen by \TeX\ is the +% correct one, namely \cs{@tempskipb}. However we may have to +% adjust for \cs{prevdepth} when placing the penalty but that +% should not affect the skip we pass on to \TeX. +% \changes{v1.3e}{2015/01/14}{Avoid adding redundant skips (DPC)} +% \begin{macrocode} + \begingroup + \@tempskipa\@tempskipb + \advance \@tempskipb + \ifdim\prevdepth>\maxdepth\maxdepth\else +% \end{macrocode} +% If |\prevdepth| is -1000pt due to |\nointerlineskip| we better +% not add it! +% \begin{macrocode} + \ifdim \prevdepth = -\@m\p@ \z@ \else \prevdepth \fi + \fi + \vskip -\@tempskipb + \penalty#1% + \ifdim\@tempskipa=\@tempskipb +% \end{macrocode} +% Do nothing if the |\prevdepth| check made no adjustment. +% \begin{macrocode} + \else +% \end{macrocode} +% Combine the prevdepth adjustment into a single skip. +% \begin{macrocode} + \advance\@tempskipb -\@tempskipa + \vskip \@tempskipb + \fi +% \end{macrocode} +% The final skip is always the specified length. +% \begin{macrocode} + \vskip \@tempskipa + \endgroup + \fi + \fi + \fi + \else + \@noitemerr + \fi}% +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\addpenalty}{\addpenalty}% +%<latexrelease>\def\addpenalty#1{% +%<latexrelease> \ifvmode +%<latexrelease> \if@minipage +%<latexrelease> \else +%<latexrelease> \if@nobreak +%<latexrelease> \else +%<latexrelease> \ifdim\lastskip=\z@ +%<latexrelease> \penalty#1\relax +%<latexrelease> \else +%<latexrelease> \@tempskipb\lastskip +%<latexrelease> \vskip -\lastskip +%<latexrelease> \penalty#1% +%<latexrelease> \vskip\@tempskipb +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \fi +%<latexrelease> \else +%<latexrelease> \@noitemerr +%<latexrelease> \fi}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\vspace} +% \changes{v1.2m}{1996/01/20}{Made robust} +% \begin{macro}{\@vspace} +% \begin{macro}{\@vspacer} +% \changes{v1.2f}{1995/05/25} +% {(CAR) macros modified to be more efficient} +% \changes{v1.2f}{1995/05/25}{(CAR) \cs{@restorepar} added to avoid +% possible infinite tail recursion caused by a typo in the argument.} +% The new code for these commands depends on the following facts: +% \begin{itemize} +% \item The value of prevdepth is changed only when a box or rule +% is created and added to a vertical list; +% \item The value of prevdepth is used only when a box is created +% and added to a vertical list; +% \item The value of prevdepth is always local to the building of +% one vertical list. +% \end{itemize} +% \begin{macrocode} +\DeclareRobustCommand\vspace{\@ifstar\@vspacer\@vspace} +\def\@vspace #1{% + \ifvmode + \vskip #1 + \vskip\z@skip + \else + \@bsphack + \vadjust{\@restorepar + \vskip #1 + \vskip\z@skip + }% + \@esphack + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\@vspacer#1{% + \ifvmode + \dimen@\prevdepth + \hrule \@height\z@ + \nobreak + \vskip #1 + \vskip\z@skip + \prevdepth\dimen@ + \else + \@bsphack + \vadjust{\@restorepar + \hrule \@height\z@ + \nobreak + \vskip #1 + \vskip\z@skip}% + \@esphack + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\smallskip} +% \begin{macro}{\medskip} +% \begin{macro}{\bigskip} +% \begin{macrocode} +\def\smallskip{\vspace\smallskipamount} +\def\medskip{\vspace\medskipamount} +\def\bigskip{\vspace\bigskipamount} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\smallskipamount} +% \begin{macro}{\medskipamount} +% \begin{macro}{\bigskipamount} +% \begin{macrocode} +\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt +\newskip\medskipamount \medskipamount =6pt plus 2pt minus 2pt +\newskip\bigskipamount \bigskipamount =12pt plus 4pt minus 4pt +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% +% \subsection{Horizontal space (and breaks)} +% +% \begin{macro}{\nobreakdashes} +% \changes{v1.3}{2004/02/04}{(Macro added} +% \changes{v1.3a}{2004/02/15}{(Added spacefactor setting} +% This idea is borrowed from the \textsf{amsmath} package but +% here we define a robust command. +% +% This command is a low-level command designed for use only before +% hyphens or dashes (such as |-|, |--|, or |---|). +% +% It could probably be better implemented: it may need its own +% private token register and temporary command. +% +% Setting the hyphen in a box and then unboxing it means that the +% normal penalty will not be added after it---and if the penalty is +% not there a break will not be taken (unless an explicit penalty +% or glue follows, thus the final \verb=\nobreak=). +% +% Note that even if it is not followed by a `-', it still leaves +% vmode and sets the spacefactor; so use it carefully! +% +% \begin{macrocode} +\DeclareRobustCommand{\nobreakdashes}{% + \leavevmode + \toks@{}% + \def\reserved@a##1{\toks@\expandafter{\the\toks@-}% + \futurelet\@let@token \reserved@b}% + \def\reserved@b {\ifx\@let@token -% + \expandafter\reserved@a + \else + \setbox\z@ \hbox{\the\toks@\nobreak}% + \unhbox\z@ + \spacefactor\sfcode`\- + \fi}% + \futurelet\@let@token \reserved@b +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\nobreakspace} +% \changes{v1.2k}{1995/12/04}{(Macro added} +% \begin{macro}{\@xobeysp} +% \changes{v1.2t}{1996/09/28}{Moved from ltmiscen.dtx and redefined to +% use \cs{nobreakspace }} +% +% This is a robust command that produces a horizontal space at +% which, in paragraph-mode, a line-break is not possible. We then +% define an active |~| to expand to it since this is the documented +% behaviour of |~|. One reason for introducing this is that some +% 8-bit input encodings have a slot for such a space and we do not +% want to use active characters as the \LaTeX{} internal commands. +% +% The braces in the definition of |~| are needed to ensure that a +% following space is preserved when reading to/from internal files. +% \changes{v1.2l}{1995/12/04}{(braces added to definition of tilde} +% +% We need to keep \cs{@xobeysp} as it is widely used; so here it is +% let to the non-robust command \cs{nobreakspace }. +% +% \begin{macrocode} +\DeclareRobustCommand{\nobreakspace}{% + \leavevmode\nobreak\ } +\catcode `\~=13 +\def~{\nobreakspace{}} +\expandafter\let\expandafter\@xobeysp\csname nobreakspace \endcsname +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +% \end{macrocode} +% +% +% \begin{macro}{\,} +% Used in paragraph mode produces a |\thinspace|. It has the +% ordinary definition in math mode. Useful for quotes inside quotes, +% as in |``\,`Foo', he said.''| +% \changes{v1.0o}{1994/05/11}{Use \cs{DeclareRobustCommand}. ASAJ.} +% \begin{macrocode} +\DeclareRobustCommand{\,}{% + \relax\ifmmode\mskip\thinmuskip\else\thinspace\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@} +% Placed before a '.', makes it a sentence-ending period. Does the +% right thing for other punctuation marks as well. Does this by +% setting spacefactor to 1000. +% \changes{v1.3b}{2014/12/30}{\cs{@} discards spaces when moving +% (pr3039)(latexrelease)} +% \begin{macrocode} +%</2ekernel> +%<latexrelease>\IncludeInRelease{2015/01/01}% +%<latexrelease> {\@}{Space after \@}% +%<*2ekernel|latexrelease> +% \end{macrocode} +% \begin{macrocode} +\def\@{\spacefactor\@m{}}% +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\@}{Space after \@}% +%<latexrelease>\def\@{\spacefactor\@m}% +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\hspace} +% \changes{v1.0o}{1994/05/11}{Use \cs{DeclareRobustCommand}. ASAJ.} +% \begin{macrocode} +\DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@hspace} +% \changes{LaTeX2e}{1993/08/05} +% {(RmS) Removed superfluous \cs{leavevmode} in \cs{@hspace} and +% \cs{@hspacer}, as suggested by CAR.} +% \begin{macrocode} +\def\@hspace#1{\hskip #1\relax} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\@hspacer} +% extra |\hskip 0pt| added 1985/17/12 to guard +% against a following |\unskip| +% |\relax| added 13 Oct 88 for usual \TeX\ lossage +% replaced both changes by |\hskip\z@skip| 27 Nov 91 +% \begin{macrocode} +\def\@hspacer#1{\vrule \@width\z@\nobreak + \hskip #1\hskip \z@skip} +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\fill} +% \begin{macrocode} +\newskip\fill +\fill = 0pt plus 1fill +% \end{macrocode} +% \end{macro} +% +% +% +% \begin{macro}{\stretch} +% \begin{macrocode} +\def\stretch#1{\z@ \@plus #1fill\relax} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +%</2ekernel> +%<*2ekernel|latexrelease> +%<latexrelease>\IncludeInRelease{2018/12/01}% +%<latexrelease> {\thinspace}{Start LR-mode}% +% \end{macrocode} +% +% +% \begin{macro}{\thinspace} +% \begin{macro}{\negthinspace} +% \begin{macro}{\enspace} +% \changes{v1.3h}{2018/09/24}{Start LR-mode if necessary (git/49)} +% \begin{macrocode} +\def\thinspace{\leavevmode@ifvmode\kern .16667em } +\def\negthinspace{\leavevmode@ifvmode\kern-.16667em } +\def\enspace{\leavevmode@ifvmode\kern.5em } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\leavevmode@ifvmode} +% Leave vmode but only if we are really in vmode, otherwise the +% expansion is empty (which is not the case with the default definition). +% \changes{v1.3h}{2018/09/24}{Macro added (git/49)} +% \begin{macrocode} +\protected\def\leavevmode@ifvmode{\ifvmode\expandafter\indent\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +%<latexrelease>\EndIncludeInRelease +%<latexrelease>\IncludeInRelease{0000/00/00}% +%<latexrelease> {\thinspace}{Start LR-mode}% +%<latexrelease>\def\thinspace{\kern .16667em } +%<latexrelease>\def\negthinspace{\kern-.16667em } +%<latexrelease>\def\enspace{\kern.5em } +%<latexrelease>\let\leavevmode@ifvmode\@undefined +%<latexrelease>\EndIncludeInRelease +%<*2ekernel> +% \end{macrocode} +% +% +% +% \begin{macro}{\enskip} +% \begin{macro}{\quad} +% \begin{macro}{\qquad} +% \begin{macrocode} +\def\enskip{\hskip.5em\relax} +\def\quad{\hskip1em\relax} +\def\qquad{\hskip2em\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\obeycr} +% \begin{macro}{\restorecr} +% The following definitions will probably get deleted or moved to +% compatibility mode soon. +% +% \changes{v1.2g}{1995/06/11} +% {(CAR) \cs{relax} added to stop silent eating of *.} +% \begin{macrocode} +{\catcode`\^^M=13 \gdef\obeycr{\catcode`\^^M13 \def^^M{\\\relax}% + \@gobblecr}% +{\catcode`\^^M=13 \gdef\@gobblecr{\@ifnextchar +\@gobble\ignorespaces}} +\gdef\restorecr{\catcode`\^^M5 }} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +\endinput + diff --git a/Master/texmf-dist/source/latex-dev/base/lttab.dtx b/Master/texmf-dist/source/latex-dev/base/lttab.dtx new file mode 100644 index 00000000000..54bffa5974e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/lttab.dtx @@ -0,0 +1,1607 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: lttab.dtx +%<*driver> +% \fi +\ProvidesFile{lttab.dtx}[2018/12/30 v1.1p LaTeX Kernel (Columns)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{lttab.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% +% \changes{v1.0l}{1995/05/07}{Use \cs{hb@xt@}} +% \changes{v1.1a}{1995/05/22}{Support autoloading feature} +% \changes{v1.1b}{1995/06/14}{Use \cs{ProvidesFile} in autoload} +% \changes{v1.1d}{1995/10/04}{Modify autoload support} +% \changes{v1.1k}{1998/06/18}{Small addition to documentation} +% \changes{v1.1l}{1998/07/06}{Small correction to documentation} +% \changes{v1.1n}{2015/02/21}{Removed autoload code} +% +% \section{Tabbing, Tabular and Array Environments} +% This section deals with `Lining It Up in Columns'. First the +% |tabbing| environment is defined, and then in second part, |tabular| +% together with its variants, |tabular*| and |array|. +% +% Note that the |tabular| defined here is essentially the original +% \LaTeX~2.09 version, not the extended version described in \emph{The +% \LaTeX\ Companion}. Use the |array| package to obtain the extended +% version. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/04}{Initial version, split from latex.dtx} +% \changes{v1.0a}{1994/03/07}{Long lines wrapped to 72 columns} +% \changes{v1.0b}{1994/03/28}{Improve documentation} +% \changes{v1.0c}{1994/05/07}{Removed definition of \cs{+}} +% \changes{v1.0c}{1994/05/07}{Removed surplus braces from +% \cs{@ifnextchar} constructs} +% \changes{v1.0f}{1994/05/21}{Use new error commands} +% \changes{v1.0j}{1994/11/17} +% {\cs{@tempa} to \cs{reserved@a}} +% +% \subsection{tabbing} +% +% \begin{oldcomments} +% +% \dimen(\@firsttab + i) = distance of tab stop i from left margin +% 0 <= i <= 15 (?). +% +% \dimen\@firsttab is initialized to \@totalleftmargin, so it starts +% at the prevailing left margin. +% +% \@maxtab = number of highest defined tab register +% probably = \@firsttab + 12 +% \@nxttabmar = tab stop number of next line's left margin +% \@curtabmar = tab stop number of current line's left margin +% \@curtab = number of the current tab. At start of line, +% it equals \@curtabmar +% \@hightab = largest tab number currently defined. +% \@tabpush = depth of \pushtab's +% +% \box\@curline = contents of current line, excluding left margin +% skip, and excluding contents of current field +% \box\@curfield = contents of current field +% +% @rjfield = switch: T iff the last field of the line should +% be right-justified at the right margin. +% +% \tabbingsep = distance left by the \' command between the +% current position and the field that is +% ``left-shifted''. +% +% UTILITY MACROS +% \@stopfield : closes the current field +% \@addfield : adds the current field to the current line. +% \@contfield : continues the current field +% \@startfield : begins the next field +% \@stopline : closes the current line and outputs it +% \@startline : starts the next line +% \@ifatmargin : an \if that is true iff the current line. +% has width zero +% +% \@startline == +% BEGIN +% \@curtabmar :=G \@nxttabmar +% \@curtab :=G \@curtabmar +% \box\@curline :=G null +% \@startfield +% \strut +% END +% +% \@stopline == +% BEGIN +% \unskip +% \@stopfield +% if @rjfield = T +% then @rjfield :=G F +% \@tempdima := \@totalleftmargin + \linewidth +% \hb@xt@ \@tempdima{\@itemfudge +% \hskip \dimen\@curtabmar +% \box\@curline +% \hfil +% \box\@curfield} +% else \@addfield +% \hbox {\@itemfudge +% \hskip \dimen\@curtabmar +% \box\@curline} +% fi +% END +% +% \@startfield == +% BEGIN +% \box\@curfield :=G \hbox { +% END +% +% \@stopfield == +% BEGIN +% } +% END +% +% \@contfield == +% BEGIN +% \box\@curfield :=G \hbox { \unhbox\@currfield %%} brace matching +% END +% \@addfield == +% BEGIN +% \box\@curline :=G \unbox\@curline * \unbox\@curfield +% END +% +% \@ifatmargin == +% BEGIN +% if dim of box\@curline = 0pt then +% END +% +% +% \tabbing == +% BEGIN +% \lineskip :=L 0pt +% \> == \@rtab +% \< == \@ltab +% \= == \@settab +% \+ == \@tabplus +% \- == \@tabminus +% \` == \@tabrj +% \' == \@tablab +% \\ == BEGIN \@stopline \@startline END +% \\[DIST] == BEGIN +% \@stopline \vskip DIST \@startline\ignorespaces END +% \\* == BEGIN \@stopline \penalty 10000 \@startline END +% \\*[DIST] == BEGIN \@stopline \penalty 10000 \vskip DIST +% \@startline\ignorespaces END +% \@hightab := \@nxttabmar :=G \@firsttab +% \@tabpush :=G 0 +% \dimen\@firsttab := \@totalleftmargin +% @rjfield :=G F +% \trivlist \item\relax +% if @minipage = F then \vskip \parskip fi +% \box\@tabfbox = \rlap{\indent\the\everypar} +% % note: \the\everypar sets @inlabel :=G F +% \@itemfudge == BEGIN \box\@tabfbox END +% \@startline +% \ignorespaces +% END +% +% \@endtabbing == +% BEGIN +% \@stopline +% if \@tabpush > 0 then error message: ''unmatched \poptabs'' fi +% \endtrivlist +% END +% +% \@rtab == +% BEGIN +% \@stopfield +% \@addfield +% if \@curtab < \@hightab +% then \@curtab :=G \@curtab + 1 +% else error message ``Undefined Tab'' fi +% \@tempdima := \dimen\@curtab - \dimen\@curtabmar +% - width of box \@curline +% \box\@curline :=G \hbox{\unhbox\@curline + \hskip\@tempdima} +% \@startfield +% END +% +% \@settab == +% BEGIN +% \@stopfield +% \@addfield +% if \@curtab < \@maxtab +% then \@curtab :=G \@curtab+1 +% else error message: ``Too many tabs'' fi +% if \@curtab > \@hightab +% then \@hightab :=L \@curtab fi +% \dimen\@curtab :=L \dimen\@curtabmar + width of \box\@curline +% \@startfield +% END +% +% \@ltab == +% BEGIN +% \@ifatmargin +% then if \@curtabmar > \@firsttab +% then \@curtab :=G \@curtab - 1 +% \@curtabmar :=G \@curtabmar - 1 +% else error message ``Too many untabs'' fi +% else error message ``Left tab in middle of line'' +% fi +% END +% +% \@tabplus == +% BEGIN +% if \@nxttabmar < \@hightab +% then \@nxttabmar :=G \@nxttabmar+1 +% else error message ``Undefined tab'' +% fi +% END +% +% \@tabminus == +% BEGIN +% if \@nxttabmar > \@firsttab +% then \@nxttabmar :=G \@nxttabmar-1 +% else error message ``Too many untabs'' +% fi +% END +% +% \@tabrj == +% BEGIN \@stopfield +% \@addfield +% @rjfield :=G T +% \@startfield +% END +% +% \@tablab == +% BEGIN \@stopfield +% \box\@curline G:= \hbox{\box\@curline %% `G' added 17 Jun 86 +% \hskip - width of \box\@curfield +% \hskip -\tabbingsep +% \box\@curfield +% \hskip \tabbingsep } +% \@startfield +% END +% +% \pushtabs == +% BEGIN +% \@stopfield +% \@tabpush :=G \@tabpush + 1 +% \begingroup +% \@contfield +% END +% +% \poptabs == +% BEGIN +% \@stopfield +% if \@tabpush > 0 +% then \endgroup +% \@tabpush :=G \@tabpush - 1 +% else error message: ``Too many \poptabs'' +% fi +% \@contfield +% END +% +% \end{oldcomments} +% +% \begin{macro}{\a} +% The accents |\`| , |\'| , and |\=| that have been redefined inside a +% tabbing environment can be called by typing |\a`| , |\a'| , and |\a=|. +% The macro |\a| is defined in |ltoutenc.dtx|. +% \changes{v1.0d}{1994/05/13} +% {moved to ltoutenc} +% \end{macro} +% +% +% The `2ekernel' code ensures that a |\usepackage{autotabg}| is +% essentially ignored if a `full' format is being used that has +% picture mode already in the format. +% \begin{macrocode} +%<2ekernel>\expandafter\let\csname ver@autotabg.sty\endcsname\fmtversion +% \end{macrocode} +% +% \begin{macro}{\@firsttab} +% \begin{macro}{\@maxtab} +% \changes{v1.0c}{1994/05/07}{Changed \cs{@firsttab} to \cs{chardef}} +% \changes{v1.0c}{1994/05/07}{Changed \cs{@maxtab} to \cs{chardef}} +% \begin{macrocode} +%<*2ekernel> +\newdimen\@gtempa +\chardef\@firsttab=\the\allocationnumber +\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa +\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa +\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa\newdimen\@gtempa +\newdimen\@gtempa +\chardef\@maxtab=\the\allocationnumber +\dimen\@firsttab=0pt +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@nxttabmar} +% \begin{macro}{\@curtabmar} +% \begin{macro}{\@curtab} +% \begin{macro}{\@hightab} +% \begin{macro}{\@tabpush} +% \begin{macrocode} +\newcount\@nxttabmar +\newcount\@curtabmar +\newcount\@curtab +\newcount\@hightab +\newcount\@tabpush +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@curline} +% \begin{macro}{\@curfield} +% \begin{macro}{\@tabfbox} +% \begin{macrocode} +\newbox\@curline +\newbox\@curfield +\newbox\@tabfbox +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\if@rjfield} +% \begin{macrocode} +\newif\if@rjfield +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@startline} +% \changes{v1.1f}{1995/10/23}{(CAR)Ensure that \cs{@nxttabmar} is never +% larger than \cs{@hightab}} +% It is, in some sense, an error if the current margin +% tab setting is higher than the value of |\@hightab| (which is +% a local variable). That this is allowed is a fundamental design +% flaw which is not going to be corrected now. +% \begin{macrocode} +\gdef\@startline{% + \ifnum \@nxttabmar >\@hightab + \@badtab + \global\@nxttabmar \@hightab + \fi + \global\@curtabmar \@nxttabmar + \global\@curtab \@curtabmar + \global\setbox\@curline \hbox {}% + \@startfield + \strut} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@stopline} +% \begin{macrocode} +\gdef\@stopline{% + \unskip + \@stopfield + \if@rjfield + \global\@rjfieldfalse + \@tempdima\@totalleftmargin + \advance\@tempdima\linewidth + \hb@xt@\@tempdima{% + \@itemfudge\hskip\dimen\@curtabmar + \box\@curline + \hfil + \box\@curfield}% + \else + \@addfield + \hbox{\@itemfudge\hskip\dimen\@curtabmar\box\@curline}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@startfield} +% \changes{v1.0d}{1994/05/13} +% {Colour support} +% \begin{macrocode} +\gdef\@startfield{% + \global\setbox\@curfield\hbox\bgroup\color@begingroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@stopfield} +% \changes{v1.0d}{1994/05/13} +% {Colour support} +% \begin{macrocode} +\gdef\@stopfield{% + \color@endgroup\egroup} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@contfield} +% \changes{v1.0d}{1994/05/13} +% {Colour support} +% \begin{macrocode} +\gdef\@contfield{% + \global\setbox\@curfield\hbox\bgroup\color@begingroup + \unhbox\@curfield} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addfield} +% \begin{macrocode} +\gdef\@addfield{\global\setbox\@curline\hbox{\unhbox + \@curline\unhbox\@curfield}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ifatmargin} +% \begin{macrocode} +\gdef\@ifatmargin{\ifdim \wd\@curline =\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabcr} +% \begin{macrocode} +\gdef\@tabcr{\@stopline \@ifstar{\penalty \@M \@xtabcr}\@xtabcr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xtabcr} +% \begin{macrocode} +\gdef\@xtabcr{\@ifnextchar[\@itabcr{\@startline\ignorespaces}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@itabcr} +% \begin{macrocode} +\gdef\@itabcr[#1]{\vskip #1\@startline\ignorespaces} +% \end{macrocode} +% +% \begin{macrocode} +\gdef\kill{\@stopfield\@startline\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabbing} +% \changes{v1.1f}{1995/10/23}{(CAR)Make \cs{@hightab} consistently a +% local variable} +% \changes{latex2e}{1993/12/13}{Removed optional argument of \cs{item}} +% We use |\relax| to prevent |\item| from scanning too far. +% \begin{macrocode} +\gdef\tabbing{\lineskip \z@skip\let\>\@rtab\let\<\@ltab\let\=\@settab + \let\+\@tabplus\let\-\@tabminus\let\`\@tabrj\let\'\@tablab + \let\\=\@tabcr + \@hightab\@firsttab + \global\@nxttabmar\@firsttab + \dimen\@firsttab\@totalleftmargin + \global\@tabpush\z@ \global\@rjfieldfalse + \trivlist \item\relax + \if@minipage\else\vskip\parskip\fi +% \end{macrocode} +% \changes{v1.1i}{1996/10/21}{Moved the \cs{indent} so that the +% \cs{everypar} can remove it when necessary; this is needed because +% the code for items in lists has changed (see pr/22111)} +% \begin{macrocode} + \setbox\@tabfbox\hbox{% + \rlap{\hskip\@totalleftmargin\indent\the\everypar}}% + \def\@itemfudge{\box\@tabfbox}% + \@startline\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endtabbing} +% \begin{macrocode} +\gdef\endtabbing{% + \@stopline\ifnum\@tabpush >\z@ \@badpoptabs \fi\endtrivlist} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@rtab} +% Omitted |\global| added to |\@rtab| 17 Jun 86 +% \begin{macrocode} +\gdef\@rtab{\@stopfield\@addfield\ifnum \@curtab<\@hightab + \global\advance\@curtab \@ne \else\@badtab\fi + \@tempdima\dimen\@curtab + \advance\@tempdima -\dimen\@curtabmar + \advance\@tempdima -\wd\@curline + \global\setbox\@curline\hbox{\unhbox\@curline\hskip\@tempdima}% + \@startfield\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@settab} +% \changes{v1.1f}{1995/10/23}{(CAR)Ensure that \cs{@hightab} increases +% by at most one} +% \begin{macrocode} +\gdef\@settab{\@stopfield\@addfield + \ifnum \@curtab <\@maxtab + \ifnum\@curtab =\@hightab + \advance\@hightab \@ne + \fi + \global\advance\@curtab \@ne + \else + \@latex@error{Tab overflow}\@ehd + \fi + \dimen\@curtab \dimen\@curtabmar + \advance\dimen\@curtab \wd\@curline + \@startfield + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ltab} +% \begin{macrocode} +\gdef\@ltab{\@ifatmargin\ifnum\@curtabmar >\@firsttab + \global\advance\@curtab \m@ne \global\advance\@curtabmar\m@ne\else + \@badtab\fi\else + \@latex@error{\string\<\space in mid line}\@ehd\fi\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabplus} +% \begin{macrocode} +\gdef\@tabplus{% + \ifnum\@nxttabmar<\@hightab + \global\advance\@nxttabmar\@ne + \else + \@badtab + \fi + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabminus} +% \begin{macrocode} +\gdef\@tabminus{% + \ifnum\@nxttabmar>\@firsttab + \global\advance\@nxttabmar\m@ne + \else + \@badtab + \fi + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabrj} +% \begin{macrocode} +\gdef\@tabrj{% + \@stopfield\@addfield\global\@rjfieldtrue\@startfield\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tablab} +% |\setbox\@curline| made |\global| in |\@tablab|. 17 Jun 86 +% \begin{macrocode} +\gdef\@tablab{% + \@stopfield + \global\setbox\@curline\hbox{% + \box\@curline + \hskip-\wd\@curfield \hskip-\tabbingsep + \box\@curfield + \hskip\tabbingsep}% + \@startfield + \ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pushtabs} +% \begin{macrocode} +\gdef\pushtabs{% + \@stopfield\@addfield\global\advance\@tabpush \@ne \begingroup + \@contfield} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\poptabs} +% \changes{v1.1f}{1995/10/23}{(CAR)Ensure that \cs{@curtab} is never +% larger than \cs{@hightab}} +% It is, in some sense, an error if, after the endgroup, the current +% tab setting is higher than the new value of |\@hightab| (which is +% a local variable). That this is allowed is a fundamental design +% flaw which is not going to be corrected now. +% \begin{macrocode} +\gdef\poptabs{\@stopfield\@addfield + \ifnum \@tabpush >\z@ + \endgroup + \global\advance\@tabpush \m@ne + \ifnum \@curtab >\@hightab + \global \@curtab \@hightab + \@badtab + \fi + \else + \@badpoptabs + \fi + \@contfield} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\tabbingsep} +% \begin{macrocode} +\newdimen\tabbingsep +% \end{macrocode} +% \end{macro} +% +% +% +% \subsection{array and tabular environments} +% +% \begin{oldcomments} +% +% ARRAY PARAMETERS: +% \arraycolsep +% : half the width separating columns in an array environment +% \tabcolsep +% : half the width separating columns in a tabular environment +% \arrayrulewidth +% : width of rules +% \doublerulesep +% : space between adjacent rules in array or tabular +% \arraystretch +% : line spacing in array and tabular environments is done by +% placing a strut in every row of height and depth +% \arraystretch times the height and depth of the strut +% produced by an ordinary \strut command. +% +% PREAMBLE: +% The PREAMBLE argument of an array or tabular environment can +% contain the following: +% l,r,c : indicate where entry is to be placed. +% | : for vertical rule +% @{EXP} : inserts the text EXP in every column. +% \arraycolsep or \tabcolsep spacing is suppressed. +% *{N}{PRE} : equivalent to writing N copies of PRE in the preamble. +% PRE may contain *{N'}{EXP'} expressions. +% p{LEN} : makes entry in parbox of width LEN. +% +% SPECIAL ARRAY COMMANDS: +% \multicolumn{N}{FORMAT}{ITEM} : replaces the next N column +% items by ITEM, formatted according to FORMAT. +% FORMAT should contain at most one l,r or c. +% If it contains none, then ITEM is ignored. +% +% \vline : draws a vertical line the height of the current row. May +% appear in an array element entry. +% \hline : draws a horizontal line between rows. Must appear either +% before the first entry (to appear above the first row) or +% right after a \\ command. If followed by another \hline, +% then adds a \vskip of \doublerulesep. +% +% \cline{i-j} : draws horizontal lines between rows covering columns +% i through j, inclusive. Multiple commands may follow +% one another to provide lines covering several disjoint +% columns +% \extracolsep{WIDTH} : for use inside an @ in the preamble. Causes +% a WIDTH space to be added between columns for the rest +% of the columns. This is in addition to the ordinary +% intercolumn space. +% +% \array == +% BEGIN +% \@acol == \@arrayacol +% \@classz == \@arrayclassz +% \@classiv == \@arrayclassiv +% \\ == \@arraycr +% \@halignto == NULL +% \@tabarray +% END +% +% \endarray{NAME} == BEGIN \crcr }} END +% +% \tabular == +% BEGIN +% \@halignto == NULL +% \@tabular +% END +% +% \tabular*{WIDTH} == +% BEGIN +% \@halignto == to WIDTH +% \@tabular +% END +% +% \@tabular == +% BEGIN +% \leavevmode +% \hbox { $ +% \@acol == \@tabacol +% \@classz == \@tabclassz +% \@classiv == \@tabclassiv +% \\ == \@tabularcr +% \@tabarray +% END +% +% \endtabular == BEGIN \crcr}} $} END +% +% \@tabarray == if next char = [ then \@array else \@array[c] fi +% +% \@array[POS]{PREAMBLE} == +% BEGIN +% define \@arstrutbox to make \@arstrut produce strut of height +% and depth \arraystretch times the height and +% depth of a normal strut. +% \@mkpream{PREAMBLE} +% \@preamble == \halign \@halignto {\tabskip=0pt\@arstrut +% eval{\@preamble}\tabskip = 0pt\cr %%} +% \@startpbox == \@@startpbox +% \@endpbox == \@@endpbox +% if POS = t then \vtop +% else if POS = b then \vbox +% else \vcenter +% fi fi +% { +% \par ==L {} % changed 92/09/18 +% \@sharp == # +% \protect == \relax +% \lineskip :=L 0pt +% \baselineskip :=L 0pt +% \@preamble +% END +% +% +% \@arraycr == +% BEGIN +% $ %% Prevents extra space at end of row's last entry. +% if next char = [ +% then \@argarraycr +% else $ \cr %% Needed to balance $ +% END +% +% \@argarraycr[LENGTH] == +% BEGIN +% $ %% Needed to balance $ of \@arraycr +% if LENGTH > 0 +% then \@tempdima := depth of \@arstrutbox + LENGTH +% \vrule height 0pt width 0pt depth \@tempdima +% \cr +% else \cr \noalign{\vskip LENGTH} +% END +% +% \@tabularcr and \@argtabularcr same as \@arraycr and \@argarraycr +% except without the extra $'s. +% \end{oldcomments} +% +% +% \begin{macro}{\extracolsep} +% \begin{macrocode} +\def\extracolsep#1{\tabskip #1\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\array} +% \begin{macrocode} +\def\array{\let\@acol\@arrayacol \let\@classz\@arrayclassz + \let\@classiv\@arrayclassiv + \let\\\@arraycr\let\@halignto\@empty\@tabarray} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\endarray} +% \begin{macro}{\endtabular} +% \begin{macro}{\endtabular*} +% \begin{macrocode} +\def\endarray{\crcr\egroup\egroup} +\def\endtabular{\crcr\egroup\egroup $\egroup} +\expandafter \let \csname endtabular*\endcsname = \endtabular +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\tabular} +% \begin{macrocode} +\def\tabular{\let\@halignto\@empty\@tabular} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabular*} +% \changes{v1.1j}{1998/05/18}{Use \cs{setlength}, so that +% calc extensions apply.} +% Note that the change to use |\setlength| slightly alters the +% timing of the expansion and use of the length in |#1| but this is +% very unlikely to have any practical effect. +% \changes{latex2e}{1993/08/05}{Replaced \cs{expandafter}\cs{def} +% by \cs{@namedef}.} +% \begin{macrocode} +\@namedef{tabular*}#1{% + \setlength\dimen@{#1}% + \edef\@halignto{to\the\dimen@}\@tabular} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabular} +% \begin{macrocode} +\def\@tabular{\leavevmode \hbox \bgroup $\let\@acol\@tabacol + \let\@classz\@tabclassz + \let\@classiv\@tabclassiv \let\\\@tabularcr\@tabarray} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabarray} +% RmS 91/11/04 added |\m@th|. +% \begin{macrocode} +\def\@tabarray{\m@th\@ifnextchar[\@array{\@array[c]}} +% \end{macrocode} +% \end{macro} +% +% RmS 1993/11/03 changed |\halign| to |\ialign| and removed superfluous +% |\tabskip| assignment +% +% +% \changes{v1.1i}{1996/10/21}{Moved the code associated with +% \cs{@mkpream} into the group provided by the box, for robustness +% (latex/2183)} +% \begin{macro}{\@array} +% \begin{macrocode} +\def\@array[#1]#2{% + \if #1t\vtop \else \if#1b\vbox \else \vcenter \fi\fi +% \end{macrocode} +% \changes{LaTeX2.09}{1992/09/18} +% {Changed \cs{par} to \cs{@empty} to avoid starting new row +% e.g. after \cs{hline}} +% \begin{macrocode} + \bgroup +% \end{macrocode} +% This next bit of code sets up the strut and then builds the halign +% and its preamble according to the specification in the second +% argument. +% +% This code has been moved inside the box. +% A side effect of this has been to expose what was a buglet in the +% previous version: since the |\@arstrut| below is expanded and +% contains an |\ifmmode| then it could produce an unnecessary extra +% box in every row, thus wasting `lots of' main memory. +% \begin{macrocode} + \setbox\@arstrutbox\hbox{% + \vrule \@height\arraystretch\ht\strutbox + \@depth\arraystretch \dp\strutbox + \@width\z@}% + \@mkpream{#2}% + \edef\@preamble{% + \ialign \noexpand\@halignto + \bgroup \@arstrut \@preamble \tabskip\z@skip \cr}% +% \end{macrocode} +% That is the end of setting up the preamble; now we reset +% things before executing the halign built-up in |\@preamble|. +% The restorations could be done by introducing an extra group, +% thus saving tokens. +% \changes{v1.0k}{1994/12/08}{Add \cs{tabularnewline}} +% \changes{v1.1i}{1996/10/21}{Use \cs{set@typeset@protect}} +% \begin{macrocode} + \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox + \let\tabularnewline\\% + \let\par\@empty + \let\@sharp##% + \set@typeset@protect + \lineskip\z@skip\baselineskip\z@skip +% \end{macrocode} +% If the parsing of the preamble goes wrong there my be some +% characters left which \TeX{} then tries to typeset, i.e., we +% would be in horizontal mode. That would produce an endless loop +% because the |\halign| expects vertical mode thus issues a |\par| +% but that is a no-op at this point. So we better test this case +% issue some error message and make a crude recovery by ending that +% horizontal mode with force. +% A better fix would be to ensure that we never pick up more than a +% single character token (not done). +% \changes{v1.1m}{1998/11/13}{Check for hmode to see if something +% went wrong during parsing (pr/2884)} +% \begin{macrocode} + \ifhmode \@preamerr\z@ \@@par\fi + \@preamble} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arraycr} +% Array version of |\\|. +% \begin{macrocode} +\def\@arraycr{% + ${\ifnum0=`}\fi\@ifstar\@xarraycr\@xarraycr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arraycr} +% \begin{macrocode} +\def\@xarraycr{\@ifnextchar[\@argarraycr{\ifnum0=`{\fi}${}\cr}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@argarraycr} +% \begin{macrocode} +\def\@argarraycr[#1]{% + \ifnum0=`{\fi}${}\ifdim #1>\z@ \@xargarraycr{#1}\else + \@yargarraycr{#1}\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabularnewline} +% \changes{v1.0i}{1994/11/14}{(DPC) Macro added} +% \changes{v1.0k}{1994/12/08}{(DPC) Made it \cs{relax}} +% Tabular version of |\\|. +% \begin{macrocode} +\let\tabularnewline\relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabularcr} +% \begin{macrocode} +\def\@tabularcr{% + {\ifnum0=`}\fi\@ifstar\@xtabularcr\@xtabularcr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xtabularcr} +% \begin{macrocode} +\def\@xtabularcr{\@ifnextchar[\@argtabularcr{\ifnum0=`{\fi}\cr}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@argtabularcr} +% \begin{macrocode} +\def\@argtabularcr[#1]{% + \ifnum0=`{\fi}% + \ifdim #1>\z@ + \unskip\@xargarraycr{#1}% + \else + \@yargarraycr{#1}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xargarraycr} +% \begin{macrocode} +\def\@xargarraycr#1{\@tempdima #1\advance\@tempdima \dp \@arstrutbox + \vrule \@height\z@ \@depth\@tempdima \@width\z@ \cr} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@yargarraycr} +% \begin{macrocode} +\def\@yargarraycr#1{\cr\noalign{\vskip #1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\multicolumn} +% \begin{oldcomments} +% \multicolumn{NUMBER}{FORMAT}{ITEM} == +% BEGIN +% \multispan{NUMBER} +% \begingroup +% \@addamp == null +% \@mkpream{FORMAT} +% \@sharp == ITEM +% \protect == \relax +% \@startpbox == \@@startpbox +% \@endpbox == \@@endpbox +% \@arstrut +% \@preamble +% \endgroup +% END +% \end{oldcomments} +% +% The command |\def\@addamp{}| was removed from |\multicolumn| on +% 6 Dec 86 because it caused embedded array environments not to work. I +% think that it was included originally to prevent an error message if +% the 2nd argument to the |\multicolumn| command had two column +% specifiers. +% +% 8 Feb 89 --- |\hbox{}| added after |\@preamble| to correct bug that +% occurred if |\multicolumn| preceded |\\[D]| with |D > 0|, +% caused by |\\[]| command doing an |\unskip|, which removed +% |\tabcolsep| glue inserted by |\multicolumn|. +% +% +% \changes{v1.0h}{1994/11/04}{(ASAJ) added \cs{set@typeset@protect}.} +% \changes{v1.1i}{1996/10/21}{Make \cs{multicolumn} long (latex/2180)} +% This has been made long so that, for example, a |p|-column can +% contain multiple paragraphs; maybe the arguments of |@|-expressions +% should also be able to contain multiple paragraphs. +% \begin{macrocode} +\long\def\multicolumn#1#2#3{\multispan{#1}\begingroup + \@mkpream{#2}% + \def\@sharp{#3}\set@typeset@protect + \let\@startpbox\@@startpbox\let\@endpbox\@@endpbox + \@arstrut \@preamble\hbox{}\endgroup\ignorespaces} +% \end{macrocode} +% \end{macro} +% +% \begin{oldcomments} +% Codes for classes and character numbers of array, tabular and +% multicolumn arguments. +% +% Character Class Number +% --------- ----- ------ +% c 0 0 +% l 0 1 +% r 0 2 +% +% | 1 - +% @ 2 - +% p 3 - +% {@-exp} 4 - +% {p-arg} 5 - +% +% \@testpach \foo : expands \foo, which should be an array parameter +% token, and sets \@chclass and \@chnum to its class and +% number. Uses \@lastchclass to distinguish 4 and 5 +% +% Preamble error codes +% 0: 'illegal character' +% 1: 'Missing @-exp' +% 2: 'Missing p-arg' +% +% \@addamp == +% BEGIN if @firstamp = true then @firstamp := false +% else & fi +% END +% +% \@mkpream TOKENLIST == +% BEGIN +% @firstamp := T +% \@lastchclass := 6 +% \@preamble == null +% \@sharp == \relax +% \protect == BEGIN \noexpand\protect\noexpand END +% \@startpbox == \relax +% \@endpbox == \relax +% \@expast{TOKENLIST} +% for \@nextchar := expand(\reserved@a) +% do \@testpach{\@nextchar} +% case of \@chclass +% 0 -> \@classz +% 1 -> \@classi +% ... +% 5 -> \@classv +% end case +% \@lastchclass := \@chclass +% od +% case of \@lastchclass +% 0 -> \hskip \arraycolsep % lrc +% 1 -> % | +% 2 -> \@preamerr1 % 'Missing @-exp' % @ +% 3 -> \@preamerr2 % 'Missing p-arg' % p +% 4 -> % @-exp +% 5 -> \hskip \arraycolsep % p-exp +% end case +% END +% +% \@arrayclassz == +% BEGIN +% \@preamble := \@preamble * +% case of \@lastchclass +% 0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep +% 1 -> \@addamp \hskip \arraycolsep +% 2 -> % impossible +% 3 -> % impossible +% 4 -> \@addamp +% 5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep +% 6 -> \@addamp \hskip \arraycolsep +% end case +% * case of \@chnum +% 0 -> \hfil$\relax\@sharp$\hfil +% 1 -> $\relax\@sharp$\hfil +% 2 -> \hfil$\relax\@sharp$ +% end case +% END +% +% \@tabclassz == similar to \@arrayclassz +% +% \@classi == +% BEGIN +% \@preamble := \@preamble * +% case of \@lastchclass +% 0 -> \hskip \arraycolsep \@arrayrule +% 1 -> \hskip \doublerulesep \@arrayrule +% 2 -> % impossible +% 3 -> % impossible +% 4 -> \@arrayrule +% 5 -> \hskip \arraycolsep \@arrayrule +% 6 -> \@arrayrule +% end case +% END +% +% \@classii == +% BEGIN +% \@preamble := \@preamble * +% case of \@lastchclass +% 0 -> +% 1 -> \hskip .5\arrayrulewidth +% 2 -> % impossible +% else -> +% end case +% END +% +% \@classiii == +% BEGIN +% \@preamble := \@preamble * +% case of \@lastchclass +% 0 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep +% 1 -> \@addamp \hskip \arraycolsep +% 2 -> % impossible +% 3 -> % impossible +% 4 -> \@addamp +% 5 -> \hskip \arraycolsep \@addamp \hskip \arraycolsep +% 6 -> \@addamp \hskip \arraycolsep +% end case +% END +% +% \@arrayclassiv == +% BEGIN \@preamble := \@preamble * $ \@nextchar$ END +% +% \@tabclassiv == same as \@arrayclassv except without the $ ... $ +% +% \@classv == +% BEGIN +% \@preamble := +% \@preamble * \@startpbox{\@nextchar}\ignorespaces\@sharp +% \@endpbox +% END +% +% \@expast{S}: +% Sets \reserved@a := S with all instances of *{N}{STRING} +% replaced by N copies of STRING, where N > 0. An * +% appearing inside braces is ignored, but *-expressions +% inside STRING are expanded, so nested *-expressions are +% handled properly. +% +% \@expast{S} == BEGIN \@xexpast S *0x\@@ END +% +% \@xexpast S1 *{N}{S2} S3 \@@ == +% BEGIN +% \reserved@a := S1 +% \@tempcnta := N +% if \@tempcnta > 0 +% then while \@tempcnta > 0 do \reserved@a := \reserved@a S2 +% \@tempcnta := \@tempcnta - 1 od +% \reserved@b == \@xexpast +% else \reserved@b == \@xexnoop +% fi +% \expandafter \reserved@b \reserved@a S3 \@@ +% END +% \end{oldcomments} +% +% +% \begin{macro}{\@xexnoop} +% \begin{macrocode} +\def\@xexnoop #1\@@{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@expast} +% \begin{macrocode} +\def\@expast#1{\@xexpast #1*0x\@@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xexpast} +% \begin{macrocode} +\def\@xexpast#1*#2#3#4\@@{% + \edef\reserved@a{#1}% + \@tempcnta#2\relax + \ifnum\@tempcnta>\z@ + \@whilenum\@tempcnta>\z@\do + {\edef\reserved@a{\reserved@a#3}\advance\@tempcnta \m@ne}% + \let\reserved@b\@xexpast + \else + \let\reserved@b\@xexnoop + \fi + \expandafter\reserved@b\reserved@a #4\@@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\if@firstamp} +% \begin{macro}{\@addamp} +% \begin{macrocode} +\newif\if@firstamp +% \end{macrocode} +% +% \begin{macrocode} +\def\@addamp{% + \if@firstamp + \@firstampfalse + \else + \edef\@preamble{\@preamble &}% + \fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@arrayacol} +% \begin{macro}{\@tabacol} +% \begin{macro}{\@ampacol} +% \begin{macro}{\@acolampacol} +% \begin{macrocode} +\def\@arrayacol{\edef\@preamble{\@preamble \hskip \arraycolsep}} +\def\@tabacol{\edef\@preamble{\@preamble \hskip \tabcolsep}} +\def\@ampacol{\@addamp \@acol} +\def\@acolampacol{\@acol\@addamp\@acol} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@mkpream} +% \changes{v1.0h}{1994/11/04}{(ASAJ) Added \cs{@unexpandable@protect} +% to \cs{@mkpream}.} +% \begin{macrocode} +\def\@mkpream#1{\@firstamptrue\@lastchclass6 + \let\@preamble\@empty + \let\protect\@unexpandable@protect + \let\@sharp\relax + \let\@startpbox\relax\let\@endpbox\relax + \@expast{#1}% + \expandafter\@tfor \expandafter + \@nextchar \expandafter:\expandafter=\reserved@a\do + {\@testpach\@nextchar + \ifcase \@chclass \@classz \or \@classi \or \@classii \or \@classiii + \or \@classiv \or\@classv \fi\@lastchclass\@chclass}% + \ifcase \@lastchclass \@acol + \or \or \@preamerr \@ne\or \@preamerr \tw@\or \or \@acol \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arrayclassz} +% \begin{macrocode} +\def\@arrayclassz{\ifcase \@lastchclass \@acolampacol \or \@ampacol \or + \or \or \@addamp \or + \@acolampacol \or \@firstampfalse \@acol \fi +\edef\@preamble{\@preamble + \ifcase \@chnum + \hfil$\relax\@sharp$\hfil \or $\relax\@sharp$\hfil + \or \hfil$\relax\@sharp$\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabclassz} +% RmS 91/08/14 inserted extra braces around entry for NFSS +% \begin{macrocode} +\def\@tabclassz{% + \ifcase\@lastchclass + \@acolampacol + \or + \@ampacol + \or + \or + \or + \@addamp + \or + \@acolampacol + \or + \@firstampfalse\@acol + \fi + \edef\@preamble{% + \@preamble{% + \ifcase\@chnum + \hfil +% \end{macrocode} +% \changes{v1.1p}{2018/12/30}{Add extra \cs{hskip} to guard against an +% \cs{unskip} at the start of a c-column cell (gh/102)} +% \begin{macrocode} + \hskip1sp% + \ignorespaces\@sharp\unskip\hfil + \or +% \end{macrocode} +% \changes{v1.1g}{1996/04/22} +% {(DPC) Extra \cs{hskip} keeps tabcolsep in empty columns +% internal/2122} +% \changes{v1.1h}{1996/06/14} +% {(DPC) Change both\cs{z@skip} to 1sp for latex/2160} +% \begin{macrocode} + \hskip1sp\ignorespaces\@sharp\unskip\hfil + \or + \hfil\hskip1sp\ignorespaces\@sharp\unskip + \fi}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classi} +% \begin{macrocode} +\def\@classi{% + \ifcase\@lastchclass + \@acol\@arrayrule + \or + \@addtopreamble{\hskip \doublerulesep}\@arrayrule + \or + \or + \or + \@arrayrule + \or + \@acol\@arrayrule + \or + \@arrayrule + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classii} +% \begin{macrocode} +\def\@classii{% + \ifcase\@lastchclass + \or + \@addtopreamble{\hskip .5\arrayrulewidth}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classiii} +% \begin{macrocode} +\def\@classiii{\ifcase \@lastchclass \@acolampacol \or + \@addamp\@acol \or + \or \or \@addamp \or + \@acolampacol \or \@ampacol \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@tabclassiv} +% \begin{macrocode} +\def\@tabclassiv{\@addtopreamble\@nextchar} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arrayclassiv} +% \begin{macrocode} +\def\@arrayclassiv{\@addtopreamble{$\@nextchar$}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@classv} +% \begin{macrocode} +\def\@classv{\@addtopreamble{\@startpbox{\@nextchar}\ignorespaces +\@sharp\@endpbox}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@addtopreamble} +% \begin{macrocode} +\def\@addtopreamble#1{\edef\@preamble{\@preamble #1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@chclass} +% \begin{macro}{\@lastchclass} +% \begin{macro}{\@chnum} +% \begin{macrocode} +\newcount\@chclass +\newcount\@lastchclass +\newcount\@chnum +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\arraycolsep} +% \begin{macro}{\tabcolsep} +% \begin{macro}{\arrayrulewidth} +% \begin{macro}{\doublerulesep} +% \begin{macrocode} +\newdimen\arraycolsep +\newdimen\tabcolsep +\newdimen\arrayrulewidth +\newdimen\doublerulesep +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\arraystretch} +% \begin{macrocode} +\def\arraystretch{1} % Default value. +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@arstrutbox} +% \begin{macro}{\@arstrut} +% \begin{macrocode} +\newbox\@arstrutbox +% \end{macrocode} +% +% \begin{macrocode} +\def\@arstrut{% + \relax\ifmmode\copy\@arstrutbox\else\unhcopy\@arstrutbox\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@arrayrule} +% \begin{macrocode} +\def\@arrayrule{\@addtopreamble{\hskip -.5\arrayrulewidth + \vrule \@width \arrayrulewidth\hskip -.5\arrayrulewidth}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@testpatch} +% \begin{macrocode} +\def\@testpach#1{\@chclass \ifnum \@lastchclass=\tw@ 4 \else + \ifnum \@lastchclass=3 5 \else + \z@ \if #1c\@chnum \z@ \else + \if #1l\@chnum \@ne \else + \if #1r\@chnum \tw@ \else + \@chclass \if #1|\@ne \else + \if #1@\tw@ \else + \if #1p3 \else \z@ \@preamerr 0\fi + \fi \fi \fi \fi \fi \fi +\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\hline} +% \begin{macrocode} +\def\hline{% + \noalign{\ifnum0=`}\fi\hrule \@height \arrayrulewidth \futurelet + \reserved@a\@xhline} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xhline} +% \begin{macrocode} +\def\@xhline{\ifx\reserved@a\hline + \vskip\doublerulesep +% \end{macrocode} +% Measure from the middle of the rules. +% \changes{latex2e}{1993/12/16}{Measure from middle of vertical rules} +% \begin{macrocode} + \vskip-\arrayrulewidth + \fi + \ifnum0=`{\fi}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\vline} +% \begin{macrocode} +\def\vline{\vrule \@width \arrayrulewidth} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\cline} +% \changes{v1.1c}{1995/09/14} +% {(DPC) New implementation} +% \begin{macro}{\@cline} +% The old \LaTeX2.09 implementation of |\cline| used up quite +% a lot of memory and two precious count registers. +% This new (1995/09/14) implementation does not use any count registers. +% It is coded in a way that depends heavily on the definition of +% |\multispan| so that command has been moved here from the file +% |ltplain.dtx|. +% +% These counters are no longer declared. +%\begin{verbatim} +% \newcount\@cla +% \newcount\@clb +%\end{verbatim} +% +% \begin{macrocode} +\def\cline#1{\@cline#1\@nil} +% \end{macrocode} +% +% \changes{v1.1e}{1995/10/17} +% {(DPC) Use \cs{@multicnt}} +% \begin{macrocode} +\def\@cline#1-#2\@nil{% + \omit +% \end{macrocode} +% Use the counter from |\multispan|. +% \begin{macrocode} + \@multicnt#1% + \advance\@multispan\m@ne + \ifnum\@multicnt=\@ne\@firstofone{&\omit}\fi + \@multicnt#2% + \advance\@multicnt-#1% + \advance\@multispan\@ne +% \end{macrocode} +% The original had |\unskip| at this point, +% but how could a skip get here ??? +% \begin{macrocode} + \leaders\hrule\@height\arrayrulewidth\hfill + \cr +% \end{macrocode} +% This is back spacing is fairly horrible, +% but it is what happened in the old version\ldots\ +% An alternative would be to make |\cline| look ahead for a following +% |\cline| as does |\hline|. This would alter the spacing in existing +% documents so keep the old version in the kernel. Perhaps a package +% should do this differently. +% \begin{macrocode} + \noalign{\vskip-\arrayrulewidth}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\mscount} +% The |\mscount| counter is no longer declared, saving a csname and a +% register. It is declared in compatibility mode. +% \end{macro} +% +% \begin{macro}{\multispan} +% \begin{macro}{\@multispan} +% \changes{v1.1e}{1995/10/17} +% {(DPC) Macro added.} +% \begin{macro}{\sp@n} +% Modify |\multispan| slightly from its plain \TeX\ definition +% to allow more efficient code sharing with |\multicolumn|. +% Also share a count register with |\multiput|. +% \begin{macrocode} +\def\multispan{\omit\@multispan} +% \end{macrocode} +% +% \begin{macrocode} +\def\@multispan#1{% + \@multicnt#1\relax + \loop\ifnum\@multicnt>\@ne \sp@n\repeat} +% \end{macrocode} +% +% \begin{macrocode} +\def\sp@n{\span\omit\advance\@multicnt\m@ne} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@startpbox} +% \begin{macro}{\@endpbox} +% Helper macros for `p' columns. +% +% |\@startpbox|\marg{width} \emph{text} |\egroup| is essentially +% |\parbox|\marg{width}\marg{text} +% +% |\@endpbox| is essentially |\unskip \strut \par \egroup\hfil| +% (Changed 14 Jan 89) (changed again 1994/05/13) +% +% \changes{v1.0d}{1994/05/03} +% {Use \cs{@finalstrut} based on depth of \cs{@arstrutbox}} + +% \changes{v1.1j}{1998/05/18}{Use \cs{setlength} to set \cs{hsize}, +% so that the changes in the calc package apply here.} +% \begin{macrocode} +\def\@startpbox#1{\vtop\bgroup \setlength\hsize{#1}\@arrayparboxrestore} +% \end{macrocode} +% +% \begin{macrocode} +\def\@endpbox{\@finalstrut\@arstrutbox\par\egroup\hfil} +% \end{macrocode} +% +% 14 Jan 89: Def of |\@endpbox| changed from\\ +% |\def\@endpbox{\par\vskip\dp\@arstrutbox\egroup\hfil}|\\ +% so vertical spacing works out right if the last line of a `p' entry +% has a descender. +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@@startpbox} +% \begin{macro}{\@@endpbox} +% \begin{macrocode} +\let\@@startpbox=\@startpbox +\let\@@endpbox=\@endpbox +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltthm.dtx b/Master/texmf-dist/source/latex-dev/base/ltthm.dtx new file mode 100644 index 00000000000..78e8a2e586f --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltthm.dtx @@ -0,0 +1,289 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltthm.dtx +%<*driver> +% \fi +\ProvidesFile{ltthm.dtx} + [2014/09/29 v1.0f LaTeX Kernel (Theorems)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltthm.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Theorem Environments} +% +% +% The user creates his own theorem-like environments with the command\\ +% |\newtheorem|\marg{name}\marg{text}\oarg{counter} or\\ +% |\newtheorem|\marg{name}\oarg{oldname}\marg{text}\\ +% This defines the environment \meta{name} to be just as one would +% expect a theorem environment to be, except that it prints \meta{text} +% instead of ``Theorem''. +% +% If \meta{oldname} is given, then environments \meta{name} and +% \meta{oldname} use the same counter, so using a \meta{name} +% environment advances the number of the next \meta{name} environment, +% and vice-versa. +% +% If \meta{counter} is given, then environment \meta{name} is numbered +% within \meta{counter}. +% +% E.g., if \meta{counter} = |subsection|, then the first \meta{name} in +% subsection 7.2 is numbered \meta{text} 7.2.1. +% +% The way \meta{name} environments are numbered can be changed by +% redefining |\the|\meta{name}. +% +% \StopEventually{} +% +% +% \changes{v1.0a}{1994/03/28}{Initial version, split from latex.dtx} +% \changes{v1.0c}{1994/05/25}{Modify documentation} +% \changes{v1.0f}{1995/10/10}{Make \cs{newtheorem} `only preamble'} +% \changes{v1.0g}{1995/10/16} +% {Revert to previous \cs{newtheorem} behaviour} +% +% \begin{oldcomments} +% +% DOCUMENT STYLE PARAMETERS +% +% \@thmcounter{COUNTER} : A command such that +% \edef\theCOUNTER{\@thmcounter{COUNTER}} +% defines \theCOUNTER to produce a number for a theorem environment. +% The default is: +% BEGIN \noexpand\arabic{COUNTER} END +% +% \@thmcountersep : A separator placed between a theorem number and +% the number of the counter within which it is numbered. +% E.g., to make the third theorem of section 7.2 be numbered +% 7.2-3, \@thmcountersep should be \def'ed to '-'. Its +% default is '.'. +% +% \@begintheorem{NAME}{NUMBER} : A command that begins a theorem +% environment for a 'theorem' named 'NAME NUMBER' -- +% e.g., \@begintheorem{Lemma}{3.7} starts Lemma 3.7. +% +% \@opargbegintheorem{NAME}{NUMBER}{OPARG} : +% A command that begins a theorem +% environment for a 'theorem' named 'NAME NUMBER' with optional +% argument OPARG -- e.g., \@begintheorem{Lemma}{3.7}{Jones} +% starts `Lemma 3.7 (Jones):'. +% +% \@endtheorem : A command that ends a theorem environment. +% +% \newtheorem{NAME}{TEXT}[COUNTER] == +% BEGIN +% if \NAME is definable +% then \@definecounter{NAME} +% if COUNTER present +% then \@newctr{NAME}[COUNTER] fi +% \theNAME == BEGIN \theCOUNTER \@thmcountersep +% eval\@thmcounter{NAME} END +% else \theNAME == BEGIN eval\@thmcounter{NAME} END +% \NAME == \@thm{NAME}{TEXT} +% \endNAME == \@endtheorem +% else error +% fi +% END +% +% \newtheorem{NAME}[OLDNAME]{TEXT}== +% BEGIN +% if counter OLDNAME nonexistent +% then ERROR +% else +% if \NAME is definable +% then BEGIN +% \theNAME == \theOLDNAME +% \NAME == \@thm{OLDNAME}{TEXT} +% \endNAME == \@endtheorem +% END +% else error +% fi +% fi +% END +% +% \@thm{NAME}{TEXT} == +% BEGIN +% \refstepcounter{NAME} +% if next char = [ +% then \@ythm{NAME}{TEXT} +% else \@xthm{NAME}{TEXT} +% fi +% END +% +% \@xthm{NAME}{TEXT} == +% BEGIN +% \@begintheorem{TEXT}{\theNAME} +% \ignorespaces +% END +% +% \@ythm{NAME}{TEXT}[OPARG] == +% BEGIN +% \@opargbegintheorem{TEXT}{\theNAME}{OPARG} +% \ignorespaces +% END +% \end{oldcomments} +% +% \begin{macro}{\newtheorem} +% |\newtheorem| ought really be allowed only in the preamble +% Which would be good document style, and allow some main memory to be +% saved by declaring these commands to be +% |\@onlypreamble|. Unfortunately the \LaTeX\ book indicates that +% |\newtheorem| may be used anywhere in the document\ldots +% \begin{macrocode} +%<*2ekernel> +\def\newtheorem#1{% + \@ifnextchar[{\@othm{#1}}{\@nthm{#1}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nthm} +% \begin{macrocode} +\def\@nthm#1#2{% + \@ifnextchar[{\@xnthm{#1}{#2}}{\@ynthm{#1}{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xnthm} +% +% 92/09/18 RmS: Changed |\@addtoreset| to |\@newctr| to produce error +% message if counter |#3| does not exist (to be +% consistent with behaviour of |\newcounter|) +% \begin{macrocode} +\def\@xnthm#1#2[#3]{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@newctr{#1}[#3]% + \expandafter\xdef\csname the#1\endcsname{% + \expandafter\noexpand\csname the#3\endcsname \@thmcountersep + \@thmcounter{#1}}% + \global\@namedef{#1}{\@thm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@ynthm} +% \begin{macrocode} +\def\@ynthm#1#2{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \global\@namedef{#1}{\@thm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@othm} +% \changes{LaTeX2.09}{1992/01/10} +% {(RmS) Check for existence of theorem environment} +% \changes{LaTeX2.09}{1992/08/19} +% {(RmS) Changed error message to complain about undefined +% counter} +% \changes{v1.0b}{1994/04/09}{Use standard counter error message (FMi)} +% \changes{v1.0c}{1994/04/17}{Use new std counter error message (FMi)} +% \begin{macrocode} +\def\@othm#1[#2]#3{% + \@ifundefined{c@#2}{\@nocounterr{#2}}% + {\expandafter\@ifdefinable\csname #1\endcsname + {\global\@namedef{the#1}{\@nameuse{the#2}}% + \global\@namedef{#1}{\@thm{#2}{#3}}% + \global\@namedef{end#1}{\@endtheorem}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@thm} +% \begin{macrocode} +\def\@thm#1#2{% + \refstepcounter{#1}% + \@ifnextchar[{\@ythm{#1}{#2}}{\@xthm{#1}{#2}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@xthm} +% \begin{macro}{\@ythm} +% \begin{macrocode} +\def\@xthm#1#2{% + \@begintheorem{#2}{\csname the#1\endcsname}\ignorespaces} +\def\@ythm#1#2[#3]{% + \@opargbegintheorem{#2}{\csname the#1\endcsname}{#3}\ignorespaces} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% Default values +% \begin{macro}{\@thmcounter} +% \begin{macro}{\@thmcountersep} +% \begin{macrocode} +\def\@thmcounter#1{\noexpand\arabic{#1}} +\def\@thmcountersep{.} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@begintheorem} +% \begin{macro}{\@opargbegintheorem} +% \begin{macro}{\@endtheorem} +% \changes{LaTeX2.09}{1991/08/14} +% {Moved \cs{itshape} after \cs{item} to make it work with +% NFSS} +% Providing theorem defaults. +% \task{???}{add `reset@font?} +% \begin{macrocode} +\def\@begintheorem#1#2{\trivlist + \item[\hskip \labelsep{\bfseries #1\ #2}]\itshape} +\def\@opargbegintheorem#1#2#3{\trivlist + \item[\hskip \labelsep{\bfseries #1\ #2\ (#3)}]\itshape} +\def\@endtheorem{\endtrivlist} +%</2ekernel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltvers.dtx b/Master/texmf-dist/source/latex-dev/base/ltvers.dtx new file mode 100644 index 00000000000..f8da6086ac6 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltvers.dtx @@ -0,0 +1,273 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltvers.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltvers.dtx} + [2019/07/01 v1.1c LaTeX Kernel (Version Info)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltvers.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \section{Version Identification} +% First we identify the date and version number of this release of +% \LaTeX, and set |\everyjob| so that it is printed at the start of +% every \LaTeX\ run. +% +% \StopEventually{} +% +% \changes{v1.0g}{1996/11/28} +% {Check for old format modified /2319} +% \changes{v1.0f}{1996/11/20} +% {Check for old format modified /2319} +% \changes{v1.0e}{1995/05/12} +% {Add autoload docstrip guards} +% \changes{v1.0e}{1995/05/12} +% {Check for format older than 1 year} +% \changes{v1.0d}{1994/05/25} +% {Remove PRELIMINARY TEST RELEASE from startup banner +% (spring is here)} +% \changes{v1.0b}{1994/04/12} +% {Have version info generated automatically.} +% \changes{v1.0a}{1994/03/04} +% {Initial version, split from latex.dtx} +% \changes{v1.0r}{2015/02/21}{Removed autoload code} +% \changes{v1.0t}{2015/06/23} +% {set \cs{patch@level} in ltvers rather than in ltfinal/ltpatch} +% +% \begin{macro}{\fmtname} +% \begin{macro}{\fmtversion} +% \begin{macro}{\latexreleaseversion} +% \begin{macro}{\patch@level} +% A |\patch@level| of \texttt{0} or higher denotes an official +% public release. A negative value indicates a candidate release +% that is not distributed. +% +% If we put code updates into the kernel that are supposed to go +% into the next release we set the |\patch@level| to \texttt{-1} +% and the |\fmtversion| / |\latexreleaseversion| to the dated of +% the next release (guessed, the real value is not so important and +% will get corrected when we make the release official). +% +% If the |\patch@level| is already at \texttt{-1} we do nothing +% here and use the |\fmtversion| date for any new|\IncludeInRelease| +% line when we add further code. +% +% Finally, if we do make a public release we either just set the +% |\patch@level| to zero (if our initial guess was good) or we also +% change the date and then have to additionally change to that date +% on all the |\IncludeInRelease| statements that used the +% ``guessed'' date. +% \begin{macrocode} +%<*2ekernel> +\def\fmtname{LaTeX2e} +\edef\fmtversion +%</2ekernel> +%<latexrelease>\edef\latexreleaseversion +%<*2ekernel|latexrelease> + {2019-10-01} +%</2ekernel|latexrelease> +%<*2ekernel> +\def\patch@level{-2} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Check that the format being made is not too old. +% The error message complains about `more than 5 years' +% but in fact the error is not triggered until 65 months. +% +% This code is currently not activated as we don't know if we already +% got to the last official 2e version (due to staff shortage or due to +% a successor (think positive:-)). +% \changes{v1.0i}{2001/06/04}{Check for old format disabled} +% \changes{v1.0k}{2004/01/28}{Check for old format made 5 years (pr/3601)} +% \changes{v1.0l}{2009/09/24}{Stop checking for old format} +% \begin{macrocode} +\iffalse +\def\reserved@a#1/#2/#3\@nil{% + \count@\year + \advance\count@-#1\relax + \multiply\count@ by 12\relax + \advance\count@\month + \advance\count@-#2\relax} +\expandafter\reserved@a\fmtversion\@nil +% \end{macrocode} +% |\count@| is now the age of this file in months. Take a generous +% definition of `year' so this message is not generated too often. +% \begin{macrocode} +\ifnum\count@>65 + \typeout{^^J% +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% +! You are attempting to make a LaTeX format from a source file^^J% +! That is more than five years old.^^J% +!^^J% +! If you enter <return> to scroll past this message then the format^^J% +! will be built, but please consider obtaining newer source files^^J% +! before continuing to build LaTeX.^^J% +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^^J% +} + \errhelp{To avoid this error message, obtain new LaTeX sources.} + \errmessage{LaTeX source files more than 5 years old!} +\fi +\let\reserved@a\relax +\fi +% \end{macrocode} +% +% \changes{v1.0p}{2015/01/22}{Preserve any \cs{everyjob} material inserted +% by a loader (\texttt{.ini} file)} +% \changes{v1.0v}{2015/08/23}{Allow negative patchlevel for pre-release} +% \begin{macrocode} + \ifnum\patch@level=0 + \everyjob\expandafter{\the\everyjob + \typeout{\fmtname \space<\fmtversion>}} + \immediate + \write16{\fmtname \space<\fmtversion>} + \else\ifnum\patch@level>0 + \everyjob\expandafter{\the\everyjob + \typeout{\fmtname \space<\fmtversion> patch level \patch@level}} + \immediate + \write16{\fmtname \space<\fmtversion> patch level \patch@level} + \else + \everyjob\expandafter{\the\everyjob + \typeout{\fmtname \space<\fmtversion> pre-release\patch@level}} + \immediate + \write16{\fmtname \space<\fmtversion> pre-release\patch@level} + \fi + \fi +%</2ekernel> +% \end{macrocode} +% +% \begin{macro}{\IncludeInRelease} +% \changes{v1.0w}{2015/02/21} +% {set \cs{@currname} empty here (in case \cs{IncludeInRelease} input early)} +% \begin{macrocode} +%<2ekernel>\let\@currname\@empty +% \end{macrocode} +% +% \changes{v1.0n}{2015/01/07}{macro added} +% \changes{v1.0m}{2015/01/17}{modified with \cs{@currname}} +% \changes{v1.0o}{2015/01/19}{Optional argument} +% \changes{v1.0q}{2015/02/19}{Swap argument order} +% +% \begin{macrocode} +%<*2ekernel|latexrelease> +%<latexrelease>\newif\if@includeinrelease +%<latexrelease>\@includeinreleasefalse +% \end{macrocode} +% \begin{macrocode} +\def\IncludeInRelease#1{% + \if@includeinrelease + \PackageError{latexrelease}{mis-matched IncludeInRelease}{}% + \@includeinreleasefalse + \fi + \kernel@ifnextchar[% + {\@IncludeInRelease{#1}} + {\@IncludeInRelease{#1}[#1]}} +% \end{macrocode} +% +% If a specific date has not been specified in |latexrelease| +% use `|#1|`. +% \begin{macrocode} +\def\@IncludeInRelease#1[#2]{\@IncludeInRele@se{#2}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@IncludeInRele@se#1#2#3{% + \toks@{[#1] #3}% + \expandafter\ifx\csname\string#2+\@currname+IIR\endcsname\relax + \ifnum\expandafter\@parse@version#1//00\@nil + >\expandafter\@parse@version\fmtversion//00\@nil + \GenericInfo{}{Skipping: \the\toks@}% + \expandafter\expandafter\expandafter\@gobble@IncludeInRelease + \else + \GenericInfo{}{Applying: \the\toks@}% + \@includeinreleasetrue + \expandafter\let\csname\string#2+\@currname+IIR\endcsname\@empty + \fi + \else + \GenericInfo{}{Already applied: \the\toks@}% + \expandafter\@gobble@IncludeInRelease + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\def\EndIncludeInRelease{% +\if@includeinrelease + \@includeinreleasefalse +\else + \PackageError{latexrelease}{mis-matched EndIncludeInRelease}{}% +\fi} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\@gobble@IncludeInRelease#1\EndIncludeInRelease{% + \@includeinreleasefalse + \@check@IncludeInRelease#1\IncludeInRelease\@check@IncludeInRelease + \@end@check@IncludeInRelease} +% \end{macrocode} +% \begin{macrocode} +\long\def\@check@IncludeInRelease#1\IncludeInRelease + #2#3\@end@check@IncludeInRelease{% + \ifx\@check@IncludeInRelease#2\else + \PackageError{latexrelease}{skipped IncludeInRelease}{}% + \fi} +% \end{macrocode} +% +% \begin{macrocode} +%</2ekernel|latexrelease> +% \end{macrocode} +% \end{macro} +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx b/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx new file mode 100644 index 00000000000..329353d1235 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltxdoc.dtx @@ -0,0 +1,588 @@ +% \iffalse meta-comment +% +% Copyright 1993-2018 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% \iffalse +% +%<class>\NeedsTeXFormat{LaTeX2e} +%<class>\ProvidesClass{ltxdoc} +%<class> [2018/03/15 v2.0x Standard LaTeX documentation class] +% +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{ltxdoc.cls} +\providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +\title{The file \texttt{ltxdoc.dtx} for use with + \LaTeXe.\thanks{This file has version + number \fileversion, dated \filedate.}\\[2pt] + It contains the code for \texttt{ltxdoc.cls}} +\date{\filedate} +\author{David Carlisle} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{ltxdoc.dtx} +\end{document} +%</driver> +% +% \fi +% +% +% \changes{v2.0i}{1994/04/29}{Update the documentation.} +% \changes{v2.0s}{1998/08/17}{(RmS) Documentation fixes.} +% +% \section{Documentation of the \LaTeX\ sources} +% +% This class file is designed for documenting the \LaTeX\ source files. +% You may however find it generally useful as a class for typesetting +% the documentation of files produced in `doc' format. +% +% Each documented file in the standard distribution comes with extension +% |dtx|. The appropriate class package or initex file will be extracted +% from the source by the docstrip system. Each |dtx| file may be +% directly processed with \LaTeXe, for example +%\begin{verbatim} +% latex2e docclass.dtx +%\end{verbatim} +% would produce the documentation of the Class and package interface. +% +% Each file that is used in producing the \LaTeXe\ format (ie not +% including the standard class and packages) will be printed together in +% one document if you \LaTeX\ the file |sources2e.tex|. This has the +% advantage that one can produce a full index of macro usage across all +% the source files. +% +% If you need to customise the typesetting of any of these files, there +% are two options: +% \begin{itemize} +% \item You can use \dst\ with the module `driver' to extract a small +% \LaTeX\ file that you may edit to use whatever class or package +% options you require, before inputting the source file. +% \item You can create a file |ltxdoc.cfg|. This configuration file will +% be read whenever the |ltxdoc| class is used, and so can be used to +% customise the typesetting of all the source files, without having to +% edit lots of small driver files. +%\end{itemize} +% +% The second option is usually more convenient. Various possibilities +% are discussed in the next section. +% +% \section{Customisation} +% +% The simplest form of customisation is to pass more options to the +% |article| class which is loaded by |ltxdoc|. For instance if you wish +% all the documentation to be formatted for A4 paper, add the following +% line to |ltxdoc.cfg|: +%\begin{verbatim} +% \PassOptionsToClass{a4paper}{article} +%\end{verbatim} +% +% All the source files are in two parts, separated by |\StopEventually|. +% The first part (should) contain `user' documentation. The second part +% is a full documented listing of the source code. The |doc| package +% provides the command |\OnlyDescription| which suppresses the code +% listings. This may also be used in the configuration file, but as the +% |doc| package is read later, you must delay the execution of +% |\OnlyDescription| until after the |doc| package has been read. The +% simplest way is to use |\AtBeginDocument|. Thus you could put the +% following in your |ltxdoc.cfg|. +%\begin{verbatim} +% \AtBeginDocument{\OnlyDescription} +%\end{verbatim} +% +% +% If the full source listing |sources2e.tex| is processed, then an index +% and change history are produced by default, however indices are not +% normally produced for individual files. +% +% As an example, consider |ltclass.dtx|, which contains the sources for +% the new class and package interface commands. With no |cfg| +% file, a 19~page document is produced. With the above configuration +% a slightly more readable document (4~pages) is produced. +% +% Conversely, if you really want to read the source listings in detail, +% you will want to have an index. Again the index commands provided by +% the doc package may be used, but their execution must be delayed. +%\begin{verbatim} +% \AtBeginDocument{\CodelineIndex\EnableCrossrefs} +% \AtEndDocument{\PrintIndex} +%\end{verbatim} +% +% The |doc| package writes index files to be sorted using MakeIndex with +% the |gind| style, so one would then use a command such as +%\begin{verbatim} +% makeindex -s gind.ist ltclass.idx +%\end{verbatim} +% and re-run \LaTeX. +% +% Similarly to print a Change history, you would add +%\begin{verbatim} +% \AtBeginDocument{\RecordChanges} +% \AtEndDocument{\PrintChanges} +%\end{verbatim} +% to |ltxdoc.cfg|, and use MakeIndex with a command such as +%\begin{verbatim} +% makeindex -s gglo.ist -o ltclass.gls ltclass.glo +%\end{verbatim} +% +% Finally if you do not want to list all the sections of |source2e.tex|, +% you can use |\includeonly| in the |cfg| file: +%\begin{verbatim} +% \includeonly{ltvers,ltboxes} +%\end{verbatim} +% +% \StopEventually{} +% +% +% \section{Options} +% +% \begin{macrocode} +%<*class> +\DeclareOption{a5paper}{\@latexerr{Option not supported}% + {}} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareOption*{% + \PassOptionsToClass {\CurrentOption}{article}} +% \end{macrocode} +% +% \section{Configuration} +% Input a local configuration file, if it exists. +% \begin{macrocode} +\InputIfFileExists{ltxdoc.cfg} + {\typeout{*************************************^^J% + * Local config file ltxdoc.cfg used^^J% + *************************************}} + {} +% \end{macrocode} +% +% +% \section{Option Processing} +% +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% +% \section{Loading article and doc} +% +% \begin{macrocode} +\LoadClass{article} +% \end{macrocode} +% +% \begin{macrocode} +\RequirePackage{doc} +% \end{macrocode} +% +% Make \verb+|+ be a `short verb' character, but not in the document +% preamble, where an active character may interfere with packages that +% are loaded. +% \begin{macrocode} +\AtBeginDocument{\MakeShortVerb{\|}} +% \end{macrocode} +% +% As `doc' documents tend to have a lot of monospaced material, +% Set up some |tt| substitutions to occur silently. +% \changes{v2.0p}{1995/11/02}{Add font substitutions} +% \changes{v2.0t}{1999/04/17}{Replaced octal number, CAR} +% \begin{macrocode} +\DeclareFontShape{OT1}{cmtt}{bx}{n}{<-> ssub * cmtt/m/n}{} +\DeclareFontFamily{OMS}{cmtt}{\skewchar\font 48} % '60 +\DeclareFontShape{OMS}{cmtt}{m}{n}{<-> ssub * cmsy/m/n}{} +\DeclareFontShape{OMS}{cmtt}{bx}{n}{<-> ssub * cmsy/b/n}{} +% \end{macrocode} +% This substitution is in the standard fd file, but not silent. +% \begin{macrocode} +\DeclareFontShape{OT1}{cmss}{m}{it}{<->ssub*cmss/m/sl}{} +% \end{macrocode} +% +% \begin{macrocode} +\CodelineNumbered +\DisableCrossrefs +% \end{macrocode} +% +% Increase the text width slightly so that with the standard fonts +% 72 columns of code may appear in a |macrocode| environment. +% \changes{v2.0c}{1994/03/15}{Set \cs{textwidth}.} +% \begin{macrocode} +\setlength{\textwidth}{355pt} +% \end{macrocode} +% +% Increase the marginpar width slightly, for long command names. +% And increase the left margin by a similar amount +% \changes{v2.0l} +% {1994/05/25}{Increase \cs{marginparwidth}} +% \changes{v2.0q}{1995/11/28} +% {Increase \cs{marginparwidth} and page margin.} +% \begin{macrocode} +\addtolength\marginparwidth{30pt} +\addtolength\oddsidemargin{20pt} +\addtolength\evensidemargin{20pt} +% \end{macrocode} +% +% +% \begin{macrocode} +\setcounter{StandardModuleDepth}{1} +% \end{macrocode} +% +% \section{Useful abbreviations} +% +% |\cmd{\foo}| Prints |\foo| verbatim. It may be used inside moving +% arguments. It can \emph{not} be use to record commands that are defined as +% ``|\outer|'' nor is it possible to use it on conditionals such as +% |\iftrue| or defined by |\newif|. +% |\cs{foo}| also prints |\foo|, for those who prefer that +% syntax. (This second form can be used to record all types of command so the +% above restrictions do not apply. +% \begin{macro}{\cmd} +% \changes{v2.0k}{1994/05/21}{New definition, so \cmd\{ works.} +% \begin{macro}{\cs} +% \changes{v2.0d}{1994/03/17}{Add \cs{cs}} +% \begin{macrocode} +\def\cmd#1{\cs{\expandafter\cmd@to@cs\string#1}} +\def\cmd@to@cs#1#2{\char\number`#2\relax} +\DeclareRobustCommand\cs[1]{\texttt{\char`\\#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \changes{v2.0r}{1996/01/11}{Removed \cs{star} since useless pr/2039} +% +% \begin{macro}{\marg} +% \changes{v2.0d}{1994/03/17}{Add \cs{marg}} +% |\marg{text}| prints \marg{text}, `mandatory argument'. +% \begin{macrocode} +\providecommand\marg[1]{% + {\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\oarg} +% |\oarg{text}| prints \oarg{text}, `optional argument'. +% \begin{macrocode} +\providecommand\oarg[1]{% + {\ttfamily[}\meta{#1}{\ttfamily]}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parg} +% |\parg{te,xt}| prints \parg{te,xt}, `picture mode argument'. +% \changes{v2.0h}{1994/04/28}{Add \cs{parg}} +% \changes{v2.0o}{1995/08/09}{Use \cs{meta} when showing arguments} +% \begin{macrocode} +\providecommand\parg[1]{% + {\ttfamily(}\meta{#1}{\ttfamily)}} +% \end{macrocode} +% \end{macro} +% +% +% \section{Old Comments} +% +% The \LaTeXe\ sources contain a lot of code inherited from +% \LaTeX2.09. The comments in this code were not designed to be +% typeset, and do not contain the necessary \LaTeX\ markup. The +% \texttt{oldcomments} environment typesets these comments, +% automatically sensing when any control sequence appears, and +% implicitly adding the |\verb|. This procedure does not produce +% particularly beautiful pages, but it allows us to fully document new +% sections, and have some form of typeset comments on all the old +% code. +% \changes{v2.0e}{1994/03/18}{Use a fixed font.} +% +% Scan control names and put them in tt. +% Will actually (incorrectly) scan past |\\| but this does not matter as +% this is almost never followed by a letter in practice. +% (ie |\\foo|) would put |foo| in |\ttfamily|. +% \begin{macrocode} +\def\oc@scan#1{% + \ifx\oc@bslash#1% + \egroup\let\next\oc@bslash\else + \ifcat a\noexpand#1% + #1\let\next\oc@scan\else + \ifx\oc@percent#1% + \def\next{\char`\%\egroup}% + \else + #1\let\next\egroup + \fi\fi\fi\next} +% \end{macrocode} +% +% \begin{macrocode} +\def\oc@bslash{\bgroup\oc@ttf\char`\\\oc@scan}% +% \end{macrocode} +% +% \begin{macrocode} +\def\oc@verb#1{% + \catcode`#1\active + \uccode`\~`#1% + \uppercase{\def~{{\oc@ttf\char`#1}}}} +% \end{macrocode} +% +% \begin{macrocode} +\begingroup + \obeyspaces% + \catcode`\/=\catcode`\\ + /catcode`/\/active + /catcode`<=/catcode`{% + /catcode`>=/catcode`}% + /catcode`/{/active% + /catcode`/}/active% + /gdef/oldc< \end{oldcomments}>% + /gdef/begmac< \begin{macrocode}>% + /gdef/obs</def <</oc@ttf/ >>>% +/endgroup% +% \end{macrocode} +% +% \begin{macrocode} +\begingroup + \catcode`\/=\catcode`\\ + \catcode`\\=13 + /catcode`/|=/catcode`/% + /catcode`/%=13 + /gdef/oldcomments{| + /makeatletter + /let/do/oc@verb/dospecials + /frenchspacing/@vobeyspaces/obs + /raggedright + /oc@verb/>| + /oc@verb/<| + /let\/oc@bslash + /let%/oc@percent + /obeylines + /parindent/z@ + /ttfamily/expandafter/let/expandafter/oc@ttf/the/font + /rmfamily + /hfuzz/maxdimen + } +/endgroup +% \end{macrocode} +% +% \begin{macrocode} +\begingroup + \sloppy% + \obeylines% + \gdef\oc@percent#1^^M{% + \ifvmode% + \def\commentline{#1}% + \ifx\commentline\oldc% + \end{oldcomments}% + \else% + \ifx\commentline\begmac% + \begin{macrocode}% + \else% + \leavevmode% + #1^^M% + \fi\fi% + \else% + {\oc@ttf\char`\%}#1^^M% + \fi}% +\endgroup% +% \end{macrocode} +% +% +% \section{DocInclude} +% +% \begin{macrocode} +\@addtoreset{CodelineNo}{part} +% \end{macrocode} +% +% \begin{macro}{\DocInclude} +% More or less exactly the same as |\include|, but uses |\DocInput| +% on a |dtx| file, not |\input| on a |tex| file. +% \changes{v2.0b}{1994/03/14}{Rename from \cs{docinclude}} +% \changes{v2.0f}{1994/03/25}{Use \cs{part}} +% \changes{v2.0u}{1999/08/08}{Also works for .fdd (M. Schroeder)} +% \begin{macrocode} +\def\partname{File} +% \end{macrocode} +% +% \begin{macrocode} +\newcommand*{\DocInclude}[1]{% + \relax + \clearpage + \docincludeaux + \IfFileExists{#1.fdd}% + {\def\currentfile{#1.fdd}}% + {\def\currentfile{#1.dtx}}% + \ifnum\@auxout=\@partaux + \@latexerr{\string\include\space cannot be nested}\@eha + \else \@docinclude#1 \fi} +\def\@docinclude#1 {\clearpage +\if@filesw \immediate\write\@mainaux{\string\@input{#1.aux}}\fi +\@tempswatrue\if@partsw \@tempswafalse\edef\@tempb{#1}\@for +\@tempa:=\@partlist\do{\ifx\@tempa\@tempb\@tempswatrue\fi}\fi +\if@tempswa \let\@auxout\@partaux \if@filesw +\immediate\openout\@partaux #1.aux +\immediate\write\@partaux{\relax}\fi +% \end{macrocode} +% We need to save (and later restore) various index-related +% commands which might be changed by the included file. +% \begin{macrocode} +\let\@ltxdoc@PrintIndex\PrintIndex +\let\PrintIndex\relax +\let\@ltxdoc@PrintChanges\PrintChanges +\let\PrintChanges\relax +\let\@ltxdoc@theglossary\theglossary +\let\@ltxdoc@endtheglossary\endtheglossary +\part{\currentfile}% + {\let\ttfamily\relax + \xdef\filekey{\filekey, \thepart={\ttfamily\currentfile}}}% +\DocInput{\currentfile}% +\let\PrintIndex\@ltxdoc@PrintIndex +\let\PrintChanges\@ltxdoc@PrintChanges +\let\theglossary\@ltxdoc@theglossary +\let\endtheglossary\@ltxdoc@endtheglossary +\clearpage +\@writeckpt{#1}\if@filesw \immediate\closeout\@partaux \fi +\else\@nameuse{cp@#1}\fi\let\@auxout\@mainaux} +% \end{macrocode} +% +% \changes{v2.0x}{2018/03/15}{Set up \cs{protect} in index entries} +% \begin{macrocode} +\gdef\codeline@wrindex#1{\if@filesw +% \end{macrocode} +% Set \cs{protect} to a suitable value in the index entries (we +% can't use |\set@display@protect| as that would result in different +% numer of spaces after a command depending on the number of +% expansion happening prior to writing the index). +% \begin{macrocode} + \begingroup + \let\protect\noexpand + \immediate\write\@indexfile + {\string\indexentry{#1}% + {\filesep\number\c@CodelineNo}}% + \endgroup\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\let\filesep\@empty +% \end{macrocode} +% +% +% \begin{macro}{\aalph} +% Special form of |\alph| as currently |source2e.tex| +% includes more than 26 files +% \changes{v2.0n}{1994/05/27}{Use uppercase letters, for makeindex}. +% \begin{macrocode} +\def\aalph#1{\@aalph{\csname c@#1\endcsname}} +\def\@aalph#1{% + \ifcase#1\or a\or b\or c\or d\or e\or f\or g\or h\or i\or + j\or k\or l\or m\or n\or o\or p\or q\or r\or s\or + t\or u\or v\or w\or x\or y\or z\or A\or B\or C\or + D\or E\or F\or G\or H\or I\or J\or K\or L\or M\or + N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or + X\or Y\or Z\else\@ctrerr\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\docincludeaux} +% \changes{v2.06}{1994/03/31}{Use \cs{footnotesize} in file key.} +% \changes{v2.0k}{1994/05/21}{Use \cs{aalph}} +% \changes{v2.0v}{2017/03/13}{Use \cs{parbox}[t] in file +% key to maintain space between the text block and the page foot.} +% \begin{macrocode} +\def\docincludeaux{% + \def\thepart{\aalph{part}}\def\filesep{\thepart-}% + \let\filekey\@gobble + \g@addto@macro\index@prologue{% + \gdef\@oddfoot{\parbox[t]{\textwidth}{\strut\footnotesize + \raggedright{\bfseries File Key:} \filekey}}% + \let\@evenfoot\@oddfoot}% + \global\let\docincludeaux\relax + \gdef\@oddfoot{% + \expandafter\ifx\csname ver@\currentfile\endcsname\relax + File \thepart: {\ttfamily\currentfile} % + \else + \GetFileInfo{\currentfile}% + File \thepart: {\ttfamily\filename} % + Date: \filedate\ % + Version \fileversion + \fi + \hfill\thepage}% + \let\@evenfoot\@oddfoot}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MaintainedByLaTeXTeam} +% \changes{v2.0v}{2015/03/25}{macro added} +% \changes{v2.0w}{2015/03/25}{use display block not footnote text} +% Generate boilerplate reference to bug database. +% \begin{macrocode} +\def\MaintainedBy#1{\gdef\@maintainedby{#1}} +% \end{macrocode} +% +% \begin{macrocode} +\let\@maintainedby\@empty +% \end{macrocode} +% +% \begin{macrocode} +\def\MaintainedByLaTeXTeam#1{% +{\gdef\@maintainedby{% +This file is maintained by the \LaTeX{} Project team.\\% +Bug reports can be opened (category \texttt{#1}) at\\% +\url{https://latex-project.org/bugs.html}.}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@maketitle{% + \newpage + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \ifx\@maintainedby\@empty + \else + \vskip 1em% + \fbox{\fbox{\begin{tabular}{@{}l@{}}\@maintainedby\end{tabular}}}% + \fi + \end{center}% + \par + \vskip 1.5em} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\url} +% \begin{macrocode} +\providecommand\url{\texttt} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\def\task#1#2{} +%</class> +% \end{macrocode} +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/ltxref.dtx b/Master/texmf-dist/source/latex-dev/base/ltxref.dtx new file mode 100644 index 00000000000..a5c11bf21b6 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/ltxref.dtx @@ -0,0 +1,341 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: ltxref.dtx +% +%<*driver> +% \fi +\ProvidesFile{ltxref.dtx} + [2014/09/29 v1.1k LaTeX Kernel (Cross Referencing)] +% \iffalse +\documentclass{ltxdoc} +\GetFileInfo{ltxref.dtx} +\title{\filename} +\date{\filedate} + \author{% + Johannes Braams\and + David Carlisle\and + Alan Jeffrey\and + Leslie Lamport\and + Frank Mittelbach\and + Chris Rowley\and + Rainer Sch\"opf} + +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{\filename} +\end{document} +%</driver> +% \fi +% +% +% \changes{v1.0c}{1994/03/29} +% {Create file ltcntlen from parts of ltmiscen and ltherest.} +% \changes{v1.1a}{1994/05/19} +% {Extract file ltxref from ltcntlen.} +% \changes{v1.1b}{1994/05/21}{Use new warning commands} +% \changes{v1.1c}{1994/05/25}{Modify documentation} +% +% \section{Cross Referencing} +% The user writes |\label|\marg{foo} to define the following +% cross-references: +% +% |\ref|\marg{foo}: value of most recently incremented referencable +% counter. in the current environment. (Chapter, section, +% theorem and enumeration counters counters are +% referencable, footnote counters are not.) +% +% |\pageref|\marg{foo}: page number at which |\label{foo}| command +% appeared. where foo can be any string of characters not +% containing `|\|', `|{|' or `|}|'. +% +% Note: The scope of the |\label| command is delimited by environments, +% so\\ +% |\begin{theorem} \label{foo} ... \end{theorem} \label{bar}|\\ +% defines |\ref{foo}| to be the theorem number and |\ref{bar}| to be +% the current section number. +% +% Note: |\label| does the right thing in terms of spacing -- i.e., +% leaving a space on both sides of it is equivalent to leaving +% a space on either side. +% +% +% \StopEventually{} +% +% \subsection{Cross Referencing} +% +% \begin{oldcomments} +% \begin{macrocode} +%<*2ekernel> +\message{x-ref,} +% \end{macrocode} +% +% This is implemented as follows. A referencable counter CNT is +% incremented by the command \refstepcounter{CNT} , which sets +% \@currentlabel == {CNT}{eval(\p@cnt\theCNT)}. The command +% \label{FOO} then writes the following on file \@auxout : +% \newlabel{FOO}{{eval(\@currentlabel)}{eval(\thepage)}} +% +% \ref{FOO} == +% BEGIN +% if \r@foo undefined +% then @refundefined := G T +% ?? +% Warning: 'reference foo on page ... undefined' +% else \@car \eval(\r@FOO)\@nil +% fi +% END +% +% \pageref{foo} = +% BEGIN +% if \r@foo undefined +% then @refundefined := G T +% ?? +% Warning: 'reference foo on page ... undefined' +% else \@cdr \eval(\r@FOO)\@nil +% fi +% END +% +% \end{oldcomments} +% +% \begin{macro}{\G@refundefinedtrue} +% \changes{v1.1i}{1995/12/07}{Renamed (back) from \cs{G@refundefined}} +% \begin{macro}{\@refundefined} +% \changes{v1.1h}{1995/10/24}{Switch for refundefined replaced} +% This does not save on name-space (since \cs{G@refundefinedfalse} +% was never needed) but it does make the implementation of such +% one-way switches more consistent. The extra macro to make the +% change is used since this change appears several times. +% +% \textbf{Note} despite its name, |\G@refundefinedtrue| does +% \emph{not} correspond to an |\if| command, and there is no +% matching \ldots|false|. It would be more natural to call the +% command |\G@refundefined| (as inspection of the change log will +% reveal) but unfortunately such a change would break any package +% that had defined a |\ref|-like command that mimicked the +% definition of |\ref|, calling |\G@refundefinedtrue|. Inspection +% of the \TeX\ archives revealed several such packages, and so this +% command has been named \ldots|true| so that the definition of +% |\ref| need not be changed, and the packages will work without +% change. +% \begin{macrocode} +% \newif\ifG@refundefined +% \def\G@refundefinedtrue{\global\let\ifG@refundefined\iftrue} +% \def\G@refundefinedfalse{\global\let\ifG@refundefined\iffalse} +\def\G@refundefinedtrue{% + \gdef\@refundefined{% + \@latex@warning@no@line{There were undefined references}}} +\let\@refundefined\relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +% \end{macrocode} +% \begin{macro}{\ref} +% \changes{LaTeX2e}{1993/12/11}{Macro reimplemented} +% \begin{macro}{\pageref} +% \changes{LaTeX2e}{1993/12/11}{Macro reimplemented} +% \begin{macro}{\@setref} +% \changes{LaTeX2e}{1993/12/11}{Macro added} +% \changes{v1.1h}{1995/10/24}{Switch for refundefined renamed} +% \changes{v1.1i}{1995/12/07}{Switch for refundefined restored} +% Referencing a |\label|. +% RmS 91/10/25: added a few extra |\reset@font|, +% as suggested by Bernd Raichle +% +% RmS 92/08/14: made |\ref| and |\pageref| robust +% +% RmS 93/09/08: Added setting of refundefined switch. +% \begin{macrocode} +\def\@setref#1#2#3{% + \ifx#1\relax + \protect\G@refundefinedtrue + \nfss@text{\reset@font\bfseries ??}% + \@latex@warning{Reference `#3' on page \thepage \space + undefined}% + \else + \expandafter#2#1\null + \fi} +\def\ref#1{\expandafter\@setref\csname r@#1\endcsname\@firstoftwo{#1}} +\def\pageref#1{\expandafter\@setref\csname r@#1\endcsname + \@secondoftwo{#1}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\newlabel} +% \changes{v1.1b}{1994/05/21}{Use new warning commands} +% \changes{v1.1e}{1995/04/24}{Make \cs{@onlypreamble} for /1388.} +% \changes{v1.1e}{1995/06/19} +% {Use \cs{@newl@bel} to share code with \cs{bibcite}} +% \changes{v1.1g}{1995/07/14} +% {Remove \cs{@onlypreamble} so still defined in new \cs{enddocument}} +% This command will be written to the \texttt{.aux} file to +% pass label information from one run to another. +% \begin{macro}{\@newl@bel} +% The internal form of |\newlabel| and |\bibcite|. Note that this +% macro does it's work inside a group. That way the local +% assignments it needs to do don't clutter the save stack. This +% prevents large documents with many labels to run out of save +% stack. +% \changes{v1.1h}{1995/10/24}{Switch for multiplelabels replaced by +% inline code} +% \changes{v1.1k}{2001/02/16}{Added an extra grouplevel (PR3250), jlb} +% \begin{macrocode} +\def\@newl@bel#1#2#3{{% + \@ifundefined{#1@#2}% + \relax + {\gdef \@multiplelabels {% + \@latex@warning@no@line{There were multiply-defined labels}}% + \@latex@warning@no@line{Label `#2' multiply defined}}% + \global\@namedef{#1@#2}{#3}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\newlabel{\@newl@bel r} +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\@newl@bel +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\if@multiplelabels} +% \changes{v1.1h}{1995/10/24}{Macro removed} +% \begin{macro}{\@multiplelabels} +% \changes{v1.1h}{1995/10/24}{Switch for multiplelabels removed} +% This is redefined to produce a warning if at least one label is +% defined more than once. It is executed by the |\enddocument| +% command. +% \begin{macrocode} +\let \@multiplelabels \relax +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\label} +% \changes{v1.1d}{1994/11/04}{(ASAJ)Added \cs{protected@write}} +% \begin{macro}{\refstepcounter} +% \changes{v1.1d}{1994/11/04}{(ASAJ)Added \cs{protected@edef}} +% The commands |\label| and |\refstepcounter| have been changed to +% allow |\protect|'ed commands to work properly. For example, +%\begin{verbatim} +% \def\thechapter{\protect\foo{\arabic{chapter}.\roman{section}}} +%\end{verbatim} +% will cause a |\label{bar}| command to define |\ref{bar}| to expand +% to something like |\foo{4.d}|. Change made 20 Jul 88. +% +% \begin{macrocode} +\def\label#1{\@bsphack + \protected@write\@auxout{}% + {\string\newlabel{#1}{{\@currentlabel}{\thepage}}}% + \@esphack} +% \end{macrocode} +% +% \begin{macrocode} +\def\refstepcounter#1{\stepcounter{#1}% + \protected@edef\@currentlabel + {\csname p@#1\endcsname\csname the#1\endcsname}% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@currentlabel} +% For |\label| commands that come before any environment +% +% \begin{macrocode} +\def\@currentlabel{} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</2ekernel> +% \end{macrocode} +% +% \subsection{An extension of counter referencing} +% +% +% At the moment a reference to a counter |foo| will generate the +% equivalent of |\p@foo\thefoo| although not quite in this form. For +% some applications it would be nice of one could have |\thefoo| being +% an argument to |\p@foo| to be able to put material before and after +% the number generated by |\thefoo|. This can be easily achieved with +% a small change to one of the kernel commands as follows: +% +%\begin{verbatim} +%\def\refstepcounter#1{\stepcounter{#1}% +% \protected@edef\@currentlabel +% {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}% +%} +%\end{verbatim} +% +% The trick is to ensure that |\csname the#1\endcsname| is turned into +% a single token before |\p@...| is expanded further. This way, if the +% |\p@...| command is a macro with one argument it will receive +% |\the...|. With the kernel code (i.e., without the |\expandafter|) +% it will instead pick up |\csname| which would be disastrous. +% +% Using |\expandafter| instead of braces delimiting the argument is +% better because, assuming that the |\p@...| command is not defined as +% a macro with one argument, the braces will stay and prohibit kerning +% that might otherwise happen between the glyphs generated by +% |\the...| and surrounding glyphs. +% +% We have refrained from making this change in the kernel code +% although for existing documents it would be 100\% backward +% compatible. The reason being that any class or package making use of +% this functionality would then horribly fail with older \LaTeX{} +% installations. +% +% Instead we suggest that people who are interested in using this +% functionality in a document class or package add the redefinition to +% the class file. To ensure that this redefinition is properly applied +% they might want to test for the original definition first, e.g. +% +%\begin{verbatim} +%\CheckCommand*\refstepcounter[1]{\stepcounter{#1}% +% \protected@edef\@currentlabel +% {\csname p@#1\endcsname\csname the#1\endcsname}% +%} +%\renewcommand*\refstepcounter[1]{\stepcounter{#1}% +% \protected@edef\@currentlabel +% {\csname p@#1\expandafter\endcsname\csname the#1\endcsname}% +%} +%\end{verbatim} +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/makeindx.dtx b/Master/texmf-dist/source/latex-dev/base/makeindx.dtx new file mode 100644 index 00000000000..280416f65b2 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/makeindx.dtx @@ -0,0 +1,313 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +%\iffalse +% Copyright (C) 1985 by Leslie Lamport +% Copyright (C) 1994-98 by \LaTeX3 Project and Johannes Braams +%\fi +% +% \changes{1.0b}{1994/01/21}{added a missing \cs{end\{macro\}}, a +% missing docstrip end of module and corrected a few typos} +% \changes{1.0d}{1994/02/11}{Corrected a few documentation errors; +% added \cs{Checksum}} +% \changes{1.0e}{1994/02/22}{Another documentation flaw fixed} +% \changes{1.0f}{1994/03/01}{Moved driver further up; corrected a few +% errors} +% \changes{1.0f}{1994/03/01}{Added overview of {\sc docstrip} modules} +% \changes{1.0i}{1994/11/11}{(DPC) Removed spurious \cs{wlog}} +% \changes{1.0k}{1998/08/17}{(RmS) Minor documentation corrections.} +% \changes{1.0m}{2000/03/29}{(RmS) Added macros \cs{seealso} and \cs{alsoname}.} +% +%\title{Standard \LaTeXe\ packages \texttt{makeidx} and +% \texttt{showidx}} +% +% \author{% +% Johannes Braams\and +% David Carlisle\and +% Alan Jeffrey\and +% Leslie Lamport\and +% Frank Mittelbach\and +% Chris Rowley\and +% Rainer Sch\"opf} +% +% \date{2014/09/29} +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Description} +% +% \subsection{Makeidx} +% +% The package \texttt{makeidx} provides two new commands, |\see| +% and |\printindex|. +% +% \DescribeMacro\see +% The command |\see| can used in the index to cross reference to +% other items. +% +% \DescribeMacro\printindex +% This command can be used to include the sorted and formatted +% index in the document. +% +% \subsection{Showidx} +% +% The package \texttt{showidx} changes a number of internal +% \LaTeXe\ commands in such a way that each index entry is shown in +% the margin on the page where the entry appears. This package was +% originally meant to be used with the \texttt{report} and +% \texttt{book} document classes, but works with other classes as +% well. It makes |\flushbottom| the default. +% +% \StopEventually{} +% +% \section{The {\sc docstrip} modules} +% +% The following modules are used in the implementation to direct +% {\sc docstrip} in generating the external files: +% \begin{center} +% \begin{tabular}{ll} +% makeidx & produce makeidx.sty\\ +% showidx & produce showidx.sty\\ +% driver & produce a documentation driver file \\ +% \end{tabular} +% \end{center} +% +% \section{The documentation driver file} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It can be extracted from this file by the +% {\sc docstrip} program. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\begin{document} +\DocInput{makeindx.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \section{Implementation} +% +% \subsection{Identification} +% +% Announce the package and its version: +% \changes{v1.0h}{1994/05/01}{Removed use of variables} +% \begin{macrocode} +%<makeidx>\ProvidesPackage{makeidx} +%<showidx>\ProvidesPackage{showidx} + [2014/09/29 v1.0m Standard LaTeX package] +% \end{macrocode} +% +% \subsection{Makeidx} +% +% \begin{macro}{\see} +% This macro discards its second argument (typically a page number) +% and just prints |\seename| together with the entry the reader is +% pointed to. +% \changes{v1.0j}{1995/04/19}{Use \cs{emph} instead of \cs{em}} +% \changes{v1.0j}{1995/04/19}{Disallow \cs{par} in argument} +% \begin{macrocode} +%<*makeidx> +\newcommand*\see[2]{\emph{\seename} #1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\seealso} +% \changes{v1.0m}{2000/03/29}{Macro added (see PR 3133).} +% This macro discards its second argument (typically a page number) +% and just prints |\alsoname| together with the entry the reader is +% pointed to. We use |\providecommand| to retain compatibility with +% existing files that define this macro. +% \begin{macrocode} +\providecommand*\seealso[2]{\emph{\alsoname} #1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\printindex} +% This command simply inputs the (formatted) index if it exists, +% otherwise a warning is issued. +% \changes{1.0c}{1994/02/08}{Use \cs{@input@} instead of \cs{@input} to +% get the index listed by \cs{listfiles}} +% \begin{macrocode} +\newcommand\printindex{\@input@{\jobname.ind}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\seename} +% This package is for documents prepared in the English language. +% To prepare a version for another language, various English words +% must be replaced. All the English words that require replacement +% are% defined below in command names. +% \changes{1.0g}{1994/03/07}{Replaced \cs{newcommand} by \cs{providecommand}.} +% \begin{macrocode} +\providecommand\seename{see} +% \end{macrocode} +% We used |\providecommand| in case the command is already defined +% by a package loaded earlier. +% \end{macro} +% +% \begin{macro}{\alsoname} +% \changes{v1.0m}{2000/03/29}{Macro added (see PR 3133).} +% This macro discards its second argument (typically a page number) +% and just prints |\alsoname| together with the entry the reader is +% pointed to. We use |\providecommand| to retain compatibility with +% existing files that define this macro. +% \begin{macrocode} +\providecommand*\alsoname{see also} +%</makeidx> +% \end{macrocode} +% \end{macro} +% +% \subsection{showidx} +% +% \begin{macro}{\indexbox} +% This package uses \TeX's insert mechanism, therefore it needs to +% allocate an insert register. +% \begin{macrocode} +%<*showidx> +\newinsert\indexbox +\dimen\indexbox=\maxdimen +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\index} +% This is a modified default definition for the user level |\index| +% command. The difference is the change of the category code of the +% space character. +% \begin{macrocode} +\renewcommand\index{\@bsphack\begingroup + \@sanitize\catcode32=10\relax\@index} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\makeindex} +% The same change has to be included in the user level |\makeindex| +% command, which changes the definition of |\index| to actually +% write index entries to an external file. +% \begin{macrocode} +\renewcommand\makeindex{\if@filesw \newwrite\@indexfile + \immediate\openout\@indexfile=\jobname.idx + \def\index{\@bsphack\begingroup + \def\protect####1{\string####1\space}\@sanitize + \catcode32=10 \@wrindex\@indexfile}\typeout + {Writing index file \jobname.idx }\fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@wrindex} +% This macro takes care of writing the index entries to a file. The +% definition is modified to call |\@showidx|. +% \begin{macrocode} +\def\@wrindex#1#2{\let\thepage\relax + \xdef\@gtempa{\write#1{\string + \indexentry{#2}{\thepage}}}\endgroup\@gtempa + \@showidx{#2}\if@nobreak \ifvmode\nobreak\fi\fi\@esphack} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@index} +% When the user didn't use the |\makeindex| command, the |\index| +% macro calls |\@index|, which normally does basically nothing. +% This package changes the definition to call |\@showidx|, which +% includes the entry in the list of indexentries on the current page. +% \begin{macrocode} +\def\@index#1{\@showidx{#1}\endgroup\@esphack} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@showidx} +% This macro adds the current index entry to the insert +% |\indexbox|. The |\indexbox| is typeset as a flushleft paragraph. +% \begin{macrocode} +\def\@showidx#1{% + \insert\indexbox{\small + \hsize\marginparwidth + \hangindent\marginparsep \parindent\z@ + \everypar{}\let\par\@@par \parfillskip\@flushglue + \lineskip\normallineskip + \baselineskip .8\normalbaselineskip\sloppy + \raggedright \leavevmode + \vrule \@height .7\normalbaselineskip \@width \z@\relax + #1\relax + \vrule \@height \z@ \@depth .3\normalbaselineskip \@width \z@}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\raggedbottom} +% \begin{macro}{\flushbottom} +% The definition of these macros from \texttt{latex.dtx} is changed +% here to add the execution of |\@mkidx| to |\@texttop|, which is +% executed at the top of each page. +% \begin{macrocode} +\renewcommand\raggedbottom{\def\@textbottom{\vskip + \z@ plus.0001fil}\let\@texttop\@mkidx} +\renewcommand\flushbottom{\let\@textbottom\relax + \let\@texttop\@mkidx} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@mkidx} +% This macro actually typesets the box containing all the index +% entries on the current page. They will occur on the left or the +% right side of the text, or both, depending on the setting of the +% switches |\if@twocolumn| and |\if@twoside|. +% \begin{macrocode} +\def\@mkidx{\vbox to \z@{\hbox{\if@twocolumn + \if@firstcolumn \@leftidx \else \@rightidx \fi + \else \if@twoside \ifodd\c@page \@rightidx + \else \@leftidx \fi + \else \@rightidx \fi + \fi + \box\indexbox}\vss}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@leftidx} +% \begin{macro}{\@rightidx} +% These macros give the amount of displacement for the |\indexbox|. +% \begin{macrocode} +\def\@leftidx{\hskip-\marginparsep \hskip-\marginparwidth} +\def\@rightidx{\hskip\columnwidth \hskip\marginparsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% To make this work we have to execute either |\raggedbottom| or +% |\flushbottom|. Assuming this package is used most often with the +% document classes \texttt{report} and \texttt{book}, we execute +% |\flushbottom|. +% \begin{macrocode} +\flushbottom +%</showidx> +% \end{macrocode} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/makeindx.ins b/Master/texmf-dist/source/latex-dev/base/makeindx.ins new file mode 100644 index 00000000000..d7ad42e2f95 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/makeindx.ins @@ -0,0 +1,104 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generate{\file{makeidx.sty}{\from{makeindx.dtx}{makeidx}} + \file{showidx.sty}{\from{makeindx.dtx}{showidx}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space makeidx.sty} +\Msg{* \space\space showidx.sty} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/newdc.ins b/Master/texmf-dist/source/latex-dev/base/newdc.ins new file mode 100644 index 00000000000..5bbbe900da5 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/newdc.ins @@ -0,0 +1,133 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\Msg{*** Generating font defs for Cork encoded + and Text Companion fonts ***} + +\generate{ + \file{t1cmfib.fd}{ + \from{cmfonts.fdd}{fd,T1cmfib,new}} + \file{t1cmfr.fd}{ + \from{cmfonts.fdd}{fd,T1cmfr,new}} + \file{t1cmdh.fd}{ + \from{cmfonts.fdd}{fd,T1cmdh,new}} + \file{t1cmr.fd}{ + \from{cmfonts.fdd}{fd,T1cmr,new}} + \file{t1cmss.fd}{ + \from{cmfonts.fdd}{fd,T1cmss,new}} + \file{t1cmtt.fd}{ + \from{cmfonts.fdd}{fd,T1cmtt,tt,new,nowarn}} + \file{t1cmvtt.fd}{ + \from{cmfonts.fdd}{fd,T1cmvtt,tt,new}} + \file{ts1cmr.fd}{ + \from{cmfonts.fdd}{fd,TS1cmr,new}} + \file{ts1cmss.fd}{ + \from{cmfonts.fdd}{fd,TS1cmss,new}} + \file{ts1cmtt.fd}{ + \from{cmfonts.fdd}{fd,TS1cmtt,new,tt}} + \file{ts1cmvtt.fd}{ + \from{cmfonts.fdd}{fd,TS1cmvtt,new,tt}} +} + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.fdd' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile + diff --git a/Master/texmf-dist/source/latex-dev/base/newlfont.dtx b/Master/texmf-dist/source/latex-dev/base/newlfont.dtx new file mode 100644 index 00000000000..f058ddced9b --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/newlfont.dtx @@ -0,0 +1,204 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +%\iffalse % this is a METACOMMENT ! +% +%% File `newlfont.dtx'. +%% Copyright (C) 1989-1998 Frank Mittelbach and Rainer Sch\"opf, +%% all rights reserved. +% +%<*dtx> + \ProvidesFile{newlfont.dtx} +%</dtx> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{newlfont} +%<driver> \ProvidesFile{newlfont.drv} +% \fi +% \ProvidesFile{newlfont.dtx} + [1998/08/17 v2.2m Standard LaTeX package] +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\begin{document} +\DocInput{newlfont.dtx} +\end{document} +%</driver> +% \fi +% +% +% +% +% \changes{v2.2a}{1994/01/17}{Added missing definitions to support +% newlfont in compat mode} +% \changes{v2.2b}{1994/01/27}{Removed if@compat test since +% these settings need also be executed in 2e mode.} +% \changes{v2.2c}{1994/03/06}{Added def for \cs{cal} and \cs{mit}} +% \changes{v2.2l}{1995/11/29}{Remove duplicate driver code.} +% \changes{v2.2m}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% \providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +% +% +% \GetFileInfo{newlfont.dtx} +% +% \title{The file \texttt{newlfont.dtx} for use with +% \LaTeXe.\thanks{This file has version +% number \fileversion, dated \filedate.}\\[2pt] +% It contains the code for \texttt{newlfont.sty}} +% +% \author{Frank Mittelbach} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% +% This file contains the code for the \texttt{newlfont} package +% which provides defines commands like |\rm| to behave as with +% NFSS1, i.e., to change one font attribute without resetting the +% other attributes. +% +% \StopEventually{} +% +% +% \section{The Code} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% We define the font commands for selecting the typeface. They are +% probably defined by the document class/style but we want to force +% the old meaning from NFSS1. +% +% \changes{v2.2g}{1994/05/11}{DPC Remove definitions of \cs{prm} etc.} +% \begin{macrocode} +\let\rm\rmfamily +\let\sf\sffamily +\let\tt\ttfamily +\let\bf\bfseries +\let\sl\slshape +\let\sc\scshape +\let\it\itshape +% \end{macrocode} +% We also have to define the \emph{emphasize} font change command +% (i.e.\ |\em|). This command will look whether the current font is +% sloped (i.e.\ has a positive |\fontdimen1|) and will then select +% either an upright or italic font. +% \changes{v2.2g}{1994/05/11}{DPC use \cs{DeclareProtectedCommand}} +% \changes{v2.2h}{1994/05/13}{DPC renamed to \cs{DeclareRobustCommand}} +% \begin{macrocode} +\DeclareRobustCommand\em{% + \@nomath\em + \ifdim \fontdimen\@ne\font >\z@\upshape \else \itshape \fi} +% \end{macrocode} +% +% For compatibility with old sources we should define the following +% commands although their use in new documents is discouraged. +% \begin{macrocode} +\let\mediumseries\mdseries +\let\normalshape\upshape +% \end{macrocode} +% +% In case \texttt{newlfont} is used in compatibility mode, eg +%\begin{verbatim} +% \documentstyle[newlfont]{article} +%\end{verbatim} +% or with the \texttt{oldlfont} package already loaded +% we have to undo a number of settings changed by the compatibility +% mode for \LaTeX~2.09 documents. +% +% |\@setfontsize| should not have a |\reset@font| included. +% \changes{v2.2j}{1994/11/06}{Use \cs{@typeset@protect}} +% \begin{macrocode} +\def\@setfontsize#1#2#3{\@nomath#1% + \ifx\protect\@typeset@protect + \let\@currsize#1% + \fi + \fontsize{#2}{#3}\selectfont} +% \end{macrocode} +% Math alphabet identifiers should have an argument. +% \changes{v2.2d}{1994/03/10}{Changed \cs{begingroup}/\cs{endgroup} to +% \cs{bgroup}/\cs{egroup}.} +% \changes{v2.2f}{1994/05/05}{Added saved versions of the +% math-groupers, CAR} +% \begin{macrocode} +\let\math@bgroup\bgroup +\def\math@egroup#1{#1\egroup} +\let \@@math@bgroup \math@bgroup +\let \@@math@egroup \math@egroup +% \end{macrocode} +% Warn again, if text font commands are used in math +% (same macro as in \texttt{lfonts.dtx}). +% \changes{v2.2e}{1994/04/21}{Changed error message} +% \changes{v2.2k}{1995/04/02}{add \cs{noexpand} to second part of message} +% \begin{macrocode} +\def\not@math@alphabet#1#2{% + \relax + \ifmmode + \@latex@error{Command \noexpand#1invalid in math mode}% + {% + Please + \ifx#2\relax + define a new math alphabet^^J% + if you want to use a special font in math mode% + \else +% \end{macrocode} +% We have to add |\noexpand| below to prevent expansion of |#2|. In +% case of |#1| we can omit this (due to the current definition of +% robust commands since they do come out right there :-). +% \begin{macrocode} + use the math alphabet \noexpand#2instead of + the #1command% + \fi + . + }% + \fi} +% \end{macrocode} +% +% In NFSS1 math alphabets had arguments so we have to change |\cal| +% and |\mit| which by default are defined to behave like in +% \LaTeX209. +% \begin{macrocode} +\let\pcal\@undefined +\let\cal\mathcal +\let\pmit\@undefined +\let\mit\mathnormal +% \end{macrocode} +% +% The NFSS1 version of \texttt{newlfont} included the \LaTeX{} +% symbols. And that is probably all there is. +% \begin{macrocode} +\RequirePackage{latexsym} +%</package> +% \end{macrocode} +% +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx b/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx new file mode 100644 index 00000000000..00b82a14990 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/nfssfont.dtx @@ -0,0 +1,497 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +\def\nfssfontfileversion{v2.2d} +\def\nfssfontfiledate{2015/02/01} + +% +% \iffalse +% Copyright (C) 1994 Donald E. Knuth +% Copyright (C) 1994-2019 Frank Mittelbach, +% all rights reserved. +% \fi +% +% +% \title{The program \texttt{nfssfont}} +% \author{Frank Mittelbach\thanks{Adapted from code written +% by Donald E.~Knuth}} +% \date{\nfssfontfiledate} +% +% +% \def\dst{{\normalfont\scshape docstrip}} +% \def\NFSS{\textsf{NFSS}} +% \setcounter{StandardModuleDepth}{1} +% +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% +% Within the \NFSS{} distribution there is a \LaTeX{} file +% \texttt{nfssfont.tex} which can be used to test new fonts, produce +% font tables showing all characters, etc. This is an addaption of a +% program originally written by Don Knuth. + +% When you run this file through \LaTeX{} you will be asked to enter +% the name of the font to test. Your answer should be the external +% font name without any extension, e.g.\ \texttt{cmr10} (Computer +% Modern Roman 10pt) or \texttt{yinit} (Yannis Haralambous' Initial +% font). +% +% Alternatively (since version 2.1), you can press \meta{return} at +% this point. In that case a dialog is started that asks you for the +% font characteristics in \NFSS{} notation, i.e., first for the +% encoding scheme (default \texttt{T1}), then for the family name +% (default \texttt{cmr}), then for the series (default \texttt{m}), +% then for the shape (default \texttt{n}), and finally for the size +% (default \texttt{10pt}). +% +% You are then requested to enter a command. Probably the most +% important one is |\table|, which will produce a font chart. To +% switch to a new test font, type |\init|; to finish the test, type +% |\bye|; and to learn about all the other possible tests type +% |\help|. +% +% This is at +% the moment only a crude addaption of the test program for the +% Computer Modern fonts by Donald Knuth. +% +% \StopEventually{} +% +% \section{A driver for this document} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the +% \dst{} program. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} + % \OnlyDescription % comment out for implementation details +\begin{document} + \DocInput{nfssfont.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% \section{The code} +% +% A testbed for font evaluation (see The METAFONTbook, Appendix H) +% changed for \LaTeX{} with \NFSS. +% +% This program should get a complete rewrite some day or at least some +% code documentation. Any volunteers? +% \begin{macrocode} +%<*code> +\documentclass{article} +\nofiles +\setlength\textwidth{470pt} +\setlength\oddsidemargin{0pt} +\addtolength\textheight{7\baselineskip} +\addtolength\topmargin{-3\baselineskip} + +\def\sevenrm{\fontencoding{OT1}\fontsize{7}{9pt}\rmfamily} + +\typeout{**********************************************} +\typeout{* NFSS font test program version <\nfssfontfileversion>} +\typeout{*} +\typeout{* Follow the instructions} +\typeout{**********************************************} +\typeout{} + +\tracinglostchars=0 +\tolerance=1000 +\raggedbottom +\parindent=0pt +%\newlinechar=`@ %FMi +\hyphenpenalty=200 +\doublehyphendemerits=30000 +% \end{macrocode} +% +% \begin{macrocode} +\newcount\m \newcount\n \newcount\p \newdimen\dim +\chardef\other=12 + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\def\hours{\n=\time \divide\n 60 + \m=-\n \multiply\m 60 \advance\m \time + \twodigits\n\twodigits\m} +\def\twodigits#1{\ifnum #1<10 0\fi \number#1} +% \end{macrocode} +% +% We first ask for a real external font name\ldots +% \begin{macrocode} +\def\init{% + \typein[\currfontname]% + {Input external font name, e.g., cmr10^^J% + (or <enter> for NFSS classification of font):}% +% \end{macrocode} +% If the answer is a real font name (like ``cmr10'') then we have no idea +% what the encoding of this font is, so in this case we record the word +% ``unknown'' and internally assume |T1| encoding. Commands other than +% |\table| are then most likely going to fail, unless that assumption was +% correct. +% \begin{macrocode} + \def\encoding{unknown}% + \fontencoding{T1}\selectfont +% \end{macrocode} +% If the user answers with ``return'' we ask for the \NFSS{} +% classification of the font in form of encoding, family, series, +% shape, and size offering a default each time. +% \begin{macrocode} + \ifx\currfontname\empty + \typein[\encoding]{^^J^^J*** NFSS classification + ***^^J^^JFont encoding [T1]:}% + \ifx\encoding\empty + \fontencoding{T1}% + \def\encoding{T1}% + \else +% \end{macrocode} +% Depending on the chosen encoding we have the problem, that the encoding +% support information may not be available (only for |T1| and |OT1| this is +% preloaded in the kernel, all other encodings normally need a declaration in +% the preamble). So here we attempt to load this support file even though +% it is actually already too late for this. +% \begin{macrocode} + \edef\next{% + \lowercase{\def\noexpand\next{\encoding enc.def}}}% + \next + \makeatletter + \InputIfFileExists\next + {}% +% \end{macrocode} +% If the encoding support file is not found this may indicate an error, eg +% something misspelled. However, it may equally mean that we dealing +% with a math font encoding for which no encoding support is +% available. +% \begin{macrocode} + {\PackageWarningNoLine{nfssfont}% + {Encoding file `\next' not found.% + \MessageBreak + You might have misspelt the name of the encoding + \MessageBreak + or perhaps this encoding is not a text encoding, + \MessageBreak + in which case you will probably only be able to + \MessageBreak + run the \noexpand\table command successfully}% +% \end{macrocode} +% But actually the situation is even worse, as some math +% encodings do have such support files. So for them we need to make the encoding +% known to NFSS in some other way, otherwise we could not even find the +% external font name, let alone typesetting a |\table|. +% \begin{macrocode} + \expandafter\let\csname T@\encoding\endcsname\empty + }% + \makeatother + \let\next\relax + \fontencoding\encoding + \fi + \typein[\family]{Font family [cmr]:}% + \relax + \ifx\family\empty + \fontfamily{cmr}% + \else + \fontfamily\family + \fi + \typein[\series]{Font series [m]:}% + \ifx\series\empty + \fontseries{m}% + \else + \fontseries\series + \fi + \typein[\shape]{Font shape [n]:}% + \ifx\shape\empty + \fontshape{n}% + \else + \fontshape\shape + \fi + \typein[\size]{Font size [10pt]:}% + \ifx\size\empty + \fontsize{10}{10}% + \else + \fontsize\size\size + \fi +% \end{macrocode} +% Then select the font and assign it to |\currfontname|. +% \begin{macrocode} + \selectfont\edef\currfontname{\fontname\font}% + \fi + \startfont +% \end{macrocode} +% Finally we ask for some ``action'' and offer |\table\bye| as +% default---basically I got tired of having to type that in each +% time. +% If some other action is given you end with a |*| prompt and have +% to finish the run with |\bye| yourself eventually. +% \begin{macrocode} + \typein[\action]{Now type a test command or + \string\help\space for help [ \string\table\space\string\bye\space]:}% + \ifx\action\empty + \expandafter\table\expandafter\bye + \fi +} +% \end{macrocode} +% +% \begin{macrocode} +\def\startfont{\font\testfont=\currfontname + \leftline{\sevenrm Test of font \currfontname\unskip\ (encoding + \encoding\unskip) on \today\ at \hours} + \medskip + \testfont \setbaselineskip + \ifdim\fontdimen6\testfont<10pt \rightskip=0pt plus 20pt + \else\rightskip=0pt plus 2em \fi + \spaceskip=\fontdimen2\testfont % space between words (\raggedright) + \xspaceskip=\fontdimen2\testfont \advance\xspaceskip + by\fontdimen7\testfont} +% \end{macrocode} +% +% \begin{macrocode} +{\catcode`\|=0 \catcode`\\=\other +|gdef|help{|message{% +\init switches to another font;^^J% +\stop or \bye finishes the run;^^J% +\table prints the font layout in tabular format;^^J% +\text prints a sample text, assuming TeX text font conventions;^^J% +\sample combines \table and \text;^^J% +\mixture mixes a background character with a series of others;^^J% +\alternation interleaves a background character with a series;^^J% +\alphabet prints all lowercase letters within a given background;^^J% +\ALPHABET prints all uppercase letters within a given background;^^J% +\series prints a series of letters within a given background;^^J% +\lowers prints a comprehensive test of lowercase;^^J% +\uppers prints a comprehensive test of uppercase;^^J% +\digits prints a comprehensive test of numerals;^^J% +\math prints a comprehensive test of TeX math italic;^^J% +\names prints a text that mixes upper and lower case;^^J% +\punct prints a punctuation test;^^J% +\bigtest combines many of the above routines;^^J% +\help repeats this message;^^J% +and you can use ordinary TeX commands (e.g., to \input a file).}}} + +\def\setbaselineskip{\setbox0=\hbox{\n=0 +\loop\char\n \ifnum \n<255 \advance\n 1 \repeat} +\baselineskip=6pt \advance\baselineskip\ht0 \advance\baselineskip\dp0 } +% \end{macrocode} +% +% \begin{macrocode} +\def\setchar#1{{\escapechar-1\message{\string#1 character = }% + \def\do##1{\catcode`##1=\other}\dospecials + \read-1 to\next + \expandafter\finsetchar\next\next#1}} +\def\finsetchar#1#2\next#3{\global\chardef#3=`#1 + \ifnum #3=`\# \global\chardef#3=#2 \fi} +\def\promptthree{\setchar\background + \setchar\starting \setchar\ending} + +\def\mixture{\promptthree \domix\mixpattern} +\def\alternation{\promptthree \domix\altpattern} +\def\mixpattern{\0\1\0\0\1\1\0\0\0\1\1\1\0\1} +\def\altpattern{\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0\1\0} +\def\domix#1{\par\chardef\0=\background \n=\starting + \loop \chardef\1=\n #1\endgraf + \ifnum \n<\ending \advance\n 1 \repeat} + +\def\!{\discretionary{\background}{\background}{\background}} +\def\series{\promptthree \!\doseries\starting\ending\par} +\def\doseries#1#2{\n=#1\loop\char\n\!\ifnum\n<#2\advance\n 1 \repeat} +\def\complower{\!\doseries{`a}{`z}\doseries{'31}{'34}\par} +\def\compupper{\!\doseries{`A}{`Z}\doseries{'35}{'37}\par} +\def\compdigs{\!\doseries{`0}{`9}\par} +\def\alphabet{\setchar\background\complower} +\def\ALPHABET{\setchar\background\compupper} + +\def\lowers{\docomprehensive\complower{`a}{`z}{'31}{'34}} +\def\uppers{\docomprehensive\compupper{`A}{`Z}{'35}{'37}} +\def\digits{\docomprehensive\compdigs{`0}{`4}{`5}{`9}} +\def\docomprehensive#1#2#3#4#5{\par\chardef\background=#2 + \loop{#1} \ifnum\background<#3\m=\background\advance\m 1 + \chardef\background=\m \repeat \chardef\background=#4 + \loop{#1} \ifnum\background<#5\m=\background\advance\m 1 + \chardef\background=\m \repeat} +% \end{macrocode} +% +% \begin{macrocode} +\def\names{ {\AA}ngel\aa\ Beatrice Claire + Diana \'Erica Fran\c{c}oise Ginette H\'el\`ene Iris + Jackie K\=aren {\L}au\.ra Mar{\'\i}a N\H{a}ta{\l}{\u\i}e {\O}ctave + Pauline Qu\^eneau Roxanne Sabine T\~a{\'\j}a Ur\v{s}ula + Vivian Wendy Xanthippe Yv{\o}nne Z\"azilie\par} +\def\punct{\par\dopunct{min}\dopunct{pig}\dopunct{hid} + \dopunct{HIE}\dopunct{TIP}\dopunct{fluff} + \$1,234.56 + 7/8 = 9\% @ \#0\par} +\def\dopunct#1{#1,\ #1:\ #1;\ `#1'\ ?`#1?\ !`#1!\ (#1)\ [#1]\ + #1*\ #1.\par} + +\def\bigtest{\sample + hamburgefonstiv HAMBURGEFONSTIV\par + \names \punct \lowers \uppers \digits} + +\def\math{\textfont1=\testfont \skewchar\testfont=\skewtrial + \mathchardef\Gamma="100 \mathchardef\Delta="101 + \mathchardef\Theta="102 \mathchardef\Lambda="103 \mathchardef\Xi="104 + \mathchardef\Pi="105 \mathchardef\Sigma="106 \mathchardef\Upsilon="107 + \mathchardef\Phi="108 \mathchardef\Psi="109 \mathchardef\Omega="10A + \def\ii{i} \def\jj{j} + \def\\##1{|##1|+}\mathtrial + \def\\##1{##1_2+}\mathtrial + \def\\##1{##1^2+}\mathtrial + \def\\##1{##1/2+}\mathtrial + \def\\##1{2/##1+}\mathtrial + \def\\##1{##1,{}+}\mathtrial + \def\\##1{d##1+}\mathtrial + \let\ii=\imath \let\jj=\jmath \def\\##1{\hat##1+}\mathtrial} +\newcount\skewtrial \skewtrial='177 +\def\mathtrial{$\\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 \\a \\b \\c \\d \\e \\f + \\g \\h \\\ii \\\jj \\k \\l \\m \\n \\o \\p \\q \\r \\s \\t \\u \\v \\w + \\x \\y \\z \\\alpha \\\beta \\\gamma \\\delta \\\epsilon \\\zeta + \\\eta \\\theta \\\iota \\\kappa \\\lambda \\\mu \\\nu \\\xi \\\pi + \\\rho \\\sigma \\\tau \\\upsilon \\\phi \\\chi \\\psi \\\omega + \\\vartheta \\\varpi \\\varphi \\\Gamma \\\Delta \\\Theta \\\Lambda + \\\Xi \\\Pi \\\Sigma \\\Upsilon \\\Phi \\\Psi \\\Omega \\\partial + \\\ell \\\wp$\par} +\def\mathsy{\begingroup\skewtrial='060 % for math symbol font tests + \def\mathtrial{$\\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$\par} + \math\endgroup} +% \end{macrocode} +% Here we have to ensure that we use a suitable encoding otherwise our +% octal and hexadecimal constants will appear in whatever encoding the +% current font is. +% \begin{macrocode} +\def\oct#1{\hbox{\fontencoding{OT1}\rmfamily\'{}\kern-.2em\itshape + #1\/\kern.05em}}% octal constant +\def\hex#1{\hbox{\fontencoding{OT1}\rmfamily + \H{}\ttfamily#1}}% hexadecimal constant +\def\setdigs#1"#2{\gdef\h{#2}% \h=hex prefix; \0\1=corresponding octal + \m=\n \divide\m by 64 \xdef\0{\the\m}% + \multiply\m by-64 \advance\m by\n \divide\m by 8 \xdef\1{\the\m}} +\def\testrow{\setbox0=\hbox{\penalty 1\def\\{\char"\h}% + \\0\\1\\2\\3\\4\\5\\6\\7\\8\\9\\A\\B\\C\\D\\E\\F% + \global\p=\lastpenalty}} % \p=1 if none of the characters exist +\def\oddline{\cr + \noalign{\nointerlineskip} + \multispan{19}\hrulefill& + \setbox0=\hbox{\lower 2.3pt\hbox{\hex{\h x}}}\smash{\box0}\cr + \noalign{\nointerlineskip}} +\newif\ifskipping +\def\evenline{\loop\skippingfalse + \ifnum\n<256 \m=\n \divide\m 16 \chardef\next=\m + \expandafter\setdigs\meaning\next \testrow + \ifnum\p=1 \skippingtrue \fi\fi + \ifskipping \global\advance\n 16 \repeat + \ifnum\n=256 \let\next=\endchart\else\let\next=\morechart\fi + \next} +\def\morechart{\cr\noalign{\hrule\penalty5000} + \chartline \oddline \m=\1 \advance\m 1 \xdef\1{\the\m} + \chartline \evenline} +\def\chartline{&\oct{\0\1x}&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&\:&&} +\def\chartstrut{\lower4.5pt\vbox to14pt{}} +\def\table{$$\global\n=0 + \halign to\hsize\bgroup + \chartstrut##\tabskip0pt plus10pt& + &\hfil##\hfil&\vrule##\cr + \lower6.5pt\null + &&&\oct0&&\oct1&&\oct2&&\oct3&&\oct4&&\oct5&&\oct6&&\oct7&\evenline} +\def\endchart{\cr\noalign{\hrule} + \raise11.5pt\null&&&\hex 8&&\hex 9&&\hex A&&\hex B& + &\hex C&&\hex D&&\hex E&&\hex F&\cr\egroup$$\par} +\def\:{\setbox0=\hbox{\noboundary\char\n\noboundary}% + \ifdim\ht0>7.5pt\reposition + \else\ifdim\dp0>2.5pt\reposition\fi\fi + \box0\global\advance\n 1 } +\def\reposition{\setbox0=\vbox{\kern2pt\box0}\dim=\dp0 + \advance\dim 2pt \dp0=\dim} +\def\centerlargechars{ + \def\reposition{\setbox0=\hbox{$\vcenter{\kern2pt\box0\kern2pt}$}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\text{{\advance\baselineskip-4pt +\setbox0=\hbox{abcdefghijklmnopqrstuvwxyz} +\ifdim\hsize>2\wd0 + \ifdim 15pc>2\wd0 \hsize=15pc \else \hsize=2\wd0 \fi +\fi +On November 14, 1885, Senator \& Mrs.~Leland Stanford called together +at their San Francisco mansion the 24~prominent men who had been +chosen as the first trustees of The Leland Stanford Junior University. +They handed to the board the Founding Grant of the University, which +they had executed three days before. This document---with various +amendments, legislative acts, and court decrees---remains as the +University's charter. In bold, sweeping language it stipulates that +the objectives of the University are ``to qualify students for +personal success and direct usefulness in life; and to promote the +publick welfare by exercising an influence in behalf of humanity and +civilization, teaching the blessings of liberty regulated by law, and +inculcating love and reverence for the great principles of government +as derived from the inalienable rights of man to life, liberty, and +the pursuit of happiness.'' \moretext +(!`THE DAZED BROWN FOX QUICKLY GAVE 12345--67890 JUMPS!)\par}} +\def\moretext{?`But aren't Kafka's Schlo\ss{} and \AE sop's +\OE uvres often na\"\i ve vis-\`a-vis the d\ae monic ph\oe nix's +official r\^ole in fluffy souffl\'es? } +\def\omitaccents{\let\moretext=\relax} + +\def\sample{\table\text} +% \end{macrocode} +% +% \begin{macrocode} +\def\bye{\end{document}} +% \end{macrocode} +% +% The redefinition of |\typeout| around the |\begin{document}| +% prevents \LaTeX{} from reporting that there is no |.aux| file. +% This is a bad hack, I agree :-) +% \begin{macrocode} +\let\oldtypeout\typeout +\def\typeout#1{} +% \end{macrocode} +% And another bad hack: to be able to load an encoding definition file +% after |\begin{document}| I disable the preamble only setting. +% \begin{macrocode} +\makeatletter +\let\@preamblecmds\@empty +\makeatother + +\begin{document} +\let\typeout\oldtypeout + +\ifx\noinit!\else\expandafter\init\fi +%</code> +% \end{macrocode} +% +% +% \DeleteShortVerb{\|} +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/nfssfont.ins b/Master/texmf-dist/source/latex-dev/base/nfssfont.ins new file mode 100644 index 00000000000..222551ea306 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/nfssfont.ins @@ -0,0 +1,87 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generateFile{nfssfont.tex}{t}{% + \from{nfssfont.dtx}{code}} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/olddc.ins b/Master/texmf-dist/source/latex-dev/base/olddc.ins new file mode 100644 index 00000000000..694cc6df6f5 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/olddc.ins @@ -0,0 +1,124 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\Msg{*** Generating font defs for Cork encoded fonts ***} + +\generate{ + \file{t1cmfib.fd}{ + \from{cmfonts.fdd}{fd,T1cmfib,old}} + \file{t1cmfr.fd}{ + \from{cmfonts.fdd}{fd,T1cmfr,old}} + \file{t1cmdh.fd}{ + \from{cmfonts.fdd}{fd,T1cmdh,old}} + \file{t1cmr.fd}{ + \from{cmfonts.fdd}{fd,T1cmr,old}} + \file{t1cmss.fd}{ + \from{cmfonts.fdd}{fd,T1cmss,old}} + \file{t1cmtt.fd}{ + \from{cmfonts.fdd}{fd,T1cmtt,old}} + \file{t1cmvtt.fd}{ + \from{cmfonts.fdd}{fd,T1cmvtt,old}} +} + + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.fdd' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx b/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx new file mode 100644 index 00000000000..3c768e1e8fc --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/oldlfont.dtx @@ -0,0 +1,252 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +%\iffalse % this is a METACOMMENT ! +% +%% File `oldlfont.dtx'. +%% Copyright (C) 1989-1995 Frank Mittelbach and Rainer Sch\"opf, +%% all rights reserved. +% +%<*dtx> + \ProvidesFile{oldlfont.dtx} +%</dtx> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{oldlfont} +%<driver> \ProvidesFile{oldlfont.drv} +%<*!latex209> +% \fi +% \ProvidesFile{oldlfont.dtx} + [2014/09/29 v2.2k Standard LaTeX package] +% +% \iffalse +%</!latex209> +%<*driver> +\documentclass{ltxdoc} +\begin{document} +\DocInput{oldlfont.dtx} +\end{document} +%</driver> +% \fi +% +% +% +% +% +% \providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +% +% \GetFileInfo{oldlfont.dtx} +% +% \title{The file \texttt{oldlfont.dtx} for use with +% \LaTeXe.\thanks{This file has version +% number \fileversion, dated \filedate.}\\[2pt] +% It contains the code for \texttt{oldlfont.sty}} +% +% \author{Frank Mittelbach} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Introduction} +% +% This file contains the code for the \texttt{oldlfont} package +% which emulates the following \LaTeX~2.09 font commands: +% \begin{itemize} +% \item The two-letter font-changing commands |\rm|, etc.~are +% defined to cancel each other out as they did in \LaTeX~2.09. +% \item The two-letter font-changing commands are allowed in math +% mode. +% \item The |latexsym| package is loaded. +% \end{itemize} +% For full compatibility mode, the file |latex209.def| is loaded by +% |\documentstyle|. +% +% The following modules are used in the implementation to direct +% \dst{} in generating the external files: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% package & produce |oldlfont.sty| \\ +% latex209 & produce part of |latex209.def| +% \end{tabular} +% \end{center} +% +% \StopEventually{} +% +% \changes{v2.2k}{1995/11/29}{Remove duplicate driver code.} +% +% \section{The Code} +% +% +% \begin{macro}{\math@bgroup} +% \begin{macro}{\math@egroup} +% To make \meta{math alphabet identifier} work like simple font +% switches we change the meaning of |\math@bgroup| and +% |\math@egroup| to |\@empty|. This emulates the behavior of +% \texttt{oldlfont.sty} in NFSS1 setups. These definitions are not +% part of \texttt{latex209} automatically, since to emulate 2.09 +% they are not necessary (all standard fonts are declared as math +% symbol fonts). +% \changes{v2.2f}{1994/05/05}{Added saved versions of the +% math-groupers, CAR} +% \changes{v2.2g}{1994/05/09}{Moved outside latex209 part} +% \begin{macrocode} +\let\math@bgroup\@empty +\let\math@egroup\@empty +\let \@@math@bgroup \math@bgroup +\let \@@math@egroup \math@egroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% The rest of this document describes code that is used in +% |oldlfont.sty| and |latex209.def|. +% \begin{macrocode} +%<*package|latex209> +% \end{macrocode} +% +% When emulating the old settings we don't want a lot of NFSS +% information being displayed. Thus we required that the +% \texttt{tracefnt} package is loaded with the option +% \texttt{errorshow}. +% \begin{macrocode} +\RequirePackage[errorshow]{tracefnt} +% \end{macrocode} +% +% We define math \emph{alphabet} identifiers for the typefaces +% described in the \LaTeX{} manual. This is straightforward. Some +% are already defined by the kernel code. +% And here are the other ones defined by the old \LaTeX{}. They all +% get declared as math symbol font alphabets. Thus we first +% allocate the additional symbol fonts. +% \begin{macrocode} +\DeclareSymbolFont{bold}{OT1}{cmr}{bx}{n} +\DeclareSymbolFont{sans}{OT1}{cmss}{m}{n} +\DeclareSymbolFont{typewriter}{OT1}{cmtt}{m}{n} +\DeclareSymbolFont{italic}{OT1}{cmr}{m}{it} +\DeclareSymbolFont{smallcaps}{OT1}{cmr}{m}{sc} +\DeclareSymbolFont{slanted}{OT1}{cmr}{m}{sl} +% \end{macrocode} +% And here are the corresponding math identifiers. +% \begin{macrocode} +\DeclareSymbolFontAlphabet\mathbf{bold} +\DeclareSymbolFontAlphabet\mathsf{sans} +\DeclareSymbolFontAlphabet\mathtt{typewriter} +\DeclareSymbolFontAlphabet\mathsc{smallcaps} +\DeclareSymbolFontAlphabet\mathsl{slanted} +% \end{macrocode} +% We undefine the old |\mit| and |\cal| macros (whatever meaning +% they have) and reallocate them as symbol font alphabets. +% \begin{macrocode} +\let\mit\undefined +\let\cal\undefined +\let\mathit\undefined +\DeclareSymbolFontAlphabet\mathit{italic} +\DeclareSymbolFontAlphabet{\mit}{letters} +\DeclareSymbolFontAlphabet{\cal}{symbols} +% \end{macrocode} +% +% We define the font commands for selecting the typeface. They are +% probably defined by the document class/style but we want to force +% the old meaning. +% +% And here are the definition as they were in \LaTeX~2.09 but +% translated into NFSS2 language. +% \changes{v2.2h}{1994/05/11}{DPC use \cs{DeclareProtectedCommand}} +% \changes{v2.2i}{1994/05/13}{DPC renamed to \cs{DeclareRobustCommand}} +% \begin{macrocode} +\DeclareRobustCommand\rm{\normalfont\rmfamily\mathgroup\symoperators} +\DeclareRobustCommand\sf{\normalfont\sffamily\mathgroup\symsans} +\DeclareRobustCommand\sl{\normalfont\slshape\mathgroup\symslanted} +\DeclareRobustCommand\bf{\normalfont\bfseries\mathgroup\symbold} +\DeclareRobustCommand\sc{\normalfont\scshape\mathgroup\symsmallcaps} +\DeclareRobustCommand\it{\normalfont\itshape\mathgroup\symitalic} +\DeclareRobustCommand\tt{\normalfont\ttfamily\mathgroup\symtypewriter} +% \end{macrocode} +% We also have to define the \emph{emphasize} font change command +% (i.e.\ |\em|). This command will look whether the current font is +% sloped (i.e.\ has a positive |\fontdimen1|) and will then select +% either |\rm| or |\it|. +% \begin{macrocode} +\DeclareRobustCommand\em{% + \@nomath\em + \ifdim \fontdimen\@ne\font>\z@\rm\else\it\fi} +% \end{macrocode} +% +% \begin{macro}{\@setfontsize} +% Font size changes are handled using the |\@setfontsize| command +% (in new class files) or by the |@setsize| command in old document +% style files. The latter is now defined to call |\@setfontsize| in +% the NFSS2 kernel code. +% Thus to make all size changing commands automatically return to +% the normal font of the document we only have to slightly modify +% the definition of |\@setfontsize| by adding a |\normalfont| +% command to it. +% \changes{v2.2j}{1994/11/06}{Use \cs{@typeset@protect}} +% \begin{macrocode} +\def\@setfontsize#1#2#3{\@nomath#1% + \ifx\protect\@typeset@protect + \let\@currsize#1% + \fi + \fontsize{#2}{#3}\normalfont} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\non@alpherr} +% Since we emulate the old syntax we also have to silently ignore +% uses of a math alphabet outside math mode. Since we now use the +% |\sym...| switches the following setting is not longer necessary. +% \begin{macrocode} +%\let\non@alpherr\@gobble +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\not@math@alphabet} +% But we need to disable the error message that is generated from +% |\bfseries| etc. +% \begin{macrocode} +\let\not@math@alphabet\@gobbletwo +% \end{macrocode} +% \end{macro} +% +% +% We left out the special \LaTeX{} fonts which are not automatically +% included in the base version of the font selection since these +% fonts contain only a few characters which are also included in +% the AMS fonts so anybody who is using these fonts doesn't need +% them. But for compatibility reasons we will define these symbols. +% +% \begin{macrocode} +\RequirePackage{latexsym} +%</package|latex209> +% \end{macrocode} +% +% \DeleteShortVerb{\|} +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/preload.dtx b/Master/texmf-dist/source/latex-dev/base/preload.dtx new file mode 100644 index 00000000000..0bc9fb4415e --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/preload.dtx @@ -0,0 +1,269 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%%% From File: preload.dtx +%<*dtx> + \ProvidesFile{preload.dtx} +%</dtx> +%<*preload> +%<*!tex> +%<+cm> \ProvidesFile{cmpreloa.% +%<+dc> \ProvidesFile{dcpreloa.% +%<+xpt> xpt} +%<+xipt> xip} +%<+xiipt> xii} +%<+min> \ProvidesFile{preload.min} +%<+ori> \ProvidesFile{preload.ori} +%</!tex> +%<+tex> \ProvidesFile{preload.ltx} +% \fi +% \ProvidesFile{preload.dtx} + [2014/09/29 v2.1g LaTeX Kernel (Font Preloading)] +% +% +% +%\iffalse This is a META comment +% +% File `preload.dtx'. +% Copyright (C) 1989-1994 Frank Mittelbach and Rainer Sch\"opf, +% all rights reserved. +% +% \fi +% +% \GetFileInfo{preload.dtx} +% \title{The \texttt{preload.dtx} file\thanks {This file has version +% number \fileversion, dated \filedate}\\ for use with \LaTeXe} +% \date{\filedate} +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% \changes{v2.0b}{1993/03/08}{Added 12pt preloads} +% \changes{v2.1e}{1994/11/07}{(DPC) Updated to use \cs{ProvidesFile}} +% \changes{v2.1g}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% \def\dst{\expandafter{\normalfont\scshape docstrip}} +% +% \setcounter{StandardModuleDepth}{1} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Overview} +% +% This file contains an number of possible settings for preloading +% fonts during installation of NFSS2 (which is used by \LaTeXe). It +% will be used to generate the following files: +% \begin{center} +% \begin{tabular}{ll} +% preload.min & minimal subset of fonts necessary to run NFSS2 \\ +% preload.ori & preload of CM fonts similar to the old +% \texttt{lfonts.tex} \\ +% preload.ltx & The standard selection of preloads \\ +% cmpreloa.xpt & preload of CM fonts for 10pt document size\\ +% cmpreloa.xip & preload of CM fonts for 11pt document size\\ +% cmpreloa.xii & preload of CM fonts for 12pt document size\\ +% dcpreloa.xpt & preload of DC fonts for 10pt size \\ +% dcpreloa.xip & preload of DC fonts for 11pt size \\ +% dcpreloa.xii & preload of DC fonts for 12pt size \\ +% \end{tabular} +% \end{center} +% +% These files are for installations that make use of Computer +% Modern fonts either old encoding (OT1) or Cork encoding (T1). The +% Computer Modern fonts with Cork encoding are known as DC-fonts. +% +% Most important is \texttt{preload.ltx} which is used during +% format generation. You are \emph{not} allowed to change this file. +% +% \section{Customization} +% +% You can customize the preloaded fonts in your \LaTeXe{} system by +% installing a file with the name \texttt{preload.cfg}. If this +% file exists it will be used in place of the system file +% \texttt{preload.ltx}. You can, for example, copy one of the +% files mentioned above (that can be generated from this source) to +% \texttt{preload.cfg}. +% +% Or you can define completely other preloads. In that case start +% from \texttt{preload.min} since that contains the fonts that have +% to be preloaded by *all* \LaTeXe{} systems. +% +% Avoid using \texttt{preload.ori}, it will load so many fonts that +% on most installations it is nearly impossible to load other font +% families afterwards. This file is only generated to show what +% fonts have been preloaded by \LaTeX~2.09. +% +% If you normally use other fonts than Computer Modern +% \texttt{preload.min} might be best. +% +% \begin{quote} \textbf{Warning:} If you preload fonts with +% encodings other than the normally supported encodings you have to +% declare that encoding in a \texttt{fontdef.cfg} configuration +% file (see the documentation in the file \texttt{fontdef.dtx}). +% Adding an extra encoding to the format might produce non-portable +% documents, thus this should be avoided if possible. +% \end{quote} +% +% +% \StopEventually{} +% +% \section{Module switches for the \dst{} program} +% +% The \dst{} will generate the above file from this source using the +% following module directives: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% preload& produce a preload\ldots file \\[2pt] +% cm & for OT1 encoded Computer Modern \\ +% dc & for T1 encoded Computer Modern \\[2pt] +% min & produce minimal subset \\ +% xpt & produce 10pt preloads \\ +% xipt & produce 11pt preloads \\ +% xiipt & produce 12pt preloads \\ +% ori & produce preloads similar to old \texttt{lfonts.tex}\\ +% tex & produce preload.ltx\\ +% \end{tabular} +% \end{center} +% A typical \dst{} command file would then have entries like: +% \begin{verbatim} +%\generateFile{preload.min}{t}{\from{preload.dtx}{preload,min}} +%\end{verbatim} +% for generating preload files. +% +% \section{A driver for this document} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you +% are currently reading. It will be extracted from this file by the +% \dst{} program. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +%\OnlyDescription % comment out for implementation details +\begin{document} + \DocInput{preload.dtx} +\end{document} +%</driver> +% \end{macrocode} +% +% +% \section{The code} +% +% We begin by loading the math extension font (cmex10) +% and the \LaTeX{} line and circle fonts. +% It is necessary to do this explicitly since these are +% used by \texttt{lplain.tex} and \texttt{latex.tex}. +% Since the internal font name contains |/| characters +% and digits we construct the name via |\csname|. +% These are the only fonts (!) that must be loaded in this file. +% +% All |\DeclarePreloadSizes| can be removed or others can be added, +% they only influence the processing speed. +% \changes{v2.0c}{1993/08/13}{Added \cs{relax} at end of font names.} +% \begin{macrocode} +\expandafter\font\csname OMX/cmex/m/n/10\endcsname=cmex10\relax +\font\tenln =line10 \font\tenlnw =linew10\relax +\font\tencirc=lcircle10 \font\tencircw=lcirclew10\relax +% \end{macrocode} +% The above fonts should not be touched but anything below this +% point here in the preload suggestions can be modified without any +% problems. +% \begin{macrocode} +%<-tex>%******************************************* +%<-tex>% Start any modification below this point ** +%<-tex>%******************************************* +%<-tex> +%% +%% Computer Modern Roman: +%%----------------------- +%<*ori> +\DeclarePreloadSizes{OT1}{cmr}{m}{n} + {5,6,7,8,9,10,10.95,12,14.4,17.28,20.74,24.88} +\DeclarePreloadSizes{OT1}{cmr}{bx}{n}{9,10,10.95,12,14.4,17.28} +\DeclarePreloadSizes{OT1}{cmr}{m}{sl}{10,10.95,12} +\DeclarePreloadSizes{OT1}{cmr}{m}{it}{7,8,9,10,10.95,12} +%</ori> +%<+xpt&cm> \DeclarePreloadSizes{OT1}{cmr}{m}{n}{5,7,10} +%<+xpt&dc> \DeclarePreloadSizes{T1}{cmr}{m}{n}{5,7,10} +%<+xipt&cm> \DeclarePreloadSizes{OT1}{cmr}{m}{n}{6,8,10.95} +%<+xipt&dc> \DeclarePreloadSizes{T1}{cmr}{m}{n}{6,8,10.95} +%<+xiipt&cm> \DeclarePreloadSizes{OT1}{cmr}{m}{n}{6,8,12} +%<+xiipt&dc> \DeclarePreloadSizes{T1}{cmr}{m}{n}{6,8,12} +%% +%% Computer Modern Sans: +%%---------------------- +%<+ori> \DeclarePreloadSizes{OT1}{cmss}{m}{n}{10,10.95,12} +%% +%% Computer Modern Typewriter: +%%---------------------------- +%<+ori> \DeclarePreloadSizes{OT1}{cmtt}{m}{n}{9,10,10.95,12} +%% +%% Computer Modern Math: +%%---------------------- +%<*ori> +\DeclarePreloadSizes{OML}{cmm}{m}{it} + {5,6,7,8,9,10,10.95,12,14.4,17.28,20.74} +\DeclarePreloadSizes{OMS}{cmsy}{m}{n} + {5,6,7,8,9,10,10.95,12,14.4,17.28,20.74} +%</ori> +% \end{macrocode} +% +% The math fonts are the same for both DC and CM fonts. So far +% there isn't an agreed on standard. +% \changes{v2.4e}{1995/12/04} +% {Ulrik Vieth. added 12pt OMS and OML preloads /1989} +% \begin{macrocode} +%<*xpt> +\DeclarePreloadSizes{OML}{cmm}{m}{it}{5,7,10} +\DeclarePreloadSizes{OMS}{cmsy}{m}{n}{5,7,10} +%</xpt> +%<*xipt> +\DeclarePreloadSizes{OML}{cmm}{m}{it}{6,8,10.95} +\DeclarePreloadSizes{OMS}{cmsy}{m}{n}{6,8,10.95} +%</xipt> +%<*xiipt> +\DeclarePreloadSizes{OML}{cmm}{m}{it}{6,8,12} +\DeclarePreloadSizes{OMS}{cmsy}{m}{n}{6,8,12} +%</xiipt> +%% +%% LaTeX symbol fonts: +%%-------------------- +%<*ori> +\DeclarePreloadSizes{U}{lasy}{m}{n} + {5,6,7,8,9,10,10.95,12,14.4,17.28,20.74} +%</ori> +%</preload> +% \end{macrocode} +% +% +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/proc.dtx b/Master/texmf-dist/source/latex-dev/base/proc.dtx new file mode 100644 index 00000000000..724b939fd28 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/proc.dtx @@ -0,0 +1,441 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +% Copyright (C) 1991,1992 by Leslie Lamport \and +% Copyright (C) 1994,1995 by the \LaTeX3 project \and Johannes Braams +% +% \changes{v1.1}{1994/01/25}{Made `proc' a document class and provide +% a .sty file for compatibility mode} +% \changes{v1.2}{1994/01/26}{Removed the setting of a number of +% variables that became superfluous by passing the twocolumn option +% to the article class} +% \changes{v1.3}{1994/03/01}{Moved driver further up; added overview +% of docstrip modules; added \cs{CheckSum}, \cs{StopEventually} and +% \cs{Finale}} +% \changes{v1.3e}{1994/05/22}{Use new warning and error commands} +% \changes{v1.3f}{1994/05/26}{Inserted missing 'v's in \cs{changes} +% entries} +% \changes{v1.3f}{1994/05/26}{Moved identification and driver to the +% front of the file; these sections now no longer print} +% +% \subsection{Identification} +% +% This document class can only be used with \LaTeXe, so it is made +% sure that an appropriate message is displayed when another \TeX{} +% format is used. +% \changes{v1.3l}{1995/11/30}{Added date of \LaTeX\ format to argument +% of \cs{NeedsTeXFormat}} +% \begin{macrocode} +%<+class|style>\NeedsTeXFormat{LaTeX2e}[1995/12/01] +% \end{macrocode} +% +% Announce the document class and its version. +% \changes{v1.3c}{1994/04/15}{Added missing / guard} +% \changes{v1.3d}{1994/05/01}{Removed the use of variables such as +% \cs{fileversion}} +% \changes{v1.3b}{1994/03/16}{Removed use of \cs{wlog}, no longer +% needed} +% \changes{v1.3f}{1994/05/26}{Removed \cs{typeout} from .sty file; +% changed description} +% \changes{v1.3h}{1994/05/26}{The second argument to \cs{ProvidesFile} +% wasn't closed in the driver and the style file} +% +% \begin{macrocode} +%<*driver> +\ProvidesFile{proc.drv} +%</driver> +%<+class>\ProvidesClass{proc} +%<+style>\ProvidesFile{proc.sty} + [2014/09/29 v1.3l +%<+class> Standard LaTeX document class] +%<+style> LaTeX 2.09 compatibility style option `proc'] +% \end{macrocode} +% +% \subsection{The documentation driver file} +% +% This bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you +% are currently reading. It can be extracted from this file by the +% {\sc docstrip} program. +% \begin{macrocode} +%<*driver> +] +\documentclass{ltxdoc} +\GetFileInfo{proc.drv} +\begin{document} +\newcommand\Lopt[1]{\textsf {#1}} +\DocInput{proc.dtx} +\end{document} +%</driver> +% \end{macrocode} +% \fi +% +% \title{Producing proceedings articles with \LaTeXe\thanks +% {File version \fileversion, dated \filedate}} +% +% \author{% +% Johannes Braams\and +% David Carlisle\and +% Alan Jeffrey\and +% Leslie Lamport\and +% Frank Mittelbach\and +% Chris Rowley\and +% Rainer Sch\"opf} +% +% \date{\filedate} +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% \section{Description} +% +% This \LaTeXe\ document class is designed to produce camera-ready +% conference proceedings. It is based upon the document class +% \texttt{article}, but modifies some of its layout decisions. +% It also adds one command. +% +% For compatibility with \LaTeX2.09 a \texttt{.sty} version is +% provided because \texttt{proc} used to be a style file. The +% \texttt{.sty} file can \emph{not} be used as a package however. +% +% \DescribeMacro\copyrightspace +% The |\copyrightspace| command is used to produce a blank space in +% the first column where a copyright notice belongs. Note that it +% should appear after any |\footnote| commands that produce +% footnotes for the first column. +% +% \StopEventually{} +% +% \section{The {\sc docstrip} modules} +% +% The following modules are used in the implementation to direct +% {\sc docstrip} in generating the external files: +% \begin{center} +% \begin{tabular}{ll} +% class & produce the proc document class\\ +% sty & produce proc.sty for compatibility mode\\ +% driver & produce a documentation driver file \\ +% \end{tabular} +% \end{center} +% +% \section{Implementation} +% +% In this case a check is needed to see wether \LaTeXe\ runs in +% compatibility mode. +% \changes{v1.3i}{1994/05/27}{Added missing docstrip guard} +% \begin{macrocode} +%<*style> +\if@compatibility +% \end{macrocode} +% In this case processing silently continues, but in the |\else| +% case a warning is issued and reading of this file stops. +% \begin{macrocode} +\else + \ClassWarningNoLine{proc}{^^J\@spaces% + You requested the use of `proc' as a package^^J\@spaces% + but it has been turned into a document class.^^J\@spaces% + Please change your file to use `proc' as a class.^^J} + \expandafter\endinput +\fi +%</style> +% \end{macrocode} +% +% Paper sizes smaller than A4 are not supported. +% \begin{macrocode} +%<*class> +\DeclareOption{a5paper} + {\ClassError{proc}{Option `a5paper' not supported}{}} +\DeclareOption{b5paper} + {\ClassError{proc}{Option `b5paper' not supported}{}} +% \end{macrocode} +% +% Also the \Lopt{onecolumn} option is disabled in this document +% class. +% \begin{macrocode} +\DeclareOption{onecolumn}% + {\ClassError{proc}{Option `onecolumn' not supported}{}} +% \end{macrocode} +% +% Proceedings articles never have separate titlepages, therefore +% this option is disabled. +% \begin{macrocode} +\DeclareOption{titlepage}% + {\ClassError{proc}{Option `titlepage' not supported}{}} +% \end{macrocode} +% +% Always print in two column mode. +% \begin{macrocode} +\PassOptionsToClass{twocolumn}{article} +% \end{macrocode} +% +% Any other options are passed on to the article class on which +% this document class is based. +% \begin{macrocode} +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} +% \end{macrocode} +% +% Now we can process the options +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% +% and load the article document class. +% \begin{macrocode} +\LoadClass{article} +%</class> +% \end{macrocode} +% +% \section{Document Layout} +% +% Proceedings articles have a different layout than normal +% articles. Therefore some of the layout parameters are given +% different values here. +% +% \subsection{Page Layout} +% +% \subsubsection{Vertical spacing} +% +% \begin{macro}{\footskip} +% The distance from the baseline of the box which contains the +% running footer to the baseline of last line of text is controlled +% by the |\footskip|. +% \begin{macrocode} +%<*class|style> +\setlength\footskip{75\p@} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The dimension of text} +% +% \begin{macro}{\textwidth} +% When \LaTeXe\ runs in compatibility mode it has to be made sure +% that the dimensions of the printed area are not different from +% what the user was used to see. +% +% \begin{macrocode} +\if@compatibility + \setlength\textwidth{6.75in} +\else + \setlength\textwidth{\paperwidth} + \addtolength\textwidth{-126\p@} + \@settopoint\textwidth +\fi +% \end{macrocode} +% +% Here the width of the text a little is modified to be a whole +% number of points. +% \begin{macrocode} +\if@compatibility +\else + \@settopoint\textwidth +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\textheight} +% Now that we have computed the width of the text, we have to take +% care of the height. The |\textheight| is the height of text +% (including footnotes and figures, excluding running head and +% foot). +% +% \begin{macrocode} +\if@compatibility + \setlength\textheight{9in} +\else + \ifcase\@ptsize + \setlength\textheight{53\baselineskip} + \or + \setlength\textheight{47\baselineskip} + \or + \setlength\textheight{44\baselineskip} + \fi +\fi +% \end{macrocode} +% +% The first line on the page has a height of |\topskip|. +% \begin{macrocode} +\advance\textheight by \topskip +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Margins} +% +% \begin{macro}{\oddsidemargin} +% \begin{macro}{\evensidemargin} +% The width of the text is quite large, therefore the margins +% have a negative width. +% \begin{macrocode} +\setlength\oddsidemargin{-10\p@} +\setlength\evensidemargin{-10\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\marginparwidth} +% Because we have such a large |\textwidth| there is no real room +% for notes in the margins. +% \begin{macrocode} +\setlength\marginparwidth {\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\topmargin} +% The |\topmargin| is the distance between the top of `the +% printable area' --which is 1 inch below the top of the paper-- +% and the top of the box which contains the running head. +% \begin{macrocode} +\setlength\topmargin{-47\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\columnsep} +% Proceedings articles are always set in |\twocolumn| mode, +% therefore the distance between the two columns (|\columnsep|)is +% set to a non zero value. +% \begin{macrocode} +\setlength\columnsep{.375in} +% \end{macrocode} +% \end{macro} +% +% \subsection{The page style} +% +% The user can use |\markright| (or |\markboth|) to put an +% identification in the lower left side of the page. The page +% number is printed in the lower right side of the page. +% +% This works as long as he doesn't use either |\pagestyle| or +% |\thispagestyle| commands. +% \changes{v1.3f}{1994/05/26}{changed \cs{rm} to +% \cs{normalfont}\cs{rmfamily}} +% \changes{v1.3j}{1995/05/26}{Removed \cs{rmfamily} (PR 1578)} +% \begin{macrocode} +\let\@oddhead\@empty +\let\@evenhead\@empty +\def\@oddfoot{\normalfont\rightmark \hfil + \pagename{} \thepage} +\def\@evenfoot{\@oddfoot} +% \end{macrocode} +% +% +% \section{Document Markup} +% +% \subsection{The title} +% +% \begin{macro}{\maketitle} +% \changes{v1.3k}{1995/07/18}{Modify footnote handling (PR 1735)} +% The definition of |\maketitle| here is basically the same as the +% one in the document class \texttt{article}, but the pagestyle is +% \emph{not} set to \texttt{plain}. +% +% \begin{macrocode} +\def\maketitle{\par + \begingroup + \renewcommand\thefootnote{\fnsymbol{footnote}}% + \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hb@xt@1.8em{% + \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% +% \end{macrocode} +% This document class always uses two column mode but the title is +% set to the full width of the text. +% \begin{macrocode} + \twocolumn[\@maketitle]% + \@thanks + \endgroup + \setcounter{footnote}{0}% + \let\maketitle\relax + \let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@maketitle} +% This macro takes care of formatting the title information. +% +% The information is set inside |\vbox| with a width of +% |\textwidth| and a height of 2.25in. The text is vertically and +% horizontally centered. +% \begin{macrocode} +\def\@maketitle{% + \vbox to 2.25in{% + \hsize\textwidth + \linewidth\hsize + \vfil + \centering + {\LARGE \@title \par} + \vskip 2em + {\large \begin{tabular}[t]{c}\@author \end{tabular}\par} + \vfil}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\copyrightspace} +% The |\copyrightspace| command is used to produce a blank space in +% the first column where a copyright notice belongs. It works by +% producing a blank footnote of the appropriate size. +% +% \begin{macrocode} +\def\copyrightspace{% + \footnotetext[0]{\mbox{}\vrule \@height 97\p@ \@width \z@}} +% \end{macrocode} +% \end{macro} +% +% \subsection{Modifying environments} +% +% \subsubsection{Abstract} +% +% \begin{macro}{\abstract} +% For this document class the definition of the abstract +% environment is quit simple. +% +% \begin{macrocode} +\renewenvironment{abstract}% + {\section*{\abstractname}} + {\par} +% \end{macrocode} +% \end{macro} +% +% \section{Initialization} +% +% \subsection{Words} +% +% \begin{macro}{\pagename} +% This document class is for documents prepared in the English +% language. To prepare a version for another language, one English +% word must be replaced. It is defined below in a command name. +% \begin{macrocode} +\newcommand\pagename{Page} +%</class|style> +% \end{macrocode} +% \end{macro} +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/proc.ins b/Master/texmf-dist/source/latex-dev/base/proc.ins new file mode 100644 index 00000000000..48765bddec3 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/proc.ins @@ -0,0 +1,105 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generate{ + \file{proc.cls}{\from{proc.dtx}{class}} + \file{proc.sty}{\from{proc.dtx}{style}} + } + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space proc.cls} +\Msg{* \space\space proc.sty} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.dtx' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/slides.dtx b/Master/texmf-dist/source/latex-dev/base/slides.dtx new file mode 100644 index 00000000000..4ccd6824e6c --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/slides.dtx @@ -0,0 +1,2733 @@ +% \iffalse meta-comment +% +% Copyright 1993-2016 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +% Copyright (C) 1994-97 LaTeX3 project, Frank Mittelbach +% and Rainer Sch\"opf, all rights reserved. +% +% \begin{macrocode} +%<+class>\NeedsTeXFormat{LaTeX2e}[1997/06/01] +% \end{macrocode} +% +% Announce the Class name and its version: +% \changes{v2.3b}{1994/05/01}{Removed the use of \cs{fileversion} +% c.s.} +% \changes{v2.3b}{1994/05/01}{Added \cs{ProvidesFile} to slides.def.} +% \changes{v2.3o}{1995/05/17}{Replaced all \cs{hbox to} with +% \cs{hb@xt@}.} +% \changes{v2.3o}{1995/05/17}{Cleaned up the \cs{changes} entries.} +% \changes{v2.3p}{1995/05/23}{Corrected some brace mismatches.} +% \changes{v2.3q}{1995/09/20}{Replaced \cs{@tempa} by \cs{reserved@a}.} +% \changes{v2.3r}{1995/09/27}{Globally replaced scale factor 19.91 by +% 19.907 in \cs{DeclareFontShape}, as this gives better +% rounded font sizes at 600dpi (suggested by Denis Roegel).} +% \begin{macrocode} +%<+class>\ProvidesClass{slides} +%<+cmd>\ProvidesFile{slides.def} +%<*driver> + \ProvidesFile{slides.drv} +%</driver> + [2016/03/29 v2.4a +%<+class> Standard LaTeX document class] +%<+cmd> SLiTeX definitions] +% \end{macrocode} +% +% \section{A driver for this document} +% +% \changes{v2.3f}{1994/05/26}{Moved the driver to the front of the +% file; it doesn't print any longer} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It can be extracted from this file by the +% \dst{} program. +% \begin{macrocode} +%<*driver> +] +\documentclass{ltxdoc} +% \end{macrocode} +% The following command retrieves the date and version information +% from the file. +% \begin{macrocode} +\GetFileInfo{slides.drv} +% \end{macrocode} +% Some commonly used abbreviations: +% \changes{v2.3h}{1994/06/01}{Added definition of \cs{SLiTeX}.} +% \begin{macrocode} +\DeclareRobustCommand{\SLiTeX}{{% + \normalfont S\kern -.06em + {\scshape l\kern -.035emi}\kern -.06em + \TeX +}} +\newcommand*{\Lopt}[1]{\textsf {#1}} +\newcommand*{\file}[1]{\texttt {#1}} +\newcommand*{\Lcount}[1]{\textsl {\small#1}} +\newcommand*{\pstyle}[1]{\textsl {#1}} +\newcommand*{\dst}{{\normalfont\scshape docstrip}} +% +% \end{macrocode} +% Now start the document and input this file. +% \changes{v2.3d}{1994/05/12}{Added a missing \cs{begin\{macrocode\}}} +% \begin{macrocode} +\begin{document} + \DocInput{slides.dtx} +\end{document} +%</driver> +% \end{macrocode} +%\fi +% +% +% \changes{v2.1b}{1993/12/13}{Removed \cs{CodelineIndex} from the +% driver code.} +% \changes{v2.1e}{1993/12/16}{Removed again different definitions for +% font commands font commands in non-compatibility mode.} +% +% \changes{v2.2}{1993/12/18}{Changes to make it work with +% compatibility mode.} +% \changes{v2.2a}{1993/12/19}{Removed float parms} +% \changes{v2.2d}{1994/01/31}{Removed \cs{@normalsize definition}} +% \changes{v2.2g}{1994/03/01}{Removed option makeidx.} +% \changes{v2.2g}{1994/03/01}{Moved driver up front.} +% \changes{v2.2g}{1994/03/01}{Renamed files \file{slides.ltx} and +% \file{sfontdef.ltx} to \file{slides.def} and \file{sfonts.def}.} +% \changes{v2.2l}{1994/03/16}{Removed \cs{typeouts}} +% \changes{v2.3}{1994/03/16}{Removed root/slide-file structure except +% for compatibility mode. (LL)} +% \changes{v2.3}{1994/03/16}{Added clock option (LL)} +% \changes{v2.3}{1994/03/16}{Modified slide, overlay, note +% environments. (LL)} +% \changes{v2.3}{1994/03/16}{Added titlepage option and +% \cs{maketitle}. (LL)} +% \changes{v2.3c}{1994/05/06}{Changed documentation to use +% `environment' instead of `macro' environment for environments} +% \changes{v2.3f}{1994/05/26}{Wrapped two long lines} +% \changes{v2.3l}{1994/12/16}{Use \cs{newcommand*} to define commands +% with an argument} +% \changes{v2.3n}{1995/04/02}{a slight documentation fix (PR 1517)} +% +% \title{Producing slides with \LaTeXe{}} +% \author{Frank Mittelbach} +% \date{\filedate} +% +% \maketitle +% \MaintainedByLaTeXTeam{latex} +% +% \section{Introduction} +% +% With \LaTeXe{} it is now no longer necessary to maintain a special +% format for producing overhead slides. Instead the standard format +% may be used and internally only different font definition files come +% into play. +% +% \section{Usage} +% +% For producing slides you have to use |slides| as the +% document class. This class is very similar to the |slides| style +% that came with \SliTeX{}, in fact it is basically a copy changed to +% work under \LaTeXe{}.\footnote{Therefore you should compare the +% new class with old \SliTeX{} styles +% in case you have local slide classes to see what you have to change +% in order to use them with \LaTeXe{}.} Thus you have to say something +% like +% \begin{verbatim} +% \documentclass[...]{slides} +% \end{verbatim} +% and process this with \LaTeXe. +% +% \section{Fonts} +% +% Note, that that with NFSS you can easily produce slides with special +% fonts just by calling an appropriate style file (like |times|) in a +% |\usepackage| command. This works, for example, with all +% fonts that are defined to be scaleable (e.g., PostScript fonts) since +% they can be used at any size by NFSS. +% +% However, packages like |pandora| won't work because the standard +% |.fd| files shipped with NFSS only contain small sizes. You can, of +% course, produce additional sizes and change the |.fd| files +% accordingly so that they would be useable for slides as well. +% +% \section{Invisible text and color separation} +% +% In the original \SliTeX{} it was possible to produce invisible text +% using the |\invisible| command, so that one was able to put several +% slides on top of each other (with each slides showing additional +% details, etc.). It was also possible to produce `color' slides. This +% was done by producing individual slides one for each color and +% placing them on top of each other. +% +% The availability of color printers and the |color| package make +% color separation obsolete, so it has been removed. Although the +% |color| has also made |\invisible| obsolete, the command is +% retained in the \LaTeXe{} implementation, but there +% are a few restrictions. Invisible fonts are implemented as special +% shapes where the shape names are build by prefixing the normal shape +% name with an uppercase |I|. For example, the `normal invisible +% shape' would be |In|. When \LaTeX{} is requested to typeset +% invisible it will thus change the current shape attribute in this +% manner. To make this work it is necessary that the resulting font +% shape group is defined. If not, the normal font substitution +% mechanism of \LaTeXe{} will change the attribute until it finds a +% usable font shape group with the result that the text may become +% visible. +% +% As long as you use the standard fonts for slides this is not a +% problem because all the visible font shape groups have invisible +% counterparts. However, if you decide on using special fonts, e.g., +% PostScript fonts, your |\DeclareFontShape| settings may not contain +% invisible font shape groups and thus you may be unable to use these +% features without adding additional |\DeclareFontShape| commands to +% your |.fd| files or the preamble of your document. +% +% \StopEventually{} +% +% +% \section{The Implementation} +% +% \begin{quote} +% \textbf{Warning:} The implementation is still very experimental and +% may change internally very much. It currently basically consists of a +% slightly modified copy of |slides.sty| (which then forms +% |slides.cls|) followed by a slightly changed copy of |slitex.tex|. +% Documentation is practically +% non-existing. Everybody is invited to help changing this! +% \end{quote} +% +% The code is divided into two parts, we first implement the class +% related functions and declarations and then define lowlevel stuff +% that is necessary within every class. By placing such commands into +% a separate file it will be possible to share it with other slide +% classes. +% +% \subsection{The class code} +% +% At this point we input the redefinitions that are necessary for +% \SLiTeX. +% \changes{v2.3g}{1994/05/26}{Use \cs{input} instead of \cs{@@input}} +% \begin{macrocode} +%<*class> +\input{slides.def} +% \end{macrocode} +% +% +% Now we are ready for setting up the font tables. As usual, we first +% look for a local configuration file |sfonts.cfg|. If there isn't +% one, we fall back to the default one (|sfonts.def|). +% \changes{v2.2i}{1994/03/08}{Corrected first argument of +% \cs{IfFileExists}: \file{sfonts.def} to \file{sfonts.cfg}.} +% \changes{v2.3g}{1994/05/26}{Use \cs{InputIfFileExists} instead of +% \cs{IfFileExists} and \cs{input} instead of \cs{@@input}} +% \begin{macrocode} +\InputIfFileExists{sfonts.cfg} + {\typeout{**************************************^^J% + *^^J% + * Local config file sfonts.cfg used^^J% + *^^J% + **************************************}}% + {\input{sfonts.def}} +% \end{macrocode} +% +% \section{Declaration of Options} +% +% We declare a few options as illegal. +% +% +% \subsection{Setting Paper Sizes} +% +% The variables |\paperwidth| and |\paperheight| should reflect the +% physical paper size after trimming. For desk printer output this +% is usually the real paper size since there is no post-processing. +% Classes for real book production will probably add other paper +% sizes and additionally the production of crop marks for trimming. +% \changes{v2.1d}{1993/12/14}{Corrected typo, A4 is not 279 mm high} +% \begin{macrocode} +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5paper} + {\setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}} +\DeclareOption{b5paper} + {\setlength\paperheight {250mm}% + \setlength\paperwidth {176mm}} +\DeclareOption{letterpaper} + {\setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{legalpaper} + {\setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{executivepaper} + {\setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}} +% \end{macrocode} +% +% The option \Lopt{landscape} switches the values of |\paperheight| +% and |\paperwidth|, assuming the dimensions wer given for portrait +% paper. +% \begin{macrocode} +\DeclareOption{landscape} + {\setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}} +% \end{macrocode} +% +% \subsection{The clock option} + +% The option \Lopt{clock} prints the time at the bottom of each note. +% We also define here the commands and counters used to keep track of +% time. +% \begin{macrocode} +\newif\if@clock \@clockfalse +\DeclareOption{clock}{\@clocktrue + \AtEndDocument{\typeout{\@arabic\c@minutes\space minutes}} +}% +\newcounter{minutes}% +\newcounter{seconds}% +\newcommand*{\settime}[1]{\setcounter{seconds}{0}\addtime{#1}}% +\newcommand*{\addtime}[1]{\addtocounter{seconds}{#1}% + \setcounter{minutes}{\value{seconds}}% + \global \divide \value{minutes} by 60\relax} + +% \end{macrocode} +% +% \subsection{Two-side or one-side printing} +% +% Two-sided printing is not allowed, so don't declare an option. +% But it is necessary to initialize the switch. +% \changes{v2.2h}{1994/03/07}{Removed declared option twoside.} +% \begin{macrocode} +\@twosidefalse +% \end{macrocode} +% +% +% \subsection{Draft option} +% +% If the user requests \Lopt{draft} we show any overfull boxes. +% We could probably add some more interesting stuff to this option. +% \begin{macrocode} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\DeclareOption{final}{\setlength\overfullrule{0pt}} +% \end{macrocode} +% +% \subsection{Titlepage option} +% The default is for a |\maketitle| command to make a new page. +% \begin{macrocode} +\newif\if@titlepage +\@titlepagetrue +\DeclareOption{titlepage}{\@titlepagetrue} +\DeclareOption{notitlepage}{\@titlepagefalse} +% \end{macrocode} +% +% \subsection{Twocolumn printing} +% +% Two-column printing is again forbidden. +% \changes{v2.3e}{1994/05/22}{twocolumn produces only a warning} +% \begin{macrocode} +\DeclareOption{onecolumn}{} +\DeclareOption{twocolumn}{% + \ClassWarning{slides}{No 'twocolumn' layout for slides}} +% \end{macrocode} +% +% \subsection{Equation numbering on the left} +% +% The option \Lopt{leqno} can be used to get the equation numbers +% on the left side of the equation. +% \changes{v2.2g}{1994/03/01}{Option leqno loads \file{leqno.clo} +% file.} +% \begin{macrocode} +\DeclareOption{leqno}{\input{leqno.clo}} +% \end{macrocode} +% +% \subsection{Flush left displays} +% +% The option \Lopt{fleqn} redefines the displayed math environments +% in such a way that they come out flush left, with an indentation +% of |\mathindent| from the prevailing left margin. +% \changes{v2.2g}{1994/03/01}{Added fleqn option.} +% \begin{macrocode} +\DeclareOption{fleqn}{\input{fleqn.clo}} +% \end{macrocode} +% +% +% \section{Executing Options} +% +% Here we execute the default options to initialize certain +% variables. +% \begin{macrocode} +\ExecuteOptions{letterpaper,final} +% \end{macrocode} +% +% The |\ProcessOptions| command causes the execution of the code +% for every option \Lopt{FOO} +% which is declared and for which the user typed +% the \Lopt{FOO} option in his +% |\documentclass| command. For every option \Lopt{BAR} he typed, +% which is not declared, the option is assumed to be a global option. +% All options will be passed as document options to any +% |\usepackage| command in the document preamble. +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% +% \section{Loading Packages} +% +% The standard class files do not load additional packages. +% +% +% \section{Document Layout} +% +% +% In this section we are finally dealing with the nasty typographical +% details. +% +% +% +% \subsection{Fonts} +% +% \begin{macrocode} +% FMi: +\def\rmdefault{lcmss} % no roman +\def\sfdefault{lcmss} +\def\ttdefault{lcmtt} +\def\itdefault{sl} +\def\sldefault{sl} +\def\bfdefault{bx} +% \end{macrocode} +% +% +% Since the number of parameters to set are very large it seems +% reasonable to set up one command |\@setfontsize@parms| which will +% do the work for us. +% +% \LaTeX\ offers the user commands to change the size of the font, +% relative to the `main' size. Each relative size changing command +% |\size| executes the command +% |\@setfontsize||\size|\meta{font-size}\meta{baselineskip} where: +% +% \begin{description} +% \item[\meta{font-size}] The absolute size of the font to use from +% now on. +% +% \item[\meta{baselineskip}] The normal value of |\baselineskip| +% for the size of the font selected. (The actual value will be +% |\baselinestretch| * \meta{baselineskip}.) +% \end{description} +% +% A number of commands, defined in the \LaTeX{} kernel, shorten the +% following definitions and are used throughout. They are: +% \begin{center} +% \begin{tabular}{ll@{\qquad}ll@{\qquad}ll} +% \verb=\@vpt= & 5 & \verb=\@vipt= & 6 & \verb=\@viipt= & 7 \\ +% \verb=\@viiipt= & 8 & \verb=\@ixpt= & 9 & \verb=\@xpt= & 10 \\ +% \verb=\@xipt= & 10.95 & \verb=\@xiipt= & 12 & \verb=\@xivpt= & 14.4\\ +% ... +% \end{tabular} +% \end{center} +% +% \begin{macro}{\ifourteenpt} +% \begin{macro}{\iseventeenpt} +% \begin{macro}{\itwentypt} +% \begin{macro}{\itwentyfourpt} +% \begin{macro}{\itwentyninept} +% \begin{macro}{\ithirtyfourpt} +% \begin{macro}{\ifortyonept} +% For \SLiTeX{}, however, these are not sufficient, and we therefore +% need to add a few extra, larger, sizes. +% \begin{macrocode} +\def\ifourteenpt{13.82} +\def\iseventeenpt{16.59} +\def\itwentypt{19.907} +\def\itwentyfourpt{23.89} +\def\itwentyninept{28.66} +\def\ithirtyfourpt{34.4} +\def\ifortyonept{41.28} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@setfontsize@parms} +% This routine is used in \SliTeX{} to interface font size setting +% it is modeled after the settings I found in \texttt{slides.sty}, so +% it probably needs an update. But any class is free to redefine +% it, as it is used only as an abbreviation. +% It's syntax is: +% \begin{quote} +% |\@setfontsize@parms| \\ +% | |\meta{lineskip} \\ +% | |\meta{parskip} \\ +% | |\meta{abovedisplayskip} \\ +% | |\meta{belowdisplayskip} \\ +% | |\meta{abovedisplayshortskip} \\ +% | |\meta{belowdisplayshortskip} \\ +% | |\meta{strut ht} \meta{strut dp} (without pt) +% \end{quote} +% +% For NFSS1 a similar style existed which did run both with a +% \SliTeX{} with old font selection or with NFSS1. But when no +% separate format is made this doesn't make much sense. +% So the following note is history and would only be true if all NFSS +% stuff would be removed from the file and placed into the format. +% \begin{quote}\small +% Note: To interface the old \texttt{sfonts.tex} the \meta{size} must be +% hidden in commands denoting the size by its name prefixed with +% `i', i.e.\ 20pt size is called |\itwentypt| at this point. The +% NFSS interface will define those sizes to expand to the internal +% size, e.g.\ 20 but for the old sfonts the command name, e.g. +% |\itwentypt|, will be used to construct the name |\twentypt| etc. +% +% This is a crude interface to the old \texttt{sfonts.tex}. It will +% be a bit slower than the old one because it must define |\@tiny| +% etc.\ every time a size changes. +% \end{quote} +% +% If classes are set up that are only for use with NFSS then the second +% argument may be an ordinary font size! +% \changes{v2.0d}{1993/11/12}{Replaced all pt by \cs{p@}, corrected +% definition for \cs{tiny}.} +% +% \begin{macrocode} +\def\@setfontsize@parms#1#2#3#4#5#6#7#8{% + \lineskip #1\relax% + \parskip #2\relax + \abovedisplayskip #3\relax + \belowdisplayskip #4\relax + \abovedisplayshortskip #5\relax + \belowdisplayshortskip #6\relax +% +% \end{macrocode} +% I don't see a reason why the |\strutbox| has a dim different from +% |\baselineskip| but we will leave it for the moment +% \begin{macrocode} + \setbox\strutbox=\hbox{\vrule \@height#7\p@\@depth#8\p@\@width\z@}% + \baselineskip\baselinestretch\baselineskip + \normalbaselineskip\baselineskip} +% \end{macrocode} +% \end{macro} +% +% Setting size relations for math scripts: +% \changes{v2.2e}{1994/02/07}{Corrected entry for size 23.89.} +% \begin{macrocode} +\DeclareMathSizes{13.82}{13.82}{10}{7} +\DeclareMathSizes{16.59}{16.59}{12}{7} +\DeclareMathSizes{19.907}{19.907}{16.59}{13.82} +\DeclareMathSizes{23.89}{23.89}{19.907}{16.59} +\DeclareMathSizes{28.66}{28.66}{23.89}{19.907} +\DeclareMathSizes{34.4}{34.4}{28.66}{23.89} +\DeclareMathSizes{41.28}{41.28}{34.4}{28.66} +% \end{macrocode} +% +% \begin{macro}{\normalsize} +% \begin{macrocode} +\def\normalsize{% + \@setfontsize\normalsize\itwentypt{28\p@ plus3\p@ minus4\p@}% +% {20}{30\p@ plus3\p@ minus3\p@}% made a bit shorter + \@setfontsize@parms + {2pt}% + {30\p@ plus18\p@ minus9\p@}% + {15\p@ plus3\p@ minus3\p@}% + {10\p@ plus3\p@ minus3\p@}% + {10\p@ plus3\p@} + \abovedisplayshortskip + {17}{7}} +% \end{macrocode} +% \end{macro} +% +% +% We initially choose the normalsize font. +% \begin{macrocode} +\normalsize +% \end{macrocode} +% +% \begin{macro}{\small} +% \begin{macrocode} +\def\small{\@setfontsize\small\iseventeenpt{19\p@ plus3\p@ minus\p@}% + \@setfontsize@parms + {2\p@}% + {15\p@ plus15\p@ minus7\p@}% + {12\p@ plus3\p@ minus3\p@}% + {9\p@ plus3\p@ minus3\p@}% + {6\p@ plus3\p@}% + \abovedisplayshortskip + {13.5}{5.6}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footnotesize} +% \begin{macro}{\scriptsize} +% \begin{macrocode} +\let\footnotesize=\small +\let\scriptsize=\small +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\tiny} +% \begin{macrocode} +\def\tiny{\@setfontsize\tiny\ifourteenpt{16\p@ plus2\p@ minus\p@}% + \@setfontsize@parms + {2pt}% + {14\p@ plus3\p@ minus10\p@}% + {11\p@ plus3\p@ minus10\p@}% + \abovedisplayskip + {8\p@ plus3\p@ minus5\p@}% + {\z@ plus3\p@}% + {10}{4}} +% \end{macrocode} +% \end{macro} +% +% Actually copying the code above would be better because this would +% correct the error message. Maybe one should remove the first +% argument of |\set@font@size@parms|. +% +% \begin{macro}{\large} +% \begin{macro}{\Large} +% \begin{macro}{\LARGE} +% \begin{macro}{\huge} +% \begin{macro}{\Huge} +% \begin{macrocode} +\def\large{\@setfontsize\large\itwentyfourpt{42\p@ plus8\p@ minus5\p@}% + \@setfontsize@parms + {2\p@}% + {40\p@ plus20\p@ minus4\p@}% + {20\p@ plus8\p@ minus3\p@}% + \abovedisplayskip + {10\p@ plus5\p@}% + \abovedisplayshortskip + {20}{8.5}} + +\def\Large{\@setfontsize\Large\itwentyninept{48\p@ plus10\p@ minus6\p@}% + \@setfontsize@parms + {2\p@}% + {48\p@ plus30\p@ minus6\p@}% + {24\p@ plus10\p@ minus6\p@}% + \abovedisplayskip + {12\p@ plus8\p@}% + \abovedisplayshortskip + {27}{11}} + +\def\LARGE{\@setfontsize\LARGE\ithirtyfourpt{52\p@ plus10\p@ minus6\p@}% + \@setfontsize@parms + {2\p@}% + {52\p@ plus30\p@ minus6\p@}% + {24\p@ plus10\p@ minus6\p@}% + \abovedisplayskip + {12\p@ plus8\p@}% + \abovedisplayshortskip + {27}{11}} + +\def\huge{\@setfontsize\huge\ifortyonept{60\p@ plus10\p@ minus6\p@}% + \@setfontsize@parms + {2\p@}% + {60\p@ plus30\p@ minus6\p@}% + {24\p@ plus10\p@ minus6\p@}% + \abovedisplayskip + {12\p@ plus8\p@}% + \abovedisplayshortskip + {27}{11}} + +\let\Huge\huge +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Paragraphing} +% +% \begin{macro}{\baselinestretch} +% This is used as a multiplier for |\baselineskip|. The default is +% to {\em not\/} stretch the baselines. +% \begin{macrocode} +\renewcommand\baselinestretch{} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parindent} +% |\parindent| is the width of the paragraph indentation. +% \begin{macrocode} +\setlength\parindent{\z@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@lowpenalty} +% \begin{macro}{\@medpenalty} +% \begin{macro}{\@highpenalty}% +% The commands |\nopagebreak| and |\nolinebreak| put in penalties +% to discourage these breaks at the point they are put in. +% They use |\@lowpenalty|, |\@medpenalty| or |\@highpenalty|, +% dependent on their argument. +% \begin{macrocode} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\clubpenalty} +% \begin{macro}{\widowpenalty} +% These penalties are use to discourrage club and widow lines. +% Because we use their default values we only show them here, +% commented out. +% \begin{macrocode} +% \clubpenalty 150 +% \widowpenalty 150 +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\displaywidowpenalty} +% \begin{macro}{\predisplaypenalty} +% \begin{macro}{\postdisplaypenalty} +% Discourrage (but not so much) widows in front of a math display +% and forbid breaking directly in front of a display. Allow break +% after a display without a penalty. Again the default values are +% used, therefore we only show them here. +% \begin{macrocode} +% \displaywidowpenalty 50 +% \predisplaypenalty 10000 +% \postdisplaypenalty 0 +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\interlinepenalty} +% Allow the breaking of a page in the middle of a paragraph. +% \begin{macrocode} +% \interlinepenalty 0 +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\brokenpenalty} +% We allow the breaking of a page after a hyphenated line. +% \begin{macrocode} +% \brokenpenalty 0 +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Page Layout} +% +% All margin dimensions are measured from a point one inch from the +% top and lefthand side of the page. +% +% \subsubsection{Vertical spacing} +% +% \begin{macro}{\headheight} +% \begin{macro}{\headsep} +% \begin{macro}{\topskip} +% The |\headheight| is the height of the box that will contain the +% running head. The |\headsep| is the distance between the bottom +% of the running head and the top of the text. |\topskip| is the +% |\baselineskip| for the first line on a page. +% \begin{macrocode} +\setlength\headheight{14\p@} +\setlength\headsep {15\p@} +\setlength\topskip {30\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\footskip} +% The distance from the baseline of the box which contains the +% running footer to the baseline of last line of text is controlled +% by the |\footskip|. +% Bottom of page: +% \begin{macrocode} +\setlength\footskip{25\p@} % +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\maxdepth} +% \begin{macro}{\@maxdepth} +% \changes{v2.3c}{1994/05/06}{Added setting of \cs{maxdepth} and +% \cs{@maxdepth}} +% The \TeX\ primitive register |\maxdepth| has a function that is +% similar to that of |\topskip|. The register |\@maxdepth| should +% always contain a copy of |\maxdepth|. In both plain \TeX\ and +% \LaTeX~2.09 |\maxdepth| had a fixed value of \texttt{4pt}; in +% native \LaTeX2e\ mode we let the value depend on the typesize. We +% set it so that |\maxdepth| $+$ |\topskip| $=$ typesize $\times +% 1.5$. As it happens, in these classes |\topskip| is equal to the +% typesize, therefor we set |\maxdepth| to half the value of +% |\topskip|. +% \begin{macrocode} +\if@compatibility + \setlength\maxdepth{4\p@} +\else + \setlength\maxdepth{.5\topskip} +\fi +\setlength\@maxdepth\maxdepth +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{The dimension of text} +% +% \begin{macro}{\textwidth} +% When we are in compatibility mode we have to make sure that the +% dimensions of the printed area are not different from what the +% user was used to see. +% +% \begin{macrocode} +\if@compatibility + \setlength\textwidth{460\p@} +% \end{macrocode} +% When we are not in compatibility mode we can set some of the +% dimensions differently, taking into account the paper size for +% instance. +% \begin{macrocode} +\else +% \end{macrocode} +% First, we calculate the maximum textwidth, which depends on the +% papersize. Then we calculate the approximate length of 65 +% characters, which should be the maximum length of a line of text. +% The calculated values are stored in |\@tempdima| and |\@tempdimb|. +% \begin{macrocode} + \setlength\@tempdima{\paperwidth} + \addtolength\@tempdima{-2in} + \setbox\@tempboxa\hbox{\rmfamily im} + \setlength\@tempdimb{.5\wd\@tempboxa} + \setlength\@tempdimb{65\@tempdimb} +% \end{macrocode} +% +% Now we can set the |\textwidth|, depending on whether we will be +% setting one or two columns. +% +% The text should not be wider than the minimum +% of the paperwidth (minus 2 inches for the margins) and the +% maximum length of a line as defined by the number of characters. +% \begin{macrocode} + \ifdim\@tempdima>\@tempdimb\relax + \setlength\textwidth{\@tempdimb} + \else + \setlength\textwidth{\@tempdima} + \fi +\fi +% \end{macrocode} +% +% Here we modify the width of the text a little to be a whole +% number of points. +% \begin{macrocode} +\@settopoint\textwidth +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\columnwidth} +% \begin{macro}{\columnsep} +% \begin{macro}{\columnseprule} +% \begin{macrocode} +\columnwidth \textwidth +\columnsep 10pt +\columnseprule \z@ +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\textheight} +% Now that we have computed the width of the text, we have to take +% care of the height. The |\textheight| is the height of text +% (including footnotes and figures, excluding running head and +% foot). +% +% First make sure that the compatibility mode gets the same +% dimensions as we had with \LaTeX2.09. The number of lines was +% calculated as the floor of the old |\textheight| minus +% |\topskip|, divided by |\baselineskip| for |\normalsize|. The +% old value of |\textheight| was 528pt. +% +% \begin{macrocode} +\if@compatibility + \setlength\textheight{600\p@} +% \end{macrocode} +% +% Again we compute this, depending on the papersize and depending +% on the baselineskip that is used, in order to have a whole number +% of lines on the page. +% \begin{macrocode} +\else + \setlength\@tempdima{\paperheight} +% \end{macrocode} +% +% We leave at least a 1 inch margin on the top and the bottom of +% the page. +% \begin{macrocode} + \addtolength\@tempdima{-2in} +% \end{macrocode} +% +% We also have to leave room for the running headers and footers. +% \begin{macrocode} + \addtolength\@tempdima{-1in} +% \end{macrocode} +% +% Then we divide the result by the current |\baselineskip| and +% store this in the count register |\@tempcnta|, which then +% contains the number of lines that fit on this page. +% \begin{macrocode} + \divide\@tempdima\baselineskip + \@tempcnta=\@tempdima +% \end{macrocode} +% +% From this we can calculate the height of the text. +% \begin{macrocode} + \setlength\textheight{\@tempcnta\baselineskip} +\fi +% \end{macrocode} +% +% The first line on the page has a height of |\topskip|. +% \begin{macrocode} +\advance\textheight by \topskip +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Margins} +% +% \begin{macro}{\oddsidemargin} +% \begin{macro}{\evensidemargin} +% \begin{macro}{\marginparwidth} +% First we give the values for the compatibility mode. +% +% Values for two-sided printing: +% \begin{macrocode} +\if@compatibility + \setlength\oddsidemargin {17\p@} + \setlength\evensidemargin {17\p@} + \setlength\marginparwidth {20\p@} +\else +% \end{macrocode} +% +% When we are not in compatibility mode we can take the dimensions +% of the selected paper into account. +% +% We center the text on the page, by +% calculating the difference between |textwidth| and +% |\paperwidth|$-$|2in|. Half of that difference is then used for +% the margin. The amount of space that can be used for marginal +% notes is at least 0.8~inch, to which we add any `leftover' space. +% \begin{macrocode} + \setlength\@tempdima {\paperwidth} + \addtolength\@tempdima {-2in} + \addtolength\@tempdima {-\textwidth} + \setlength\oddsidemargin {.5\@tempdima} + \setlength\marginparwidth {.8in} + \addtolength\marginparwidth {.5\@tempdima} +% \end{macrocode} +% +% The |\evensidemargin| can now be computed from the values set +% above. +% \begin{macrocode} +\setlength\evensidemargin {\paperwidth} +\addtolength\evensidemargin{-2in} +\addtolength\evensidemargin{-\textwidth} +\addtolength\evensidemargin{-\oddsidemargin} +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\marginparsep} +% \begin{macro}{\marginparpush} +% The horizontal space between the main text and marginal notes is +% determined by |\marginparsep|, the minimum vertical separation +% between two marginal notes is controlled by |\marginparpush|. +% \begin{macrocode} +\setlength\marginparsep {5\p@} +\setlength\marginparpush{5\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\topmargin} +% The |\topmargin| is the distance between the top of `the +% printable area' --which is 1 inch below the top of the paper-- +% and the top of the box which contains the running head. +% +% It can now be computed from the values set above. +% \begin{macrocode} +\if@compatibility + \setlength\topmargin{-10pt} +\else + \setlength\topmargin{\paperheight} + \addtolength\topmargin{-2in} + \addtolength\topmargin{-\headheight} + \addtolength\topmargin{-\headsep} + \addtolength\topmargin{-\textheight} + \addtolength\topmargin{-\footskip} % this might be wrong! +% \end{macrocode} +% By changing the factor in the next line the complete page +% can be shifted vertically. +% \begin{macrocode} + \addtolength\topmargin{-.5\topmargin} +\fi +\@settopoint\topmargin +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection{Footnotes} +% +% \begin{macro}{\footnotesep} +% |\footnotesep| is the height of the strut placed at the beginning +% of every footnote. It equals the height of a normal +% |\footnotesize| strut in this +% class, thus no extra space occurs between footnotes. +% \begin{macrocode} +\setlength\footnotesep{20\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\footins} +% |\skip\footins| is the space between the last line of the main +% text and the top of the first footnote. +% \begin{macrocode} +\setlength{\skip\footins}{10\p@ \@plus 2\p@ \@minus 4\p@} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Page Styles} +% +% The page style \pstyle{foo} is defined by defining the command +% |\ps@foo|. This command should make only local definitions. +% There should be no stray spaces in the definition, since they +% could lead to mysterious extra spaces in the output (well, that's +% something that should be always avoided). +% +% \begin{macro}{\@evenhead} +% \begin{macro}{\@oddhead} +% \begin{macro}{\@evenfoot} +% \begin{macro}{\@oddfoot} +% The |\ps@...| command defines the macros |\@oddhead|, +% |\@oddfoot|, |\@evenhead|, and |\@evenfoot| to define the running +% heads and feet---e.g., |\@oddhead| is the macro to produce the +% contents of the heading box for odd-numbered pages. It is called +% inside an |\hbox| of width |\textwidth|. +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% The page styles of slides is determined by the 'slide' page style, +% the slide environment executing a |\thispagestyle{slide}| command. +% The page styles of overlays and notes are similarly determined by +% 'overlay' and 'note' page styles. The command standard 'headings', +% 'plain' and 'empty' page styles work by redefining the 'slide', +% 'overlay', and 'note' styles. +% +% \changes{v2.3q}{1995/09/20}{Wrap some long lines, and use \cs{null}.} +% \begin{macro}{\ps@headings} +% \begin{macrocode} +\if@compatibility +\def\ps@headings{% +\def\ps@slide{\def\@oddfoot{\@mainsize +\hfil\hb@xt@3em{\theslide + \hss}}% + \def\@oddhead{\@mainsize +\hfil +}% + \def\@evenfoot{\@mainsize +\hfil\hb@xt@3em{\theslide\hss}}% + \def\@evenhead{\@mainsize +\hfil +}} + +\def\ps@overlay{\def\@oddfoot{\@mainsize +\hfil\hb@xt@3em{\theoverlay + \hss}}% + \def\@oddhead{\@mainsize +\hfil +}% + \def\@evenfoot{\@mainsize +\hfil\hb@xt@3em{\theoverlay\hss}}% + \def\@evenhead{\@mainsize +\hfil +}} +\def\ps@note{\def\@oddfoot{\@mainsize \hbox{}\hfil\thenote}% + \def\@oddhead{}% + \def\@evenfoot{\@mainsize \hbox{}\hfil\thenote}% + \def\@evenhead{}}} +% +\else %%if@compatibility +% +\def\ps@headings{% + \def\ps@slide{% + \def\@oddfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theslide\hss}}% + \def\@oddhead{}% + \def\@evenfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theslide\hss}}% + \def\@evenhead{}} + + \def\ps@overlay{% + \def\@oddfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theoverlay\hss}}% + \def\@oddhead{}% + \def\@evenfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theoverlay\hss}}% + \def\@evenhead{}} + + \def\ps@note{% + \def\@oddfoot{% + \@mainsize + \if@clock + \fbox{\large \@arabic\c@minutes\space min}% + \else + \null + \fi + \hfil\thenote}% + \def\@oddhead{}% + \def\@evenfoot{% + \@mainsize + \if@clock + \fbox{\large \@arabic\c@minutes\space min}% + \else + \null + \fi + \hfil\thenote}% + \def\@evenhead{}}} +\fi %% if@compatibility +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@plain} +% \begin{macrocode} +\def\ps@plain{\def\ps@slide{% + \def\@oddfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theslide\hss}}% + \def\@oddhead{}% + \def\@evenfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theslide\hss}}% + \def\@evenhead{}} +\def\ps@overlay{\def\@oddfoot{\@mainsize + \mbox{}\hfil\hb@xt@3em{\theoverlay\hss}}% + \def\@oddhead{}% + \def\@evenfoot{\@mainsize \mbox{}\hfil\hb@xt@3em{\theoverlay\hss}}% + \def\@evenhead{}} +\def\ps@note{\def\@oddfoot{\@mainsize \hbox{}\hfil\thenote}% + \def\@oddhead{}% + \def\@evenfoot{\@mainsize \hbox{}\hfil\thenote}% + \def\@evenhead{}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ps@empty} +% \begin{macrocode} +\def\ps@empty{% +\def\ps@slide{\def\@oddhead{}\def\@oddfoot{}% +\def\@evenhead{}\def\@evenfoot{}}% +\def\ps@overlay{\def\@oddhead{}\def\@oddfoot{}% +\def\@evenhead{}\def\@evenfoot{}}% +\def\ps@note{\def\@oddhead{}\def\@oddfoot{}% +\def\@evenhead{}\def\@evenfoot{}}} +% \end{macrocode} +% \end{macro} +% +% Default definition the 'slide', 'overlay', and 'note' page styles. +% \begin{macrocode} +\ps@headings +% \end{macrocode} +% Set ordinary page style to 'empty' +% \begin{macrocode} +\let\@oddhead\@empty\let\@oddfoot\@empty +\let\@evenhead\@empty\let\@evenfoot\@empty +% \end{macrocode} +% +% +% \subsection{Providing math {\em versions}} +% +% \LaTeX{} provides two {\em versions\/}. We call them +% \textsf{normal} and \textsf{bold}, respectively. +% \SliTeX{} does not have a \textsf{bold} version. But we treat the +% invisible characters as a version. The only thing we have to take +% care of is to ensure that we have exactly the same fonts in both +% versions available. +% +% \begin{macrocode} +\DeclareMathVersion{invisible} +% \end{macrocode} +% +% Now we define the basic {\em math groups\/} used by \LaTeX{}. Later +% on, in packages some other {\em math groups}, e.g., the AMS +% symbol fonts, will be defined. +% +% As a default I used serif fonts for mathgroup 0 to get things like +% \verb+\log+ look right. +% \begin{macrocode} +\SetSymbolFont{operators}{normal} + {OT1}{lcmss}{m}{n} + +\SetSymbolFont{letters}{normal} + {OML}{lcmm}{m}{it} +\SetSymbolFont{symbols}{normal} + {OMS}{lcmsy}{m}{n} +\SetSymbolFont{largesymbols}{normal} + {OMX}{lcmex}{m}{n} + +\SetSymbolFont{operators}{invisible} + {OT1}{lcmss}{m}{In} +\SetSymbolFont{letters}{invisible} + {OML}{lcmm}{m}{Iit} +\SetSymbolFont{symbols}{invisible} + {OMS}{lcmsy}{m}{In} +\SetSymbolFont{largesymbols}{invisible} + {OMX}{lcmex}{m}{In} + + +\def\@mainsize{\visible\tiny} +% \end{macrocode} +% +% +% \subsection{Environments} +% +% \begin{environment}{titlepage} +% This environment starts a new page, with pagestyle \pstyle{empty} +% and sets the page counter to 0. +% \begin{macrocode} +\newenvironment{titlepage} + {\newpage + \thispagestyle{empty}% + \setcounter{page}{\z@}} + {\newpage} +% \end{macrocode} +% \end{environment} +% +% \subsubsection{General List Parameters} +% +% The following commands are used to set the default values for the +% list environment's parameters. See the \LaTeX{} manual for an +% explanation of the meaning of the parameters. +% +% \begin{macro}{\leftmargini} +% \begin{macro}{\leftmarginii} +% \begin{macro}{\leftmarginiii} +% \begin{macro}{\leftmarginiv} +% \begin{macro}{\leftmarginv} +% \begin{macro}{\leftmarginvi} +% \begin{macrocode} +\setlength\leftmargini {38\p@} +\setlength\leftmarginii {30\p@} +\setlength\leftmarginiii {20\p@} +\setlength\leftmarginiv {15\p@} +\setlength\leftmarginv {15\p@} +\setlength\leftmarginvi {10\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\@listi} +% \begin{macro}{\@listii} +% \begin{macro}{\@listiii} +% \begin{macro}{\@listiv} +% \begin{macro}{\@listv} +% \begin{macro}{\@listvi} +% These commands set the values of |\leftmargin|, |\parsep|, +% |\topsep|, and |\itemsep| for the various levels of lists. +% \changes{v2.3z}{1997/08/15}{Add initialization of \cs{leftmargin} to +% \cs@listi.} +% It is even necessary to initialize |\leftmargin| in |\@listi|, +% i.e. for a level one list, as a list environment may appear +% inside a \texttt{trivlist}, for example inside a \texttt{theorem} +% environment. +% \begin{macrocode} +\def\@listi{\leftmargin\leftmargini + \parsep .5\parskip + \topsep \parsep + \itemsep\parskip + \partopsep \z@} + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii + \advance\labelwidth-\labelsep + \parsep .5\parskip + \topsep \parsep + \itemsep\parskip} +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii + \advance\labelwidth-\labelsep} +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv + \advance\labelwidth-\labelsep} +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv + \advance\labelwidth-\labelsep} +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi + \advance\labelwidth-\labelsep} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% Here we initialize |\leftmargin| and |\labelwidth|. +% \begin{macrocode} +\leftmargin\leftmargini +\labelwidth\leftmargini\advance\labelwidth-\labelsep +% \end{macrocode} +% +% +% \subsubsection{Paragraph-formatting environments} +% +% \begin{environment}{verse} +% Inside a |verse| environment, |\\| ends a line, and +% line continuations are indented further. +% A blank line makes new paragraph with |\parskip| space. +% \begin{macrocode} +\newenvironment{verse}{\let\\=\@centercr + \list{}{\itemsep \z@ + \itemindent -15\p@ + \listparindent \itemindent + \rightmargin \leftmargin + \advance\leftmargin 15\p@}% + \item[]} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{quotation} +% The |quotation| environment fills lines, indents paragraphs. +% \begin{macrocode} +\newenvironment{quotation}{\list{}{\listparindent 20\p@ + \itemindent\listparindent + \rightmargin\leftmargin}% + \item[]} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{environment}{quote} +% The |quote| environment is the same as the |quotation| environment, +% except that there is no paragraph indentation. +% \begin{macrocode} +\newenvironment{quote}{\list{}{\rightmargin\leftmargin}\item[]} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% +% \subsubsection{List-making environments} +% +% +% \begin{environment}{description} +% The description environment is defined here -- while the itemize +% and enumerate environments are defined in \file{latex.dtx}. +% +% \begin{macrocode} +\newenvironment{description}{\list{}{\labelwidth\z@ + \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +% \end{macrocode} +% \end{environment} +% +% \begin{macro}{\descriptionlabel} +% To change the formatting of the label, you must redefine +% |\descriptionlabel|. +% \begin{macrocode} +\newcommand*{\descriptionlabel}[1]{\hspace\labelsep + \normalfont\bfseries #1} + +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Enumerate} +% +% The enumerate environment uses four counters: \Lcount{enumi}, +% \Lcount{enumii}, \Lcount{enumiii} and \Lcount{enumiv}, where +% \Lcount{enumN} controls the numbering of the Nth level +% enumeration. +% +% \begin{macro}{\theenumi} +% \begin{macro}{\theenumii} +% \begin{macro}{\theenumiii} +% \begin{macro}{\theenumiv} +% The counters are already defined in \file{latex.dtx}, but their +% representation is changed here. +% +% \begin{macrocode} +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\labelenumi} +% \begin{macro}{\labelenumii} +% \begin{macro}{\labelenumiii} +% \begin{macro}{\labelenumiv} +% The label for each item is generated by the four commands +% |\labelenumi| \ldots\ |\labelenumiv|. +% \changes{v2.3k}{1994/12/12}{Handle the \cs{label...} commands as in +% the other class files} +% \begin{macrocode} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\p@enumii} +% \begin{macro}{\p@enumiii} +% \begin{macro}{\p@enumiv} +% The expansion of |\p@enumN||\theenumN| defines the output of a +% |\ref| command when referencing an item of the Nth level of an +% enumerated list. +% \begin{macrocode} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Itemize} +% +% +% \begin{macro}{\labelitemi} +% \begin{macro}{\labelitemii} +% \changes{v2.3x}{1996/08/25}{replaced -{}- with \cs{textendash}} +% \begin{macro}{\labelitemiii} +% \begin{macro}{\labelitemiv} +% Itemization is controlled by four commands: |\labelitemi|, +% |\labelitemii|, |\labelitemiii|, and |\labelitemiv|, which\ +% define the labels of the various itemization levels. +% \begin{macrocode} +\newcommand\labelitemi{$\m@th\bullet$} +\newcommand\labelitemii{\normalfont\bfseries \textendash} +\newcommand\labelitemiii{$\m@th\ast$} +\newcommand\labelitemiv{$\m@th\cdot$} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsection{Setting parameters for existing environments} +% +% \subsubsection{Array and tabular} +% +% \begin{macro}{\arraycolsep} +% The columns in an array environment are separated by +% 2|\arraycolsep|.% Array and tabular environment parameters +% \begin{macrocode} +\setlength\arraycolsep{8\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\tabcolsep} +% The columns in an tabular environment are separated by +% 2|\tabcolsep|. +% \begin{macrocode} +\setlength\tabcolsep{10\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\arrayrulewidth} +% The width of rules in the array and tabular environments is given +% by the length parameter|\arrayrulewidth|. +% \begin{macrocode} +\setlength\arrayrulewidth{.6\p@} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\doublerulesep} +% The space between adjacent rules in the array and tabular +% environments is given by |\doublerulesep|. +% \begin{macrocode} +\setlength\doublerulesep{3\p@} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Tabbing} +% +% \begin{macro}{\tabbingsep} +% This controls the space that the |\'| command puts in. (See +% \LaTeX{} manual for an explanation.) +% \begin{macrocode} +\labelsep 10pt +\setlength\tabbingsep{\labelsep} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Minipage} +% +% \begin{macro}{\@minipagerestore} +% The macro |\@minipagerestore| is called upon entry to a minipage +% environment to set up things that are to be handled differently +% inside a minipage environment. In the current styles, it does +% nothing. +% \end{macro} +% +% \begin{macro}{\@mpfootins} +% Minipages have their own footnotes; |\skip||\@mpfootins| plays +% same r\^ole for footnotes in a minipage as |\skip||\footins| does +% for ordinary footnotes. +% +% \begin{macrocode} +\skip\@mpfootins = \skip\footins +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Framed boxes} +% +% \begin{macro}{\fboxsep} +% The space left by |\fbox| and |\framebox| between the box and the +% text in it. +% \begin{macro}{\fboxrule} +% The width of the rules in the box made by |\fbox| and |\framebox|. +% \begin{macrocode} +\setlength\fboxsep{5\p@} +\setlength\fboxrule{.6\p@} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\theequation} +% The equation number will be typeset as arabic numerals. +% \begin{macrocode} +\def\theequation{\@arabic\c@equation} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\jot} +% |\jot| is the extra space added between lines of an eqnarray +% environment. The default value is used. +% \begin{macrocode} +% \setlength\jot{3pt} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@eqnnum} +% The macro |\@eqnnum| defines how equation numbers are to appear in +% equations. Again the default is used. +% +% \begin{macrocode} +% \def\@eqnnum{(\theequation)} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Font changing} +% +% \changes{v2.3j}{1994/11/10}{fixed a few typos} +% +% Here we supply the declarative font changing commands that were +% common in \LaTeX\ version 2.09 and earlier. These commands work +% in text mode \emph{and} in math mode. They are provided for +% compatibility, but one should start using the |\text...| and +% |\math...| commands instead. These commands are redefined using +% |\DeclareOldFontCommand|, a command with three arguments: the +% user command to be defined, \LaTeX\ commands to execute in text +% mode and \LaTeX\ commands to execute in math mode. +% +% \begin{macro}{\rm} +% \begin{macro}{\tt} +% \begin{macro}{\sf} +% \changes{v2.2}{1993/12/18}{Changed \cs{@newfontswitch} to +% \cs{@renewfontswitch}.} +% \changes{v2.3a}{1994/04/14}{\cs{@renewfontswitch} has become +% \cs{DeclareOldFontCommand}} +% +% The commands to change the family. When in compatibility mode we +% select the `default' font first, to get \LaTeX2.09 behaviour. +% \begin{macrocode} +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\bf} +% The command to change to the bold series. One should use +% |\mdseries| to explicitly switch back to medium series. +% \changes{v2.2}{1993/12/18}{Changed \cs{@newfontswitch} to +% \cs{@renewfontswitch}.} +% \begin{macrocode} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\sl} +% \begin{macro}{\it} +% \begin{macro}{\sc} +% \changes{v2.2}{1993/12/18}{Changed \cs{@newfontswitch} to +% \cs{@renewfontswitch}.} +% And the commands to change the shape of the font. The slanted and +% small caps shapes are not available by default as math alphabets, +% so those changes do nothing in math mode. One should use +% |\upshape| to explicitly change back to the upright shape. +% \begin{macrocode} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\relax} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\cal} +% \changes{v2.1d}{1993/12/14}{Macro added} +% \begin{macro}{\mit} +% \changes{v2.1d}{1993/12/14}{Macro added} +% +% The commands |\cal| and |\mit| should only be used in math mode, +% outside math mode they have no effect. Currently the New Font +% Selection Scheme defines these commands to generate warning +% messages. Therefore we have to define them `by hand'. +% \changes{v2.3k}{1994/12/12}{Now define \cs{cal} and \cs{mit} using +% \cs{DeclareRobustCommand*}} +% \begin{macrocode} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Footnotes} +% +% +% \begin{macro}{\footnoterule} +% Usually, footnotes are separated from the main body of the text +% by a small rule. This rule is drawn by the macro |\footnoterule|. +% We have to make sure that the rule takes no vertical space (see +% \file{plain.tex}). The resulting rule will appear on all color +% layers, so it's best not to draw a rule. +% \begin{macrocode} +\renewcommand\footnoterule{} +% \let \footnoterule = \relax +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\c@footnote} +% \begin{macro}{\thefootnote} +% Footnotes are numbered within slides, overlays, and notes and +% numbered with $\ast$, $\dagger$, etc. +% \begin{macrocode} +% \newcounter{footnote} +\def\thefootnote{\fnsymbol{footnote}} +\@addtoreset{footnote}{slide} +\@addtoreset{footnote}{overlay} +\@addtoreset{footnote}{note} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\@makefntext} +% \changes{v2.2i}{1994/03/08}{Always call \cs{@makefnmark}.} +% The footnote mechanism of \LaTeX{} calls the macro |\@makefntext| +% to produce the actual footnote. The macro gets the text of the +% footnote as its argument and should use |\@makefnmark| to produce +% the mark of the footnote. The macro |\@makefntext| is called when +% effectively inside a |\parbox| of width |\columnwidth| (i.e., +% with |\hsize| = |\columnwidth|). +% +% An example of what can be achieved is given by the following piece +% of \TeX\ code. +% \begin{verbatim} +% \long\def\@makefntext#1{% +% \@setpar{\@@par +% \@tempdima = \hsize +% \advance\@tempdima-10pt +% \parshape \@ne 10pt \@tempdima}% +% \par +% \parindent 1em\noindent +% \hbox to \z@{\hss\@makefnmark}#1} +% \end{verbatim} +% The effect of this definition is that all lines of the footnote +% are indented by 10pt, while the first line of a new paragraph is +% indented by 1em. To change these dimensions, just substitute the +% desired value for `10pt' (in both places) or `1em'. The mark is +% flushright against the footnote. +% +% In these document classes we use a simpler macro, in which the +% footnote text is set like an ordinary text paragraph, with no +% indentation except on the first line of a paragraph, and the +% first line of the footnote. Thus, all the macro must do is set +% |\parindent| to the appropriate value for succeeding paragraphs +% and put the proper indentation before the mark. +% +% \begin{macrocode} +\long\def\@makefntext#1{ + \noindent + \hangindent 10\p@ + \hb@xt@10\p@{\hss\@makefnmark}#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@makefnmark} +% The footnote markers that are printed in the text to point to the +% footnotes should be produced by the macro |\@makefnmark|. We use +% the default definition for it. +% \begin{macrocode} +%\def\@makefnmark{\hbox{$^{\@thefnmark}\m@th$}} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{The title} +% The commands |\title|, |\author|, and |\date| are already +% defined, so here we just define |\maketitle|. +% +% \changes{v2.3s}{1995/10/10}{Move \cs{par} inside the scope of +% \cs{Large}, to get even line spacing.} +% \begin{macrocode} +\newcommand\maketitle{{\centering {\Large \@title \par}% + \@author \par \@date\par}% + \if@titlepage \break \fi} +% \end{macrocode} + +% \section{Initialisation} +% +% \subsection{Date} +% +% \begin{macro}{\today} +% This macro uses the \TeX\ primitives |\month|, |\day| and |\year| +% to provide the date of the \LaTeX-run. +% \begin{macrocode} +\newcommand\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +% \end{macrocode} +% \end{macro} +% +% +% Default initializations +% +% \begin{macrocode} +\pagenumbering{arabic} +\onecolumn +%</class> +% \end{macrocode} +% +% \subsection{Basic code} +% +% The code below is basically a copy of |slitex.tex| with some +% changes. +% +% Global changes so far: +% +% \changes{FMi}{1990/06/01}{\cs{gdef}\cs{@slidesw} ... replaced by a +% \cs{newifG} which is similar to \cs{newif} but uses \cs{global} +% inside.} +% +% +% \subsubsection{Hacks for slide macros} +% +% \begin{macrocode} +%<*cmd> +\message{hacks,} + +\outer\def\newifG#1{\count@\escapechar \escapechar\m@ne + \expandafter\expandafter\expandafter + \edef\@ifG#1{true}{\global\let\noexpand#1\noexpand\iftrue}% + \expandafter\expandafter\expandafter + \edef\@ifG#1{false}{\global\let\noexpand#1\noexpand\iffalse}% + \@ifG#1{false}\escapechar\count@} % the condition starts out false +\def\@ifG#1#2{\csname\expandafter\ifG@\string#1#2\endcsname} +{\uccode`1=`i \uccode`2=`f \uccode`3=`G \uppercase{\gdef\ifG@123{G}}} + % `ifG' is required + +\def\@gobbletoend#1{\def\@argend{#1}\@ggobtoend} + +\long\def\@ggobtoend#1\end#2{\fi\def\reserved@a{#2}% +\ifx\reserved@a\@argend\else\@ggobtoend\fi} +% \end{macrocode} +% FMi: I don't see any reason for this command since |\fi| is hidden +% anyway in the replacement text +% |\def\@xfi{\fi}| +% \begin{macrocode} + \message{slides,} +% \end{macrocode} +% +% \subsubsection{Slide macros} +% +% +% Switches:\\ +% \begin{tabular}{ll} +% |@bw| & true if making black and white slides \\ +% |@visible| & true if visible output to be produced.\\ +% |@makingslides| & true if making a slide/overlay/note +% \end{tabular} +% +% \begin{macrocode} +\newif\if@bw +\newif\if@visible +\newif\if@onlyslidesw \@onlyslideswfalse +\newif\if@onlynotesw \@onlynoteswfalse +\newif\if@makingslides +% \end{macrocode} +% FMi: |\newifG| replaces |\gdef\@slidesw{T}| stuff +% \begin{macrocode} +\newifG\ifG@slidesw +% \end{macrocode} +% Counters\\ +% \begin{tabular}{ll} +% slide & slide number\\ +% overlay & overlay number for a slide\\ +% note & note number for a slide +% \end{tabular} +% +% \begin{macrocode} +\countdef\c@slide=0 \c@slide=0 +\def\cl@slide{} +\countdef\c@overlay=1 \c@overlay=0 +\def\cl@overlay{} +\countdef\c@note=2 \c@note=0 +\def\cl@note{} +% \end{macrocode} +% Add these counters explicitly to the `ckpt list' so that the +% |\include| mechanism works. +% \changes{v2.3u}{1996/05/09}{Make include work: pr/2140(CAR)} +% \changes{v2.3y}{1997/05/09}{Make include work properly: add the +% counters in case some are already in there: pr/2140+2474(CAR)} +% \changes{v2.3v}{1996/05/11}{Do not add page counter here as it is +% added below(CAR)} +% \begin{macrocode} +\g@addto@macro\cl@@ckpt{\@elt{slide}\@elt{overlay}\@elt{note}} +\@addtoreset{overlay}{slide} +\@addtoreset{note}{slide} +% \end{macrocode} +% Redefine page counter to some other number. +% The page counter will always be zero except when putting out an +% extra page for a slide, note or overlay. +% \begin{macrocode} +\@definecounter{page} +\@addtoreset{page}{slide} +\@addtoreset{page}{note} +\@addtoreset{page}{overlay} + +\def\theslide{\@arabic\c@slide} +\def\theoverlay{\theslide-\@alph\c@overlay} +\def\thenote{\theslide-\@arabic\c@note} +% \end{macrocode} +% \begin{verbatim} +% \@setlimits \LIST \LOW \HIGH +% +% Assumes that \LIST = RANGE1,RANGE2,...,RANGEn (n>0) +% Where RANGEi = j or j-k. +% +% Then \@setlimits globally sets +% (i) \LIST := RANGE2, ... , RANGEn +% (ii) \LOW := p +% (iii) \HIGH := q +% where either RANGE1 = p-q or RANGE1 = p and q=p. +%\end{verbatim} +% \begin{macrocode} +\def\@sl@getargs#1-#2-#3\relax#4#5{\xdef#4{#1}\xdef#5{#2}} +\def\@sl@ccdr#1,#2\relax#3#4{\xdef#3{#1-#1-}\xdef#4{#2}} + +\def\@setlimits #1#2#3{\expandafter\@sl@ccdr#1\relax\@sl@gtmp #1% +\expandafter\@sl@getargs\@sl@gtmp\relax#2#3} +% \end{macrocode} +% \begin{verbatim} +% \onlyslides{LIST} ::= +% BEGIN +% @onlyslidesw := true +% \@doglslidelist :=G LIST,999999,999999 +% if @onlynotesw = true +% else @onlynotesw := true +% \@doglnotelist :=G LIST,999999,999999 +% fi +% message: Only Slides LIST +% END +%\end{verbatim} +% \begin{macrocode} +\def\onlyslides#1{\@onlyslideswtrue + \gdef\@doglslidelist{#1,999999,999999}% + \if@onlynotesw \else + \@onlynoteswtrue\gdef\@doglnotelist{999999,999999}\fi + \typeout{Only Slides #1}} +% \end{macrocode} +%\begin{verbatim} +% \onlynotes{LIST} ::= +% BEGIN +% @onlynotesw := true +% \@doglnotelist :=G LIST,999999,999999 +% if @onlyslidesw = true +% else \@onlyslidesw := true +% \@doglslidelist{999999,999999} +% fi +% message: Only Notes LIST +% END +%\end{verbatim} +% \begin{macrocode} +\def\onlynotes#1{\@onlynoteswtrue + \gdef\@doglnotelist{#1,999999,999999}% + \if@onlyslidesw \else + \@onlyslideswtrue\gdef\@doglslidelist{999999,999999}\fi + \typeout{Only Notes #1}} +% \end{macrocode} +%\begin{verbatim} +% \setupcounters ::= (similar to old \blackandwhite #1 ::= ) +% \newpage +% page counter := 0 +% @bw := T +% @visible := T +% if @onlyslidesw = true +% then \@doslidelist := \@doglslidelist +% \@setlimits\@doslidelist\@doslidelow\@doslidehigh +% fi +% if @onlynotesw = true +% then \@donotelist := \@doglnotelist +% \@setlimits\@donotelist\@donotelow\@donotehigh +% fi +% \normalsize % Note, this sets font to \rmfamily , which sets +% % \@currfont to \rmfamily +% counter slidenumber := 0 +% counter note := 0 +% counter overlay := 0 +% @makingslides := F %% \blackandwhite: @makingslides := T +% %% input #1 +% %% @makingslides := F +%\end{verbatim} +% \begin{macrocode} +\if@compatibility +% In compatibility mode, need to define \verb+\blackandwhite+, +% \verb+\colors+, \verb+\colorslides+, etc. +\def\blackandwhite#1{\newpage\setcounter{page}{0}\@bwtrue\@visibletrue +\if@onlyslidesw \xdef\@doslidelist{\@doglslidelist}% +\@setlimits\@doslidelist\@doslidelow\@doslidehigh\fi +\if@onlynotesw \xdef\@donotelist{\@doglnotelist}% +\@setlimits\@donotelist\@donotelow\@donotehigh\fi +\normalsize\setcounter{slide}{0}\setcounter{overlay}{0}% +\setcounter{note}{0}\@makingslidestrue\input #1\@makingslidesfalse} +% \end{macrocode} +%\begin{verbatim} +% \colors{COLORS} ::= +% for \@colortemp := COLORS +% do \csname \@colortemp \endcsname == \@color{\@colortemp} od +% if \@colorlist = empty +% then \@colorlist := COLORS +% else \@colorlist := \@colorlist , COLORS +% fi +%\end{verbatim} +% +% \begin{macrocode} +\def\colors#1{\@for\@colortemp:=#1\do{\expandafter + \xdef\csname\@colortemp\endcsname{\noexpand\@color{\@colortemp}}}\ifx + \@colorlist\@empty \gdef\@colorlist{#1}% + \else \xdef\@colorlist{\@colorlist,#1}\fi} + +\def\@colorlist{} +% \end{macrocode} +%\begin{verbatim} +% \colorslides{FILE} ::= +% \newpage +% page counter := 0 +% @bw := F +% for \@currcolor := \@colorlist +% do @visible := T +% if @onlyslidesw = true +% then \@doslidelist := \@doglslidelist +% \@setlimits\@doslidelist\@doslidelow\@doslidehigh +% fi +% if @onlynotesw = true +% then \@donotelist := \@doglnotelist +% \@setlimits\@donotelist\@donotelow\@donotehigh +% fi +% \normalsize +% counter slide := 0 +% counter overlay := 0 +% counter note := 0 +% type message +% generate color layer output page +% @makingslides := T +% input #1 +% @makingslides := F +% od +%\end{verbatim} +% \begin{macrocode} +\def\colorslides#1{\newpage\setcounter{page}{0}\@bwfalse +\@for\@currcolor:=\@colorlist\do +{\@visibletrue +\if@onlyslidesw \xdef\@doslidelist{\@doglslidelist}% +\@setlimits\@doslidelist\@doslidelow\@doslidehigh\fi +\if@onlynotesw \xdef\@donotelist{\@doglnotelist}% +\@setlimits\@donotelist\@donotelow\@donotehigh\fi +\normalsize\setcounter{slide}{0}\setcounter{overlay}{0}% +\setcounter{note}{0}\typeout{color \@currcolor}% +\newpage +\begin{huge}% +\begin{center}% +COLOR LAYER\\[.75in]% +\@currcolor +\end{center}% +\end{huge}% +\newpage +\@makingslidestrue +\input #1 +\@makingslidesfalse}} +% +\else %% if@compatibility +% +\def\setupcounters{\newpage\setcounter{page}{0}\@bwtrue\@visibletrue +\if@onlyslidesw \xdef\@doslidelist{\@doglslidelist}% +\@setlimits\@doslidelist\@doslidelow\@doslidehigh\fi +\if@onlynotesw \xdef\@donotelist{\@doglnotelist}% +\@setlimits\@donotelist\@donotelow\@donotehigh\fi +\normalsize\setcounter{slide}{0}\setcounter{overlay}{0}% +\setcounter{note}{0}\@makingslidesfalse} + +\AtBeginDocument{\setupcounters} +\fi %% if@compatibility +% \end{macrocode} +%\begin{verbatim} +% \slide COLORS ::= +% BEGIN +% \changes{v2.3}{1994/03/16}{Moved \cs{newpage} up front, here and in +% \cs{note} and \cs{overlay}} +% \par\break +% \stepcounter{slide} +% \setcounter{page}{0} % in case of non-slide pages +% \@slidesw :=G T +% if @onlyslidesw = true % set \@slidesw = T iff +% then % page to be output +% while \c@slide > \@doslidehigh +% do \@setlimits\@doslidelist\@doslidelow\@doslidehigh od +% if \c@slide < \@doslidelow +% then \@slidesw := F +% fi +% fi +% if \@slidesw = T +% then \@slidesw :=G F +% \begingroup +% if @bw = true +% then \@slidesw :=G T +% else \@color{COLORS} +% \if@visible then \@slidesw :=G T \fi +% fi +% \endgroup +% fi +% if \@slidesw = T +% then @makingslides := T +% \thispagestyle{slide} +% else \end{slide} +% \@gobbletoend{slide} +% fi +% END +% +% \endslide ::= +% BEGIN +% \par\break +% END +%\end{verbatim} +% \begin{macrocode} +\if@compatibility +\def\slide#1{\stepcounter{slide}\G@slideswtrue\if@onlyslidesw +\@whilenum \c@slide >\@doslidehigh\relax +\do{\@setlimits\@doslidelist\@doslidelow\@doslidehigh}\ifnum +\c@slide <\@doslidelow\relax\G@slideswfalse\fi\fi +\ifG@slidesw + \G@slideswfalse +% FMi this is only a hack at the moment to get things running. +% \begingroup + \if@bw\G@slideswtrue\else + \@color{#1}\if@visible \G@slideswtrue \fi + \fi +% \endgroup +\fi +\ifG@slidesw \newpage\thispagestyle{slide}% +% \end{macrocode} +% This will set up the last color specified in the argument to +% \verb+\slide+ as the current color. If only back and white slides +% are prepared \verb+\last@color+ will be empty and effectively +% \verb+\relax+ will be generated (hopefully). +% +% We need to reset to a default font at the beginning of a slide. +% (not done yet). +% \begin{macrocode} +\csname \last@color \endcsname +% \end{macrocode} +% \begin{macrocode} +\else\end{slide}\@gobbletoend{slide}\fi} +% +\else %% if@compatibility +% +\def\slide{\par\break +\stepcounter{slide}\setcounter{page}{0}\G@slideswtrue\if@onlyslidesw +\@whilenum \c@slide >\@doslidehigh\relax +\do{\@setlimits\@doslidelist\@doslidelow\@doslidehigh}\ifnum +\c@slide <\@doslidelow\relax\G@slideswfalse\fi\fi +\ifG@slidesw + \G@slideswfalse +% FMi this is only a hack at the moment to get things running. +% \begingroup + \if@bw\G@slideswtrue\else + \if@visible \G@slideswtrue \fi + \fi +% \endgroup +\fi +\ifG@slidesw \@makingslidestrue\thispagestyle{slide}% +% \end{macrocode} +% This will set up the last color specified in the argument to +% \verb+\slide+ as the current color. If only back and white slides +% are prepared \verb+\last@color+ will be empty and effectively +% \verb+\relax+ will be generated (hopefully). +% +% We need to reset to a default font at the beginning of a slide. +% (not done yet). +% \begin{macrocode} +\csname \last@color \endcsname +% \end{macrocode} +% \begin{macrocode} +\else\end{slide}\@gobbletoend{slide}\fi} +\fi %% if@compatibility + +\let\last@color\@empty + +\def\endslide{\par\break} +% \end{macrocode} +%\begin{verbatim} +% \overlay COLORS ::= +% BEGIN +% \par\break +% \stepcounter{overlay} +% \setcounter{page}{0} % in case of non-slide pages +% \@slidesw :=G T +% if @onlyslidesw = T % set \@slidesw = T iff +% then % page to be output +% if \c@slide < \@doslidelow +% then \@slidesw :=G F +% fi +% fi +% if \@slidesw = T +% \@slidesw :=G F +% \begingroup +% if @bw = true +% then \@slidesw :=G T +% else \@color{COLORS} +% \if@visible then \@slidesw :=G T \fi +% fi +% \endgroup +% fi +% if \@slidesw = T +% then @makingslides := T +% \thispagestyle{overlay} +% else \end{overlay} +% \@gobbletoend{overlay} +% fi +% END +% +% \endoverlay ::= +% BEGIN +% \par\break +% END +%\end{verbatim} +% \begin{macrocode} +\if@compatibility +\def\overlay#1{\stepcounter{overlay}\G@slideswtrue% +\if@onlyslidesw\ifnum \c@slide <\@doslidelow\relax +\G@slideswfalse\fi\fi +\ifG@slidesw \G@slideswfalse\begingroup\if@bw\G@slideswtrue% +\else\@color{#1}\if@visible \G@slideswtrue\fi\fi\endgroup\fi +\ifG@slidesw \newpage\thispagestyle{overlay}% +\else\end{overlay}\@gobbletoend{overlay}\fi} +% +\else %%if@compatibility +% +\def\overlay{\par\break + \stepcounter{overlay}% + \setcounter{page}{0}% + \G@slideswtrue% + \if@onlyslidesw\ifnum \c@slide <\@doslidelow\relax + \G@slideswfalse\fi\fi + \ifG@slidesw \G@slideswfalse + \begingroup\if@bw\G@slideswtrue% + \else\if@visible \G@slideswtrue\fi\fi + \endgroup\fi + \ifG@slidesw \@makingslidestrue\thispagestyle{overlay}% + \else\end{overlay}\@gobbletoend{overlay}\fi} +\fi %%if@compatibility + +\def\endoverlay{\par\break} +% \end{macrocode} +% +% \changes{v2.0d}{1993/11/12}{Removed extra blank.} +%\begin{verbatim} +% \note ::= +% BEGIN +% \par\break +% \stepcounter{note} +% \setcounter{page}{0} % in case of non-slide pages +% if @bw = T +% then +% \@slidesw :=G T +% if @onlynotesw = true % set \@notesw = T iff +% then % page to be output +% while \c@slide > \@donotehigh +% do \@setlimits\@donotelist\@donotelow\@donotehigh od +% if \c@slide < \@donotelow +% then \@slidesw :=G F +% fi +% fi +% else \@slidesw :=G F +% fi +% if \@slidesw = T +% then @makingslides := T +% \thispagestyle{note} +% else \end{note} +% \@gobbletoend{note} +% fi +% END +% +% \endnote ::= +% BEGIN +% \par\break +% END +%\end{verbatim} +% \begin{macrocode} +\if@compatibility +\def\note{\stepcounter{note}% + \if@bw + \G@slideswtrue + \if@onlynotesw\@whilenum \c@slide >\@donotehigh\relax + \do{\@setlimits\@donotelist\@donotelow\@donotehigh}\ifnum + \c@slide <\@donotelow\relax \G@slideswfalse\fi\fi + \else\G@slideswfalse\fi + \ifG@slidesw \newpage\thispagestyle{note}\else + \end{note}\@gobbletoend{note}\fi} +% +\else %%if@compatibility +% +\def\note{\par\break\stepcounter{note}\setcounter{page}{0}% + \if@bw + \G@slideswtrue + \if@onlynotesw\@whilenum \c@slide >\@donotehigh\relax + \do{\@setlimits\@donotelist\@donotelow\@donotehigh}\ifnum + \c@slide <\@donotelow\relax \G@slideswfalse\fi\fi + \else\G@slideswfalse\fi + \ifG@slidesw \@makingslidestrue\thispagestyle{note}\else + \end{note}\@gobbletoend{note}\fi} +\fi %%if@compatibility + +\def\endnote{\par\break} +% \end{macrocode} +%\begin{verbatim} +% \@color{COLORS} ::= +% BEGIN +% if math mode +% then type warning +% fi +% if @bw +% then \visible +% else \invisible +% for \last@color := COLORS +% do if \last@color = \@currcolor +% then \visible +% fi +% od +% fi +% \ignorespaces +% END +%\end{verbatim} +% FMi: |\last@color| will be used in |\slide| to set up first +% color if no color is given. +% I suppose that this is much too complicated. |\else\@tempswafalse| +% would produce the same effect I imagine. +% \begin{macrocode} +\def\@color#1{\@mmodetest + {\if@bw \@tempswatrue \else \@tempswafalse + \@for \reserved@a :=#1\do{\ifx\reserved@a\@currcolor\@tempswatrue\fi + \let\last@color\reserved@a}\fi + \if@tempswa \visible \else \invisible \fi + \ignorespaces}} + +\def\@mmodetest#1{\ifmmode\ClassWarning{slides}{Color-changing command + in math mode has been ignored}\else #1\fi} + +\def\invisible{\@mmodetest + {\if@visible + \@visiblefalse + \fontshape\f@shape\selectfont + \mathversion{invisible}% + \fi + \ignorespaces}} + +\def\visible{\@mmodetest + {\if@visible + \else + \@visibletrue +% \end{macrocode} +% Here is the \LaTeXe{} interface hidden. We use a trick to provide +% ourselves with a sort of additional attribute without making the +% current mechanism even larger. The trick is that we denote +% invisible by putting an uppercase |I| in front of the shape name +% for invisible shapes and remove it again if we want to become +% visible. +% \begin{macrocode} + \fontshape{\expandafter\@gobble\f@shape}\selectfont + \mathversion{normal}% + \fi + \ignorespaces}} + +\def\fontshape#1{\edef\f@shape{\if@visible \else I\fi #1}} +% \end{macrocode} +% +% \subsection{Macros for font handling} +% +% We let |\familydefault| point at |\sfdefault|, to make it easier +% to use the document class slides with packages that set up other +% fonts. +% \begin{macrocode} +\renewcommand{\familydefault}{\sfdefault} +% \end{macrocode} +% +% \changes{v2.3l}{1994/12/16}{Added the declaration of the lasy font +% family} +% The \texttt{latexsym} package, which is needed to be able to access +% the \LaTeX\ symbol fonts (lasy), sets things up so that for sizes +% larger then 10 point magnifications of \texttt{lasy10} are +% used. For slides we want to use magnifications of \texttt{lasy8}, +% so we set up the lasy family here to prevent \LaTeX\ from loading +% \texttt{Ulasy.fd}. +% \begin{macrocode} +\DeclareFontFamily{U}{lasy}{}{} +\DeclareFontShape{U}{lasy}{m}{n}{% + <12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>lasy8 +}{} +\DeclareFontShape{U}{lasy}{m}{In}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>ilasy8 +}{} +% \end{macrocode} +% +% \begin{macrocode} +\message{picture,} +% \end{macrocode} +% +% \subsubsection{Modifications to the picture environment} +% +% Below are the new definitions of the picture-drawing macros +% required for SLiTeX. Only those commands that actually +% draw something must be changed so that they do not produce +% any output when the |@visible| switch is false. +% +% \changes{v2.2j}{1994/03/11}{Corrected \cs{@oval}, like previous +% \changes{v2.4a}{2016/03/29}{initialise in \cs{@oval}tests added for latex/4452} +% change to \file{latex.dtx}.} +% \begin{macrocode} +\def\line(#1,#2)#3{\if@visible\@xarg #1\relax \@yarg #2\relax +\@linelen #3\unitlength +\ifnum\@xarg =\z@ \@vline + \else \ifnum\@yarg =\z@ \@hline \else \@sline\fi +\fi\fi} + +\def\vector(#1,#2)#3{\if@visible\@xarg #1\relax \@yarg #2\relax +\@linelen #3\unitlength +\ifnum\@xarg =\z@ \@vvector + \else \ifnum\@yarg =\z@ \@hvector \else \@svector\fi +\fi\fi} + +\def\dashbox#1(#2,#3){% +\leavevmode\if@visible\hb@xt@\z@{\baselineskip \z@ +\lineskip \z@ +\@dashdim #2\unitlength +\@dashcnt \@dashdim \advance\@dashcnt 200 +\@dashdim #1\unitlength\divide\@dashcnt \@dashdim +\ifodd\@dashcnt\@dashdim\z@ +\advance\@dashcnt \@ne \divide\@dashcnt \tw@ +\else \divide\@dashdim \tw@ \divide\@dashcnt \tw@ +\advance\@dashcnt \m@ne +\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth +\@width \@dashdim}\put(0,0){\copy\@dashbox}% +\put(0,#3){\copy\@dashbox}% +\put(#2,0){\hskip-\@dashdim\copy\@dashbox}% +\put(#2,#3){\hskip-\@dashdim\box\@dashbox}% +\multiply\@dashdim \thr@@ +\fi +\setbox\@dashbox \hbox{\vrule \@height \@halfwidth \@depth \@halfwidth +\@width #1\unitlength\hskip #1\unitlength}\@tempcnta\z@ +\put(0,0){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt +\do{\copy\@dashbox\advance\@tempcnta \@ne }}\@tempcnta\z@ +\put(0,#3){\hskip\@dashdim \@whilenum \@tempcnta <\@dashcnt +\do{\copy\@dashbox\advance\@tempcnta \@ne }}% +\@dashdim #3\unitlength +\@dashcnt=\@dashdim \advance\@dashcnt 200 +\@dashdim #1\unitlength\divide\@dashcnt \@dashdim +\ifodd\@dashcnt \@dashdim=\z@ +\advance\@dashcnt \@ne \divide\@dashcnt \tw@ +\else +\divide\@dashdim \tw@ \divide\@dashcnt \tw@ +\advance\@dashcnt \m@ne +\setbox\@dashbox\hbox{\hskip -\@halfwidth +\vrule \@width \@wholewidth +\@height \@dashdim}\put(0,0){\copy\@dashbox}% +\put(#2,0){\copy\@dashbox}% +\put(0,#3){\lower\@dashdim\copy\@dashbox}% +\put(#2,#3){\lower\@dashdim\copy\@dashbox}% +\multiply\@dashdim \thr@@ +\fi +\setbox\@dashbox\hbox{\vrule \@width \@wholewidth +\@height #1\unitlength}\@tempcnta\z@ +\put(0,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt +\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% +\vskip\@dashdim}}\@tempcnta\z@ +\put(#2,0){\hskip -\@halfwidth \vbox{\@whilenum \@tempcnta <\@dashcnt +\relax\do{\vskip #1\unitlength\copy\@dashbox\advance\@tempcnta \@ne }% +\vskip\@dashdim}}}\fi\@makepicbox(#2,#3)} +% \end{macrocode} +% (re)declare these booleans as they not defined in old format +% (or with latexrelease package) +% \begin{macrocode} +\newif\if@ovvline \@ovvlinetrue +\newif\if@ovhline \@ovhlinetrue +% \end{macrocode} +% \begin{macrocode} +\def\@oval(#1,#2)[#3]{\if@visible\begingroup \boxmaxdepth \maxdimen + \@ovttrue \@ovbtrue \@ovltrue \@ovrtrue +% \end{macrocode} +% \begin{macrocode} + \@ovvlinefalse \@ovhlinefalse +% \end{macrocode} +% \begin{macrocode} + \@tfor\reserved@a :=#3\do + {\csname @ov\reserved@a false\endcsname}% + \@ovxx#1\unitlength \@ovyy #2\unitlength +% \end{macrocode} +% \begin{macrocode} + \@tempdimb \ifdim \@ovyy >\@ovxx \@ovxx \@ovvlinetrue + \else \@ovyy \ifdim \@ovyy =\@ovxx \else \@ovhlinetrue \fi\fi +% \end{macrocode} +% \begin{macrocode} + \advance \@tempdimb -2\p@ + \@getcirc \@tempdimb + \@ovro \ht\@tempboxa \@ovri \dp\@tempboxa + \@ovdx\@ovxx \advance\@ovdx -\@tempdima \divide\@ovdx \tw@ + \@ovdy\@ovyy \advance\@ovdy -\@tempdima \divide\@ovdy \tw@ +% \end{macrocode} +% \begin{macrocode} + \ifdim \@ovdx >\z@ \@ovhlinetrue \fi + \ifdim \@ovdy >\z@ \@ovvlinetrue \fi +% \end{macrocode} +% \begin{macrocode} + \@circlefnt \setbox\@tempboxa + \hbox{\if@ovr \@ovvert32\kern -\@tempdima \fi + \if@ovl \kern \@ovxx \@ovvert01\kern -\@tempdima \kern -\@ovxx \fi + \if@ovt \@ovhorz \kern -\@ovxx \fi + \if@ovb \raise \@ovyy \@ovhorz \fi}\advance\@ovdx\@ovro + \advance\@ovdy\@ovro \ht\@tempboxa\z@ \dp\@tempboxa\z@ + \@put{-\@ovdx}{-\@ovdy}{\box\@tempboxa}% + \endgroup\fi} + +\def\@circle#1{\if@visible \begingroup \boxmaxdepth \maxdimen + \@tempdimb #1\unitlength + \ifdim \@tempdimb >15.5\p@\relax \@getcirc\@tempdimb + \@ovro\ht\@tempboxa + \setbox\@tempboxa\hbox{\@circlefnt + \advance\@tempcnta\tw@ \char \@tempcnta + \advance\@tempcnta\m@ne \char \@tempcnta \kern -2\@tempdima + \advance\@tempcnta\tw@ + \raise \@tempdima \hbox{\char\@tempcnta}\raise \@tempdima + \box\@tempboxa}\ht\@tempboxa\z@ \dp\@tempboxa\z@ + \@put{-\@ovro}{-\@ovro}{\box\@tempboxa}% + \else \@circ\@tempdimb{96}\fi\endgroup\fi} + +% \end{macrocode} +% +% \changes{v2.0d}{1993/11/12}{Removed extra blank.} +% \begin{macrocode} +\def\@dot#1{% + \if@visible\@tempdimb #1\unitlength \@circ\@tempdimb{112}\fi} +% \end{macrocode} +% \changes {v2.3m}{1994/03/20}{(DPC) Remove old \cs{@iframebox} and +% \cs{fbox} defn} +% \changes {v2.3m}{1994/03/20}{(DPC) Add \cs{@frameb@x} defn.} +% \begin{macrocode} +\def\@frameb@x#1{% + \@tempdima\fboxrule + \advance\@tempdima\fboxsep + \advance\@tempdima\dp\@tempboxa + \leavevmode + \hbox{% + \lower\@tempdima\hbox{% + \vbox{% + \if@visible\hrule\@height\else\vskip\fi\fboxrule + \hbox{% + \if@visible\vrule\@width\else\hskip\fi\fboxrule + #1% + \vbox{% + \vskip\fboxsep + \box\@tempboxa + \vskip\fboxsep}% + #1% + \if@visible\vrule\@width\else\hskip\fi\fboxrule}% + \if@visible\hrule\@height\else\vskip\fi\fboxrule}}}} + +% \end{macrocode} +% +% \begin{macrocode} +\long\def\frame#1{\if@visible\leavevmode +\vbox{\vskip-\@halfwidth\hrule \@height\@halfwidth \@depth \@halfwidth + \vskip-\@halfwidth\hbox{\hskip-\@halfwidth \vrule \@width\@wholewidth + \hskip-\@halfwidth #1\hskip-\@halfwidth \vrule \@width \@wholewidth + \hskip -\@halfwidth}\vskip -\@halfwidth\hrule \@height \@halfwidth + \@depth \@halfwidth\vskip -\@halfwidth}\else #1\fi} +% \end{macrocode} +% +% \changes{v2.0d}{1993/11/12}{Corrected \cs{@math} to \cs{m@th} in +% definition of \cs{underline}.} +% +% \begin{macrocode} +\message{mods,} +% \end{macrocode} +% +% +% \subsubsection{Other modifications to \TeX{} and \LaTeX{} commands} +% +% |\rule| +% \begin{macrocode} +\def\@rule[#1]#2#3{\@tempdima#3\advance\@tempdima #1\leavevmode + \hbox{\if@visible\vrule + \@width#2 \@height\@tempdima \@depth-#1\else +\vrule \@width \z@ \@height\@tempdima \@depth-#1\vrule + \@width#2 \@height\z@\fi}} + +% \_ (Added 10 Nov 86) + +\def\_{\leavevmode \kern.06em \if@visible\vbox{\hrule \@width.3em}\else + \vbox{\hrule \@height \z@ \@width.3em}\vbox{\hrule \@width \z@}\fi} +% \end{macrocode} +%\begin{verbatim} +% \overline, \underline, \frac and \sqrt +% +% \@mathbox{STYLE}{BOX}{MTEXT} : Called in math mode, typesets MTEXT and +% stores result in BOX, using style STYLE. +% +% \@bphant{BOX} : Creates a phantom with dimensions BOX. +% \@vbphant{BOX} : Creates a phantom with ht of BOX and zero width. +% \@hbphant{BOX} : Creates a phantom with width of BOX +% and zero ht & dp. +% \@hvsmash{STYLE}{MTEXT} : Creates a copy of MTEXT with zero height and +% width in style STYLE. +%\end{verbatim} +% \begin{macrocode} +\def\@mathbox#1#2#3{\setbox#2\hbox{$\m@th#1{#3}$}} + +\def\@vbphantom#1{\setbox\tw@\null \ht\tw@\ht #1\dp\tw@\dp #1% + \box\tw@} + +\def\@bphantom#1{\setbox\tw@\null + \wd\tw@\wd #1\ht\tw@\ht #1\dp\tw@\dp #1% + \box\tw@} + +\def\@hbphantom#1{\setbox\tw@\null \wd\tw@\wd #1\ht\tw@\z@ \dp\tw@\z@ + \box\tw@} + +\def\@hvsmash#1#2{\@mathbox#1\z@{#2}\ht\z@\z@ \dp\z@\z@ \wd\z@\z@ + \box\z@} + +\def\underline#1{\relax\ifmmode + \@xunderline{#1}\else $\m@th\@xunderline{\hbox{#1}}$\relax\fi} + +\def\@xunderline#1{\mathchoice{\@xyunderline\displaystyle{#1}}% + {\@xyunderline + \textstyle{#1}}{\@xyunderline\scriptstyle{#1}}{\@xyunderline + \scriptscriptstyle{#1}}} + +\def\@xyunderline#1#2{% + \@mathbox#1\@smashboxa{#2}\@hvsmash#1{\copy\@smashboxa}% + \if@visible \@hvsmash#1{\@@underline{\@bphantom\@smashboxa}}\fi + \@mathbox#1\@smashboxb{\@@underline{\box\@smashboxa}}% + \@bphantom\@smashboxb} + +\let\@@overline=\overline + +\def\overline#1{\mathchoice{\@xoverline\displaystyle{#1}}{\@xoverline + \textstyle{#1}}{\@xoverline\scriptstyle{#1}}{\@xoverline + \scriptscriptstyle{#1}}} + +\def\@xoverline#1#2{% + \@mathbox#1\@smashboxa{#2}\@hvsmash#1{\copy\@smashboxa}% + \if@visible \@hvsmash#1{\@@overline{\@bphantom\@smashboxa}}\fi + \@mathbox#1\@smashboxb{\@@overline{\box\@smashboxa}}% + \@bphantom\@smashboxb} +% \end{macrocode} +% +% \changes{v2.0b}{1993/04/14}{Corrected \cs{frac} command.} +% \changes{v2.0d}{1993/11/12}{Removed \cs{vcenter} in \cs{@frac}.} +% +%\begin{verbatim} +% \@frac {STYLE}{DENOMSTYLE}{NUM}{DEN}{FONTSIZE} : +% Creates \frac{NUM}{DENOM} +% in style STYLE with NUM and DENOM in style DENOMSTYLE +% FONTSIZE should be \textfont \scriptfont or \scriptscriptfont +%\end{verbatim} +% Added a group around the first argument of |\frac| to prevent +% changes (for example font changes) to modify the contents of the +% second argument. +% \changes{v2.1c}{1993/12/13}{Added group around first arg.} +% \begin{macrocode} +\def\frac#1#2{\mathchoice + {\@frac\displaystyle\textstyle{#1}{#2}\textfont}{\@frac + \textstyle\scriptstyle{#1}{#2}\textfont}{\@frac + \scriptstyle\scriptscriptstyle{#1}{#2}\scriptfont}{\@frac + \scriptscriptstyle\scriptscriptstyle{#1}{#2}\scriptscriptfont}} + +\def\@frac#1#2#3#4#5{% + \@mathbox#1\@smashboxc{{\begingroup#3\endgroup\over#4}}% + \setbox\tw@\null + \ht\tw@ \ht\@smashboxc + \dp\tw@ \dp\@smashboxc + \wd\tw@ \wd\@smashboxc + \box\if@visible\@smashboxc\else\tw@\fi} + +\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\@xysqrt#1{#2}$}% + \dimen@\ht\z@ \advance\dimen@-\dp\z@ + \mskip5mu\raise.6\dimen@\copy\rootbox \mskip-10mu\box\z@} +% \end{macrocode} +% \changes{v2.3w}{1996/05/15}{Removed use of obsolete command +% \cs{@@sqrt} (CAR)} +% \begin{macrocode} +\def\sqrt{\@ifnextchar[{\@sqrt}{\@xsqrt}} +\def\@sqrt[#1]{\root #1\of} +\def\@xsqrt#1{\mathchoice{\@xysqrt\displaystyle{#1}}{\@xysqrt + \textstyle{#1}}{\@xysqrt\scriptstyle{#1}}{\@xysqrt + \scriptscriptstyle{#1}}} +\def\@xysqrt#1#2{\@mathbox#1\@smashboxa{#2}\if@visible + \@hvsmash#1{\sqrtsign{\@bphantom\@smashboxa}}\fi + \phantom{\sqrtsign{\@vbphantom\@smashboxa}}\box\@smashboxa} + +\newbox\@smashboxa +\newbox\@smashboxb +\newbox\@smashboxc +% \end{macrocode} +% +% array and tabular environments: changes to `\verb+|+', |\hline|, +% |\cline|, and |\vline|, +% added 8 Jun 88 +% \begin{macrocode} +\def\@arrayrule{\if@visible\@addtopreamble{\hskip -.5\arrayrulewidth + \vrule \@width \arrayrulewidth\hskip -.5\arrayrulewidth}\fi} +% \end{macrocode} +% +% \changes{v2.3t}{1996/01/31}{Change in \cs{cline} calling interface} +% \begin{macrocode} +\def\cline#1{\if@visible\@cline#1\@nil\fi} + +\def\hline{\noalign{\ifnum0=`}\fi + \if@visible \hrule \@height \arrayrulewidth + \else \hrule \@width \z@ + \fi + \futurelet \reserved@a\@xhline} + +\def\vline{\if@visible \vrule \@width \arrayrulewidth + \else \vrule \@width \arrayrulewidth \@height \z@ + \@depth \z@ \fi} +% \end{macrocode} +% +% \begin{macrocode} +\message{output,} +% \end{macrocode} +% +% \subsubsection{Changes to \LaTeX{} output routine} +% +%\begin{verbatim} +% \@makecol == +% BEGIN +% % Following test added for slides to check if extra page +% if @makingslides = T +% then if \c@page > 0 +% then if \c@note > 0 +% then type 'Note \thenote too long.' +% else if \c@overlay > 0 +% then type 'Overlay \theoverlay too long.' +% else type 'Slide \theslide too long' +% fi fi fi fi +% ifvoid \insert\footins +% then \@outputbox := \box255 +% else \@outputbox := \vbox {\unvbox255 +% \vskip \skip\footins +% \footnoterule +% \unvbox\@footinsert +% } +% fi +% \@freelist :=G \@freelist * \@midlist +% \@midlist :=G empty +% \@combinefloats +% \@outputbox := \vbox to \@colht{\boxmaxdepth := \maxdepth +% \vfil %%\vfil added for slides +% \unvbox\@outputbox +% \vfil } %%\vfil added for slides +% \maxdepth :=G \@maxdepth +% END +%\end{verbatim} +% FMi simple hack to allow none centered slides Should be revised +% of course. +% \begin{macrocode} +\let\@topfil\vfil + +\def\@makecol{\if@makingslides\ifnum\c@page>\z@ \@extraslide\fi\fi +\ifvoid\footins \setbox\@outputbox\box\@cclv \let\@botfil\vfil + \else\let\@botfil\relax\setbox\@outputbox + \vbox{\unvbox\@cclv\vfil + \vskip\skip\footins\footnoterule\unvbox\footins\vskip + \z@ plus.1fil\relax}\fi + \xdef\@freelist{\@freelist\@midlist}\gdef\@midlist{}\@combinefloats + \setbox\@outputbox\vbox to\@colht{\boxmaxdepth\maxdepth + \@topfil\unvbox\@outputbox\@botfil}\global\maxdepth\@maxdepth} + +\def\@extraslide{\ifnum\c@note>\z@ + \ClassWarning{slides}{Note \thenote\space too long}\else + \ifnum\c@overlay>\z@ + \ClassWarning{slides}{Overlay \theoverlay\space too long}\else + \ClassWarning{slides}{Slide \theslide\space too long}\fi\fi} +% \end{macrocode} +% +% \begin{macrocode} +\message{init} +% \end{macrocode} +% +% +% \subsubsection{Special \SLiTeX{} initializations} +% +%FMi why not allow for ref's ? +% \begin{macrocode} +% \nofiles + +\@visibletrue +%</cmd> +% \end{macrocode} +% +% +% \Finale +% +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/slides.ins b/Master/texmf-dist/source/latex-dev/base/slides.ins new file mode 100644 index 00000000000..a5bbc579c33 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/slides.ins @@ -0,0 +1,213 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\Msg{*** Generating slide cmd files and styles ***} + +\generate{ + \file{slides.cls}{ + \from{slides.dtx}{class}} + \file{slides.def}{ + \from{slides.dtx}{cmd}} + } + +\Msg{*** Generating default fonts setup file for slides ***} + +\preamble + +This is a generated file. + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +Details of how to use a configuration file to modify this part of +the system are in the document `cfgguide.tex'. + + +\endpreamble + + + +\Msg{*** Generating .fd files ***} + +\declarepreamble\fdpreamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + +\usedir{tex/latex/base} + +\generate{ + \file{sfonts.def}{ + \from{slifonts.fdd}{main}} + \usepreamble\fdpreamble % change of preamble ! + \file{ot1lcmss.fd}{ + \from{slifonts.fdd}{lcmss,fd}} + \file{ot1lcmtt.fd}{ + \from{slifonts.fdd}{lcmtt,fd}} + \file{omllcmm.fd}{ + \from{slifonts.fdd}{lcmm,fd}} + \file{omslcmsy.fd}{ + \from{slifonts.fdd}{lcmsy,fd}} + \file{omxlcmex.fd}{ + \from{slifonts.fdd}{lcmex,fd}} + \file{ullasy.fd}{ + \from{slifonts.fdd}{llasy,fd}} + } + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{* \space\space All *.def} +\Msg{* \space\space slides.cls} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.drv' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/slifonts.fdd b/Master/texmf-dist/source/latex-dev/base/slifonts.fdd new file mode 100644 index 00000000000..5a0a4ee2473 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/slifonts.fdd @@ -0,0 +1,496 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +%\iffalse This is a META comment +% +% File `slifonts.fdd'. +% Copyright (C) 1989-1998 LaTeX3 project, Frank Mittelbach and +% Rainer Sch\"opf, all rights reserved. +% +%<lcmss&!ec>\ProvidesFile{ot1lcmss.fd} +%<lcmtt&!ec>\ProvidesFile{ot1lcmtt.fd} +%<lcmss&ec>\ProvidesFile{t1lcmss.fd} +%<lcmtt&ec>\ProvidesFile{t1lcmtt.fd} +%<lcmm, >\ProvidesFile{omllcmm.fd} +%<lcmsy, >\ProvidesFile{omslcmsy.fd} +%<lcmex, >\ProvidesFile{omxlcmex.fd} +%<llasy, >\ProvidesFile{ullasy.fd} +%<main, >\ProvidesFile{sfonts.def} +%<*driver, > + \ProvidesFile{sfonts.drv} +%</driver, > + [2019/07/09 v2.2f Standard LaTeX slide font definitions] +% +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{sfonts.drv} +\providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +\title{The file \texttt{slifonts.fdd} for use with + \LaTeXe.\thanks{This file has version + number \fileversion, dated \filedate.}} +\date{\filedate} +\author{Frank Mittelbach \and Rainer Sch\"opf} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \DocInput{slifonts.fdd} +\end{document} +%</driver> +% +%\fi +% +% +% \changes{v2.2c}{1997/05/26}{Removed spaces in and around arguments +% to \cs{DeclareFontShape} and \cs{EC@family}.} +% \changes{v2.2a}{1997/01/15} +% {ec font support added} +% \changes{v2.1m}{1996/11/20} +% {lowercase fd filenames /1044} +% \changes{v2.1l}{1996/05/17} +% {Force \cs{hyphenchar} of OT1 fonts to 45, in case +% \cs{defaulthyphenchar} has changed.} +% \changes{v2.1l}{1996/05/17} +% {Remove some spurious extra empty arguments to +% \cs{DeclareFontFamily} calls} +% \changes{v2.1j}{1995/09/27}{Globally replaced scale factor 19.91 by +% 19.907 in \cs{DeclareFontShape}, as this gives better +% rounded font sizes at 600dpi (suggested by Denis Roegel).} +% \changes{v2.1i}{1995/09/19}{Corrected names of .fd files in argument +% to \cs{ProvidesFile} commands.} +% \changes{v2.1h}{1994/05/12}{Added \cs{ProvidesFile} commands.} +% \changes{v2.1c}{1993/12/17}{Added size 8 to allow for \cs{LaTeX} +% logo.} +% \changes{v2.1a}{1993/12/13}{Removed \cs{CodelineIndex} from the +% driver code.} +% \changes{v2.1e}{1994/01/31}{Corrected extension in typeout.} +% \changes{v2.1f}{1994/02/28}{Moved driver further up.} +% +% +% \section{Introduction} +% +% This file contains the external font information for special +% variants of the the Computer Modern fonts to be used for overhead +% slides. They allow to produce slides in a similar fashion as it was +% originally done by \SliTeX{}. +% +% With \LaTeXe{} it is now no longer necessary to maintain a special +% format. Instead the standard format may be used and internally only +% different font definition files come into play. +% +% Note, that that you therefore can easily produce slides in different +% fonts just by calling an appropriate package (like |times|) in +% your |\usepackage| command. This works, for example, with all +% fonts that are defined to be scalable (eg PostScript fonts) since +% they can be scaled to any size. +% +% However, minor styles like |pandora| won't work because the standard +% |.fd| files shipped with \LaTeXe{} only contain small sizes. You can, +% of course, produce additional sizes and change the |.fd| files +% accordingly, but in this case it might be better to distinguish +% |.fd| files for normal text and for slides by prefixing the family +% name with an |l| (see below). +% +% All the standard family names for \SliTeX{} fonts start out with +% with an |l| as the first character. This will distinguish them from +% text font families with similar names. +% +% In addition, we introduce an additional convention for shapes: if +% $x$ is a shape, then |I|$x$ represents the invisible form of the +% shape. This is used by the color separation macros and the +% |\invisible| command of the slides style file. +% +% +% \StopEventually{} +% +% \section{A driver for this document} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the +% \dst{} program. +% \changes{v2.1b}{1993/12/14}{Corrected \cs{documentclass}.} +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +%\DisableCrossrefs % Say \DisableCrossrefs if index is ready +\RecordChanges % Gather update information +%\OnlyDescription % comment out for implementation details +%\OldMakeindex % use if your MakeIndex is pre-v2.9 +\begin{document} + \DocInput{slifonts.fdd} +\end{document} +%</driver> +% \end{macrocode} +% +% +% \section{The \dst{} modules} +% +% The following modules are used to direct \dst{} in +% generating external files: +% \begin{center} +% \begin{tabular}{ll} +% driver & produce a documentation driver file \\ +% main & generate \texttt{sfonts.def} \\ +% fd & produce a font definition file \\ +% ec & Use the extended EC font set rather than cm \\[2pt] +% lccr & Concrete Roman slide sizes \\ +% lcmss & Computer Modern Sans slide sizes \\ +% lcmtt & Computer Modern Typewriter slide sizes \\ +% lcmm & Computer Modern Math italic slide sizes \\ +% lcmm & Computer Modern Math symbols slide sizes \\ +% lcmex & Computer Modern Math extension symbols slide sizes \\ +% llasy & \LaTeX{} symbols slide sizes \\ +% \end{tabular} +% \end{center} +% A typical \dst{} command file would then have entries like: +% \begin{verbatim} +%\generateFile{OMSlcmsy.fd}{t}{\from{slifonts.fdd}{lcmsy,fd}} +%\end{verbatim} +% +% \section{The font definition files} +% +% +% \subsection{Concrete Roman} +% +% \changes{v2.2b}{1997/02/25} +% {typo fixed in cccsc10. latex/2395} +% \begin{macrocode} +%<*lccr> +\DeclareFontFamily{OT1}{lccr}{\hyphenchar\font45 } +\DeclareFontShape{OT1}{lccr}{m}{sc}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>cccsc10% + }{} +\DeclareFontShape{OT1}{lccr}{m}{sl}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>ccslc9% + }{} +\DeclareFontShape{OT1}{lccr}{m}{n}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>ccr8% + }{} +\DeclareFontShape{OT1}{lccr}{m}{In}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>iccr8% + }{} +%</lccr> +% \end{macrocode} +% +% \subsection{Computer Modern Sans} +% +% \begin{macrocode} +%<*lcmss> +%<!ec> \DeclareFontFamily{OT1}{lcmss}{\hyphenchar\font45 } +%<ec> \DeclareFontFamily{T1}{lcmss}{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{m}{n}{% +%<ec> \DeclareFontShape{T1}{lcmss}{m}{n}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> lcmss8% +%<ec> eclq8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{m}{In}{% +%<ec> \DeclareFontShape{T1}{lcmss}{m}{In}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> ilcmss8% +%<ec> ieclq8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{m}{sl}{% +%<ec> \DeclareFontShape{T1}{lcmss}{m}{sl}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> lcmssi8% +%<ec> ecli8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{m}{Isl}{% +%<ec> \DeclareFontShape{T1}{lcmss}{m}{Isl}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> ilcmssi8% +%<ec> iecli8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{m}{it}{% +%<ec> \DeclareFontShape{T1}{lcmss}{m}{it}{% + <->sub*lcmss/m/sl}{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{m}{Iit}{% +%<ec> \DeclareFontShape{T1}{lcmss}{m}{Iit}{% + <->sub*lcmss/m/Isl}{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{bx}{n}{% +%<ec> \DeclareFontShape{T1}{lcmss}{bx}{n}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> lcmssb8% +%<ec> eclb8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmss}{bx}{In}{% +%<ec> \DeclareFontShape{T1}{lcmss}{bx}{In}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> ilcmssb8% +%<ec> ieclb8% + }{} +% \end{macrocode} +% +% EC fonts have a bold slanted font for the slides class. +% \begin{macrocode} +%<*ec> +\DeclareFontShape{T1}{lcmss}{bx}{sl}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% + eclo8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{T1}{lcmss}{bx}{Isl}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% + ieclo8% + }{} +% \end{macrocode} +% \begin{macrocode} +\DeclareFontShape{T1}{lcmss}{bx}{it}{% + <->sub*lcmss/bx/sl}{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{T1}{lcmss}{bx}{Iit}{% + <->sub*lcmss/bx/Isl}{} +% \end{macrocode} +% +% \begin{macrocode} +%</ec> +% \end{macrocode} +% +% There are extra substitutions for the shape |ui| which are needed +% for |\pounds| to not come out as a \$ sign (mostly). +% \changes{v2.1k}{1995/10/31}{Added substitutions to make \cs{pounds} +% work right in slides.} +% \begin{macrocode} +%<*!ec> +\DeclareFontShape{OT1}{lcmss}{m}{ui}{% + <->sub*cmr/m/ui}{} +\DeclareFontShape{OT1}{lcmss}{bx}{ui}{% + <->sub*cmr/m/ui}{} +%</!ec> +%</lcmss> +% \end{macrocode} +% +% \subsection{Computer Modern Typewriter} +% +% \begin{macrocode} +%<*lcmtt> +%<!ec> \DeclareFontFamily{OT1}{lcmtt}{\hyphenchar\font\m@ne} +%<ec> \DeclareFontFamily{T1}{lcmtt}{\hyphenchar\font\m@ne} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmtt}{m}{n}{% +%<ec> \DeclareFontShape{T1}{lcmtt}{m}{n}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> cmtt8% +%<ec> ecltt8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmtt}{m}{In}{% +%<ec> \DeclareFontShape{T1}{lcmtt}{m}{In}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> icmtt8% +%<ec> iecltt8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +%<!ec> \DeclareFontShape{OT1}{lcmtt}{m}{it}{% +%<ec> \DeclareFontShape{T1}{lcmtt}{m}{it}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>% +%<!ec> cmitt10% +%<ec> ecit1000% + }{} +% \end{macrocode} +% There are extra substitutions for the shape |ui| which are needed +% for |\pounds| to not come out as a \$ sign (mostly). +% \changes{v2.1k}{1995/10/31}{Added substitutions to make \cs{pounds} +% work right in slides.} +% \begin{macrocode} +%<*!ec> +\DeclareFontShape{OT1}{lcmtt}{m}{ui}{% + <->sub*cmtt/m/it}{} +\DeclareFontShape{OT1}{lcmtt}{bx}{ui}{% + <->sub*cmtt/m/it}{} +%</!ec> +%</lcmtt> +% \end{macrocode} +% +% \subsection{Computer Modern Math} +% +% \begin{macrocode} +%<*lcmm> +\DeclareFontFamily{OML}{lcmm}{\skewchar\font'177} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{OML}{lcmm}{m}{it}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>cmmi8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{OML}{lcmm}{m}{Iit}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>icmmi8% + }{} +%</lcmm> +% \end{macrocode} +% +% \subsection{Computer Modern Symbol} +% +% \begin{macrocode} +%<*lcmsy> +\DeclareFontFamily{OMS}{lcmsy}{\skewchar\font'60} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{OMS}{lcmsy}{m}{n}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>cmsy8% + }{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{OMS}{lcmsy}{m}{In}{% + <7><8><10><12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>icmsy8% + }{} +%</lcmsy> +% \end{macrocode} +% +% \subsection{Computer Modern large symbols} +% +% \changes{v2.1g}{1994/03/01}{Removed extra pair of curly braces +% at end of \cs{DeclareFontFamily} command.} +% \begin{macrocode} +%<*lcmex> +\DeclareFontFamily{OMX}{lcmex}{} +\DeclareFontShape{OMX}{lcmex}{m}{n}{% + <->sfixed*[17.28]cmex10% + }{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{OMX}{lcmex}{m}{In}{% + <->sfixed*[17.28]icmex10% + }{} +%</lcmex> +% \end{macrocode} +% +% \subsection{\LaTeX{} symbols} +% +% \changes{v2.2d}{1997/10/20}{Removed superfluous pair of braces at +% end of \cs{DeclareFontFamily} command.} +% \begin{macrocode} +%<*llasy> +\DeclareFontFamily{U}{llasy}{} +\DeclareFontShape{U}{llasy}{m}{n}{% + <12><13.82><16.59><19.907><23.89><28.66><34.4><41.28>lasy8% +}{} +% \end{macrocode} +% +% \begin{macrocode} +\DeclareFontShape{U}{llasy}{m}{In}{% + <13.82><16.59><19.907><23.89><28.66><34.4><41.28>ilasy8% +}{} +%</llasy> +% \end{macrocode} +% +% \section{Setting defaults} +% +% The following statements go into the file \texttt{sfonts.def} +% which plays a r\^ole similar to \texttt{fontdef.ltx}. Thus, you may +% want to produce your own local variant of it if you intend to use +% different fonts in your slides. +% \changes{v2.0b}{1993/03/09}{Added \cs{fd@prefix} for \cs{input}} +% \changes{v2.2a}{1997/01/15}{lowercase fd file} +% \begin{macrocode} +%<*main> +\DeclareErrorFont{OT1}{lcmss}{m}{n}{19.907} +\DeclareFontSubstitution{OT1}{lcmss}{m}{n} +\input ot1lcmss.fd +% \end{macrocode} +% +% Ensure some suitable starting values but don't load any font +% yet. In the past this was implicitly done as part of +% \cs{DeclareErrorFont} but not any longer. +% \changes{v2.2f}{2019/07/09}{Explicitly set some defaults} +% \begin{macrocode} +\fontencoding{OT1} +\fontfamily{lcmss} +\fontseries{m} +\fontshape{n} +\fontsize{19.907}{19.907} +%</main> +% \end{macrocode} +% +% +% The next line goes into all files and in addition prevents \dst{} +% from adding any further code from the main source file (such as a +% character table. +% \begin{macrocode} +\endinput +% \end{macrocode} +% +% \Finale +% +%% \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 \~} diff --git a/Master/texmf-dist/source/latex-dev/base/syntonly.dtx b/Master/texmf-dist/source/latex-dev/base/syntonly.dtx new file mode 100644 index 00000000000..98c8e4dfc36 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/syntonly.dtx @@ -0,0 +1,282 @@ +% \iffalse meta-comment +% +% Copyright 1993-2017 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +%% +% +% +% \changes{v2.1a}{1994/03/10}{Update for \LaTeXe} +% +% \DoNotIndex{\@cclvi,\@cclv,\@gobble,\@gobbletwo,\@ifnextchar} +% \DoNotIndex{\@M,\@tempboxa,\advance,\alloc,\begingroup,\bgroup} +% \DoNotIndex{\box,\count@,\def,\do,\docdate,\egroup,\endgroup} +% \DoNotIndex{\fi,\filedate,\fileversion,\font,\fontdimen,\global} +% \DoNotIndex{\ifinner,\ifnum,\immediate,\let,\long,\loop,\m@ne} +% \DoNotIndex{\noexpand,\relax,\repeat,\scriptfont} +% \DoNotIndex{\scriptscriptfont,\setbox,\sixt@@n,\space,\textfont} +% \DoNotIndex{\toks,\toksdef,\write,\xdef,\z@}% +% +% +%\title{The file \texttt{syntonly.dtx} for use with +% \LaTeXe.\thanks{This file has version +% number \fileversion, dated \filedate.}\\[2pt] +% It contains the code for \texttt{syntonly.sty}} +% \author{Frank Mittelbach \and Rainer Sch\"opf} +% +% +% \MaintainedByLaTeXTeam{latex} +% \maketitle +% +% This package implements the |\syntaxonly| declaration for \LaTeXe. +% This command can be used in the preamble for running a document +% through \LaTeX{} without actually getting any output. +% +% \StopEventually{} +% +% +% \section{Identification} +% +% We identify the package and its current version. +% \changes{v2.1b}{1995/04/22}{Removed surplus \cs{typeout} lines} +% \changes{v2.1c}{1996/06/14}{Rearrange \cs{GetFileInfo} usage.} +% \changes{v2.1d}{1998/08/17}{(RmS) Minor documentation fixes.} +% +% \begin{macrocode} +%<package>\ProvidesPackage{syntonly} +%<*dtx> + \ProvidesFile{syntonly.dtx} +%</dtx> +%<*package|dtx> + [2017/06/30 v2.1e Standard LaTeX2e package] +%</package|dtx> +% \end{macrocode} +% +%\iffalse +% +% \section{The documentation driver file} +% +% The next bit of code contains the documentation driver file for +% \TeX{}, i.e., the file that will produce the documentation you are +% currently reading. It will be extracted from this file by the \dst{} +% program. +% \begin{macrocode} +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{syntonly.dtx} +\providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +\begin{document} + \DocInput{syntonly.dtx} +\end{document} +%</driver> +% \end{macrocode} +%\fi +% +% +% \section{Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macro}{\dummyft@} +% First of all we need to define the `dummy' font. +% \begin{macrocode} +\font\dummyft@=dummy \relax +% \end{macrocode} +% \end{macro} +% \changes{v2.1b}{1995/05/25}{Removed unneeded fontdimen settings for +% dummyft@} +% +% \begin{macro}{\ifsyntax@} +% Now we can define the `syntax only' feature. We define a switch +% |\if@syntax| so that any macro can always find out if it +% is really supposed to typeset text. Its default is to run in +% normal mode. +% \begin{macrocode} +\newif\ifsyntax@ +\syntax@false +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\syntaxonly} +% The |\syntaxonly| macro sets up everything for syntax +% checking. +% \begin{macrocode} +\def\syntaxonly{% +% \end{macrocode} +% First of all it sets the |syntax@| switch to \texttt{true}. +% \begin{macrocode} + \syntax@true +% \end{macrocode} +% Then it globally sets all fonts to the dummy font. These are: +% the current font outside math mode, +% \begin{macrocode} + \global\dummyft@ +% \end{macrocode} +% and the $3\times16$ math fonts for the $16$ math \emph{groups}. +% We use a loop to set these. +% \begin{macrocode} + \count@\sixt@@n + \loop + \ifnum\count@ >\z@ + \advance\count@\m@ne + \global\textfont\count@\dummyft@ + \global\scriptfont\count@\dummyft@ + \global\scriptscriptfont\count@\dummyft@ + \repeat +% \end{macrocode} +% Since all font changes occur either via |\selectfont| (in +% text or |\mathversion| (for math mode) it is sufficient +% to change these to no-ops. In addition we must prevent +% the loading of math fonts, this is done by making +% |\getanddefine@fonts| a no-op. +% \begin{macrocode} + \global\let\selectfont\relax + \global\let\mathversion\@gobble + \global\let\getanddefine@fonts\@gobbletwo +% \end{macrocode} +% We prevent \TeX{} from complaining about the dummy font +% having no characters. +% \begin{macrocode} + \tracinglostchars\z@ +% \end{macrocode} +% Then we disable the output routine, and set |\frenchspacing| +% (which is slightly faster than |\nonfrenchspacing|). +% Finally we set |\hbadness| to $10000$ to avoid overfull box +% messages. +% \begin{macrocode} + \nopages@ + \frenchspacing + \hbadness\@M} +% \end{macrocode} +% \end{macro} +% +% \changes{v2.1b}{1995/05/25}{Removed non-outer newtoks@: newtoks is no +% longer outer} +% +% \begin{macro}{\nopages@} +% \changes{v1.0b}{1990/01/14}{Rewrite of the \cs{nopages@} macro to +% correctly handle footnote insertions, floats and marginpars.} +% The |\nopages@| macro disables the \LaTeX{} output routine. +% To this end we define a very simple output routine that empties +% the output \emph{and} footnote boxes (remember that the latter +% are insertions. +% \begin{macrocode} +\def\nopages@{% + \output {\setbox\z@\box\@cclv + \setbox\z@\box\footins + \deadcycles\z@}% +% \end{macrocode} +% Then we protect it against definition by a style file. +% \changes{v2.1b}{1995/05/25}{newtoks is no longer outer} +% \begin{macrocode} + \newtoks\output +% \end{macrocode} +% But this is not enough: normally the \LaTeX{} output routine +% is responsible for dealing with floating objects. +% We therefore also redefine the internal macros for handling +% floats and marginpars. +% \begin{macrocode} + \def\@xfloat##1[##2]{% +% \end{macrocode} +% There are a few things that have to be retained: +% the definition of |\@captype| since it is used by the +% |\caption| command, +% \changes{v1.0c}{1990/01/16}{Definition of \cs{@captype} added.} +% \begin{macrocode} + \def\@captype{##1}% +% \end{macrocode} +% the error message issued when not in outer paragraph mode, +% \begin{macrocode} + \ifinner\@parmoderr\fi +% \end{macrocode} +% and the |\@parboxrestore| command for the body of the +% float. This is necessary since it restores the original +% definitions of important commands like |\par| or |\\|. +% \begin{macrocode} + \setbox\@tempboxa\vbox\bgroup\@parboxrestore}% +% \end{macrocode} +% |\end@float| must now only close the brace: +% \begin{macrocode} + \let\end@float\egroup +% \end{macrocode} +% The above would be enough also for two-column floats with the +% kernel algorithm. However with the refined algorithm inside +% \texttt{fixlxt2e} this doesn't any longer work, so there we also +% need to explicitly overwrite the end macro for two-column floats +% (the begin is still okay as it resolves to |\@xfloat| eventually). +% \begin{macrocode} + \let\end@dblfloat\egroup +% \end{macrocode} +% The redefinition of the |\marginpar| command is a bit more +% complicated since we have to check for the optional argument. +% First we redefine the command itself: +% \begin{macrocode} + \def\marginpar{\ifinner\@parmoderr\fi +% \end{macrocode} +% We open a group so that everything gathered in a temporary box +% can easily be thrown away by closing it again (see below). +% \begin{macrocode} + \begingroup \@ifnextchar [\@xmpar\@ympar} +% \end{macrocode} +% |\@xmpar| and |\@ympar| are now defined similar to +% |\@xfloat| above. +% If an optional argument is present |\@xmpar| typesets +% it in a temporary box that is thrown away later. +% Then it calls up |\@ympar| to process |\marginpar|'s +% argument. +% \changes{v1.0d}{1990/01/21}{Added forgotten \cs{vbox}.} +% \begin{macrocode} + \long\def\@xmpar[##1]{% + \setbox\@tempboxa\vbox{\@parboxrestore ##1}\@ympar}% +% \end{macrocode} +% |\@ympar| gathers its argument in the same temporary box +% and throws away its contents by closing the group opened up in +% |\marginpar| above. +% \changes{v1.0d}{1990/01/21}{Added forgotten \cs{vbox}.} +% \begin{macrocode} + \long\def\@ympar##1{% + \setbox\@tempboxa\vbox{\@parboxrestore ##1}\endgroup}% +% \end{macrocode} +% And that's all we had to do. +% \begin{macrocode} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@preamblecmds} +% We disable the use of the |\syntaxonly| command after +% |\begin{document}| +% \begin{macrocode} +\@onlypreamble\syntaxonly +%</package> +% \end{macrocode} +% \end{macro} +% +% \Finale + +\endinput diff --git a/Master/texmf-dist/source/latex-dev/base/syntonly.ins b/Master/texmf-dist/source/latex-dev/base/syntonly.ins new file mode 100644 index 00000000000..c05eb92bf07 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/syntonly.ins @@ -0,0 +1,88 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 1993-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file has the LPPL maintenance status "maintained". + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +The list of derived (unpacked) files belonging to the distribution +and covered by LPPL is defined by the unpacking scripts (with +extension .ins) which are part of the distribution. +\endpreamble + +\keepsilent +\usedir{tex/latex/base} + +\generateFile{syntonly.sty}{t}{% + \from{syntonly.dtx}{package}} + +\endbatchfile + diff --git a/Master/texmf-dist/source/latex-dev/base/tulm.fdd b/Master/texmf-dist/source/latex-dev/base/tulm.fdd new file mode 100644 index 00000000000..a5a212c6e11 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/tulm.fdd @@ -0,0 +1,330 @@ +% \iffalse meta-comment +% +% Copyright 2016-2017 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +%\iffalse This is a META comment +% +% File `cmfonts.fdd'. +% Copyright (C) 2016-2017 LaTeX3 Project +% +% +%<TUlmr>\ProvidesFile{tulmr.fd} +%<TUlmss>\ProvidesFile{tulmss.fd} +%<TUlmssq>\ProvidesFile{tulmssq.fd} +%<TUlmtt>\ProvidesFile{tulmtt.fd} +%<TUlmvtt>\ProvidesFile{tulmvtt.fd} +%<TUlmdh>\ProvidesFile{tulmdh.fd} +%<*driver> + \ProvidesFile{tulm.drv} +%</driver> + [2017/01/26 v1.8 Standard LaTeX font definitions for Latin Modern] +% +%<*driver> +\documentclass{ltxdoc} +\GetFileInfo{tulm.drv} +\providecommand\dst{\expandafter{\normalfont\scshape docstrip}} +\title{The file \texttt{tulm.fdd} for use with + \LaTeXe.\thanks{This file has version + number \fileversion, dated \filedate.}} +\date{\filedate}\author{LaTeX3 Project} +\addtolength\textwidth{30pt} +\begin{document} +\MaintainedByLaTeXTeam{latex} +\maketitle + \DocInput{tulm.fdd} +\end{document} +%</driver> +% +%\fi +% +% \section{TUlmr} +% \begin{macrocode} +%<*TUlmr> +\DeclareFontFamily{TU}{lmr}{} +\DeclareFontShape{TU}{lmr}{m}{n}% + {<-5.5> \UnicodeFontFile{lmroman5-regular}{\UnicodeFontTeXLigatures} + <5.5-6.5> \UnicodeFontFile{lmroman6-regular}{\UnicodeFontTeXLigatures} + <6.5-7.5> \UnicodeFontFile{lmroman7-regular}{\UnicodeFontTeXLigatures} + <7.5-8.5> \UnicodeFontFile{lmroman8-regular}{\UnicodeFontTeXLigatures} + <8.5-9.5> \UnicodeFontFile{lmroman9-regular}{\UnicodeFontTeXLigatures} + <9.5-11> \UnicodeFontFile{lmroman10-regular}{\UnicodeFontTeXLigatures} + <11-15> \UnicodeFontFile{lmroman12-regular}{\UnicodeFontTeXLigatures} + <15-> \UnicodeFontFile{lmroman17-regular}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmr}{m}{sl}% + {<-8.5> \UnicodeFontFile{lmromanslant8-regular}{\UnicodeFontTeXLigatures} + <8.5-9.5> \UnicodeFontFile{lmromanslant9-regular}{\UnicodeFontTeXLigatures} + <9.5-11> \UnicodeFontFile{lmromanslant10-regular}{\UnicodeFontTeXLigatures} + <11-15> \UnicodeFontFile{lmromanslant12-regular}{\UnicodeFontTeXLigatures} + <15-> \UnicodeFontFile{lmromanslant17-regular}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmr}{m}{it}% + {<-7.5> \UnicodeFontFile{lmroman7-italic}{\UnicodeFontTeXLigatures} + <7.5-8.5> \UnicodeFontFile{lmroman8-italic}{\UnicodeFontTeXLigatures} + <8.5-9.5> \UnicodeFontFile{lmroman9-italic}{\UnicodeFontTeXLigatures} + <9.5-11> \UnicodeFontFile{lmroman10-italic}{\UnicodeFontTeXLigatures} + <11-> \UnicodeFontFile{lmroman12-italic}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmr}{m}{sc}% + {<-> \UnicodeFontFile{lmromancaps10-regular}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmr}{m}{ui}% + {<-> ec-lmu10}{} +\DeclareFontShape{TU}{lmr}{m}{scsl}% + {<-> \UnicodeFontFile{lmromancaps10-oblique}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmr}{b}{n} + {<-> \UnicodeFontFile{lmromandemi10-regular}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmr}{b}{sl} + {<-> \UnicodeFontFile{lmromandemi10-oblique}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmr}{bx}{n} + {<-5.5> \UnicodeFontFile{lmroman5-bold}{\UnicodeFontTeXLigatures} + <5.5-6.5> \UnicodeFontFile{lmroman6-bold}{\UnicodeFontTeXLigatures} + <6.5-7.5> \UnicodeFontFile{lmroman7-bold}{\UnicodeFontTeXLigatures} + <7.5-8.5> \UnicodeFontFile{lmroman8-bold}{\UnicodeFontTeXLigatures} + <8.5-9.5> \UnicodeFontFile{lmroman9-bold}{\UnicodeFontTeXLigatures} + <9.5-11> \UnicodeFontFile{lmroman10-bold}{\UnicodeFontTeXLigatures} + <11-> \UnicodeFontFile{lmroman12-bold}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmr}{bx}{it} + {<-> \UnicodeFontFile{lmroman10-bolditalic}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmr}{bx}{sl} + {<-> \UnicodeFontFile{lmromanslant10-bold}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmr}{b}{it} + {<->sub * lmr/b/sl}{} +%</TUlmr> +% \end{macrocode} +% +% \section{TUlmss} +% \begin{macrocode} +%<*TUlmss> +\DeclareFontFamily{TU}{lmss}{} +\DeclareFontShape{TU}{lmss}{m}{n} + {<-8.5> \UnicodeFontFile{lmsans8-regular}{\UnicodeFontTeXLigatures} + <8.5-9.5> \UnicodeFontFile{lmsans9-regular}{\UnicodeFontTeXLigatures} + <9.5-11> \UnicodeFontFile{lmsans10-regular}{\UnicodeFontTeXLigatures} + <11-15.5> \UnicodeFontFile{lmsans12-regular}{\UnicodeFontTeXLigatures} + <15.5-> \UnicodeFontFile{lmsans17-regular}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmss}{m}{it} + {<->ssub*lmss/m/sl}{} +\DeclareFontShape{TU}{lmss}{m}{sl} + {<-8.5> \UnicodeFontFile{lmsans8-oblique}{\UnicodeFontTeXLigatures} + <8.5-9.5> \UnicodeFontFile{lmsans9-oblique}{\UnicodeFontTeXLigatures} + <9.5-11> \UnicodeFontFile{lmsans10-oblique}{\UnicodeFontTeXLigatures} + <11-15.5> \UnicodeFontFile{lmsans12-oblique}{\UnicodeFontTeXLigatures} + <15.5-> \UnicodeFontFile{lmsans17-oblique}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmss}{m}{sc} + {<->sub*lmr/m/sc}{} +\DeclareFontShape{TU}{lmss}{b}{n} + {<->ssub * lmss/bx/n}{} +\DeclareFontShape{TU}{lmss}{b}{sl} + {<->ssub * lmss/bx/sl}{} +\DeclareFontShape{TU}{lmss}{b}{it} + {<->ssub * lmss/bx/it}{} +\DeclareFontShape{TU}{lmss}{sbc}{n} + {<-> \UnicodeFontFile{lmsansdemicond10-regular}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmss}{sbc}{sl} + {<-> \UnicodeFontFile{lmsansdemicond10-oblique}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmss}{sbc}{it} + {<->ssub*lmss/sbc/sl}{} +\DeclareFontShape{TU}{lmss}{bx}{n} + {<-> \UnicodeFontFile{lmsans10-bold}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmss}{bx}{sl} + {<-> \UnicodeFontFile{lmsans10-boldoblique}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmss}{bx}{it} + {<->ssub*lmss/bx/sl}{} +%</TUlmss> +% \end{macrocode} +% +% \section{TUlmssq} +% \begin{macrocode} +%<*TUlmssq> +\DeclareFontFamily{TU}{lmssq}{} +\DeclareFontShape{TU}{lmssq}{m}{n} + {<-> \UnicodeFontFile{lmsansquot8-regular}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmssq}{m}{sl} + {<-> \UnicodeFontFile{lmsansquot8-oblique}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmssq}{bx}{n} + {<-> \UnicodeFontFile{lmsansquot8-bold}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmssq}{bx}{sl} + {<-> \UnicodeFontFile{lmsansquot8-boldoblique}{\UnicodeFontTeXLigatures}}{} +\DeclareFontShape{TU}{lmssq}{m}{it} + {<->ssub*lmssq/m/sl}{} +\DeclareFontShape{TU}{lmssq}{bx}{it} + {<->ssub*lmssq/bx/sl}{} +\DeclareFontShape{TU}{lmssq}{b}{n} + {<->ssub * lmssq/bx/n}{} +\DeclareFontShape{TU}{lmssq}{b}{sl} + {<->ssub * lmssq/bx/sl}{} +\DeclareFontShape{TU}{lmssq}{b}{it} + {<->ssub * lmssq/bx/it}{} +%</TUlmssq> +% \end{macrocode} +% +% \section{TUlmtt} +% \begin{macrocode} +%<*TUlmtt> +\DeclareFontFamily{TU}{lmtt}{% +\hyphenchar \font\m@ne +\fontdimen3\font\z@ +\fontdimen4\font\z@ +} +\ifx\lmtt@use@light@as@normal\@empty +\DeclareFontShape{TU}{lmtt}{sb}{n} + {<-8.5> \UnicodeFontFile{lmmono8-regular}{} + <8.5-9.5> \UnicodeFontFile{lmmono9-regular}{} + <9.5-11> \UnicodeFontFile{lmmono10-regular}{} + <11-> \UnicodeFontFile{lmmono12-regular}{} + }{} +\DeclareFontShape{TU}{lmtt}{sb}{it} + {<-> \UnicodeFontFile{lmmono10-italic}{}}{} +\DeclareFontShape{TU}{lmtt}{sb}{sl} + {<-> \UnicodeFontFile{lmmonoslant10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{sb}{sc} + {<-> \UnicodeFontFile{lmmonocaps10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{sb}{scsl} + {<-> \UnicodeFontFile{lmmonocaps10-oblique}{}}{} +\DeclareFontShape{TU}{lmtt}{m}{n} + {<-> \UnicodeFontFile{lmmonolt10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{m}{it} + {<->sub*lmtt/l/sl}{} +\DeclareFontShape{TU}{lmtt}{m}{sl} + {<-> \UnicodeFontFile{lmmonolt10-oblique}{}}{} +\DeclareFontShape{TU}{lmtt}{c}{n} + {<-> \UnicodeFontFile{lmmonoltcond10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{c}{it} + {<->sub*lmtt/lc/sl}{} +\DeclareFontShape{TU}{lmtt}{c}{sl} + {<-> \UnicodeFontFile{lmmonoltcond10-oblique}{}}{} +\else +\DeclareFontShape{TU}{lmtt}{m}{n} + {<-8.5> \UnicodeFontFile{lmmono8-regular}{} + <8.5-9.5> \UnicodeFontFile{lmmono9-regular}{} + <9.5-11> \UnicodeFontFile{lmmono10-regular}{} + <11-> \UnicodeFontFile{lmmono12-regular}{} + }{} +\DeclareFontShape{TU}{lmtt}{m}{it} + {<-> \UnicodeFontFile{lmmono10-italic}{}}{} +\DeclareFontShape{TU}{lmtt}{m}{sl} + {<-> \UnicodeFontFile{lmmonoslant10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{m}{sc} + {<-> \UnicodeFontFile{lmmonocaps10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{m}{scsl} + {<-> \UnicodeFontFile{lmmonocaps10-oblique}{}}{} +\DeclareFontShape{TU}{lmtt}{l}{n} + {<-> \UnicodeFontFile{lmmonolt10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{l}{it} + {<->sub*lmtt/l/sl}{} +\DeclareFontShape{TU}{lmtt}{l}{sl} + {<-> \UnicodeFontFile{lmmonolt10-oblique}{}}{} +\DeclareFontShape{TU}{lmtt}{lc}{n} + {<-> \UnicodeFontFile{lmmonoltcond10-regular}{}}{} +\DeclareFontShape{TU}{lmtt}{lc}{it} + {<->sub*lmtt/lc/sl}{} +\DeclareFontShape{TU}{lmtt}{lc}{sl} + {<-> \UnicodeFontFile{lmmonoltcond10-oblique}{}}{} +\fi +\DeclareFontShape{TU}{lmtt}{b}{n} + {<-> \UnicodeFontFile{lmmonolt10-bold}{}}{} +\DeclareFontShape{TU}{lmtt}{b}{it} + {<->sub*lmtt/b/sl}{} +\DeclareFontShape{TU}{lmtt}{b}{sl} +{<-> \UnicodeFontFile{lmmonolt10-boldoblique}{}}{} +\DeclareFontShape{TU}{lmtt}{bx}{it} + {<->sub*lmtt/b/sl}{} +\DeclareFontShape{TU}{lmtt}{bx}{n} + {<->ssub*lmtt/b/n}{} +\DeclareFontShape{TU}{lmtt}{bx}{sl} + {<->ssub*lmtt/b/sl}{} +%</TUlmtt> +% \end{macrocode} +% +% \section{TUlmvtt} +% \begin{macrocode} +%<*TUlmvtt> +\DeclareFontFamily{TU}{lmvtt}{} +\ifx\lmtt@use@light@as@normal\@empty +\DeclareFontShape{TU}{lmvtt}{sb}{n} + {<->\UnicodeFontFile{lmmonoprop10-regular}{}}{} +\DeclareFontShape{TU}{lmvtt}{sb}{sl} + {<->\UnicodeFontFile{lmmonoprop10-oblique}{}}{} +\DeclareFontShape{TU}{lmvtt}{sb}{it} + {<->sub*lmvtt/m/sl}{} +\DeclareFontShape{TU}{lmvtt}{m}{n} + {<->\UnicodeFontFile{lmmonoproplt10-regular}{}}{} +\DeclareFontShape{TU}{lmvtt}{m}{sl} + {<->\UnicodeFontFile{lmmonoproplt10-oblique}{}}{} +\DeclareFontShape{TU}{lmvtt}{m}{it} + {<->sub*lmvtt/l/sl}{} +\else +\DeclareFontShape{TU}{lmvtt}{m}{n} + {<->\UnicodeFontFile{lmmonoprop10-regular}{}}{} +\DeclareFontShape{TU}{lmvtt}{m}{sl} + {<->\UnicodeFontFile{lmmonoprop10-oblique}{}}{} +\DeclareFontShape{TU}{lmvtt}{m}{it} + {<->sub*lmvtt/m/sl}{} +\DeclareFontShape{TU}{lmvtt}{l}{n} + {<->\UnicodeFontFile{lmmonoproplt10-regular}{}}{} +\DeclareFontShape{TU}{lmvtt}{l}{sl} + {<->\UnicodeFontFile{lmmonoproplt10-oblique}{}}{} +\DeclareFontShape{TU}{lmvtt}{l}{it} + {<->sub*lmvtt/l/sl}{} +\fi +\DeclareFontShape{TU}{lmvtt}{b}{n} + {<->\UnicodeFontFile{lmmonoproplt10-bold}{}}{} +\DeclareFontShape{TU}{lmvtt}{b}{sl} + {<->\UnicodeFontFile{lmmonoproplt10-boldoblique}{}}{} +\DeclareFontShape{TU}{lmvtt}{b}{it} + {<->sub*lmvtt/b/sl}{} +\DeclareFontShape{TU}{lmvtt}{bx}{n} + {<->ssub*lmvtt/b/n}{} +\DeclareFontShape{TU}{lmvtt}{bx}{sl} + {<->ssub*lmvtt/b/sl}{} +\DeclareFontShape{TU}{lmvtt}{bx}{it} + {<->sub*lmvtt/b/sl}{} +%</TUlmvtt> +% \end{macrocode} +% +% \section{TUlmdh} +% \begin{macrocode} +%<*TUlmdh> +\DeclareFontFamily{TU}{lmdh}{}% +\DeclareFontShape{TU}{lmdh}{m}{n} + {<-> \UnicodeFontFile{lmromandunh10-regular}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmdh}{m}{sl} + {<-> \UnicodeFontFile{lmromandunh10-oblique}{\UnicodeFontTeXLigatures} + }{} +\DeclareFontShape{TU}{lmdh}{m}{it} + {<->sub*lmdh/m/sl}{} +%</TUlmdh> +% \end{macrocode} +% +% +% \Finale +% diff --git a/Master/texmf-dist/source/latex-dev/base/tulm.ins b/Master/texmf-dist/source/latex-dev/base/tulm.ins new file mode 100644 index 00000000000..1a48c866b4c --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/tulm.ins @@ -0,0 +1,113 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 2016-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3b +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3b or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of docstrip commands ------------------ +%% + +\input docstrip + +\preamble + +This is a generated file. + +The source is maintained by the LaTeX Project team and bug +reports for it can be opened at https://latex-project.org/bugs.html +(but please observe conditions on bug reports sent to that address!) + + +Copyright 2016-2017 +The LaTeX3 Project and any individual authors listed elsewhere +in this file. + +This file was generated from file(s) of the LaTeX base system. +-------------------------------------------------------------- + +It may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either version 1.3c +of this license or (at your option) any later version. +The latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3c or later is part of all distributions of LaTeX +version 2005/12/01 or later. + +This file may only be distributed together with a copy of the LaTeX +base system. You may however distribute the LaTeX base system without +such generated files. + +The list of all files belonging to the LaTeX base distribution is +given in the file `manifest.txt'. See also `legal.txt' for additional +information. + +In particular, permission is granted to customize the declarations in +this file to serve the needs of your installation. + +However, a modified version of this file under its original name +should not be distributed as part of a standard LaTeX distribution, as +the modification will be nontransparent for the user of that +distribution (and thus violating clause 6a of the LPPL license), +making successful document exchange impossible. + +\endpreamble + + +\keepsilent +\usedir{tex/latex/base} + +\generate{\file{tulmss.fd}{\from{tulm.fdd}{TUlmss}} + \file{tulmssq.fd}{\from{tulm.fdd}{TUlmssq}} + \file{tulmr.fd}{\from{tulm.fdd}{TUlmr}} + \file{tulmtt.fd}{\from{tulm.fdd}{TUlmtt}} + \file{tulmvtt.fd}{\from{tulm.fdd}{TUlmvtt}} + \file{tulmdh.fd}{\from{tulm.fdd}{TUlmdh}}} + + +\ifToplevel{ +\Msg{***********************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* \space\space All *.fd} +\Msg{*} +\Msg{* To produce the documentation run the files ending with} +\Msg{* `.fdd' through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing} +\Msg{***********************************************************} +} + +\endbatchfile + diff --git a/Master/texmf-dist/source/latex-dev/base/unpack.ins b/Master/texmf-dist/source/latex-dev/base/unpack.ins new file mode 100644 index 00000000000..969028edfe0 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/unpack.ins @@ -0,0 +1,135 @@ +%% +%% This file will generate fast loadable files and documentation +%% driver files from the doc files in this package when run through +%% LaTeX or TeX. +%% +%% Copyright 1993-2017 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file is part of the LaTeX base system. +%% ------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.3c +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% https://www.latex-project.org/lppl.txt +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This file has the LPPL maintenance status "maintained". +%% +%% As this file contains legal notices, it is NOT PERMITTED to modify +%% this file in any way that the legal information placed into +%% generated files is changed (i.e., the files generated when the +%% original file is executed). This restriction does not apply if +%% (parts of) the content is reused in a different WORK producing its +%% own generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% +%% +%% +%% --------------- start of bootstrap commands ------------------ +%% +%% +%% LaTeX 2e installation script (concurrent version) +\let\documentclass\undefined +\input ltdirchk.dtx +\input docstrip.dtx + +{ +\def\ProvidesFile#1\end#2{} +\@@input ltvers.dtx +\Msg{**********************************************} +\Msg{*} +\Msg{* Welcome to the Installation routine of} +\Msg{*} +\Msg{* \space\space\space\space\fmtname\space <\fmtversion>} +\Msg{*} +\Msg{* Depending on your machine the installation} +\Msg{* might take a long time --- this is the} +\Msg{* price for being able to run on all platforms.} +\Msg{* So please be patient :-)} +\Msg{*} +\Msg{**********************************************} +\Msg{} +\Msg{} +} + + +%\askonceonly +\askforoverwritefalse + +\keepsilent + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% generate main kernel file +%%% and the .ltx files that set up the default settings +%%% that may be changed by the use of .cfg files. + +\batchinput{format.ins} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% generate .def files for encoding support + +\batchinput{inputenc.ins} +\batchinput{ltoutenc.ins} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% other classes and packages + +\batchinput{classes.ins} + +\batchinput{letter.ins} + +\batchinput{slides.ins} + +\batchinput{proc.ins} + +\batchinput{latexsym.ins} + +\batchinput{cmfonts.ins} + +\batchinput{tulm.ins} + +\batchinput{ec.ins} + +\batchinput{latex209.ins} + +\batchinput{docstrip.ins} + +\batchinput{ifthen.ins} + +\batchinput{graphpap.ins} + +\batchinput{makeindx.ins} + +\batchinput{syntonly.ins} + +\batchinput{exscale.ins} + +\batchinput{alltt.ins} + +\batchinput{nfssfont.ins} + +\batchinput{fix-cm.ins} + +\batchinput{latexrelease.ins} + + +\Msg{} +\Msg{*********************************************} +\Msg{*} +\Msg{* Now run initex to generate the format file} +\Msg{*} +\Msg{*********************************************} +\Msg{} + +\endbatchfile diff --git a/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx b/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx new file mode 100644 index 00000000000..d6c8f82f407 --- /dev/null +++ b/Master/texmf-dist/source/latex-dev/base/utf8ienc.dtx @@ -0,0 +1,2264 @@ +% \iffalse meta-comment +% +% Copyright 1993-2019 +% The LaTeX3 Project and any individual authors listed elsewhere +% in this file. +% +% This file is part of the LaTeX base system. +% ------------------------------------------- +% +% It may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3c or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This file has the LPPL maintenance status "maintained". +% +% The list of all files belonging to the LaTeX base distribution is +% given in the file `manifest.txt'. See also `legal.txt' for additional +% information. +% +% The list of derived (unpacked) files belonging to the distribution +% and covered by LPPL is defined by the unpacking scripts (with +% extension .ins) which are part of the distribution. +% +% \fi +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage[latin1,utf8]{inputenc}% force utf8 to be re-loaded, to get version info +\GetFileInfo{utf8.def} +\title{Providing some UTF-8 support via \texttt{inputenc}} +\date{\fileversion\space\filedate{} printed \today} + \author{% + David Carlisle \and Frank Mittelbach \and + Chris Rowley\thanks{Borrowing heavily from tables by Sebastian Rahtz; some table + and code cleanup by Javier Bezos}} +\begin{document} + \MaintainedByLaTeXTeam{latex} + \maketitle + \tableofcontents + \DocInput{utf8ienc.dtx} +\end{document} +%</driver> +% \fi +% +% \newpage +% +% \section{Introduction} +% +% +% \subsection{Background and general stuff} +% +% For many reasons what this package provides is a long way from any +% type of `Unicode compliance'. +% +% In stark contrast to 8-bit character sets, with 16 or more bits it can +% easily be very inefficient to support the full range.\footnote{In +% fact, \LaTeX's current 8-bit support does not go so far as to make +% all 8-bit characters into valid input.} Moreover, useful support of +% character input by a typesetting system overwhelmingly means finding +% an acceptable visual representation of a sequence of characters and +% this, for \LaTeX{}, means having available a suitably encoded 8-bit +% font. +% +% Unfortunately it is not possible to predict exactly what valid UTF-8 +% octet sequences will appear in a particular file so it is best to +% make all the unsupported but valid sequences produce a reasonably +% clear and noticeable error message. +% +% There are two directions from which to approach the question of what +% to load. One is to specify the ranges of Unicode characters that will +% result in some sensible typesetting; this requires the provider to +% ensure that suitable fonts are loaded and that these input characters +% generate the correct typesetting via the encodings of those fonts. The +% other is to inspect the font encodings to be used and use these to +% define which input Unicode characters should be supported. +% +% For Western European languages, at least, going in either direction +% leads to many straightforward decisions and a few that are more +% subjective. In both cases some of the specifications are \TeX{} +% specific whilst most are independent of the particular typesetting +% software in use. +% +% As we have argued elsewhere, \LaTeX{} needs to refer to characters via +% `seven-bit-text' names and, so far, these have been chosen by +% reference to historical sources such as Plain \TeX{} or Adobe encoding +% descriptions. It is unclear whether this ad hoc naming structure should +% simply be extended or whether it would be useful to +% supplement it with standardised internal Unicode character names such as +% one or more of the following:\footnote{Burkhard und Holger Mittelbach +% spielen mit mir! Sie haben etwas hier geschrieben.} +% +% \begin{verbatim} +% \ltxutwochar <4 hex digits> +% +% \ltxuchar {<hex digits>} +% B H U R R R +% +% \ltxueightchartwo <2 utf8 octets as 8-bit char tokens> +% \ltxueightcharthree <3 utf8 octets ...> +% \ltxueightcharfour <4 utf8 octets ...> +% \end{verbatim} +% +% +% \subsection{More specific stuff} +% +% In addition to setting up the mechanism for reading UTF-8 characters +% and specifying the \LaTeX-level support available, this package +% contains support for some default historically expected \TeX-related +% characters and some example `Unicode definition files' for standard +% font encodings. +% +% +% \subsection{Notes} +% +% This package does not support Unicode combining characters as \TeX{} +% is not really equipped to make this possible. +% +% No attempt is made to be useful beyond Latin, and maybe Cyrillic, +% for European languages (as of now). +% +% +% \subsection{Basic operation of the code} +% +% The \texttt{inputenc} package makes the upper 8-bit characters active and +% assigns to all of them an error message. It then waits for the +% input encoding files to change this set-up. Similarly, whenever +% |\inputencoding| is encountered in a document, first the upper +% 8-bit characters are set back to produce an error and then the +% definitions for the new input encoding are loaded, changing some of the +% previous settings. +% +% The 8-bit input encodings currently supported by \texttt{inputenc} +% all use declarations such as |\DeclareInputText| and the like to map an +% 8-bit number to some \LaTeX{} internal form, e.g.~to |\"a|. +% +% The situation when supporting UTF-8 as the input encoding is +% different, however. Here we only have to set up the actions of +% those 8-bit numbers that can be the first octet in a UTF-8 +% representation of a Unicode character. But we cannot simply set +% this to some internal \LaTeX{} form since the Unicode character +% consists of more than one octet; instead we have to define this +% starting octet to parse the right number of further octets that +% together form the UTF-8 representation of some Unicode character. +% +% Therefore when switching to \texttt{utf8} within the +% \texttt{inputenc} framework the characters with numbers (hex) +% from \texttt{"C2} to \texttt{"DF} are defined to parse for a +% second octet following, the characters from \texttt{"E0} to +% \texttt{"EF} are defined to parse for two more octets and finally +% the characters from \texttt{"F0} to \texttt{"F3} are defined to +% parse for three additional octets. These additional octets are +% always in the range \texttt{"80} to \texttt{"B9}. +% +% Thus, when such a character is encountered in the document (so +% long as expansion is not prohibited) a defined number of +% additional octets (8-bit characters) are read and from them a +% unique control sequence name is immediately constructed. +% +% This control sequence is either defined (good) or undefined +% (likely); in the latter case the user gets an error message +% saying that this UTF-8 sequence (or, better, Unicode character) +% is not supported. +% +% If the control sequence is set up to do something useful then it will +% expand to a \LaTeX{} internal form: e.g.~for the utf8 sequence of +% two octets \texttt{"C3 "A4} we get |\"a| as the +% internal form which then, depending on the font encoding, +% eventually resolves to the single glyph `latin-a-umlaut' or to +% the composite glyph `latin-a with an umlaut accent'. +% +% These mappings from (UTF-8 encoded) Unicode characters to \LaTeX{} +% internal forms are made indirectly. The code below provides a +% declaration |\DeclareUnicodeCharacter| which maps Unicode numbers +% (as hexadecimal) to \LaTeX{} internal forms. +% +% This mapping needs to be set up only once so it is done at +% |\begin{document}| by looking at the list of font encodings that +% are loaded by the document and providing mappings related to +% those font encodings whenever these are available. Thus at most +% only those Unicode characters that can be represented by the glyphs +% available in these encodings will be defined. +% +% Technically this is done by loading one file per encoding, +% if available, that is supposed to provide the necessary mapping +% information. +% +% +% \StopEventually{} +% +% +% +% +% \section{Coding} +% +% \subsection{Housekeeping} +% +% The usual introductory bits and pieces: +% +% \begin{macrocode} +%<utf8>\ProvidesFile{utf8.def} +%<test>\ProvidesFile{utf8-test.tex} +%<+lcy> \ProvidesFile{lcyenc.dfu} +%<+ly1> \ProvidesFile{ly1enc.dfu} +%<+oms> \ProvidesFile{omsenc.dfu} +%<+ot1> \ProvidesFile{ot1enc.dfu} +%<+ot2> \ProvidesFile{ot2enc.dfu} +%<+t1> \ProvidesFile{t1enc.dfu} +%<+t2a> \ProvidesFile{t2aenc.dfu} +%<+t2b> \ProvidesFile{t2benc.dfu} +%<+t2c> \ProvidesFile{t2cenc.dfu} +%<+ts1> \ProvidesFile{ts1enc.dfu} +%<+x2> \ProvidesFile{x2enc.dfu} +%<+all> \ProvidesFile{utf8enc.dfu} +%<-utf8-2018> [2019/07/11 v1.2j UTF-8 support for inputenc] +% \end{macrocode} +% +% \begin{macrocode} +%<*utf8> +% \end{macrocode} +% This is a temporary fix for the e-p\TeX{} / e-up\TeX{} engines that do not yet +% have a |\ifincsname| primitive. Once this is available the the extra file will +% be dropped. +% \changes{v1.2h}{2019/07/09}{Temp rollback fix for e-pTeX} +% \begin{macrocode} +\ifx\ifincsname\@undefined % old e-pTeX or e-upTeX engines + \input utf8-2018.def + \expandafter\@firstofone +\else + \expandafter\@gobble +\fi + \endinput +% \end{macrocode} +% +% \begin{macrocode} +\makeatletter +% \end{macrocode} +% We restore the |\catcode| of space (which is set to ignore in +% \texttt{inputenc}) while reading \texttt{.def} files. Otherwise +% we would need to explicitly use |\space| all over the place in +% error and log messages. +% \changes{v1.1d}{2004/05/08}{Explicitly set catcode of space} +% \begin{macrocode} +\catcode`\ \saved@space@catcode +% \end{macrocode} +% +% +% +% \subsection{Parsing UTF-8 input} +% +% A UTF-8 char (that is not actually a 7-bit char, i.e.~a single +% octet) is parsed as follows: each starting octet is an active +% \TeX{} character token; each of these is defined below to be a +% macro with one to three arguments nominally (depending on the +% starting octet). It calls one of |\UTFviii@two@octets|, +% |\UTFviii@three@octets|, or |\UTFviii@four@octets| which then +% actually picks up the remaining octets as the argument(s). +% +% \begin{itemize} +% \item When typesetting we pick up the necessary number of additional +% octets, check if they form a command that \LaTeX{} knows about +% (via \cs{csname} \texttt{u8:}\cs{string} +% \verb=#1=\cs{string} \verb=#2...=\cs{endcsname}) and if so use that +% for typesetting. \cs{string} is needed as the octets may (all?) be +% active and we want the literal values in the name. +% +% \item If the UTF-8 character is going to be part of a label, then it is +% essentially becoming part of some csname and with the +% test \cs{ifincsname} we can find this out. If so, we render the whole +% sequence off octets harmless by using \cs{string} too when the +% starting octet executes (\cs{UTF@...@octets@string}). +% +% \item Another possible case is that \cs{protect} has \emph{not} the meaning +% of \cs{typeset@protect}. In that case we may do a \cs{write} or we may do +% a \cs{protected@edef} or \ldots{} In all such cases we want to keep the +% sequence of octets unchanged, but we can't use \cs{string} this time, since at +% least in the case of \cs{protect@edef} the result may later be +% typeset after all (in fact that is quite likely) and so at that +% point the starting octet needs to be an active character again +% (the others could be stringified). So for this case we use \cs{noexpand} +% ((\cs{UTF@...s@octets@noexpand}). +% \end{itemize} +% +% \begin{macro}{\UTFviii@two@octets} +% \changes{v1.2a}{2018/03/24}{Macros made `\cs{long} for improved error messages}% +% Putting that all together the code for a start octet of a two +% byte sequence would then look like this: +% \begin{macrocode} +\long\def\UTFviii@two@octets{% + \ifincsname + \expandafter \UTF@two@octets@string + \else + \ifx \protect\@typeset@protect \else + \expandafter\expandafter\expandafter \UTF@two@octets@noexpand + \fi + \fi + \UTFviii@two@octets@combine +} +% \end{macrocode} + +% \cs{ifcsname} is tested first because that can be true even if we +% are otherwise doing typesetting. If this is the case we use +% \cs{string} on the whole octet +% sequence. \cs{UTF@two@octets@string} not only does this but also +% gets rid of the command \cs{UTFviii@two@octets@combine} in the input +% stream by picking it up as a first argument and dropping it. +% +% If this is not the case and we are doing typesetting (i.e., +% \cs{protect} is \cs{typeset@protect}), then we execute +% \cs{UTFviii@two@octets@combine} which picks up all octets and typesets +% the character (or generates an error if it doesn't know how to +% typeset it). +% +% However, if we are not doing typesetting, then we execute the +% command \cs{UTFviii@two@octets@noexpand} which works like +% \cs{UTF@two@octets@string} but uses \cs{noexpand} instead of +% \cs{string}. This way the sequence is temporay rendered harmless, +% e.g., would display as is or stays put inside a +% \cs{protected@edef}. But if the result is later reused the +% starting octet is still active and so will be able to construct +% the UTF-8 character again. +% \end{macro} +% +% +% \begin{macro}{\UTFviii@three@octets} +% \changes{v1.2a}{2018/03/24}{Macros made `\cs{long} for improved error messages}% +% \begin{macro}{\UTFviii@four@octets} +% \changes{v1.2a}{2018/03/24}{Macros made `\cs{long} for improved +% error messages} +% The definitions for the other starting octets +% are the same except that they pick up more octets after them. +% \begin{macrocode} +\long\def\UTFviii@three@octets{% + \ifincsname + \expandafter \UTF@three@octets@string + \else + \ifx \protect\@typeset@protect \else + \expandafter\expandafter\expandafter \UTF@three@octets@noexpand + \fi + \fi + \UTFviii@three@octets@combine +} +% \end{macrocode} +% \begin{macrocode} +\long\def\UTFviii@four@octets{% + \ifincsname + \expandafter \UTF@four@octets@string + \else + \ifx \protect\@typeset@protect \else + \expandafter\expandafter\expandafter \UTF@four@octets@noexpand + \fi + \fi + \UTFviii@four@octets@combine +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\UTFviii@two@octets@noexpand} +% \begin{macro}{\UTFviii@three@octets@noexpand} +% \begin{macro}{\UTFviii@four@octets@noexpand} +% These tempoarily prevent the active chars from expanding. +% \begin{macrocode} +\long\def\UTF@two@octets@noexpand#1#2{\noexpand#2\noexpand} +\long\def\UTF@three@octets@noexpand#1#2#3{\noexpand#2\noexpand#3\noexpand} +\long\def\UTF@four@octets@noexpand#1#2#3#4{\noexpand#2\noexpand#3\noexpand#4\noexpand} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} + +% \begin{macro}{\UTFviii@two@octets@string} +% \begin{macro}{\UTFviii@three@octets@string} +% \begin{macro}{\UTFviii@four@octets@string} +% And the same with \cs{string} for use in \cs{csname} constructions. +% \begin{macrocode} +\long\def\UTF@two@octets@string#1#2{\string#2\string} +\long\def\UTF@three@octets@string#1#2#3{\string#2\string#3\string} +\long\def\UTF@four@octets@string#1#2#3#4{\string#2\string#3\string#4\string} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} + + +% \begin{macro}{\UTFviii@two@octets@combine} +% \begin{macro}{\UTFviii@three@octets@combine} +% \begin{macro}{\UTFviii@four@octets@combine} +% From the arguments a control sequence with a name of the form +% \verb=u8:#1#2...= is constructed where the |#i| ($i>1$) are the +% arguments and |#1| is the starting octet (as a \TeX{} active character +% token). Since some or even all of these characters are active +% we need to use |\string| when building +% the \cs{csname}. +% +% The \cs{csname} thus constructed can of course be undefined but to +% avoid producing an unhelpful low-level undefined command error we +% pass it to |\UTFviii@defined| which is responsible for producing +% a more sensible error message (not yet done!!). If, however, it is +% defined we simply execute the thing (which should then expand to +% an encoding specific internal \LaTeX{} form). +% \begin{macrocode} +\long\def\UTFviii@two@octets@combine#1#2{\expandafter + \UTFviii@defined\csname u8:\string#1\string#2\endcsname} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\UTFviii@three@octets@combine#1#2#3{\expandafter + \UTFviii@defined\csname u8:\string#1\string#2\string#3\endcsname} +% \end{macrocode} +% +% \begin{macrocode} +\long\def\UTFviii@four@octets@combine#1#2#3#4{\expandafter + \UTFviii@defined\csname u8:\string#1\string#2\string#3\string#4\endcsname} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\UTFviii@defined} +% This tests whether its argument is different from |\relax|: it +% either calls for a sensible error message (not done), or it gets +% the |\fi| out of the way (in case the command has arguments) and +% executes it. +% \begin{macrocode} +\def\UTFviii@defined#1{% + \ifx#1\relax +% \end{macrocode} +% Test if the sequence is invalid UTF-8 or valid UTF-8 but without +% a \LaTeX\ definition. +% \begin{macrocode} + \if\relax\expandafter\UTFviii@checkseq\string#1\relax\relax +% \end{macrocode} +% The endline character has a special definition within the +% inputenc package (it is gobbling spaces). For this reason we +% can't produce multiline strings without some precaution. +% \changes{v1.1b}{2004/02/09}{No newlines allowed in error messages} +% \changes{v1.1g}{2005/09/27}{Real spaces do not show up so use \cs{space}} +% \changes{v1.1o}{2015/08/28}{Show Unicode number of character in hex} +% \changes{v1.2a}{2018/03/24}{Error message improved for non-UTF-8 sequences}% +% \begin{macrocode} + \UTFviii@undefined@err{#1}% +% \end{macrocode} +% +% \begin{macrocode} + \else + \PackageError{inputenc}{Invalid UTF-8 byte sequence}% + \UTFviii@invalid@help + \fi +% \end{macrocode} +% +% \begin{macrocode} + \else\expandafter + #1% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\UTFviii@invalid@err} +% \begin{macro}{\UTFviii@invalid@help} +% \changes{v1.2a}{2018/03/24}{Macro added}% +% \changes{v1.2f}{2018/10/05}{Show invalid byte in hex}% +% \begin{macrocode} +\def\UTFviii@invalid@err#1{% + \PackageError{inputenc}{Invalid UTF-8 byte "\UTFviii@hexnumber{`#1}}% + \UTFviii@invalid@help} +% \end{macrocode} +% +% \begin{macrocode} +\def\UTFviii@invalid@help{% + The document does not appear to be in UTF-8 encoding.\MessageBreak + Try adding \noexpand\UseRawInputEncoding as the first line of the file\MessageBreak + or specify an encoding such as \noexpand\usepackage[latin1]{inputenc}\MessageBreak + in the document preamble.\MessageBreak + Alternatively, save the file in UTF-8 using your editor or another tool} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\UTFviii@undefined@err} +% \changes{v1.2a}{2018/03/24}{Macro added}% +% \begin{macrocode} +\def\UTFviii@undefined@err#1{% + \PackageError{inputenc}{Unicode character \expandafter + \UTFviii@splitcsname\string#1\relax + \MessageBreak + not set up for use with LaTeX}% + {You may provide a definition with\MessageBreak + \noexpand\DeclareUnicodeCharacter}% + } +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\UTFviii@checkseq} +% \begin{macro}{\UTFviii@check@continue} +% \changes{v1.2a}{2018/03/24}{Macro added}% +% Check that the csname consists of a valid UTF-8 sequence. +% \begin{macrocode} +\def\UTFviii@checkseq#1:#2#3{% + \ifnum`#2<"80 % + \ifx\relax#3\else1\fi + \else + \ifnum`#2<"C0 % + 1 % + \else + \expandafter\expandafter\expandafter\UTFviii@check@continue + \expandafter\expandafter\expandafter#3% + \fi + \fi} +% \end{macrocode} +% +% \begin{macrocode} +\def\UTFviii@check@continue#1{% + \ifx\relax#1% + \else + \ifnum`#1<"80 1\else\ifnum`#1>"BF 1\fi\fi + \expandafter\UTFviii@check@continue + \fi +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% +% \begin{macro}{\UTFviii@loop} +% This bit of code derived from \texttt{xmltex} defines the active character +% correspnding to starting octets to call |\UTFviii@two@octets| etc as appropriate. +% The starting octet itself is passed directly as the first argument, the others +% are picked up later en route. +% +% The |\UTFviii@loop| loops through the numbers starting at +% |\count@| and ending at |\@tempcnta|${} - 1$, each time executing +% the code in |\UTFviii@tmp|. +% +% All this is done in a group so that temporary catcode changes +% etc.~vanish after everything is set up. +% +% \begin{macrocode} +\begingroup +\catcode`\~13 +\catcode`\"12 +% \end{macrocode} +% +% \begin{macrocode} +\def\UTFviii@loop{% + \uccode`\~\count@ + \uppercase\expandafter{\UTFviii@tmp}% + \advance\count@\@ne + \ifnum\count@<\@tempcnta + \expandafter\UTFviii@loop + \fi} +% \end{macrocode} +% +% Handle the single byte control characters. +% \changes{v1.2a}{2018/03/24}{Loop over C0 controls added}% +% C0 controls are valid UTF-8 but defined to give the ``Character not defined error'' +% They may be defined with |\DeclareUnicodeCharacter|. +% \begin{macrocode} + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@undefined@err{:\string~}}} +% 0 ^^@ null + \count@"1 + \@tempcnta9 +% 9 ^^I tab +% 10 ^^J nl +\UTFviii@loop + \count@11 + \@tempcnta12 +\UTFviii@loop +% 12 ^^L +% 13 ^^M + \count@14 + \@tempcnta32 +\UTFviii@loop +% \end{macrocode} +% +% +% Bytes with leading bits |10| are not valid UTF-8 starting bytes +% \begin{macrocode} + \count@"80 + \@tempcnta"C2 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}} +\UTFviii@loop +% \end{macrocode} +% +% Setting up 2-byte UTF-8: The starting bytes is passed as an +% active character so that it can be reprocessed later! +% \begin{macrocode} + \count@"C2 + \@tempcnta"E0 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@two@octets\noexpand~}} +\UTFviii@loop +% \end{macrocode} +% +% Setting up 3-byte UTF-8: +% \begin{macrocode} + \count@"E0 + \@tempcnta"F0 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@three@octets\noexpand~}} +\UTFviii@loop +% \end{macrocode} +% +% Setting up 4-byte UTF-8: +% \changes{v1.2e}{2018/09/28}{Fix "F4 lead byte}% +% \begin{macrocode} + \count@"F0 + \@tempcnta"F5 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@four@octets\noexpand~}} +\UTFviii@loop +% \end{macrocode} +% +% Bytes above F4 are not valid UTF-8 starting bytes as they would encode numbers beyond +% the Unicode range +% \begin{macrocode} + \count@"F5 + \@tempcnta"100 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}} +\UTFviii@loop +% \end{macrocode} +% +% \begin{macrocode} +\endgroup +% \end{macrocode} +% +% \end{macro} +% +% For this case we must disable the warning generated by +% \texttt{inputenc} if it doesn't see any new |\DeclareInputText| +% commands. +% \begin{macrocode} +\@inpenc@test +% \end{macrocode} +% +% +% If this file (\texttt{utf8.def}) is not being read while setting +% up \texttt{inputenc}, i.e.~in the preamble, but when +% |\inputencoding| is called somewhere within the document, we do not +% need to input the specific Unicode mappings again. We therefore +% stop reading the file at this point. +% \begin{macrocode} +\ifx\@begindocumenthook\@undefined + \makeatother +% \end{macrocode} +% The |\fi| must be on the same line as |\endinput| or else it will +% never be seen! +% \begin{macrocode} + \endinput \fi +% \end{macrocode} +% +% +% \subsection{Mapping Unicode codes to \LaTeX{} internal forms} +% +% +% \begin{macro}{\DeclareUnicodeCharacter} +% The |\DeclareUnicodeCharacter| declaration defines a mapping from +% a Unicode character code point to a \LaTeX{} internal form. The first +% argument is the Unicode number as hexadecimal digits and the second is +% the actual \LaTeX{} internal form. +% +% We start by making sure that some characters have the right +% |\catcode| when they are used in the definitions below. +% \begin{macrocode} +\begingroup +\catcode`\"=12 +\catcode`\<=12 +\catcode`\.=12 +\catcode`\,=12 +\catcode`\;=12 +\catcode`\!=12 +\catcode`\~=13 +% \end{macrocode} +% +% \begin{macrocode} +\gdef\DeclareUnicodeCharacter#1#2{% + \count@"#1\relax + \wlog{ \space\space defining Unicode char U+#1 (decimal \the\count@)}% + \begingroup +% \end{macrocode} +% Next we do the parsing of the number stored in |\count@| and assign the +% result to |\UTFviii@tmp|. Actually all this could be done in-line, +% the macro |\parse@XML@charref| is only there to extend this code +% to parsing Unicode numbers in other contexts one day (perhaps). +% \begin{macrocode} + \parse@XML@charref +% \end{macrocode} +% +% Here is an example of what is happening, for the pair \texttt{"C2 "A3} +% (which is the utf8 represenation for the character \textsterling{}). +% After |\parse@XML@charref| we have, stored in |\UTFviii@tmp|, a +% single command with two character tokens as arguments: +% \begin{quote} +% [$t_{C2}$ and $t_{A3}$ are the characters corresponding to these +% two octets]\\ +% |\UTFviii@two@octets| $t_{\rm C2}t_{\rm A3}$ +% \end{quote} +% what we actually need to produce is a definition of the form +% \begin{quote} +% |\def\u8:|$t_{\rm C2}$$t_{\rm A3}$ |{|\textit{\LaTeX{} internal form}|}|\,. +% \end{quote} +% So here we temporarily redefine the prefix commands +% |\UTFviii@two@octets|, etc.~to +% generate the csname that we wish to define> the |\string|s are +% added in case these tokens are still active. +% \begin{macrocode} + \def\UTFviii@two@octets##1##2{\csname u8:##1\string##2\endcsname}% + \def\UTFviii@three@octets##1##2##3{\csname u8:##1% + \string##2\string##3\endcsname}% + \def\UTFviii@four@octets##1##2##3##4{\csname u8:##1% + \string##2\string##3\string##4\endcsname}% +% \end{macrocode} +% Now we simply:-) need to use the right number of |\expandafter|s to +% finally construct the definition: expanding |\UTFviii@tmp| once to get +% its contents, a second time to replace the prefix command by its +% |\csname| expansion, and a third time to turn the expansion into +% a csname after which the |\gdef| finally gets applied. +% We add an irrelevant |\IeC| and braces around the definition, in +% order to avoid any space after the command being gobbled up +% when the text is written out to an auxiliary file (see +% \texttt{inputenc} for further details +% \begin{macrocode} + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \expandafter + \gdef\UTFviii@tmp{\IeC{#2}}% + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\parse@XML@charref} +% This macro parses a Unicode number (decimal) and returns its +% UTF-8 representation as a sequence of non-active \TeX{} character +% tokens. In the +% original code it had two arguments delimited by \texttt{;} here, +% however, we supply the Unicode number implicitly. +% \begin{macrocode} +\gdef\parse@XML@charref{% +% \end{macrocode} +% We need to keep a few things local, mainly the |\uccode|'s that +% are set up below. However, the group originally used here is +% actually unnecessary since we call this macro only within another +% group; but it will be important to restore the group if this +% macro gets used for other purposes. +% \begin{macrocode} +% \begingroup +% \end{macrocode} +% The original code from \texttt{xmltex} supported the convention that a +% Unicode slot number could be given either as a decimal or as a +% hexadecimal (by starting with \texttt{x}). We do not do this so +% this code is also removed. This could be reactivated if one +% wants to support document commands that accept Unicode numbers +% (but then the first case needs to be changed from an error +% message back to something more useful again). +% \begin{macrocode} +% \uppercase{\count@\if x\noexpand#1"\else#1\fi#2}\relax +% \end{macrocode} +% As |\count@| already contains the right value we make +% |\parse@XML@charref| work without arguments. +% \changes{v1.1g}{2005/09/27}{Real spaces do not show up so use \cs{space}} +% \changes{v1.2a}{2018/03/24}{Allow control characters if active} +% In the case single byte UTF-8 sequences, only allow definition if +% the character os already active. The definition of |\UTFviii@tmp| +% looks slightly strange but is designed for the sequence of |\expandafter| +% in |\DeclareUnicodeCharacter|. +% +% \begin{macrocode} + \ifnum\count@<"A0\relax + \ifnum\catcode\count@=13 + \uccode`\~=\count@\uppercase{\def\UTFviii@tmp{\@empty\@empty~}}% + \else + \PackageError{inputenc}% + {Cannot define non-active Unicode char value < 00A0}% + \@eha + \def\UTFviii@tmp{\UTFviii@tmp}% + \fi +% \end{macrocode} +% The code below is derived from \texttt{xmltex} and generates the UTF-8 byte sequence +% for the number in |\count@|. +% +% The reverse operation (just used in error messages) +% has now been added as \cs{decode@UTFviii}. +% \begin{macrocode} + \else\ifnum\count@<"800\relax + \parse@UTFviii@a,% + \parse@UTFviii@b C\UTFviii@two@octets.,% + \else\ifnum\count@<"10000\relax + \parse@UTFviii@a;% + \parse@UTFviii@a,% + \parse@UTFviii@b E\UTFviii@three@octets.{,;}% + \else +% \end{macrocode} +% +% Test added here for out of range values, the 4-octet definitions are still set up +% so that |\DeclareUnicodeCharacter| does something sensible if the user scrolls +% past this error. +% \begin{macrocode} + \ifnum\count@>"10FFFF\relax + \PackageError{inputenc}% + {\UTFviii@hexnumber\count@\space too large for Unicode}% + {Values between 0 and 10FFFF are permitted}% + \fi +% \end{macrocode} +% +% \begin{macrocode} + \parse@UTFviii@a;% + \parse@UTFviii@a,% + \parse@UTFviii@a!% + \parse@UTFviii@b F\UTFviii@four@octets.{!,;}% + \fi + \fi + \fi +% \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parse@UTFviii@a} +% \ldots so somebody else can document this part :-) +% \changes{v1.1b}{2004/02/09}{Space in the wrong place \cs{count @64}} +% \begin{macrocode} +\gdef\parse@UTFviii@a#1{% + \@tempcnta\count@ + \divide\count@ 64 + \@tempcntb\count@ + \multiply\count@ 64 + \advance\@tempcnta-\count@ + \advance\@tempcnta 128 + \uccode`#1\@tempcnta + \count@\@tempcntb} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\parse@UTFviii@b} +% \ldots same here +% \begin{macrocode} +\gdef\parse@UTFviii@b#1#2#3#4{% + \advance\count@ "#10\relax + \uccode`#3\count@ + \uppercase{\gdef\UTFviii@tmp{#2#3#4}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\decode@UTFviii} +% \changes{v1.1o}{2015/08/28}{Macro added} +% In the reverse direction, take a sequence of octects(bytes) +% representing a character in UTF-8 and construct the Unicode number. +% The sequence is terminated by |\relax|. +% +% In this version, if the sequence is not valid UTF-8 you probably +% get a low level arithmetic error from |\numexpr| or stray characters +% at the end. Getting a better error message would be somewhat expensive. +% As the main use is for reporting characters in messages, this is done +% just using expansion, so |\numexpr| is used, A stub returning 0 is defined +% if |\numexpr| is not available. +% \begin{macrocode} +\ifx\numexpr\@undefined +% \end{macrocode} +% +% \begin{macrocode} +\gdef\decode@UTFviii#1{0} +% \end{macrocode} +% +% \begin{macrocode} +\else +% \end{macrocode} +% +% If the input is malformed UTF-8 there may not be enough closing ) so +% add 5 so there are always some remaining then cleanup and remove +% any remaining ones at the end. This avoids |\numexpr| parse errors +% while outputting a package error. +% \begin{macrocode} +\gdef\decode@UTFviii#1\relax{% + \expandafter\UTFviii@cleanup + \the\numexpr\dec@de@UTFviii#1\relax)))))\@empty} +% \end{macrocode} +% +% \begin{macrocode} +\gdef\UTFviii@cleanup#1)#2\@empty{#1} +% \end{macrocode} +% +% \begin{macrocode} +\gdef\dec@de@UTFviii#1{% +\ifx\relax#1% +\else + \ifnum`#1>"EF + ((((`#1-"F0)% + \else + \ifnum`#1>"DF + (((`#1-"E0)% + \else + \ifnum`#1>"BF + ((`#1-"C0)% + \else + \ifnum`#1>"7F + )*64+(`#1-"80)% + \else + +`#1 % + \fi + \fi + \fi + \fi + \expandafter\dec@de@UTFviii +\fi} +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\UTFviii@hexnumber} +% \changes{v1.1o}{2015/08/28}{Macro added} +% Convert a number to a sequence of uppercase hex digits. +% If |\numexpr| is not available, it returns its argument unchanged. +% \begin{macrocode} +\ifx\numexpr\@undefined +% \end{macrocode} +% \begin{macrocode} +\global\let\UTFviii@hexnumber\@firstofone +\global\UTFviii@hexdigit\hexnumber@ +% \end{macrocode} +% \begin{macrocode} +\else +% \end{macrocode} +% \begin{macrocode} +\gdef\UTFviii@hexnumber#1{% +\ifnum#1>15 % +\expandafter\UTFviii@hexnumber\expandafter{\the\numexpr(#1-8)/16\relax}% +\fi +\UTFviii@hexdigit{\numexpr#1\ifnum#1>0-((#1-8)/16)*16\fi\relax}% +} +% \end{macrocode} +% +% Almost but not quite |\hexnumber@|. +% \begin{macrocode} +\gdef\UTFviii@hexdigit#1{\ifcase\numexpr#1\relax + 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or + A\or B\or C\or D\or E\or F\fi} +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\UTFviii@splitcsname} +% \changes{v1.1o}{2015/08/28}{Macro added} +% \begin{macro}{\UTFviii@hexcodepoint} +% \changes{v1.2e}{2018/09/28}{Macro added: Format codepoint properly} +% Split a csname representing a unicode character and return +% the character and the unicode number in hex. +% \begin{macrocode} +\gdef\UTFviii@hexcodepoint#1{U+% + \ifnum#1<16 0\fi + \ifnum#1<256 0\fi + \ifnum#1<4096 0\fi + \UTFviii@hexnumber{#1}% +}% +\gdef\UTFviii@splitcsname#1:#2\relax{% +% \end{macrocode} +% \changes{v1.2b}{2018/03/26}{add percent as \cs{endlinechar} not -1 in the format}% +% Need to pre-expand the argument to ensure cleanup in case of mal-formed UTF-8. +% \begin{macrocode} +#2 (\expandafter\UTFviii@hexcodepoint\expandafter{% + \the\numexpr\decode@UTFviii#2\relax})% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +\endgroup +% \end{macrocode} +% +% \begin{macrocode} +\@onlypreamble\DeclareUnicodeCharacter +% \end{macrocode} +% These are preamble only as long as we don't support Unicode +% charrefs in documents. +% \begin{macrocode} +\@onlypreamble\parse@XML@charref +\@onlypreamble\parse@UTFviii@a +\@onlypreamble\parse@UTFviii@b +% \end{macrocode} +% +% +% \subsection{Loading Unicode mappings at begin document} +% +% The original plan was to set up the UTF-8 support at +% |\begin{document}|; but then any text characters used in the preamble +% (as people do even though advised against it) would fail in one way or +% the other. +% So the implementation was changed and the Unicode definition files +% for already defined encodings are loaded here. +% +% We loop through all defined font encodings +% (stored in |\cdp@list|) and for each load a file +% \textit{name}\texttt{enc.dfu} if it exist. That file is then +% supposed to contain |\DeclareUnicodeCharacter| declarations. +% \begin{macrocode} +\begingroup + \def\cdp@elt#1#2#3#4{% + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font % + encoding #1}% +% \end{macrocode} +% \changes{v1.1m}{2008/04/05}{Ensure we don't lose spaces in the log} +% The previous line is written to the log with the newline char being +% ignored (thus not producing a space). Therefore either everything has to +% be on a single input line or some special care must be taken. From this +% point on we ignore spaces again, i.e., while we are reading the +% \texttt{.dfu} file. The |\endgroup| below will restore it again. +% \changes{v1.1d}{2004/05/08}{Explicitly set catcode of space} +% \changes{v1.1g}{2005/09/27}{We lost the ``false'' case} +% \begin{macrocode} + \catcode`\ 9\relax}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% + } + \cdp@list +\endgroup +% \end{macrocode} +% However, we don't know if there are font encodings still to be +% loaded (either with \texttt{fontenc} or directly with |\input| by +% some some package). Font encoding files are loaded only if the +% corresponding encoding has not been loaded yet, and they always +% begin with |\DeclareFontEncoding|. We now redefine the internal +% kernel version of the latter to load the Unicode file if available. +% +% \begin{macrocode} +\def\DeclareFontEncoding@#1#2#3{% + \expandafter + \ifx\csname T@#1\endcsname\relax + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@family}{\default@series}% + {\default@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@cmd + \begingroup + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font % + encoding #1}}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% + \endgroup + \else + \@font@info{Redeclaring font encoding #1}% + \fi + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@M#3}% + \xdef\LastDeclaredEncoding{#1}% + } +%</utf8> +% \end{macrocode} +% +% +% +% \section{Mapping characters ---\newline based on font (glyph) encodings} +% +% This section is a first attempt to provide Unicode definitions for +% characters whose standard glyphs are currently provided by the +% standard \LaTeX{} font-encodings |T1|, |OT1|, etc. They are by +% no means completed and need checking. +% +% For example, one should check the already existing input encodings +% for glyphs that may in fact be available and required, +% e.g.~\texttt{latin4} has a number of glyphs with the |\=| +% accent. Since the |T1| encoding does not provide such glyphs, +% these characters are not listed below (yet). +% +% The list below was generated by looking at the current \LaTeX{} font +% encoding files, e.g., \texttt{t1enc.def} and using the work by +% Sebastian Rahtz (in \texttt{ucharacters.sty}) with a few +% modifications. In combinations such as |\^\i| the preferred form +% is that and not |\^i|. +% +% This list has been built from several sources, obviously including +% the Unicode Standard itself. These sources include Passive \TeX{} by +% Sebastian Rahtz, the \texttt{unicode} +% package by Dominique P. G. Unruh (mainly for Latin encodings) and +% \texttt{text4ht} by Eitan Gurari (for Cyrillic ones). +% +% Note that it strictly follows the Mittelbach principles for +% input character encodings: thus it offers no support for using utf8 +% representations of math symbols such as $\times$ or $\div$ (in math mode). +% +% +% \subsection{About the table itself} +% +% In addition to generating individual files, the table below is, at present, +% a one-one (we think) partial relationship between the (ill-defined) set +% of LICRs and the Unicode slots "0080 to "FFFF. At present these entries +% are used only to define a collection of partial mappings from Unicode +% slots to LICRs; each of these mappings becomes full if we add an exception +% value (`not defined') to the set of LICRs. +% +% It is probably not essential for the relationship in the full table to be +% one-one; this raises questions such as: the exact role of LICRs; +% the formal relationships on the set of LICRs; the (non-mathematical) +% relationship between +% LICRs and Unicode (which has its own somewhat fuzzy equivalences); +% and ultimately what a character is and what a character representation +% and/or name is. +% +% It is unclear the extent to which entries in this table should +% resemble the closely related ones in the 8-bit \texttt{inputenc} files. +% The Unicode standard claims that the first 256 slots `are' ASCII and +% Latin-1. +% +% Of course, \TeX{} itself typically does not treat even many perfectly +% `normal text' 7-bit slots as text characters, so it is unclear +% whether \LaTeX{} should even attempt to deal in any consistent way with +% those Unicode slots that are not definitive text characters. +% +% +% \subsection{The mapping table} +% +% \begingroup +% \hfuzz=12pt ^^A just because +% +% Note that the first argument must be a hex-digit number greater +% than \texttt{00BF} and at most \texttt{10FFFF}. +% +% There are few notes about inconsistencies etc at the end of the table. +% +% \changes{v1.1o}{2015/08/28}{Add U+00A0 and U+00AD} +% \changes{v1.1q}{2015/12/02}{Add remaining latin uses of accents in T1} +% \changes{v1.1r}{2015/12/03}{Add some more ogoneck cases} +% \changes{v1.1s}{2016/01/11}{Add some more caron and acute} +% \changes{v1.1t}{2017/01/28}{Add caron cominations for GgYy} +% \begin{macrocode} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00A0}{\nobreakspace} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00A1}{\textexclamdown} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00A2}{\textcent} +%<all,ts1,t1,ot1,ly1>\DeclareUnicodeCharacter{00A3}{\textsterling} +%<all,x2,ts1,t2c,t2b,t2a,ly1,lcy>\DeclareUnicodeCharacter{00A4}{\textcurrency} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00A5}{\textyen} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00A6}{\textbrokenbar} +%<all,x2,ts1,t2c,t2b,t2a,oms,ly1>\DeclareUnicodeCharacter{00A7}{\textsection} +%<all,ts1>\DeclareUnicodeCharacter{00A8}{\textasciidieresis} +%<all,ts1,utf8>\DeclareUnicodeCharacter{00A9}{\textcopyright} +%<all,ts1,ly1,utf8>\DeclareUnicodeCharacter{00AA}{\textordfeminine} +%<*all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy> +\DeclareUnicodeCharacter{00AB}{\guillemotleft} +%</all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy> +%<all,ts1>\DeclareUnicodeCharacter{00AC}{\textlnot} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00AD}{\-} +%<all,ts1,ly1,utf8>\DeclareUnicodeCharacter{00AE}{\textregistered} +%<all,ts1>\DeclareUnicodeCharacter{00AF}{\textasciimacron} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00B0}{\textdegree} +%<all,ts1>\DeclareUnicodeCharacter{00B1}{\textpm} +%<all,ts1>\DeclareUnicodeCharacter{00B2}{\texttwosuperior} +%<all,ts1>\DeclareUnicodeCharacter{00B3}{\textthreesuperior} +%<all,ts1>\DeclareUnicodeCharacter{00B4}{\textasciiacute} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00B5}{\textmu} % micro sign +%<all,ts1,oms,ly1>\DeclareUnicodeCharacter{00B6}{\textparagraph} +%<all,oms,ts1,ly1>\DeclareUnicodeCharacter{00B7}{\textperiodcentered} +%<all,ot1>\DeclareUnicodeCharacter{00B8}{\c\ } +%<all,ts1>\DeclareUnicodeCharacter{00B9}{\textonesuperior} +%<all,ts1,ly1,utf8>\DeclareUnicodeCharacter{00BA}{\textordmasculine} +%<*all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy> +\DeclareUnicodeCharacter{00BB}{\guillemotright} +%</all,x2,t2c,t2b,t2a,t1,ot2,ly1,lcy> +%<all,ts1,ly1>\DeclareUnicodeCharacter{00BC}{\textonequarter} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00BD}{\textonehalf} +%<all,ts1,ly1>\DeclareUnicodeCharacter{00BE}{\textthreequarters} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00BF}{\textquestiondown} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C0}{\@tabacckludge`A} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C1}{\@tabacckludge'A} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C2}{\^A} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C3}{\~A} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C4}{\"A} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00C5}{\r A} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{00C6}{\AE} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C7}{\c C} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C8}{\@tabacckludge`E} +%<all,t1,ly1>\DeclareUnicodeCharacter{00C9}{\@tabacckludge'E} +%<all,t1,ly1>\DeclareUnicodeCharacter{00CA}{\^E} +%<all,t1,ly1>\DeclareUnicodeCharacter{00CB}{\"E} +%<all,t1,ly1>\DeclareUnicodeCharacter{00CC}{\@tabacckludge`I} +%<all,t1,ly1>\DeclareUnicodeCharacter{00CD}{\@tabacckludge'I} +%<all,t1,ly1>\DeclareUnicodeCharacter{00CE}{\^I} +%<all,t1,ly1>\DeclareUnicodeCharacter{00CF}{\"I} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D0}{\DH} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D1}{\~N} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D2}{\@tabacckludge`O} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D3}{\@tabacckludge'O} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D4}{\^O} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D5}{\~O} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D6}{\"O} +%<all,ts1>\DeclareUnicodeCharacter{00D7}{\texttimes} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{00D8}{\O} +%<all,t1,ly1>\DeclareUnicodeCharacter{00D9}{\@tabacckludge`U} +%<all,t1,ly1>\DeclareUnicodeCharacter{00DA}{\@tabacckludge'U} +%<all,t1,ly1>\DeclareUnicodeCharacter{00DB}{\^U} +%<all,t1,ly1>\DeclareUnicodeCharacter{00DC}{\"U} +%<all,t1,ly1>\DeclareUnicodeCharacter{00DD}{\@tabacckludge'Y} +%<all,t1,ly1>\DeclareUnicodeCharacter{00DE}{\TH} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{00DF}{\ss} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E0}{\@tabacckludge`a} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E1}{\@tabacckludge'a} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E2}{\^a} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E3}{\~a} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E4}{\"a} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E5}{\r a} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{00E6}{\ae} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E7}{\c c} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E8}{\@tabacckludge`e} +%<all,t1,ly1>\DeclareUnicodeCharacter{00E9}{\@tabacckludge'e} +%<all,t1,ly1>\DeclareUnicodeCharacter{00EA}{\^e} +%<all,t1,ly1>\DeclareUnicodeCharacter{00EB}{\"e} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00EC}{\@tabacckludge`\i} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00ED}{\@tabacckludge'\i} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00EE}{\^\i} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{00EF}{\"\i} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F0}{\dh} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F1}{\~n} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F2}{\@tabacckludge`o} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F3}{\@tabacckludge'o} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F4}{\^o} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F5}{\~o} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F6}{\"o} +%<all,ts1>\DeclareUnicodeCharacter{00F7}{\textdiv} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{00F8}{\o} +%<all,t1,ly1>\DeclareUnicodeCharacter{00F9}{\@tabacckludge`u} +%<all,t1,ly1>\DeclareUnicodeCharacter{00FA}{\@tabacckludge'u} +%<all,t1,ly1>\DeclareUnicodeCharacter{00FB}{\^u} +%<all,t1,ly1>\DeclareUnicodeCharacter{00FC}{\"u} +%<all,t1,ly1>\DeclareUnicodeCharacter{00FD}{\@tabacckludge'y} +%<all,t1,ly1>\DeclareUnicodeCharacter{00FE}{\th} +%<all,t1,ly1>\DeclareUnicodeCharacter{00FF}{\"y} +%<all,t1>\DeclareUnicodeCharacter{0100}{\@tabacckludge=A} +%<all,t1>\DeclareUnicodeCharacter{0101}{\@tabacckludge=a} +%<all,t1>\DeclareUnicodeCharacter{0102}{\u A} +%<all,t1>\DeclareUnicodeCharacter{0103}{\u a} +%<all,t1>\DeclareUnicodeCharacter{0104}{\k A} +%<all,t1>\DeclareUnicodeCharacter{0105}{\k a} +%<all,t1>\DeclareUnicodeCharacter{0106}{\@tabacckludge'C} +%<all,t1>\DeclareUnicodeCharacter{0107}{\@tabacckludge'c} +%<all,t1>\DeclareUnicodeCharacter{0108}{\^C} +%<all,t1>\DeclareUnicodeCharacter{0109}{\^c} +%<all,t1>\DeclareUnicodeCharacter{010A}{\.C} +%<all,t1>\DeclareUnicodeCharacter{010B}{\.c} +%<all,t1>\DeclareUnicodeCharacter{010C}{\v C} +%<all,t1>\DeclareUnicodeCharacter{010D}{\v c} +%<all,t1>\DeclareUnicodeCharacter{010E}{\v D} +%<all,t1>\DeclareUnicodeCharacter{010F}{\v d} +%<all,t1>\DeclareUnicodeCharacter{0110}{\DJ} +%<all,t1>\DeclareUnicodeCharacter{0111}{\dj} +%<all,t1>\DeclareUnicodeCharacter{0112}{\@tabacckludge=E} +%<all,t1>\DeclareUnicodeCharacter{0113}{\@tabacckludge=e} +%<all,t1>\DeclareUnicodeCharacter{0114}{\u E} +%<all,t1>\DeclareUnicodeCharacter{0115}{\u e} +%<all,t1>\DeclareUnicodeCharacter{0116}{\.E} +%<all,t1>\DeclareUnicodeCharacter{0117}{\.e} +%<all,t1>\DeclareUnicodeCharacter{0118}{\k E} +%<all,t1>\DeclareUnicodeCharacter{0119}{\k e} +%<all,t1>\DeclareUnicodeCharacter{011A}{\v E} +%<all,t1>\DeclareUnicodeCharacter{011B}{\v e} +%<all,t1>\DeclareUnicodeCharacter{011C}{\^G} +%<all,t1>\DeclareUnicodeCharacter{011D}{\^g} +%<all,t1>\DeclareUnicodeCharacter{011E}{\u G} +%<all,t1>\DeclareUnicodeCharacter{011F}{\u g} +%<all,t1>\DeclareUnicodeCharacter{0120}{\.G} +%<all,t1>\DeclareUnicodeCharacter{0121}{\.g} +%<all,t1>\DeclareUnicodeCharacter{0122}{\c G} +%<all,t1>\DeclareUnicodeCharacter{0123}{\c g} +%<all,t1>\DeclareUnicodeCharacter{0124}{\^H} +%<all,t1>\DeclareUnicodeCharacter{0125}{\^h} +%<all,t1>\DeclareUnicodeCharacter{0128}{\~I} +%<all,t1>\DeclareUnicodeCharacter{0129}{\~\i} +%<all,t1>\DeclareUnicodeCharacter{012A}{\@tabacckludge=I} +%<all,t1>\DeclareUnicodeCharacter{012B}{\@tabacckludge=\i} +%<all,t1>\DeclareUnicodeCharacter{012C}{\u I} +%<all,t1>\DeclareUnicodeCharacter{012D}{\u\i} +%<all,t1>\DeclareUnicodeCharacter{012E}{\k I} +% \end{macrocode} +% \changes{v1.2g}{2019/02/06}{Corrected 012F (github/122)} +% \begin{macrocode} +%<all,t1>\DeclareUnicodeCharacter{012F}{\k i} +%<all,t1>\DeclareUnicodeCharacter{0130}{\.I} +%<all,t2c,t2b,t2a,t1,ot2,ot1,ly1,lcy>\DeclareUnicodeCharacter{0131}{\i} +%<all,t1>\DeclareUnicodeCharacter{0132}{\IJ} +%<all,t1>\DeclareUnicodeCharacter{0133}{\ij} +%<all,t1>\DeclareUnicodeCharacter{0134}{\^J} +%<all,t1>\DeclareUnicodeCharacter{0135}{\^\j} +%<all,t1>\DeclareUnicodeCharacter{0136}{\c K} +%<all,t1>\DeclareUnicodeCharacter{0137}{\c k} +%<all,t1>\DeclareUnicodeCharacter{0139}{\@tabacckludge'L} +%<all,t1>\DeclareUnicodeCharacter{013A}{\@tabacckludge'l} +%<all,t1>\DeclareUnicodeCharacter{013B}{\c L} +%<all,t1>\DeclareUnicodeCharacter{013C}{\c l} +%<all,t1>\DeclareUnicodeCharacter{013D}{\v L} +%<all,t1>\DeclareUnicodeCharacter{013E}{\v l} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0141}{\L} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0142}{\l} +%<all,t1>\DeclareUnicodeCharacter{0143}{\@tabacckludge'N} +%<all,t1>\DeclareUnicodeCharacter{0144}{\@tabacckludge'n} +%<all,t1>\DeclareUnicodeCharacter{0145}{\c N} +%<all,t1>\DeclareUnicodeCharacter{0146}{\c n} +%<all,t1>\DeclareUnicodeCharacter{0147}{\v N} +%<all,t1>\DeclareUnicodeCharacter{0148}{\v n} +%<all,t1>\DeclareUnicodeCharacter{014A}{\NG} +%<all,t1>\DeclareUnicodeCharacter{014B}{\ng} +%<all,t1>\DeclareUnicodeCharacter{014C}{\@tabacckludge=O} +%<all,t1>\DeclareUnicodeCharacter{014D}{\@tabacckludge=o} +%<all,t1>\DeclareUnicodeCharacter{014E}{\u O} +%<all,t1>\DeclareUnicodeCharacter{014F}{\u o} +%<all,t1>\DeclareUnicodeCharacter{0150}{\H O} +%<all,t1>\DeclareUnicodeCharacter{0151}{\H o} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{0152}{\OE} +%<all,t1,ot1,ly1,lcy>\DeclareUnicodeCharacter{0153}{\oe} +%<all,t1>\DeclareUnicodeCharacter{0154}{\@tabacckludge'R} +%<all,t1>\DeclareUnicodeCharacter{0155}{\@tabacckludge'r} +%<all,t1>\DeclareUnicodeCharacter{0156}{\c R} +%<all,t1>\DeclareUnicodeCharacter{0157}{\c r} +%<all,t1>\DeclareUnicodeCharacter{0158}{\v R} +%<all,t1>\DeclareUnicodeCharacter{0159}{\v r} +%<all,t1>\DeclareUnicodeCharacter{015A}{\@tabacckludge'S} +%<all,t1>\DeclareUnicodeCharacter{015B}{\@tabacckludge's} +%<all,t1>\DeclareUnicodeCharacter{015C}{\^S} +%<all,t1>\DeclareUnicodeCharacter{015D}{\^s} +%<all,t1>\DeclareUnicodeCharacter{015E}{\c S} +%<all,t1>\DeclareUnicodeCharacter{015F}{\c s} +%<all,t1,ly1>\DeclareUnicodeCharacter{0160}{\v S} +%<all,t1,ly1>\DeclareUnicodeCharacter{0161}{\v s} +%<all,t1>\DeclareUnicodeCharacter{0162}{\c T} +%<all,t1>\DeclareUnicodeCharacter{0163}{\c t} +%<all,t1>\DeclareUnicodeCharacter{0164}{\v T} +%<all,t1>\DeclareUnicodeCharacter{0165}{\v t} +%<all,t1>\DeclareUnicodeCharacter{0168}{\~U} +%<all,t1>\DeclareUnicodeCharacter{0169}{\~u} +%<all,t1>\DeclareUnicodeCharacter{016A}{\@tabacckludge=U} +%<all,t1>\DeclareUnicodeCharacter{016B}{\@tabacckludge=u} +%<all,t1>\DeclareUnicodeCharacter{016C}{\u U} +%<all,t1>\DeclareUnicodeCharacter{016D}{\u u} +%<all,t1>\DeclareUnicodeCharacter{016E}{\r U} +%<all,t1>\DeclareUnicodeCharacter{016F}{\r u} +%<all,t1>\DeclareUnicodeCharacter{0170}{\H U} +%<all,t1>\DeclareUnicodeCharacter{0171}{\H u} +%<all,t1>\DeclareUnicodeCharacter{0172}{\k U} +%<all,t1>\DeclareUnicodeCharacter{0173}{\k u} +% \end{macrocode} +% +% \changes{v1.1p}{2015/09/07}{Welsh circumflex combinations} +% \begin{macrocode} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0174}{\^W} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0175}{\^w} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0176}{\^Y} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0177}{\^y} +%<all,t1,ly1>\DeclareUnicodeCharacter{0178}{\"Y} +%<all,t1>\DeclareUnicodeCharacter{0179}{\@tabacckludge'Z} +%<all,t1>\DeclareUnicodeCharacter{017A}{\@tabacckludge'z} +%<all,t1>\DeclareUnicodeCharacter{017B}{\.Z} +%<all,t1>\DeclareUnicodeCharacter{017C}{\.z} +%<all,t1,ly1>\DeclareUnicodeCharacter{017D}{\v Z} +%<all,t1,ly1>\DeclareUnicodeCharacter{017E}{\v z} +%<all,ts1,ly1>\DeclareUnicodeCharacter{0192}{\textflorin} +% \end{macrocode} +% \changes{v1.1s}{2016/01/11}{add 01CD-01F4} +% \begin{macrocode} +%<all,t1>\DeclareUnicodeCharacter{01CD}{\v A} +%<all,t1>\DeclareUnicodeCharacter{01CE}{\v a} +%<all,t1>\DeclareUnicodeCharacter{01CF}{\v I} +%<all,t1>\DeclareUnicodeCharacter{01D0}{\v \i} +%<all,t1>\DeclareUnicodeCharacter{01D1}{\v O} +%<all,t1>\DeclareUnicodeCharacter{01D2}{\v o} +%<all,t1>\DeclareUnicodeCharacter{01D3}{\v U} +%<all,t1>\DeclareUnicodeCharacter{01D4}{\v u} +%<all,t1>\DeclareUnicodeCharacter{01E2}{\@tabacckludge=\AE} +%<all,t1>\DeclareUnicodeCharacter{01E3}{\@tabacckludge=\ae} +%<all,t1>\DeclareUnicodeCharacter{01E6}{\v G} +%<all,t1>\DeclareUnicodeCharacter{01E7}{\v g} +%<all,t1>\DeclareUnicodeCharacter{01E8}{\v K} +%<all,t1>\DeclareUnicodeCharacter{01E9}{\v k} +%<all,t1>\DeclareUnicodeCharacter{01EA}{\k O} +%<all,t1>\DeclareUnicodeCharacter{01EB}{\k o} +%<all,t1>\DeclareUnicodeCharacter{01F0}{\v\j} +%<all,t1>\DeclareUnicodeCharacter{01F4}{\@tabacckludge'G} +%<all,t1>\DeclareUnicodeCharacter{01F5}{\@tabacckludge'g} +% \end{macrocode} +% \changes{v1.1o}{2015/08/28}{comma accent latex/4414} +% \begin{macrocode} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0218}{\textcommabelow S} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{0219}{\textcommabelow s} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{021A}{\textcommabelow T} +%<all,t1,ot1,ly1>\DeclareUnicodeCharacter{021B}{\textcommabelow t} +% \end{macrocode} +% +% \begin{macrocode} +%<all,t1>\DeclareUnicodeCharacter{0232}{\@tabacckludge=Y} +%<all,t1>\DeclareUnicodeCharacter{0233}{\@tabacckludge=y} +%<all,t2c,t2b,t2a,t1,ot2,ot1,ly1,lcy>\DeclareUnicodeCharacter{0237}{\j} +%<all,ly1,utf8>\DeclareUnicodeCharacter{02C6}{\textasciicircum} +%<all,ts1>\DeclareUnicodeCharacter{02C7}{\textasciicaron} +%<all,ly1,utf8>\DeclareUnicodeCharacter{02DC}{\textasciitilde} +%<all,ts1>\DeclareUnicodeCharacter{02D8}{\textasciibreve} +%<all,t1>\DeclareUnicodeCharacter{02D9}{\.{}} +%<all,t1>\DeclareUnicodeCharacter{02DB}{\k{}} +%<all,ts1>\DeclareUnicodeCharacter{02DD}{\textacutedbl} +% \end{macrocode} +% The Cyrillic code points have been recently checked (2007) and extended +% and corrected by Matthias Noe (\verb=a9931078@unet.univie.ac.at=) --- thanks. +% \changes{v1.1j}{2007/11/09}{Added a few new unicode decls in cyrillic (pr/3988)} +% \changes{v1.1k}{2007/11/11}{Added and further unicode decls in cyrillic} +% \changes{v1.1n}{2015/06/27}{correct accent https://tex.stackexchange.com/q/252521} +% \begin{macrocode} +%<*all,x2,t2c,t2b,t2a,ot2,lcy> +\DeclareUnicodeCharacter{0400}{\@tabacckludge`\CYRE} +%</all,x2,t2c,t2b,t2a,ot2,lcy> +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{0401}{\CYRYO} +%<all,x2,t2a,ot2>\DeclareUnicodeCharacter{0402}{\CYRDJE} +%<*all,x2,t2c,t2b,t2a,ot2,lcy> +\DeclareUnicodeCharacter{0403}{\@tabacckludge'\CYRG} +%</all,x2,t2c,t2b,t2a,ot2,lcy> +%<all,x2,t2a,ot2,lcy>\DeclareUnicodeCharacter{0404}{\CYRIE} +%<all,x2,t2c,t2b,t2a,ot2>\DeclareUnicodeCharacter{0405}{\CYRDZE} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{0406}{\CYRII} +%<all,x2,t2a,lcy>\DeclareUnicodeCharacter{0407}{\CYRYI} +%<all,x2,t2c,t2b,t2a,ot2>\DeclareUnicodeCharacter{0408}{\CYRJE} +%<all,x2,t2b,t2a,ot2>\DeclareUnicodeCharacter{0409}{\CYRLJE} +%<all,x2,t2b,t2a,ot2>\DeclareUnicodeCharacter{040A}{\CYRNJE} +%<all,x2,t2a,ot2>\DeclareUnicodeCharacter{040B}{\CYRTSHE} +%<*all,x2,t2c,t2b,t2a,ot2,lcy> +\DeclareUnicodeCharacter{040C}{\@tabacckludge'\CYRK} +\DeclareUnicodeCharacter{040D}{\@tabacckludge`\CYRI} +%</all,x2,t2c,t2b,t2a,ot2,lcy> +%<all,x2,t2b,t2a,lcy>\DeclareUnicodeCharacter{040E}{\CYRUSHRT} +%<all,x2,t2c,t2a,ot2>\DeclareUnicodeCharacter{040F}{\CYRDZHE} +%<*all,x2,t2c,t2b,t2a,ot2,lcy> +\DeclareUnicodeCharacter{0410}{\CYRA} +\DeclareUnicodeCharacter{0411}{\CYRB} +\DeclareUnicodeCharacter{0412}{\CYRV} +\DeclareUnicodeCharacter{0413}{\CYRG} +\DeclareUnicodeCharacter{0414}{\CYRD} +\DeclareUnicodeCharacter{0415}{\CYRE} +\DeclareUnicodeCharacter{0416}{\CYRZH} +\DeclareUnicodeCharacter{0417}{\CYRZ} +\DeclareUnicodeCharacter{0418}{\CYRI} +\DeclareUnicodeCharacter{0419}{\CYRISHRT} +\DeclareUnicodeCharacter{041A}{\CYRK} +\DeclareUnicodeCharacter{041B}{\CYRL} +\DeclareUnicodeCharacter{041C}{\CYRM} +\DeclareUnicodeCharacter{041D}{\CYRN} +\DeclareUnicodeCharacter{041E}{\CYRO} +\DeclareUnicodeCharacter{041F}{\CYRP} +\DeclareUnicodeCharacter{0420}{\CYRR} +\DeclareUnicodeCharacter{0421}{\CYRS} +\DeclareUnicodeCharacter{0422}{\CYRT} +\DeclareUnicodeCharacter{0423}{\CYRU} +\DeclareUnicodeCharacter{0424}{\CYRF} +\DeclareUnicodeCharacter{0425}{\CYRH} +\DeclareUnicodeCharacter{0426}{\CYRC} +\DeclareUnicodeCharacter{0427}{\CYRCH} +\DeclareUnicodeCharacter{0428}{\CYRSH} +\DeclareUnicodeCharacter{0429}{\CYRSHCH} +\DeclareUnicodeCharacter{042A}{\CYRHRDSN} +\DeclareUnicodeCharacter{042B}{\CYRERY} +\DeclareUnicodeCharacter{042C}{\CYRSFTSN} +\DeclareUnicodeCharacter{042D}{\CYREREV} +\DeclareUnicodeCharacter{042E}{\CYRYU} +\DeclareUnicodeCharacter{042F}{\CYRYA} +\DeclareUnicodeCharacter{0430}{\cyra} +\DeclareUnicodeCharacter{0431}{\cyrb} +\DeclareUnicodeCharacter{0432}{\cyrv} +\DeclareUnicodeCharacter{0433}{\cyrg} +\DeclareUnicodeCharacter{0434}{\cyrd} +\DeclareUnicodeCharacter{0435}{\cyre} +\DeclareUnicodeCharacter{0436}{\cyrzh} +\DeclareUnicodeCharacter{0437}{\cyrz} +\DeclareUnicodeCharacter{0438}{\cyri} +\DeclareUnicodeCharacter{0439}{\cyrishrt} +\DeclareUnicodeCharacter{043A}{\cyrk} +\DeclareUnicodeCharacter{043B}{\cyrl} +\DeclareUnicodeCharacter{043C}{\cyrm} +\DeclareUnicodeCharacter{043D}{\cyrn} +\DeclareUnicodeCharacter{043E}{\cyro} +\DeclareUnicodeCharacter{043F}{\cyrp} +\DeclareUnicodeCharacter{0440}{\cyrr} +\DeclareUnicodeCharacter{0441}{\cyrs} +\DeclareUnicodeCharacter{0442}{\cyrt} +\DeclareUnicodeCharacter{0443}{\cyru} +\DeclareUnicodeCharacter{0444}{\cyrf} +\DeclareUnicodeCharacter{0445}{\cyrh} +\DeclareUnicodeCharacter{0446}{\cyrc} +\DeclareUnicodeCharacter{0447}{\cyrch} +\DeclareUnicodeCharacter{0448}{\cyrsh} +\DeclareUnicodeCharacter{0449}{\cyrshch} +\DeclareUnicodeCharacter{044A}{\cyrhrdsn} +\DeclareUnicodeCharacter{044B}{\cyrery} +\DeclareUnicodeCharacter{044C}{\cyrsftsn} +\DeclareUnicodeCharacter{044D}{\cyrerev} +\DeclareUnicodeCharacter{044E}{\cyryu} +\DeclareUnicodeCharacter{044F}{\cyrya} +\DeclareUnicodeCharacter{0450}{\@tabacckludge`\cyre} +\DeclareUnicodeCharacter{0451}{\cyryo} +%</all,x2,t2c,t2b,t2a,ot2,lcy> +%<all,x2,t2a,ot2>\DeclareUnicodeCharacter{0452}{\cyrdje} +%<*all,x2,t2c,t2b,t2a,ot2,lcy> +\DeclareUnicodeCharacter{0453}{\@tabacckludge'\cyrg} +%</all,x2,t2c,t2b,t2a,ot2,lcy> +%<all,x2,t2a,ot2,lcy>\DeclareUnicodeCharacter{0454}{\cyrie} +%<all,x2,t2c,t2b,t2a,ot2>\DeclareUnicodeCharacter{0455}{\cyrdze} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{0456}{\cyrii} +%<all,x2,t2a,lcy>\DeclareUnicodeCharacter{0457}{\cyryi} +%<all,x2,t2c,t2b,t2a,ot2>\DeclareUnicodeCharacter{0458}{\cyrje} +%<all,x2,t2b,t2a,ot2>\DeclareUnicodeCharacter{0459}{\cyrlje} +%<all,x2,t2b,t2a,ot2>\DeclareUnicodeCharacter{045A}{\cyrnje} +%<all,x2,t2a,ot2>\DeclareUnicodeCharacter{045B}{\cyrtshe} +%<*all,x2,t2c,t2b,t2a,ot2,lcy> +\DeclareUnicodeCharacter{045C}{\@tabacckludge'\cyrk} +\DeclareUnicodeCharacter{045D}{\@tabacckludge`\cyri} +%</all,x2,t2c,t2b,t2a,ot2,lcy> +%<all,x2,t2b,t2a,lcy>\DeclareUnicodeCharacter{045E}{\cyrushrt} +%<all,x2,t2c,t2a,ot2>\DeclareUnicodeCharacter{045F}{\cyrdzhe} +%<all,x2,ot2>\DeclareUnicodeCharacter{0462}{\CYRYAT} +%<all,x2,ot2>\DeclareUnicodeCharacter{0463}{\cyryat} +%<all,x2>\DeclareUnicodeCharacter{046A}{\CYRBYUS} +%<all,x2>\DeclareUnicodeCharacter{046B}{\cyrbyus} +% \end{macrocode} +% The next two declarations are questionable, the encoding definition +% should probably contain |\CYROTLD| and |\cyrotld|. Or alternatively, if +% the characters in the X2 encodings are really meant to represent the +% historical characters in Ux0472 and Ux0473 (they look like them) then +% they would need to change instead. +% +% However, their looks are probably a font designers decision and the next +% two mappings are wrong or rather the names in OT2 should change for +% consistency. +% +% On the other hand the names |\CYROTLD| are somewhat questionabled as the +% Unicode standard only describes ``Cyrillic barred O'' while |TLD| refers +% to a tilde (which is more less what the ``Cyrillic FITA looks according +% to the Unicode book). +% \begin{macrocode} +%<all,ot2>\DeclareUnicodeCharacter{0472}{\CYRFITA} +%<all,ot2>\DeclareUnicodeCharacter{0473}{\cyrfita} +% \end{macrocode} +% +% \begin{macrocode} +%<all,x2,ot2>\DeclareUnicodeCharacter{0474}{\CYRIZH} +%<all,x2,ot2>\DeclareUnicodeCharacter{0475}{\cyrizh} +% \end{macrocode} +% While the double grave accent seems to exist in X2, T2A, T2B and T2C +% encoding, the letter izhitsa exists only in X2 and OT2. Therefore, +% izhitsa with double grave seems to be possible only using X2. +% \begin{macrocode} +%<all,x2>\DeclareUnicodeCharacter{0476}{\C\CYRIZH} +%<all,x2>\DeclareUnicodeCharacter{0477}{\C\cyrizh} +% \end{macrocode} +% +% \begin{macrocode} +%<all,t2c>\DeclareUnicodeCharacter{048C}{\CYRSEMISFTSN} +%<all,t2c>\DeclareUnicodeCharacter{048D}{\cyrsemisftsn} +%<all,t2c>\DeclareUnicodeCharacter{048E}{\CYRRTICK} +%<all,t2c>\DeclareUnicodeCharacter{048F}{\cyrrtick} +%<all,x2,t2a,lcy>\DeclareUnicodeCharacter{0490}{\CYRGUP} +%<all,x2,t2a,lcy>\DeclareUnicodeCharacter{0491}{\cyrgup} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{0492}{\CYRGHCRS} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{0493}{\cyrghcrs} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{0494}{\CYRGHK} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{0495}{\cyrghk} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{0496}{\CYRZHDSC} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{0497}{\cyrzhdsc} +%<all,x2,t2a>\DeclareUnicodeCharacter{0498}{\CYRZDSC} +%<all,x2,t2a>\DeclareUnicodeCharacter{0499}{\cyrzdsc} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{049A}{\CYRKDSC} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{049B}{\cyrkdsc} +%<all,x2,t2a>\DeclareUnicodeCharacter{049C}{\CYRKVCRS} +%<all,x2,t2a>\DeclareUnicodeCharacter{049D}{\cyrkvcrs} +%<all,x2,t2c>\DeclareUnicodeCharacter{049E}{\CYRKHCRS} +%<all,x2,t2c>\DeclareUnicodeCharacter{049F}{\cyrkhcrs} +%<all,x2,t2a>\DeclareUnicodeCharacter{04A0}{\CYRKBEAK} +%<all,x2,t2a>\DeclareUnicodeCharacter{04A1}{\cyrkbeak} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04A2}{\CYRNDSC} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04A3}{\cyrndsc} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{04A4}{\CYRNG} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{04A5}{\cyrng} +%<all,x2,t2c>\DeclareUnicodeCharacter{04A6}{\CYRPHK} +%<all,x2,t2c>\DeclareUnicodeCharacter{04A7}{\cyrphk} +%<all,x2,t2c>\DeclareUnicodeCharacter{04A8}{\CYRABHHA} +%<all,x2,t2c>\DeclareUnicodeCharacter{04A9}{\cyrabhha} +%<all,x2,t2a>\DeclareUnicodeCharacter{04AA}{\CYRSDSC} +%<all,x2,t2a>\DeclareUnicodeCharacter{04AB}{\cyrsdsc} +%<all,x2,t2c>\DeclareUnicodeCharacter{04AC}{\CYRTDSC} +%<all,x2,t2c>\DeclareUnicodeCharacter{04AD}{\cyrtdsc} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{04AE}{\CYRY} +%<all,x2,t2b,t2a>\DeclareUnicodeCharacter{04AF}{\cyry} +%<all,x2,t2a>\DeclareUnicodeCharacter{04B0}{\CYRYHCRS} +%<all,x2,t2a>\DeclareUnicodeCharacter{04B1}{\cyryhcrs} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04B2}{\CYRHDSC} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04B3}{\cyrhdsc} +%<all,x2,t2c>\DeclareUnicodeCharacter{04B4}{\CYRTETSE} +%<all,x2,t2c>\DeclareUnicodeCharacter{04B5}{\cyrtetse} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04B6}{\CYRCHRDSC} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04B7}{\cyrchrdsc} +%<all,x2,t2a>\DeclareUnicodeCharacter{04B8}{\CYRCHVCRS} +%<all,x2,t2a>\DeclareUnicodeCharacter{04B9}{\cyrchvcrs} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04BA}{\CYRSHHA} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04BB}{\cyrshha} +%<all,x2,t2c>\DeclareUnicodeCharacter{04BC}{\CYRABHCH} +%<all,x2,t2c>\DeclareUnicodeCharacter{04BD}{\cyrabhch} +%<all,x2,t2c>\DeclareUnicodeCharacter{04BE}{\CYRABHCHDSC} +%<all,x2,t2c>\DeclareUnicodeCharacter{04BF}{\cyrabhchdsc} +% \end{macrocode} +% The character |\CYRpalochka| is not defined by OT2 and LCY. However it is +% looking identical to |\CYRII| and the Unicode standard explicitly refers +% to that (and to Latin I). So perhaps those encodings could get an alias? +% On the other hand, why are there two distinct slots in the T2 encodings +% even though they are so pressed for space? Perhaps they don't always look +% alike. +% \begin{macrocode} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04C0}{\CYRpalochka} +% \end{macrocode} +% +% \begin{macrocode} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04C1}{\U\CYRZH} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04C2}{\U\cyrzh} +%<all,x2,t2b>\DeclareUnicodeCharacter{04C3}{\CYRKHK} +%<all,x2,t2b>\DeclareUnicodeCharacter{04C4}{\cyrkhk} +% \end{macrocode} +% According to the Unicode standard Ux04C5 should be an L with ``tail'' not +% with descender (which also exists as Ux04A2) but it looks as if the char +% names do not make this distinction). Should they? +% \begin{macrocode} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C5}{\CYRLDSC} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C6}{\cyrldsc} +% \end{macrocode} +% +% \begin{macrocode} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C7}{\CYRNHK} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04C8}{\cyrnhk} +%<all,x2,t2b>\DeclareUnicodeCharacter{04CB}{\CYRCHLDSC} +%<all,x2,t2b>\DeclareUnicodeCharacter{04CC}{\cyrchldsc} +% \end{macrocode} +% According to the Unicode standard Ux04CD should be an M with ``tail'' not +% with descender. However this time there is no M with descender in the +% Unicode standard. +% \begin{macrocode} +%<all,x2,t2c>\DeclareUnicodeCharacter{04CD}{\CYRMDSC} +%<all,x2,t2c>\DeclareUnicodeCharacter{04CE}{\cyrmdsc} +% \end{macrocode} +% +% \begin{macrocode} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04D0}{\U\CYRA} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04D1}{\U\cyra} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04D2}{\"\CYRA} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04D3}{\"\cyra} +%<all,x2,t2a>\DeclareUnicodeCharacter{04D4}{\CYRAE} +%<all,x2,t2a>\DeclareUnicodeCharacter{04D5}{\cyrae} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04D6}{\U\CYRE} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04D7}{\U\cyre} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04D8}{\CYRSCHWA} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04D9}{\cyrschwa} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04DA}{\"\CYRSCHWA} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04DB}{\"\cyrschwa} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04DC}{\"\CYRZH} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04DD}{\"\cyrzh} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04DE}{\"\CYRZ} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04DF}{\"\cyrz} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04E0}{\CYRABHDZE} +%<all,x2,t2c,t2b>\DeclareUnicodeCharacter{04E1}{\cyrabhdze} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04E2}{\@tabacckludge=\CYRI} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04E3}{\@tabacckludge=\cyri} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04E4}{\"\CYRI} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04E5}{\"\cyri} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04E6}{\"\CYRO} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04E7}{\"\cyro} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04E8}{\CYROTLD} +%<all,x2,t2c,t2b,t2a>\DeclareUnicodeCharacter{04E9}{\cyrotld} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04EC}{\"\CYREREV} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04ED}{\"\cyrerev} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04EE}{\@tabacckludge=\CYRU} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04EF}{\@tabacckludge=\cyru} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F0}{\"\CYRU} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F1}{\"\cyru} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F2}{\H\CYRU} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F3}{\H\cyru} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F4}{\"\CYRCH} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F5}{\"\cyrch} +%<all,x2,t2b>\DeclareUnicodeCharacter{04F6}{\CYRGDSC} +%<all,x2,t2b>\DeclareUnicodeCharacter{04F7}{\cyrgdsc} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F8}{\"\CYRERY} +%<all,x2,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{04F9}{\"\cyrery} +%<all,t2b>\DeclareUnicodeCharacter{04FA}{\CYRGDSCHCRS} +%<all,t2b>\DeclareUnicodeCharacter{04FB}{\cyrgdschcrs} +%<all,x2,t2b>\DeclareUnicodeCharacter{04FC}{\CYRHHK} +%<all,x2,t2b>\DeclareUnicodeCharacter{04FD}{\cyrhhk} +%<all,t2b>\DeclareUnicodeCharacter{04FE}{\CYRHHCRS} +%<all,t2b>\DeclareUnicodeCharacter{04FF}{\cyrhhcrs} +%<all,ts1>\DeclareUnicodeCharacter{0E3F}{\textbaht} +%<all,t1>\DeclareUnicodeCharacter{1E02}{\.B} +%<all,t1>\DeclareUnicodeCharacter{1E03}{\.b} +%<all,t1>\DeclareUnicodeCharacter{1E9E}{\SS} +%<all,x2,t2c,t2b,t2a,t1,utf8>\DeclareUnicodeCharacter{200C}{\textcompwordmark} +% \end{macrocode} +% \changes{v1.1s}{2016/02/28}{Add more hyphens and dashes} +% \begin{macrocode} +%<all,t1>\DeclareUnicodeCharacter{2010}{-} +%<all,t1>\DeclareUnicodeCharacter{2011}{\mbox{-}} +% \end{macrocode} +% U+2012 should be the width of a digit, endash is OK in many fonts including cm. +% \begin{macrocode} +%<all,t1>\DeclareUnicodeCharacter{2012}{\textendash} +%<*all,x2,t2c,t2b,t2a,t1,ot2,ot1,ly1,lcy> +\DeclareUnicodeCharacter{2013}{\textendash} +\DeclareUnicodeCharacter{2014}{\textemdash} +% \end{macrocode} +% U+2015 is Horizontal bar +% \begin{macrocode} +%<all,t1>\DeclareUnicodeCharacter{2015}{\textemdash} +%</all,x2,t2c,t2b,t2a,t1,ot2,ot1,ly1,lcy> +%<all,ts1>\DeclareUnicodeCharacter{2016}{\textbardbl} +%<*all,x2,t2c,t2b,t2a,t1,ot2,ot1,lcy> +\DeclareUnicodeCharacter{2018}{\textquoteleft} +\DeclareUnicodeCharacter{2019}{\textquoteright} +%</all,x2,t2c,t2b,t2a,t1,ot2,ot1,lcy> +%<all,t1>\DeclareUnicodeCharacter{201A}{\quotesinglbase} +%<*all,x2,t2c,t2b,t2a,t1,ot2,ot1,ly1,lcy> +\DeclareUnicodeCharacter{201C}{\textquotedblleft} +\DeclareUnicodeCharacter{201D}{\textquotedblright} +%</all,x2,t2c,t2b,t2a,t1,ot2,ot1,ly1,lcy> +%<all,x2,t2c,t2b,t2a,t1,lcy>\DeclareUnicodeCharacter{201E}{\quotedblbase} +%<all,ts1,oms,ly1>\DeclareUnicodeCharacter{2020}{\textdagger} +%<all,ts1,oms,ly1>\DeclareUnicodeCharacter{2021}{\textdaggerdbl} +%<all,ts1,oms,ly1>\DeclareUnicodeCharacter{2022}{\textbullet} +%<all,ly1,utf8>\DeclareUnicodeCharacter{2026}{\textellipsis} +%<*all,x2,ts1,t2c,t2b,t2a,t1,ly1> +\DeclareUnicodeCharacter{2030}{\textperthousand} +%</all,x2,ts1,t2c,t2b,t2a,t1,ly1> +%<*all,x2,ts1,t2c,t2b,t2a,t1> +\DeclareUnicodeCharacter{2031}{\textpertenthousand} +%</all,x2,ts1,t2c,t2b,t2a,t1> +%<all,t1,ly1>\DeclareUnicodeCharacter{2039}{\guilsinglleft} +%<all,t1,ly1>\DeclareUnicodeCharacter{203A}{\guilsinglright} +%<all,ts1>\DeclareUnicodeCharacter{203B}{\textreferencemark} +%<all,ts1>\DeclareUnicodeCharacter{203D}{\textinterrobang} +%<all,ts1>\DeclareUnicodeCharacter{2044}{\textfractionsolidus} +%<all,ts1>\DeclareUnicodeCharacter{204E}{\textasteriskcentered} +%<all,ts1>\DeclareUnicodeCharacter{2052}{\textdiscount} +%<all,ts1>\DeclareUnicodeCharacter{20A1}{\textcolonmonetary} +%<all,ts1>\DeclareUnicodeCharacter{20A4}{\textlira} +%<all,ts1>\DeclareUnicodeCharacter{20A6}{\textnaira} +%<all,ts1>\DeclareUnicodeCharacter{20A9}{\textwon} +%<all,ts1>\DeclareUnicodeCharacter{20AB}{\textdong} +%<all,ts1>\DeclareUnicodeCharacter{20AC}{\texteuro} +%<all,ts1>\DeclareUnicodeCharacter{20B1}{\textpeso} +%<all,ts1>\DeclareUnicodeCharacter{2103}{\textcelsius} +%<all,x2,ts1,t2c,t2b,t2a,ot2,lcy>\DeclareUnicodeCharacter{2116}{\textnumero} +%<all,ts1>\DeclareUnicodeCharacter{2117}{\textcircledP} +%<all,ts1>\DeclareUnicodeCharacter{211E}{\textrecipe} +%<all,ts1>\DeclareUnicodeCharacter{2120}{\textservicemark} +%<all,ts1,ly1,utf8>\DeclareUnicodeCharacter{2122}{\texttrademark} +%<all,ts1>\DeclareUnicodeCharacter{2126}{\textohm} +%<all,ts1>\DeclareUnicodeCharacter{2127}{\textmho} +%<all,ts1>\DeclareUnicodeCharacter{212E}{\textestimated} +%<all,ts1>\DeclareUnicodeCharacter{2190}{\textleftarrow} +%<all,ts1>\DeclareUnicodeCharacter{2191}{\textuparrow} +%<all,ts1>\DeclareUnicodeCharacter{2192}{\textrightarrow} +%<all,ts1>\DeclareUnicodeCharacter{2193}{\textdownarrow} +%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{2329}{\textlangle} +%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{232A}{\textrangle} +%<all,ts1>\DeclareUnicodeCharacter{2422}{\textblank} +%<all,x2,t2c,t2b,t2a,t1,utf8>\DeclareUnicodeCharacter{2423}{\textvisiblespace} +%<all,ts1>\DeclareUnicodeCharacter{25E6}{\textopenbullet} +%<all,ts1>\DeclareUnicodeCharacter{25EF}{\textbigcircle} +%<all,ts1>\DeclareUnicodeCharacter{266A}{\textmusicalnote} +% \end{macrocode} +% \changes{v1.2h}{2019/02/07}{Added 27E8 and 27E9 (github/110)} +% \begin{macrocode} +%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{27E8}{\textlangle} +%<all,x2,ts1,t2c,t2b,t2a>\DeclareUnicodeCharacter{27E9}{\textrangle} +%<all,t1>\DeclareUnicodeCharacter{1E20}{\@tabacckludge=G} +%<all,t1>\DeclareUnicodeCharacter{1E21}{\@tabacckludge=g} +% \end{macrocode} +% +% When doing cut-and-paste from other documents f-ligatures might show +% up as Unicode characters. We translate them back to individual +% characters so that they get accepted. If supported by the font +% (which is normally the case) they are then reconstructed as +% ligatures so they come out as desired. Otherwise they will come +% out as individual characters which is fine too. +% \changes{v1.2j}{2019/07/11}{Add typical f-ligatures and st (github/154)} +% \begin{macrocode} +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB00}{ff} % ff +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB01}{fi} % fi +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB02}{fl} % fl +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB03}{ffi} % ffi +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB04}{ffl} % ffl +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB05}{ft} % ſt +%<all,t1,ot1,ly1,t2a,t2b,t2c>\DeclareUnicodeCharacter{FB06}{st} % st +% \end{macrocode} +% +% +% \changes{v1.2c}{2018/04/05}{Add BOM} +% \begin{macrocode} +%<all,ts1,utf8>\DeclareUnicodeCharacter{FEFF}{\ifhmode\nobreak\fi} +% \end{macrocode} +% +% +% \endgroup +% \subsection{Notes} +% +% \changes{v1.1e}{2004/05/22}{Added notes on inconsistency with `8-bit files'.} +% The following inputs are inconsistent with the 8-bit inputenc files +% since they will always only produce the `text character'. This is an +% area where inputenc is notoriously confused. +% \begin{verbatim} +% %<all,ts1,t1,ot1,ly1>\DeclareUnicodeCharacter{00A3}{\textsterling} +% %<*all,x2,ts1,t2c,t2b,t2a,oms,ly1> +% \DeclareUnicodeCharacter{00A7}{\textsection} +% %</all,x2,ts1,t2c,t2b,t2a,oms,ly1> +% %<all,ts1,utf8>\DeclareUnicodeCharacter{00A9}{\textcopyright} +% %<all,ts1>\DeclareUnicodeCharacter{00B1}{\textpm} +% %<all,ts1,oms,ly1>\DeclareUnicodeCharacter{00B6}{\textparagraph} +% %<all,ts1,oms,ly1>\DeclareUnicodeCharacter{2020}{\textdagger} +% %<all,ts1,oms,ly1>\DeclareUnicodeCharacter{2021}{\textdaggerdbl} +% %<all,ly1,utf8>\DeclareUnicodeCharacter{2026}{\textellipsis} +% \end{verbatim} +% +% The following definitions are in an encoding file but have no +% direct equivalent in Unicode, or they simply do not make sense in that +% context (or we have not yet found anything or \ldots :-). For +% example, the non-combining accent characters are certainly +% available somewhere but these are not equivalent to a \TeX{} +% accent command. +%\begin{verbatim} +%\DeclareTextSymbol{\j}{OT1}{17} +%\DeclareTextSymbol{\SS}{T1}{223} +%\DeclareTextSymbol{\textcompwordmark}{T1}{23} +% +%\DeclareTextAccent{\"}{OT1}{127} +%\DeclareTextAccent{\'}{OT1}{19} +%\DeclareTextAccent{\.}{OT1}{95} +%\DeclareTextAccent{\=}{OT1}{22} +%\DeclareTextAccent{\H}{OT1}{125} +%\DeclareTextAccent{\^}{OT1}{94} +%\DeclareTextAccent{\`}{OT1}{18} +%\DeclareTextAccent{\r}{OT1}{23} +%\DeclareTextAccent{\u}{OT1}{21} +%\DeclareTextAccent{\v}{OT1}{20} +%\DeclareTextAccent{\~}{OT1}{126} +%\DeclareTextCommand{\b}{OT1}[1] +%\DeclareTextCommand{\c}{OT1}[1] +%\DeclareTextCommand{\d}{OT1}[1] +%\DeclareTextCommand{\k}{T1}[1] +%\end{verbatim} +% +% +% +% \subsection{Mappings for OT1 glyphs} +% +% This is even more incomplete as again it covers only the single +% glyphs from |OT1| plus some that have been explicitly defined for +% this encoding. Everything that is provided in |T1|, and that +% could be provided as composite glyphs via |OT1|, could and +% probably should be set up as well. Which leaves the many things +% that are not provided in |T1| but can be provided in |OT1| (and +% in |T1|) by composite glyphs. +% +% Stuff not mapped (note that |\j| ($\jmath$) is not equivalent to any +% Unicode character): +%\begin{verbatim} +%\DeclareTextSymbol{\j}{OT1}{17} +%\DeclareTextAccent{\"}{OT1}{127} +%\DeclareTextAccent{\'}{OT1}{19} +%\DeclareTextAccent{\.}{OT1}{95} +%\DeclareTextAccent{\=}{OT1}{22} +%\DeclareTextAccent{\^}{OT1}{94} +%\DeclareTextAccent{\`}{OT1}{18} +%\DeclareTextAccent{\~}{OT1}{126} +%\DeclareTextAccent{\H}{OT1}{125} +%\DeclareTextAccent{\u}{OT1}{21} +%\DeclareTextAccent{\v}{OT1}{20} +%\DeclareTextAccent{\r}{OT1}{23} +%\DeclareTextCommand{\b}{OT1}[1] +%\DeclareTextCommand{\c}{OT1}[1] +%\DeclareTextCommand{\d}{OT1}[1] +%\end{verbatim} +% +% +% +% \subsection{Mappings for OMS glyphs} +% +% Characters like |\textbackslash| are not mapped as they are +% (primarily) only in the lower 127 and the code here only sets up +% mappings for UTF-8 characters that are at least 2 octets long. +%\begin{verbatim} +%\DeclareTextSymbol{\textbackslash}{OMS}{110} % "6E +%\DeclareTextSymbol{\textbar}{OMS}{106} % "6A +%\DeclareTextSymbol{\textbraceleft}{OMS}{102} % "66 +%\DeclareTextSymbol{\textbraceright}{OMS}{103} % "67 +%\end{verbatim} +% +% But the following (and some others) might actually lurk in Unicode +% somewhere\ldots +%\begin{verbatim} +%\DeclareTextSymbol{\textasteriskcentered}{OMS}{3} % "03 +%\DeclareTextCommand{\textcircled}{OMS} +%\end{verbatim} +% +% +% +% +% \subsection{Mappings for TS1 glyphs} +% +% Exercise for somebody else. +% +% +% \subsection{Mappings for \texttt{latex.ltx} glyphs} +% +% There is also a collection of characters already set up in the kernel, +% one way or the other. Since these do not clearly relate to any +% particular font encoding they are mapped when the +% \texttt{utf8} support is first set up. +% +% Also there are a number of |\providecommand|s in the various input +% encoding files which may or may not go into this part. +% \changes{v1.1b}{2004/02/09}{Added commands already defined in the kernel} +% \begin{macrocode} +%<*utf8> +% This space is intentionally empty ... +%</utf8> +% \end{macrocode} +% +% \subsection{Old \texttt{utf8.def} file as a temp fix for p\TeX{} and friends} +% +% +% \changes{v1.2h}{2019/07/09}{Temp rollback fix for e-pTeX} +% \begin{macrocode} +%<*utf8-2018> +\ProvidesFile{utf8.def} + [2018/10/05 v1.2f UTF-8 support for inputenc] +\makeatletter +\catcode`\ \saved@space@catcode +\long\def\UTFviii@two@octets#1#2{\expandafter + \UTFviii@defined\csname u8:#1\string#2\endcsname} +\long\def\UTFviii@three@octets#1#2#3{\expandafter + \UTFviii@defined\csname u8:#1\string#2\string#3\endcsname} +\long\def\UTFviii@four@octets#1#2#3#4{\expandafter + \UTFviii@defined\csname u8:#1\string#2\string#3\string#4\endcsname} +\def\UTFviii@defined#1{% + \ifx#1\relax + \if\relax\expandafter\UTFviii@checkseq\string#1\relax\relax + \UTFviii@undefined@err{#1}% + \else + \PackageError{inputenc}{Invalid UTF-8 byte sequence}% + \UTFviii@invalid@help + \fi + \else\expandafter + #1% + \fi +} +\def\UTFviii@invalid@err#1{% + \PackageError{inputenc}{Invalid UTF-8 byte "\UTFviii@hexnumber{`#1}}% + \UTFviii@invalid@help} +\def\UTFviii@invalid@help{% + The document does not appear to be in UTF-8 encoding.\MessageBreak + Try adding \noexpand\UseRawInputEncoding as the first line of the file\MessageBreak + or specify an encoding such as \noexpand\usepackage[latin1]{inputenc}\MessageBreak + in the document preamble.\MessageBreak + Alternatively, save the file in UTF-8 using your editor or another tool} +\def\UTFviii@undefined@err#1{% + \PackageError{inputenc}{Unicode character \expandafter + \UTFviii@splitcsname\string#1\relax + \MessageBreak + not set up for use with LaTeX}% + {You may provide a definition with\MessageBreak + \noexpand\DeclareUnicodeCharacter}% + } +\def\UTFviii@checkseq#1:#2#3{% + \ifnum`#2<"80 % + \ifx\relax#3\else1\fi + \else + \ifnum`#2<"C0 % + 1 % + \else + \expandafter\expandafter\expandafter\UTFviii@check@continue + \expandafter\expandafter\expandafter#3% + \fi + \fi} +\def\UTFviii@check@continue#1{% + \ifx\relax#1% + \else + \ifnum`#1<"80 1\else\ifnum`#1>"BF 1\fi\fi + \expandafter\UTFviii@check@continue + \fi +} +\begingroup +\catcode`\~13 +\catcode`\"12 +\def\UTFviii@loop{% + \uccode`\~\count@ + \uppercase\expandafter{\UTFviii@tmp}% + \advance\count@\@ne + \ifnum\count@<\@tempcnta + \expandafter\UTFviii@loop + \fi} + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@undefined@err{:\string~}}} + \count@"1 + \@tempcnta9 +\UTFviii@loop + \count@11 + \@tempcnta12 +\UTFviii@loop + \count@14 + \@tempcnta32 +\UTFviii@loop + \count@"80 + \@tempcnta"C2 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}} +\UTFviii@loop + \count@"C2 + \@tempcnta"E0 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@two@octets\string~}} +\UTFviii@loop + \count@"E0 + \@tempcnta"F0 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@three@octets\string~}} +\UTFviii@loop + \count@"F0 + \@tempcnta"F5 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@four@octets\string~}} +\UTFviii@loop + \count@"F5 + \@tempcnta"100 + \def\UTFviii@tmp{\xdef~{\noexpand\UTFviii@invalid@err\string~}} +\UTFviii@loop +\endgroup +\@inpenc@test +\ifx\@begindocumenthook\@undefined + \makeatother + \endinput \fi +\begingroup +\catcode`\"=12 +\catcode`\<=12 +\catcode`\.=12 +\catcode`\,=12 +\catcode`\;=12 +\catcode`\!=12 +\catcode`\~=13 +\gdef\DeclareUnicodeCharacter#1#2{% + \count@"#1\relax + \wlog{ \space\space defining Unicode char U+#1 (decimal \the\count@)}% + \begingroup + \parse@XML@charref + \def\UTFviii@two@octets##1##2{\csname u8:##1\string##2\endcsname}% + \def\UTFviii@three@octets##1##2##3{\csname u8:##1% + \string##2\string##3\endcsname}% + \def\UTFviii@four@octets##1##2##3##4{\csname u8:##1% + \string##2\string##3\string##4\endcsname}% + \expandafter\expandafter\expandafter + \expandafter\expandafter\expandafter + \expandafter + \gdef\UTFviii@tmp{\IeC{#2}}% + \endgroup +} +\gdef\parse@XML@charref{% + \ifnum\count@<"A0\relax + \ifnum\catcode\count@=13 + \uccode`\~=\count@\uppercase{\def\UTFviii@tmp{\@empty\@empty~}}% + \else + \PackageError{inputenc}% + {Cannot define non-active Unicode char value < 00A0}% + \@eha + \def\UTFviii@tmp{\UTFviii@tmp}% + \fi + \else\ifnum\count@<"800\relax + \parse@UTFviii@a,% + \parse@UTFviii@b C\UTFviii@two@octets.,% + \else\ifnum\count@<"10000\relax + \parse@UTFviii@a;% + \parse@UTFviii@a,% + \parse@UTFviii@b E\UTFviii@three@octets.{,;}% + \else + \ifnum\count@>"10FFFF\relax + \PackageError{inputenc}% + {\UTFviii@hexnumber\count@\space too large for Unicode}% + {Values between 0 and 10FFFF are permitted}% + \fi + \parse@UTFviii@a;% + \parse@UTFviii@a,% + \parse@UTFviii@a!% + \parse@UTFviii@b F\UTFviii@four@octets.{!,;}% + \fi + \fi + \fi +} +\gdef\parse@UTFviii@a#1{% + \@tempcnta\count@ + \divide\count@ 64 + \@tempcntb\count@ + \multiply\count@ 64 + \advance\@tempcnta-\count@ + \advance\@tempcnta 128 + \uccode`#1\@tempcnta + \count@\@tempcntb} +\gdef\parse@UTFviii@b#1#2#3#4{% + \advance\count@ "#10\relax + \uccode`#3\count@ + \uppercase{\gdef\UTFviii@tmp{#2#3#4}}} +\ifx\numexpr\@undefined +\gdef\decode@UTFviii#1{0} +\else +\gdef\decode@UTFviii#1\relax{% + \expandafter\UTFviii@cleanup + \the\numexpr\dec@de@UTFviii#1\relax)))))\@empty} +\gdef\UTFviii@cleanup#1)#2\@empty{#1} +\gdef\dec@de@UTFviii#1{% +\ifx\relax#1% +\else + \ifnum`#1>"EF + ((((`#1-"F0)% + \else + \ifnum`#1>"DF + (((`#1-"E0)% + \else + \ifnum`#1>"BF + ((`#1-"C0)% + \else + \ifnum`#1>"7F + )*64+(`#1-"80)% + \else + +`#1 % + \fi + \fi + \fi + \fi + \expandafter\dec@de@UTFviii +\fi} +\fi +\ifx\numexpr\@undefined +\global\let\UTFviii@hexnumber\@firstofone +\global\UTFviii@hexdigit\hexnumber@ +\else +\gdef\UTFviii@hexnumber#1{% +\ifnum#1>15 % +\expandafter\UTFviii@hexnumber\expandafter{\the\numexpr(#1-8)/16\relax}% +\fi +\UTFviii@hexdigit{\numexpr#1\ifnum#1>0-((#1-8)/16)*16\fi\relax}% +} +\gdef\UTFviii@hexdigit#1{\ifcase\numexpr#1\relax + 0\or1\or2\or3\or4\or5\or6\or7\or8\or9\or + A\or B\or C\or D\or E\or F\fi} +\fi +\gdef\UTFviii@hexcodepoint#1{U+% + \ifnum#1<16 0\fi + \ifnum#1<256 0\fi + \ifnum#1<4096 0\fi + \UTFviii@hexnumber{#1}% +}% +\gdef\UTFviii@splitcsname#1:#2\relax{% +#2 (\expandafter\UTFviii@hexcodepoint\expandafter{% + \the\numexpr\decode@UTFviii#2\relax})% +} +\endgroup +\@onlypreamble\DeclareUnicodeCharacter +\@onlypreamble\parse@XML@charref +\@onlypreamble\parse@UTFviii@a +\@onlypreamble\parse@UTFviii@b +\begingroup + \def\cdp@elt#1#2#3#4{% + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font % + encoding #1}% + \catcode`\ 9\relax}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% + } + \cdp@list +\endgroup +\def\DeclareFontEncoding@#1#2#3{% + \expandafter + \ifx\csname T@#1\endcsname\relax + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@family}{\default@series}% + {\default@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@cmd + \begingroup + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font % + encoding #1}}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% + \endgroup + \else + \@font@info{Redeclaring font encoding #1}% + \fi + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@M#3}% + \xdef\LastDeclaredEncoding{#1}% + } +\DeclareUnicodeCharacter{00A9}{\textcopyright} +\DeclareUnicodeCharacter{00AA}{\textordfeminine} +\DeclareUnicodeCharacter{00AE}{\textregistered} +\DeclareUnicodeCharacter{00BA}{\textordmasculine} +\DeclareUnicodeCharacter{02C6}{\textasciicircum} +\DeclareUnicodeCharacter{02DC}{\textasciitilde} +\DeclareUnicodeCharacter{200C}{\textcompwordmark} +\DeclareUnicodeCharacter{2026}{\textellipsis} +\DeclareUnicodeCharacter{2122}{\texttrademark} +\DeclareUnicodeCharacter{2423}{\textvisiblespace} +\DeclareUnicodeCharacter{FEFF}{\ifhmode\nobreak\fi} +\endinput +</utf8-2018> +% \end{macrocode} +% +% +% \section{A test document} +% +% Here is a very small test document which may or may not survive +% if the current document is transferred from one place to the +% other. +% \begin{macrocode} +%<*test> +\documentclass{article} + +\usepackage[latin1,utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{trace} + +\scrollmode % to run past the error below + +\begin{document} + + German umlauts in UTF-8: ^^c3^^a4^^c3^^b6^^c3^^bc %%% äöü + +\inputencoding{latin1} % switch to latin1 + + German umlauts in UTF-8 but read by latin1 (and will produce one + error since \verb=\textcurrency= is not provided): + ^^c3^^a4^^c3^^b6^^c3^^bc + +\inputencoding{utf8} % switch back to utf8 + + German umlauts in UTF-8: ^^c3^^a4^^c3^^b6^^c3^^bc + + +Some codes that should produce errors as nothing is set up +for them: ^^c3F ^^e1^^a4^^b6 + +And some that are not legal utf8 sequences: ^^c3X ^^e1XY + +\showoutput +\tracingstats=2 +\stop +%</test> +% \end{macrocode} +% +% \Finale +% +\endinput |