summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/t2/etc/mathtext.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/t2/etc/mathtext.dtx')
-rw-r--r--macros/latex/contrib/t2/etc/mathtext.dtx226
1 files changed, 226 insertions, 0 deletions
diff --git a/macros/latex/contrib/t2/etc/mathtext.dtx b/macros/latex/contrib/t2/etc/mathtext.dtx
new file mode 100644
index 0000000000..96ba3baa27
--- /dev/null
+++ b/macros/latex/contrib/t2/etc/mathtext.dtx
@@ -0,0 +1,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