1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226
|
% \iffalse
%<*driver>
\documentclass{ltxdoc}
\begin{document}
\DocInput{mathtext.dtx}
\end{document}
%</driver>
% \fi
%
% \begin{macrocode}
%<*mathtext>
\ProvidesPackage{mathtext}
[2018/04/13 v1.1 transparent text-and-math defs]
% \end{macrocode}
%
% This stuff is intended to be put into the LaTeX kernel.
% It adds new NFSS user-level command: |\DeclareTextMathSymbol|.
% It does not touch in any way the previous behavior for encodings
% which do not use |\DeclareTextMathSymbol|.
%
% The symbols defined via |\DeclareTextMathSymbol| work transparently
% in both text and math mode. And interestingly, they expand a bit
% faster than `normal' text-only symbols defined via |\DeclareTextSymbol|.
%
% This is a redefinition of the |\@@enc@update| defined in
% |ltfssbas.dtx|. The only change is that we added updating of
% new commands like |\T2A-tmcmd| to |\@current@tmcmd| or from
% |\@changed@tmcmd|. These changes are fully backward-compatible,
% and do not change the previous behavior.
% \begin{macrocode}
\def\@@enc@update{%
\expandafter\let\csname\cf@encoding-cmd\endcsname\@changed@cmd
\expandafter\let\csname\cf@encoding-tmcmd\endcsname\@changed@tmcmd
\expandafter\let\csname\f@encoding-cmd\endcsname\@current@cmd
\expandafter\let\csname\f@encoding-tmcmd\endcsname\@current@tmcmd
\default@T
\csname T@\f@encoding\endcsname
\csname D@\f@encoding\endcsname
\let\enc@update\relax
\let\cf@encoding\f@encoding
}
% \end{macrocode}
% This is a new command, |\@current@tmcmd|, which is an analog of
% |\@current@cmd| for `text and math' symbols.
% \begin{macrocode}
\def\@current@tmcmd#1#2#3{%
\ifx\protect\@typeset@protect
\@tmchar#2#3%
\else
\noexpand#1%
\fi}
%<!warn>\def\@tmchar#1#2{\if@mmode#2\else#1\fi}
%<warn>\def\@tmchar#1#2{\if@mmode\math@warn#2\else#1\fi}
% \end{macrocode}
% This is a new command, |\@changed@tmcmd|, which is an analog of
% |\@changed@cmd| for `text and math' symbols.
% \begin{macrocode}
\def\@changed@tmcmd#1#2#3{%
\ifx\protect\@typeset@protect
\@tmchar@#1%
\else
\noexpand#1%
\fi}
\def\@tmchar@#1{%
\if@mmode
\expandafter\ifx\csname\cf@encoding math\string#1\endcsname\relax
\expandafter\ifx\csname ?math\string#1\endcsname\relax
\expandafter\def\csname ?math\string#1\endcsname{%
\TextSymbolUnavailable#1%
}%
\fi
\global\expandafter\let
\csname\cf@encoding math\string#1\expandafter\endcsname
\csname ?math\string#1\endcsname
\fi
%<!warn> \csname\cf@encoding math\string#1%
%<warn> \expandafter\math@warn\csname\cf@encoding math\string#1%
\expandafter\endcsname
\else
\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
\fi}
\expandafter\let\csname?-tmcmd\endcsname\@changed@tmcmd
% \end{macrocode}
% We should add initialization of |\|\meta{encoding}|-tmcmd|
% to be |\@changed@tmcmd| when the new encoding is declared.
% \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
\expandafter\let\csname#1-tmcmd\endcsname\@changed@tmcmd
% \end{macrocode}
% 2018 addition to load UTF-8 support file (David Carlisle, for latex3 project)
% \begin{macrocode}
\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
% \end{macrocode}
% end of 2018 addition
% \begin{macrocode}
\else
\@font@info{Redeclaring font encoding #1}%
\fi
\global\@namedef{T@#1}{#2}%
\global\@namedef{M@#1}{\default@M#3}%
\xdef\LastDeclaredEncoding{#1}%
% \end{macrocode}
% The following command is specific to the |mathtext| package, i.e.\ is
% not for `generic' transparent text and math: it declares a symbol font
% (which could then be redefined if necessary), which is needed to use
% the |\DeclareTextMathSymbol|.
% \begin{macrocode}
\DeclareSymbolFont{#1letters}{#1}\rmdefault\mddefault\updefault
}
% \end{macrocode}
%
% \begin{macro}{\DeclareTextMathSymbol}
% This is a new user-level NFSS macro. It is intended to be moved
% to |ltoutenc.dtx| or |ltfssdcl.dtx|.
%
% It was written by Werner Lemberg |<wl@gnu.org>|.
%
% Parameters are: name, encoding, category, math character class,
% and slot.
%
% \begin{macrocode}
\def\DeclareTextMathSymbol#1#2#3#4#5{%
\expandafter\def\expandafter#1%
\expandafter{%
\csname#2-tmcmd\expandafter\endcsname
\expandafter#1%
\csname#2\string#1\expandafter\endcsname
\csname#2math\string#1\endcsname
}%
\expandafter\chardef\csname#2\string#1\endcsname#5\relax
\expandafter\DeclareMathSymbol\csname#2math\string#1\endcsname
{#3}{#4}{#5}}
\@onlypreamble\DeclareTextMathSymbol
% \end{macrocode}
% \end{macro}
%
% The next few lines try to solve the following problem: if the first
% unexpandable token of a cell in |\halign| (or |\valign|) is a Cyrillic
% letter, then the look-ahead mechanism searching for possible |\omit|
% will expand the |\ifmmode| test used in definitions of Cyrillic
% letters, and e.g.~in the case of the |array| environment which
% switches to math mode, will return wrong result, which will lead to
% missing character or incorrect result. We use here some hackery and
% redefine the |\if@mmode| test for the |\halign| and |\valign| commands
% (as well as these commands). The really correct fix is possible within
% e-\TeX\ (so, one should make a support do use the best possible solution,
% and not only in this case). We ensure to execute this code only once,
% because otherwise an endless loop will arise (e.g. if both T2A and T2B
% are loaded in one document), because of |\halign| redefinition.
% \begin{macrocode}
\let\if@mmode\ifmmode
% \end{macrocode}
% This command stops look-ahead (protection is needed to avoid recursive
% expansion when |\protected@write| is used inside |\halign|):
% \begin{macrocode}
\DeclareRobustCommand\reset@if@mmode{\let\if@mmode\ifmmode}
\def\if@mmode@{\reset@if@mmode\ifmmode}
\let\org@halign\halign
\DeclareRobustCommand\halign{\let\if@mmode\if@mmode@\org@halign}
% \end{macrocode}
% wait until textcase and amsmath will not use "fake" |\valign| :-)
% \begin{macrocode}
%\let\org@valign\valign
%\DeclareRobustCommand\valign{\let\if@mmode\if@mmode@\org@valign}
% \end{macrocode}
% This is needed to make single Cyrillic letters (without braces) work as
% upper/lower indices (otherwise, |\let| will confuse \TeX). Do we need to
% set |\everydisplay| similarly (it seems that not)?
% \begin{macrocode}
\everymath\expandafter{\the\everymath\let\if@mmode\ifmmode}
% \end{macrocode}
% We redefine some \LaTeX{} text-only commands to work `transparently'
% in text and math mode.
% \begin{macrocode}
\def\DeclareTextSymbol#1#2#3{%
\DeclareTextMathSymbol#1{#2}\mathalpha{#2letters}{#3}}
% \end{macrocode}
% \begin{macro}{\gobble@math}
% \begin{macro}{\math@warn}
% These two commands are used for producing warning message
% if a symbol declared via |\DeclareTextMathSymbol| command occurs in
% math mode. This can be used e.g.\ to check that such symbols were not
% used unintentionally in math mode (say, some Cyrillic letter instead
% of similarly looking Latin letter; in general, Cyrillic letters are
% perfectly legal and certainly could be used in math mode).
% \begin{macrocode}
%<*warn>
\DeclareOption{warn}{%
\edef\reserved@a{\@backslashchar##1\expandafter\@gobble
\string\math\@backslashchar}%
\expandafter\def\expandafter\gobble@math\reserved@a{}%
\def\math@warn#1{#1\PackageWarning{mathtext}{letter
`\expandafter\gobble@math\string#1' used in math mode}}}
\let\math@warn\@empty
\ProcessOptions*
%</warn>
%</mathtext>
% \end{macrocode}
% \end{macro}
% \end{macro}
\endinput
|