summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/t2/etc/mathtext.dtx
blob: 96ba3baa279ec7701e38405a625a346738f53bb9 (plain)
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