diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/breqn/mathstyle.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/breqn/mathstyle.dtx')
-rw-r--r-- | macros/latex/contrib/breqn/mathstyle.dtx | 542 |
1 files changed, 542 insertions, 0 deletions
diff --git a/macros/latex/contrib/breqn/mathstyle.dtx b/macros/latex/contrib/breqn/mathstyle.dtx new file mode 100644 index 0000000000..cc99d8b842 --- /dev/null +++ b/macros/latex/contrib/breqn/mathstyle.dtx @@ -0,0 +1,542 @@ +% \iffalse meta-comment +% +% Copyright (C) 1997-2003 by Michael J. Downes +% Copyright (C) 2007-2008 by Morten Hoegholm +% Copyright (C) 2007-2014 by Lars Madsen +% Copyright (C) 2007-2017 by Will Robertson +% Copyright (C) 2010-2017 by Joseph Wright +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3 of this license or (at your option) any later +% version. The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of +% LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% The Current Maintainer of this work is Will Robertson. +% +% This work consists of the main source file mathstyle.dtx +% and the derived files +% mathstyle.sty, mathstyle.pdf, mathstyle.ins, mathstyle.drv. +% +% Distribution: +% CTAN:macros/latex/contrib/mh/mathstyle.dtx +% CTAN:macros/latex/contrib/mh/mathstyle.pdf +% +% Unpacking: +% (a) If mathstyle.ins is present: +% tex mathstyle.ins +% (b) Without mathstyle.ins: +% tex mathstyle.dtx +% (c) If you insist on using LaTeX +% latex \let\install=y\input{mathstyle.dtx} +% (quote the arguments according to the demands of your shell) +% +% Documentation: +% The class ltxdoc loads the configuration file ltxdoc.cfg +% if available. Here you can specify further options, e.g. +% use A4 as paper format: +% \PassOptionsToClass{a4paper}{article} +% +% Programm calls to get the documentation (example): +% pdflatex mathstyle.dtx +% makeindex -s gind.ist mathstyle.idx +% pdflatex mathstyle.dtx +% makeindex -s gind.ist mathstyle.idx +% pdflatex mathstyle.dtx +% +% Installation: +% TDS:tex/latex/breqn/mathstyle.sty +% TDS:doc/latex/breqn/mathstyle.pdf +% TDS:source/latex/breqn/mathstyle.dtx +% +%<*ignore> +\begingroup + \def\x{LaTeX2e} +\expandafter\endgroup +\ifcase 0\ifx\install y1\fi\expandafter + \ifx\csname processbatchFile\endcsname\relax\else1\fi + \ifx\fmtname\x\else 1\fi\relax +\else\csname fi\endcsname +%</ignore> +%<*install> +\input docstrip.tex +\Msg{************************************************************************} +\Msg{* Installation for package: mathstyle} +\Msg{************************************************************************} + +\keepsilent +\askforoverwritefalse + +\preamble + +This is a generated file. + +Copyright (C) 1997-2003 by Michael J. Downes +Copyright (C) 2007-2011 by Morten Hoegholm et al +Copyright (C) 2007-2014 by Lars Madsen +Copyright (C) 2007-2017 by Will Robertson +Copyright (C) 2010-2017 by Joseph Wright + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3 of this license or (at your option) any later +version. The latest version of this license is in + http://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of +LaTeX version 2005/12/01 or later. + +This work has the LPPL maintenance status "maintained". + +The Current Maintainer of this work is Will Robertson. + +This work consists of the main source file mathstyle.dtx +and the derived files + mathstyle.sty, mathstyle.pdf, mathstyle.ins. + +\endpreamble + +\generate{% + \file{mathstyle.ins}{\from{mathstyle.dtx}{install}}% + \usedir{tex/latex/breqn}% + \file{mathstyle.sty}{\from{mathstyle.dtx}{package}}% +} + +\obeyspaces +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file into a directory searched by TeX:} +\Msg{*} +\Msg{* mathstyle.sty} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% +%<*driver> +\ProvidesFile{mathstyle.drv} +%</driver> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{mathstyle} +%<*package|driver> + [2017/01/27 0.98e Tracking mathstyle implicitly] +%</package|driver> +%<*driver> +\documentclass{ltxdoc} +\CodelineIndex +\EnableCrossrefs +\setcounter{IndexColumns}{2} +\providecommand*\pkg[1]{\textsf{#1}} +\begin{document} + \DocInput{mathstyle.dtx} +\end{document} +%</driver> +% \fi +% +% \GetFileInfo{mathstyle.drv} +% \title{The \textsf{mathstyle} package} +% \date{\filedate\quad\fileversion} +% \author{Authors: Michael J. Downes, Morten H\o gholm\\ Maintained by Morten H\o gholm, Will Robertson\\ Feedback: \texttt{https://github.com/wspr/breqn/issues}} +% +% +% \maketitle +% +% \part*{User's guide} +% +% This package exists for two reasons: +% \begin{itemize} +% \item The primitive operations for creating a super- or subscript in +% \TeX\ work almost as if \verb|^| and \verb|_| are macros taking an +% argument. However, that is not quite the case, and +% some things that you'd expect to work don't (e.g., \verb|^\cong|) +% whereas others which you'd think shouldn't work actually +% do (such as |^\mathsf{s}|). We do everyone a favor if it behaves +% consistently, i.e., if the superscript and subscript operations +% act as if they are macros taking exactly one argument. +% +% \item Because the \TeX\ math typesetting engine uses infix notation +% for fractions, one has to use \cs{mathchoice} or \cs{mathpalette} +% whenever trying to do anything requiring boxing or measuring +% math. This creates problems for loading fonts on demand as the +% font loading mechanism has to load fonts for all styles without +% even knowing if the font is going to be used. Getting the timing +% of \cs{mathchoice} right can be tricky as well. Since \LaTeX\ does +% not promote the primitive infix notation, this package keeps track +% of a current mathstyle parameter. +% \end{itemize} +% +% +% \section{Some usage tips} +% +% If you want to use this package with \pkg{amsmath}, it is important +% \pkg{mathstyle} is loaded \emph{after} \pkg{amsmath}. +% +% The current mathstyle is stored in the variable \cs{mathstyle}. The +% command \cs{currentmathstyle} can be used to switch to the mode +% currently active. Below is shown how the macro \cs{mathrlap} from +% \pkg{mathtools} is implemented without knowing about the current +% mathstyle using \cs{mathpalette}. +% \begin{verbatim} +% \providecommand*\mathrlap[1][]{% +% \ifx\@empty#1\@empty +% \expandafter \mathpalette \expandafter \@mathrlap +% \else +% \expandafter \@mathrlap \expandafter #1% +% \fi} +% \providecommand*\@mathrlap #1#2{{}\rlap{$\m@th#1{#2}$}} +% \end{verbatim} +% The same definition using \cs{currentmathstyle} from this package. +% \begin{verbatim} +% \providecommand*\mathrlap[2][]{% +% #1 {}\rlap{$\m@th \currentmathstyle {#2}$}} +% \end{verbatim} +% +% \subsection{Package options} +% +% This package has one set of options affecting the \verb|_| and \verb|^| characters: +% +% \begin{itemize} +% \item\verb|\usepackage[mathactivechars]{mathstyle}| +% +% This is the default behaviour. Here, \verb|_| and \verb|^| are made into harmless +% characters in text mode and behave as expected (for entering sub/superscript) when +% inside math mode. +% Certain code that assumes the catcodes of these characters may get confused about +% this; see below for a possible fix. +% +% \item\verb|\usepackage[activechars]{mathstyle}| +% +% With this option, \verb|_| and \verb|^| are made into active characters for +% entering sub/superscript mode in all cases---therefore, in text mode they will +% produce a regular error (`Missing \$ inserted') indicating they are being used +% out of place. +% +% \item\verb|\usepackage[noactivechars]{mathstyle}| +% +% This is the option most like to solve any compatibility problems. Here, +% \verb|_| and \verb|^| retain their regular catcodes at all times and behave +% in their default fashion. \textbf{However}, certain other features of this +% package (such as \cs{currentmathstyle} inside a subscript) will then fail +% to work, so only use this option as a last resort. +% \end{itemize} +% +% \StopEventually{} +% \part*{Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macro}{\@saveprimitive} +% A straight copy from \pkg{breqn}, see implementation details +% there. Of course, with a recent pdf\TeX\ (v1.40+), one can just +% use \cs{primitive} to get the original. We will implement that +% some day. +% \begin{macrocode} +\providecommand\@saveprimitive[2]{% + \begingroup + \edef\@tempa{\string#1}\edef\@tempb{\meaning#1}% + \ifx\@tempa\@tempb \global\let#2#1% + \else + \edef\@tempb{\meaning#2}% + \ifx\@tempa\@tempb + \else \@saveprimitive@a#1#2% + \fi + \fi + \endgroup +} +\providecommand\@saveprimitive@a[2]{% + \begingroup + \def\@tempb##1#1##2{\edef\@tempb{##2}\@car{}}% + \@tempb\nullfont{select font nullfont}% + \topmark{\string\topmark:}% + \firstmark{\string\firstmark:}% + \botmark{\string\botmark:}% + \splitfirstmark{\string\splitfirstmark:}% + \splitbotmark{\string\splitbotmark:}% + #1{\string#1}% + \@nil % for the \@car + \edef\@tempa{\expandafter\strip@prefix\meaning\@tempb}% + \edef\@tempb{\meaning#1}% + \ifx\@tempa\@tempb \global\let#2#1% + \else + \PackageError{mathstyle}% + {Unable to properly define \string#2; primitive + \noexpand#1no longer primitive}\@eha + \fi + \fi + \endgroup +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\everydisplay} +% We need to keep track of whether we're in inline or display maths, and the only +% way to do that is to add a switch inside \verb|\everydisplay|. +% We act sensibly and preserve any of the previous contents of that token register +% before adding our own code here. As we'll see in a second, Lua\TeX{} +% provides a native mechanism for this so we don't need any action in that +% case. (Various other parts of the code also need to have different paths +% for Lua\TeX{} use.) +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname directlua\endcsname\relax + \everydisplay=\expandafter{\the\everydisplay\chardef\mathstyle\z@} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mathstyle} +% A counter for the math style: 0--display, 2--text, 4--script, 6--scriptscript. +% The logic is that display maths will explicitly +% set \verb|\mathstyle| to zero (see above), so by default it is set to the +% `text' maths style. With Lua\TeX{} there is a primitive to do the same +% so it just has to be enabled. Note that in all cases we use Lua\TeX{}-like +% numbering for the states. +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname directlua\endcsname\relax + \chardef\mathstyle\@ne +\else + \directlua{tex.enableprimitives("", {"mathstyle"})} +\fi +% \end{macrocode} +% \end{macro} +% +% Save the four style changing primitives, \cs{mathchoice} and the +% fraction commands. +% \begin{macrocode} +\@saveprimitive\displaystyle\@@displaystyle +\@saveprimitive\textstyle\@@textstyle +\@saveprimitive\scriptstyle\@@scriptstyle +\@saveprimitive\scriptscriptstyle\@@scriptscriptstyle +\@saveprimitive\mathchoice\@@mathchoice +\@saveprimitive\over\@@over +\@saveprimitive\atop\@@atop +\@saveprimitive\above\@@above +\@saveprimitive\overwithdelims\@@overwithdelims +\@saveprimitive\atopwithdelims\@@atopwithdelims +\@saveprimitive\abovewithdelims\@@abovewithdelims +% \end{macrocode} +% Then we redeclare the four style changing primitives: set the value of +% \cs{mathstyle} if Lua\TeX{} is not in use.q +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname directlua\endcsname\relax + \DeclareRobustCommand{\displaystyle}{% + \@@displaystyle \chardef\mathstyle\z@} + \DeclareRobustCommand{\textstyle}{% + \@@textstyle \chardef\mathstyle\tw@} + \DeclareRobustCommand{\scriptstyle}{% + \@@scriptstyle \chardef\mathstyle4 } + \DeclareRobustCommand{\scriptscriptstyle}{% + \@@scriptscriptstyle \chardef\mathstyle6 } +\fi +% \end{macrocode} +% First we get the primitive operations. These should have been +% control sequences in \TeX\ just like operations for begin math, end +% math, begin display, end display. +% \begin{macrocode} +\begingroup \catcode`\^=7\relax \catcode`\_=8\relax % just in case +\lowercase{\endgroup +\let\@@superscript=^ \let\@@subscript=_ +}% +\begingroup \catcode`\^=12\relax \catcode`\_=12\relax % just in case +\lowercase{\endgroup +\let\@@superscript@other=^ \let\@@subscript@other=_ +}% +% \end{macrocode} +% If we enter a sub- or superscript the \cs{mathstyle} must be +% adjusted. Since all is happening in a group, we do not have to worry +% about resetting. We can't tell the difference between cramped and +% non-cramped styles unless Lua\TeX{} is in use, in which case this command +% is a no-op. +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname directlua\endcsname\relax + \def\subsupstyle{% + \ifnum\mathstyle<5 \chardef\mathstyle4 % + \else \chardef\mathstyle6 % + \fi + } +\else + \def\subsupstyle{} +\fi +% \end{macrocode} +% Provide commands with meaningful names for the two primitives, cf.\ +% \cs{mathrel}. +% \begin{macrocode} +\let\mathsup=\@@superscript +\let\mathsub=\@@subscript +% \end{macrocode} +% \cs{sb} and \cs{sp} are then defined as macros. +% \begin{macrocode} +\def\sb#1{\mathsub{\protect\subsupstyle#1}}% +\def\sp#1{\mathsup{\protect\subsupstyle#1}}% +% \end{macrocode} +% +% \begin{macro}{\mathchoice} +% \changes{v0.98e}{2016/04/09}{Lua\TeX{} primitive \cs{mathstyle} needs +% termination} +% \cs{mathchoice} is now just a switch. Note that this redefinition +% does not allow the arbitrary \meta{filler} of the \TeX\ +% primitive. Very rarely used anyway. +% \begin{macrocode} +\def\mathchoice{% + \relax\ifcase\numexpr\mathstyle\relax + \expandafter\@firstoffour % Display + \or + \expandafter\@firstoffour % Cramped display + \or + \expandafter\@secondoffour % Text + \or + \expandafter\@secondoffour % Cramped text + \or + \expandafter\@thirdoffour % Script + \or + \expandafter\@thirdoffour % Cramped script + \else + \expandafter\@fourthoffour % (Cramped) Scriptscript + \fi +} +% \end{macrocode} +% Helper macros. +% \begin{macrocode} +\providecommand\@firstoffour[4]{#1} +\providecommand\@secondoffour[4]{#2} +\providecommand\@thirdoffour[4]{#3} +\providecommand\@fourthoffour[4]{#4} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\genfrac} +% The fractions. Note that this uses the same names as in +% \pkg{amsmath}. Much the same except here they call \cs{fracstyle}. +% \begin{macrocode} +\DeclareRobustCommand\genfrac[6]{% + {#1\fracstyle + {\begingroup #5\endgroup + \csname @@\ifx\maxdimen#4\maxdimen over\else above\fi + \if @#2@\else withdelims\fi\endcsname #2#3#4\relax + #6}% + }% +} +% \end{macrocode} +% \changes{v0.90}{2011/08/03}{\cs{fracstyle} must be called \emph{after} +% changing to the required style} +% \changes{v0.98e}{2016/04/09}{Lua\TeX{} primitive \cs{mathstyle} needs +% termination} +% \end{macro} +% +% \begin{macrocode} +\renewcommand{\frac}{\genfrac{}{}{}{}} +\providecommand{\dfrac}{} +\providecommand{\tfrac}{} +\renewcommand{\dfrac}{\genfrac\displaystyle{}{}{}} +\renewcommand{\tfrac}{\genfrac\textstyle{}{}{}} +\providecommand{\binom}{} +\providecommand{\tbinom}{} +\providecommand{\dbinom}{} +\renewcommand{\binom}{\genfrac{}(){0pt}} +\renewcommand{\dbinom}{\genfrac\displaystyle(){0pt}} +\renewcommand{\tbinom}{\genfrac\textstyle(){0pt}} +% \end{macrocode} + +% The \cs{fracstyle} command is a switch to go one level down but no +% further than three. +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname directlua\endcsname\relax + \def\fracstyle{% + \ifcase\numexpr\mathstyle\relax + \chardef\mathstyle=\@ne + \or + \chardef\mathstyle=\@ne + \or + \chardef\mathstyle=\tw@ + \or + \chardef\mathstyle=\tw@ + \else + \chardef\mathstyle=\thr@@ + \fi + } +\else + \def\fracstyle{} +\fi +% \end{macrocode} +% \changes{v0.98e}{2016/04/09}{Lua\TeX{} primitive \cs{mathstyle} needs +% termination} +% The \cs{currentmathstyle} checks the value of \cs{mathstyle} and +% switches to it so it is in essence the opposite of \cs{displaystyle} +% and friends. +% \begin{macrocode} +\def\currentmathstyle{% + \ifcase\numexpr\mathstyle\relax + \@@displaystyle + \or + \@@displaystyle + \or + \@@textstyle + \or + \@@textstyle + \or + \@@scriptstyle + \or + \@@scriptstyle + \else + \@@scriptscriptstyle + \fi} +% \end{macrocode} +% Finally, we declare the package options. +% \changes{v0.89}{2010/11/17}{Options should only change catcodes at +% begin document, not straight away} +% \begin{macrocode} +\DeclareOption{mathactivechars}{% + % \catcode`\^=12\relax + % \catcode`\_=12\relax +\AtBeginDocument{\catcode`\^=12\relax \catcode`\_=12\relax}% +} +\DeclareOption{activechars}{% + % \catcode`\^=13\relax + % \catcode`\_=13\relax +\AtBeginDocument{\catcode`\^=13\relax \catcode`\_=13\relax}% +} +\DeclareOption{noactivechars}{% + % \catcode`\^=7\relax + % \catcode`\_=8\relax +\AtBeginDocument{\catcode`\^=7\relax \catcode`\_=8\relax}% +} +\ExecuteOptions{mathactivechars} +\ProcessOptions\relax +% \end{macrocode} +% WSPR: Set up the active behaviours: (this is set even in the +% |noactivechars| case but they are never activated. no worries?) +% \begin{macrocode} +\ifnum\catcode`\^=13\relax + \let^=\sp \let_=\sb +\else + \mathcode`\^="8000\relax + \mathcode`\_="8000\relax + \begingroup + \catcode`\^=\active + \catcode`\_=\active + \global\let^=\sp + \global\let_=\sb + \endgroup +\fi +%</package> +% \end{macrocode} +% +% \PrintIndex +% +% \Finale |