% \iffalse meta-comment % % Copyright (C) 1993-2020 % 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 2008 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} [2020/02/18 v3.1i LaTeX Kernel (NFSS Initialisation)] % \iffalse \documentclass{ltxdoc} \begin{document} \DocInput{ltfssini.dtx} \end{document} % % \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{}} % \changes{v3.1d}{2019/08/27}{Make various commands robust} % % % \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. % % (Actually most are now defined further down in the file.) % % 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} % % % % % \section{Custom series settings for main document families} % % This section was introduced 2020/02/02 and for now we support a % full rollback (may need splitting later). % \changes{v3.1e}{2019/12/17}{Provide custom series settings a la mweights} % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2020/02/02}% % {\DeclareFontSeriesDefault}{Custom series}% % \end{macrocode} % % One problem with the NFSS approach of handling the series axis % turned out to be that (especially with respect to ``boldness'') % different font families implemented different strategies. For % example, with Computer Modern fonts you normally only have % \texttt{bx} whereas most PostScript fonts offered only \texttt{b} % but not \texttt{bx}. As a result \LaTeX's standard setting for % \cs{bfdefault} didn't work with such fonts, but if it got changed % to produce \texttt{b}, then that didn't work with Computer Modern % if the fonts got combined (e.g., using Computer Modern Typewriter % with such fonts). % % The solution back then was to provide substitution rules in the % font \texttt{.fd} such that if a \texttt{bx} series got requested % the \texttt{b} series got used. While this works in that % particular case, it isn't a very % general solution. For example, if you happen to have a font family that % has several weights you may want to typeset the whole document % in a somewhat lighter or darker font but if you then modify % \cs{mddefault} to allow for this, then of course your change only % works with that particular family but not with the typewriter % or sans serif family you also want to use. % % A better solution was provided by the \texttt{mweights} package by % Bob Tennent that offers defaults on the level of the three main % font families in the document: for ``rm'', ``sf'' and ``tt'' so % that font packages could define defaults for the sans serif % document font by providing \cs{bfseries@sf} which then was used % when \cs{bfseries} got executed and the current family was the % \cs{sffamily}. % % \DescribeMacro\DeclareFontSeriesDefault % We now support this concept directly from within \LaTeX{} and for % use in font packages (or the document preamble) we offer % \cs{DeclareSeriesDefault}. This declaration takes three % arguments: % \begin{description} % \item[document family interface:] Can either be \texttt{rm}, % \texttt{sf} or \texttt{tt}. This is optional and if not given the % overall default. % \item[document series interface:] Can be \texttt{md} or % \texttt{bf}. % \item[series value:] This is the value that is going to be used % with the combination is requested. % \end{description} % % For example, \verb=\DeclareFontSeriesDefault[rm]{bf}{sb}= would % use \texttt{sb} (semi-bold) when \cs{rmfamily} \cs{bfseries} is % asked for. % % If used without the optional argument, e.g., % \verb=\DeclareFontSeriesDefault{bf}{b}= then this is like % redefining \cs{bfdefault} or \cs{mddefault}. % % If some family specify defaults aren't given, e.g. if there are % no declarations for, say, \texttt{tt} then the format defaults % of \cs{mddefault} and \cs{bfdefault} are assumed. If those are % later changed this is \emph{not} reflected!\footnote{I see no % easy way to achieve this without compromising compatibility with % existing packages that currently use \textsf{mweights} and directly % define (some) of the \cs{mdseries@..} commands but not others.} % % % % \begin{macro}{\DeclareFontSeriesDefault} % The command to declare font series defaults for the ``rm'', ``sf'' or % ``tt'' family. % \begin{macrocode} \newcommand\DeclareFontSeriesDefault[3][]{% \def\reserved@a{#1}% % \end{macrocode} % No optional argument: set up general default. % \changes{v3.1g}{2020/02/05}{Corrected misspelled csname (gh/264)} % \begin{macrocode} \ifx\reserved@a\@empty \ifcsname #2series\endcsname % supported are % \[md/bf]default \expandafter\def \csname #2default\endcsname{#3}% \else % \end{macrocode} % % \changes{v3.1g}{2020/02/05}{Clarrified error text} % \begin{macrocode} \@latex@error{Wrong syntax for \string\DeclareFontSeriesDefault}% {Mandatory first argument must be 'md' or 'bf'.} \fi % \end{macrocode} % Optional argument given, set up specific default. % \begin{macrocode} \else \ifcsname #2series@#1\endcsname % supported are % \[md/bf]series@[rm/sf/tt] \expandafter\edef \csname #2series@#1\endcsname{#3}% % \end{macrocode} % % If the interface is used we remove the frozen kernel % default. This way, we know that something was explicitly set up % (even if the setup has the same value as the default). % \begin{macrocode} \expandafter\let \csname #2series@#1@kernel\endcsname\@undefined \else \@latex@error{Wrong syntax for \string\DeclareFontSeriesDefault}% {Optional argument must be 'rm', 'sf', or 'tt'. \MessageBreak Mandatory first argument must be 'md' or 'bf'.} \fi \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\mdseries@rm} % \begin{macro}{\mdseries@sf} % \begin{macro}{\mdseries@tt} % \begin{macro}{\bfseries@rm} % \begin{macro}{\bfseries@sf} % \begin{macro}{\bfseries@tt} % We initialize the family specific default at the end of the % format generation. Later on they may get overwritten in the % preamble or a package via \cs{DeclareFontSeriesDefault} (or % possibly directly). % % Conceptual change: The \cs{bfdefault} will be \texttt{b} not % \texttt{bx} because that is what it should be really for nearly % every font except Computer/Latin Modern. % % To account for the fact that by default we typeset in CM or LM we % set up the \cs{bfseries@..} defaults to use \texttt{bx} instead. % % This means that it behaves like before because if the default % fonts are used then \cs{bfseries@rm} etc kick in and make % \cs{textbf} use \texttt{bx}. However, if the font gets changed % then \cs{bfdefault} will get used. % % \begin{macrocode} \def\bfseries@rm{bx} \def\bfseries@sf{bx} \def\bfseries@tt{bx} % \end{macrocode} % % Frozen version of the kernel defaults so we can see if they have changed. % \begin{macrocode} \let\bfseries@rm@kernel\bfseries@rm \let\bfseries@sf@kernel\bfseries@sf \let\bfseries@tt@kernel\bfseries@tt % \end{macrocode} % % The default for the medium series is \texttt{m} and this will be % interpreted as resetting both weight and width. To reset only one % of them the virtual value \texttt{?m} and \texttt{m?} are available. % \begin{macrocode} \def\mdseries@rm{m} \def\mdseries@sf{m} \def\mdseries@tt{m} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\expand@font@defaults} % % The family specific defaults are fully expanded, i.e., they are % defined via \cs{edef} inside \cs{DeclareFontSeriesDefault}. % However, the overall defaults, e.g., \cs{bfdefault} may have been % redefined by the user and thus may not be fully expanded. So to % enable reliable comparison we make expanded versions of % them. That we rerun each time. The alternative would be to only % allow for changes before begin document. % \begin{macrocode} \def\expand@font@defaults{% \edef\rmdef@ult{\rmdefault}% \edef\sfdef@ult{\sfdefault}% \edef\ttdef@ult{\ttdefault}% \edef\bfdef@ult{\bfdefault}% \edef\mddef@ult{\mddefault}% \edef\famdef@ult{\familydefault}% } % \end{macrocode} % % \end{macro} % \begin{macro}{\bfseries} % This document command switches to the bold series. % \begin{macrocode} \DeclareRobustCommand\bfseries{% \not@math@alphabet\bfseries\mathbf % \end{macrocode} % In the original NFSS definition it then called \cs{fontseries} % with the value \cs{bfdefault}. In the new scheme we have more % alternatives and therefore check if the current family % (\cs{f@family}) is the current \cs{rmdef@ult}, \cs{sfdef@ult} or % \cs{ttdef@ult} and the select the correct family default in that case. % \changes{v3.1i}{2020/02/18}{Make the \cs{ifx} selection outside % of \cs{fontseries} argument so that it is not done several times} % \begin{macrocode} \expand@font@defaults \ifx\f@family\rmdef@ult \fontseries\bfseries@rm \else\ifx\f@family\sfdef@ult \fontseries\bfseries@sf \else\ifx\f@family\ttdef@ult \fontseries\bfseries@tt % \end{macrocode} % If not \cs{bfdefault} is used. % \begin{macrocode} \else \fontseries\bfdefault \fi\fi\fi \selectfont } % \end{macrocode} % \end{macro} % \begin{macro}{\mdseries} % This document command switches to the medium series. % \changes{v3.1i}{2020/02/18}{Make the \cs{ifx} selection outside % of \cs{fontseries} argument so that it is not done several times} % \begin{macrocode} \DeclareRobustCommand\mdseries{% \not@math@alphabet\mdseries\relax \expand@font@defaults \ifx\f@family\rmdef@ult \fontseries\mdseries@rm \else\ifx\f@family\sfdef@ult \fontseries\mdseries@sf \else\ifx\f@family\ttdef@ult \fontseries\mdseries@tt \else \fontseries\mddefault \fi\fi\fi \selectfont } % \end{macrocode} % \end{macro} % \begin{macro}{\rmfamily} % Here are the document level commands for changing the main font % families, or rather, here is a documented outline of the code, % the actual code is then streamlined and somewhat generalized. %\begin{verbatim} %\DeclareRobustCommand\rmfamily{% % \not@math@alphabet\rmfamily\mathrm %\end{verbatim} % If families are changed then we have to do a bit more work. % In the original NFSS implementation % a family change kept encoding, series shape and size unchanged % but now we can't any % longer simply reuse the current series value. Instead we may have % to change it from one family default to the next. %\begin{verbatim} % \expand@font@defaults %\end{verbatim} % We have to do the testing while the current family is still % unchanged but we have to do the adjustment of the series after it % got changed (because the new family might has different sets % ofshapes available and we certainly don't want to see % substituation going on. So we use \cs{target@series@value} to % hold the target series (if any). %\begin{verbatim} % \let\target@series@value\@empty %\end{verbatim} % Thus, if the current family is the sans family %\begin{verbatim} % \ifx\f@family\sfdef@ult %\end{verbatim} % and if we using the medium series of the sans family %\begin{verbatim} % \ifx\f@series\mdseries@sf %\end{verbatim} % then lets switch to the medium series for the serif family %\begin{verbatim} % \let\target@series@value\mdseries@rm %\end{verbatim} % and if we use the bold series of the sans family switch to the % bold default of the serif family: %\begin{verbatim} % \else\ifx\f@series\bfseries@sf \let\target@series@value\bfseries@rm %\end{verbatim} % However, the sans family may not have any specific defaults set, % so we also compare with the overall defaults. %\begin{verbatim} % \else\ifx\f@series\mddef@ult \let\target@series@value\mdseries@rm % \else\ifx\f@series\bfdef@ult \let\target@series@value\bfseries@rm %\end{verbatim} % If neither test was true we leave the series alone. This way a % special manual setting such as \verb=\fontseries{lc}= is not % undone if the family changes (of course there may not be any % support for it in the new family but then the NFSS % substitution kicks in and sorts it out). %\begin{verbatim} % \fi\fi\fi\fi % %\end{verbatim} % We need to do the same if the current family is the typewriter family: %\begin{verbatim} % \else\ifx\f@family\ttdef@ult % \ifx\f@series\mdseries@tt \let\target@series@value\mdseries@rm % \else\ifx\f@series\bfseries@tt \let\target@series@value\bfseries@rm % \else\ifx\f@series\mddef@ult \let\target@series@value\mdseries@rm % \else\ifx\f@series\bfdef@ult \let\target@series@value\bfseries@rm % \fi\fi\fi\fi % \fi\fi %\end{verbatim} % With these preparations for series out of the way we can now % change the font family to \cs{rmdefault}. %\begin{verbatim} % \fontfamily\rmdefault %\end{verbatim} % % If \cs{target@series@value} is still empty there is nothing more % to do other than selecting the new family. However, if not then % we should update the font series now as well. But there is one % further subtle issue. We may not have loaded an \texttt{.fd} file % for our target font family yet. In the past that was done in % \cs{selectfont} if necessary but since we are now doing all the % comparisons in \cs{fontseries} we need to make sure that the font % family specifications are already loaded prior to calling % \cs{fontseries}. %\begin{verbatim} % \ifx\target@series@value\@empty \else % \maybe@load@fontshape %\end{verbatim} % Updating the series in this case means directly changing % \cs{f@series} to the target value. We don't want to go through % \cs{fontseries} because that would apply the mappings and then % \texttt{bx + b} would keep \texttt{bx} instead of changing to % \texttt{b} as desired. % as %\begin{verbatim} % \let\f@series\target@series@value % \fi % \selectfont} %\end{verbatim} % % So now for the real definition: most of the code above gets % delegated to a helper command \cs{prepare@family@series@update} % so that the definition becomes again fairly short. In addition we % add a hook, mainly for our Japanese friends so that the code can % be extended prior to the call to \cs{selectfont}. % % \changes{v3.1f}{2020/01/11}{Streamlined implementation with hook} % \begin{macrocode} \DeclareRobustCommand\rmfamily{% \not@math@alphabet\rmfamily\mathrm % \end{macrocode} % This holds all the code discussed above, first argument is the % meta family, i.e., \texttt{rm} in this case, and second argument % is the default family name, e.g., \texttt{cmr} indirectly % accessed via \cs{rmdefault}. This is calling \cs{fontfamily} and % if necessary \cs{fontseries} as outline above. % \begin{macrocode} \prepare@family@series@update{rm}\rmdefault % \end{macrocode} % Then comes the hook code (by default a no-op) and finally the call % to \cs{selectfont}. % \begin{macrocode} \@rmfamilyhook \selectfont} % \end{macrocode} % % \begin{macro}{\sffamily} % \begin{macro}{\ttfamily} % The definitions for \cs{sffamily} and \cs{ttfamily} are similar, % the differences are only in what font families get checked. % \changes{v3.1f}{2020/01/11}{Streamlined implementation with hook} % \begin{macrocode} \DeclareRobustCommand\sffamily{% \not@math@alphabet\sffamily\mathsf \prepare@family@series@update{sf}\sfdefault \@sffamilyhook \selectfont} % \end{macrocode} % % \changes{v3.1f}{2020/01/11}{Streamlined implementation with hook} % \begin{macrocode} \DeclareRobustCommand\ttfamily{% \not@math@alphabet\ttfamily\mathtt \prepare@family@series@update{tt}\ttdefault \@ttfamilyhook \selectfont} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\@rmfamilyhook} % \begin{macro}{\@sffamilyhook} % \begin{macro}{\@ttfamilyhook} % By default the hooks do nothing. % \begin{macrocode} \let\@rmfamilyhook\@empty \let\@sffamilyhook\@empty \let\@ttfamilyhook\@empty % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % % % % \begin{macro}{\series@change@debug} % For debugging, but right now none of this code is extracted. The % idea is to have a separate package with debugging code % one day. % \begin{macrocode} %<*debug> \let\series@change@debug\typeout \let\series@change@debug\@gobble % % \end{macrocode} % \end{macro} % % % % % \begin{macro}{\prepare@family@series@update} % This is core command that prepares for the family update. The big % difference to the documented code above is that the nested % \cs{ifx} statements seem to be missing. Instead we loop through % an internal list that holds the names of the three meta % families. This approach allows us to extend the mechanism at a % later stage to allow for additional named meta families. % % \begin{macro}{\@meta@family@list} % Here is the current definition of that list: % \begin{macrocode} \def\@meta@family@list{\@elt{rm}\@elt{sf}\@elt{tt}} % \end{macrocode} % \end{macro} % % \begin{macrocode} \def\prepare@family@series@update#1#2{% % \end{macrocode} % % \changes{v3.1i}{2020/02/18}{No series auto-update when forced (gh/277)} % \begin{macrocode} \if@forced@series %<+debug> \series@change@debug{No series preparation (forced \f@series)\on@line}% \fontfamily#2% \else %<+debug> \series@change@debug{Prepearing for switching to #1 (#2)\on@line}% \expand@font@defaults % \end{macrocode} % We prepare for changing the current series. We have to find it % before changing the family as discussed above. % \begin{macrocode} \let\target@series@value\@empty \def\target@meta@family@value{#1}% % \end{macrocode} % As the very last item in the meta family list we add % \verb=\@elt{??}= and define this pseudo meta family to be the % current font family. So if none of the real meta families matched then % this will match. This will cover the following case: % \begin{itemize} % \item \cs{bfseries} is called for a family using \texttt{bx} % (e.g., CMR) % \item Switch to a font family that is none of the the meta % families, e.g., via \verb=\fontfamily{ptm}\selectfont= % \item Then none of the real meta families, match but the final % \verb=\@elt{??}= will. % \item Therefore if the current series is \cs{mddefault} or % \cs{bfdefault} it will be detected and the corresponding target % series selected. % \end{itemize} % \changes{v3.1i}{2020/02/18}{Recognize current family if it is not a % ``meta'' family and auto-update series using \cs{bfdefault} (gh/277)} % \begin{macrocode} \expandafter\edef\csname ??def@ult\endcsname{\f@family}% % \end{macrocode} % To find it we loop over the meta family list with a suitable % definition of \cs{@elt}. % \begin{macrocode} \let\@elt\update@series@target@value \@meta@family@list % \end{macrocode} % Last resort pseudo meta family. Will only be looked at f none of % the real ones have matched. % \begin{macrocode} \@elt{??}% \let\@elt\relax % \end{macrocode} % That will figure out the correct series value to use without updating % it. Now we can change the family. % \begin{macrocode} \fontfamily#2% % \end{macrocode} % After that we update the series. That code is again like the one % above. % \begin{macrocode} \ifx\target@series@value\@empty %<+debug> \series@change@debug{Target series still empty ...}% \else \ifx \f@series\target@series@value %<+debug> \series@change@debug{Target series unchanged: %<+debug> \f@series \space = \target@series@value}% \else \maybe@load@fontshape %<+debug> \series@change@debug{Target series: %<+debug> \f@series \space -> \target@series@value}% \let\f@series\target@series@value \fi \fi \fi } % \end{macrocode} % \end{macro} % % % % \begin{macro}{\update@series@target@value} % In this macro used in the look you basically find the nested % \cs{ifx}s from the outline above. The only difference is that is % it is parameterized instead of being written out and only for one % block of tests because the code is called reatedly when looping % over the meta family list. From the list we get each meta family % name in turn. % \begin{macrocode} \def\update@series@target@value#1{% % \end{macrocode} % There is one additional test at the beginning, because the list % contains all meta families and we need to ignore the case where % current one from the list and target one are identical. % \begin{macrocode} \def\reserved@a{#1}% \ifx\target@meta@family@value\reserved@a % rm -> rm do nothing \else %<+debug> \series@change@debug{Trying to match #1: \csname#1def@ult\endcsname %<+debug> \space = \f@family\space ?}% % \end{macrocode} % We only ``do'' something if the current font family matches the % current meta family. % \begin{macrocode} \expandafter\ifx\csname#1def@ult\endcsname\f@family % \end{macrocode} % If that's the case we know that this is the block that applies % (only one meta family can match). So to speed things up we % change \cs{@elt} so that the rest of the loop gets gobbled. % \begin{macrocode} \let\@elt\@gobble % \end{macrocode} % Then we try to find the right new value for the series (as % explained above). The two macros defined first are only there % because we now need to use \cs{csname} and this way the code will % be a little faster. % \begin{macrocode} \expandafter\let\expandafter\reserved@b \csname mdseries@\target@meta@family@value\endcsname \expandafter\let\expandafter\reserved@c \csname bfseries@\target@meta@family@value\endcsname %<+debug>\series@change@debug{Targets for mdseries and bfseries: %<+debug> \reserved@b\space and \reserved@c}% % \end{macrocode} % This here is now identical to the nested \cs{ifx} block from the % outline, except that it there appeared twice in % \cs{rmfamily}. This is now covered by looping and stopping the % loop when a match was found. % \begin{macrocode} \expandafter\ifx\csname mdseries@#1\endcsname\f@series %<+debug> \series@change@debug{mdseries@#1 matched -> \reserved@b}% \let\target@series@value\reserved@b \else\expandafter\ifx\csname bfseries@#1\endcsname\f@series %<+debug> \series@change@debug{bfseries@#1 matched -> \reserved@c}% \let\target@series@value\reserved@c \else\ifx\f@series\mddef@ult \let\target@series@value\reserved@b %<+debug> \series@change@debug{mddef@ult matched -> \reserved@b}% \else\ifx\f@series\bfdef@ult \let\target@series@value\reserved@c %<+debug> \series@change@debug{bfdef@ult matched -> \reserved@c}% \fi\fi\fi\fi \fi \fi } % \end{macrocode} % \end{macro} % % % % % % \begin{macro}{\init@series@setup} % This is code to be run at begin document \ldots % \begin{macrocode} \def\init@series@setup{% % \end{macrocode} % % We only want \texttt{bx} in \cs{bfseries@rm} if the roman font is % Computer Modern or Latin Modern, otherwise it should be % \texttt{b}. It was set to \texttt{bx} in the kernel so that any % font use with the default families in the preamble get this % value. Now at the real document start we check if the fonts have % been changed. If there was a \cs{DeclareFontSeriesDefault} % declaration or \cs{bfseries@rm} was directly altered then it % differs from \cs{bfseries@rm@kernel} and we do nothing. % Otherwise we check if \cs{rmdefault} is one of the CM/LM font % families and if so we keep \texttt{bx} otherwise we change it to % \texttt{b}. % % This approach doesn't cover one case: CM/LM got changed to a % different family that supports \texttt{bx}, but the support % package for that family used \verb=\def\bfseries@rm{bx}= instead % of using \cs{DeclareFontSeriesDefault}. In that case the code % here changes it to \texttt{b}. Solution: use the % \cs{DeclareFontSeriesDefault} interface. % \begin{macrocode} \ifx\bfseries@rm@kernel\bfseries@rm \expandafter\in@\expandafter{\rmdefault}{cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}% \ifin@ \else \def\bfseries@rm{b}\fi\fi % \end{macrocode} % Same approach for \cs{bfseries@sf} and \cs{bfseries@tt}: % \begin{macrocode} \ifx\bfseries@sf@kernel\bfseries@sf \expandafter\in@\expandafter{\sfdefault}{cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}% \ifin@ \else \def\bfseries@sf{b}\fi\fi \ifx\bfseries@tt@kernel\bfseries@tt \expandafter\in@\expandafter{\ttdefault}{cmr,cmss,cmtt,lcmss,lcmtt,lmr,lmss,lmtt}% \ifin@ \else \def\bfseries@tt{b}\fi\fi % \end{macrocode} % % If the document preamble has changed the \cs{familydefault} or if % the if the \cs{rmdefault} contains a new font family, we have to % adjust the series defaults accordingly, before starting % typesetting. % % On the other hand if we still typeset in CM or LM then % \cs{bfdefault} is wrong since it is now saying \texttt{b} and not % \texttt{bx}. % To fix this we run \cs{rmfamily}, \cs{sffamily} or % \cs{ttfamily} depending on the situation and this will correct % the setup for us. % \begin{macrocode} \expand@font@defaults \ifx\famdef@ult\rmdef@ult \rmfamily \else\ifx\famdef@ult\sfdef@ult \sffamily \else\ifx\famdef@ult\ttdef@ult \ttfamily \fi\fi\fi }% % \end{macrocode} % \end{macro} % % % % As the kernel code now implements the same functionality as % \textsf{mweights}, albeit internally coded slightly differently, % that package shouldn't be loaded any more. We therefore pretend % that it already got loaded. Thus, a font package that tries to % load it and then sets \cs{mdseries@..}, etc.\ will continue to % work but will now use the kernel code. % % Of course, mid-term such package should probably use % \cs{DeclareFontSeriesDefault} instead of making using low-level % definitions. % % \begin{macrocode} \expandafter\let\csname ver@mweights.sty\endcsname\fmtversion % \end{macrocode} % % % % \begin{macrocode} % %\EndIncludeInRelease %\IncludeInRelease{0000/00/00}% % {\DeclareFontSeriesDefault}{Custom series}% % %\let\DeclareFontSeriesDefault\@undefined %\let\bfseries@rm\@undefined %\let\bfseries@sf\@undefined %\let\bfseries@tt\@undefined %\let\bfseries@rm@kernel\@undefined %\let\bfseries@sf@kernel\@undefined %\let\bfseries@tt@kernel\@undefined %\let\mdseries@rm\@undefined %\let\mdseries@sf\@undefined %\let\mdseries@tt\@undefined %\let\expand@font@defaults\@undefined %\expandafter\let\csname ver@mweights.sty\endcsname\@undefined % %\DeclareRobustCommand\bfseries % {\not@math@alphabet\bfseries\mathbf % \fontseries\bfdefault\selectfont} %\DeclareRobustCommand\mdseries % {\not@math@alphabet\mdseries\relax % \fontseries\mddefault\selectfont} %\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} % %\let\@rmfamilyhook\@undefined %\let\@sffamilyhook\@undefined %\let\@ttfamilyhook\@undefined %\let\@meta@family@list\@undefined %\let\prepare@family@series@update\@undefined %\let\update@series@target@value\@undefined % % \end{macrocode} % This is always called in \cs{document} so don't make it undefined. % \begin{macrocode} %\let\init@series@setup\relax % %\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % % % % \section{Supporting nested emphasis} % % By default \LaTeXe{} supports two levels of nested emphasis: if % the current font has an upright shape then it switches to % \cs{itshape} otherwise to \cs{eminnershape} (which defaults to % \cs{upshape}). This means nested emphasis will ocssilate between % italic and upright shapes. % % Sometimes it would be nice to allow for a more lengthly sequence, % but instead of providing a fixed one \LaTeX{} now offers a % general mechanism that allows to define arbitrary sequences. % % \DescribeMacro\DeclareEmphSequence % \DescribeMacro\emforce % % This declaration expects a comma separated list of (font) change % declarations corresponding to increasing levels of emphasis. % The mechanism tries to be ``smart'' and verifies that the % declarations actually alter the font. If not it will ignore this % level and tries the next one---the assumption being that % there was a manual font change in the document to the font that % is now supposed to be used for emphasis. Of course, this only % works if the declarations in the list actually change the font % and not, say, just the color. % In such a case one has to use \cs{emforce} to which directs the % mechanism to use the level even if the font attributes haven't changed. % % \DescribeMacro\emreset % If the nesting is so deep, that the specified levels are % exhausted then \cs{emreset} is used as a final set of % declarations (which by default returns % back to the upright shape). Any additional nesting levels will % then reuse the list from its beginning. % % % % \begin{macro}{\DeclareEmphSequence} % % \cs{DeclareEmphSequence} expects a clist of declaration. Spaces in the % argument are dropped to avoid surious spaces in the output. The % declarations are additive. At the very end the shape is reset % using |\emreset| and |\emforce| so that this case is never % skipped.\footnote{Maybe we should not add \cs{emforce} but allow % that case to be skipped as well. Of course, that might result in % an endless loop if somebody defines a sequence without any font % change and without \cs{emforce} but \ldots} % Further nested calls restart at the beginning. % \changes{v3.1e}{2019/12/17}{Provide \cs{emph} sequences} % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2020/02/02}% % {\DeclareEmphSequence}{Nested emph}% \def\DeclareEmphSequence#1{% \protected@edef\emfontdeclare@clist{\zap@space#1, \@empty\emforce\emreset}% } % \end{macrocode} % By default the it is empty, in which case \cs{eminnershape} is % used by \LaTeX. % \begin{macrocode} \let\emfontdeclare@clist\@empty % \end{macrocode} % \end{macro} % \begin{macro}{\emrest} % Reset the font to upright and upper/lower case. With the default rules % using \cs{shapedefault} does that for us but to be on the safe side we % do it like this: % \begin{macrocode} \DeclareRobustCommand\emreset{\upshape\ulcshape} % \end{macrocode} % \end{macro} % \begin{macro}{\em} % The new definition for \cs{em} (and implicitly \cs{emph} is like % it was before if \cs{emfontdeclare@clist} is empty. % \begin{macrocode} \DeclareRobustCommand\em{% \@nomath\em \ifx\emfontdeclare@clist\@empty \ifdim \fontdimen\@ne\font >\z@ \eminnershape \else \itshape \fi \else % \end{macrocode} % But if not we use the list to decide how to do emphasis. % % We use the current font to check if the declarations have any % effect, so even a size change is allowed and identified as a % modification (but a color change, for example, isn't). So first % we save the current status. % \begin{macrocode} \edef\em@currfont{\csname\curr@fontshape/\f@size\endcsname}% % \end{macrocode} % Then we grab the next element from the list and check if it can % be used. % \begin{macrocode} \expandafter\do@emfont@update\emfontdeclare@clist\do@emfont@update \fi } % \end{macrocode} % % \begin{macrocode} \def\eminnershape{\upshape} % \end{macrocode} % \end{macro} % % % % \begin{macro}{\do@emfont@update} % We know that the list (if not empty) has at least 2 elements % separated by a comma, so we pick up the first in \texttt{\#1} and % the rest in \texttt{\#2}. % \begin{macrocode} \def\do@emfont@update#1,#2\do@emfont@update{% % \end{macrocode} % First action is to alter the list and move the first entry to the end % \begin{macrocode} \def\emfontdeclare@clist{#2,#1}% % \end{macrocode} % Then we execute current declaration. Appending |\selectfont| means one % can write just |\fontshape{it}}| and that works then too. % \begin{macrocode} % \typeout{Use: \detokenize{#1}}% #1\selectfont % \end{macrocode} % We then compare the current font with our saved version, but with % a slight twist: we add \cs{em@force} at the end of the % name. Normally this is empty so has no effect but if there was an % \cs{emforce} as part of \texttt{\#1} it will append a |/| to the % font name (making it invalid) thus this will then always fail the % test. % % If the test fails we are done and the declarations will be used. % Otherwise we will try the next declaration in the sequence. % \begin{macrocode} \expandafter\ifx\csname \curr@fontshape/\f@size\em@force % \end{macrocode} % For the comparison with \cs{ifx} we have to exand % \cs{em@currfont} once as the relevant info is inside. % \begin{macrocode} \expandafter\endcsname \em@currfont \expandafter\do@emfont@update\emfontdeclare@clist\do@emfont@update % \end{macrocode} % If \cs{emforce} was used, we have to undo its effect: % \begin{macrocode} \else \let\em@force\@empty \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\emforce} % \begin{macro}{\em@force} % The definition of \cs{emforce} is simple: change \cs{em@force} to % make the above test always invalid. % \begin{macrocode} \protected\def\emforce{\def\em@force{/}} \let\em@force\@empty % %\EndIncludeInRelease % \end{macrocode} % \end{macro} % \end{macro} % % \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)} % % These are the older definitions for \cs{em}, prior to 2020. % % 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} %\IncludeInRelease{2015/01/01}{\DeclareEmphSequence}{Nested emph}% %\let\DeclareEmphSequence\@undefined %\let\emfontdeclare@clist\@undefined %\let\emreset\@undefined %\let\do@emfont@update\@undefined %\let\emforce\@undefined %\let\em@force\@undefined % %\DeclareRobustCommand\em % {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ % \eminnershape \else \itshape \fi}% %\EndIncludeInRelease % %\IncludeInRelease{0000/00/00}{\DeclareEmphSequence}{Nested emph}% %\DeclareRobustCommand\em % {\@nomath\em \ifdim \fontdimen\@ne\font >\z@ % \upshape \else \itshape \fi}% %\let\eminnershape\@undefined %\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} \DeclareRobustCommand\boldmath{\@nomath\boldmath \mathversion{bold}} \DeclareRobustCommand\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}} % \end{macrocode} % % \begin{macrocode} \DeclareRobustCommand\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}} % % \end{macrocode} % \end{macro} % \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} % \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.} % \changes{v3.1h}{2020/02/10}{Add \cs{@defaultfamilyhook} to \cs{normalfont} (gh/269)} % \begin{macrocode} % %<*2ekernel|latexrelease> %\IncludeInRelease{2020/02/02}% % {\normalfont}{Add hook to \normalfont}% \DeclareRobustCommand\normalfont{% % \end{macrocode} % Instead of calling \cs{usefont}, as it was done in the past, we % inline the code from \cs{usefont} as we want to add the hook % before \cs{selectfont}, but after all the font attributes are set. % \begin{macrocode} \fontencoding\encodingdefault \edef\f@family{\familydefault}% \edef\f@series{\seriesdefault}% \edef\f@shape{\shapedefault}% % \end{macrocode} % % \begin{macrocode} \@defaultfamilyhook \selectfont} % \end{macrocode} % % \begin{macrocode} \let\reset@font\normalfont % \end{macrocode} % \end{macro} % \end{macro} % % % \begin{macro}{\@defaultfamilyhook} % By default the hooks do nothing. % \changes{v3.1h}{2020/02/10}{Add \cs{@defaultfamilyhook} to \cs{normalfont} (gh/269)} % \begin{macrocode} \let\@defaultfamilyhook\@empty % \end{macrocode} % \end{macro} % % \begin{macrocode} % %\EndIncludeInRelease %\IncludeInRelease{0000/00/00}% % {\normalfont}{Add hook to \normalfont}% % %\DeclareRobustCommand\normalfont % {\usefont\encodingdefault % \familydefault % \seriesdefault % \shapedefault % \relax} %\let\reset@font\normalfont % %\let\@defaultfamilyhook\@undefined % %\EndIncludeInRelease %<*2ekernel> % \end{macrocode} % % % % 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} % % % The initial \texttt{fontenc} package load list. This will get % overwritten in \texttt{fonttext} and is only provided in case an % old \texttt{fonttext.cfg} does not define the command: % \changes{v3.1h}{2020/02/11}{Provide default value for % \cs{@fontenc@load@list} (gh/273)} % \begin{macrocode} \def\@fontenc@load@list{\@elt{T1,OT1}} % \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} % % \end{macrocode} % % \Finale %