diff options
author | Karl Berry <karl@freefriends.org> | 2021-08-06 21:38:00 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2021-08-06 21:38:00 +0000 |
commit | 13015c16b7f2c43e69a8d5409071f6092e27f0b7 (patch) | |
tree | 552b94bd6adfcb85d8f15ad246ee77529d1fe83b /Master/texmf-dist/tex/latex/smart-eqn | |
parent | 32cf0b157377d76197f354b2a4ea8ac391122a11 (diff) |
smart-eqn (5aug21)
git-svn-id: svn://tug.org/texlive/trunk@60178 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/smart-eqn')
-rw-r--r-- | Master/texmf-dist/tex/latex/smart-eqn/smart-eqn.sty | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/smart-eqn/smart-eqn.sty b/Master/texmf-dist/tex/latex/smart-eqn/smart-eqn.sty new file mode 100644 index 00000000000..d93752ec498 --- /dev/null +++ b/Master/texmf-dist/tex/latex/smart-eqn/smart-eqn.sty @@ -0,0 +1,210 @@ +%% +%% This is file `smart-eqn.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% smart-eqn.dtx (with options: `package') +%% +%% This is a generated file. This file is part of the smart-eqn package. +%% +%% Copyright (C) 2021 by Ziyue "Alan" Xiang <ziyue.alan.xiang@gmail.com> +%% +%% This file may be distributed and/or modified under the conditions of +%% the LaTeX Project Public License, either version 1.3c of this license +%% 28 or (at your option) any later version. The latest version of this +%% 29 license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.3c or later is part of all distributions of LaTeX +%% version 2006/05/20 or later. +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesExplPackage{smart-eqn}{08/05/2021}{1.0}{Automatic Math Symbol Styling} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +\RequirePackage{fancyvrb} +\RequirePackage{expl3, xparse} + +\makeatletter +\ExplSyntaxOn + +\tl_new:N \g_sme_op_arg_tl +\ior_new:N \g_sme_tmpa_ior +\iow_new:N \g_sme_tmpa_iow +\prop_new:N \g_sme_symbols_prop +\clist_new:N \l_sme_tmpa_clist +\tl_new:N \l_sme_tmpa_tl +\tl_new:N \l_sme_tmpb_tl +\tl_new:N \l_sme_tmpc_tl +\tl_new:N \l_sme_cur_math_tl + +\def\smeDefineVerbatimEnvironment#1#2#3{% + \@namedef{#1}{\smeFV@Environment{#3}{#2}}% + \@namedef{end#1}{\@nameuse{FVE@#2}}% +} + +\def\smeFV@Environment#1#2{% + \def\FV@KeyValues{#1}% + \catcode`\^^M=\active + \tl_gclear:N \g_sme_op_arg_tl % clear optional arguments from previous calls + \@ifnextchar[% + {\catcode`\^^M=5 \smeFV@GetKeyValues{\@nameuse{FVB@#2}}}% + {\catcode`\^^M=5 \@nameuse{FVB@#2}}} + +\def\smeFV@GetKeyValues#1[#2]{% + \tl_gset:Nn \g_sme_op_arg_tl {#2}#1} + +\cs_set:Npn \sme_declare_math_env:n #1 { + \exp_args:Nc \def{sme#1}{\smeFV@Environment{}{sme#1}} + + % this is a modified version of VerbatimOut environment which does not take any argument + \exp_args:Nc \def{FVB@sme#1}{% + \@bsphack + \begingroup + \FV@UseKeyValues + \FV@DefineWhiteSpace + \def\FV@Space{\space}% + \FV@DefineTabOut + \def\FV@ProcessLine{\immediate\write\FV@OutFile}% + \immediate\openout\FV@OutFile \jobname-sme.vrb\relax + \let\FV@FontScanPrep\relax + %% DG/SR modification begin - May. 18, 1998 (to avoid problems with ligatures) + \let\@noligs\relax + %% DG/SR modification end + \FV@Scan} + + \exp_args:Nc\def{FVE@sme#1}{\immediate\closeout\FV@OutFile\endgroup\@esphack + % call the function to process the content when the environment ends + \sme_read_process_math:n {#1} + } + + \smeDefineVerbatimEnvironment{sme#1}{sme#1}{} +} + +\let\smenewenv\sme_declare_math_env:n + +\cs_set:Npn \sme_read_process_math:n #1 { + \ior_open:Nn \g_sme_tmpa_ior {\jobname-sme.vrb} + \iow_open:Nn \g_sme_tmpa_iow {\jobname-sme-in.vrb} + + \iow_now:Nx \g_sme_tmpa_iow {\c_backslash_str begin{#1} \g_sme_op_arg_tl} + \ior_map_inline:Nn \g_sme_tmpa_ior { + \sme_process_math:n {##1} + \exp_args:NNV \iow_now:Nn \g_sme_tmpa_iow \l_sme_cur_math_tl + } + \iow_now:Nx \g_sme_tmpa_iow {\c_backslash_str end{#1}} + \iow_close:N \g_sme_tmpa_iow + \ior_close:N \g_sme_tmpa_ior + \input{\jobname-sme-in.vrb} +} + +\newcommand{\smesetsym}[2]{ + \clist_set:Nn \l_sme_tmpa_clist {#2} + \clist_map_inline:Nn \l_sme_tmpa_clist { + \prop_gput:Nnn \g_sme_symbols_prop {##1} {#1} + } +} + +\newcommand{\smeclearsym}{ + \prop_gclear:N \g_sme_symbols_prop +} + +\newcommand{\smeraw}[1]{#1} + +\cs_set:Npn \__sme_grouped:n #1 { + \exp_not:n {#1} +} +\cs_generate_variant:Nn \__sme_grouped:n {e} +\cs_generate_variant:Nn \__sme_grouped:n {V} + +\cs_set:Npn \sme_construct_bm:Nn #1#2 { + \tl_if_head_is_group:nTF {#2} { + % if head is group, apply the algorithm recursively + %\tl_put_right:Nx #1 {{\tl_head:n {#2}}} + \tl_put_right:NV #1 \c_left_brace_str + \exp_args:NNx \sme_construct_bm:Nn #1 {\tl_head:n {#2}} + \tl_put_right:NV #1 \c_right_brace_str + \tl_if_empty:nF {#2} {\exp_args:NNx \sme_construct_bm:Nn #1 {\tl_tail:n {#2}}} + }{ + \tl_if_head_is_space:nTF {#2} { + % ignore spaces + \exp_args:NNx \sme_construct_bm:Nn #1 {\tl_trim_spaces:n {#2}} + } { + \tl_if_head_eq_meaning:nNTF {#2} \smeraw { + % for \smeraw, ignore the next group + \tl_put_right:Nn #1 {\smeraw} + \tl_set:Nx \l_sme_tmpa_tl {\tl_tail:n {#2}} + \tl_put_right:Nx #1 {\tl_head:N \l_sme_tmpa_tl} + \tl_set:Nx \l_sme_tmpa_tl {\tl_tail:N \l_sme_tmpa_tl} + \exp_args:NNV \sme_construct_bm:Nn #1 \l_sme_tmpa_tl + } { + % common case + % extract head + \exp_args:NNx \prop_get:NnNTF \g_sme_symbols_prop {\tl_head:n {#2}} \l_sme_tmpc_tl { + % this symbol needs to be styled + \tl_set:No \l_sme_tmpa_tl {\csname\l_sme_tmpc_tl\endcsname} + \tl_put_right:Nx \l_sme_tmpa_tl {{\__sme_grouped:e {\tl_head:n {#2}}}} + \tl_put_right:Nx #1 {{\__sme_grouped:V \l_sme_tmpa_tl}} + } { + % otherwise, use the original symbol + \tl_put_right:Nx #1 {\tl_head:n {#2}} + } + \tl_if_empty:nF {#2} {\exp_args:NNx \sme_construct_bm:Nn #1 {\tl_tail:n {#2}}} + } + } + } +} + +\cs_set:Npn \sme_process_math:n #1 { + \tl_clear:N \l_sme_cur_math_tl + \sme_construct_bm:Nn \l_sme_cur_math_tl {#1} +} + +\begingroup +\catcode`@=\active +\gdef\makeatmath{% note the global \gdef + \catcode`@=\active + \def@##1@{ + \sme_process_math:n{##1} + $\exp_args:NnV \tl_rescan:nn {} \l_sme_cur_math_tl$ + }% +} +\endgroup + +\makeatother +\ExplSyntaxOff + +\endinput +%% +%% End of file `smart-eqn.sty'. |