From 793be33975bf8f6986bb6435f2039c7c34ac3c15 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 18 Sep 2011 22:29:36 +0000 Subject: unicode-math 0.6 (18sep11) git-svn-id: svn://tug.org/texlive/trunk@24003 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/latex/unicode-math/README | 70 +- .../latex/unicode-math/unicode-math-testsuite.pdf | Bin 2441757 -> 2365307 bytes .../doc/latex/unicode-math/unicode-math.pdf | Bin 387665 -> 395820 bytes .../doc/latex/unicode-math/unimath-symbols.pdf | Bin 295948 -> 1543548 bytes .../texmf-dist/source/latex/unicode-math/Makefile | 95 +- .../unicode-math/testfiles/F-active-sscripts.ltx | 13 + .../latex/unicode-math/testfiles/F-mathversion.ltx | 13 + .../unicode-math/testfiles/F-nolimits-spec.ltx | 10 + .../unicode-math/testfiles/F-over-under-2.ltx | 17 + .../latex/unicode-math/testfiles/F-over-under.ltx | 15 + .../latex/unicode-math/testfiles/F-pkg-url.ltx | 18 + .../unicode-math/testfiles/F-query-mathstyle.ltx | 26 + .../unicode-math/testfiles/F-range-prime-check.ltx | 17 + .../unicode-math/testfiles/F-slash-delim-2.ltx | 2 +- .../unicode-math/testfiles/F-sscript-features.ltx | 10 + .../source/latex/unicode-math/testfiles/L602b.ltx | 2 +- .../source/latex/unicode-math/testfiles/L603b.ltx | 2 +- .../source/latex/unicode-math/testfiles/X204a.ltx | 13 - .../source/latex/unicode-math/testfiles/X205a.ltx | 10 - .../source/latex/unicode-math/testfiles/X300a.ltx | 10 - .../source/latex/unicode-math/testfiles/X400a.ltx | 18 - .../latex/unicode-math/testfiles/X601b.ignore.pdf | Bin 11791 -> 0 bytes .../latex/unicode-math/testfiles/X601f.ignore.pdf | Bin 2954 -> 0 bytes .../unicode-math/testfiles/umtest-suite-F.tex | 22 +- .../unicode-math/testfiles/umtest-suite-X.tex | 6 +- .../latex/unicode-math/unicode-math-testsuite.ltx | 2 + .../source/latex/unicode-math/unicode-math.dtx | 2179 +++++++------- .../source/latex/unicode-math/unimath-symbols.ltx | 140 +- .../tex/latex/unicode-math/unicode-math-luatex.sty | 2495 ++++++++++++++++ .../tex/latex/unicode-math/unicode-math-table.tex | 28 +- .../tex/latex/unicode-math/unicode-math-xetex.sty | 2630 +++++++++++++++++ .../tex/latex/unicode-math/unicode-math.sty | 2992 +------------------- 32 files changed, 6761 insertions(+), 4094 deletions(-) create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-active-sscripts.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-mathversion.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-nolimits-spec.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under-2.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-pkg-url.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-query-mathstyle.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-range-prime-check.ltx create mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/F-sscript-features.ltx delete mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/X204a.ltx delete mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/X205a.ltx delete mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/X300a.ltx delete mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/X400a.ltx delete mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/X601b.ignore.pdf delete mode 100644 Master/texmf-dist/source/latex/unicode-math/testfiles/X601f.ignore.pdf create mode 100644 Master/texmf-dist/tex/latex/unicode-math/unicode-math-luatex.sty create mode 100644 Master/texmf-dist/tex/latex/unicode-math/unicode-math-xetex.sty diff --git a/Master/texmf-dist/doc/latex/unicode-math/README b/Master/texmf-dist/doc/latex/unicode-math/README index 01399e0c16c..0e578f4f007 100644 --- a/Master/texmf-dist/doc/latex/unicode-math/README +++ b/Master/texmf-dist/doc/latex/unicode-math/README @@ -55,13 +55,15 @@ Furthermore, it will be in a different font. REQUIREMENTS ------------ -As well as running XeTeX or LuaTeX this package requires recent versions of +If you're using an up-to-date TeX Live 2011 or MiKTeX 2.9 then there'll be no problems. +Otherwise, read on. + +As well as running XeTeX or LuaTeX, this package requires recent versions of the `fontspec`, `expl3`, `xpackages`, `catchfile`, `trimspaces`, -`filehook`, and `lualatex-math` packages. If you're using an up-to-date TeX Live 2011 then there'll -be no problems. +`filehook`, and `lualatex-math` packages. For some additional features you need LuaTeX 0.65 or later, which can be -updated using [TLContrib][TLC]. +updated using [TLContrib][TLC] if you're still using TeX Live 2010. [TLC]: http://tlcontrib.metatex.org) @@ -83,12 +85,14 @@ Please file bug reports with minimal examples: INSTALLATION ------------ -The steps below assume that you have obtained unicode-math either from CTAN or -Github and you wish to install the package yourself. If you are using TeX Live -2010 or later, you may install the latest release version of the package with +If you are using TeX Live 2010 or later, you may install the latest release +version of the package with sudo tlmgr update unicode-math +The steps below assume that you have obtained unicode-math either from CTAN or +Github and you wish to install the package yourself. + Installation and compilation are automated by the Makefile; see below for the manual procedure. To re-compile the documentation (requiring XeLaTeX and a variety of installed fonts): @@ -108,7 +112,7 @@ See `make help` for further information. ### Manual procedure -Run TeX on unicode-math.dtx to generate the package file unicode-math.sty: +Run TeX on unicode-math.dtx to generate the package file `unicode-math.sty`: tex unicode-math.dtx @@ -138,7 +142,7 @@ After installation you can initialise the testsuite with Subsequently, the test suite may be executed with - make test + make check Both of these operations will take quite some time and require ImageMagick's `convert` tool to be installed. They are only necessary if you wish to make @@ -150,7 +154,32 @@ changes have not affected the standard behaviour. CHANGE HISTORY -------------- -- v0.5e (2011/07/07) +- v0.6 (2011/09/18) + + * Keep in sync with fontspec internals + (sorry for the small delay where things were broken) + * Keep in sync with expl3 deprecated functions + * Math versions (finally) implemented; can now change maths fonts + mid-document without reinitialising everything + (thanks to Ulrike Fischer and Ulrik Vieth) + * Symbols file `unimath-symbols.pdf` now uses maths versions to compare + all of the OpenType maths fonts I currently have access to + * Over- and under- braces, brackets, and parentheses now work in XeTeX + (thanks to Claudio Beccari) + * Many internal changes, including a re-write of the `range` feature; + it should now be faster and more robust + * Tentative programmer's interface for querying the current math style: + `\l_um_mathstyle_tl`. + * Remove (outdated) interaction with beamer; you must specify + `professionalfonts` manually for now + * Quieten the console output when loading maths fonts with incomplete maths + style coverage + * Synonym added: `\lnot` -> `\neg` + * Two added Unicode symbols (names tentative): `\blanksymbol` and `\openbox` + (thanks to Apostolos Syropoulos) + * Fixed literal sub-/super-script input. + +- v0.5e (2011/07/31) * Fix forward compatibility clash with deprecated expl3 functions (sorry) * Command names are now `\protected`; this makes them safe to use in moving @@ -169,7 +198,7 @@ CHANGE HISTORY * Fix the math class of `\modtwosum`; it is now a large operator (thanks to Michael Ummels) * Move several LuaTeX-related patches to the `lualatex-math` package - + * Fixed mathtool's `\cramped` in XeLaTeX usage - v0.5d (2011/01/30) @@ -189,7 +218,7 @@ CHANGE HISTORY - v0.5b (2010/09/19): Tune-up - * Added missing symbols/synonyms: + * Added missing symbols/synonyms: \diamond \smallint \emptyset \hbar \backepsilon \eth * \overline works for LuaLaTeX * Fix \slash; previously, it overwrote the text definition @@ -199,8 +228,10 @@ CHANGE HISTORY * Numerous documentation improvements * Bug fix against stray catcode changes - * Add `\mathcal` and `\mathbfcal` as distinct from the Script style; these are only supported by the XITS fonts at present - * Small changes to the range of symbols offered (especially note that `\ac` is now `\invlazys` to avoid acronym package clash) + * Add `\mathcal` and `\mathbfcal` as distinct from the Script style; + these are only supported by the XITS fonts at present + * Small changes to the range of symbols offered (especially note that `\ac` + is now `\invlazys` to avoid acronym package clash) * Superscripts are allowed after primes (as they should be) * Numerous LuaLaTeX improvements, including roots and over/under braces. @@ -221,10 +252,12 @@ This work is author-maintained and consists of the files - unicode-math.dtx, - unicode-math-table.tex, - unimath-example.ltx, -- unimath-symbols.ltx; +- unimath-symbols.ltx, +- unicode-math-testsuite.ltx; -the derived file +the derived files +- unicode-math.lua, - unicode-math.sty; the compiled documentation files @@ -237,9 +270,8 @@ the compiled documentation files and the test suite for this package - testfiles/umtest-preamble.tex, -- testfiles/umtest-suite.tex, -- testfiles/umtest*.ltx, -- testfiles/umtest*.safe.png. +- testfiles/umtest-suite-(F|L|X).tex, +- testfiles/*.ltx. ____________________________________ Copyright 2006-2011 Will Robertson diff --git a/Master/texmf-dist/doc/latex/unicode-math/unicode-math-testsuite.pdf b/Master/texmf-dist/doc/latex/unicode-math/unicode-math-testsuite.pdf index 03fe07dea18..392b519c1c7 100644 Binary files a/Master/texmf-dist/doc/latex/unicode-math/unicode-math-testsuite.pdf and b/Master/texmf-dist/doc/latex/unicode-math/unicode-math-testsuite.pdf differ diff --git a/Master/texmf-dist/doc/latex/unicode-math/unicode-math.pdf b/Master/texmf-dist/doc/latex/unicode-math/unicode-math.pdf index 956adb1db1e..3773e1ab9ca 100644 Binary files a/Master/texmf-dist/doc/latex/unicode-math/unicode-math.pdf and b/Master/texmf-dist/doc/latex/unicode-math/unicode-math.pdf differ diff --git a/Master/texmf-dist/doc/latex/unicode-math/unimath-symbols.pdf b/Master/texmf-dist/doc/latex/unicode-math/unimath-symbols.pdf index 90219546ff9..f27de4fe8e9 100644 Binary files a/Master/texmf-dist/doc/latex/unicode-math/unimath-symbols.pdf and b/Master/texmf-dist/doc/latex/unicode-math/unimath-symbols.pdf differ diff --git a/Master/texmf-dist/source/latex/unicode-math/Makefile b/Master/texmf-dist/source/latex/unicode-math/Makefile index b75e1574945..807cda3fe6e 100644 --- a/Master/texmf-dist/source/latex/unicode-math/Makefile +++ b/Master/texmf-dist/source/latex/unicode-math/Makefile @@ -27,6 +27,10 @@ help: echo ' xfile F= - compile file with XeLaTeX' echo ' lfile F= - compile file with LuaLaTeX' echo ' ' + echo ' ' + echo 'Append `hometree=none` to any of the above to disable searching + echo 'the home texmf directory.' + echo ' ' echo 'To add a new test, add a file called X****.ltx to' echo 'directory testfiles/, run `make initest` and ensure' echo 'that the output X****.safe.pdf is correct.' @@ -58,7 +62,9 @@ builddir=build tds=$(builddir)/$(PKG).tds UPDATE = `which dtx-update` || true # TODO: generalise -SPEAKFAIL := `say 'Test failed!'` || true # Mac OS X only? +SPEAKFAIL := say 'Test failed!' || true # Mac OS X only? + +hometree = `kpsewhich -var-value=TEXMFHOME` # these files end up in the CTAN directory: @@ -70,12 +76,14 @@ BUILDDOC = $(addprefix $(builddir)/,$(DOC)) # -LTXSOURCE = $(PKG).sty $(PKG).lua $(TBL) +LTXSOURCE = $(PKG).sty $(PKG)-xetex.sty $(PKG)-luatex.sty $(PKG).lua $(TBL) # and this is how the TDS zip file is produced: INSFILES = \ $(tds)/tex/latex/$(PKG)/unicode-math.sty \ + $(tds)/tex/latex/$(PKG)/unicode-math-xetex.sty \ + $(tds)/tex/latex/$(PKG)/unicode-math-luatex.sty \ $(tds)/tex/latex/$(PKG)/unicode-math.lua \ $(tds)/tex/latex/$(PKG)/unicode-math-table.tex @@ -103,7 +111,7 @@ README: $(XMPL): clean: - rm -rf $(builddir) + rm -rf $(builddir)/* rm -f $(PKG).zip $(PKG).pdf $(SUITE).pdf all: clean doc ctan @@ -127,14 +135,14 @@ $(builddir)/$(PKG).lua: $(builddir)/$(PKG).dtx $(builddir)/$(PKG).pdf: $(builddir)/$(PKG).dtx $(BUILDSOURCE) cd $(builddir) && \ - xelatex $(PKG).dtx && \ + $(run_xelatex) $(PKG).dtx && \ makeindex -s gind.ist $(PKG) && \ - xelatex $(PKG).dtx; + $(run_xelatex) $(PKG).dtx; $(builddir)/$(SYM).pdf: $(builddir)/$(SYM).ltx cd $(builddir) && \ - xelatex $(SYM).ltx && \ - xelatex $(SYM).ltx; + $(run_xelatex) $(SYM).ltx && \ + $(run_xelatex) $(SYM).ltx; $(builddir)/%.ltx: $(testdir)/%.ltx $(COPY) $< $@ @@ -204,26 +212,32 @@ install-sys: $(INSFILES) fi ; +run_xelatex = export TEXMFHOME=$(hometree) && xelatex +run_lualatex = export TEXMFHOME=$(hometree) && lualatex ##### USEFUL FOR TEST FILES ##### xfile: $(F) $(BUILDSOURCE) if test -z "$(F)" ; then \ - echo "Need a filename!\nE.g. \`make xfile F=test.ltx\`" ; \ - false ; \ + echo "Typesetting test.tex:"; \ + $(COPY) test.tex $(builddir)/test.tex; \ + cd $(builddir); $(run_xelatex) test.tex; \ + else \ + echo Typesetting $(F):; \ + $(COPY) $(F) $(builddir)/$(F); \ + cd $(builddir); $(run_xelatex) $(F); \ fi - echo Typesetting $(F): - $(COPY) $(F) $(builddir)/$(F) - cd $(builddir); xelatex $(F) lfile: $(F) $(BUILDSOURCE) if test -z "$(F)" ; then \ - echo "Need a filename!\nE.g. \`make lfile F=test.ltx\`" ; \ - false ; \ + echo "Typesetting test.tex:"; \ + $(COPY) test.tex $(builddir)/test.tex; \ + cd $(builddir); $(run_lualatex) test.tex; \ + else \ + echo Typesetting $(F):; \ + $(COPY) $(F) $(builddir)/$(F); \ + cd $(builddir); $(run_lualatex) $(F); \ fi - echo Typesetting $(F): - $(COPY) $(F) $(builddir)/$(F) - cd $(builddir); lualatex $(F) ############# @@ -246,7 +260,7 @@ COMPARE_OPTS = -density 300x300 -metric ae -fuzz 35% # Redefine this to print output if you need: REDIRECT = > /dev/null -LTXSOURCE = $(NAME).sty $(NAME).lua +LTXSOURCE = $(NAME).sty $(NAME)-xetex.sty $(NAME)-luatex.sty $(NAME).lua TESTLIST = umtest-suite-X.tex umtest-suite-L.tex umtest-suite-F.tex @@ -271,21 +285,18 @@ BUILDFILES = $(BUILDSOURCE) $(BUILDSUITE) $(BUILDTESTSRC) $(BUILDTESTTARGET) $(builddir)/$(SUITE).pdf: $(builddir)/$(SUITE).ltx $(BUILDSUITE) cd $(builddir) && \ - xelatex $(SUITE).ltx + $(run_xelatex) $(SUITE).ltx #### All tests #### -foo: - echo $(BUILDTESTTARGET) - check: $(TESTLIST) $(TESTLIST): $(BUILDFILES) cd $(testdir) && \ ls X*.safe.pdf | sed -e 's/\(.*\).safe.pdf/\\inserttest{\1}/g' > umtest-suite-X.tex && \ ls L*.safe.pdf | sed -e 's/\(.*\).safe.pdf/\\inserttest{\1}/g' > umtest-suite-L.tex && \ - ls F*.safe.pdf | sed -e 's/\(.*\).safe.pdf/\\inserttest{\1}/g' > umtest-suite-F.tex; + ls F*-L.safe.pdf | sed -e 's/\(.*\).safe.pdf/\\inserttest{\1}/g' > umtest-suite-F.tex; $(builddir)/%: $(testdir)/% @mkdir -p $(builddir); \ @@ -329,11 +340,9 @@ $(Llonelypath): $(Llonelytest) $(builddir)/F%-L.diff.pdf: $(builddir)/F%-L.pdf @echo 'F$*: Comparing PDF from LuaLaTeX against reference output.' - if test $(shell compare \ - $(COMPARE_OPTS) \ - $(builddir)/F$*-L.pdf \ - $(testdir)/F$*-L.safe.pdf \ - $(builddir)/F$*-L.diff.pdf 2>&1) -le 1 ; then \ + compare_result="$$(compare "$(builddir)/F$*-L.pdf" "$(testdir)/F$*-L.safe.pdf" $(COMPARE_OPTS) "$(builddir)/F$*-L.diff.pdf" 2>&1)" ; \ + if [ 0 -eq "$$?" -a 1 -ge "$$compare_result" ] ; \ + then \ echo 'F$*: Test passed.' ; \ else \ echo 'F$*: Test failed.' ; \ @@ -343,11 +352,9 @@ $(builddir)/F%-L.diff.pdf: $(builddir)/F%-L.pdf $(builddir)/F%-X.diff.pdf: $(builddir)/F%-X.pdf @echo 'F$*: Comparing PDF from XeLaTeX against reference output.' - if test $(shell compare \ - $(COMPARE_OPTS) \ - $(builddir)/F$*-X.pdf \ - $(testdir)/F$*-X.safe.pdf \ - $(builddir)/F$*-X.diff.pdf 2>&1) -le 1 ; then \ + compare_result="$$(compare "$(builddir)/F$*-X.pdf" "$(testdir)/F$*-X.safe.pdf" $(COMPARE_OPTS) "$(builddir)/F$*-X.diff.pdf" 2>&1)" ; \ + if [ 0 -eq "$$?" -a 1 -ge "$$compare_result" ] ; \ + then \ echo 'F$*: Test passed.' ; \ else \ echo 'F$*: Test failed.' ; \ @@ -357,11 +364,11 @@ $(builddir)/F%-X.diff.pdf: $(builddir)/F%-X.pdf $(builddir)/F%-L.pdf: $(BUILDSOURCE) $(builddir)/F%-L.ltx @echo 'F$*: Generating PDF output with LuaLaTeX.' - @cd $(builddir); lualatex -interaction=nonstopmode F$*-L.ltx $(REDIRECT) + @cd $(builddir); $(run_lualatex) -interaction=nonstopmode F$*-L.ltx $(REDIRECT) $(builddir)/F%-X.pdf: $(BUILDSOURCE) $(builddir)/F%-X.ltx @echo 'F$*: Generating PDF output with XeLaTeX.' - @cd $(builddir); xelatex -interaction=nonstopmode F$*-X.ltx $(REDIRECT) + @cd $(builddir); $(run_xelatex) -interaction=nonstopmode F$*-X.ltx $(REDIRECT) $(builddir)/F%-L.ltx: $(builddir)/F%.ltx $(COPY) $< $@ @@ -374,9 +381,9 @@ $(builddir)/F%-X.ltx: $(builddir)/F%.ltx $(builddir)/L%.diff.pdf: $(builddir)/L%.pdf @echo 'L$*: Comparing PDF against reference output.' - if test $(shell compare $(COMPARE_OPTS) \ - $(builddir)/L$*.pdf $(testdir)/L$*.safe.pdf \ - $(builddir)/L$*.diff.pdf 2>&1) -le 1 ; then \ + compare_result="$$(compare "$(builddir)/L$*.pdf" "$(testdir)/L$*.safe.pdf" $(COMPARE_OPTS) "$(builddir)/L$*.diff.pdf" 2>&1)" ; \ + if [ 0 -eq "$$?" -a 1 -ge "$$compare_result" ] ; \ + then \ echo 'L$*: Test passed.' ; \ else \ echo 'L$*: Test failed.' ; \ @@ -386,11 +393,9 @@ $(builddir)/L%.diff.pdf: $(builddir)/L%.pdf $(builddir)/X%.diff.pdf: $(builddir)/X%.pdf @echo 'X$*: Comparing PDF against reference output.' - if test $(shell compare \ - $(COMPARE_OPTS) \ - $(builddir)/X$*.pdf \ - $(testdir)/X$*.safe.pdf \ - $(builddir)/X$*.diff.pdf 2>&1) -le 1 ; then \ + compare_result="$$(compare "$(builddir)/X$*.pdf" "$(testdir)/X$*.safe.pdf" $(COMPARE_OPTS) "$(builddir)/X$*.diff.pdf" 2>&1)" ; \ + if [ 0 -eq "$$?" -a 1 -ge "$$compare_result" ] ; \ + then \ echo 'X$*: Test passed.' ; \ else \ echo 'X$*: Test failed.' ; \ @@ -400,11 +405,11 @@ $(builddir)/X%.diff.pdf: $(builddir)/X%.pdf $(builddir)/X%.pdf: $(BUILDSOURCE) $(BUILDSUITE) $(builddir)/X%.ltx @echo 'X$*: Generating PDF output with XeLaTeX.' - @cd $(builddir); xelatex -interaction=nonstopmode X$*.ltx $(REDIRECT) + @cd $(builddir) && $(run_xelatex) -interaction=nonstopmode X$*.ltx $(REDIRECT) $(builddir)/L%.pdf: $(BUILDSOURCE) $(BUILDSUITE) $(builddir)/L%.ltx @echo 'L$*: Generating PDF output with LuaLaTeX.' - @cd $(builddir); lualatex -interaction=nonstopmode L$*.ltx $(REDIRECT) + @cd $(builddir) && $(run_lualatex) -interaction=nonstopmode L$*.ltx $(REDIRECT) #### HACK: allow `make ` run that test. diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-active-sscripts.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-active-sscripts.ltx new file mode 100644 index 00000000000..95a219a933d --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-active-sscripts.ltx @@ -0,0 +1,13 @@ +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont{Cambria Math} +\setlength\parskip{12pt} +\begin{document} +$x₀₁₂$ $x₁₂₃$ $x₂₃₄$ $x₃₄₅$ $x₄₅₆$ $x₅₆₇$ $x₆₇₈$ $x₇₈₉$ $x₈₉₊$ + +$x₉₊₋$ $x₊₋₍$ $x₋₍₌$ $x₍₌₎$ $x₌₎ₐ$ $x₎ₐₑ$ $xₐₑₒ$ $xₑₒₓ$ $xₒₓ₀$ $xₓ₀₁$ + +$x⁰ⁱ⁺⁾ⁿ²$ $xⁱ⁺⁾ⁿ²$ $xⁿ²$ $x²ⁱ⁺⁾ⁿ$ + +$x₃₄²ⁱ⁺⁾ⁿ$ +\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-mathversion.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-mathversion.ltx new file mode 100644 index 00000000000..7fe40976ebe --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-mathversion.ltx @@ -0,0 +1,13 @@ +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont{xits-math.otf} +\setmathfont[version=bold,Colour=009900]{xits-math.otf} +\begin{document} +\[ +(x+y)^{{z+c}^{a+b}} +\] +\mathversion{bold} +\[ +(x+y)^{{z+c}^{a+b}} +\] +\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-nolimits-spec.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-nolimits-spec.ltx new file mode 100644 index 00000000000..23900115403 --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-nolimits-spec.ltx @@ -0,0 +1,10 @@ +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont{xits-math.otf} +\begin{document} +\[\iiint_V\] +\removenolimits\iiint +\[\iiint_V\] +\addnolimits\iiint +\[\iiint_V\] +\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under-2.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under-2.ltx new file mode 100644 index 00000000000..f3cdfe89a3d --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under-2.ltx @@ -0,0 +1,17 @@ + +% see http://github.com/wspr/unicode-math/issues/212 + +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont[Colour=FF0000]{xits-math.otf} +\setmathfont + [range={\mathop},Colour=0000FF] + {xits-math.otf} + +\begin{document} + +\[ \underbrace{\int x dx}_{xyz} +\qquad +\overbrace{\int x dx}^{xyz} \] + +\end{document} diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under.ltx new file mode 100644 index 00000000000..2d67a983321 --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-over-under.ltx @@ -0,0 +1,15 @@ +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont{xits-math.otf} +\begin{document} +\[ +\overbrace{a+b+c+d}^{e/f/g/h} +\overbracket{a+b+c+d}^{e/f/g/h} +\overparen{a+b+c+d}^{e/f/g/h} +\] +\[ +\underbrace{a+b+c+d}_{e/f/g/h} +\underbracket{a+b+c+d}_{e/f/g/h} +\underparen{a+b+c+d}_{e/f/g/h} +\] +\end{document} diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-pkg-url.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-pkg-url.ltx new file mode 100644 index 00000000000..2d204d33794 --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-pkg-url.ltx @@ -0,0 +1,18 @@ +\input{umtest-preamble} +\usepackage{unicode-math} +\setmainfont{TeX Gyre Pagella} +\setsansfont{TeX Gyre Adventor} +\setmonofont{TeX Gyre Cursor} +\setmathfont{Cambria Math} +\usepackage{url} +\begin{document} +\centering\obeylines +\url{http://www.lmgtfy.com/} +\url{?q="~!@#$%^&*()<>`'} +\urlstyle{rm} +\url{http://www.lmgtfy.com/} +\url{?q="~!@#$%^&*()<>`'} +\urlstyle{sf} +\url{http://www.lmgtfy.com/} +\url{?q="~!@#$%^&*()<>`'} +\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-query-mathstyle.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-query-mathstyle.ltx new file mode 100644 index 00000000000..6b61f8ae14c --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-query-mathstyle.ltx @@ -0,0 +1,26 @@ +\input{umtest-preamble} + +\usepackage{unicode-math} +\setmathfont[Colour=FF0000]{xits-math.otf} + +\begin{document} + +\ExplSyntaxOn +[$\l_um_mathstyle_tl$]\ +[$\mathrm{\l_um_mathstyle_tl}$]\ +[$\mathup{\l_um_mathstyle_tl}$]\ +[$\mathit{\l_um_mathstyle_tl}$] + +[$\mathbf{\l_um_mathstyle_tl}$]\ +[$\mathbfit{\l_um_mathstyle_tl}$]\ +[$\mathbfup{\l_um_mathstyle_tl}$] + +[$\mathsf{\l_um_mathstyle_tl}$]\ +[$\mathsfit{\l_um_mathstyle_tl}$]\ +[$\mathsfup{\l_um_mathstyle_tl}$] + +[$\mathbfsf{\l_um_mathstyle_tl}$]\ +[$\mathbfsfit{\l_um_mathstyle_tl}$]\ +[$\mathbfsfup{\l_um_mathstyle_tl}$] + +\end{document} diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-range-prime-check.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-range-prime-check.ltx new file mode 100644 index 00000000000..3181d7b8f79 --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-range-prime-check.ltx @@ -0,0 +1,17 @@ +% +% See http://github.com/wspr/unicode-math/issues/171 +% +% The fix is related to the fact that primes use the `mathactive' +% section of the unicode-math code, which is now controlled by +% the parsing range feature (as it always should have been). + +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont[Colour=FF0000]{xits-math.otf} +\setmathfont + [range=\mathop,Colour=0000FF] + {xits-math.otf} + +\begin{document} +\[ f(x) = \int f'(x) dx \] +\end{document} diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-slash-delim-2.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-slash-delim-2.ltx index 5d62e1a15ed..179ae3ef968 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-slash-delim-2.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-slash-delim-2.ltx @@ -1,4 +1,4 @@ -\documentclass{article} +\input{umtest-preamble} \usepackage{unicode-math} \begin{document} \newcommand\ARRAY[4]{% diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/F-sscript-features.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-sscript-features.ltx new file mode 100644 index 00000000000..3db6e6547c6 --- /dev/null +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-sscript-features.ltx @@ -0,0 +1,10 @@ +\input{umtest-preamble} +\usepackage{unicode-math} +\setmathfont[script-font = {Asana Math}, + script-features = {Style=MathScript,Colour=FF0000}, + sscript-font = {Cambria Math}, + sscript-features= {Style=MathScriptScript,Colour=0000FF}] + {XITS Math} +\begin{document} +\[123456789^{123456789^{123456789}}\] +\end{document} diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/L602b.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/L602b.ltx index 15be38ca38e..ce99258e075 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/L602b.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/L602b.ltx @@ -2,7 +2,7 @@ \usepackage{unicode-math} -\setmathfont{Cambria Math} +\setmathfont{xits-math.otf} \ExplSyntaxOn diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/L603b.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/L603b.ltx index 40f1aaa8606..9b53e908fcf 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/L603b.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/L603b.ltx @@ -3,7 +3,7 @@ \usepackage{amsmath} \usepackage{unicode-math} -\setmathfont{Cambria Math} +\setmathfont{xits-math.otf} \ExplSyntaxOn diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X204a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/X204a.ltx deleted file mode 100644 index 95a219a933d..00000000000 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X204a.ltx +++ /dev/null @@ -1,13 +0,0 @@ -\input{umtest-preamble} -\usepackage{unicode-math} -\setmathfont{Cambria Math} -\setlength\parskip{12pt} -\begin{document} -$x₀₁₂$ $x₁₂₃$ $x₂₃₄$ $x₃₄₅$ $x₄₅₆$ $x₅₆₇$ $x₆₇₈$ $x₇₈₉$ $x₈₉₊$ - -$x₉₊₋$ $x₊₋₍$ $x₋₍₌$ $x₍₌₎$ $x₌₎ₐ$ $x₎ₐₑ$ $xₐₑₒ$ $xₑₒₓ$ $xₒₓ₀$ $xₓ₀₁$ - -$x⁰ⁱ⁺⁾ⁿ²$ $xⁱ⁺⁾ⁿ²$ $xⁿ²$ $x²ⁱ⁺⁾ⁿ$ - -$x₃₄²ⁱ⁺⁾ⁿ$ -\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X205a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/X205a.ltx deleted file mode 100644 index f5887be747d..00000000000 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X205a.ltx +++ /dev/null @@ -1,10 +0,0 @@ -\input{umtest-preamble} -\usepackage{unicode-math} -\setmathfont{Cambria Math} -\begin{document} -\[\iiint_V\] -\removenolimits\iiint -\[\iiint_V\] -\addnolimits\iiint -\[\iiint_V\] -\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X300a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/X300a.ltx deleted file mode 100644 index 694c33da949..00000000000 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X300a.ltx +++ /dev/null @@ -1,10 +0,0 @@ -\input{umtest-preamble} -\usepackage{unicode-math} -\setmathfont[script-font = {Asana Math}, - script-features = {ScriptStyle,Colour=FF0000}, - sscript-font = {Cambria Math}, - sscript-features= {ScriptScriptStyle,Colour=0000FF}] - {Cambria Math} -\begin{document} -\[123456789^{123456789^{123456789}}\] -\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X400a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/X400a.ltx deleted file mode 100644 index 014bfe1d35a..00000000000 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X400a.ltx +++ /dev/null @@ -1,18 +0,0 @@ -\input{umtest-preamble} -\usepackage[trace=on]{unicode-math} -\setmainfont{TeX Gyre Pagella} -\setsansfont{TeX Gyre Adventor} -\setmonofont{TeX Gyre Cursor} -\setmathfont{Cambria Math} -\usepackage{url} -\begin{document} -\centering\obeylines -\url{http://www.lmgtfy.com/} -\url{?q="~!@#$%^&*()<>`'} -\urlstyle{rm} -\url{http://www.lmgtfy.com/} -\url{?q="~!@#$%^&*()<>`'} -\urlstyle{sf} -\url{http://www.lmgtfy.com/} -\url{?q="~!@#$%^&*()<>`'} -\end{document} \ No newline at end of file diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X601b.ignore.pdf b/Master/texmf-dist/source/latex/unicode-math/testfiles/X601b.ignore.pdf deleted file mode 100644 index ebb5c2dbc98..00000000000 Binary files a/Master/texmf-dist/source/latex/unicode-math/testfiles/X601b.ignore.pdf and /dev/null differ diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X601f.ignore.pdf b/Master/texmf-dist/source/latex/unicode-math/testfiles/X601f.ignore.pdf deleted file mode 100644 index d8d62dd116f..00000000000 Binary files a/Master/texmf-dist/source/latex/unicode-math/testfiles/X601f.ignore.pdf and /dev/null differ diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-F.tex b/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-F.tex index 2a2b99cbe4c..4f97a00b0e2 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-F.tex +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-F.tex @@ -1,26 +1,22 @@ +\inserttest{F-active-sscripts-L} \inserttest{F-alph-spaces-L} -\inserttest{F-alph-spaces-X} \inserttest{F-arrow-accents-L} -\inserttest{F-arrow-accents-X} \inserttest{F-mathstyle-french-L} -\inserttest{F-mathstyle-french-X} \inserttest{F-mathstyle-iso-L} -\inserttest{F-mathstyle-iso-X} \inserttest{F-mathstyle-literal-L} -\inserttest{F-mathstyle-literal-X} \inserttest{F-mathstyle-tex-L} -\inserttest{F-mathstyle-tex-X} \inserttest{F-mathstyle-upright-L} -\inserttest{F-mathstyle-upright-X} +\inserttest{F-mathversion-L} +\inserttest{F-nolimits-spec-L} +\inserttest{F-over-under-2-L} +\inserttest{F-over-under-L} +\inserttest{F-pkg-url-L} \inserttest{F-primes-1-L} -\inserttest{F-primes-1-X} \inserttest{F-primes-2-L} -\inserttest{F-primes-2-X} \inserttest{F-primes-back-L} -\inserttest{F-primes-back-X} +\inserttest{F-query-mathstyle-L} +\inserttest{F-range-prime-check-L} \inserttest{F-slash-delim-2-L} -\inserttest{F-slash-delim-2-X} \inserttest{F-sqrt-L} -\inserttest{F-sqrt-X} \inserttest{F-sqrt-n-L} -\inserttest{F-sqrt-n-X} +\inserttest{F-sscript-features-L} diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-X.tex b/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-X.tex index 4bc92dec7cb..6ab838ffe64 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-X.tex +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/umtest-suite-X.tex @@ -90,14 +90,10 @@ \inserttest{X202a} \inserttest{X202b} \inserttest{X203a} -\inserttest{X204a} -\inserttest{X205a} \inserttest{X206a} \inserttest{X206b} \inserttest{X206c} \inserttest{X207a} -\inserttest{X300a} -\inserttest{X400a} \inserttest{X401a} \inserttest{X500a} \inserttest{X501a} @@ -113,6 +109,8 @@ \inserttest{X600d} \inserttest{X600f} \inserttest{X601a} +\inserttest{X601b} +\inserttest{X601f} \inserttest{X604a} \inserttest{X604b} \inserttest{X610f} diff --git a/Master/texmf-dist/source/latex/unicode-math/unicode-math-testsuite.ltx b/Master/texmf-dist/source/latex/unicode-math/unicode-math-testsuite.ltx index e6e0d845bd8..0744cfbc4ec 100644 --- a/Master/texmf-dist/source/latex/unicode-math/unicode-math-testsuite.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/unicode-math-testsuite.ltx @@ -37,6 +37,8 @@ When the test suite is run, the new output is compared pixel by pixel with that \section{Test files for both engines} +Only the Lua\LaTeX\ output is shown; there will be (usually only) negligible differences between the outout between the two engines. + \input{umtest-suite-F.tex} \def\prefix{} diff --git a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx index b6121b84d02..458c3203f4f 100644 --- a/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx +++ b/Master/texmf-dist/source/latex/unicode-math/unicode-math.dtx @@ -35,7 +35,13 @@ This work is "author-maintained" by Will Robertson. \generate{\file{unicode-math.sty}{ \from{unicode-math.dtx}{preamble} \from{unicode-math.dtx}{msg} - \from{unicode-math.dtx}{package,stix} + \from{unicode-math.dtx}{load} +}} +\generate{\file{unicode-math-xetex.sty}{ + \from{unicode-math.dtx}{package,XE} +}} +\generate{\file{unicode-math-luatex.sty}{ + \from{unicode-math.dtx}{package,LU} }} \def\MetaPrefix{--} \usepreamble\luapreamble @@ -48,9 +54,11 @@ This work is "author-maintained" by Will Robertson. \endgroup \ProvidesFile{unicode-math.dtx} % -%\ProvidesPackage{unicode-math} +%\ProvidesPackage{unicode-math} +%\ProvidesPackage{unicode-math-xetex} +%\ProvidesPackage{unicode-math-luatex} %<*preamble> - [2011/07/31 v0.5e Unicode maths in XeLaTeX and LuaLaTeX] + [2011/09/18 v0.6 Unicode maths in XeLaTeX and LuaLaTeX] % %<*internal> \documentclass[a4paper]{ltxdoc} @@ -74,27 +82,16 @@ This work is "author-maintained" by Will Robertson. % % \begin{abstract} % \noindent -% \begingroup -% \bfseries -% Warning! This package is experimental and subject to change without regard -% for backwards compatibility. -% Performance issues may be encountered until algorithms are refined. -% \endgroup -% -% (But don't take the warning too seriously, either. -% I hope the package is now ready to use.) -% -% This is the first release of the \pkg{unicode-math} package, which is +% This is the first incarnation of the \pkg{unicode-math} package, which is % intended to be a complete implementation of Unicode % maths for \LaTeX\ using the \XeTeX\ and Lua\TeX\ typesetting engines. -% With this package, changing maths fonts will be as easy as changing -% text fonts --- not that there are many Unicode maths fonts yet. +% With this package, changing maths fonts is as easy as changing +% text fonts --- and there are more and more maths fonts appearing now. % Maths input can also be simplified with Unicode since literal glyphs may be % entered instead of control sequences in your document source. % % The package provides support for both \XeTeX\ and Lua\TeX. The different -% engines provide differing levels of support for Unicode maths, and -% support for Lua\TeX's features in this area is still incomplete. +% engines provide differing levels of support for Unicode maths. % Please let us know of any troubles. % % Alongside this documentation file, you should be able to find a minimal @@ -102,7 +99,7 @@ This work is "author-maintained" by Will Robertson. % `\texttt{unimath-example.ltx}'. It also comes with a separate document, % `\texttt{unimath-symbols.pdf}', % containing a complete listing of mathematical symbols defined by -% \pkg{unicode-math}. +% \pkg{unicode-math}, including comparisons between different fonts. % % Finally, while the STIX fonts may be used with this package, accessing % their alphabets in their `private user area' is not yet supported. @@ -117,6 +114,7 @@ This work is "author-maintained" by Will Robertson. % \tableofcontents % % \newpage +% \part{User documentation} % \section{Introduction} % % This document describes the \pkg{unicode-math} package, which is an @@ -134,9 +132,11 @@ This work is "author-maintained" by Will Robertson. % Microsoft for developing the mathematics extension to OpenType as part of % Microsoft Office~2007; % Jonathan Kew for implementing Unicode math support in \XeTeX; +% Taco Hoekwater for implementing Unicode math support in \LuaTeX; % Barbara Beeton for her prodigious effort compiling the definitive list of Unicode math % glyphs and their \LaTeX\ names (inventing them where necessary), and also -% for her thoughtful replies to my sometimes incessant questions. +% for her thoughtful replies to my sometimes incessant questions; +% Philipp Stephani for extending the package to support \LuaTeX. % Ross Moore and Chris Rowley have provided moral and technical support % from the very early days with great insight into the issues we face trying % to extend and use \TeX\ in the future. @@ -233,10 +233,6 @@ This work is "author-maintained" by Will Robertson. % such symbols is not necessarily going to be consistent; please report % problem areas to me. % -% \LaTeX's concept of math `versions' is not yet supported. The only way to -% get bold maths is to add markup for it all. This is still an area that -% requires investigation. -% % Symbols for maths characters have been inherited from the STIX project and % may change slightly in the long term. We have tried to preserve backwards % compatibility with \LaTeX\ conventions as best as possible; again, please @@ -289,7 +285,7 @@ This work is "author-maintained" by Will Robertson. % where \meta{unicode range} is a comma-separated list of Unicode slots and % ranges such as |{"27D0-"27EB,"27FF,"295B-"297F}|. You may also use the macro % for accessing the glyph, such as \cs{int}, or whole collection of symbols with -% the same math type, such as \cs{mathopen}, or complete math alphabets such as \cs{mathbb}. +% the same math type, such as \cs{mathopen}, or complete math styles such as \cs{mathbb}. % (Only numerical slots, however, can be used in ranged declarations.) % % \paragraph{\XeTeX\ users only} @@ -305,7 +301,7 @@ This work is "author-maintained" by Will Robertson. % Here is the current plan. % \begin{itemize} % \item |[range=\mathbb]| to use the font for `bb' letters only. -% \item |[range=\mathbfsfit/{greek,Greek}]| for Greek lowercase and uppercase only (with |latin|, |Latin|, |num| as well for Latin lower-/upper-case and numbers). +% \item |[range=\mathbfsfit/{greek,Greek}]| for Greek lowercase and uppercase only (also with |latin|, |Latin|, |num| as possible options for Latin lower-/upper-case and numbers, resp.). % \item |[range=\mathsfit->\mathbfsfit]| to map to different output alphabet(s) (which is rather useless right now but will become less useless in the future). % \end{itemize} % @@ -314,7 +310,7 @@ This work is "author-maintained" by Will Robertson. % Therefore, to use an \ascii-encoded fractur font, for example, write % \par{\centering|\setmathfont[range=\mathfrak]{SomeFracturFont}|\par}\noindent % and because the math plane fractur glyphs will be missing, \pkg{unicode-math} will know to use the \ascii\ ones instead. -% If necessary (but why?) this behaviour can be forced with |[range=\mathfrac->\mathup]|. +% If necessary this behaviour can be forced with |[range=\mathfrac->\mathup]|. % % % \subsection{Script and scriptscript fonts/features} @@ -324,13 +320,30 @@ This work is "author-maintained" by Will Robertson. % for scriptsize and scriptscriptsize symbols (the $B$ and $C$, respectively, % in $A_{B_C}$). Other fonts will possibly use entirely separate fonts. % -% Not yet implemented: Both of these options -% must be taken into account. I hope this will be mostly automatic from the -% users' points of view. The |+ssty| feature can be detected and applied -% automatically, and appropriate optical size information embedded in the -% fonts will ensure this latter case. Fine tuning should be possible -% automatically with \pkg{fontspec} options. We might have to wait until -% MnMath, for example, before we really know. +% The features |script-font| and |sscript-font| allow alternate fonts to be +% selected for the script and scriptscript sizes, and |script-features| and +% |sscript-features| to apply different OpenType features to them. +% +% By default |script-features| is defined as |Style=MathScript| and |sscript-features| is |Style=MathScriptScript|. +% These correspond to the two levels of OpenType's |ssty| feature tag. +% If the |(s)script-features| options are specified manually, you must +% additionally specify the |Style| options as above. +% +% +% \subsection{Maths `versions'} +% +% \LaTeX\ uses a concept known as `maths versions' to switch math fonts +% mid-document. +% This is useful because it is more efficient than loading a complete maths +% font from scratch every time---especially with thousands of glyphs in the case of Unicode maths! +% The canonical example for maths versions is to select a `bold' maths font +% which might be suitable for section headings, say. +% (Not everyone agrees with this typesetting choice, though; be careful.) +% +% To select a new maths font in a particular version, use the syntax +% \codeline{\cmd\setmathfont|[version=|\meta{version name}|,|\meta{font features}|]|\marg{font name}} +% and to switch between maths versions mid-document use the standard \LaTeX\ command +% \cmd\mathversion\marg{version name}. % % \section{Maths input} % @@ -346,7 +359,7 @@ This work is "author-maintained" by Will Robertson. % Classically, \TeX\ uses italic lowercase Greek letters and \emph{upright} % uppercase Greek letters for variables in mathematics. This is contrary to % the \textsc{iso} standards of using italic forms for both upper- and lowercase. -% Furthermore, the French (contrary again, \emph{quelle surprise}) have been +% Furthermore, the French have been % known to use upright uppercase \emph{Latin} letters as well as upright % upper- and lowercase Greek. Finally, it is not unknown to use upright letters % for all characters, as seen in the Euler fonts. @@ -354,7 +367,7 @@ This work is "author-maintained" by Will Robertson. % The \pkg{unicode-math} package accommodates these possibilities with an % interface heavily inspired by Walter Schmidt's \pkg{lucimatx} package: a % package option \opt{math-style} that takes one of four arguments: -% \opt{TeX}, \opt{ISO}, \opt{french}, or \opt{upright}. +% \opt{TeX}, \opt{ISO}, \opt{french}, or \opt{upright} (case sensitive). % % The philosophy behind the interface to the mathematical alphabet symbols % lies in \LaTeX's attempt of separating content and formatting. Because input @@ -469,7 +482,7 @@ This work is "author-maintained" by Will Robertson. % But \LaTeX's \cs{mathsf} is \textsl{upright} sans serif. % % Therefore I reluctantly add the package options |[sans-style=upright]| and |[sans-style=italic]| to control the behaviour of \cs{mathsf}. -% The |upright| style sets up the command to use the seemingly-useless upright sans serif, including Greek; +% The |upright| style sets up the command to use upright sans serif, including Greek; % the |italic| style switches to using italic in both Latin and Greek alphabets. % In other words, this option simply changes the meaning of \cs{mathsf} to either \cs{mathsfup} or \cs{mathsfit}, respectively. % Please let me know if more granular control is necessary here. @@ -498,11 +511,11 @@ This work is "author-maintained" by Will Robertson. % This may change in the future. % % \begin{table} -% \caption{Mathematical alphabets defined in Unicode. Black dots indicate an alphabet exists in the font specified; grey dots indicate shapes that should always be taken from the upright font even in the italic style. See main text for description of \cs{mathbbit}.} +% \caption{Mathematical alphabets defined in Unicode. Black dots indicate an alphabet exists in the font specified; blue dots indicate shapes that should always be taken from the upright font even in the italic style. See main text for description of \cs{mathbbit}.} % \tablabel{mathalphabets} % \centering % \def\Y{\textbullet} -% \def\M{\textcolor{gray}{\textbullet}} +% \def\M{\textcolor{blue}{\textbullet}} % \begin{tabular}{@{} lll l ccc @{}} % \toprule % \multicolumn{3}{c}{Font} & & \multicolumn{3}{c}{Alphabet} \\ @@ -810,8 +823,8 @@ This work is "author-maintained" by Will Robertson. % % Of \unichar{2044} {fraction slash}, TR25 says that it is: % \begin{quote} -% \dots used to build up simple fractions in running text\dots -% however parsers of mathematical texts should be prepared to handle fraction slash +% \dots used to build up simple fractions in running text\dots +% however parsers of mathematical texts should be prepared to handle fraction slash % when it is received from other sources. % \end{quote} % @@ -823,7 +836,7 @@ This work is "author-maintained" by Will Robertson. % \paragraph{Backslash} % % The \unichar{005C} {reverse solidus} character \cs{backslash} is used for denoting -% double cosets: $A\backslash B$. (So I'm led to believe.) +% double cosets: $A\backslash B$. (So I'm led to believe.) % It may be used as a `stretchy' delimiter if supported by the font. % % MathML uses \unichar{2216} {set minus} like this: $A\smallsetminus B$.\footnote{\S4.4.5.11 \url{http://www.w3.org/TR/MathML3/}} @@ -1007,14 +1020,35 @@ This work is "author-maintained" by Will Robertson. % (Not yet implemented.) % \fi % +% \subsubsection{Programmer's interface} +% +% (Tentative and under construction.) +% If you are writing some code that needs to know the current +% maths style (\cs{mathbf}, \cs{mathit}, etc.), you can query the +% variable \cs{l_um_mathstyle_tl}. It will contain the maths style +% without the leading `math' string; for example, +% |\mathbf { \show \l_um_mathstyle_tl }| +% will produce `bf'. % % \StopEventually{} % -% \part{The \pkg{unicode-math} package} +% \part{Package implementation} % -%<*preamble> +% We (later on) bifurcate the package based on the engine being used. +% \begin{macrocode} +%<*load> +\luatex_if_engine:T { \usepackage{unicode-math-luatex} \endinput } +\xetex_if_engine:T { \usepackage{unicode-math-xetex} \endinput } +% +% \end{macrocode} +% +% \section{Header code} +% +% The shared part of the code starts here before the split mentioned above. % -% \section{Things we need} +% \begin{macrocode} +%<*preamble&!XE&!LU> +% \end{macrocode} % % \begin{macrocode} \usepackage{ifxetex,ifluatex} @@ -1028,12 +1062,11 @@ This work is "author-maintained" by Will Robertson. % % \paragraph{Packages} % \begin{macrocode} -\RequirePackage{expl3}[2009/08/12] +\RequirePackage{expl3}[2011/07/01] \RequirePackage{xparse}[2009/08/31] \RequirePackage{l3keys2e} \RequirePackage{fontspec}[2010/10/25] \RequirePackage{catchfile} -\RequirePackage{trimspaces}% I'd like to incorporate this into expl3... \RequirePackage{fix-cm} % avoid some warnings \RequirePackage{filehook}[2011/01/03] % \end{macrocode} @@ -1043,20 +1076,6 @@ This work is "author-maintained" by Will Robertson. \ExplSyntaxOn % \end{macrocode} % -% \paragraph{Forwards compatibility} -% \begin{macrocode} -\cs_if_exist:NF \char_set_catcode_other:N - { - \cs_set_eq:NN \c_math_toggle_token \c_math_shift_token - \cs_set_eq:NN \char_set_catcode_other:N \char_make_other:N - \cs_set_eq:NN \char_set_catcode_active:N \char_make_active:N - \cs_set_eq:NN \char_set_catcode_active:n \char_make_active:n - \cs_set_eq:NN \char_set_catcode_escape:N \char_make_escape:N - \cs_set_eq:NN \char_set_catcode_math_superscript:N - \char_make_math_superscript:N - } -% \end{macrocode} -% % \paragraph{Extra \pkg{expl3} variants} % \begin{macrocode} \cs_generate_variant:Nn \tl_put_right:Nn {cx} @@ -1072,20 +1091,23 @@ This work is "author-maintained" by Will Robertson. \cs:w #3 \exp_after:wN \cs_end: \cs:w #4 \cs_end: } -\cs_new_protected_nopar:Npn \bool_const:Nn #1 #2 { - \bool_new:N #1 - \bool_set:Nn #1 { #2 } -} +% \end{macrocode} +% +% For for old command in lualatex-math: (Sept 2011) +% \begin{macrocode} +\cs_set_eq:NN \tl_replace_in:Nnn \tl_replace_once:Nnn % \end{macrocode} % % % \paragraph{Conditionals} -% Engine capabilities: +% % \begin{macrocode} -\bool_const:Nn \c_um_have_fixed_accents_bool { - \c_luatex_is_engine_bool && \int_compare_p:n { \luatexversion > 64 } +\cs_new_protected_nopar:Npn \bool_const:Nn #1 #2 { + \bool_new:N #1 + \bool_set:Nn #1 { #2 } } % \end{macrocode} +% % \begin{macrocode} \bool_new:N \l_um_ot_math_bool \bool_new:N \l_um_init_bool @@ -1120,7 +1142,7 @@ This work is "author-maintained" by Will Robertson. \bool_new:N \g_um_literal_Nabla_bool \bool_new:N \g_um_literal_partial_bool \bool_new:N \g_um_texgreek_bool -\bool_gset_true:N \g_um_texgreek_bool +\bool_set_true:N \g_um_texgreek_bool \bool_new:N \l_um_smallfrac_bool \bool_new:N \g_um_literal_colon_bool % \end{macrocode} @@ -1131,12 +1153,12 @@ This work is "author-maintained" by Will Robertson. % \end{macrocode} % % \begin{macrocode} -\tl_set:Nn \g_um_math_alphabet_name_latin_tl {Latin,~lowercase} -\tl_set:Nn \g_um_math_alphabet_name_Latin_tl {Latin,~uppercase} -\tl_set:Nn \g_um_math_alphabet_name_greek_tl {Greek,~lowercase} -\tl_set:Nn \g_um_math_alphabet_name_Greek_tl {Greek,~uppercase} -\tl_set:Nn \g_um_math_alphabet_name_num_tl {Numerals} -\tl_set:Nn \g_um_math_alphabet_name_misc_tl {Misc.} +\tl_const:Nn \c_um_math_alphabet_name_latin_tl {Latin,~lowercase} +\tl_const:Nn \c_um_math_alphabet_name_Latin_tl {Latin,~uppercase} +\tl_const:Nn \c_um_math_alphabet_name_greek_tl {Greek,~lowercase} +\tl_const:Nn \c_um_math_alphabet_name_Greek_tl {Greek,~uppercase} +\tl_const:Nn \c_um_math_alphabet_name_num_tl {Numerals} +\tl_const:Nn \c_um_math_alphabet_name_misc_tl {Misc.} % \end{macrocode} % % \subsection{Extras} @@ -1158,112 +1180,393 @@ This work is "author-maintained" by Will Robertson. % \end{macrocode} % \end{macro} % -% \subsection{Compatibility with Lua\TeX} +% \subsection{Function variants} % % \begin{macrocode} -\xetex_or_luatex:nnn { \cs_new:Npn \um_cs_compat:n #1 } - { \cs_set_eq:cc {U#1} {XeTeX#1} } - { \cs_set_eq:cc {U#1} {luatexU#1} } -\um_cs_compat:n {mathcode} -\um_cs_compat:n {delcode} -\um_cs_compat:n {mathcodenum} -\um_cs_compat:n {mathcharnum} -\um_cs_compat:n {mathchardef} -\um_cs_compat:n {radical} -\um_cs_compat:n {mathaccent} -\um_cs_compat:n {delimiter} -\luatex_if_engine:T { - \RequirePackage { lualatex-math } [ 2011/05/05 ] -} +\cs_generate_variant:Nn \fontspec_set_family:Nnn {Nx} +\cs_generate_variant:Nn \fontspec_set_fontface:NNnn {NNx} % \end{macrocode} % -% \subsubsection{Function variants} +% \subsection{Package options} % +% \begin{macro}{\unimathsetup} +% This macro can be used in lieu of or later to override +% options declared when the package is loaded. % \begin{macrocode} -\cs_generate_variant:Nn \fontspec_select:nn {x} +\DeclareDocumentCommand \unimathsetup {m} { + \keys_set:nn {unicode-math} {#1} +} % \end{macrocode} +% \end{macro} % -% \subsubsection{\Hologo{LuaLaTeX} module} % -% We create a \pkg{luatexbase} module that contains Lua functions for use with \hologo{LuaLaTeX}. +% \paragraph{math-style} % \begin{macrocode} -\luatex_if_engine:T { - \RequirePackage { luatexbase } - \RequirePackage { luaotfload } [ 2010/11/26 ] - \RequireLuaModule { unicode-math } [ 2011/04/23 ] +\keys_define:nn {unicode-math} { + normal-style .choice_code:n = + { + \bool_set_false:N \g_um_literal_bool + \ifcase \l_keys_choice_int + \bool_set_false:N \g_um_upGreek_bool + \bool_set_false:N \g_um_upgreek_bool + \bool_set_false:N \g_um_upLatin_bool + \bool_set_false:N \g_um_uplatin_bool + \or + \bool_set_true:N \g_um_upGreek_bool + \bool_set_false:N \g_um_upgreek_bool + \bool_set_false:N \g_um_upLatin_bool + \bool_set_false:N \g_um_uplatin_bool + \or + \bool_set_true:N \g_um_upGreek_bool + \bool_set_true:N \g_um_upgreek_bool + \bool_set_true:N \g_um_upLatin_bool + \bool_set_false:N \g_um_uplatin_bool + \or + \bool_set_true:N \g_um_upGreek_bool + \bool_set_true:N \g_um_upgreek_bool + \bool_set_true:N \g_um_upLatin_bool + \bool_set_true:N \g_um_uplatin_bool + \or + \bool_set_true:N \g_um_literal_bool + \fi + } , + normal-style .generate_choices:n = {ISO,TeX,french,upright,literal} , } -% -%<*lua> -local err, warn, info, log = luatexbase.provides_module({ - name = "unicode-math", - date = "2011/04/23", - version = 0.1, - description = "Unicode math typesetting for LuaLaTeX", - author = "Khaled Hosny, Will Robertson, Philipp Stephani", - licence = "LPPL v1.3+" -}) % \end{macrocode} -% \LuaTeX\ does not provide interface to accessing -% \texttt{(Script)ScriptPercentScaleDown} math constants, so we -% emulate \XeTeX\ behaviour by setting \cs{fontdimen10} and -% \cs{fontdimen11}. +% % \begin{macrocode} -local function set_sscale_dimens(fontdata) - local mc = fontdata.MathConstants - if mc then - fontdata.parameters[10] = mc.ScriptPercentScaleDown or 70 - fontdata.parameters[11] = mc.ScriptScriptPercentScaleDown or 50 - end -end -luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_math.set_sscale_dimens") -% +\keys_define:nn {unicode-math} { + math-style .choice_code:n = + { + \ifcase \l_keys_choice_int + \unimathsetup { + normal-style=ISO, + bold-style=ISO, + sans-style=italic, + nabla=upright, + partial=italic, + } + \or + \unimathsetup { + normal-style=TeX, + bold-style=TeX, + sans-style=upright, + nabla=upright, + partial=italic, + } + \or + \unimathsetup { + normal-style=french, + bold-style=upright, + sans-style=upright, + nabla=upright, + partial=upright, + } + \or + \unimathsetup { + normal-style=upright, + bold-style=upright, + sans-style=upright, + nabla=upright, + partial=upright, + } + \or + \unimathsetup { + normal-style=literal, + bold-style=literal, + sans-style=literal, + colon=literal, + nabla=literal, + partial=literal, + } + \fi + } , + math-style .generate_choices:n = {ISO,TeX,french,upright,literal} , +} % \end{macrocode} % -% (Error messages and warning definitions go here from the |msg| chunk -% defined in \secref[vref]{codemsg}.) +% \paragraph{bold-style} +% \begin{macrocode} +\keys_define:nn {unicode-math} { + bold-style .choice_code:n = { + \bool_set_false:N \g_um_bfliteral_bool + \ifcase \l_keys_choice_int + \bool_set_false:N \g_um_bfupGreek_bool + \bool_set_false:N \g_um_bfupgreek_bool + \bool_set_false:N \g_um_bfupLatin_bool + \bool_set_false:N \g_um_bfuplatin_bool + \or + \bool_set_true:N \g_um_bfupGreek_bool + \bool_set_false:N \g_um_bfupgreek_bool + \bool_set_true:N \g_um_bfupLatin_bool + \bool_set_true:N \g_um_bfuplatin_bool + \or + \bool_set_true:N \g_um_bfupGreek_bool + \bool_set_true:N \g_um_bfupgreek_bool + \bool_set_true:N \g_um_bfupLatin_bool + \bool_set_true:N \g_um_bfuplatin_bool + \or + \bool_set_true:N \g_um_bfliteral_bool + \fi + } , + bold-style .generate_choices:n = {ISO,TeX,upright,literal} , +} +% \end{macrocode} % +% \paragraph{sans-style} % \begin{macrocode} -%<*package> +\keys_define:nn {unicode-math} { + sans-style .choice_code:n = { + \ifcase \l_keys_choice_int + \bool_set_false:N \g_um_upsans_bool + \or + \bool_set_true:N \g_um_upsans_bool + \or + \bool_set_true:N \g_um_sfliteral_bool + \fi + } , + sans-style .generate_choices:n = {italic,upright,literal} , +} % \end{macrocode} % -% \subsection{Alphabet Unicode positions} % -% Before we begin, let's define the positions of the various Unicode -% alphabets so that our code is a little more readable.\footnote{`\textsc{u.s.v.}' stands -% for `Unicode scalar value'.} +% \paragraph{Nabla and partial} +% \begin{macrocode} +\keys_define:nn {unicode-math} { + nabla .choice_code:n = { + \bool_set_false:N \g_um_literal_Nabla_bool + \ifcase \l_keys_choice_int + \bool_set_true:N \g_um_upNabla_bool + \or + \bool_set_false:N \g_um_upNabla_bool + \or + \bool_set_true:N \g_um_literal_Nabla_bool + \fi + } , + nabla .generate_choices:n = {upright,italic,literal} , +} +% \end{macrocode} % -% Rather than `readable', in the end, this makes the code more extensible. % \begin{macrocode} -\cs_new:Npn \usv_set:nnn #1#2#3 { - \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} +\keys_define:nn {unicode-math} { + partial .choice_code:n = { + \bool_set_false:N \g_um_literal_partial_bool + \ifcase \l_keys_choice_int + \bool_set_true:N \g_um_uppartial_bool + \or + \bool_set_false:N \g_um_uppartial_bool + \or + \bool_set_true:N \g_um_literal_partial_bool + \fi + } , + partial .generate_choices:n = {upright,italic,literal} , } -\cs_new:Npn \um_to_usv:nn #1#2 { g_um_#1_#2_usv } % \end{macrocode} -% \paragraph{Alphabets} +% +% \paragraph{Epsilon and phi shapes} % \begin{macrocode} -\usv_set:nnn {up}{num}{48} -\usv_set:nnn {up}{Latin}{65} -\usv_set:nnn {up}{latin}{97} -\usv_set:nnn {up}{Greek}{"391} -\usv_set:nnn {up}{greek}{"3B1} -\usv_set:nnn {it}{Latin}{"1D434} -\usv_set:nnn {it}{latin}{"1D44E} -\usv_set:nnn {it}{Greek}{"1D6E2} -\usv_set:nnn {it}{greek}{"1D6FC} -\usv_set:nnn {bb}{num}{"1D7D8} -\usv_set:nnn {bb}{Latin}{"1D538} -\usv_set:nnn {bb}{latin}{"1D552} -\usv_set:nnn {scr}{Latin}{"1D49C} -\usv_set:nnn {cal}{Latin}{"1D49C} -\usv_set:nnn {scr}{latin}{"1D4B6} -\usv_set:nnn {frak}{Latin}{"1D504} -\usv_set:nnn {frak}{latin}{"1D51E} -\usv_set:nnn {sf}{num}{"1D7E2} -\usv_set:nnn {sfup}{num}{"1D7E2} -\usv_set:nnn {sfit}{num}{"1D7E2} -\usv_set:nnn {sfup}{Latin}{"1D5A0} -\usv_set:nnn {sf}{Latin}{"1D5A0} -\usv_set:nnn {sfup}{latin}{"1D5BA} +\keys_define:nn {unicode-math} { + vargreek-shape .choice: , + vargreek-shape / unicode .code:n = { + \bool_set_false:N \g_um_texgreek_bool + } , + vargreek-shape / TeX .code:n = { + \bool_set_true:N \g_um_texgreek_bool + } +} +% \end{macrocode} +% +% \paragraph{Colon style} +% \begin{macrocode} +\keys_define:nn {unicode-math} { + colon .choice: , + colon / literal .code:n = { + \bool_set_true:N \g_um_literal_colon_bool + } , + colon / TeX .code:n = { + \bool_set_false:N \g_um_literal_colon_bool + } +} +% \end{macrocode} +% +% \paragraph{Slash delimiter style} +% \begin{macrocode} +\keys_define:nn {unicode-math} { + slash-delimiter .choice: , + slash-delimiter / ascii .code:n = { + \tl_set:Nn \g_um_slash_delimiter_usv {"002F} + } , + slash-delimiter / frac .code:n = { + \tl_set:Nn \g_um_slash_delimiter_usv {"2044} + } , + slash-delimiter / div .code:n = { + \tl_set:Nn \g_um_slash_delimiter_usv {"2215} + } +} +% \end{macrocode} +% +% +% \paragraph{Active fraction style} +% \begin{macrocode} +\keys_define:nn {unicode-math} { + active-frac .choice: , + active-frac / small .code:n = { + \cs_if_exist:NTF \tfrac { + \bool_set_true:N \l_um_smallfrac_bool + }{ + \um_warning:n {no-tfrac} + \bool_set_false:N \l_um_smallfrac_bool + } + \use:c{um_setup_active_frac:} + } , + active-frac / normalsize .code:n = { + \bool_set_false:N \l_um_smallfrac_bool + \use:c{um_setup_active_frac:} + } +} +% \end{macrocode} +% +% \paragraph{Debug/tracing} +% \begin{macrocode} +\keys_define:nn {unicode-math} { + trace .choice: , + trace / debug .code:n = { + \msg_redirect_module:nnn { unicode-math } { log } { warning } + } , + trace / on .code:n = { + % default + } , + trace / off .code:n = { + \msg_redirect_module:nnn { unicode-math } { log } { none } + } , +} +% \end{macrocode} +% +% \begin{macrocode} +\unimathsetup {math-style=TeX} +\unimathsetup {slash-delimiter=ascii} +\unimathsetup {trace=off} +\cs_if_exist:NT \tfrac { + \unimathsetup {active-frac=small} +} +\ProcessKeysOptions {unicode-math} +% \end{macrocode} +% +% +% \section{\Hologo{LuaLaTeX} module} +% +% We create a \pkg{luatexbase} module that contains Lua functions for use with \hologo{LuaLaTeX}. +% \begin{macrocode} +% +%<*lua> +local err, warn, info, log = luatexbase.provides_module({ + name = "unicode-math", + date = "2011/04/23", + version = 0.1, + description = "Unicode math typesetting for LuaLaTeX", + author = "Khaled Hosny, Will Robertson, Philipp Stephani", + licence = "LPPL v1.3+" +}) +% \end{macrocode} +% \LuaTeX\ does not provide interface to accessing +% \texttt{(Script)ScriptPercentScaleDown} math constants, so we +% emulate \XeTeX\ behaviour by setting \cs{fontdimen10} and +% \cs{fontdimen11}. +% \begin{macrocode} +local function set_sscale_dimens(fontdata) + local mc = fontdata.MathConstants + if mc then + fontdata.parameters[10] = mc.ScriptPercentScaleDown or 70 + fontdata.parameters[11] = mc.ScriptScriptPercentScaleDown or 50 + end +end +luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_math.set_sscale_dimens") +% +% \end{macrocode} +% +% (Error messages and warning definitions go here from the |msg| chunk +% defined in \secref[vref]{codemsg}.) +% +% \section{Bifurcation} +% And here the split begins. Most of the code is still shared, but +% code for \LuaTeX\ uses the `LU' prefix and code for \XeTeX\ uses `XE'. +% +% \begin{macrocode} +%<*package&(XE|LU)> +\ExplSyntaxOn +% \end{macrocode} +% +% \subsection{Engine differences} +% +% \begin{macrocode} +\cs_new:Nn \um_cs_compat:n +% { \cs_set_eq:cc {U#1} {XeTeX#1} } +% { \cs_set_eq:cc {U#1} {luatexU#1} } +\um_cs_compat:n {mathcode} +\um_cs_compat:n {delcode} +\um_cs_compat:n {mathcodenum} +\um_cs_compat:n {mathcharnum} +\um_cs_compat:n {mathchardef} +\um_cs_compat:n {radical} +\um_cs_compat:n {mathaccent} +\um_cs_compat:n {delimiter} +% \end{macrocode} +% +% \begin{macrocode} +%\bool_set_false:N \c_um_have_fixed_accents_bool +%<*LU> +\bool_const:Nn \c_um_have_fixed_accents_bool + { \int_compare_p:n { \luatexversion > 64 } } +% +% \end{macrocode} +% +% \begin{macrocode} +%<*LU> +\RequirePackage { lualatex-math } [ 2011/08/07 ] +\RequirePackage { luatexbase } +\RequirePackage { luaotfload } [ 2010/11/26 ] +\RequireLuaModule { unicode-math } [ 2011/04/23 ] +% +% \end{macrocode} +% +% \subsection{Alphabet Unicode positions} +% +% Before we begin, let's define the positions of the various Unicode +% alphabets so that our code is a little more readable.\footnote{`\textsc{u.s.v.}' stands +% for `Unicode scalar value'.} +% +% Rather than `readable', in the end, this makes the code more extensible. +% \begin{macrocode} +\cs_new:Nn \usv_set:nnn { + \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} +} +\cs_new:Nn \um_to_usv:nn { g_um_#1_#2_usv } +% \end{macrocode} +% \paragraph{Alphabets} +% \begin{macrocode} +\usv_set:nnn {up}{num}{48} +\usv_set:nnn {up}{Latin}{65} +\usv_set:nnn {up}{latin}{97} +\usv_set:nnn {up}{Greek}{"391} +\usv_set:nnn {up}{greek}{"3B1} +\usv_set:nnn {it}{Latin}{"1D434} +\usv_set:nnn {it}{latin}{"1D44E} +\usv_set:nnn {it}{Greek}{"1D6E2} +\usv_set:nnn {it}{greek}{"1D6FC} +\usv_set:nnn {bb}{num}{"1D7D8} +\usv_set:nnn {bb}{Latin}{"1D538} +\usv_set:nnn {bb}{latin}{"1D552} +\usv_set:nnn {scr}{Latin}{"1D49C} +\usv_set:nnn {cal}{Latin}{"1D49C} +\usv_set:nnn {scr}{latin}{"1D4B6} +\usv_set:nnn {frak}{Latin}{"1D504} +\usv_set:nnn {frak}{latin}{"1D51E} +\usv_set:nnn {sf}{num}{"1D7E2} +\usv_set:nnn {sfup}{num}{"1D7E2} +\usv_set:nnn {sfit}{num}{"1D7E2} +\usv_set:nnn {sfup}{Latin}{"1D5A0} +\usv_set:nnn {sf}{Latin}{"1D5A0} +\usv_set:nnn {sfup}{latin}{"1D5BA} \usv_set:nnn {sf}{latin}{"1D5BA} \usv_set:nnn {sfit}{Latin}{"1D608} \usv_set:nnn {sfit}{latin}{"1D622} @@ -1548,7 +1851,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % But we still want to be able to use them if possible. % % \begin{macrocode} -% +% %<*stix> % \end{macrocode} % @@ -1776,367 +2079,105 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \begin{macrocode} % -%<*package> +%<*package&(XE|LU)> % \end{macrocode} % -% \subsection{Package options} +% \subsection{Overcoming \cmd\@onlypreamble} % -% \begin{macro}{\unimathsetup} -% This macro can be used in lieu of or later to override -% options declared when the package is loaded. +% The requirement of only setting up the maths fonts in the preamble is now removed. The following list might be overly ambitious. % \begin{macrocode} -\DeclareDocumentCommand \unimathsetup {m} { - \clist_clear:N \l_um_unknown_keys_clist - \keys_set:nn {unicode-math} {#1} +\tl_map_inline:nn { + \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes + \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@ + \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion + \version@list\version@elt\alpha@list\alpha@elt + \restore@mathversion\init@restore@version\dorestore@version\process@table + \new@mathversion\DeclareSymbolFont\group@list\group@elt + \new@symbolfont\SetSymbolFont\SetSymbolFont@\get@cdp + \DeclareMathAlphabet\new@mathalphabet\SetMathAlphabet\SetMathAlphabet@ + \DeclareMathAccent\set@mathaccent\DeclareMathSymbol\set@mathchar + \set@mathsymbol\DeclareMathDelimiter\@xxDeclareMathDelimiter + \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter + \set@@mathdelimiter\DeclareMathRadical\mathchar@type + \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ +}{ + \tl_remove_once:Nn \@preamblecmds {\do#1} } % \end{macrocode} -% \end{macro} % +% \section{Fundamentals} +% +% \subsection{Enlarging the number of maths families} % -% \paragraph{math-style} +% To start with, we've got a power of two as many \cmd\fam s as before. So (from |ltfssbas.dtx|) we want to redefine % \begin{macrocode} -\keys_define:nn {unicode-math} { - normal-style .choice_code:n = - { - \bool_set_false:N \g_um_literal_bool - \ifcase \l_keys_choice_int - \bool_set_false:N \g_um_upGreek_bool - \bool_set_false:N \g_um_upgreek_bool - \bool_set_false:N \g_um_upLatin_bool - \bool_set_false:N \g_um_uplatin_bool - \or - \bool_set_true:N \g_um_upGreek_bool - \bool_set_false:N \g_um_upgreek_bool - \bool_set_false:N \g_um_upLatin_bool - \bool_set_false:N \g_um_uplatin_bool - \or - \bool_set_true:N \g_um_upGreek_bool - \bool_set_true:N \g_um_upgreek_bool - \bool_set_true:N \g_um_upLatin_bool - \bool_set_false:N \g_um_uplatin_bool - \or - \bool_set_true:N \g_um_upGreek_bool - \bool_set_true:N \g_um_upgreek_bool - \bool_set_true:N \g_um_upLatin_bool - \bool_set_true:N \g_um_uplatin_bool - \or - \bool_set_true:N \g_um_literal_bool - \fi - } , - normal-style .generate_choices:n = {ISO,TeX,french,upright,literal} , -} +%<*XE> +\def\new@mathgroup{\alloc@8\mathgroup\chardef\@cclvi} +\let\newfam\new@mathgroup +% % \end{macrocode} +% This is sufficient for \LaTeX's \cmd\DeclareSymbolFont-type commands to be able +% to define 256 named maths fonts. +% For \hologo{LuaLaTeX}, this is handled by the \pkg{lualatex-math} package. +% +% \subsection{Setting math chars, math codes, etc.} % +% \begin{macro}{\um_set_mathsymbol:nNNn} +% \darg{A \LaTeX\ symbol font, e.g., \texttt{operators}} +% \darg{Symbol macro, \eg, \cmd\alpha} +% \darg{Type, \eg, \cmd\mathalpha} +% \darg{Slot, \eg, \texttt{"221E}} +% There are a bunch of tests to perform to process the various characters. +% The following assignments should all be fairly straightforward. % \begin{macrocode} -\keys_define:nn {unicode-math} { - math-style .choice_code:n = - { - \ifcase \l_keys_choice_int - \unimathsetup { - normal-style=ISO, - bold-style=ISO, - sans-style=italic, - nabla=upright, - partial=italic, +\cs_set:Nn \um_set_mathsymbol:nNNn { + \prg_case_tl:Nnn #3 { + \mathop { \um_set_big_operator:nnn {#1} {#2} {#4} } + \mathopen + { + \tl_if_in:NnTF \l_um_radicals_tl {#2} + { + \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} + { \um_radical:nn {#1} {#4} } + \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #4} + } + { + \um_set_delcode:nnn {#1} {#4} {#4} + \um_set_mathcode:nnn {#4} \mathopen {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathopen {#1} {#4} } + } } - \or - \unimathsetup { - normal-style=TeX, - bold-style=TeX, - sans-style=upright, - nabla=upright, - partial=italic, + \mathclose + { + \um_set_delcode:nnn {#1} {#4} {#4} + \um_set_mathcode:nnn {#4} \mathclose {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathclose {#1} {#4} } } - \or - \unimathsetup { - normal-style=french, - bold-style=upright, - sans-style=upright, - nabla=upright, - partial=upright, + \mathaccent + { \cs_gset_protected_nopar:Npx #2 { \um_accent:Nnn #3 {#1} {#4} } } + \mathfence + { + \um_set_mathcode:nnn {#4} {#3} {#1} + \um_set_delcode:nnn {#1} {#4} {#4} + \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} + { \um_delimiter:Nnn \mathopen {#1} {#4} } + \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} + { \um_delimiter:Nnn \mathclose {#1} {#4} } } - \or - \unimathsetup { - normal-style=upright, - bold-style=upright, - sans-style=upright, - nabla=upright, - partial=upright, +%<*LU> + \mathover + { + \cs_set_protected_nopar:Npx #2 ##1 + { \mathop { \um_overbrace:nnn {#1} {#4} {##1} } \limits } } - \or - \unimathsetup { - normal-style=literal, - bold-style=literal, - sans-style=literal, - colon=literal, - nabla=literal, - partial=literal, + \mathunder + { + \cs_set_protected_nopar:Npx #2 ##1 + { \mathop { \um_underbrace:nnn {#1} {#4} {##1} } \limits } } - \fi - } , - math-style .generate_choices:n = {ISO,TeX,french,upright,literal} , -} -% \end{macrocode} -% -% \paragraph{bold-style} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - bold-style .choice_code:n = { - \bool_set_false:N \g_um_bfliteral_bool - \ifcase \l_keys_choice_int - \bool_set_false:N \g_um_bfupGreek_bool - \bool_set_false:N \g_um_bfupgreek_bool - \bool_set_false:N \g_um_bfupLatin_bool - \bool_set_false:N \g_um_bfuplatin_bool - \or - \bool_set_true:N \g_um_bfupGreek_bool - \bool_set_false:N \g_um_bfupgreek_bool - \bool_set_true:N \g_um_bfupLatin_bool - \bool_set_true:N \g_um_bfuplatin_bool - \or - \bool_set_true:N \g_um_bfupGreek_bool - \bool_set_true:N \g_um_bfupgreek_bool - \bool_set_true:N \g_um_bfupLatin_bool - \bool_set_true:N \g_um_bfuplatin_bool - \or - \bool_set_true:N \g_um_bfliteral_bool - \fi - } , - bold-style .generate_choices:n = {ISO,TeX,upright,literal} , -} -% \end{macrocode} -% -% \paragraph{sans-style} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - sans-style .choice_code:n = { - \ifcase \l_keys_choice_int - \bool_set_false:N \g_um_upsans_bool - \or - \bool_set_true:N \g_um_upsans_bool - \or - \bool_set_true:N \g_um_sfliteral_bool - \fi - } , - sans-style .generate_choices:n = {italic,upright,literal} , -} -% \end{macrocode} -% -% -% \paragraph{Nabla and partial} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - nabla .choice_code:n = { - \bool_set_false:N \g_um_literal_Nabla_bool - \ifcase \l_keys_choice_int - \bool_set_true:N \g_um_upNabla_bool - \or - \bool_set_false:N \g_um_upNabla_bool - \or - \bool_set_true:N \g_um_literal_Nabla_bool - \fi - } , - nabla .generate_choices:n = {upright,italic,literal} , -} -% \end{macrocode} -% -% \begin{macrocode} -\keys_define:nn {unicode-math} { - partial .choice_code:n = { - \bool_set_false:N \g_um_literal_partial_bool - \ifcase \l_keys_choice_int - \bool_set_true:N \g_um_uppartial_bool - \or - \bool_set_false:N \g_um_uppartial_bool - \or - \bool_set_true:N \g_um_literal_partial_bool - \fi - } , - partial .generate_choices:n = {upright,italic,literal} , -} -% \end{macrocode} -% -% \paragraph{Epsilon and phi shapes} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - vargreek-shape .choice: , - vargreek-shape / unicode .code:n = { - \bool_set_false:N \g_um_texgreek_bool - } , - vargreek-shape / TeX .code:n = { - \bool_set_true:N \g_um_texgreek_bool - } -} -% \end{macrocode} -% -% \paragraph{Colon style} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - colon .choice: , - colon / literal .code:n = { - \bool_set_true:N \g_um_literal_colon_bool - } , - colon / TeX .code:n = { - \bool_set_false:N \g_um_literal_colon_bool - } -} -% \end{macrocode} -% -% \paragraph{Slash delimiter style} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - slash-delimiter .choice: , - slash-delimiter / ascii .code:n = { - \tl_set:Nn \g_um_slash_delimiter_usv {"002F} - } , - slash-delimiter / frac .code:n = { - \tl_set:Nn \g_um_slash_delimiter_usv {"2044} - } , - slash-delimiter / div .code:n = { - \tl_set:Nn \g_um_slash_delimiter_usv {"2215} - } -} -% \end{macrocode} -% -% -% \paragraph{Active fraction style} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - active-frac .choice: , - active-frac / small .code:n = { - \cs_if_exist:NTF \tfrac { - \bool_set_true:N \l_um_smallfrac_bool - }{ - \um_warning:n {no-tfrac} - \bool_set_false:N \l_um_smallfrac_bool - } - \use:c{um_setup_active_frac:} - } , - active-frac / normalsize .code:n = { - \bool_set_false:N \l_um_smallfrac_bool - \use:c{um_setup_active_frac:} - } -} -% \end{macrocode} -% -% \paragraph{Debug/tracing} -% \begin{macrocode} -\keys_define:nn {unicode-math} { - trace .choice: , - trace / debug .code:n = { - \msg_redirect_module:nnn { unicode-math } { trace } { warning } - } , - trace / on .code:n = { - \msg_redirect_module:nnn { unicode-math } { trace } { trace } - } , - trace / off .code:n = { - \msg_redirect_module:nnn { unicode-math } { trace } { none } - } , -} -% \end{macrocode} -% -% \begin{macrocode} -\clist_new:N \l_um_unknown_keys_clist -\keys_define:nn {unicode-math} { - unknown .code:n = { - \clist_put_right:No \l_um_unknown_keys_clist { - \l_keys_key_tl = {#1} - } - } -} -% \end{macrocode} -% -% \begin{macrocode} -\unimathsetup {math-style=TeX} -\unimathsetup {slash-delimiter=ascii} -\unimathsetup {trace=off} -\cs_if_exist:NT \tfrac { - \unimathsetup {active-frac=small} -} -\ProcessKeysOptions {unicode-math} -% \end{macrocode} -% -% \subsection{Overcoming \cmd\@onlypreamble} -% -% The requirement of only setting up the maths fonts in the preamble is now removed. The following list might be overly ambitious. -% \begin{macrocode} -\tl_map_inline:nn { - \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes - \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@ - \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion - \version@list\version@elt\alpha@list\alpha@elt - \restore@mathversion\init@restore@version\dorestore@version\process@table - \new@mathversion\DeclareSymbolFont\group@list\group@elt - \new@symbolfont\SetSymbolFont\SetSymbolFont@\get@cdp - \DeclareMathAlphabet\new@mathalphabet\SetMathAlphabet\SetMathAlphabet@ - \DeclareMathAccent\set@mathaccent\DeclareMathSymbol\set@mathchar - \set@mathsymbol\DeclareMathDelimiter\@xxDeclareMathDelimiter - \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter - \set@@mathdelimiter\DeclareMathRadical\mathchar@type - \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ -}{ - \tl_remove_in:Nn \@preamblecmds {\do#1} -} -% \end{macrocode} -% -% \section{Fundamentals} -% -% \subsection{Enlarging the number of maths families} -% -% To start with, we've got a power of two as many \cmd\fam s as before. So (from |ltfssbas.dtx|) we want to redefine -% \begin{macrocode} -\def\new@mathgroup{\alloc@8\mathgroup\chardef\@cclvi} -\let\newfam\new@mathgroup -% \end{macrocode} -% -% This is sufficient for \LaTeX's \cmd\DeclareSymbolFont-type commands to be able -% to define 256 named maths fonts. -% -% \subsection{Setting math chars, math codes, etc.} -% -% \begin{macro}{\um_set_mathsymbol:nNNn} -% \darg{A \LaTeX\ symbol font, e.g., \texttt{operators}} -% \darg{Symbol macro, \eg, \cmd\alpha} -% \darg{Type, \eg, \cmd\mathalpha} -% \darg{Slot, \eg, \texttt{"221E}} -% There are a bunch of tests to perform to process the various characters. -% The following assignments should all be fairly straightforward. -% \begin{macrocode} -\cs_set:Npn \um_set_mathsymbol:nNNn #1#2#3#4 { - \prg_case_tl:Nnn #3 { - \mathop { - \um_set_big_operator:nnn {#1} {#2} {#4} - } - \mathopen { - \tl_if_in:NnTF \l_um_radicals_tl {#2} { - \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} { \um_radical:nn {#1} {#4} } - \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #4} - }{ - \um_set_delcode:nnn {#1} {#4} {#4} - \um_set_mathcode:nnn {#4} \mathopen {#1} - \cs_gset_protected_nopar:Npx #2 { \um_delimiter:Nnn \mathopen {#1} {#4} } - } - } - \mathclose { - \um_set_delcode:nnn {#1} {#4} {#4} - \um_set_mathcode:nnn {#4} \mathclose {#1} - \cs_gset_protected_nopar:Npx #2 { \um_delimiter:Nnn \mathclose {#1} {#4} } - } - \mathaccent { - \cs_gset_protected_nopar:Npx #2 { \um_accent:Nnn #3 {#1} {#4} } - } - \mathfence { - \um_set_mathcode:nnn {#4} {#3} {#1} - \um_set_delcode:nnn {#1} {#4} {#4} - \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} { \um_delimiter:Nnn \mathopen {#1} {#4} } - \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} { \um_delimiter:Nnn \mathclose {#1} {#4} } - } - \mathover { % LuaTeX only - \cs_set_protected_nopar:Npn #2 ##1 { \mathop { \um_overbrace:nnn {#1} {#4} {##1} } \limits } - } - \mathunder { % LuaTeX only - \cs_set_protected_nopar:Npn #2 ##1 { \mathop { \um_underbrace:nnn {#1} {#4} {##1} } \limits } - } +% }{ \um_set_mathcode:nnn {#4} {#3} {#1} } @@ -2179,7 +2220,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % (~\cs{int} $\to$~) $\int$ $\to$ \cs{int_sym} $\to$ \cs{intop} % \end{quote} % \begin{macrocode} -\cs_new:Npn \um_set_big_operator:nnn #1#2#3 { +\cs_new:Nn \um_set_big_operator:nnn { \group_begin: \char_set_catcode_active:n {#3} \char_gmake_mathactive:n {#3} @@ -2221,21 +2262,28 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \Umathchardef #1 = \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: } -\cs_new:Npn \um_set_delcode:nnn #1#2#3 { +\cs_new:Nn \um_set_delcode:nnn { \Udelcode#2 = \csname sym#1\endcsname #3 } -\cs_new:Npn \um_radical:nn #1#2 { +\cs_new:Nn \um_radical:nn { \Uradical \csname sym#1\endcsname #2 \scan_stop: } -\cs_new:Npn \um_delimiter:Nnn #1#2#3 { +\cs_new:Nn \um_delimiter:Nnn { \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: } -\xetex_or_luatex:nnn { \cs_new:Npn \um_accent:Nnn #1#2#3 } { - \Umathaccent \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: -} { - \Umathaccent \c_um_accent_keyword_tl \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: -} -\luatex_if_engine:T { +\cs_new:Nn \um_accent:Nnn +%<*XE> + { + \Umathaccent \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: + } +% +%<*LU> + { + \Umathaccent \c_um_accent_keyword_tl + \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: + } +% +%<*LU> \cs_new_nopar:Npn \um_wide_top_accent:Nnn #1 #2 #3 { \Umathaccent \mathchar@type #1 \use:c { sym #2 } #3 \scan_stop: } @@ -2247,7 +2295,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } { \tl_const:Nn \c_um_accent_keyword_tl { } } -} +% % \end{macrocode} % % \begin{macrocode} @@ -2285,10 +2333,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\char_gmake_mathactive:N} % \begin{macro}{\char_gmake_mathactive:n} % \begin{macrocode} -\cs_new:Npn \char_gmake_mathactive:N #1 { +\cs_new:Nn \char_gmake_mathactive:N { \global\mathcode `#1 = "8000 \scan_stop: } -\cs_new:Npn \char_gmake_mathactive:n #1 { +\cs_new:Nn \char_gmake_mathactive:n { \global\mathcode #1 = "8000 \scan_stop: } % \end{macrocode} @@ -2338,7 +2386,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \doarg{font features} % \darg{font name} % \begin{macrocode} -\cs_new:Npn \um_init: { +\cs_new:Nn \um_init: { + \bool_set_true:N \l_um_ot_math_bool % \end{macrocode} % \begin{itemize} % \item Erase any conception \LaTeX\ has of previously defined math symbol fonts; @@ -2356,98 +2405,127 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \seq_clear:N \l_um_char_range_seq \clist_clear:N \l_um_char_num_range_clist \seq_clear:N \l_um_mathalph_seq - \clist_clear:N \l_um_unknown_keys_clist \seq_clear:N \l_um_missing_alph_seq % \end{macrocode} +% \item By default use the `normal' math version +% \begin{macrocode} + \tl_set:Nn \l_um_mversion_tl {normal} +% \end{macrocode} +% \item Other range initialisations +% \begin{macrocode} + \tl_set:Nn \um_symfont_tl {operators} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_noparse:nNN +% \end{macrocode} +% \item Define default font features for the script and scriptscript font. +% \begin{macrocode} + \tl_set:Nn \l_um_script_features_tl {Style=MathScript} + \tl_set:Nn \l_um_sscript_features_tl {Style=MathScriptScript} + \tl_set_eq:NN \l_um_script_font_tl \l_um_fontname_tl + \tl_set_eq:NN \l_um_sscript_font_tl \l_um_fontname_tl +% \end{macrocode} % \end{itemize} % \begin{macrocode} } \DeclareDocumentCommand \setmathfont { O{} m } { + \tl_set:Nn \l_um_fontname_tl {#2} \um_init: % \end{macrocode} -% \begin{itemize} -% \item Grab the current size information +% Grab the current size information: % (is this robust enough? Maybe it should be preceded by \cmd\normalsize). +% The macro \cmd\S@\meta{size} +% contains the definitions of the sizes used for maths letters, subscripts and subsubscripts in +% \cmd\tf@size, \cmd\sf@size, and \cmd\ssf@size, respectively. % \begin{macrocode} \cs_if_exist:cF { S@ \f@size } { \calculate@math@sizes } \csname S@\f@size\endcsname % \end{macrocode} -% \item Set the name of the math version being defined. -% (obviously more needs to be done here!) -% \end{itemize} +% Parse options and tell people what's going on: % \begin{macrocode} - \tl_set:Nn \l_um_mversion_tf {normal} - \DeclareMathVersion{\l_um_mversion_tf} + \keys_set_known:nnN {unicode-math} {#1} \l_um_unknown_keys_clist + \bool_if:NT \l_um_init_bool { \um_log:n {default-math-font} } % \end{macrocode} -% \item Define default font features for the script and scriptscript font. +% Use \pkg{fontspec} to select a font to use. % \begin{macrocode} - \tl_set:Nn \l_um_script_features_tl {ScriptStyle} - \tl_set:Nn \l_um_sscript_features_tl {ScriptScriptStyle} - \tl_set:Nn \l_um_script_font_tl {#2} - \tl_set:Nn \l_um_sscript_font_tl {#2} + \um_fontspec_select_font: % \end{macrocode} -% Use \pkg{fontspec} to select a font to use. The macro \cmd\S@\meta{size} -% contains the definitions of the sizes used for maths letters, subscripts and subsubscripts in -% \cmd\tf@size, \cmd\sf@size, and \cmd\ssf@size, respectively. +% Now define |\um_symfont_tl| as the \LaTeX\ math font to access everything: % \begin{macrocode} - \keys_set:nn {unicode-math} {#1} - \um_fontspec_select_font:n {#2} + \cs_if_exist:cF { sym \um_symfont_tl } + { + \DeclareSymbolFont{\um_symfont_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } + \SetSymbolFont{\um_symfont_tl}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} % \end{macrocode} -% Check whether we're using a real maths font: +% Declare the math sizes (i.e., scaling of superscripts) for the specific +% values for this font, +% and set defaults for math fams two and three for legacy compatibility: % \begin{macrocode} - \group_begin: - \fontfamily{\zf@family}\selectfont - \fontspec_if_script:nTF {math} - {\bool_gset_true:N \l_um_ot_math_bool} - {\bool_gset_false:N \l_um_ot_math_bool} - \group_end: + \bool_if:nT {\l_um_ot_math_bool && !\g_um_mainfont_already_set_bool} { + \bool_set_true:N \g_um_mainfont_already_set_bool + \um_declare_math_sizes: + \um_setup_legacy_fam_two: + \um_setup_legacy_fam_three: + } % \end{macrocode} -% If we're defining the full Unicode math repetoire, then we skip all -% the parsing processing needed if we're only defining a subset. -% \begin{itemize} -% \item Math symbols are defined with \cmd\_um_sym:nnn; see \secref{mathsymbol} -% for the individual definitions -% \end{itemize} +% And now we input every single maths char. % \begin{macrocode} - \bool_if:NTF \l_um_init_bool { - \tl_set:Nn \um_symfont_tl {operators} - \msg_trace:nnx {unicode-math} {default-math-font} {#2} - \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn - \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn - \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn - \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n - \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn - \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn - }{ - \int_incr:N \g_um_fam_int - \tl_set:Nx \um_symfont_tl {um_fam\int_use:N\g_um_fam_int} - \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_parse:nnn - \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_parse:Nnn - \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_parse:nnn - \cs_set_eq:NN \um_maybe_init_alphabet:n \use_none:n - \cs_set_eq:NN \um_map_char_single:nn \um_map_char_parse:nn - \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_parse:nn - } + \um_input_math_symbol_table: +% \end{macrocode} +% Finally, +% \begin{itemize} +% \item Remap symbols that don't take their natural mathcode +% \item Activate any symbols that need to be math-active +% \item Enable wide/narrow accents +% \item Assign delimiter codes for symbols that need to grow +% \item Setup the maths alphabets (\cs{mathbf} etc.) +% \end{itemize} +% \begin{macrocode} + \um_remap_symbols: + \um_setup_mathactives: + \um_setup_accents: + \um_setup_delcodes: + \um_setup_alphabets: % \end{macrocode} -% Now define |\um_symfont_tl| as the \LaTeX\ math font to access everything: +% Prevent spaces, and that's it: % \begin{macrocode} - \DeclareSymbolFont{\um_symfont_tl} - {\encodingdefault}{\zf@family}{\mddefault}{\updefault} - - \bool_if:nT {\l_um_ot_math_bool && !\g_um_mainfont_already_set_bool} { - \bool_set_true:N \g_um_mainfont_already_set_bool + \ignorespaces +} % \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\um_declare_math_sizes:} % Set the math sizes according to the recommend font parameters: % \begin{macrocode} - \dim_compare:nF { \fontdimen 10 \l_um_font == 0pt } { - \DeclareMathSizes { \f@size } { \f@size } - { \um_fontdimen_to_percent:nn{10}{\l_um_font}\dimexpr \f@size pt\relax } - { \um_fontdimen_to_percent:nn{11}{\l_um_font}\dimexpr \f@size pt\relax } - } +\cs_new:Nn \um_declare_math_sizes: + { + \dim_compare:nF { \fontdimen 10 \l_um_font == 0pt } + { + \DeclareMathSizes { \f@size } { \f@size } + { \um_fontdimen_to_scale:nn {10} {\l_um_font} } + { \um_fontdimen_to_scale:nn {11} {\l_um_font} } + } + } % \end{macrocode} -% Set defaults for fam2 for legacy compatibility: +% \end{macro} +% +% +% +% \begin{macro}{\um_setup_legacy_fam_two:} % \begin{macrocode} - \fontspec_select:xn {\l_um_font_keyval_tl, +\cs_new:Nn \um_setup_legacy_fam_two: + { + \fontspec_set_family:Nxn \l_um_family_tl + { + \l_um_font_keyval_tl, Scale=1.00001, FontAdjustment={ \fontdimen8\font= \um_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax @@ -2466,13 +2544,20 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize \fontdimen22\font=\um_get_fontparam:nn {15} {AxisHeight}\relax } - } {#2} - \DeclareSymbolFont{symbols} - {\encodingdefault}{\zf@family}{\mddefault}{\updefault} + } {\l_um_fontname_tl} + \SetSymbolFont{symbols}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } % \end{macrocode} -% Set defaults for fam3 for legacy compatibility: +% \end{macro} +% +% \begin{macro}{\um_setup_legacy_fam_three:} % \begin{macrocode} - \fontspec_select:xn {\l_um_font_keyval_tl, +\cs_new:Nn \um_setup_legacy_fam_three: + { + \fontspec_set_family:Nxn \l_um_family_tl + { + \l_um_font_keyval_tl, Scale=0.99999, FontAdjustment={ \fontdimen8\font= \um_get_fontparam:nn {48} {FractionRuleThickness}\relax @@ -2482,44 +2567,18 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \fontdimen12\font=\um_get_fontparam:nn {31} {LowerLimitBaselineDropMin}\relax \fontdimen13\font=0pt\relax } - } {#2} - \DeclareSymbolFont{largesymbols} - {\encodingdefault}{\zf@family}{\mddefault}{\updefault} + } {\l_um_fontname_tl} + \SetSymbolFont{largesymbols}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} } % \end{macrocode} -% And now we input every single maths char. -% \begin{macrocode} - \um_input_math_symbol_table: -% \end{macrocode} -% Finally, -% \begin{itemize} -% \item Remap symbols that don't take their natural mathcode -% \item Activate any symbols that need to be math-active -% \item Enable wide/narrow accents -% \item Assign delimiter codes for symbols that need to grow -% \item Setup the maths alphabets (\cs{mathbf} etc.) -% \end{itemize} -% \begin{macrocode} - \um_remap_symbols: - \um_setup_mathactives: - \um_setup_accents: - \um_setup_delcodes: - \um_setup_alphabets: -% \end{macrocode} -% Prevent spaces: -% \begin{macrocode} - \ignorespaces -} -% \end{macrocode} % \end{macro} % % % \begin{macrocode} -\xetex_or_luatex:nnn { \cs_new:Nn \um_get_fontparam:nn } { - \the\fontdimen#1\zf@basefont\relax -}{ - \directlua{fontspec.mathfontdimen("zf@basefont","#2")} -} +\cs_new:Nn \um_get_fontparam:nn +% { \the\fontdimen#1\l_um_font\relax } +% { \directlua{fontspec.mathfontdimen("l_um_font","#2")} } % \end{macrocode} % % \begin{macro}{\resetmathfont} @@ -2535,9 +2594,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_fontspec_select_font:} % Select the font with \cs{fontspec} and define \cs{l_um_font} from it. % \begin{macrocode} -\cs_new:Npn \um_fontspec_select_font:n #1 { +\cs_new:Nn \um_fontspec_select_font: { \tl_set:Nx \l_um_font_keyval_tl { - \luatex_if_engine:T { Renderer = Basic, } +% Renderer = Basic, BoldFont = {}, ItalicFont = {}, Script = Math, SizeFeatures = { @@ -2553,8 +2612,15 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ }, \l_um_unknown_keys_clist } - \fontspec_select:xn {\l_um_font_keyval_tl} {#1} - \tl_set_eq:NN \l_um_font \zf@basefont + \fontspec_set_fontface:NNxn \l_um_font \l_um_family_tl + {\l_um_font_keyval_tl} {\l_um_fontname_tl} +% \end{macrocode} +% Check whether we're using a real maths font: +% \begin{macrocode} + \group_begin: + \fontfamily{\l_um_family_tl}\selectfont + \fontspec_if_script:nF {math} {\bool_gset_false:N \l_um_ot_math_bool} + \group_end: } % \end{macrocode} % \end{macro} @@ -2575,7 +2641,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % \begin{macrocode} \cs_set:Npn \um_process_symbol_parse:nnn #1#2#3 { - \um@parse@term{#1}{#2}{#3}{ + \um_if_char_spec:nNNT{#1}{#2}{#3}{ \um_process_symbol_noparse:nnn {#1}{#2}{#3} } } @@ -2602,12 +2668,12 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Where |\um_remap_symbol:nnn| is defined to be one of these two, depending % on the range setup: % \begin{macrocode} -\cs_new:Npn \um_remap_symbol_parse:nnn #1#2#3 { - \um@parse@term {#3} {\@nil} {#2} { +\cs_new:Nn \um_remap_symbol_parse:nnn { + \um_if_char_spec:nNNT {#3} {\@nil} {#2} { \um_remap_symbol_noparse:nnn {#1} {#2} {#3} } } -\cs_new:Npn \um_remap_symbol_noparse:nnn #1#2#3 { +\cs_new:Nn \um_remap_symbol_noparse:nnn { \clist_map_inline:nn {#1} { \um_set_mathcode:nnnn {##1} {#2} {\um_symfont_tl} {#3} } @@ -2639,15 +2705,20 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macro} % % \begin{macro}{\um_make_mathactive:nNN} -%: TODO : hook into range feature % Makes |#1| a mathactive char, and gives cs |#2| the meaning of mathchar |#1| % with class |#3|. % You are responsible for giving active |#1| a particular meaning! % \begin{macrocode} -\cs_new:Npn \um_make_mathactive:nNN #1#2#3 { - \um_set_mathchar:NNnn #2 #3 {\um_symfont_tl} {#1} - \char_gmake_mathactive:n {#1} -} +\cs_new:Nn \um_make_mathactive_parse:nNN + { + \um_if_char_spec:nNNT {#1} #2 #3 + { \um_make_mathactive_noparse:nNN {#1} #2 #3 } + } +\cs_new:Nn \um_make_mathactive_noparse:nNN + { + \um_set_mathchar:NNnn #2 #3 {\um_symfont_tl} {#1} + \char_gmake_mathactive:n {#1} + } % \end{macrocode} % \end{macro} % @@ -2655,13 +2726,12 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % % \begin{macro}{\um_assign_delcode:nn} -%: TODO : hook csnames into range feature % \begin{macrocode} -\cs_new:Npn \um_assign_delcode_noparse:nn #1#2 { +\cs_new:Nn \um_assign_delcode_noparse:nn { \um_set_delcode:nnn \um_symfont_tl {#1} {#2} } -\cs_new:Npn \um_assign_delcode_parse:nn #1#2 { - \um@parse@term {#2}{\@nil}{\@nil} { +\cs_new:Nn \um_assign_delcode_parse:nn { + \um_if_char_spec:nNNT {#2}{\@nil}{\@nil} { \um_assign_delcode_noparse:nn {#1} {#2} } } @@ -2672,9 +2742,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_assign_delcode:n} % Shorthand. % \begin{macrocode} -\cs_new:Npn \um_assign_delcode:n #1 { - \um_assign_delcode:nn {#1} {#1} -} +\cs_new:Nn \um_assign_delcode:n { \um_assign_delcode:nn {#1} {#1} } % \end{macrocode} % \end{macro} % @@ -2747,7 +2815,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % I've a feeling that it's more useful \emph{not} to include the multiple % integrals such as $\iiiint$, but that might be a matter of preference. % \begin{macrocode} -\tl_new:Nn \l_um_nolimits_tl { +\tl_new:N \l_um_nolimits_tl +\tl_set:Nn \l_um_nolimits_tl { \int\iint\iiint\iiiint\oint\oiint\oiiint \intclockwise\varointclockwise\ointctrclockwise\sumint \intbar\intBar\fint\cirfnint\awint\rppolint @@ -2772,7 +2841,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % It removes an item from the nolimits list. % \begin{macrocode} \DeclareDocumentCommand \removenolimits {m} { - \tl_remove_all_in:Nn \l_um_nolimits_tl {#1} + \tl_remove_all:Nn \l_um_nolimits_tl {#1} } % \end{macrocode} % \end{macro} @@ -2787,10 +2856,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Also, what about right-to-left square roots? % % \begin{macro}{\l_um_radicals_tl} -% We organise radicals in the same way as nolimits-operators; that is, -% in a comma-list. +% We organise radicals in the same way as nolimits-operators. % \begin{macrocode} -\tl_new:Nn \l_um_radicals_tl {\sqrt} +\tl_new:N \l_um_radicals_tl +\tl_set:Nn \l_um_radicals_tl {\sqrt} % \end{macrocode} % \end{macro} % @@ -2827,13 +2896,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % For \LuaTeX, simply rename the correspronding primitive. % For \XeTeX, define \meta{command} as a new quark. % \begin{macrocode} -\cs_new_protected_nopar:Npn \um_new_cramped_style:N #1 { - \xetex_or_luatex:nn { - \quark_new:N #1 - } { - \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } - } -} +\cs_new_protected_nopar:Nn \um_new_cramped_style:N +% { \quark_new:N #1 } +% { \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } } % \end{macrocode} % \end{macro} % @@ -2869,7 +2934,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % The other parameters are integer constants referring to font dimension numbers. % The macro expands to a dimension which contains the appropriate font dimension. % \begin{macrocode} -\xetex_if_engine:T { +%<*XE> \cs_new_nopar:Npn \um_font_dimen:Nnnnn #1 #2 #3 #4 #5 { \fontdimen \cs_if_eq:NNTF #1 \displaystyle { @@ -2909,7 +2974,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macrocode} \c_two } -} +% % \end{macrocode} % \end{macro} % @@ -2926,17 +2991,21 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |luatexUmath|. % The \XeTeX\ font dimension numbers must be integer constants. % \begin{macrocode} -\xetex_or_luatex:nnn { - \cs_new_protected_nopar:Npn \um_font_param:nnnnn #1 #2 #3 #4 #5 -} { +\cs_new_protected_nopar:Nn \um_font_param:nnnnn +%<*XE> +{ \um_font_param_aux:ccnnnn { um_ #1 :N } { um_set_ #1 :N } { #2 } { #3 } { #4 } { #5 } -} { +} +% +%<*LU> +{ \tl_set:Nn \l_um_tmpa_tl { #1 } - \tl_remove_all_in:Nn \l_um_tmpa_tl { _ } + \tl_remove_all:Nn \l_um_tmpa_tl { _ } \um_font_param_aux:ccc { um_ #1 :N } { um_set_ #1 :N } { luatexUmath \l_um_tmpa_tl } } +% % \end{macrocode} % \end{macro} % @@ -2972,11 +3041,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % This macro defines getter and setter functions for the font parameter \meta{name}, which is considered unavailable in \XeTeX\@. % The \LuaTeX\ font parameter name is produced by removing all underscores and prefixing the result with |luatexUmath|. % \begin{macrocode} -\xetex_or_luatex:nnn { - \cs_new_protected_nopar:Npn \um_font_param:n #1 -} { } { - \um_font_param:nnnnn { #1 } { 0 } { 0 } { 0 } { 0 } -} +\cs_new_protected_nopar:Nn \um_font_param:n +% { } +% { \um_font_param:nnnnn { #1 } { 0 } { 0 } { 0 } { 0 } } % \end{macrocode} % \end{macro} % @@ -2984,8 +3051,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_font_param_aux:NNN} % Auxiliary macros for generating font parameter accessor macros. % \begin{macrocode} -\xetex_or_luatex:nn { - \cs_new_protected_nopar:Npn \um_font_param_aux:NNnnnn #1 #2 #3 #4 #5 #6 { +%<*XE> +\cs_new_protected_nopar:Nn \um_font_param_aux:NNnnnn + { \cs_new_nopar:Npn #1 ##1 { \um_font_dimen:Nnnnn ##1 { #3 } { #4 } { #5 } { #6 } } @@ -2993,9 +3061,11 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ #1 ##1 \dim_eval:n { ##2 } } } - \cs_generate_variant:Nn \um_font_param_aux:NNnnnn { cc } -} { - \cs_new_protected_nopar:Npn \um_font_param_aux:NNN #1 #2 #3 { +\cs_generate_variant:Nn \um_font_param_aux:NNnnnn { cc } +% +%<*LU> +\cs_new_protected_nopar:Nn \um_font_param_aux:NNN + { \cs_new_nopar:Npn #1 ##1 { #3 ##1 } @@ -3003,8 +3073,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ #3 ##1 \dim_eval:n { ##2 } } } - \cs_generate_variant:Nn \um_font_param_aux:NNN { ccc } -} +\cs_generate_variant:Nn \um_font_param_aux:NNN { ccc } +% % \end{macrocode} % \end{macro} % \end{macro} @@ -3060,6 +3130,56 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \section{Font features} % +% \begin{macro}{\new@mathversion} +% Fix bug in the \LaTeX\ version. +% (Fixed upstream, too, but unsure when that will propagate.) +% \begin{macrocode} +\def\new@mathversion#1{% + \expandafter\in@\expandafter#1\expandafter{\version@list}% + \ifin@ + \@font@info{Redeclaring math version + `\expandafter\@gobblefour\string#1'}% + \else + \expandafter\newcount\csname c@\expandafter + \@gobble\string#1\endcsname + \def\version@elt{\noexpand\version@elt\noexpand}% + \edef\version@list{\version@list\version@elt#1}% + \fi + \toks@{}% + \count@\z@ + \def\group@elt##1##2{% + \advance\count@\@ne + \addto@hook\toks@{\getanddefine@fonts##1##2}% + }% + \group@list + \global\csname c@\expandafter\@gobble\string#1\endcsname\count@ + \def\alpha@elt##1##2##3{% + \ifx##2\no@alphabet@error + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\no@alphabet@error##1}}% + \else + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\select@group##1##2##3}}% + \fi + }% + \alpha@list + \xdef#1{\the\toks@}% +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Math version} +% \begin{macrocode} +\keys_define:nn {unicode-math} + { + version .code:n = + { + \tl_set:Nn \l_um_mversion_tl {#1} + \DeclareMathVersion{\l_um_mversion_tl} + } + } +% \end{macrocode} +% % \subsection{Script and scriptscript font options} % \begin{macrocode} \keys_define:nn {unicode-math} @@ -3077,10 +3197,31 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macrocode} \seq_new:N \l_um_mathalph_seq \seq_new:N \l_um_char_range_seq +\seq_new:N \l_um_mclass_range_seq +\seq_new:N \l_um_cmd_range_seq \keys_define:nn {unicode-math} { range .code:n = { \bool_set_false:N \l_um_init_bool +% \end{macrocode} +% Set processing functions if we're not defining the full Unicode math repetoire. +% Math symbols are defined with \cmd\_um_sym:nnn; see \secref{mathsymbol} +% for the individual definitions +% \begin{macrocode} + \int_incr:N \g_um_fam_int + \tl_set:Nx \um_symfont_tl {um_fam\int_use:N\g_um_fam_int} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_parse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_parse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_parse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \use_none:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_parse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_parse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_parse:nNN +% \end{macrocode} +% Proceed by filling up the various `range' seqs according to the user options. +% \begin{macrocode} \seq_clear:N \l_um_char_range_seq + \seq_clear:N \l_um_mclass_range_seq + \seq_clear:N \l_um_cmd_range_seq \seq_clear:N \l_um_mathalph_seq \clist_map_inline:nn {#1} { \um_if_mathalph_decl:nTF {##1} { @@ -3090,11 +3231,31 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ { \exp_not:V \l_um_tmpc_tl } } }{ - \seq_put_right:Nn \l_um_char_range_seq {##1} +% \end{macrocode} +% Four cases: +% math class matching the known list; +% single item that is a control sequence---command name; +% single item that isn't---edge case, must be 0--9; +% none of the above---char range. +% \begin{macrocode} + \seq_if_in:NnTF \g_um_mathclasses_seq {##1} + { \seq_put_right:Nn \l_um_mclass_range_seq {##1} } + { + \bool_if:nTF { \tl_if_single_p:n {##1} && \token_if_cs_p:N ##1 } + { \seq_put_right:Nn \l_um_cmd_range_seq {##1} } + { \seq_put_right:Nn \l_um_char_range_seq {##1} } + } } } } } +\seq_new:N \g_um_mathclasses_seq +\seq_set_from_clist:Nn \g_um_mathclasses_seq + { + \mathord,\mathalpha,\mathop,\mathbin,\mathrel, + \mathopen,\mathclose,\mathpunct,\mathaccent, + \mathfence,\mathover,\mathunder + } % \end{macrocode} % % @@ -3113,7 +3274,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % in the general case. % \begin{macrocode} \prg_new_conditional:Nnn \um_if_mathalph_decl:n {TF} { - \tl_set:Nx \l_um_tmpa_tl { \trim@spaces@noexp {#1} } + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {#1} } \tl_clear:N \l_um_tmpb_tl \tl_clear:N \l_um_tmpc_tl \tl_if_in:NnT \l_um_tmpa_tl {->} { @@ -3145,10 +3306,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Pretty basic comma separated range processing. % Donald Arseneau's \pkg{selectp} package has a cleverer technique. % -% \begin{macro}{\um@parse@term} +% \begin{macro}{\um_if_char_spec:nNNT} % \darg{Unicode character slot} % \darg{control sequence (character macro)} -% \darg{control sequence (math type)} +% \darg{control sequence (math class)} % \darg{code to execute} % This macro expands to |#4| % if any of its arguments are contained in \cmd\l_um_char_range_seq. @@ -3172,120 +3333,68 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{tabular} % \end{table} % -% Start by iterating over the commalist, ignoring empties, and initialising the scratch conditional: -% \begin{macrocode} -\newcommand\um@parse@term[4]{ - \seq_map_variable:NNn \l_um_char_range_seq \@ii { - \unless\ifx\@ii\@empty - \@tempswafalse -% \end{macrocode} -% Match to either the character macro (\cmd\alpha) or the math type (\cmd\mathbin): +% We have three tests, performed sequentially in order of execution time. +% Any test finding a match jumps directly to the end. % \begin{macrocode} - \expandafter\um@firstchar\expandafter{\@ii} - \ifx\@tempa\um@backslash - \expandafter\ifx\@ii#2\relax - \@tempswatrue - \else - \expandafter\ifx\@ii#3\relax - \@tempswatrue - \fi - \fi -% \end{macrocode} -% Otherwise, we have a number range, which is passed to another macro: -% \begin{macrocode} - \else - \expandafter\um@parse@range\@ii-\@marker-\@nil#1\@nil - \fi -% \end{macrocode} -% If we have a match, execute the code! -% It also populates the -% \cmd\l_um_char_num_range_clist\ macro, which is used when defining -% \cmd\mathbf\ (\etc) \cmd\mathchar\ remappings. -% \begin{macrocode} - \if@tempswa +\cs_new:Nn \um_if_char_spec:nNNT + { + + % math class: + \seq_if_in:NnT \l_um_mclass_range_seq {#3} + { \use_none_delimit_by_q_nil:w } + + % command name: + \seq_if_in:NnT \l_um_cmd_range_seq {#2} + { \use_none_delimit_by_q_nil:w } + + % character slot: + \seq_map_inline:Nn \l_um_char_range_seq + { + \um_int_if_range_matches_slot:nnT {##1} {#1} + { \seq_map_break:n { \use_none_delimit_by_q_nil:w } } + } + + % this executes if no match was found: + \use_none:nnn + \q_nil + \use:n + { \clist_put_right:Nx \l_um_char_num_range_clist { \int_eval:n {#1} } #4 - \fi - \fi + } } -} -\def\um@firstof#1#2\@nil{#1} -\edef\um@backslash{\expandafter\um@firstof\string\string\@nil} -\def\um@firstchar#1{\edef\@tempa{\expandafter\um@firstof\string#1\@nil}} % \end{macrocode} % \end{macro} % -% \begin{macro}{\um@parse@range} -% Weird syntax. -% As shown previously in \tabref{ranges}, this macro can be passed four different input types via \cmd\um@parse@term. -% \begin{macrocode} -\def\um@parse@range#1-#2-#3\@nil#4\@nil{ - \def\@tempa{#1} - \def\@tempb{#2} -% \end{macrocode} -% \begin{tabular}{@{}ll} -% \hline -% Range & $r=x$ \\ -% C-list input & \cmd\@ii=|X| \\ -% Macro input & |\um@parse@range X-\@marker-\@nil#1\@nil| \\ -% Arguments & -% \texttt{\textcolor{red}{\char`\#1}-\textcolor{blue}{\char`\#2}-\textcolor{Green}{\char`\#3}} -% = \texttt{\textcolor{red}{X}-\textcolor{blue}{\cmd\@marker}-\textcolor{Green}{\char`\{\char`\}}} \\ -% \hline -% \end{tabular} -% \begin{macrocode} - \expandafter\ifx\expandafter\@marker\@tempb\relax - \int_compare:nT {#4=#1} \@tempswatrue - \else -% \end{macrocode} -% \begin{tabular}{@{}ll} -% \hline -% Range & $r\geq x$ \\ -% C-list input & \cmd\@ii=|X-| \\ -% Macro input & |\um@parse@range X--\@marker-\@nil#1\@nil|\\ -% Arguments & -% \texttt{\textcolor{red}{\char`\#1}-\textcolor{blue}{\char`\#2}-\textcolor{Green}{\char`\#3}} -% = \texttt{\textcolor{red}{X}-\textcolor{blue}{\char`\{\char`\}}-\textcolor{Green}{\cmd\@marker-}} \\ -% \hline -% \end{tabular} -% \begin{macrocode} - \ifx\@empty\@tempb - \int_compare:nT {#4>#1-1} \@tempswatrue - \else -% \end{macrocode} -% \begin{tabular}{@{}ll} -% \hline -% Range & $r\leq y$ \\ -% C-list input & \cmd\@ii=|-Y| \\ -% Macro input & |\um@parse@range -Y-\@marker-\@nil#1\@nil|\\ -% Arguments & -% \texttt{\textcolor{red}{\char`\#1}-\textcolor{blue}{\char`\#2}-\textcolor{Green}{\char`\#3}} -% = \texttt{\textcolor{red}{\char`\{\char`\}}-\textcolor{blue}{Y}-\textcolor{Green}{\cmd\@marker-}}\\ -% \hline -% \end{tabular} +% \begin{macro}{\um_int_if_range_matches_slot:nnT} +% A `numrange' is like |-2,5-8,12,17-| (can be unsorted). +% +% Four cases, four argument types: +% \begin{Verbatim} +% #2 #3 #4 +% [ 1] - [qn] - [ ] qs +% [ 1] - [ ] - [qn-] qs +% [ ] - [ 3] - [qn-] qs +% [ 1] - [ 3] - [qn-] qs +% \end{Verbatim} +% % \begin{macrocode} - \ifx\@empty\@tempa - \int_compare:nT {#4<#2+1} \@tempswatrue +\cs_new:Nn \um_int_if_range_matches_slot:nnT + { \um_numrange_parse:nwT {#1} #2 - \q_nil - \q_stop {#3} } % \end{macrocode} -% \begin{tabular}{@{}ll} -% \hline -% Range & $x \leq r \leq y$ \\ -% C-list input & \cmd\@ii=|X-Y| \\ -% Macro input & |\um@parse@range X-Y-\@marker-\@nil#1\@nil|\\ -% Arguments & -% \texttt{\textcolor{red}{\char`\#1}-\textcolor{blue}{\char`\#2}-\textcolor{Green}{\char`\#3}} -% = \texttt{\textcolor{red}{X}-\textcolor{blue}{Y}-\textcolor{Green}{\cmd\@marker-}}\\ -% \hline -% \end{tabular} +% % \begin{macrocode} - \else - \int_compare:nT {#4>#1-1} { - \int_compare:nT {#4<#2+1} \@tempswatrue - } - \fi - \fi - \fi -} +\cs_set:Npn \um_numrange_parse:nwT #1 #2 - #3 - #4 \q_stop #5 + { + \tl_if_empty:nTF {#4} { \int_compare:nT {#1=#2} {#5} } + { + \tl_if_empty:nTF {#3} { \int_compare:nT {#1>=#2} {#5} } + { + \tl_if_empty:nTF {#2} { \int_compare:nT {#1<=#3} {#5} } + { + \int_compare:nT {#1>=#2} { \int_compare:nT {#1<=#3} {#5} } + } } } + } % \end{macrocode} % \end{macro} % @@ -3359,7 +3468,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_new_mathstyle:N} % This function defines a new command like \cs{mathfrak}. % \begin{macrocode} -\cs_new:Npn \um_new_mathstyle:N #1 { +\cs_new:Nn \um_new_mathstyle:N { \um_prepare_mathstyle:f {\exp_after:wN \use_none:nnnnn \token_to_str:N #1} \seq_put_right:Nn \g_um_mathstyles_seq {#1} } @@ -3428,8 +3537,11 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Define the high level math alphabet macros (\cs{mathit}, etc.) in terms of % unicode-math definitions. Use \cs{bgroup}/\cs{egroup} so s'scripts scan the % whole thing. +% +% The flag \cs{l_um_mathstyle_tl} is for other applications to query the +% current math style. % \begin{macrocode} -\cs_new:Npn \um_prepare_mathstyle:n #1 { +\cs_new:Nn \um_prepare_mathstyle:n { \um_init_alphabet:x {#1} \cs_set:cpn {_um_math#1_aux:n} ##1 { \use:c {um_switchto_math#1:} ##1 \egroup @@ -3437,14 +3549,17 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \cs_set_protected:cpx {math#1} { \exp_not:n{ \bgroup - \mode_if_math:F { - \egroup\expandafter - \non@alpherr\expandafter{\csname math#1\endcsname\space} - } + \mode_if_math:F + { + \egroup\expandafter + \non@alpherr\expandafter{\csname math#1\endcsname\space} + } + \tl_set:Nn \l_um_mathstyle_tl {#1} } \exp_not:c {_um_math#1_aux:n} } } +\tl_new:N \l_um_mathstyle_tl \cs_generate_variant:Nn \um_prepare_mathstyle:n {f} % \end{macrocode} % \end{macro} @@ -3456,12 +3571,13 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % later when redefining a particular maths alphabet. % \begin{macrocode} \cs_set:Npn \um_init_alphabet:n #1 { - \um_trace:nx {alph-initialise} {#1} + \um_log:nx {alph-initialise} {#1} \cs_set_eq:cN {um_switchto_math#1:} \prg_do_nothing: } \cs_generate_variant:Nn \um_init_alphabet:n {x} % \end{macrocode} -% Variants +% Variants (cannot use |\cs_generate_variant:Nn| because the base function is +% defined dynamically.) % \begin{macrocode} \cs_new:Npn \um_maybe_init_alphabet:V { \exp_args:NV \um_maybe_init_alphabet:n @@ -3487,7 +3603,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % |\l_um_mathalph_seq|. If not, set up the styles implicitly: % \begin{macrocode} \seq_if_empty:NTF \l_um_mathalph_seq { - \um_trace:n {setup-implicit} + \um_log:n {setup-implicit} \seq_set_eq:NN \l_um_mathalph_seq \g_um_default_mathalph_seq \bool_set_true:N \l_um_implicit_alph_bool \um_maybe_init_alphabet:n {sf} @@ -3498,7 +3614,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % If |range=| has been used then we're in explicit mode: % \begin{macrocode} { - \um_trace:n {setup-explicit} + \um_log:n {setup-explicit} \bool_set_false:N \l_um_implicit_alph_bool \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn @@ -3521,21 +3637,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_setup_math_alphabet:VVV \l_um_tmpa_tl \l_um_tmpb_tl \l_um_remap_style_tl } - \um_warn_missing_alphabets: -} -% \end{macrocode} -% -% \begin{macrocode} -\cs_new:Npn \um_warn_missing_alphabets: { - \seq_if_empty:NF \l_um_missing_alph_seq { - \typeout{ - Package~unicode-math~Warning:~ - missing~math~alphabets~in~font~ \fontname\l_um_font - } - \seq_map_inline:Nn \l_um_missing_alph_seq { - \typeout{\space\space\space\space##1} - } - } + \seq_if_empty:NF \l_um_missing_alph_seq { \um_log:n { missing-alphabets } } } % \end{macrocode} % \end{macro} @@ -3545,7 +3647,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \darg{Math alphabets, comma separated of \{latin,Latin,greek,Greek,num\}} % \darg{Name of the output math style (usually same as input \texttt{bb})} % \begin{macrocode} -\cs_new:Npn \um_setup_math_alphabet:Nnn #1#2#3 { +\cs_new:Nn \um_setup_math_alphabet:Nnn { \tl_set:Nx \l_um_style_tl { \exp_after:wN \use_none:nnnnn \token_to_str:N #1 } @@ -3553,7 +3655,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % First check that at least one of the alphabets for the font shape is defined\dots % \begin{macrocode} \clist_map_inline:nn {#2} { - \tl_set:Nx \l_um_tmpa_tl { \trim@spaces {##1} } + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } \cs_if_exist:cT {um_config_ \l_um_style_tl _\l_um_tmpa_tl :n} { \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { \um_maybe_init_alphabet:V \l_um_style_tl @@ -3570,20 +3672,20 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \dots and then loop through them defining the individual ranges: % \begin{macrocode} \clist_map_inline:nn {#2} { - \tl_set:Nx \l_um_tmpa_tl { \trim@spaces {##1} } + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } \cs_if_exist:cT {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} { \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { - \um_trace:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} + \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} }{ \um_glyph_if_exist:cTF { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } { - \um_trace:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} + \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} }{ \bool_if:NTF \l_um_implicit_alph_bool { \seq_put_right:Nx \l_um_missing_alph_seq { \@backslashchar math \l_um_style_tl \space - (\tl_use:c{g_um_math_alphabet_name_ \l_um_tmpa_tl _tl}) + (\tl_use:c{c_um_math_alphabet_name_ \l_um_tmpa_tl _tl}) } }{ \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {up} @@ -3610,6 +3712,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_map_char_single:nn} % Wrapper for |\um_map_char_noparse:nn| or |\um_map_char_parse:nn| % depending on the context. +% Cannot use |\cs_generate_variant:Nn| because the base function is +% defined dynamically. % \begin{macrocode} \cs_new:Npn \um_map_char_single:cc { \exp_args:Ncc \um_map_char_single:nn } % \end{macrocode} @@ -3619,14 +3723,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_map_char_noparse:nn} % \begin{macro}{\um_map_char_parse:nn} % \begin{macrocode} -\cs_new:Npn \um_map_char_noparse:nn #1#2 { +\cs_new:Nn \um_map_char_noparse:nn { \um_set_mathcode:nnnn {#1}{\mathalpha}{\um_symfont_tl}{#2} } % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_map_char_parse:nn #1#2 { - \um@parse@term {#1} {\@nil} {\mathalpha} { +\cs_new:Nn \um_map_char_parse:nn { + \um_if_char_spec:nNNT {#1} {\@nil} {\mathalpha} { \um_map_char_noparse:nn {#1}{#2} } } @@ -3639,7 +3743,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \darg{from alphabet(s)} % \darg{to alphabet} % \begin{macrocode} -\cs_new:Npn \um_map_char_single:nnn #1#2#3 { +\cs_new:Nn \um_map_char_single:nnn { \um_map_char_single:cc { \um_to_usv:nn {#1}{#3} } { \um_to_usv:nn {#2}{#3} } } @@ -3671,7 +3775,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % And the wrapper with names: % \begin{macrocode} -\cs_new:Npn \um_map_chars_range:nnnn #1#2#3#4 { +\cs_new:Nn \um_map_chars_range:nnnn { \um_map_chars_range:ncc {#1} { \um_to_usv:nn {#2}{#4} } { \um_to_usv:nn {#3}{#4} } } @@ -3681,7 +3785,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Functions for alphabets} % % \begin{macrocode} -\cs_set:Npn \um_map_chars_Latin:nn #1#2 { +\cs_new:Nn \um_map_chars_Latin:nn { \clist_map_inline:nn {#1} { \um_map_chars_range:nnnn {26} {##1} {#2} {Latin} } @@ -3689,7 +3793,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_set:Npn \um_map_chars_latin:nn #1#2 { +\cs_new:Nn \um_map_chars_latin:nn { \clist_map_inline:nn {#1} { \um_map_chars_range:nnnn {26} {##1} {#2} {latin} } @@ -3697,7 +3801,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_set:Npn \um_map_chars_greek:nn #1#2 { +\cs_new:Nn \um_map_chars_greek:nn { \clist_map_inline:nn {#1} { \um_map_chars_range:nnnn {25} {##1} {#2} {greek} \um_map_char_single:nnn {##1} {#2} {varepsilon} @@ -3711,7 +3815,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_set:Npn \um_map_chars_Greek:nn #1#2 { +\cs_new:Nn \um_map_chars_Greek:nn { \clist_map_inline:nn {#1} { \um_map_chars_range:nnnn {25} {##1} {#2} {Greek} \um_map_char_single:nnn {##1} {#2} {varTheta} @@ -3720,7 +3824,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_set:Npn \um_map_chars_numbers:nn #1#2 { +\cs_new:Nn \um_map_chars_numbers:nn { \um_map_chars_range:nnnn {10} {#1} {#2} {num} } % \end{macrocode} @@ -3731,7 +3835,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Functions for setting up the maths alphabets} % % \begin{macro}{\um_set_mathalphabet_char:Nnn} -% This is a wrapper for either |\um_mathmap_noparse:Nnn| or |\um_mathmap_parse:Nnn|, depending on the context. +% This is a wrapper for either |\um_mathmap_noparse:Nnn| or +% |\um_mathmap_parse:Nnn|, depending on the context. +% Cannot use |\cs_generate_variant:Nn| because the base function is +% defined dynamically. % \begin{macrocode} \cs_new:Npn \um_set_mathalphabet_char:Ncc { \exp_args:NNcc \um_set_mathalphabet_char:Nnn @@ -3745,7 +3852,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \darg{Output slot, \eg, the slot for `$\mathbb{A}$'} % Adds \cs{um_set_mathcode:nnnn} declarations to the specified maths alphabet's definition. % \begin{macrocode} -\cs_set:Npn \um_mathmap_noparse:Nnn #1#2#3 { +\cs_new:Nn \um_mathmap_noparse:Nnn { \clist_map_inline:nn {#2} { \tl_put_right:cx {um_switchto_\cs_to_str:N #1:} { \um_set_mathcode:nnnn{##1}{\mathalpha}{\um_symfont_tl}{#3} @@ -3759,11 +3866,11 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \darg{Maths alphabet, \eg, \cmd\mathbb} % \darg{Input slot(s), \eg, the slot for `A' (comma separated)} % \darg{Output slot, \eg, the slot for `$\mathbb{A}$'} -% When \cmd\um@parse@term\ is executed, it populates the \cmd\l_um_char_num_range_clist\ +% When \cmd\um_if_char_spec:nNNT\ is executed, it populates the \cmd\l_um_char_num_range_clist\ % macro with slot numbers corresponding to the specified range. This range is used to % conditionally add \cs{um_set_mathcode:nnnn} declaractions to the maths alphabet definition. % \begin{macrocode} -\cs_set:Npn \um_mathmap_parse:Nnn #1#2#3 { +\cs_new:Nn \um_mathmap_parse:Nnn { \clist_if_in:NnT \l_um_char_num_range_clist {#3} { \um_mathmap_noparse:Nnn {#1}{#2}{#3} } @@ -3793,9 +3900,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % First the version that uses numbers: % \begin{macrocode} \cs_new:Npn \um_set_mathalph_range:nNnn #1#2#3#4 { - \prg_stepwise_inline:nnnn {0}{1}{#1-1} { - \um_set_mathalphabet_char:Nnn {#2} { ##1 + #3 } { ##1 + #4 } - } + \prg_stepwise_inline:nnnn {0}{1}{#1-1} + { \um_set_mathalphabet_char:Nnn {#2} { ##1 + #3 } { ##1 + #4 } } } \cs_generate_variant:Nn \um_set_mathalph_range:nNnn {nNcc} % \end{macrocode} @@ -3813,31 +3919,28 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macrocode} \cs_new:Npn \um_set_mathalphabet_pos:Nnnn #1#2#3#4 { \cs_if_exist:cT { \um_to_usv:nn {#4}{#2} } { - \clist_map_inline:nn {#3} { - \um_set_mathalphabet_char:Nnnn #1 {##1} {#4} {#2} - } + \clist_map_inline:nn {#3} + { \um_set_mathalphabet_char:Nnnn #1 {##1} {#4} {#2} } } } % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_numbers:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {10} #1 {##1} {#3} {num} - } +\cs_new:Nn \um_set_mathalphabet_numbers:Nnn { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {10} #1 {##1} {#3} {num} } } % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_Latin:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {Latin} - } +\cs_new:Nn \um_set_mathalphabet_Latin:Nnn { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {Latin} } } % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_latin:Nnn #1#2#3 { +\cs_new:Nn \um_set_mathalphabet_latin:Nnn { \clist_map_inline:nn {#2} { \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {latin} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {h} @@ -3846,7 +3949,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_Greek:Nnn #1#2#3 { +\cs_new:Nn \um_set_mathalphabet_Greek:Nnn { \clist_map_inline:nn {#2} { \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {Greek} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varTheta} @@ -3855,7 +3958,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_set_mathalphabet_greek:Nnn #1#2#3 { +\cs_new:Nn \um_set_mathalphabet_greek:Nnn { \clist_map_inline:nn {#2} { \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {greek} \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varepsilon} @@ -3872,24 +3975,21 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \subsubsection{Upright: \cmd\mathup} % \begin{macrocode} -\cs_new:Npn \um_config_up_num:n #1 { +\cs_new:Nn \um_config_up_num:n { \um_map_chars_numbers:nn {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathup {up}{#1} } -\cs_new:Npn \um_config_up_Latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Latin:nn {up} {#1} - }{ - \bool_if:NT \g_um_upLatin_bool { - \um_map_chars_Latin:nn {up,it} {#1} - } +\cs_new:Nn \um_config_up_Latin:n + { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {up} {#1} } + { + \bool_if:NT \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } } \um_set_mathalphabet_Latin:Nnn \mathup {up,it}{#1} } -\cs_new:Npn \um_config_up_latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_latin:nn {up} {#1} - }{ +\cs_new:Nn \um_config_up_latin:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_latin:nn {up} {#1} } + { \bool_if:NT \g_um_uplatin_bool { \um_map_chars_latin:nn {up,it} {#1} \um_map_single:nnn {h} {up,it} {#1} @@ -3899,27 +3999,23 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_latin:Nnn \mathup {up,it}{#1} } -\cs_new:Npn \um_config_up_Greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Greek:nn {up}{#1} - }{ - \bool_if:NT \g_um_upGreek_bool { - \um_map_chars_Greek:nn {up,it}{#1} - } +\cs_new:Nn \um_config_up_Greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {up}{#1} } + { + \bool_if:NT \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } } \um_set_mathalphabet_Greek:Nnn \mathup {up,it}{#1} } -\cs_new:Npn \um_config_up_greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_greek:nn {up} {#1} - }{ +\cs_new:Nn \um_config_up_greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {up} {#1} } + { \bool_if:NT \g_um_upgreek_bool { \um_map_chars_greek:nn {up,it} {#1} } } \um_set_mathalphabet_greek:Nnn \mathup {up,it} {#1} } -\cs_new:Npn \um_config_up_misc:n #1 { +\cs_new:Nn \um_config_up_misc:n { \bool_if:NTF \g_um_literal_Nabla_bool { \um_map_single:nnn {Nabla}{up}{up} }{ @@ -3944,17 +4040,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Italic: \cmd\mathit} % % \begin{macrocode} -\cs_new:Npn \um_config_it_Latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Latin:nn {it} {#1} - }{ - \bool_if:NF \g_um_upLatin_bool { - \um_map_chars_Latin:nn {up,it} {#1} - } +\cs_new:Nn \um_config_it_Latin:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {it} {#1} } + { + \bool_if:NF \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } } \um_set_mathalphabet_Latin:Nnn \mathit {up,it}{#1} } -\cs_new:Npn \um_config_it_latin:n #1 { +\cs_new:Nn \um_config_it_latin:n { \bool_if:NTF \g_um_literal_bool { \um_map_chars_latin:nn {it} {#1} \um_map_single:nnn {h}{it}{#1} @@ -3970,27 +4063,21 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_set_mathalphabet_pos:Nnnn \mathit {dotlessi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathit {dotlessj} {up,it} {#1} } -\cs_new:Npn \um_config_it_Greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Greek:nn {it}{#1} +\cs_new:Nn \um_config_it_Greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {it}{#1} }{ - \bool_if:NF \g_um_upGreek_bool { - \um_map_chars_Greek:nn {up,it}{#1} - } + \bool_if:NF \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } } \um_set_mathalphabet_Greek:Nnn \mathit {up,it}{#1} } -\cs_new:Npn \um_config_it_greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_greek:nn {it} {#1} - }{ - \bool_if:NF \g_um_upgreek_bool { - \um_map_chars_greek:nn {it,up} {#1} - } +\cs_new:Nn \um_config_it_greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {it} {#1} } + { + \bool_if:NF \g_um_upgreek_bool { \um_map_chars_greek:nn {it,up} {#1} } } \um_set_mathalphabet_greek:Nnn \mathit {up,it} {#1} } -\cs_new:Npn \um_config_it_misc:n #1 { +\cs_new:Nn \um_config_it_misc:n { \bool_if:NTF \g_um_literal_Nabla_bool { \um_map_single:nnn {Nabla}{it}{it} }{ @@ -4013,10 +4100,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Blackboard or double-struck: \cmd\mathbb\ and \cmd\mathbbit} % % \begin{macrocode} -\cs_new:Npn \um_config_bb_latin:n #1 { +\cs_new:Nn \um_config_bb_latin:n { \um_set_mathalphabet_latin:Nnn \mathbb {up,it}{#1} } -\cs_new:Npn \um_config_bb_Latin:n #1 { +\cs_new:Nn \um_config_bb_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathbb {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathbb {C} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {H} {up,it} {#1} @@ -4026,17 +4113,17 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_set_mathalphabet_pos:Nnnn \mathbb {R} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {Z} {up,it} {#1} } -\cs_new:Npn \um_config_bb_num:n #1 { +\cs_new:Nn \um_config_bb_num:n { \um_set_mathalphabet_numbers:Nnn \mathbb {up}{#1} } -\cs_new:Npn \um_config_bb_misc:n #1 { +\cs_new:Nn \um_config_bb_misc:n { \um_set_mathalphabet_pos:Nnnn \mathbb {Pi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {pi} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {Gamma} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {gamma} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbb {summation} {up} {#1} } -\cs_new:Npn \um_config_bbit_misc:n #1 { +\cs_new:Nn \um_config_bbit_misc:n { \um_set_mathalphabet_pos:Nnnn \mathbbit {D} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbbit {d} {up,it} {#1} \um_set_mathalphabet_pos:Nnnn \mathbbit {e} {up,it} {#1} @@ -4048,7 +4135,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Script and caligraphic: \cmd\mathscr\ and \cmd\mathcal} % % \begin{macrocode} -\cs_new:Npn \um_config_scr_Latin:n #1 { +\cs_new:Nn \um_config_scr_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathscr {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {B}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {E}{up,it}{#1} @@ -4059,7 +4146,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_set_mathalphabet_pos:Nnnn \mathscr {M}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {R}{up,it}{#1} } -\cs_new:Npn \um_config_scr_latin:n #1 { +\cs_new:Nn \um_config_scr_latin:n { \um_set_mathalphabet_latin:Nnn \mathscr {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {e}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathscr {g}{up,it}{#1} @@ -4069,7 +4156,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % These are by default synonyms for the above, but with the STIX % fonts we want to use the alternate alphabet. % \begin{macrocode} -\cs_new:Npn \um_config_cal_Latin:n #1 { +\cs_new:Nn \um_config_cal_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathcal {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathcal {B}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathcal {E}{up,it}{#1} @@ -4085,7 +4172,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Fractur or fraktur or blackletter: \cmd\mathfrak} % % \begin{macrocode} -\cs_new:Npn \um_config_frak_Latin:n #1 { +\cs_new:Nn \um_config_frak_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathfrak {up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {C}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {H}{up,it}{#1} @@ -4093,18 +4180,18 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_set_mathalphabet_pos:Nnnn \mathfrak {R}{up,it}{#1} \um_set_mathalphabet_pos:Nnnn \mathfrak {Z}{up,it}{#1} } -\cs_new:Npn \um_config_frak_latin:n #1 { +\cs_new:Nn \um_config_frak_latin:n { \um_set_mathalphabet_latin:Nnn \mathfrak {up,it}{#1} } % \end{macrocode} % % \subsubsection{Sans serif upright: \cmd\mathsfup} % \begin{macrocode} -\cs_new:Npn \um_config_sfup_num:n #1 { +\cs_new:Nn \um_config_sfup_num:n { \um_set_mathalphabet_numbers:Nnn \mathsf {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathsfup {up}{#1} } -\cs_new:Npn \um_config_sfup_Latin:n #1 { +\cs_new:Nn \um_config_sfup_Latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_Latin:nn {sfup} {#1} \um_set_mathalphabet_Latin:Nnn \mathsf {up}{#1} @@ -4116,7 +4203,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_Latin:Nnn \mathsfup {up,it}{#1} } -\cs_new:Npn \um_config_sfup_latin:n #1 { +\cs_new:Nn \um_config_sfup_latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_latin:nn {sfup} {#1} \um_set_mathalphabet_latin:Nnn \mathsf {up}{#1} @@ -4133,7 +4220,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \subsubsection{Sans serif italic: \cmd\mathsfit} % % \begin{macrocode} -\cs_new:Npn \um_config_sfit_Latin:n #1 { +\cs_new:Nn \um_config_sfit_Latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_Latin:nn {sfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathsf {it}{#1} @@ -4145,7 +4232,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_Latin:Nnn \mathsfit {up,it}{#1} } -\cs_new:Npn \um_config_sfit_latin:n #1 { +\cs_new:Nn \um_config_sfit_latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_latin:nn {sfit} {#1} \um_set_mathalphabet_latin:Nnn \mathsf {it}{#1} @@ -4161,13 +4248,13 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \subsubsection{Typewriter or monospaced: \cmd\mathtt} % \begin{macrocode} -\cs_new:Npn \um_config_tt_num:n #1 { +\cs_new:Nn \um_config_tt_num:n { \um_set_mathalphabet_numbers:Nnn \mathtt {up}{#1} } -\cs_new:Npn \um_config_tt_Latin:n #1 { +\cs_new:Nn \um_config_tt_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathtt {up,it}{#1} } -\cs_new:Npn \um_config_tt_latin:n #1 { +\cs_new:Nn \um_config_tt_latin:n { \um_set_mathalphabet_latin:Nnn \mathtt {up,it}{#1} } % \end{macrocode} @@ -4175,7 +4262,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \subsubsection{Bold Italic: \cmd\mathbfit} % \begin{macrocode} -\cs_new:Npn \um_config_bfit_Latin:n #1 { +\cs_new:Nn \um_config_bfit_Latin:n { \bool_if:NF \g_um_bfupLatin_bool { \um_map_chars_Latin:nn {bfup,bfit} {#1} } @@ -4190,7 +4277,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfit_latin:n #1 { +\cs_new:Nn \um_config_bfit_latin:n { \bool_if:NF \g_um_bfuplatin_bool { \um_map_chars_latin:nn {bfup,bfit} {#1} } @@ -4205,7 +4292,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfit_Greek:n #1 { +\cs_new:Nn \um_config_bfit_Greek:n { \um_set_mathalphabet_Greek:Nnn \mathbfit {up,it}{#1} \bool_if:NTF \g_um_bfliteral_bool { \um_map_chars_Greek:nn {bfit}{#1} @@ -4217,7 +4304,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfit_greek:n #1 { +\cs_new:Nn \um_config_bfit_greek:n { \um_set_mathalphabet_greek:Nnn \mathbfit {up,it} {#1} \bool_if:NTF \g_um_bfliteral_bool { \um_map_chars_greek:nn {bfit} {#1} @@ -4229,7 +4316,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfit_misc:n #1 { +\cs_new:Nn \um_config_bfit_misc:n { \bool_if:NTF \g_um_literal_Nabla_bool { \um_map_single:nnn {Nabla}{bfit}{#1} }{ @@ -4266,11 +4353,11 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \subsubsection{Bold Upright: \cmd\mathbfup} % \begin{macrocode} -\cs_new:Npn \um_config_bfup_num:n #1 { +\cs_new:Nn \um_config_bfup_num:n { \um_set_mathalphabet_numbers:Nnn \mathbf {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathbfup {up}{#1} } -\cs_new:Npn \um_config_bfup_Latin:n #1 { +\cs_new:Nn \um_config_bfup_Latin:n { \bool_if:NT \g_um_bfupLatin_bool { \um_map_chars_Latin:nn {bfup,bfit} {#1} } @@ -4285,7 +4372,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfup_latin:n #1 { +\cs_new:Nn \um_config_bfup_latin:n { \bool_if:NT \g_um_bfuplatin_bool { \um_map_chars_latin:nn {bfup,bfit} {#1} } @@ -4300,7 +4387,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfup_Greek:n #1 { +\cs_new:Nn \um_config_bfup_Greek:n { \um_set_mathalphabet_Greek:Nnn \mathbfup {up,it}{#1} \bool_if:NTF \g_um_bfliteral_bool { \um_map_chars_Greek:nn {bfup}{#1} @@ -4312,7 +4399,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfup_greek:n #1 { +\cs_new:Nn \um_config_bfup_greek:n { \um_set_mathalphabet_greek:Nnn \mathbfup {up,it} {#1} \bool_if:NTF \g_um_bfliteral_bool { \um_map_chars_greek:nn {bfup} {#1} @@ -4324,7 +4411,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } -\cs_new:Npn \um_config_bfup_misc:n #1 { +\cs_new:Nn \um_config_bfup_misc:n { \bool_if:NTF \g_um_literal_Nabla_bool { \um_map_single:nnn {Nabla}{bfup}{#1} }{ @@ -4364,34 +4451,34 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \subsubsection{Bold fractur or fraktur or blackletter: \cmd\mathbffrak} % \begin{macrocode} -\cs_new:Npn \um_config_bffrak_Latin:n #1 { +\cs_new:Nn \um_config_bffrak_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathbffrak {up,it}{#1} } -\cs_new:Npn \um_config_bffrak_latin:n #1 { +\cs_new:Nn \um_config_bffrak_latin:n { \um_set_mathalphabet_latin:Nnn \mathbffrak {up,it}{#1} } % \end{macrocode} % % \subsubsection{Bold script or calligraphic: \cmd\mathbfscr} % \begin{macrocode} -\cs_new:Npn \um_config_bfscr_Latin:n #1 { +\cs_new:Nn \um_config_bfscr_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathbfscr {up,it}{#1} } -\cs_new:Npn \um_config_bfscr_latin:n #1 { +\cs_new:Nn \um_config_bfscr_latin:n { \um_set_mathalphabet_latin:Nnn \mathbfscr {up,it}{#1} } -\cs_new:Npn \um_config_bfcal_Latin:n #1 { +\cs_new:Nn \um_config_bfcal_Latin:n { \um_set_mathalphabet_Latin:Nnn \mathbfcal {up,it}{#1} } % \end{macrocode} % % \subsubsection{Bold upright sans serif: \cmd\mathbfsfup} % \begin{macrocode} -\cs_new:Npn \um_config_bfsfup_num:n #1 { +\cs_new:Nn \um_config_bfsfup_num:n { \um_set_mathalphabet_numbers:Nnn \mathbfsf {up}{#1} \um_set_mathalphabet_numbers:Nnn \mathbfsfup {up}{#1} } -\cs_new:Npn \um_config_bfsfup_Latin:n #1 { +\cs_new:Nn \um_config_bfsfup_Latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_Latin:nn {bfsfup} {#1} \um_set_mathalphabet_Latin:Nnn \mathbfsf {up}{#1} @@ -4403,7 +4490,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_Latin:Nnn \mathbfsfup {up,it}{#1} } -\cs_new:Npn \um_config_bfsfup_latin:n #1 { +\cs_new:Nn \um_config_bfsfup_latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_latin:nn {bfsfup} {#1} \um_set_mathalphabet_latin:Nnn \mathbfsf {up}{#1} @@ -4415,7 +4502,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_latin:Nnn \mathbfsfup {up,it}{#1} } -\cs_new:Npn \um_config_bfsfup_Greek:n #1 { +\cs_new:Nn \um_config_bfsfup_Greek:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_Greek:nn {bfsfup}{#1} \um_set_mathalphabet_Greek:Nnn \mathbfsf {up}{#1} @@ -4427,7 +4514,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_Greek:Nnn \mathbfsfup {up,it}{#1} } -\cs_new:Npn \um_config_bfsfup_greek:n #1 { +\cs_new:Nn \um_config_bfsfup_greek:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_greek:nn {bfsfup} {#1} \um_set_mathalphabet_greek:Nnn \mathbfsf {up} {#1} @@ -4439,7 +4526,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_greek:Nnn \mathbfsfup {up,it} {#1} } -\cs_new:Npn \um_config_bfsfup_misc:n #1 { +\cs_new:Nn \um_config_bfsfup_misc:n { \bool_if:NTF \g_um_literal_Nabla_bool { \um_map_single:nnn {Nabla}{bfsfup}{#1} }{ @@ -4476,7 +4563,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \subsubsection{Bold italic sans serif: \cmd\mathbfsfit} % \begin{macrocode} -\cs_new:Npn \um_config_bfsfit_Latin:n #1 { +\cs_new:Nn \um_config_bfsfit_Latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_Latin:nn {bfsfit} {#1} \um_set_mathalphabet_Latin:Nnn \mathbfsf {it}{#1} @@ -4488,7 +4575,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_Latin:Nnn \mathbfsfit {up,it}{#1} } -\cs_new:Npn \um_config_bfsfit_latin:n #1 { +\cs_new:Nn \um_config_bfsfit_latin:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_latin:nn {bfsfit} {#1} \um_set_mathalphabet_latin:Nnn \mathbfsf {it}{#1} @@ -4500,7 +4587,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_latin:Nnn \mathbfsfit {up,it}{#1} } -\cs_new:Npn \um_config_bfsfit_Greek:n #1 { +\cs_new:Nn \um_config_bfsfit_Greek:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_Greek:nn {bfsfit}{#1} \um_set_mathalphabet_Greek:Nnn \mathbfsf {it}{#1} @@ -4512,7 +4599,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_Greek:Nnn \mathbfsfit {up,it}{#1} } -\cs_new:Npn \um_config_bfsfit_greek:n #1 { +\cs_new:Nn \um_config_bfsfit_greek:n { \bool_if:NTF \g_um_sfliteral_bool { \um_map_chars_greek:nn {bfsfit} {#1} \um_set_mathalphabet_greek:Nnn \mathbfsf {it} {#1} @@ -4524,7 +4611,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \um_set_mathalphabet_greek:Nnn \mathbfsfit {up,it} {#1} } -\cs_new:Npn \um_config_bfsfit_misc:n #1 { +\cs_new:Nn \um_config_bfsfit_misc:n { \bool_if:NTF \g_um_literal_Nabla_bool { \um_map_single:nnn {Nabla}{bfsfit}{#1} }{ @@ -4569,7 +4656,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % In time, the case statement inside |set_mathsymbol| will be moved in here % to avoid re-running it every time. % \begin{macrocode} -\xetex_or_luatex:nnn { \cs_set:Npn \um_symbol_setup: } +\cs_new:Npn \um_symbol_setup: +%<*XE> { \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { \prg_case_tl:Nnn ##3 { \mathover {} \mathunder {} } @@ -4578,11 +4666,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } } } +% +%<*LU> { \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} } } +% % \end{macrocode} % % \begin{macrocode} @@ -4593,7 +4684,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macro}{\um_input_math_symbol_table:} % This function simply expands to the token list containing all the data. % \begin{macrocode} -\cs_new:Npn \um_input_math_symbol_table: {\g_um_mathtable_tl} +\cs_new:Nn \um_input_math_symbol_table: {\g_um_mathtable_tl} % \end{macrocode} % \end{macro} % @@ -4613,18 +4704,19 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % to perform the lowercasing and |\let|. \cmd\scantokens\ changes the carets % back into their original meaning after the group has ended and |^|'s catcode returns to normal. % \begin{macrocode} -\begingroup +\group_begin: \char_set_catcode_other:N \^ \cs_gset:Npn \um_cs_set_eq_active_char:Nw #1 = "#2 \q_nil { - \lowercase{ + \tex_lowercase:D { \tl_rescan:nn { + \ExplSyntaxOn \char_set_catcode_other:N \{ \char_set_catcode_other:N \} \char_set_catcode_other:N \& \char_set_catcode_other:N \% \char_set_catcode_other:N \$ }{ - \global\let#1=^^^^^#2 + \cs_gset_eq:NN #1 ^^^^^#2 } } } @@ -4634,18 +4726,13 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Because we're inside a |\tl_rescan:nn|, use plain old \TeX\ syntax to avoid % any catcode problems. % \begin{macrocode} - \cs_gnew:Npn \um_active_char_set:wc "#1 \q_nil #2 { - \lowercase { - \tl_rescan:nn { - \catcode`\_=11\relax - \catcode`\:=11\relax - \catcode`\^=7\relax - }{ - \protected\gdef^^^^^#1{\csname #2\endcsname}% - } + \cs_new:Npn \um_active_char_set:wc "#1 \q_nil #2 { + \tex_lowercase:D { + \tl_rescan:nn { \ExplSyntaxOn } + { \cs_gset_protected_nopar:Npx ^^^^^#1 { \exp_not:c {#2} } } } } -\endgroup +\group_end: % \end{macrocode} % \end{macro} % \end{macro} @@ -4657,7 +4744,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % make sure |#| is an `other' so that we don't get confused with \cs{mathoctothorpe}. % \begin{macrocode} \AtBeginDocument{\um_define_math_chars:} -\cs_set:Nn \um_define_math_chars: { +\cs_new:Nn \um_define_math_chars: { \group_begin: \char_set_catcode_math_superscript:N \^ \cs_set:Npn \_um_sym:nnn ##1##2##3 { @@ -4749,8 +4836,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \cs_new:Nn \um_arg_i_before_egroup:n {#1\egroup} \cs_new:Nn \um_superscript:n { ^\bgroup #1 - \peek_meaning_remove:NTF ^ - \um_arg_i_before_egroup:n \egroup + \peek_meaning_remove:NTF ^ \um_arg_i_before_egroup:n \egroup } % \end{macrocode} % @@ -4761,13 +4847,13 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % % \begin{macrocode} -\cs_new:Npn \um_nprimes:Nn #1#2 { +\cs_new:Nn \um_nprimes:Nn { \um_superscript:n { #1 \prg_replicate:nn {#2-1} { \mskip \g_um_primekern_muskip #1 } } } -\cs_new:Npn \um_nprimes_select:nn #1#2 { +\cs_new:Nn \um_nprimes_select:nn { \prg_case_int:nnn {#2}{ {1} { \um_superscript:n {#1} } {2} { @@ -4789,7 +4875,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_nprimes:Nn #1 {#2} } } -\cs_new:Npn \um_nbackprimes_select:nn #1#2 { +\cs_new:Nn \um_nbackprimes_select:nn { \prg_case_int:nnn {#2}{ {1} { \um_superscript:n {#1} } {2} { @@ -4847,7 +4933,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \int_set:Nn \l_um_primecount_int {3} \um_scanprime_collect:N \um_prime_single_mchar } -\cs_new:Npn \um_scanprime_collect:N #1 { +\cs_new:Nn \um_scanprime_collect:N { \int_incr:N \l_um_primecount_int \peek_meaning_remove:NTF ' { \um_scanprime_collect:N #1 @@ -4920,7 +5006,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \int_set:Nn \l_um_primecount_int {2} \um_scanbackprime_collect:N \um_backprime_single_mchar } -\cs_new:Npn \um_scanbackprime_collect:N #1 { +\cs_new:Nn \um_scanbackprime_collect:N { \int_incr:N \l_um_primecount_int \peek_meaning_remove:NTF ` { \um_scanbackprime_collect:N #1 @@ -4960,7 +5046,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \begin{macrocode} \AtBeginDocument{\um_define_prime_commands: \um_define_prime_chars:} -\cs_set:Nn \um_define_prime_commands: { +\cs_new:Nn \um_define_prime_commands: { \cs_set_eq:NN \prime \um_prime_single_mchar \cs_set_eq:NN \dprime \um_prime_double_mchar \cs_set_eq:NN \trprime \um_prime_triple_mchar @@ -4997,7 +5083,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \begin{macrocode} \AtBeginDocument{\um_redefine_radical:} -\xetex_or_luatex:nnn { \cs_set:Nn \um_redefine_radical: } { +\cs_new:Nn \um_redefine_radical: +%<*XE> + { \@ifpackageloaded { amsmath } { } { % \end{macrocode} % \begin{macro}{\r@@t} @@ -5031,7 +5119,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macro} % \begin{macrocode} } -} { + } +% +%<*LU> + { \@ifpackageloaded { amsmath } { } { % \end{macrocode} % \begin{macro}{\root} @@ -5044,20 +5135,30 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macro} % \begin{macrocode} } -} + } +% % \end{macrocode} % % % \begin{macro}{\um_fontdimen_to_percent:nn} +% \begin{macro}{\um_fontdimen_to_scale:nn} % \darg{Font dimen number} % \darg{Font `variable'} -% \cmd\fontdimen s |10|, |11|, and |65| aren't actually dimensions, they're percentage values given in units of |sp|. This macro takes a font dimension number and outputs the decimal value of the associated parameter. +% \cmd\fontdimen s |10|, |11|, and |65| aren't actually dimensions, they're percentage values given in units of |sp|. +% \cs{um_fontdimen_to_percent:nn} takes a font dimension number and outputs the decimal value of the associated parameter. +% \cs{um_fontdimen_to_scale:nn} returns a dimension correspond to the current +% font size relative proportion based on that percentage. % \begin{macrocode} -\cs_new:Npn \um_fontdimen_to_percent:nn #1#2 { +\cs_new:Nn \um_fontdimen_to_percent:nn { \strip@pt\dimexpr\fontdimen#1#2*65536/100\relax } +\cs_new:Nn \um_fontdimen_to_scale:nn + { + \um_fontdimen_to_percent:nn {#1} {#2} \dimexpr \f@size pt\relax + } % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}{\um_mathstyle_scale:Nnn} % \darg{A math style (\cs{scriptstyle}, say)} @@ -5065,7 +5166,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \darg{Length control sequence to be scaled according to the math style} % This macro is used to scale the lengths reported by \cmd\fontdimen\ according to the scale factor for script- and scriptscript-size objects. % \begin{macrocode} -\cs_new:Npn \um_mathstyle_scale:Nnn #1#2#3 { +\cs_new:Nn \um_mathstyle_scale:Nnn { \ifx#1\scriptstyle #2\um_fontdimen_to_percent:nn{10}\l_um_font#3 \else @@ -5106,7 +5207,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \cs{scantokens} makes this process much simpler since we can activate the % char and assign its meaning in one step. % \begin{macrocode} -\cs_set:Npn \um_setup_active_superscript:nn #1#2 { +\cs_new:Nn \um_setup_active_superscript:nn { \prop_gput:Nxn \g_um_supers_prop {\meaning #1} {#2} \char_set_catcode_active:N #1 \char_gmake_mathactive:N #1 @@ -5142,7 +5243,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % \paragraph{Subscripts} Ditto above. % \begin{macrocode} -\cs_set:Npn \um_setup_active_subscript:nn #1#2 { +\cs_new:Nn \um_setup_active_subscript:nn { \prop_gput:Nxn \g_um_subs_prop {\meaning #1} {#2} \char_set_catcode_active:N #1 \char_gmake_mathactive:N #1 @@ -5203,13 +5304,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % The main theme here is stolen from the source to the various \cs{peek_} functions. % Consider this function as simply boilerplate: +% TODO: move all this to expl3, and don't use internal expl3 macros. % \begin{macrocode} \cs_new:Npn \um_scan_sscript:TF #1#2 { - \tl_set:Nx \l_peek_true_aux_tl { \exp_not:n{ #1 } } - \tl_set_eq:NN \l_peek_true_tl \c_peek_true_remove_next_tl - \tl_set:Nx \l_peek_false_tl {\exp_not:n{\group_align_safe_end: #2}} + \tl_set:Nx \peek_true_aux:w { \exp_not:n{ #1 } } + \tl_set_eq:NN \peek_true:w \peek_true_remove:w + \tl_set:Nx \peek_false:w { \exp_not:n { \group_align_safe_end: #2 } } \group_align_safe_begin: - \peek_after:NN \um_peek_execute_branches_ss: + \peek_after:Nw \um_peek_execute_branches_ss: } % \end{macrocode} % We do not skip spaces when scanning ahead, and we explicitly wish to @@ -5221,7 +5323,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \token_if_eq_catcode_p:NN \l_peek_token \c_group_end_token || \token_if_eq_meaning_p:NN \l_peek_token \c_space_token } - { \l_peek_false_tl } + { \peek_false:w } { \um_peek_execute_branches_ss_aux: } } % \end{macrocode} @@ -5238,17 +5340,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \begin{macrocode} \cs_new:Npn \um_peek_execute_branches_ss_aux: { \prop_if_in:cxTF - {g_um_\l_um_tmpa_tl _prop} - {\meaning\l_peek_token} + {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} { - \prop_get:cxN - {g_um_\l_um_tmpa_tl _prop} - {\meaning\l_peek_token} - \l_um_tmpb_tl + \prop_get:cxN + {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} \l_um_tmpb_tl \tl_put_right:NV \l_um_ss_chain_tl \l_um_tmpb_tl - \l_peek_true_tl + \peek_true:w } - {\l_peek_false_tl} + { \peek_false:w } } % \end{macrocode} % @@ -5301,6 +5400,51 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_setup_active_frac: % \end{macrocode} % +% \subsection{\XeTeX\ over- and under- brace, paren, bracket} +% Thanks to Claudio Beccari for this code. +% \begin{macrocode} +%<*XE> +\cs_new:Nn \um_over_bracket:nN + { + \mathop { \vbox { + \setbox\z@\hbox{$\displaystyle#1$} + \dimen@=\dimexpr\wd\z@+3\p@\relax + \setbox\tw@\hbox{$\left #2 \vcenter to\dimen@{\vss} \right. $} + \m@th\ialign + { + ##\crcr\noalign{\kern-\p@}% + \rotatebox[origin=Bl]{-90} + {\box\tw@}\crcr\noalign{\kern0\p@\nointerlineskip}% + \hfil\box\z@\hfil\crcr + } + } } \limits + } +% \end{macrocode} +% +% \begin{macrocode} +\cs_new:Nn \um_under_bracket:nN + { + \mathop { \vtop { + \setbox\z@\hbox{$\displaystyle#1$} + \dimen@=\dimexpr\wd\z@+3\p@\relax + \setbox\tw@\hbox{$\left #2 \vcenter to\dimen@{\vss} \right. $} + \m@th\ialign + { + ##\crcr\hfil\box\z@\hfil\crcr + \noalign{\kern1\p@\nointerlineskip}% + \rotatebox[origin=Br]{-90}{\box\tw@}\crcr\noalign{\kern0\p@} + } + } } \limits + } +\DeclareDocumentCommand \overbrace {m} { \um_over_bracket:nN {#1} \{ } +\DeclareDocumentCommand \overbracket {m} { \um_over_bracket:nN {#1} [ } +\DeclareDocumentCommand \overparen {m} { \um_over_bracket:nN {#1} ( } +\DeclareDocumentCommand \underbrace {m} { \um_under_bracket:nN {#1} \} } +\DeclareDocumentCommand \underbracket {m} { \um_under_bracket:nN {#1} ] } +\DeclareDocumentCommand \underparen {m} { \um_under_bracket:nN {#1} ) } +% +% \end{macrocode} +% % \subsection{Synonyms and all the rest} % % These are symbols with multiple names. Eventually to be taken care of @@ -5324,6 +5468,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \def\owns{\ni} \def\gets{\leftarrow} \def\mathring{\ocirc} +\def\lnot{\neg} % \end{macrocode} % These are somewhat odd: (and their usual Unicode uprightness does not match their amssymb glyphs) % \begin{macrocode} @@ -5408,7 +5553,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \msg_info:nnx { unicode-math } { patch-macro } { \token_to_str:N #1 } \group_end: - \xetex_or_luatex:nnn { #2 #1 #3 } { #6 } { #5 } + #2 #1 #3 +% { #6 } +% { #5 } } { \msg_warning:nnxxx { unicode-math } { wrong-meaning } { \token_to_str:N #1 } { \token_to_meaning:N #1 } @@ -5490,14 +5637,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Since the mathcode of |`\-| is greater than eight bits, this piece of |\AtBeginDocument| code from \pkg{amsmath} dies if we try and set the maths font in the preamble: % \begin{macrocode} \AtEndOfPackageFile * {amsmath} { - \xetex_if_engine:T { - \tl_remove_in:Nn \@begindocumenthook { +%<*XE> + \tl_remove_once:Nn \@begindocumenthook { \mathchardef\std@minus\mathcode`\-\relax \mathchardef\std@equal\mathcode`\=\relax } \def\std@minus{\Umathcharnum\Umathcodenum`\-\relax} \def\std@equal{\Umathcharnum\Umathcodenum`\=\relax} - } +% % \end{macrocode} % % \begin{macrocode} @@ -5506,16 +5653,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % This isn't as clever as the \pkg{amsmath} definition but I think it works: % \begin{macrocode} - \xetex_if_engine:T { +%<*XE> \def \resetMathstrut@ {% \setbox\z@\hbox{$($}%) \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@ } - } % \end{macrocode} % The |subarray| environment uses inappropriate font dimensions. % \begin{macrocode} - \xetex_if_engine:T { \um_check_and_fix:NNnnn \subarray \cs_set:Npn { #1 } { \vcenter \bgroup @@ -5561,7 +5706,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \hfil \crcr } - } +% % \end{macrocode} % The roots need a complete rework. % \begin{macrocode} @@ -5693,11 +5838,16 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macrocode} % \paragraph{Accents} % \begin{macrocode} -\xetex_or_luatex:nnn { \cs_new_protected_nopar:Npn \um_setup_accents: } { +\cs_new_protected_nopar:Nn \um_setup_accents: +%<*XE> + { \def\widehat{\hat} \def\widetilde{\tilde} \def\overrightarrow{\vec} -} { + } +% +%<*LU> + { \cs_gset_protected_nopar:Npx \widehat { \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "0302 } } @@ -5727,12 +5877,13 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EF } } } -} + } +% % \end{macrocode} % % \begin{macrocode} \cs_set_eq:NN \um_text_slash: \slash -\cs_set:Npn \slash { +\cs_set_protected:Npn \slash { \mode_if_math:TF {\mathslash} {\um_text_slash:} } % \end{macrocode} @@ -5742,8 +5893,12 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \begin{macrocode} \AtEndOfPackageFile * { mathtools } { - \xetex_if_engine:T { - \um_check_and_fix:NNnnn \MT_cramped_internal:Nn \cs_set_nopar:Npn { #1 #2 } { +%<*XE> + \chk_if_free_cs:N \g_um_empty_fam + \newfam \g_um_empty_fam + \um_check_and_fix:NNnnn + \MT_cramped_internal:Nn \cs_set_nopar:Npn { #1 #2 } + { \sbox \z@ { $ \m@th @@ -5771,17 +5926,19 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \advance \dimen@ -\ht\z@ \ht\z@ = -\dimen@ \box\z@ - } { + } % \end{macrocode} % The \XeTeX\ version is pretty similar to the legacy version, only using the correct font dimensions. +% Note we used `\verb|\XeTeXradical|' with a newly-allocated empty family to make sure that the radical rule width is not set. % \begin{macrocode} + { \hbox_set:Nn \l_tmpa_box { \color@setgroup \c_math_toggle_token \m@th #1 \dim_zero:N \nulldelimiterspace - \radical \c_zero { #2 } + \XeTeXradical \g_um_empty_fam \c_zero { #2 } \c_math_toggle_token \color@endgroup } @@ -5794,7 +5951,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \box_use_clear:N \l_tmpa_box } - } +% % \end{macrocode} % % \begin{macro}{\dblcolon} @@ -5848,22 +6005,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \end{macro} % \end{macro} % -% \paragraph{\pkg{beamer}} -% \begin{macrocode} -\@ifclassloaded{beamer}{ - \ifbeamer@suppressreplacements\else - \um_warning:n {disable-beamer} - \beamer@suppressreplacementstrue - \fi -}{} -% \end{macrocode} -% % \begin{macrocode} \ExplSyntaxOff -% \end{macrocode} -% -% \begin{macrocode} -% +% % \end{macrocode} % % \section{Error messages} @@ -5879,16 +6023,11 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % Wrapper functions: % \begin{macrocode} \cs_new:Npn \um_warning:n { \msg_warning:nn {unicode-math} } -\cs_new:Npn \um_trace:n { \msg_trace:nn {unicode-math} } -\cs_new:Npn \um_trace:nx { \msg_trace:nnx {unicode-math} } +\cs_new:Npn \um_log:n { \msg_log:nn {unicode-math} } +\cs_new:Npn \um_log:nx { \msg_log:nnx {unicode-math} } % \end{macrocode} % % \begin{macrocode} -\msg_new:nnn {unicode-math} {disable-beamer} -{ - Disabling~ beamer's~ math~ setup.\\ - Please~ load~ beamer~ with~ the~ [professionalfonts]~ class~ option. -} \msg_new:nnn {unicode-math} {no-tfrac} { Small~ fraction~ command~ \protect\tfrac\ not~ defined.\\ @@ -5896,7 +6035,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ } \msg_new:nnn {unicode-math} {default-math-font} { - Defining~ the~ default~ maths~ font~ as~ '#1'. + Defining~ the~ default~ maths~ font~ as~ '\l_um_fontname_tl'. } \msg_new:nnn {unicode-math} {setup-implicit} { @@ -5923,6 +6062,12 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ is~ not~ supported.~ Either~ select~ a~ Unicode~ math~ font,~ or~ don't~ load \\ the~ unicode-math~ package. } +\msg_new:nnn { unicode-math } { missing-alphabets } + { + Missing~math~alphabets~in~font~ "\fontname\l_um_font" \\ \\ + \seq_map_function:NN \l_um_missing_alph_seq \um_print_indent:n + } +\cs_new:Nn \um_print_indent:n { \space\space\space\space #1 \\ } \msg_new:nnn {unicode-math} {macro-expected} { I've~ expected~ that~ #1~ is~ a~ macro,~ but~ it~ isn't. @@ -6170,7 +6315,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \mathfontdimen{Sub\-Superscript\-Gap\-Min} % {Minimum gap between the superscript and subscript ink. Suggested: 4×default rule thickness.} % \mathfontdimen{Superscript\-Bottom\-Max\-With\-Subscript} -% {The maximum level to which the (ink) bottom of superscript can be pushed to increase the gap between superscript and subscript, before subscript starts being moved down. +% {The maximum level to which the (ink) bottom of superscript can be pushed to increase the gap between superscript and subscript, before subscript starts being moved down. % Suggested: /5 x-height.} % \mathfontdimen{Space\-After\-Script} % {Extra white space to be added after each subscript and superscript. Suggested: 0.5pt for a 12 pt font.} @@ -6282,8 +6427,8 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \renewenvironment{theglossary} {\small\list{}{} \item\relax - \glossary@prologue\GlossaryParms - \let\item\@idxitem \ignorespaces + \glossary@prologue\GlossaryParms + \let\item\@idxitem \ignorespaces \def\pfill{\hspace*{\fill}}} {\endlist} @@ -6355,6 +6500,9 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \catcode`\_=11\relax \catcode`\:=11\relax } + +\def\partname{Part} + % \end{macrocode} % %\fi @@ -6369,4 +6517,5 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % \typeout{*************************************************************} % \endinput - + + diff --git a/Master/texmf-dist/source/latex/unicode-math/unimath-symbols.ltx b/Master/texmf-dist/source/latex/unicode-math/unimath-symbols.ltx index b5dcc98dbfc..451fd687ca5 100644 --- a/Master/texmf-dist/source/latex/unicode-math/unimath-symbols.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/unimath-symbols.ltx @@ -6,7 +6,7 @@ \documentclass{article} \makeatletter -\usepackage{booktabs,longtable,shortvrb,geometry,varwidth,textcomp,hyperref} +\usepackage{booktabs,shortvrb,geometry,varwidth,textcomp,longtable,hyperref} \geometry{margin=3cm} \hypersetup{colorlinks,linkcolor=black} @@ -14,26 +14,78 @@ \def\cmd#1{\texttt{\textbackslash\expandafter\@gobble\string#1}} \usepackage{fontspec} -\setmainfont[Ligatures=TeX,Numbers={Monospaced}]{TeX Gyre Pagella} +\setmainfont[Ligatures=TeX,Numbers={Lowercase,Monospaced}]{TeX Gyre Pagella} \usepackage{unicode-math} -\setmathfont[SizeFeatures={ - {Size=-10, Colour=888888}, - {Size=10-, Colour=FF0000}}]{XITS Math} +\setmathfont{XITS Math} + +\newcounter{lm} +\setcounter{lm}{-1} +\setmathfont[version=lm,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=CC6666}}]{lmmath-regular.otf} + +\newcounter{xits} +\setcounter{xits}{-1} +\setmathfont[version=xits,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=CCCC66}}]{xits-math.otf} + +\newcounter{lucida} +\setcounter{lucida}{-1} +\setmathfont[version=lucida,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=66CC66}}]{Lucida Math} + +\newcounter{lucibold} +\setcounter{lucibold}{-1} +\setmathfont[version=lucibold,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=66CC66}}]{Lucida Math Demibold} + +\newcounter{cambria} +\setcounter{cambria}{-1} +\setmathfont[version=cambria,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=66CCCC}}]{Cambria Math} + +\newcounter{asana} +\setcounter{asana}{-1} +\setmathfont[version=asana,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=6666CC}}]{Asana-Math.otf} + +\newcounter{euler} +\setcounter{euler}{-1} +\setmathfont[version=euler,SizeFeatures={ + {Size=-10, Colour=999999}, + {Size=10-, Colour=CC66CC}}]{Neo Euler} + +\ExplSyntaxOn +\fontspec_set_fontface:NNnn \lm \x {} {lmmath-regular.otf} +\fontspec_set_fontface:NNnn \xits \x {} {xits-math.otf} +\fontspec_set_fontface:NNnn \lucida \x {} {Lucida~ Math} +\fontspec_set_fontface:NNnn \lucibold \x {} {Lucida~ Math~ Demibold} +\fontspec_set_fontface:NNnn \cambria \x {} {Cambria~ Math} +\fontspec_set_fontface:NNnn \asana \x {} {Asana-Math.otf} +\fontspec_set_fontface:NNnn \euler \x {} {Neo~ Euler} +\ExplSyntaxOff \def\TABLE{% -\begin{longtable}[l]{@{}lcll@{}} -\toprule -\textsc{usv} & Ex. & Macro & Description \\ -\midrule -\input unicode-math-table.tex\relax\\ -\bottomrule +\setlength\LTleft{-2cm} +\par\noindent +\begin{longtable}[l]{@{}lcccccccll@{}} + \toprule + \textsc{usv} & M & X & C & L & D & A & E & Macro & Description \\ + \midrule \endhead + \input unicode-math-table.tex\relax\\ + \bottomrule \end{longtable} } -\def\USV#1{\small\scshape\MakeLowercase{U+\@gobble#1}} -\def\CMD#1{\small\cmd#1} +\def\USV#1{\footnotesize\scshape\MakeLowercase{\@gobble#1}} +\def\CMD#1{\footnotesize\cmd#1} \def\DESC#1{% - \begin{varwidth}[t]{10cm} - \raggedright\linespread{0.6}\scshape#1% + \begin{varwidth}[t]{6cm} + \raggedright\linespread{0.6}\scriptsize #1% \end{varwidth} } @@ -42,16 +94,29 @@ \def\1{#1}\def\2{##3}% \ifx\1\2% \def\tempa{% - \USV{##1} &% - \SYMB{##2} &% - \CMD{##2} & \DESC{##4}\\% + \USV{##1} & + \SYMB{##2}{lm}{##1} & + \SYMB{##2}{xits}{##1} & + \SYMB{##2}{cambria}{##1} & + \SYMB{##2}{lucida}{##1} & + \SYMB{##2}{lucibold}{##1} & + \SYMB{##2}{asana}{##1} & + \SYMB{##2}{euler}{##1} & + \CMD{##2} & + \DESC{##4} \\% }% \expandafter\tempa \fi }% \TABLE } -\def\SYMB#1{$\displaystyle#1$} +\def\SYMB#1#2#3{% + \expandafter\iffontchar\csname#2\endcsname #3\relax + \refstepcounter{#2}% + \mathversion{#2}% + $\displaystyle#1$% + \fi +} \begin{document} \MakeShortVerb\| @@ -61,7 +126,18 @@ This document uses the file \texttt{unicode-math-table.tex} to print every symbol defined by the \textsf{unicode-math} -package. Use this document to find the command name or the Unicode glyph slot for a symbol that you wish to use. +package. +Use this document to find the command name or the Unicode glyph slot for a symbol that you wish to use. +Seven fonts are shown: (with approximate symbol counts) +\begin{itemize} +\item[M] \mathversion{lm} $\mathup{Latin\ Modern\ Math}$ (\ref{count:lm}) +\item[X] \mathversion{xits} $\mathup{XITS\ Math}$ (\ref{count:xits}) +\item[C] \mathversion{cambria} $\mathup{Cambria\ Math}$ (\ref{count:cambria}) +\item[L] \mathversion{lucida} $\mathup{Lucida\ Math}$ (\ref{count:lucida}) +\item[D] \mathversion{lucibold} $\mathup{Lucida\ Math\ Demibold}$ (\ref{count:lucibold}) +\item[A] \mathversion{asana} $\mathup{Asana\ Math}$ (\ref{count:asana}) +\item[E] \mathversion{euler} $\mathup{Neo\ Euler}$ (\ref{count:euler}) +\end{itemize} \tableofcontents @@ -90,7 +166,13 @@ package. Use this document to find the command name or the Unicode glyph slot fo Note that accents will only be properly placed if used with an OpenType font with the necessary information. \begingroup -\def\SYMB#1{$\displaystyle#1 x$} +\def\SYMB#1#2#3{% + \expandafter\iffontchar\csname#2\endcsname #3\relax + \refstepcounter{#2}% + \mathversion{#2}% + $\displaystyle#1 x$% + \fi +} \SHOW\mathaccent \endgroup @@ -100,7 +182,13 @@ Note that accents will only be properly placed if used with an OpenType font wit Of the operators shown below, a subset need to be flagged by \textsf{unicode-math} for \cmd\nolimits\ adjustments. The limits behaviour as specified by \textsf{unicode-math} are shown with grey subscripts and superscripts. \begingroup -\def\SYMB#1{$\displaystyle#1_0^1$} +\def\SYMB#1#2#3{% + \expandafter\iffontchar\csname#2\endcsname #3\relax + \stepcounter{#2}% + \mathversion{#2}% + $\displaystyle#1_0^1$% + \fi +} \SHOW\mathop \endgroup @@ -120,6 +208,12 @@ The limits behaviour as specified by \textsf{unicode-math} are shown with grey s \section{Alphabetical symbols, \cmd\mathalpha} \SHOW\mathalpha - +\refstepcounter{lm}\label{count:lm} +\refstepcounter{xits}\label{count:xits} +\refstepcounter{cambria}\label{count:cambria} +\refstepcounter{lucida}\label{count:lucida} +\refstepcounter{lucibold}\label{count:lucibold} +\refstepcounter{asana}\label{count:asana} +\refstepcounter{euler}\label{count:euler} \end{document} diff --git a/Master/texmf-dist/tex/latex/unicode-math/unicode-math-luatex.sty b/Master/texmf-dist/tex/latex/unicode-math/unicode-math-luatex.sty new file mode 100644 index 00000000000..bf6589a5a06 --- /dev/null +++ b/Master/texmf-dist/tex/latex/unicode-math/unicode-math-luatex.sty @@ -0,0 +1,2495 @@ +%% +%% This is file `unicode-math-luatex.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% unicode-math.dtx (with options: `package,LU') +%% Copyright 2006-2011 Will Robertson +%% Copyright 2010-2011 Philipp Stephani +%% +%% This package is free software and may be redistributed and/or modified under +%% the conditions of the LaTeX Project Public License, version 1.3c or higher +%% (your choice): . +%% +%% This work is "author-maintained" by Will Robertson. +\ExplSyntaxOn +\cs_new:Nn \um_cs_compat:n + { \cs_set_eq:cc {U#1} {luatexU#1} } +\um_cs_compat:n {mathcode} +\um_cs_compat:n {delcode} +\um_cs_compat:n {mathcodenum} +\um_cs_compat:n {mathcharnum} +\um_cs_compat:n {mathchardef} +\um_cs_compat:n {radical} +\um_cs_compat:n {mathaccent} +\um_cs_compat:n {delimiter} +\bool_const:Nn \c_um_have_fixed_accents_bool + { \int_compare_p:n { \luatexversion > 64 } } +\RequirePackage { lualatex-math } [ 2011/08/07 ] +\RequirePackage { luatexbase } +\RequirePackage { luaotfload } [ 2010/11/26 ] +\RequireLuaModule { unicode-math } [ 2011/04/23 ] +\cs_new:Nn \usv_set:nnn { + \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} +} +\cs_new:Nn \um_to_usv:nn { g_um_#1_#2_usv } +\usv_set:nnn {up}{num}{48} +\usv_set:nnn {up}{Latin}{65} +\usv_set:nnn {up}{latin}{97} +\usv_set:nnn {up}{Greek}{"391} +\usv_set:nnn {up}{greek}{"3B1} +\usv_set:nnn {it}{Latin}{"1D434} +\usv_set:nnn {it}{latin}{"1D44E} +\usv_set:nnn {it}{Greek}{"1D6E2} +\usv_set:nnn {it}{greek}{"1D6FC} +\usv_set:nnn {bb}{num}{"1D7D8} +\usv_set:nnn {bb}{Latin}{"1D538} +\usv_set:nnn {bb}{latin}{"1D552} +\usv_set:nnn {scr}{Latin}{"1D49C} +\usv_set:nnn {cal}{Latin}{"1D49C} +\usv_set:nnn {scr}{latin}{"1D4B6} +\usv_set:nnn {frak}{Latin}{"1D504} +\usv_set:nnn {frak}{latin}{"1D51E} +\usv_set:nnn {sf}{num}{"1D7E2} +\usv_set:nnn {sfup}{num}{"1D7E2} +\usv_set:nnn {sfit}{num}{"1D7E2} +\usv_set:nnn {sfup}{Latin}{"1D5A0} +\usv_set:nnn {sf}{Latin}{"1D5A0} +\usv_set:nnn {sfup}{latin}{"1D5BA} +\usv_set:nnn {sf}{latin}{"1D5BA} +\usv_set:nnn {sfit}{Latin}{"1D608} +\usv_set:nnn {sfit}{latin}{"1D622} +\usv_set:nnn {tt}{num}{"1D7F6} +\usv_set:nnn {tt}{Latin}{"1D670} +\usv_set:nnn {tt}{latin}{"1D68A} +\usv_set:nnn {bf}{num}{"1D7CE} +\usv_set:nnn {bfup}{num}{"1D7CE} +\usv_set:nnn {bfit}{num}{"1D7CE} +\usv_set:nnn {bfup}{Latin}{"1D400} +\usv_set:nnn {bfup}{latin}{"1D41A} +\usv_set:nnn {bfup}{Greek}{"1D6A8} +\usv_set:nnn {bfup}{greek}{"1D6C2} +\usv_set:nnn {bfit}{Latin}{"1D468} +\usv_set:nnn {bfit}{latin}{"1D482} +\usv_set:nnn {bfit}{Greek}{"1D71C} +\usv_set:nnn {bfit}{greek}{"1D736} +\usv_set:nnn {bffrak}{Latin}{"1D56C} +\usv_set:nnn {bffrak}{latin}{"1D586} +\usv_set:nnn {bfscr}{Latin}{"1D4D0} +\usv_set:nnn {bfcal}{Latin}{"1D4D0} +\usv_set:nnn {bfscr}{latin}{"1D4EA} +\usv_set:nnn {bfsf}{num}{"1D7EC} +\usv_set:nnn {bfsfup}{num}{"1D7EC} +\usv_set:nnn {bfsfit}{num}{"1D7EC} +\usv_set:nnn {bfsfup}{Latin}{"1D5D4} +\usv_set:nnn {bfsfup}{latin}{"1D5EE} +\usv_set:nnn {bfsfup}{Greek}{"1D756} +\usv_set:nnn {bfsfup}{greek}{"1D770} +\usv_set:nnn {bfsfit}{Latin}{"1D63C} +\usv_set:nnn {bfsfit}{latin}{"1D656} +\usv_set:nnn {bfsfit}{Greek}{"1D790} +\usv_set:nnn {bfsfit}{greek}{"1D7AA} +\usv_set:nnn {bfsf}{Latin}{ \bool_if:NTF \g_um_upLatin_bool \g_um_bfsfup_Latin_usv \g_um_bfsfit_Latin_usv } +\usv_set:nnn {bfsf}{latin}{ \bool_if:NTF \g_um_uplatin_bool \g_um_bfsfup_latin_usv \g_um_bfsfit_latin_usv } +\usv_set:nnn {bfsf}{Greek}{ \bool_if:NTF \g_um_upGreek_bool \g_um_bfsfup_Greek_usv \g_um_bfsfit_Greek_usv } +\usv_set:nnn {bfsf}{greek}{ \bool_if:NTF \g_um_upgreek_bool \g_um_bfsfup_greek_usv \g_um_bfsfit_greek_usv } +\usv_set:nnn {bf}{Latin}{ \bool_if:NTF \g_um_bfupLatin_bool \g_um_bfup_Latin_usv \g_um_bfit_Latin_usv } +\usv_set:nnn {bf}{latin}{ \bool_if:NTF \g_um_bfuplatin_bool \g_um_bfup_latin_usv \g_um_bfit_latin_usv } +\usv_set:nnn {bf}{Greek}{ \bool_if:NTF \g_um_bfupGreek_bool \g_um_bfup_Greek_usv \g_um_bfit_Greek_usv } +\usv_set:nnn {bf}{greek}{ \bool_if:NTF \g_um_bfupgreek_bool \g_um_bfup_greek_usv \g_um_bfit_greek_usv } +\usv_set:nnn {up}{varTheta}{"3F4} +\usv_set:nnn {up}{Digamma}{"3DC} +\usv_set:nnn {up}{varepsilon}{"3F5} +\usv_set:nnn {up}{vartheta}{"3D1} +\usv_set:nnn {up}{varkappa}{"3F0} +\usv_set:nnn {up}{varphi}{"3D5} +\usv_set:nnn {up}{varrho}{"3F1} +\usv_set:nnn {up}{varpi}{"3D6} +\usv_set:nnn {up}{digamma}{"3DD} +\usv_set:nnn {bfup}{varTheta}{"1D6B9} +\usv_set:nnn {bfup}{Digamma}{"1D7CA} +\usv_set:nnn {bfup}{varepsilon}{"1D6DC} +\usv_set:nnn {bfup}{vartheta}{"1D6DD} +\usv_set:nnn {bfup}{varkappa}{"1D6DE} +\usv_set:nnn {bfup}{varphi}{"1D6DF} +\usv_set:nnn {bfup}{varrho}{"1D6E0} +\usv_set:nnn {bfup}{varpi}{"1D6E1} +\usv_set:nnn {bfup}{digamma}{"1D7CB} +\usv_set:nnn {it}{varTheta}{"1D6F3} +\usv_set:nnn {it}{varepsilon}{"1D716} +\usv_set:nnn {it}{vartheta}{"1D717} +\usv_set:nnn {it}{varkappa}{"1D718} +\usv_set:nnn {it}{varphi}{"1D719} +\usv_set:nnn {it}{varrho}{"1D71A} +\usv_set:nnn {it}{varpi}{"1D71B} +\usv_set:nnn {bfit}{varTheta}{"1D72D} +\usv_set:nnn {bfit}{varepsilon}{"1D750} +\usv_set:nnn {bfit}{vartheta}{"1D751} +\usv_set:nnn {bfit}{varkappa}{"1D752} +\usv_set:nnn {bfit}{varphi}{"1D753} +\usv_set:nnn {bfit}{varrho}{"1D754} +\usv_set:nnn {bfit}{varpi}{"1D755} +\usv_set:nnn {bfsfup}{varTheta}{"1D767} +\usv_set:nnn {bfsfup}{varepsilon}{"1D78A} +\usv_set:nnn {bfsfup}{vartheta}{"1D78B} +\usv_set:nnn {bfsfup}{varkappa}{"1D78C} +\usv_set:nnn {bfsfup}{varphi}{"1D78D} +\usv_set:nnn {bfsfup}{varrho}{"1D78E} +\usv_set:nnn {bfsfup}{varpi}{"1D78F} +\usv_set:nnn {bfsfit}{varTheta} {"1D7A1} +\usv_set:nnn {bfsfit}{varepsilon}{"1D7C4} +\usv_set:nnn {bfsfit}{vartheta} {"1D7C5} +\usv_set:nnn {bfsfit}{varkappa} {"1D7C6} +\usv_set:nnn {bfsfit}{varphi} {"1D7C7} +\usv_set:nnn {bfsfit}{varrho} {"1D7C8} +\usv_set:nnn {bfsfit}{varpi} {"1D7C9} +\usv_set:nnn {up} {Nabla}{"02207} +\usv_set:nnn {it} {Nabla}{"1D6FB} +\usv_set:nnn {bfup} {Nabla}{"1D6C1} +\usv_set:nnn {bfit} {Nabla}{"1D735} +\usv_set:nnn {bfsfup}{Nabla}{"1D76F} +\usv_set:nnn {bfsfit}{Nabla}{"1D7A9} +\usv_set:nnn {up} {partial}{"02202} +\usv_set:nnn {it} {partial}{"1D715} +\usv_set:nnn {bfup} {partial}{"1D6DB} +\usv_set:nnn {bfit} {partial}{"1D74F} +\usv_set:nnn {bfsfup}{partial}{"1D789} +\usv_set:nnn {bfsfit}{partial}{"1D7C3} +\usv_set:nnn {up}{B}{`\B} +\usv_set:nnn {up}{C}{`\C} +\usv_set:nnn {up}{D}{`\D} +\usv_set:nnn {up}{E}{`\E} +\usv_set:nnn {up}{F}{`\F} +\usv_set:nnn {up}{H}{`\H} +\usv_set:nnn {up}{I}{`\I} +\usv_set:nnn {up}{L}{`\L} +\usv_set:nnn {up}{M}{`\M} +\usv_set:nnn {up}{N}{`\N} +\usv_set:nnn {up}{P}{`\P} +\usv_set:nnn {up}{Q}{`\Q} +\usv_set:nnn {up}{R}{`\R} +\usv_set:nnn {up}{Z}{`\Z} +\usv_set:nnn {it}{B}{"1D435} +\usv_set:nnn {it}{C}{"1D436} +\usv_set:nnn {it}{D}{"1D437} +\usv_set:nnn {it}{E}{"1D438} +\usv_set:nnn {it}{F}{"1D439} +\usv_set:nnn {it}{H}{"1D43B} +\usv_set:nnn {it}{I}{"1D43C} +\usv_set:nnn {it}{L}{"1D43F} +\usv_set:nnn {it}{M}{"1D440} +\usv_set:nnn {it}{N}{"1D441} +\usv_set:nnn {it}{P}{"1D443} +\usv_set:nnn {it}{Q}{"1D444} +\usv_set:nnn {it}{R}{"1D445} +\usv_set:nnn {it}{Z}{"1D44D} +\usv_set:nnn {up}{d}{`\d} +\usv_set:nnn {up}{e}{`\e} +\usv_set:nnn {up}{g}{`\g} +\usv_set:nnn {up}{h}{`\h} +\usv_set:nnn {up}{i}{`\i} +\usv_set:nnn {up}{j}{`\j} +\usv_set:nnn {up}{o}{`\o} +\usv_set:nnn {it}{d}{"1D451} +\usv_set:nnn {it}{e}{"1D452} +\usv_set:nnn {it}{g}{"1D454} +\usv_set:nnn {it}{h}{"0210E} +\usv_set:nnn {it}{i}{"1D456} +\usv_set:nnn {it}{j}{"1D457} +\usv_set:nnn {it}{o}{"1D45C} +\usv_set:nnn {bb} {h}{"1D559} +\usv_set:nnn {tt} {h}{"1D691} +\usv_set:nnn {scr} {h}{"1D4BD} +\usv_set:nnn {frak} {h}{"1D525} +\usv_set:nnn {bfup} {h}{"1D421} +\usv_set:nnn {bfit} {h}{"1D489} +\usv_set:nnn {sfup} {h}{"1D5C1} +\usv_set:nnn {sfit} {h}{"1D629} +\usv_set:nnn {bffrak}{h}{"1D58D} +\usv_set:nnn {bfscr} {h}{"1D4F1} +\usv_set:nnn {bfsfup}{h}{"1D5F5} +\usv_set:nnn {bfsfit}{h}{"1D65D} +\usv_set:nnn {up}{dotlessi}{"00131} +\usv_set:nnn {up}{dotlessj}{"00237} +\usv_set:nnn {it}{dotlessi}{"1D6A4} +\usv_set:nnn {it}{dotlessj}{"1D6A5} +\usv_set:nnn {bb}{C}{"2102} +\usv_set:nnn {bb}{H}{"210D} +\usv_set:nnn {bb}{N}{"2115} +\usv_set:nnn {bb}{P}{"2119} +\usv_set:nnn {bb}{Q}{"211A} +\usv_set:nnn {bb}{R}{"211D} +\usv_set:nnn {bb}{Z}{"2124} +\usv_set:nnn {up}{Pi} {"003A0} +\usv_set:nnn {up}{pi} {"003C0} +\usv_set:nnn {up}{Gamma} {"00393} +\usv_set:nnn {up}{gamma} {"003B3} +\usv_set:nnn {up}{summation}{"02211} +\usv_set:nnn {it}{Pi} {"1D6F1} +\usv_set:nnn {it}{pi} {"1D70B} +\usv_set:nnn {it}{Gamma} {"1D6E4} +\usv_set:nnn {it}{gamma} {"1D6FE} +\usv_set:nnn {bb}{Pi} {"0213F} +\usv_set:nnn {bb}{pi} {"0213C} +\usv_set:nnn {bb}{Gamma} {"0213E} +\usv_set:nnn {bb}{gamma} {"0213D} +\usv_set:nnn {bb}{summation}{"02140} +\usv_set:nnn {bbit}{D}{"2145} +\usv_set:nnn {bbit}{d}{"2146} +\usv_set:nnn {bbit}{e}{"2147} +\usv_set:nnn {bbit}{i}{"2148} +\usv_set:nnn {bbit}{j}{"2149} +\usv_set:nnn {scr}{B}{"212C} +\usv_set:nnn {scr}{E}{"2130} +\usv_set:nnn {scr}{F}{"2131} +\usv_set:nnn {scr}{H}{"210B} +\usv_set:nnn {scr}{I}{"2110} +\usv_set:nnn {scr}{L}{"2112} +\usv_set:nnn {scr}{M}{"2133} +\usv_set:nnn {scr}{R}{"211B} +\usv_set:nnn {scr}{e}{"212F} +\usv_set:nnn {scr}{g}{"210A} +\usv_set:nnn {scr}{o}{"2134} +\usv_set:nnn {cal}{B}{"212C} +\usv_set:nnn {cal}{E}{"2130} +\usv_set:nnn {cal}{F}{"2131} +\usv_set:nnn {cal}{H}{"210B} +\usv_set:nnn {cal}{I}{"2110} +\usv_set:nnn {cal}{L}{"2112} +\usv_set:nnn {cal}{M}{"2133} +\usv_set:nnn {cal}{R}{"211B} +\usv_set:nnn {frak}{C}{"212D} +\usv_set:nnn {frak}{H}{"210C} +\usv_set:nnn {frak}{I}{"2111} +\usv_set:nnn {frak}{R}{"211C} +\usv_set:nnn {frak}{Z}{"2128} +\tl_map_inline:nn { + \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes + \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@ + \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion + \version@list\version@elt\alpha@list\alpha@elt + \restore@mathversion\init@restore@version\dorestore@version\process@table + \new@mathversion\DeclareSymbolFont\group@list\group@elt + \new@symbolfont\SetSymbolFont\SetSymbolFont@\get@cdp + \DeclareMathAlphabet\new@mathalphabet\SetMathAlphabet\SetMathAlphabet@ + \DeclareMathAccent\set@mathaccent\DeclareMathSymbol\set@mathchar + \set@mathsymbol\DeclareMathDelimiter\@xxDeclareMathDelimiter + \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter + \set@@mathdelimiter\DeclareMathRadical\mathchar@type + \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ +}{ + \tl_remove_once:Nn \@preamblecmds {\do#1} +} +\cs_set:Nn \um_set_mathsymbol:nNNn { + \prg_case_tl:Nnn #3 { + \mathop { \um_set_big_operator:nnn {#1} {#2} {#4} } + \mathopen + { + \tl_if_in:NnTF \l_um_radicals_tl {#2} + { + \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} + { \um_radical:nn {#1} {#4} } + \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #4} + } + { + \um_set_delcode:nnn {#1} {#4} {#4} + \um_set_mathcode:nnn {#4} \mathopen {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathopen {#1} {#4} } + } + } + \mathclose + { + \um_set_delcode:nnn {#1} {#4} {#4} + \um_set_mathcode:nnn {#4} \mathclose {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathclose {#1} {#4} } + } + \mathaccent + { \cs_gset_protected_nopar:Npx #2 { \um_accent:Nnn #3 {#1} {#4} } } + \mathfence + { + \um_set_mathcode:nnn {#4} {#3} {#1} + \um_set_delcode:nnn {#1} {#4} {#4} + \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} + { \um_delimiter:Nnn \mathopen {#1} {#4} } + \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} + { \um_delimiter:Nnn \mathclose {#1} {#4} } + } + \mathover + { + \cs_set_protected_nopar:Npx #2 ##1 + { \mathop { \um_overbrace:nnn {#1} {#4} {##1} } \limits } + } + \mathunder + { + \cs_set_protected_nopar:Npx #2 ##1 + { \mathop { \um_underbrace:nnn {#1} {#4} {##1} } \limits } + } + }{ + \um_set_mathcode:nnn {#4} {#3} {#1} + } +} +\edef\mathfence{\string\mathfence} +\edef\mathover{\string\mathover} +\edef\mathunder{\string\mathunder} +\cs_new:Nn \um_set_big_operator:nnn { + \group_begin: + \char_set_catcode_active:n {#3} + \char_gmake_mathactive:n {#3} + \um_active_char_set:wc #3 \q_nil { \cs_to_str:N #2 _sym } + \group_end: + \um_set_mathchar:cNnn {\cs_to_str:N #2 op} \mathop {#1} {#3} + \cs_gset:cpx { \cs_to_str:N #2 _sym } { + \exp_not:c { \cs_to_str:N #2 op } + \exp_not:n { \tl_if_in:NnT \l_um_nolimits_tl {#2} \nolimits } + } +} +\cs_set:Npn \um_set_mathcode:nnnn #1#2#3#4 { + \Umathcode \int_eval:n {#1} = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: +} +\cs_set:Npn \um_set_mathcode:nnn #1#2#3 { + \Umathcode \int_eval:n {#1} = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#1} \scan_stop: +} +\cs_set:Npn \um_set_mathchar:NNnn #1#2#3#4 { + \Umathchardef #1 = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: +} +\cs_new:Nn \um_set_delcode:nnn { + \Udelcode#2 = \csname sym#1\endcsname #3 +} +\cs_new:Nn \um_radical:nn { + \Uradical \csname sym#1\endcsname #2 \scan_stop: +} +\cs_new:Nn \um_delimiter:Nnn { + \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: +} +\cs_new:Nn \um_accent:Nnn + { + \Umathaccent \c_um_accent_keyword_tl + \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: + } + \cs_new_nopar:Npn \um_wide_top_accent:Nnn #1 #2 #3 { + \Umathaccent \mathchar@type #1 \use:c { sym #2 } #3 \scan_stop: + } + \bool_if:NTF \c_um_have_fixed_accents_bool { + \cs_new_nopar:Npn \um_wide_bottom_accent:Nnn #1 #2 #3 { + \Umathaccent bottom~ \mathchar@type #1 \use:c { sym #2 } #3 \scan_stop: + } + \tl_const:Nn \c_um_accent_keyword_tl { fixed } + } { + \tl_const:Nn \c_um_accent_keyword_tl { } + } +\cs_generate_variant:Nn \um_set_mathchar:NNnn {c} +\cs_set:Npn \um_overbrace:nnn #1#2#3 { + \luatexUdelimiterover \csname sym#1\endcsname #2 {#3} +} +\cs_set:Npn \um_underbrace:nnn #1#2#3 { + \luatexUdelimiterunder \csname sym#1\endcsname #2 {#3} +} +\cs_new:Nn \char_gmake_mathactive:N { + \global\mathcode `#1 = "8000 \scan_stop: +} +\cs_new:Nn \char_gmake_mathactive:n { + \global\mathcode #1 = "8000 \scan_stop: +} +\cs_new_eq:NN \um_saved_ltxe_glb_settings: \glb@settings +\CheckCommand * \glb@settings { + \expandafter\ifx\csname S@\f@size\endcsname\relax + \calculate@math@sizes + \fi + \csname S@\f@size\endcsname + \ifmath@fonts + \begingroup + \escapechar\m@ne + \csname mv@\math@version \endcsname + \globaldefs\@ne + \math@fonts + \let \glb@currsize \f@size + \endgroup + \the\every@math@size + \fi +} +\cs_set_protected_nopar:Npn \glb@settings { + \msg_error:nn { unicode-math } { no-font-selected } +} +\cs_new:Nn \um_init: { + \bool_set_true:N \l_um_ot_math_bool + \let\glb@currsize\relax + \cs_set_eq:NN \glb@settings \um_saved_ltxe_glb_settings: + \bool_set_true:N \l_um_init_bool + \seq_clear:N \l_um_char_range_seq + \clist_clear:N \l_um_char_num_range_clist + \seq_clear:N \l_um_mathalph_seq + \seq_clear:N \l_um_missing_alph_seq + \tl_set:Nn \l_um_mversion_tl {normal} + \tl_set:Nn \um_symfont_tl {operators} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_noparse:nNN + \tl_set:Nn \l_um_script_features_tl {Style=MathScript} + \tl_set:Nn \l_um_sscript_features_tl {Style=MathScriptScript} + \tl_set_eq:NN \l_um_script_font_tl \l_um_fontname_tl + \tl_set_eq:NN \l_um_sscript_font_tl \l_um_fontname_tl +} +\DeclareDocumentCommand \setmathfont { O{} m } { + \tl_set:Nn \l_um_fontname_tl {#2} + \um_init: + \cs_if_exist:cF { S@ \f@size } { \calculate@math@sizes } + \csname S@\f@size\endcsname + \keys_set_known:nnN {unicode-math} {#1} \l_um_unknown_keys_clist + \bool_if:NT \l_um_init_bool { \um_log:n {default-math-font} } + \um_fontspec_select_font: + \cs_if_exist:cF { sym \um_symfont_tl } + { + \DeclareSymbolFont{\um_symfont_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } + \SetSymbolFont{\um_symfont_tl}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + \bool_if:nT {\l_um_ot_math_bool && !\g_um_mainfont_already_set_bool} { + \bool_set_true:N \g_um_mainfont_already_set_bool + \um_declare_math_sizes: + \um_setup_legacy_fam_two: + \um_setup_legacy_fam_three: + } + \um_input_math_symbol_table: + \um_remap_symbols: + \um_setup_mathactives: + \um_setup_accents: + \um_setup_delcodes: + \um_setup_alphabets: + \ignorespaces +} +\cs_new:Nn \um_declare_math_sizes: + { + \dim_compare:nF { \fontdimen 10 \l_um_font == 0pt } + { + \DeclareMathSizes { \f@size } { \f@size } + { \um_fontdimen_to_scale:nn {10} {\l_um_font} } + { \um_fontdimen_to_scale:nn {11} {\l_um_font} } + } + } +\cs_new:Nn \um_setup_legacy_fam_two: + { + \fontspec_set_family:Nxn \l_um_family_tl + { + \l_um_font_keyval_tl, + Scale=1.00001, + FontAdjustment={ + \fontdimen8\font= \um_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax + \fontdimen9\font= \um_get_fontparam:nn {42} {FractionNumeratorShiftUp}\relax + \fontdimen10\font=\um_get_fontparam:nn {32} {StackTopShiftUp}\relax + \fontdimen11\font=\um_get_fontparam:nn {45} {FractionDenominatorDisplayStyleShiftDown}\relax + \fontdimen12\font=\um_get_fontparam:nn {44} {FractionDenominatorShiftDown}\relax + \fontdimen13\font=\um_get_fontparam:nn {21} {SuperscriptShiftUp}\relax + \fontdimen14\font=\um_get_fontparam:nn {21} {SuperscriptShiftUp}\relax + \fontdimen15\font=\um_get_fontparam:nn {22} {SuperscriptShiftUpCramped}\relax + \fontdimen16\font=\um_get_fontparam:nn {18} {SubscriptShiftDown}\relax + \fontdimen17\font=\um_get_fontparam:nn {18} {SubscriptShiftDownWithSuperscript}\relax + \fontdimen18\font=\um_get_fontparam:nn {24} {SuperscriptBaselineDropMax}\relax + \fontdimen19\font=\um_get_fontparam:nn {20} {SubscriptBaselineDropMin}\relax + \fontdimen20\font=0pt\relax % delim1 = FractionDelimiterDisplaySize + \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize + \fontdimen22\font=\um_get_fontparam:nn {15} {AxisHeight}\relax + } + } {\l_um_fontname_tl} + \SetSymbolFont{symbols}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } +\cs_new:Nn \um_setup_legacy_fam_three: + { + \fontspec_set_family:Nxn \l_um_family_tl + { + \l_um_font_keyval_tl, + Scale=0.99999, + FontAdjustment={ + \fontdimen8\font= \um_get_fontparam:nn {48} {FractionRuleThickness}\relax + \fontdimen9\font= \um_get_fontparam:nn {28} {UpperLimitGapMin}\relax + \fontdimen10\font=\um_get_fontparam:nn {30} {LowerLimitGapMin}\relax + \fontdimen11\font=\um_get_fontparam:nn {29} {UpperLimitBaselineRiseMin}\relax + \fontdimen12\font=\um_get_fontparam:nn {31} {LowerLimitBaselineDropMin}\relax + \fontdimen13\font=0pt\relax + } + } {\l_um_fontname_tl} + \SetSymbolFont{largesymbols}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } +\cs_new:Nn \um_get_fontparam:nn + { \directlua{fontspec.mathfontdimen("l_um_font","#2")} } +\DeclareDocumentCommand \resetmathfont { O{} m } { + \bool_set_false:N \g_um_mainfont_already_set_bool + \setmathfont[#1]{#2} +} +\cs_new:Nn \um_fontspec_select_font: { + \tl_set:Nx \l_um_font_keyval_tl { + Renderer = Basic, + BoldFont = {}, ItalicFont = {}, + Script = Math, + SizeFeatures = { + {Size = \tf@size-} , + {Size = \sf@size-\tf@size , + Font = \l_um_script_font_tl , + \l_um_script_features_tl + } , + {Size = -\sf@size , + Font = \l_um_sscript_font_tl , + \l_um_sscript_features_tl + } + }, + \l_um_unknown_keys_clist + } + \fontspec_set_fontface:NNxn \l_um_font \l_um_family_tl + {\l_um_font_keyval_tl} {\l_um_fontname_tl} + \group_begin: + \fontfamily{\l_um_family_tl}\selectfont + \fontspec_if_script:nF {math} {\bool_gset_false:N \l_um_ot_math_bool} + \group_end: +} +\cs_set:Npn \um_process_symbol_noparse:nnn #1#2#3 { + \um_set_mathsymbol:nNNn {\um_symfont_tl} #2#3{#1} +} +\cs_set:Npn \um_process_symbol_parse:nnn #1#2#3 { + \um_if_char_spec:nNNT{#1}{#2}{#3}{ + \um_process_symbol_noparse:nnn {#1}{#2}{#3} + } +} +\cs_new:Npn \um_remap_symbols: { + \um_remap_symbol:nnn{`\-}{\mathbin}{"02212}% hyphen to minus + \um_remap_symbol:nnn{`\*}{\mathbin}{"02217}% text asterisk to "centred asterisk" + \bool_if:NF \g_um_literal_colon_bool { + \um_remap_symbol:nnn{`\:}{\mathrel}{"02236}% colon to ratio (i.e., punct to rel) + } +} +\cs_new:Nn \um_remap_symbol_parse:nnn { + \um_if_char_spec:nNNT {#3} {\@nil} {#2} { + \um_remap_symbol_noparse:nnn {#1} {#2} {#3} + } +} +\cs_new:Nn \um_remap_symbol_noparse:nnn { + \clist_map_inline:nn {#1} { + \um_set_mathcode:nnnn {##1} {#2} {\um_symfont_tl} {#3} + } +} +\cs_new:Npn \um_setup_mathactives: { + \um_make_mathactive:nNN {"2032} \um_prime_single_mchar \mathord + \um_make_mathactive:nNN {"2033} \um_prime_double_mchar \mathord + \um_make_mathactive:nNN {"2034} \um_prime_triple_mchar \mathord + \um_make_mathactive:nNN {"2057} \um_prime_quad_mchar \mathord + \um_make_mathactive:nNN {"2035} \um_backprime_single_mchar \mathord + \um_make_mathactive:nNN {"2036} \um_backprime_double_mchar \mathord + \um_make_mathactive:nNN {"2037} \um_backprime_triple_mchar \mathord + \um_make_mathactive:nNN {`\'} \mathstraightquote \mathord + \um_make_mathactive:nNN {`\`} \mathbacktick \mathord +} +\cs_new:Nn \um_make_mathactive_parse:nNN + { + \um_if_char_spec:nNNT {#1} #2 #3 + { \um_make_mathactive_noparse:nNN {#1} #2 #3 } + } +\cs_new:Nn \um_make_mathactive_noparse:nNN + { + \um_set_mathchar:NNnn #2 #3 {\um_symfont_tl} {#1} + \char_gmake_mathactive:n {#1} + } +\cs_new:Nn \um_assign_delcode_noparse:nn { + \um_set_delcode:nnn \um_symfont_tl {#1} {#2} +} +\cs_new:Nn \um_assign_delcode_parse:nn { + \um_if_char_spec:nNNT {#2}{\@nil}{\@nil} { + \um_assign_delcode_noparse:nn {#1} {#2} + } +} +\cs_new:Nn \um_assign_delcode:n { \um_assign_delcode:nn {#1} {#1} } +\cs_new:Npn \um_setup_delcodes: { + \um_assign_delcode:nn {`\/} {\g_um_slash_delimiter_usv} + \um_assign_delcode:nn {"2044} {\g_um_slash_delimiter_usv} % fracslash + \um_assign_delcode:nn {"2215} {\g_um_slash_delimiter_usv} % divslash + \um_assign_delcode:n {"005C} % backslash + \um_assign_delcode:nn {`\<} {"27E8} % angle brackets with ascii notation + \um_assign_delcode:nn {`\>} {"27E9} % angle brackets with ascii notation + \um_assign_delcode:n {"2191} % up arrow + \um_assign_delcode:n {"2193} % down arrow + \um_assign_delcode:n {"2195} % updown arrow + \um_assign_delcode:n {"219F} % up arrow twohead + \um_assign_delcode:n {"21A1} % down arrow twohead + \um_assign_delcode:n {"21A5} % up arrow from bar + \um_assign_delcode:n {"21A7} % down arrow from bar + \um_assign_delcode:n {"21A8} % updown arrow from bar + \um_assign_delcode:n {"21BE} % up harpoon right + \um_assign_delcode:n {"21BF} % up harpoon left + \um_assign_delcode:n {"21C2} % down harpoon right + \um_assign_delcode:n {"21C3} % down harpoon left + \um_assign_delcode:n {"21C5} % arrows up down + \um_assign_delcode:n {"21F5} % arrows down up + \um_assign_delcode:n {"21C8} % arrows up up + \um_assign_delcode:n {"21CA} % arrows down down + \um_assign_delcode:n {"21D1} % double up arrow + \um_assign_delcode:n {"21D3} % double down arrow + \um_assign_delcode:n {"21D5} % double updown arrow + \um_assign_delcode:n {"21DE} % up arrow double stroke + \um_assign_delcode:n {"21DF} % down arrow double stroke + \um_assign_delcode:n {"21E1} % up arrow dashed + \um_assign_delcode:n {"21E3} % down arrow dashed + \um_assign_delcode:n {"21E7} % up white arrow + \um_assign_delcode:n {"21E9} % down white arrow + \um_assign_delcode:n {"21EA} % up white arrow from bar + \um_assign_delcode:n {"21F3} % updown white arrow +} +\tl_new:N \l_um_nolimits_tl +\tl_set:Nn \l_um_nolimits_tl { + \int\iint\iiint\iiiint\oint\oiint\oiiint + \intclockwise\varointclockwise\ointctrclockwise\sumint + \intbar\intBar\fint\cirfnint\awint\rppolint + \scpolint\npolint\pointint\sqint\intlarhk\intx + \intcap\intcup\upint\lowint +} +\DeclareDocumentCommand \addnolimits {m} { + \tl_put_right:Nn \l_um_nolimits_tl {#1} +} +\DeclareDocumentCommand \removenolimits {m} { + \tl_remove_all:Nn \l_um_nolimits_tl {#1} +} +\tl_new:N \l_um_radicals_tl +\tl_set:Nn \l_um_radicals_tl {\sqrt} +\cs_new_protected_nopar:Nn \um_new_cramped_style:N + { \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } } +\um_new_cramped_style:N \crampeddisplaystyle +\um_new_cramped_style:N \crampedtextstyle +\um_new_cramped_style:N \crampedscriptstyle +\um_new_cramped_style:N \crampedscriptscriptstyle +\cs_new_protected_nopar:Nn \um_font_param:nnnnn +{ + \tl_set:Nn \l_um_tmpa_tl { #1 } + \tl_remove_all:Nn \l_um_tmpa_tl { _ } + \um_font_param_aux:ccc { um_ #1 :N } { um_set_ #1 :N } + { luatexUmath \l_um_tmpa_tl } +} +\cs_new_protected_nopar:Npn \um_font_param:nnn #1 #2 #3 { + \um_font_param:nnnnn { #1 } { #2 } { #2 } { #3 } { #3 } +} +\cs_new_protected_nopar:Npn \um_font_param:nn #1 #2 { + \um_font_param:nnnnn { #1 } { #2 } { #2 } { #2 } { #2 } +} +\cs_new_protected_nopar:Nn \um_font_param:n + { \um_font_param:nnnnn { #1 } { 0 } { 0 } { 0 } { 0 } } +\cs_new_protected_nopar:Nn \um_font_param_aux:NNN + { + \cs_new_nopar:Npn #1 ##1 { + #3 ##1 + } + \cs_new_protected_nopar:Npn #2 ##1 ##2 { + #3 ##1 \dim_eval:n { ##2 } + } + } +\cs_generate_variant:Nn \um_font_param_aux:NNN { ccc } +\um_font_param:nn { axis } { 15 } +\um_font_param:nn { operator_size } { 13 } +\um_font_param:n { fraction_del_size } +\um_font_param:nnn { fraction_denom_down } { 45 } { 44 } +\um_font_param:nnn { fraction_denom_vgap } { 50 } { 49 } +\um_font_param:nnn { fraction_num_up } { 43 } { 42 } +\um_font_param:nnn { fraction_num_vgap } { 47 } { 46 } +\um_font_param:nn { fraction_rule } { 48 } +\um_font_param:nn { limit_above_bgap } { 29 } +\um_font_param:n { limit_above_kern } +\um_font_param:nn { limit_above_vgap } { 28 } +\um_font_param:nn { limit_below_bgap } { 31 } +\um_font_param:n { limit_below_kern } +\um_font_param:nn { limit_below_vgap } { 30 } +\um_font_param:nn { over_delimiter_vgap } { 41 } +\um_font_param:nn { over_delimiter_bgap } { 38 } +\um_font_param:nn { under_delimiter_vgap } { 40 } +\um_font_param:nn { under_delimiter_bgap } { 39 } +\um_font_param:nn { overbar_kern } { 55 } +\um_font_param:nn { overbar_rule } { 54 } +\um_font_param:nn { overbar_vgap } { 53 } +\um_font_param:n { quad } +\um_font_param:nn { radical_kern } { 62 } +\um_font_param:nn { radical_rule } { 61 } +\um_font_param:nnn { radical_vgap } { 60 } { 59 } +\um_font_param:nn { radical_degree_before } { 63 } +\um_font_param:nn { radical_degree_after } { 64 } +\um_font_param:nn { radical_degree_raise } { 65 } +\um_font_param:nn { space_after_script } { 27 } +\um_font_param:nnn { stack_denom_down } { 35 } { 34 } +\um_font_param:nnn { stack_num_up } { 33 } { 32 } +\um_font_param:nnn { stack_vgap } { 37 } { 36 } +\um_font_param:nn { sub_shift_down } { 18 } +\um_font_param:nn { sub_shift_drop } { 20 } +\um_font_param:n { subsup_shift_down } +\um_font_param:nn { sub_top_max } { 19 } +\um_font_param:nn { subsup_vgap } { 25 } +\um_font_param:nn { sup_bottom_min } { 23 } +\um_font_param:nn { sup_shift_drop } { 24 } +\um_font_param:nnnnn { sup_shift_up } { 21 } { 22 } { 21 } { 22 } +\um_font_param:nn { supsub_bottom_max } { 26 } +\um_font_param:nn { underbar_kern } { 58 } +\um_font_param:nn { underbar_rule } { 57 } +\um_font_param:nn { underbar_vgap } { 56 } +\um_font_param:n { connector_overlap_min } +\def\new@mathversion#1{% + \expandafter\in@\expandafter#1\expandafter{\version@list}% + \ifin@ + \@font@info{Redeclaring math version + `\expandafter\@gobblefour\string#1'}% + \else + \expandafter\newcount\csname c@\expandafter + \@gobble\string#1\endcsname + \def\version@elt{\noexpand\version@elt\noexpand}% + \edef\version@list{\version@list\version@elt#1}% + \fi + \toks@{}% + \count@\z@ + \def\group@elt##1##2{% + \advance\count@\@ne + \addto@hook\toks@{\getanddefine@fonts##1##2}% + }% + \group@list + \global\csname c@\expandafter\@gobble\string#1\endcsname\count@ + \def\alpha@elt##1##2##3{% + \ifx##2\no@alphabet@error + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\no@alphabet@error##1}}% + \else + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\select@group##1##2##3}}% + \fi + }% + \alpha@list + \xdef#1{\the\toks@}% +} +\keys_define:nn {unicode-math} + { + version .code:n = + { + \tl_set:Nn \l_um_mversion_tl {#1} + \DeclareMathVersion{\l_um_mversion_tl} + } + } +\keys_define:nn {unicode-math} +{ + script-features .tl_set:N = \l_um_script_features_tl , + sscript-features .tl_set:N = \l_um_sscript_features_tl , + script-font .tl_set:N = \l_um_script_font_tl , + sscript-font .tl_set:N = \l_um_sscript_font_tl , +} +\seq_new:N \l_um_mathalph_seq +\seq_new:N \l_um_char_range_seq +\seq_new:N \l_um_mclass_range_seq +\seq_new:N \l_um_cmd_range_seq +\keys_define:nn {unicode-math} { + range .code:n = { + \bool_set_false:N \l_um_init_bool + \int_incr:N \g_um_fam_int + \tl_set:Nx \um_symfont_tl {um_fam\int_use:N\g_um_fam_int} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_parse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_parse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_parse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \use_none:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_parse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_parse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_parse:nNN + \seq_clear:N \l_um_char_range_seq + \seq_clear:N \l_um_mclass_range_seq + \seq_clear:N \l_um_cmd_range_seq + \seq_clear:N \l_um_mathalph_seq + \clist_map_inline:nn {#1} { + \um_if_mathalph_decl:nTF {##1} { + \seq_put_right:Nx \l_um_mathalph_seq { + { \exp_not:V \l_um_tmpa_tl } + { \exp_not:V \l_um_tmpb_tl } + { \exp_not:V \l_um_tmpc_tl } + } + }{ + \seq_if_in:NnTF \g_um_mathclasses_seq {##1} + { \seq_put_right:Nn \l_um_mclass_range_seq {##1} } + { + \bool_if:nTF { \tl_if_single_p:n {##1} && \token_if_cs_p:N ##1 } + { \seq_put_right:Nn \l_um_cmd_range_seq {##1} } + { \seq_put_right:Nn \l_um_char_range_seq {##1} } + } + } + } + } +} +\seq_new:N \g_um_mathclasses_seq +\seq_set_from_clist:Nn \g_um_mathclasses_seq + { + \mathord,\mathalpha,\mathop,\mathbin,\mathrel, + \mathopen,\mathclose,\mathpunct,\mathaccent, + \mathfence,\mathover,\mathunder + } +\prg_new_conditional:Nnn \um_if_mathalph_decl:n {TF} { + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {#1} } + \tl_clear:N \l_um_tmpb_tl + \tl_clear:N \l_um_tmpc_tl + \tl_if_in:NnT \l_um_tmpa_tl {->} { + \exp_after:wN \um_split_arrow:w \l_um_tmpa_tl \q_nil + } + \tl_if_in:NnT \l_um_tmpa_tl {/} { + \exp_after:wN \um_split_slash:w \l_um_tmpa_tl \q_nil + } + \tl_if_empty:NT \l_um_tmpc_tl { \tl_set_eq:NN \l_um_tmpc_tl \l_um_tmpa_tl } + \seq_if_in:NVTF \g_um_mathstyles_seq \l_um_tmpa_tl { + \prg_return_true: + }{ + \prg_return_false: + } +} +\cs_set:Npn \um_split_arrow:w #1->#2 \q_nil { + \tl_set:Nn \l_um_tmpa_tl {#1} + \tl_if_single:nTF {#2} + { \tl_set:Nn \l_um_tmpc_tl {#2} } + { \exp_args:NNc \tl_set:Nn \l_um_tmpc_tl {math#2} } +} +\cs_set:Npn \um_split_slash:w #1/#2 \q_nil { + \tl_set:Nn \l_um_tmpa_tl {#1} + \tl_set:Nn \l_um_tmpb_tl {#2} +} +\cs_new:Nn \um_if_char_spec:nNNT + { + + % math class: + \seq_if_in:NnT \l_um_mclass_range_seq {#3} + { \use_none_delimit_by_q_nil:w } + + % command name: + \seq_if_in:NnT \l_um_cmd_range_seq {#2} + { \use_none_delimit_by_q_nil:w } + + % character slot: + \seq_map_inline:Nn \l_um_char_range_seq + { + \um_int_if_range_matches_slot:nnT {##1} {#1} + { \seq_map_break:n { \use_none_delimit_by_q_nil:w } } + } + + % this executes if no match was found: + \use_none:nnn + \q_nil + \use:n + { + \clist_put_right:Nx \l_um_char_num_range_clist { \int_eval:n {#1} } + #4 + } + } +\cs_new:Nn \um_int_if_range_matches_slot:nnT + { \um_numrange_parse:nwT {#1} #2 - \q_nil - \q_stop {#3} } +\cs_set:Npn \um_numrange_parse:nwT #1 #2 - #3 - #4 \q_stop #5 + { + \tl_if_empty:nTF {#4} { \int_compare:nT {#1=#2} {#5} } + { + \tl_if_empty:nTF {#3} { \int_compare:nT {#1>=#2} {#5} } + { + \tl_if_empty:nTF {#2} { \int_compare:nT {#1<=#3} {#5} } + { + \int_compare:nT {#1>=#2} { \int_compare:nT {#1<=#3} {#5} } + } } } + } +\AtBeginDocument{\um_resolve_greek:} +\cs_new:Npn \um_resolve_greek: { + \clist_map_inline:nn { + Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda, + alpha,beta,gamma,delta, zeta,eta,theta,iota,kappa,lambda, + Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega, + mu,nu,xi,omicron,pi,rho,sigma,tau,upsilon, chi,psi,omega, + varTheta, + varsigma,vartheta,varkappa,varrho,varpi + }{ + \tl_set:cx {##1} { \exp_not:c { mit ##1 } } + } + \tl_set:Nn \epsilon { + \bool_if:NTF \g_um_texgreek_bool \mitvarepsilon \mitepsilon + } + \tl_set:Nn \phi { + \bool_if:NTF \g_um_texgreek_bool \mitvarphi \mitphi + } + \tl_set:Nn \varepsilon { + \bool_if:NTF \g_um_texgreek_bool \mitepsilon \mitvarepsilon + } + \tl_set:Nn \varphi { + \bool_if:NTF \g_um_texgreek_bool \mitphi \mitvarphi + } +} +\cs_new:Nn \um_new_mathstyle:N { + \um_prepare_mathstyle:f {\exp_after:wN \use_none:nnnnn \token_to_str:N #1} + \seq_put_right:Nn \g_um_mathstyles_seq {#1} +} +\seq_new:N \g_um_default_mathalph_seq +\seq_new:N \g_um_mathstyles_seq +\AtEndOfPackage{ +\clist_map_inline:nn { + {\mathup } {latin,Latin,greek,Greek,num,misc} {\mathup } , + {\mathit } {latin,Latin,greek,Greek,misc} {\mathit } , + {\mathbb } {latin,Latin,num,misc} {\mathbb } , + {\mathbbit } {misc} {\mathbbit } , + {\mathscr } {latin,Latin} {\mathscr } , + {\mathcal } {Latin} {\mathscr } , + {\mathbfcal } {Latin} {\mathbfscr } , + {\mathfrak } {latin,Latin} {\mathfrak } , + {\mathtt } {latin,Latin,num} {\mathtt } , + {\mathsfup } {latin,Latin,num} {\mathsfup } , + {\mathsfit } {latin,Latin} {\mathsfit } , + {\mathbfup } {latin,Latin,greek,Greek,num,misc} {\mathbfup } , + {\mathbfit } {latin,Latin,greek,Greek,misc} {\mathbfit } , + {\mathbfscr } {latin,Latin} {\mathbfscr } , + {\mathbffrak} {latin,Latin} {\mathbffrak} , + {\mathbfsfup} {latin,Latin,greek,Greek,num,misc} {\mathbfsfup} , + {\mathbfsfit} {latin,Latin,greek,Greek,misc} {\mathbfsfit} +}{ + \seq_put_right:Nn \g_um_default_mathalph_seq {#1} + \exp_after:wN \um_new_mathstyle:N \use_i:nnn #1 +} +\um_new_mathstyle:N \mathsf +\um_new_mathstyle:N \mathbf +\um_new_mathstyle:N \mathbfsf +} +\cs_new:Nn \um_prepare_mathstyle:n { + \um_init_alphabet:x {#1} + \cs_set:cpn {_um_math#1_aux:n} ##1 { + \use:c {um_switchto_math#1:} ##1 \egroup + } + \cs_set_protected:cpx {math#1} { + \exp_not:n{ + \bgroup + \mode_if_math:F + { + \egroup\expandafter + \non@alpherr\expandafter{\csname math#1\endcsname\space} + } + \tl_set:Nn \l_um_mathstyle_tl {#1} + } + \exp_not:c {_um_math#1_aux:n} + } +} +\tl_new:N \l_um_mathstyle_tl +\cs_generate_variant:Nn \um_prepare_mathstyle:n {f} +\cs_set:Npn \um_init_alphabet:n #1 { + \um_log:nx {alph-initialise} {#1} + \cs_set_eq:cN {um_switchto_math#1:} \prg_do_nothing: +} +\cs_generate_variant:Nn \um_init_alphabet:n {x} +\cs_new:Npn \um_maybe_init_alphabet:V { + \exp_args:NV \um_maybe_init_alphabet:n +} +\seq_new:N \l_um_missing_alph_seq +\cs_new:Npn \um_setup_alphabets: { + \seq_if_empty:NTF \l_um_mathalph_seq { + \um_log:n {setup-implicit} + \seq_set_eq:NN \l_um_mathalph_seq \g_um_default_mathalph_seq + \bool_set_true:N \l_um_implicit_alph_bool + \um_maybe_init_alphabet:n {sf} + \um_maybe_init_alphabet:n {bf} + \um_maybe_init_alphabet:n {bfsf} + } + { + \um_log:n {setup-explicit} + \bool_set_false:N \l_um_implicit_alph_bool + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn + } + \seq_map_inline:Nn \l_um_mathalph_seq { + \tl_set:No \l_um_tmpa_tl { \use_i:nnn ##1 } + \tl_set:No \l_um_tmpb_tl { \use_ii:nnn ##1 } + \tl_set:No \l_um_remap_style_tl { \use_iii:nnn ##1 } + \tl_set:Nx \l_um_remap_style_tl { + \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nnnnn + \exp_after:wN \token_to_str:N \l_um_remap_style_tl + } + \tl_if_empty:NT \l_um_tmpb_tl { + \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n + \tl_set:Nn \l_um_tmpb_tl { latin,Latin,greek,Greek,num,misc } + } + \um_setup_math_alphabet:VVV + \l_um_tmpa_tl \l_um_tmpb_tl \l_um_remap_style_tl + } + \seq_if_empty:NF \l_um_missing_alph_seq { \um_log:n { missing-alphabets } } +} +\cs_new:Nn \um_setup_math_alphabet:Nnn { + \tl_set:Nx \l_um_style_tl { + \exp_after:wN \use_none:nnnnn \token_to_str:N #1 + } + \clist_map_inline:nn {#2} { + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } + \cs_if_exist:cT {um_config_ \l_um_style_tl _\l_um_tmpa_tl :n} { + \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { + \um_maybe_init_alphabet:V \l_um_style_tl + \clist_map_break: + }{ + \um_glyph_if_exist:cT { \um_to_usv:nn {#3}{\l_um_tmpa_tl} }{ + \um_maybe_init_alphabet:V \l_um_style_tl + \clist_map_break: + } + } + } + } + \clist_map_inline:nn {#2} { + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } + \cs_if_exist:cT {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} { + \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { + \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} + \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} + }{ + \um_glyph_if_exist:cTF { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } { + \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} + \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} + }{ + \bool_if:NTF \l_um_implicit_alph_bool { + \seq_put_right:Nx \l_um_missing_alph_seq { + \@backslashchar math \l_um_style_tl \space + (\tl_use:c{c_um_math_alphabet_name_ \l_um_tmpa_tl _tl}) + } + }{ + \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {up} + } + } + } + } + } +} +\cs_generate_variant:Nn \um_setup_math_alphabet:Nnn {VVV} +\cs_new:Npn \um_map_char_single:cc { \exp_args:Ncc \um_map_char_single:nn } +\cs_new:Nn \um_map_char_noparse:nn { + \um_set_mathcode:nnnn {#1}{\mathalpha}{\um_symfont_tl}{#2} +} +\cs_new:Nn \um_map_char_parse:nn { + \um_if_char_spec:nNNT {#1} {\@nil} {\mathalpha} { + \um_map_char_noparse:nn {#1}{#2} + } +} +\cs_new:Nn \um_map_char_single:nnn { + \um_map_char_single:cc { \um_to_usv:nn {#1}{#3} } + { \um_to_usv:nn {#2}{#3} } +} +\cs_set:Npn \um_map_single:nnn #1#2#3 { + \cs_if_exist:cT { \um_to_usv:nn {#3} {#1} } + { + \clist_map_inline:nn {#2} { + \um_map_char_single:nnn {##1} {#3} {#1} + } + } +} +\cs_set:Npn \um_map_chars_range:nnn #1#2#3 { + \prg_stepwise_inline:nnnn {0}{1}{#1-1} { + \um_map_char_single:nn {#2+##1}{#3+##1} + } +} +\cs_generate_variant:Nn \um_map_chars_range:nnn {ncc} +\cs_new:Nn \um_map_chars_range:nnnn { + \um_map_chars_range:ncc {#1} { \um_to_usv:nn {#2}{#4} } + { \um_to_usv:nn {#3}{#4} } +} +\cs_new:Nn \um_map_chars_Latin:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {26} {##1} {#2} {Latin} + } +} +\cs_new:Nn \um_map_chars_latin:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {26} {##1} {#2} {latin} + } +} +\cs_new:Nn \um_map_chars_greek:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {25} {##1} {#2} {greek} + \um_map_char_single:nnn {##1} {#2} {varepsilon} + \um_map_char_single:nnn {##1} {#2} {vartheta} + \um_map_char_single:nnn {##1} {#2} {varkappa} + \um_map_char_single:nnn {##1} {#2} {varphi} + \um_map_char_single:nnn {##1} {#2} {varrho} + \um_map_char_single:nnn {##1} {#2} {varpi} + } +} +\cs_new:Nn \um_map_chars_Greek:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {25} {##1} {#2} {Greek} + \um_map_char_single:nnn {##1} {#2} {varTheta} + } +} +\cs_new:Nn \um_map_chars_numbers:nn { + \um_map_chars_range:nnnn {10} {#1} {#2} {num} +} +\cs_new:Npn \um_set_mathalphabet_char:Ncc { + \exp_args:NNcc \um_set_mathalphabet_char:Nnn +} +\cs_new:Nn \um_mathmap_noparse:Nnn { + \clist_map_inline:nn {#2} { + \tl_put_right:cx {um_switchto_\cs_to_str:N #1:} { + \um_set_mathcode:nnnn{##1}{\mathalpha}{\um_symfont_tl}{#3} + } + } +} +\cs_new:Nn \um_mathmap_parse:Nnn { + \clist_if_in:NnT \l_um_char_num_range_clist {#3} { + \um_mathmap_noparse:Nnn {#1}{#2}{#3} + } +} +\cs_new:Npn \um_set_mathalphabet_char:Nnnn #1#2#3#4 { + \um_set_mathalphabet_char:Ncc #1 { \um_to_usv:nn {#2} {#4} } + { \um_to_usv:nn {#3} {#4} } +} +\cs_new:Npn \um_set_mathalph_range:nNnn #1#2#3#4 { + \prg_stepwise_inline:nnnn {0}{1}{#1-1} + { \um_set_mathalphabet_char:Nnn {#2} { ##1 + #3 } { ##1 + #4 } } +} +\cs_generate_variant:Nn \um_set_mathalph_range:nNnn {nNcc} +\cs_new:Npn \um_set_mathalph_range:nNnnn #1#2#3#4#5 { + \um_set_mathalph_range:nNcc {#1} #2 { \um_to_usv:nn {#3} {#5} } + { \um_to_usv:nn {#4} {#5} } +} +\cs_new:Npn \um_set_mathalphabet_pos:Nnnn #1#2#3#4 { + \cs_if_exist:cT { \um_to_usv:nn {#4}{#2} } { + \clist_map_inline:nn {#3} + { \um_set_mathalphabet_char:Nnnn #1 {##1} {#4} {#2} } + } +} +\cs_new:Nn \um_set_mathalphabet_numbers:Nnn { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {10} #1 {##1} {#3} {num} } +} +\cs_new:Nn \um_set_mathalphabet_Latin:Nnn { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {Latin} } +} +\cs_new:Nn \um_set_mathalphabet_latin:Nnn { + \clist_map_inline:nn {#2} { + \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {latin} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {h} + } +} +\cs_new:Nn \um_set_mathalphabet_Greek:Nnn { + \clist_map_inline:nn {#2} { + \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {Greek} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varTheta} + } +} +\cs_new:Nn \um_set_mathalphabet_greek:Nnn { + \clist_map_inline:nn {#2} { + \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {greek} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varepsilon} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {vartheta} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varkappa} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varphi} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varrho} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varpi} + } +} +\cs_new:Nn \um_config_up_num:n { + \um_map_chars_numbers:nn {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathup {up}{#1} +} +\cs_new:Nn \um_config_up_Latin:n + { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {up} {#1} } + { + \bool_if:NT \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } + } + \um_set_mathalphabet_Latin:Nnn \mathup {up,it}{#1} +} +\cs_new:Nn \um_config_up_latin:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_latin:nn {up} {#1} } + { + \bool_if:NT \g_um_uplatin_bool { + \um_map_chars_latin:nn {up,it} {#1} + \um_map_single:nnn {h} {up,it} {#1} + \um_map_single:nnn {dotlessi} {up,it} {#1} + \um_map_single:nnn {dotlessj} {up,it} {#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathup {up,it}{#1} +} +\cs_new:Nn \um_config_up_Greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {up}{#1} } + { + \bool_if:NT \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } + } + \um_set_mathalphabet_Greek:Nnn \mathup {up,it}{#1} +} +\cs_new:Nn \um_config_up_greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {up} {#1} } + { + \bool_if:NT \g_um_upgreek_bool { + \um_map_chars_greek:nn {up,it} {#1} + } + } + \um_set_mathalphabet_greek:Nnn \mathup {up,it} {#1} +} +\cs_new:Nn \um_config_up_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{up}{up} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{up,it}{up} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{up}{up} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_map_single:nnn {partial}{up,it}{up} + } + } + \um_set_mathalphabet_pos:Nnnn \mathup {partial} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathup {Nabla} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathup {dotlessi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathup {dotlessj} {up,it} {#1} +} +\cs_new:Nn \um_config_it_Latin:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {it} {#1} } + { + \bool_if:NF \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } + } + \um_set_mathalphabet_Latin:Nnn \mathit {up,it}{#1} +} +\cs_new:Nn \um_config_it_latin:n { + \bool_if:NTF \g_um_literal_bool { + \um_map_chars_latin:nn {it} {#1} + \um_map_single:nnn {h}{it}{#1} + }{ + \bool_if:NF \g_um_uplatin_bool { + \um_map_chars_latin:nn {up,it} {#1} + \um_map_single:nnn {h}{up,it}{#1} + \um_map_single:nnn {dotlessi}{up,it}{#1} + \um_map_single:nnn {dotlessj}{up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathit {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathit {dotlessi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathit {dotlessj} {up,it} {#1} +} +\cs_new:Nn \um_config_it_Greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {it}{#1} + }{ + \bool_if:NF \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } + } + \um_set_mathalphabet_Greek:Nnn \mathit {up,it}{#1} +} +\cs_new:Nn \um_config_it_greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {it} {#1} } + { + \bool_if:NF \g_um_upgreek_bool { \um_map_chars_greek:nn {it,up} {#1} } + } + \um_set_mathalphabet_greek:Nnn \mathit {up,it} {#1} +} +\cs_new:Nn \um_config_it_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{it}{it} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{up,it}{it} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{it}{it} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_map_single:nnn {partial}{up,it}{it} + } + } + \um_set_mathalphabet_pos:Nnnn \mathit {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathit {Nabla} {up,it}{#1} +} +\cs_new:Nn \um_config_bb_latin:n { + \um_set_mathalphabet_latin:Nnn \mathbb {up,it}{#1} +} +\cs_new:Nn \um_config_bb_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbb {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {C} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {H} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {N} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {P} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {Q} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {R} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {Z} {up,it} {#1} +} +\cs_new:Nn \um_config_bb_num:n { + \um_set_mathalphabet_numbers:Nnn \mathbb {up}{#1} +} +\cs_new:Nn \um_config_bb_misc:n { + \um_set_mathalphabet_pos:Nnnn \mathbb {Pi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {pi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {Gamma} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {gamma} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {summation} {up} {#1} +} +\cs_new:Nn \um_config_bbit_misc:n { + \um_set_mathalphabet_pos:Nnnn \mathbbit {D} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {d} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {e} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {i} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {j} {up,it} {#1} +} +\cs_new:Nn \um_config_scr_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathscr {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {B}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {E}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {F}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {H}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {I}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {L}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {M}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {R}{up,it}{#1} +} +\cs_new:Nn \um_config_scr_latin:n { + \um_set_mathalphabet_latin:Nnn \mathscr {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {e}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {g}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {o}{up,it}{#1} +} +\cs_new:Nn \um_config_cal_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathcal {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {B}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {E}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {F}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {H}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {I}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {L}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {M}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {R}{up,it}{#1} +} +\cs_new:Nn \um_config_frak_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathfrak {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {C}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {H}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {I}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {R}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {Z}{up,it}{#1} +} +\cs_new:Nn \um_config_frak_latin:n { + \um_set_mathalphabet_latin:Nnn \mathfrak {up,it}{#1} +} +\cs_new:Nn \um_config_sfup_num:n { + \um_set_mathalphabet_numbers:Nnn \mathsf {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathsfup {up}{#1} +} +\cs_new:Nn \um_config_sfup_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {sfup} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_Latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathsfup {up,it}{#1} +} +\cs_new:Nn \um_config_sfup_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {sfup} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathsfup {up,it}{#1} +} +\cs_new:Nn \um_config_sfit_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {sfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_Latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathsfit {up,it}{#1} +} +\cs_new:Nn \um_config_sfit_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {sfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathsfit {up,it}{#1} +} +\cs_new:Nn \um_config_tt_num:n { + \um_set_mathalphabet_numbers:Nnn \mathtt {up}{#1} +} +\cs_new:Nn \um_config_tt_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathtt {up,it}{#1} +} +\cs_new:Nn \um_config_tt_latin:n { + \um_set_mathalphabet_latin:Nnn \mathtt {up,it}{#1} +} +\cs_new:Nn \um_config_bfit_Latin:n { + \bool_if:NF \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_Latin:Nnn \mathbfit {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Latin:nn {bfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {it}{#1} + }{ + \bool_if:NF \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfit_latin:n { + \bool_if:NF \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_latin:Nnn \mathbfit {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_latin:nn {bfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {it}{#1} + }{ + \bool_if:NF \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfit_Greek:n { + \um_set_mathalphabet_Greek:Nnn \mathbfit {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Greek:nn {bfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {it}{#1} + }{ + \bool_if:NF \g_um_bfupGreek_bool { + \um_map_chars_Greek:nn {bfup,bfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfit_greek:n { + \um_set_mathalphabet_greek:Nnn \mathbfit {up,it} {#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_greek:nn {bfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {it} {#1} + }{ + \bool_if:NF \g_um_bfupgreek_bool { + \um_map_chars_greek:nn {bfit,bfup} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} + } + } +} +\cs_new:Nn \um_config_bfit_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfit}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfup,bfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfit}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfup,bfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfit {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfit {Nabla} {up,it}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {it}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {it}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_num:n { + \um_set_mathalphabet_numbers:Nnn \mathbf {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathbfup {up}{#1} +} +\cs_new:Nn \um_config_bfup_Latin:n { + \bool_if:NT \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_Latin:Nnn \mathbfup {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Latin:nn {bfup} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {up}{#1} + }{ + \bool_if:NT \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_latin:n { + \bool_if:NT \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_latin:Nnn \mathbfup {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_latin:nn {bfup} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {up}{#1} + }{ + \bool_if:NT \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_Greek:n { + \um_set_mathalphabet_Greek:Nnn \mathbfup {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Greek:nn {bfup}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {up}{#1} + }{ + \bool_if:NT \g_um_bfupGreek_bool { + \um_map_chars_Greek:nn {bfup,bfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_greek:n { + \um_set_mathalphabet_greek:Nnn \mathbfup {up,it} {#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_greek:nn {bfup} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {up} {#1} + }{ + \bool_if:NT \g_um_bfupgreek_bool { + \um_map_chars_greek:nn {bfup,bfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} + } + } +} +\cs_new:Nn \um_config_bfup_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfup}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfup,bfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfup}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfup,bfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfup {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfup {Nabla} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfup {digamma} {up}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfup {Digamma} {up}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbf {digamma} {up}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbf {Digamma} {up}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bffrak_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbffrak {up,it}{#1} +} +\cs_new:Nn \um_config_bffrak_latin:n { + \um_set_mathalphabet_latin:Nnn \mathbffrak {up,it}{#1} +} +\cs_new:Nn \um_config_bfscr_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbfscr {up,it}{#1} +} +\cs_new:Nn \um_config_bfscr_latin:n { + \um_set_mathalphabet_latin:Nnn \mathbfscr {up,it}{#1} +} +\cs_new:Nn \um_config_bfcal_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbfcal {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_num:n { + \um_set_mathalphabet_numbers:Nnn \mathbfsf {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathbfsfup {up}{#1} +} +\cs_new:Nn \um_config_bfsfup_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {bfsfup} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathbfsfup {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {bfsfup} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathbfsfup {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_Greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Greek:nn {bfsfup}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Greek:Nnn \mathbfsfup {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_greek:nn {bfsfup} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {up} {#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} + } + } + \um_set_mathalphabet_greek:Nnn \mathbfsfup {up,it} {#1} +} +\cs_new:Nn \um_config_bfsfup_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfsfup}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfsfup}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfsfup {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfsfup {Nabla} {up,it}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfsfit_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {bfsfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathbfsfit {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfit_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {bfsfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathbfsfit {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfit_Greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Greek:nn {bfsfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Greek:Nnn \mathbfsfit {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfit_greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_greek:nn {bfsfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {it} {#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} + } + } + \um_set_mathalphabet_greek:Nnn \mathbfsfit {up,it} {#1} +} +\cs_new:Nn \um_config_bfsfit_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfsfit}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfsfit}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfsfit {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfsfit {Nabla} {up,it}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {it}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {it}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Npn \um_symbol_setup: + { + \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { + \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} + } + } +\CatchFileEdef \g_um_mathtable_tl {unicode-math-table.tex} {\um_symbol_setup:} +\cs_new:Nn \um_input_math_symbol_table: {\g_um_mathtable_tl} +\group_begin: + \char_set_catcode_other:N \^ + \cs_gset:Npn \um_cs_set_eq_active_char:Nw #1 = "#2 \q_nil { + \tex_lowercase:D { + \tl_rescan:nn { + \ExplSyntaxOn + \char_set_catcode_other:N \{ + \char_set_catcode_other:N \} + \char_set_catcode_other:N \& + \char_set_catcode_other:N \% + \char_set_catcode_other:N \$ + }{ + \cs_gset_eq:NN #1 ^^^^^#2 + } + } + } + \cs_new:Npn \um_active_char_set:wc "#1 \q_nil #2 { + \tex_lowercase:D { + \tl_rescan:nn { \ExplSyntaxOn } + { \cs_gset_protected_nopar:Npx ^^^^^#1 { \exp_not:c {#2} } } + } + } +\group_end: +\AtBeginDocument{\um_define_math_chars:} +\cs_new:Nn \um_define_math_chars: { + \group_begin: + \char_set_catcode_math_superscript:N \^ + \cs_set:Npn \_um_sym:nnn ##1##2##3 { + \bool_if:nF { \cs_if_eq_p:NN ##3 \mathaccent || + \cs_if_eq_p:NN ##3 \mathopen || + \cs_if_eq_p:NN ##3 \mathclose || + \cs_if_eq_p:NN ##3 \mathover || + \cs_if_eq_p:NN ##3 \mathunder } { + \um_cs_set_eq_active_char:Nw ##2 = ##1 \q_nil \ignorespaces + } + } + \char_set_catcode_other:N \# + \um_input_math_symbol_table: + \group_end: +} +\group_begin: + \lccode`\*=`\\ + \char_set_catcode_escape:N \| + \char_set_catcode_other:N \\ + |lowercase{ + |AtBeginDocument{ + |let|backslash=* + } + } +|group_end: +\cs_new:Nn \um_arg_i_before_egroup:n {#1\egroup} +\cs_new:Nn \um_superscript:n { + ^\bgroup #1 + \peek_meaning_remove:NTF ^ \um_arg_i_before_egroup:n \egroup +} +\muskip_new:N \g_um_primekern_muskip +\muskip_gset:Nn \g_um_primekern_muskip { -\thinmuskip/2 }% arbitrary +\int_new:N \l_um_primecount_int +\cs_new:Nn \um_nprimes:Nn { + \um_superscript:n { + #1 + \prg_replicate:nn {#2-1} { \mskip \g_um_primekern_muskip #1 } + } +} +\cs_new:Nn \um_nprimes_select:nn { + \prg_case_int:nnn {#2}{ + {1} { \um_superscript:n {#1} } + {2} { + \um_glyph_if_exist:nTF {"2033} + { \um_superscript:n {\um_prime_double_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + {3} { + \um_glyph_if_exist:nTF {"2034} + { \um_superscript:n {\um_prime_triple_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + {4} { + \um_glyph_if_exist:nTF {"2057} + { \um_superscript:n {\um_prime_quad_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + }{ + \um_nprimes:Nn #1 {#2} + } +} +\cs_new:Nn \um_nbackprimes_select:nn { + \prg_case_int:nnn {#2}{ + {1} { \um_superscript:n {#1} } + {2} { + \um_glyph_if_exist:nTF {"2036} + { \um_superscript:n {\um_backprime_double_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + {3} { + \um_glyph_if_exist:nTF {"2037} + { \um_superscript:n {\um_backprime_triple_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + }{ + \um_nprimes:Nn #1 {#2} + } +} +\cs_new:Npn \um_scan_prime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_zero:N \l_um_primecount_int + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_dprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {1} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_trprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_qprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_prime: { + \int_zero:N \l_um_primecount_int + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_dprime: { + \int_set:Nn \l_um_primecount_int {1} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_trprime: { + \int_set:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_qprime: { + \int_set:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Nn \um_scanprime_collect:N { + \int_incr:N \l_um_primecount_int + \peek_meaning_remove:NTF ' { + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_prime: { + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2032 { + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_dprime: { + \int_incr:N \l_um_primecount_int + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2033 { + \int_incr:N \l_um_primecount_int + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_trprime: { + \int_add:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2034 { + \int_add:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_qprime: { + \int_add:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2057 { + \int_add:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N #1 + }{ + \um_nprimes_select:nn {#1} {\l_um_primecount_int} + } + } + } + } + } + } + } + } + } +} +\cs_new:Npn \um_scan_backprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_zero:N \l_um_primecount_int + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_backdprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {1} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_backtrprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_sup_backprime: { + \int_zero:N \l_um_primecount_int + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_sup_backdprime: { + \int_set:Nn \l_um_primecount_int {1} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_sup_backtrprime: { + \int_set:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Nn \um_scanbackprime_collect:N { + \int_incr:N \l_um_primecount_int + \peek_meaning_remove:NTF ` { + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_backprime: { + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2035 { + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_backdprime: { + \int_incr:N \l_um_primecount_int + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2036 { + \int_incr:N \l_um_primecount_int + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_backtrprime: { + \int_add:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2037 { + \int_add:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N #1 + }{ + \um_nbackprimes_select:nn {#1} {\l_um_primecount_int} + } + } + } + } + } + } + } +} +\AtBeginDocument{\um_define_prime_commands: \um_define_prime_chars:} +\cs_new:Nn \um_define_prime_commands: { + \cs_set_eq:NN \prime \um_prime_single_mchar + \cs_set_eq:NN \dprime \um_prime_double_mchar + \cs_set_eq:NN \trprime \um_prime_triple_mchar + \cs_set_eq:NN \qprime \um_prime_quad_mchar + \cs_set_eq:NN \backprime \um_backprime_single_mchar + \cs_set_eq:NN \backdprime \um_backprime_double_mchar + \cs_set_eq:NN \backtrprime \um_backprime_triple_mchar +} +\group_begin: + \char_set_catcode_active:N \' + \char_set_catcode_active:N \` + \char_set_catcode_active:n {"2032} + \char_set_catcode_active:n {"2033} + \char_set_catcode_active:n {"2034} + \char_set_catcode_active:n {"2057} + \char_set_catcode_active:n {"2035} + \char_set_catcode_active:n {"2036} + \char_set_catcode_active:n {"2037} + \cs_gset:Nn \um_define_prime_chars: { + \cs_set_eq:NN ' \um_scan_sup_prime: + \cs_set_eq:NN ^^^^2032 \um_scan_sup_prime: + \cs_set_eq:NN ^^^^2033 \um_scan_sup_dprime: + \cs_set_eq:NN ^^^^2034 \um_scan_sup_trprime: + \cs_set_eq:NN ^^^^2057 \um_scan_sup_qprime: + \cs_set_eq:NN ` \um_scan_sup_backprime: + \cs_set_eq:NN ^^^^2035 \um_scan_sup_backprime: + \cs_set_eq:NN ^^^^2036 \um_scan_sup_backdprime: + \cs_set_eq:NN ^^^^2037 \um_scan_sup_backtrprime: + } +\group_end: +\AtBeginDocument{\um_redefine_radical:} +\cs_new:Nn \um_redefine_radical: + { + \@ifpackageloaded { amsmath } { } { + \cs_set:Npn \root ##1 \of ##2 { + \luatexUroot \l_um_radical_sqrt_tl { ##1 } { ##2 } + } + } + } +\cs_new:Nn \um_fontdimen_to_percent:nn { + \strip@pt\dimexpr\fontdimen#1#2*65536/100\relax +} +\cs_new:Nn \um_fontdimen_to_scale:nn + { + \um_fontdimen_to_percent:nn {#1} {#2} \dimexpr \f@size pt\relax + } +\cs_new:Nn \um_mathstyle_scale:Nnn { + \ifx#1\scriptstyle + #2\um_fontdimen_to_percent:nn{10}\l_um_font#3 + \else + \ifx#1\scriptscriptstyle + #2\um_fontdimen_to_percent:nn{11}\l_um_font#3 + \else + #2#3 + \fi + \fi +} +\prop_new:N \g_um_supers_prop +\prop_new:N \g_um_subs_prop +\group_begin: +\cs_new:Nn \um_setup_active_superscript:nn { + \prop_gput:Nxn \g_um_supers_prop {\meaning #1} {#2} + \char_set_catcode_active:N #1 + \char_gmake_mathactive:N #1 + \scantokens{ + \cs_gset:Npn #1 { + \tl_set:Nn \l_um_ss_chain_tl {#2} + \cs_set_eq:NN \um_sub_or_super:n \sp + \tl_set:Nn \l_um_tmpa_tl {supers} + \um_scan_sscript: + } + } +} +\um_setup_active_superscript:nn {^^^^2070} {0} +\um_setup_active_superscript:nn {^^^^00b9} {1} +\um_setup_active_superscript:nn {^^^^00b2} {2} +\um_setup_active_superscript:nn {^^^^00b3} {3} +\um_setup_active_superscript:nn {^^^^2074} {4} +\um_setup_active_superscript:nn {^^^^2075} {5} +\um_setup_active_superscript:nn {^^^^2076} {6} +\um_setup_active_superscript:nn {^^^^2077} {7} +\um_setup_active_superscript:nn {^^^^2078} {8} +\um_setup_active_superscript:nn {^^^^2079} {9} +\um_setup_active_superscript:nn {^^^^207a} {+} +\um_setup_active_superscript:nn {^^^^207b} {-} +\um_setup_active_superscript:nn {^^^^207c} {=} +\um_setup_active_superscript:nn {^^^^207d} {(} +\um_setup_active_superscript:nn {^^^^207e} {)} +\um_setup_active_superscript:nn {^^^^2071} {i} +\um_setup_active_superscript:nn {^^^^207f} {n} +\cs_new:Nn \um_setup_active_subscript:nn { + \prop_gput:Nxn \g_um_subs_prop {\meaning #1} {#2} + \char_set_catcode_active:N #1 + \char_gmake_mathactive:N #1 + \scantokens{ + \cs_gset:Npn #1 { + \tl_set:Nn \l_um_ss_chain_tl {#2} + \cs_set_eq:NN \um_sub_or_super:n \sb + \tl_set:Nn \l_um_tmpa_tl {subs} + \um_scan_sscript: + } + } +} +\um_setup_active_subscript:nn {^^^^2080} {0} +\um_setup_active_subscript:nn {^^^^2081} {1} +\um_setup_active_subscript:nn {^^^^2082} {2} +\um_setup_active_subscript:nn {^^^^2083} {3} +\um_setup_active_subscript:nn {^^^^2084} {4} +\um_setup_active_subscript:nn {^^^^2085} {5} +\um_setup_active_subscript:nn {^^^^2086} {6} +\um_setup_active_subscript:nn {^^^^2087} {7} +\um_setup_active_subscript:nn {^^^^2088} {8} +\um_setup_active_subscript:nn {^^^^2089} {9} +\um_setup_active_subscript:nn {^^^^208a} {+} +\um_setup_active_subscript:nn {^^^^208b} {-} +\um_setup_active_subscript:nn {^^^^208c} {=} +\um_setup_active_subscript:nn {^^^^208d} {(} +\um_setup_active_subscript:nn {^^^^208e} {)} +\um_setup_active_subscript:nn {^^^^2090} {a} +\um_setup_active_subscript:nn {^^^^2091} {e} +\um_setup_active_subscript:nn {^^^^1d62} {i} +\um_setup_active_subscript:nn {^^^^2092} {o} +\um_setup_active_subscript:nn {^^^^1d63} {r} +\um_setup_active_subscript:nn {^^^^1d64} {u} +\um_setup_active_subscript:nn {^^^^1d65} {v} +\um_setup_active_subscript:nn {^^^^2093} {x} +\um_setup_active_subscript:nn {^^^^1d66} {\beta} +\um_setup_active_subscript:nn {^^^^1d67} {\gamma} +\um_setup_active_subscript:nn {^^^^1d68} {\rho} +\um_setup_active_subscript:nn {^^^^1d69} {\phi} +\um_setup_active_subscript:nn {^^^^1d6a} {\chi} +\group_end: +\cs_new:Npn \um_scan_sscript: { + \um_scan_sscript:TF { + \um_scan_sscript: + }{ + \um_sub_or_super:n {\l_um_ss_chain_tl} + } +} +\cs_new:Npn \um_scan_sscript:TF #1#2 { + \tl_set:Nx \peek_true_aux:w { \exp_not:n{ #1 } } + \tl_set_eq:NN \peek_true:w \peek_true_remove:w + \tl_set:Nx \peek_false:w { \exp_not:n { \group_align_safe_end: #2 } } + \group_align_safe_begin: + \peek_after:Nw \um_peek_execute_branches_ss: +} +\cs_new:Npn \um_peek_execute_branches_ss: { + \bool_if:nTF { + \token_if_eq_catcode_p:NN \l_peek_token \c_group_begin_token || + \token_if_eq_catcode_p:NN \l_peek_token \c_group_end_token || + \token_if_eq_meaning_p:NN \l_peek_token \c_space_token + } + { \peek_false:w } + { \um_peek_execute_branches_ss_aux: } +} +\cs_new:Npn \um_peek_execute_branches_ss_aux: { + \prop_if_in:cxTF + {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} + { + \prop_get:cxN + {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} \l_um_tmpb_tl + \tl_put_right:NV \l_um_ss_chain_tl \l_um_tmpb_tl + \peek_true:w + } + { \peek_false:w } +} +\cs_new:Npn \um_define_active_frac:Nw #1 #2/#3 { + \char_set_catcode_active:N #1 + \char_gmake_mathactive:N #1 + \tl_rescan:nn { + \catcode`\_=11\relax + \catcode`\:=11\relax + }{ + \cs_gset:Npx #1 { + \bool_if:NTF \l_um_smallfrac_bool {\exp_not:N\tfrac} {\exp_not:N\frac} + {#2} {#3} + } + } +} +\cs_new:Npn \um_setup_active_frac: { + \group_begin: + \um_define_active_frac:Nw ^^^^2189 0/3 + \um_define_active_frac:Nw ^^^^2152 1/{10} + \um_define_active_frac:Nw ^^^^2151 1/9 + \um_define_active_frac:Nw ^^^^215b 1/8 + \um_define_active_frac:Nw ^^^^2150 1/7 + \um_define_active_frac:Nw ^^^^2159 1/6 + \um_define_active_frac:Nw ^^^^2155 1/5 + \um_define_active_frac:Nw ^^^^00bc 1/4 + \um_define_active_frac:Nw ^^^^2153 1/3 + \um_define_active_frac:Nw ^^^^215c 3/8 + \um_define_active_frac:Nw ^^^^2156 2/5 + \um_define_active_frac:Nw ^^^^00bd 1/2 + \um_define_active_frac:Nw ^^^^2157 3/5 + \um_define_active_frac:Nw ^^^^215d 5/8 + \um_define_active_frac:Nw ^^^^2154 2/3 + \um_define_active_frac:Nw ^^^^00be 3/4 + \um_define_active_frac:Nw ^^^^2158 4/5 + \um_define_active_frac:Nw ^^^^215a 5/6 + \um_define_active_frac:Nw ^^^^215e 7/8 + \group_end: +} +\um_setup_active_frac: +\def\to{\rightarrow} +\def\le{\leq} +\def\ge{\geq} +\def\neq{\ne} +\def\triangle{\mathord{\bigtriangleup}} +\def\bigcirc{\mdlgwhtcircle} +\def\circ{\vysmwhtcircle} +\def\bullet{\smblkcircle} +\def\mathyen{\yen} +\def\mathsterling{\sterling} +\def\diamond{\smwhtdiamond} +\def\emptyset{\varnothing} +\def\hbar{\hslash} +\def\land{\wedge} +\def\lor{\vee} +\def\owns{\ni} +\def\gets{\leftarrow} +\def\mathring{\ocirc} +\def\lnot{\neg} +\def\backepsilon{\upbackepsilon} +\def\eth{\matheth} +\def\smallint{{\textstyle\int}\limits} +\@ifpackageloaded{amsmath}{ + % define their own colon, perhaps I should just steal it. (It does look much better.) +}{ + \cs_set_protected:Npn \colon { + \bool_if:NTF \g_um_literal_colon_bool {:} { \mathpunct{:} } + } +} +\def\mathrm{\mathup} +\let\mathfence\mathord +\def\digamma{\updigamma} +\def\Digamma{\upDigamma} +\def\operator@font{\um_switchto_mathup:} +\chk_if_free_cs:N \um_tmpa:w +\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnnn #1 #2 #3 #4 #5 #6 { + \cs_if_exist:NT #1 { + \token_if_macro:NTF #1 { + \group_begin: + #2 \um_tmpa:w #3 { #4 } + \cs_if_eq:NNTF #1 \um_tmpa:w { + \msg_info:nnx { unicode-math } { patch-macro } + { \token_to_str:N #1 } + \group_end: + #2 #1 #3 + { #5 } + } { + \msg_warning:nnxxx { unicode-math } { wrong-meaning } + { \token_to_str:N #1 } { \token_to_meaning:N #1 } + { \token_to_meaning:N \um_tmpa:w } + \group_end: + } + } { + \msg_warning:nnx { unicode-math } { macro-expected } + { \token_to_str:N #1 } + } + } +} +\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnn #1 #2 #3 #4 #5 { + \um_check_and_fix:NNnnnn #1 #2 { #3 } { #4 } { #5 } { #5 } +} +\cs_new_protected_nopar:Npn \um_check_and_fix_luatex:NNnnn #1 #2 #3 #4 #5 { + \luatex_if_engine:T { + \um_check_and_fix:NNnnn #1 #2 { #3 } { #4 } { #5 } + } +} +\cs_generate_variant:Nn \um_check_and_fix_luatex:NNnnn { c } +\AtEndOfPackageFile * {url} { + \tl_put_left:Nn \Url@FormatString { \um_switchto_mathup: } + \tl_put_right:Nn \UrlSpecials { + \do\`{\mathchar`\`} + \do\'{\mathchar`\'} + \do\${\mathchar`\$} + \do\&{\mathchar`\&} + } +} +\AtEndOfPackageFile * {amsmath} { + \cs_set:Npn \@cdots {\mathinner{\cdots}} + \cs_set_eq:NN \dotsb@ \cdots + \um_check_and_fix_luatex:NNnnn \plainroot@ \cs_set_nopar:Npn { #1 \of #2 } { + \setbox \rootbox \hbox { + $ \m@th \scriptscriptstyle { #1 } $ + } + \mathchoice + { \r@@t \displaystyle { #2 } } + { \r@@t \textstyle { #2 } }~ + { \r@@t \scriptstyle { #2 } } + { \r@@t \scriptscriptstyle { #2 } } + \egroup + } { + \bool_if:nTF { + \int_compare_p:nNn { \uproot@ } = { \c_zero } + && \int_compare_p:nNn { \leftroot@ } = { \c_zero } + } { + \luatexUroot \l_um_radical_sqrt_tl { #1 } { #2 } + } { + \hbox_set:Nn \rootbox { + \c_math_toggle_token + \m@th + \scriptscriptstyle { #1 } + \c_math_toggle_token + } + \mathchoice + { \r@@t \displaystyle { #2 } } + { \r@@t \textstyle { #2 } } + { \r@@t \scriptstyle { #2 } } + { \r@@t \scriptscriptstyle { #2 } } + } + \c_group_end_token + } + \um_check_and_fix:NNnnnn \r@@t \cs_set_nopar:Npn { #1 #2 } { + \setboxz@h { $ \m@th #1 \sqrtsign { #2 } $ } + \dimen@ \ht\z@ + \advance \dimen@ -\dp\z@ + \setbox\@ne \hbox { $ \m@th #1 \mskip \uproot@ mu $ } + \advance \dimen@ by 1.667 \wd\@ne + \mkern -\leftroot@ mu + \mkern 5mu + \raise .6\dimen@ \copy\rootbox + \mkern -10mu + \mkern \leftroot@ mu + \boxz@ + } { + \hbox_set:Nn \l_tmpa_box { + \c_math_toggle_token + \m@th + #1 + \mskip \uproot@ mu + \c_math_toggle_token + } + \luatexUroot \l_um_radical_sqrt_tl { + \box_move_up:nn { \box_wd:N \l_tmpa_box } { + \hbox:n { + \c_math_toggle_token + \m@th + \mkern -\leftroot@ mu + \box_use:N \rootbox + \mkern \leftroot@ mu + \c_math_toggle_token + } + } + } { + #2 + } + } { + \hbox_set:Nn \l_tmpa_box { + \c_math_toggle_token + \m@th + #1 + \sqrtsign { #2 } + \c_math_toggle_token + } + \hbox_set:Nn \l_tmpb_box { + \c_math_toggle_token + \m@th + #1 + \mskip \uproot@ mu + \c_math_toggle_token + } + \mkern -\leftroot@ mu + \um_mathstyle_scale:Nnn #1 { \kern } { + \fontdimen 63 \l_um_font + } + \box_move_up:nn { + \box_wd:N \l_tmpb_box + + (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) + * \number \fontdimen 65 \l_um_font / 100 + } { + \box_use:N \rootbox + } + \um_mathstyle_scale:Nnn #1 { \kern } { + \fontdimen 64 \l_um_font + } + \mkern \leftroot@ mu + \box_use_clear:N \l_tmpa_box + } +} +\AtEndOfPackageFile * {amsopn} { + \cs_set:Npn \newmcodes@ { + \mathcode`\'39\scan_stop: + \mathcode`\*42\scan_stop: + \mathcode`\."613A\scan_stop: +%% \ifnum\mathcode`\-=45 \else +%% \mathchardef\std@minus\mathcode`\-\relax +%% \fi + \mathcode`\-45\scan_stop: + \mathcode`\/47\scan_stop: + \mathcode`\:"603A\scan_stop: + } +} +\cs_set:Npn \| {\Vert} +\cs_set:Npn \mathellipsis {\mathinner{\unicodeellipsis}} +\cs_set:Npn \cdots {\mathinner{\unicodecdots}} +\cs_new_protected_nopar:Nn \um_setup_accents: + { + \cs_gset_protected_nopar:Npx \widehat { + \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "0302 } + } + \cs_gset_protected_nopar:Npx \widetilde { + \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "0303 } + } + \cs_gset_protected_nopar:Npx \overleftarrow { + \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "20D6 } + } + \cs_gset_protected_nopar:Npx \overrightarrow { + \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "20D7 } + } + \cs_gset_protected_nopar:Npx \overleftrightarrow { + \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "20E1 } + } + \bool_if:NT \c_um_have_fixed_accents_bool { + \cs_gset_protected_nopar:Npx \underrightharpoondown { + \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EC } + } + \cs_gset_protected_nopar:Npx \underleftharpoondown { + \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20ED } + } + \cs_gset_protected_nopar:Npx \underleftarrow { + \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EE } + } + \cs_gset_protected_nopar:Npx \underrightarrow { + \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EF } + } + } + } +\cs_set_eq:NN \um_text_slash: \slash +\cs_set_protected:Npn \slash { + \mode_if_math:TF {\mathslash} {\um_text_slash:} +} +\AtEndOfPackageFile * { mathtools } { + \msg_warning:nn { unicode-math } { mathtools } + \NewDocumentCommand \dblcolon { } { \Colon } + \NewDocumentCommand \coloneqq { } { \coloneq } + \NewDocumentCommand \Coloneqq { } { \Coloneq } + \NewDocumentCommand \eqqcolon { } { \eqcolon } +} +\AtEndOfPackageFile * { colonequals } { + \msg_warning:nn { unicode-math } { colonequals } + \RenewDocumentCommand \ratio { } { \mathratio } + \RenewDocumentCommand \coloncolon { } { \Colon } + \RenewDocumentCommand \minuscolon { } { \dashcolon } + \RenewDocumentCommand \colonequals { } { \coloneq } + \RenewDocumentCommand \equalscolon { } { \eqcolon } + \RenewDocumentCommand \coloncolonequals { } { \Coloneq } +} +\ExplSyntaxOff diff --git a/Master/texmf-dist/tex/latex/unicode-math/unicode-math-table.tex b/Master/texmf-dist/tex/latex/unicode-math/unicode-math-table.tex index 7312839ddb8..b4aeff77cee 100644 --- a/Master/texmf-dist/tex/latex/unicode-math/unicode-math-table.tex +++ b/Master/texmf-dist/tex/latex/unicode-math/unicode-math-table.tex @@ -7,7 +7,7 @@ \UnicodeMathSymbol{"00029}{\rparen }{\mathclose}{right parenthesis}% \UnicodeMathSymbol{"0002B}{\plus }{\mathbin}{plus sign b:}% \UnicodeMathSymbol{"0002C}{\comma }{\mathpunct}{comma}% -\UnicodeMathSymbol{"0002E}{\period }{\mathalpha}{full stop, period}% +\UnicodeMathSymbol{"0002E}{\period }{\mathord}{full stop, period}% \UnicodeMathSymbol{"0002F}{\mathslash }{\mathord}{solidus}% \UnicodeMathSymbol{"0003A}{\mathcolon }{\mathpunct}{colon}% \UnicodeMathSymbol{"0003B}{\semicolon }{\mathpunct}{semicolon p:}% @@ -318,12 +318,12 @@ \UnicodeMathSymbol{"021FF}{\leftrightarrowtriangle }{\mathrel}{left right open-headed arrow}% \UnicodeMathSymbol{"02200}{\forall }{\mathord}{for all}% \UnicodeMathSymbol{"02201}{\complement }{\mathord}{complement sign}% -\UnicodeMathSymbol{"02202}{\partial }{\mathord}{partial differential}% +\UnicodeMathSymbol{"02202}{\partial }{\mathalpha}{partial differential}% \UnicodeMathSymbol{"02203}{\exists }{\mathord}{at least one exists}% \UnicodeMathSymbol{"02204}{\nexists }{\mathord}{negated exists}% \UnicodeMathSymbol{"02205}{\varnothing }{\mathord}{circle, slash}% \UnicodeMathSymbol{"02206}{\increment }{\mathord}{laplacian (delta; nabla\string^2)}% -\UnicodeMathSymbol{"02207}{\nabla }{\mathord}{nabla, del, hamilton operator}% +\UnicodeMathSymbol{"02207}{\nabla }{\mathalpha}{nabla, del, hamilton operator}% \UnicodeMathSymbol{"02208}{\in }{\mathrel}{set membership, variant}% \UnicodeMathSymbol{"02209}{\notin }{\mathrel}{negated set membership}% \UnicodeMathSymbol{"0220A}{\smallin }{\mathrel}{set membership (small set membership)}% @@ -648,6 +648,8 @@ \UnicodeMathSymbol{"023E5}{\fltns }{\mathord}{flatness}% \UnicodeMathSymbol{"023E6}{\accurrent }{\mathord}{ac current}% \UnicodeMathSymbol{"023E7}{\elinters }{\mathord}{electrical intersection}% +\UnicodeMathSymbol{"02422}{\blanksymbol }{\mathord}{blank symbol}% +\UnicodeMathSymbol{"02423}{\openbox }{\mathord}{open box}% \UnicodeMathSymbol{"02506}{\bdtriplevdash }{\mathord}{doubly broken vert}% \UnicodeMathSymbol{"02580}{\blockuphalf }{\mathord}{upper half block}% \UnicodeMathSymbol{"02584}{\blocklowhalf }{\mathord}{lower half block}% @@ -2119,7 +2121,7 @@ \UnicodeMathSymbol{"1D6BE}{\mbfChi }{\mathalpha}{mathematical bold capital chi}% \UnicodeMathSymbol{"1D6BF}{\mbfPsi }{\mathalpha}{mathematical bold capital psi}% \UnicodeMathSymbol{"1D6C0}{\mbfOmega }{\mathalpha}{mathematical bold capital omega}% -\UnicodeMathSymbol{"1D6C1}{\mbfnabla }{\mathord}{mathematical bold nabla}% +\UnicodeMathSymbol{"1D6C1}{\mbfnabla }{\mathalpha}{mathematical bold nabla}% \UnicodeMathSymbol{"1D6C2}{\mbfalpha }{\mathalpha}{mathematical bold small alpha}% \UnicodeMathSymbol{"1D6C3}{\mbfbeta }{\mathalpha}{mathematical bold small beta}% \UnicodeMathSymbol{"1D6C4}{\mbfgamma }{\mathalpha}{mathematical bold small gamma}% @@ -2145,7 +2147,7 @@ \UnicodeMathSymbol{"1D6D8}{\mbfchi }{\mathalpha}{mathematical bold small chi}% \UnicodeMathSymbol{"1D6D9}{\mbfpsi }{\mathalpha}{mathematical bold small psi}% \UnicodeMathSymbol{"1D6DA}{\mbfomega }{\mathalpha}{mathematical bold small omega}% -\UnicodeMathSymbol{"1D6DB}{\mbfpartial }{\mathord}{mathematical bold partial differential}% +\UnicodeMathSymbol{"1D6DB}{\mbfpartial }{\mathalpha}{mathematical bold partial differential}% \UnicodeMathSymbol{"1D6DC}{\mbfvarepsilon }{\mathalpha}{mathematical bold epsilon symbol}% \UnicodeMathSymbol{"1D6DD}{\mbfvartheta }{\mathalpha}{mathematical bold theta symbol}% \UnicodeMathSymbol{"1D6DE}{\mbfvarkappa }{\mathalpha}{mathematical bold kappa symbol}% @@ -2177,7 +2179,7 @@ \UnicodeMathSymbol{"1D6F8}{\mitChi }{\mathalpha}{mathematical italic capital chi}% \UnicodeMathSymbol{"1D6F9}{\mitPsi }{\mathalpha}{mathematical italic capital psi}% \UnicodeMathSymbol{"1D6FA}{\mitOmega }{\mathalpha}{mathematical italic capital omega}% -\UnicodeMathSymbol{"1D6FB}{\mitnabla }{\mathord}{mathematical italic nabla}% +\UnicodeMathSymbol{"1D6FB}{\mitnabla }{\mathalpha}{mathematical italic nabla}% \UnicodeMathSymbol{"1D6FC}{\mitalpha }{\mathalpha}{mathematical italic small alpha}% \UnicodeMathSymbol{"1D6FD}{\mitbeta }{\mathalpha}{mathematical italic small beta}% \UnicodeMathSymbol{"1D6FE}{\mitgamma }{\mathalpha}{mathematical italic small gamma}% @@ -2203,7 +2205,7 @@ \UnicodeMathSymbol{"1D712}{\mitchi }{\mathalpha}{mathematical italic small chi}% \UnicodeMathSymbol{"1D713}{\mitpsi }{\mathalpha}{mathematical italic small psi}% \UnicodeMathSymbol{"1D714}{\mitomega }{\mathalpha}{mathematical italic small omega}% -\UnicodeMathSymbol{"1D715}{\mitpartial }{\mathord}{mathematical italic partial differential}% +\UnicodeMathSymbol{"1D715}{\mitpartial }{\mathalpha}{mathematical italic partial differential}% \UnicodeMathSymbol{"1D716}{\mitvarepsilon }{\mathalpha}{mathematical italic epsilon symbol}% \UnicodeMathSymbol{"1D717}{\mitvartheta }{\mathalpha}{mathematical italic theta symbol}% \UnicodeMathSymbol{"1D718}{\mitvarkappa }{\mathalpha}{mathematical italic kappa symbol}% @@ -2235,7 +2237,7 @@ \UnicodeMathSymbol{"1D732}{\mbfitChi }{\mathalpha}{mathematical bold italic capital chi}% \UnicodeMathSymbol{"1D733}{\mbfitPsi }{\mathalpha}{mathematical bold italic capital psi}% \UnicodeMathSymbol{"1D734}{\mbfitOmega }{\mathalpha}{mathematical bold italic capital omega}% -\UnicodeMathSymbol{"1D735}{\mbfitnabla }{\mathord}{mathematical bold italic nabla}% +\UnicodeMathSymbol{"1D735}{\mbfitnabla }{\mathalpha}{mathematical bold italic nabla}% \UnicodeMathSymbol{"1D736}{\mbfitalpha }{\mathalpha}{mathematical bold italic small alpha}% \UnicodeMathSymbol{"1D737}{\mbfitbeta }{\mathalpha}{mathematical bold italic small beta}% \UnicodeMathSymbol{"1D738}{\mbfitgamma }{\mathalpha}{mathematical bold italic small gamma}% @@ -2261,7 +2263,7 @@ \UnicodeMathSymbol{"1D74C}{\mbfitchi }{\mathalpha}{mathematical bold italic small chi}% \UnicodeMathSymbol{"1D74D}{\mbfitpsi }{\mathalpha}{mathematical bold italic small psi}% \UnicodeMathSymbol{"1D74E}{\mbfitomega }{\mathalpha}{mathematical bold italic small omega}% -\UnicodeMathSymbol{"1D74F}{\mbfitpartial }{\mathord}{mathematical bold italic partial differential}% +\UnicodeMathSymbol{"1D74F}{\mbfitpartial }{\mathalpha}{mathematical bold italic partial differential}% \UnicodeMathSymbol{"1D750}{\mbfitvarepsilon }{\mathalpha}{mathematical bold italic epsilon symbol}% \UnicodeMathSymbol{"1D751}{\mbfitvartheta }{\mathalpha}{mathematical bold italic theta symbol}% \UnicodeMathSymbol{"1D752}{\mbfitvarkappa }{\mathalpha}{mathematical bold italic kappa symbol}% @@ -2293,7 +2295,7 @@ \UnicodeMathSymbol{"1D76C}{\mbfsansChi }{\mathalpha}{mathematical sans-serif bold capital chi}% \UnicodeMathSymbol{"1D76D}{\mbfsansPsi }{\mathalpha}{mathematical sans-serif bold capital psi}% \UnicodeMathSymbol{"1D76E}{\mbfsansOmega }{\mathalpha}{mathematical sans-serif bold capital omega}% -\UnicodeMathSymbol{"1D76F}{\mbfsansnabla }{\mathord}{mathematical sans-serif bold nabla}% +\UnicodeMathSymbol{"1D76F}{\mbfsansnabla }{\mathalpha}{mathematical sans-serif bold nabla}% \UnicodeMathSymbol{"1D770}{\mbfsansalpha }{\mathalpha}{mathematical sans-serif bold small alpha}% \UnicodeMathSymbol{"1D771}{\mbfsansbeta }{\mathalpha}{mathematical sans-serif bold small beta}% \UnicodeMathSymbol{"1D772}{\mbfsansgamma }{\mathalpha}{mathematical sans-serif bold small gamma}% @@ -2319,7 +2321,7 @@ \UnicodeMathSymbol{"1D786}{\mbfsanschi }{\mathalpha}{mathematical sans-serif bold small chi}% \UnicodeMathSymbol{"1D787}{\mbfsanspsi }{\mathalpha}{mathematical sans-serif bold small psi}% \UnicodeMathSymbol{"1D788}{\mbfsansomega }{\mathalpha}{mathematical sans-serif bold small omega}% -\UnicodeMathSymbol{"1D789}{\mbfsanspartial }{\mathord}{mathematical sans-serif bold partial differential}% +\UnicodeMathSymbol{"1D789}{\mbfsanspartial }{\mathalpha}{mathematical sans-serif bold partial differential}% \UnicodeMathSymbol{"1D78A}{\mbfsansvarepsilon }{\mathalpha}{mathematical sans-serif bold epsilon symbol}% \UnicodeMathSymbol{"1D78B}{\mbfsansvartheta }{\mathalpha}{mathematical sans-serif bold theta symbol}% \UnicodeMathSymbol{"1D78C}{\mbfsansvarkappa }{\mathalpha}{mathematical sans-serif bold kappa symbol}% @@ -2351,7 +2353,7 @@ \UnicodeMathSymbol{"1D7A6}{\mbfitsansChi }{\mathalpha}{mathematical sans-serif bold italic capital chi}% \UnicodeMathSymbol{"1D7A7}{\mbfitsansPsi }{\mathalpha}{mathematical sans-serif bold italic capital psi}% \UnicodeMathSymbol{"1D7A8}{\mbfitsansOmega }{\mathalpha}{mathematical sans-serif bold italic capital omega}% -\UnicodeMathSymbol{"1D7A9}{\mbfitsansnabla }{\mathord}{mathematical sans-serif bold italic nabla}% +\UnicodeMathSymbol{"1D7A9}{\mbfitsansnabla }{\mathalpha}{mathematical sans-serif bold italic nabla}% \UnicodeMathSymbol{"1D7AA}{\mbfitsansalpha }{\mathalpha}{mathematical sans-serif bold italic small alpha}% \UnicodeMathSymbol{"1D7AB}{\mbfitsansbeta }{\mathalpha}{mathematical sans-serif bold italic small beta}% \UnicodeMathSymbol{"1D7AC}{\mbfitsansgamma }{\mathalpha}{mathematical sans-serif bold italic small gamma}% @@ -2377,7 +2379,7 @@ \UnicodeMathSymbol{"1D7C0}{\mbfitsanschi }{\mathalpha}{mathematical sans-serif bold italic small chi}% \UnicodeMathSymbol{"1D7C1}{\mbfitsanspsi }{\mathalpha}{mathematical sans-serif bold italic small psi}% \UnicodeMathSymbol{"1D7C2}{\mbfitsansomega }{\mathalpha}{mathematical sans-serif bold italic small omega}% -\UnicodeMathSymbol{"1D7C3}{\mbfitsanspartial }{\mathord}{mathematical sans-serif bold italic partial differential}% +\UnicodeMathSymbol{"1D7C3}{\mbfitsanspartial }{\mathalpha}{mathematical sans-serif bold italic partial differential}% \UnicodeMathSymbol{"1D7C4}{\mbfitsansvarepsilon }{\mathalpha}{mathematical sans-serif bold italic epsilon symbol}% \UnicodeMathSymbol{"1D7C5}{\mbfitsansvartheta }{\mathalpha}{mathematical sans-serif bold italic theta symbol}% \UnicodeMathSymbol{"1D7C6}{\mbfitsansvarkappa }{\mathalpha}{mathematical sans-serif bold italic kappa symbol}% diff --git a/Master/texmf-dist/tex/latex/unicode-math/unicode-math-xetex.sty b/Master/texmf-dist/tex/latex/unicode-math/unicode-math-xetex.sty new file mode 100644 index 00000000000..339f67ff4cd --- /dev/null +++ b/Master/texmf-dist/tex/latex/unicode-math/unicode-math-xetex.sty @@ -0,0 +1,2630 @@ +%% +%% This is file `unicode-math-xetex.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% unicode-math.dtx (with options: `package,XE') +%% Copyright 2006-2011 Will Robertson +%% Copyright 2010-2011 Philipp Stephani +%% +%% This package is free software and may be redistributed and/or modified under +%% the conditions of the LaTeX Project Public License, version 1.3c or higher +%% (your choice): . +%% +%% This work is "author-maintained" by Will Robertson. +\ExplSyntaxOn +\cs_new:Nn \um_cs_compat:n + { \cs_set_eq:cc {U#1} {XeTeX#1} } +\um_cs_compat:n {mathcode} +\um_cs_compat:n {delcode} +\um_cs_compat:n {mathcodenum} +\um_cs_compat:n {mathcharnum} +\um_cs_compat:n {mathchardef} +\um_cs_compat:n {radical} +\um_cs_compat:n {mathaccent} +\um_cs_compat:n {delimiter} +\bool_set_false:N \c_um_have_fixed_accents_bool +\cs_new:Nn \usv_set:nnn { + \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} +} +\cs_new:Nn \um_to_usv:nn { g_um_#1_#2_usv } +\usv_set:nnn {up}{num}{48} +\usv_set:nnn {up}{Latin}{65} +\usv_set:nnn {up}{latin}{97} +\usv_set:nnn {up}{Greek}{"391} +\usv_set:nnn {up}{greek}{"3B1} +\usv_set:nnn {it}{Latin}{"1D434} +\usv_set:nnn {it}{latin}{"1D44E} +\usv_set:nnn {it}{Greek}{"1D6E2} +\usv_set:nnn {it}{greek}{"1D6FC} +\usv_set:nnn {bb}{num}{"1D7D8} +\usv_set:nnn {bb}{Latin}{"1D538} +\usv_set:nnn {bb}{latin}{"1D552} +\usv_set:nnn {scr}{Latin}{"1D49C} +\usv_set:nnn {cal}{Latin}{"1D49C} +\usv_set:nnn {scr}{latin}{"1D4B6} +\usv_set:nnn {frak}{Latin}{"1D504} +\usv_set:nnn {frak}{latin}{"1D51E} +\usv_set:nnn {sf}{num}{"1D7E2} +\usv_set:nnn {sfup}{num}{"1D7E2} +\usv_set:nnn {sfit}{num}{"1D7E2} +\usv_set:nnn {sfup}{Latin}{"1D5A0} +\usv_set:nnn {sf}{Latin}{"1D5A0} +\usv_set:nnn {sfup}{latin}{"1D5BA} +\usv_set:nnn {sf}{latin}{"1D5BA} +\usv_set:nnn {sfit}{Latin}{"1D608} +\usv_set:nnn {sfit}{latin}{"1D622} +\usv_set:nnn {tt}{num}{"1D7F6} +\usv_set:nnn {tt}{Latin}{"1D670} +\usv_set:nnn {tt}{latin}{"1D68A} +\usv_set:nnn {bf}{num}{"1D7CE} +\usv_set:nnn {bfup}{num}{"1D7CE} +\usv_set:nnn {bfit}{num}{"1D7CE} +\usv_set:nnn {bfup}{Latin}{"1D400} +\usv_set:nnn {bfup}{latin}{"1D41A} +\usv_set:nnn {bfup}{Greek}{"1D6A8} +\usv_set:nnn {bfup}{greek}{"1D6C2} +\usv_set:nnn {bfit}{Latin}{"1D468} +\usv_set:nnn {bfit}{latin}{"1D482} +\usv_set:nnn {bfit}{Greek}{"1D71C} +\usv_set:nnn {bfit}{greek}{"1D736} +\usv_set:nnn {bffrak}{Latin}{"1D56C} +\usv_set:nnn {bffrak}{latin}{"1D586} +\usv_set:nnn {bfscr}{Latin}{"1D4D0} +\usv_set:nnn {bfcal}{Latin}{"1D4D0} +\usv_set:nnn {bfscr}{latin}{"1D4EA} +\usv_set:nnn {bfsf}{num}{"1D7EC} +\usv_set:nnn {bfsfup}{num}{"1D7EC} +\usv_set:nnn {bfsfit}{num}{"1D7EC} +\usv_set:nnn {bfsfup}{Latin}{"1D5D4} +\usv_set:nnn {bfsfup}{latin}{"1D5EE} +\usv_set:nnn {bfsfup}{Greek}{"1D756} +\usv_set:nnn {bfsfup}{greek}{"1D770} +\usv_set:nnn {bfsfit}{Latin}{"1D63C} +\usv_set:nnn {bfsfit}{latin}{"1D656} +\usv_set:nnn {bfsfit}{Greek}{"1D790} +\usv_set:nnn {bfsfit}{greek}{"1D7AA} +\usv_set:nnn {bfsf}{Latin}{ \bool_if:NTF \g_um_upLatin_bool \g_um_bfsfup_Latin_usv \g_um_bfsfit_Latin_usv } +\usv_set:nnn {bfsf}{latin}{ \bool_if:NTF \g_um_uplatin_bool \g_um_bfsfup_latin_usv \g_um_bfsfit_latin_usv } +\usv_set:nnn {bfsf}{Greek}{ \bool_if:NTF \g_um_upGreek_bool \g_um_bfsfup_Greek_usv \g_um_bfsfit_Greek_usv } +\usv_set:nnn {bfsf}{greek}{ \bool_if:NTF \g_um_upgreek_bool \g_um_bfsfup_greek_usv \g_um_bfsfit_greek_usv } +\usv_set:nnn {bf}{Latin}{ \bool_if:NTF \g_um_bfupLatin_bool \g_um_bfup_Latin_usv \g_um_bfit_Latin_usv } +\usv_set:nnn {bf}{latin}{ \bool_if:NTF \g_um_bfuplatin_bool \g_um_bfup_latin_usv \g_um_bfit_latin_usv } +\usv_set:nnn {bf}{Greek}{ \bool_if:NTF \g_um_bfupGreek_bool \g_um_bfup_Greek_usv \g_um_bfit_Greek_usv } +\usv_set:nnn {bf}{greek}{ \bool_if:NTF \g_um_bfupgreek_bool \g_um_bfup_greek_usv \g_um_bfit_greek_usv } +\usv_set:nnn {up}{varTheta}{"3F4} +\usv_set:nnn {up}{Digamma}{"3DC} +\usv_set:nnn {up}{varepsilon}{"3F5} +\usv_set:nnn {up}{vartheta}{"3D1} +\usv_set:nnn {up}{varkappa}{"3F0} +\usv_set:nnn {up}{varphi}{"3D5} +\usv_set:nnn {up}{varrho}{"3F1} +\usv_set:nnn {up}{varpi}{"3D6} +\usv_set:nnn {up}{digamma}{"3DD} +\usv_set:nnn {bfup}{varTheta}{"1D6B9} +\usv_set:nnn {bfup}{Digamma}{"1D7CA} +\usv_set:nnn {bfup}{varepsilon}{"1D6DC} +\usv_set:nnn {bfup}{vartheta}{"1D6DD} +\usv_set:nnn {bfup}{varkappa}{"1D6DE} +\usv_set:nnn {bfup}{varphi}{"1D6DF} +\usv_set:nnn {bfup}{varrho}{"1D6E0} +\usv_set:nnn {bfup}{varpi}{"1D6E1} +\usv_set:nnn {bfup}{digamma}{"1D7CB} +\usv_set:nnn {it}{varTheta}{"1D6F3} +\usv_set:nnn {it}{varepsilon}{"1D716} +\usv_set:nnn {it}{vartheta}{"1D717} +\usv_set:nnn {it}{varkappa}{"1D718} +\usv_set:nnn {it}{varphi}{"1D719} +\usv_set:nnn {it}{varrho}{"1D71A} +\usv_set:nnn {it}{varpi}{"1D71B} +\usv_set:nnn {bfit}{varTheta}{"1D72D} +\usv_set:nnn {bfit}{varepsilon}{"1D750} +\usv_set:nnn {bfit}{vartheta}{"1D751} +\usv_set:nnn {bfit}{varkappa}{"1D752} +\usv_set:nnn {bfit}{varphi}{"1D753} +\usv_set:nnn {bfit}{varrho}{"1D754} +\usv_set:nnn {bfit}{varpi}{"1D755} +\usv_set:nnn {bfsfup}{varTheta}{"1D767} +\usv_set:nnn {bfsfup}{varepsilon}{"1D78A} +\usv_set:nnn {bfsfup}{vartheta}{"1D78B} +\usv_set:nnn {bfsfup}{varkappa}{"1D78C} +\usv_set:nnn {bfsfup}{varphi}{"1D78D} +\usv_set:nnn {bfsfup}{varrho}{"1D78E} +\usv_set:nnn {bfsfup}{varpi}{"1D78F} +\usv_set:nnn {bfsfit}{varTheta} {"1D7A1} +\usv_set:nnn {bfsfit}{varepsilon}{"1D7C4} +\usv_set:nnn {bfsfit}{vartheta} {"1D7C5} +\usv_set:nnn {bfsfit}{varkappa} {"1D7C6} +\usv_set:nnn {bfsfit}{varphi} {"1D7C7} +\usv_set:nnn {bfsfit}{varrho} {"1D7C8} +\usv_set:nnn {bfsfit}{varpi} {"1D7C9} +\usv_set:nnn {up} {Nabla}{"02207} +\usv_set:nnn {it} {Nabla}{"1D6FB} +\usv_set:nnn {bfup} {Nabla}{"1D6C1} +\usv_set:nnn {bfit} {Nabla}{"1D735} +\usv_set:nnn {bfsfup}{Nabla}{"1D76F} +\usv_set:nnn {bfsfit}{Nabla}{"1D7A9} +\usv_set:nnn {up} {partial}{"02202} +\usv_set:nnn {it} {partial}{"1D715} +\usv_set:nnn {bfup} {partial}{"1D6DB} +\usv_set:nnn {bfit} {partial}{"1D74F} +\usv_set:nnn {bfsfup}{partial}{"1D789} +\usv_set:nnn {bfsfit}{partial}{"1D7C3} +\usv_set:nnn {up}{B}{`\B} +\usv_set:nnn {up}{C}{`\C} +\usv_set:nnn {up}{D}{`\D} +\usv_set:nnn {up}{E}{`\E} +\usv_set:nnn {up}{F}{`\F} +\usv_set:nnn {up}{H}{`\H} +\usv_set:nnn {up}{I}{`\I} +\usv_set:nnn {up}{L}{`\L} +\usv_set:nnn {up}{M}{`\M} +\usv_set:nnn {up}{N}{`\N} +\usv_set:nnn {up}{P}{`\P} +\usv_set:nnn {up}{Q}{`\Q} +\usv_set:nnn {up}{R}{`\R} +\usv_set:nnn {up}{Z}{`\Z} +\usv_set:nnn {it}{B}{"1D435} +\usv_set:nnn {it}{C}{"1D436} +\usv_set:nnn {it}{D}{"1D437} +\usv_set:nnn {it}{E}{"1D438} +\usv_set:nnn {it}{F}{"1D439} +\usv_set:nnn {it}{H}{"1D43B} +\usv_set:nnn {it}{I}{"1D43C} +\usv_set:nnn {it}{L}{"1D43F} +\usv_set:nnn {it}{M}{"1D440} +\usv_set:nnn {it}{N}{"1D441} +\usv_set:nnn {it}{P}{"1D443} +\usv_set:nnn {it}{Q}{"1D444} +\usv_set:nnn {it}{R}{"1D445} +\usv_set:nnn {it}{Z}{"1D44D} +\usv_set:nnn {up}{d}{`\d} +\usv_set:nnn {up}{e}{`\e} +\usv_set:nnn {up}{g}{`\g} +\usv_set:nnn {up}{h}{`\h} +\usv_set:nnn {up}{i}{`\i} +\usv_set:nnn {up}{j}{`\j} +\usv_set:nnn {up}{o}{`\o} +\usv_set:nnn {it}{d}{"1D451} +\usv_set:nnn {it}{e}{"1D452} +\usv_set:nnn {it}{g}{"1D454} +\usv_set:nnn {it}{h}{"0210E} +\usv_set:nnn {it}{i}{"1D456} +\usv_set:nnn {it}{j}{"1D457} +\usv_set:nnn {it}{o}{"1D45C} +\usv_set:nnn {bb} {h}{"1D559} +\usv_set:nnn {tt} {h}{"1D691} +\usv_set:nnn {scr} {h}{"1D4BD} +\usv_set:nnn {frak} {h}{"1D525} +\usv_set:nnn {bfup} {h}{"1D421} +\usv_set:nnn {bfit} {h}{"1D489} +\usv_set:nnn {sfup} {h}{"1D5C1} +\usv_set:nnn {sfit} {h}{"1D629} +\usv_set:nnn {bffrak}{h}{"1D58D} +\usv_set:nnn {bfscr} {h}{"1D4F1} +\usv_set:nnn {bfsfup}{h}{"1D5F5} +\usv_set:nnn {bfsfit}{h}{"1D65D} +\usv_set:nnn {up}{dotlessi}{"00131} +\usv_set:nnn {up}{dotlessj}{"00237} +\usv_set:nnn {it}{dotlessi}{"1D6A4} +\usv_set:nnn {it}{dotlessj}{"1D6A5} +\usv_set:nnn {bb}{C}{"2102} +\usv_set:nnn {bb}{H}{"210D} +\usv_set:nnn {bb}{N}{"2115} +\usv_set:nnn {bb}{P}{"2119} +\usv_set:nnn {bb}{Q}{"211A} +\usv_set:nnn {bb}{R}{"211D} +\usv_set:nnn {bb}{Z}{"2124} +\usv_set:nnn {up}{Pi} {"003A0} +\usv_set:nnn {up}{pi} {"003C0} +\usv_set:nnn {up}{Gamma} {"00393} +\usv_set:nnn {up}{gamma} {"003B3} +\usv_set:nnn {up}{summation}{"02211} +\usv_set:nnn {it}{Pi} {"1D6F1} +\usv_set:nnn {it}{pi} {"1D70B} +\usv_set:nnn {it}{Gamma} {"1D6E4} +\usv_set:nnn {it}{gamma} {"1D6FE} +\usv_set:nnn {bb}{Pi} {"0213F} +\usv_set:nnn {bb}{pi} {"0213C} +\usv_set:nnn {bb}{Gamma} {"0213E} +\usv_set:nnn {bb}{gamma} {"0213D} +\usv_set:nnn {bb}{summation}{"02140} +\usv_set:nnn {bbit}{D}{"2145} +\usv_set:nnn {bbit}{d}{"2146} +\usv_set:nnn {bbit}{e}{"2147} +\usv_set:nnn {bbit}{i}{"2148} +\usv_set:nnn {bbit}{j}{"2149} +\usv_set:nnn {scr}{B}{"212C} +\usv_set:nnn {scr}{E}{"2130} +\usv_set:nnn {scr}{F}{"2131} +\usv_set:nnn {scr}{H}{"210B} +\usv_set:nnn {scr}{I}{"2110} +\usv_set:nnn {scr}{L}{"2112} +\usv_set:nnn {scr}{M}{"2133} +\usv_set:nnn {scr}{R}{"211B} +\usv_set:nnn {scr}{e}{"212F} +\usv_set:nnn {scr}{g}{"210A} +\usv_set:nnn {scr}{o}{"2134} +\usv_set:nnn {cal}{B}{"212C} +\usv_set:nnn {cal}{E}{"2130} +\usv_set:nnn {cal}{F}{"2131} +\usv_set:nnn {cal}{H}{"210B} +\usv_set:nnn {cal}{I}{"2110} +\usv_set:nnn {cal}{L}{"2112} +\usv_set:nnn {cal}{M}{"2133} +\usv_set:nnn {cal}{R}{"211B} +\usv_set:nnn {frak}{C}{"212D} +\usv_set:nnn {frak}{H}{"210C} +\usv_set:nnn {frak}{I}{"2111} +\usv_set:nnn {frak}{R}{"211C} +\usv_set:nnn {frak}{Z}{"2128} +\tl_map_inline:nn { + \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes + \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@ + \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion + \version@list\version@elt\alpha@list\alpha@elt + \restore@mathversion\init@restore@version\dorestore@version\process@table + \new@mathversion\DeclareSymbolFont\group@list\group@elt + \new@symbolfont\SetSymbolFont\SetSymbolFont@\get@cdp + \DeclareMathAlphabet\new@mathalphabet\SetMathAlphabet\SetMathAlphabet@ + \DeclareMathAccent\set@mathaccent\DeclareMathSymbol\set@mathchar + \set@mathsymbol\DeclareMathDelimiter\@xxDeclareMathDelimiter + \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter + \set@@mathdelimiter\DeclareMathRadical\mathchar@type + \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ +}{ + \tl_remove_once:Nn \@preamblecmds {\do#1} +} +\def\new@mathgroup{\alloc@8\mathgroup\chardef\@cclvi} +\let\newfam\new@mathgroup +\cs_set:Nn \um_set_mathsymbol:nNNn { + \prg_case_tl:Nnn #3 { + \mathop { \um_set_big_operator:nnn {#1} {#2} {#4} } + \mathopen + { + \tl_if_in:NnTF \l_um_radicals_tl {#2} + { + \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} + { \um_radical:nn {#1} {#4} } + \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #4} + } + { + \um_set_delcode:nnn {#1} {#4} {#4} + \um_set_mathcode:nnn {#4} \mathopen {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathopen {#1} {#4} } + } + } + \mathclose + { + \um_set_delcode:nnn {#1} {#4} {#4} + \um_set_mathcode:nnn {#4} \mathclose {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathclose {#1} {#4} } + } + \mathaccent + { \cs_gset_protected_nopar:Npx #2 { \um_accent:Nnn #3 {#1} {#4} } } + \mathfence + { + \um_set_mathcode:nnn {#4} {#3} {#1} + \um_set_delcode:nnn {#1} {#4} {#4} + \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} + { \um_delimiter:Nnn \mathopen {#1} {#4} } + \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} + { \um_delimiter:Nnn \mathclose {#1} {#4} } + } + }{ + \um_set_mathcode:nnn {#4} {#3} {#1} + } +} +\edef\mathfence{\string\mathfence} +\edef\mathover{\string\mathover} +\edef\mathunder{\string\mathunder} +\cs_new:Nn \um_set_big_operator:nnn { + \group_begin: + \char_set_catcode_active:n {#3} + \char_gmake_mathactive:n {#3} + \um_active_char_set:wc #3 \q_nil { \cs_to_str:N #2 _sym } + \group_end: + \um_set_mathchar:cNnn {\cs_to_str:N #2 op} \mathop {#1} {#3} + \cs_gset:cpx { \cs_to_str:N #2 _sym } { + \exp_not:c { \cs_to_str:N #2 op } + \exp_not:n { \tl_if_in:NnT \l_um_nolimits_tl {#2} \nolimits } + } +} +\cs_set:Npn \um_set_mathcode:nnnn #1#2#3#4 { + \Umathcode \int_eval:n {#1} = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: +} +\cs_set:Npn \um_set_mathcode:nnn #1#2#3 { + \Umathcode \int_eval:n {#1} = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#1} \scan_stop: +} +\cs_set:Npn \um_set_mathchar:NNnn #1#2#3#4 { + \Umathchardef #1 = + \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: +} +\cs_new:Nn \um_set_delcode:nnn { + \Udelcode#2 = \csname sym#1\endcsname #3 +} +\cs_new:Nn \um_radical:nn { + \Uradical \csname sym#1\endcsname #2 \scan_stop: +} +\cs_new:Nn \um_delimiter:Nnn { + \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: +} +\cs_new:Nn \um_accent:Nnn + { + \Umathaccent \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: + } +\cs_generate_variant:Nn \um_set_mathchar:NNnn {c} +\cs_set:Npn \um_overbrace:nnn #1#2#3 { + \luatexUdelimiterover \csname sym#1\endcsname #2 {#3} +} +\cs_set:Npn \um_underbrace:nnn #1#2#3 { + \luatexUdelimiterunder \csname sym#1\endcsname #2 {#3} +} +\cs_new:Nn \char_gmake_mathactive:N { + \global\mathcode `#1 = "8000 \scan_stop: +} +\cs_new:Nn \char_gmake_mathactive:n { + \global\mathcode #1 = "8000 \scan_stop: +} +\cs_new_eq:NN \um_saved_ltxe_glb_settings: \glb@settings +\CheckCommand * \glb@settings { + \expandafter\ifx\csname S@\f@size\endcsname\relax + \calculate@math@sizes + \fi + \csname S@\f@size\endcsname + \ifmath@fonts + \begingroup + \escapechar\m@ne + \csname mv@\math@version \endcsname + \globaldefs\@ne + \math@fonts + \let \glb@currsize \f@size + \endgroup + \the\every@math@size + \fi +} +\cs_set_protected_nopar:Npn \glb@settings { + \msg_error:nn { unicode-math } { no-font-selected } +} +\cs_new:Nn \um_init: { + \bool_set_true:N \l_um_ot_math_bool + \let\glb@currsize\relax + \cs_set_eq:NN \glb@settings \um_saved_ltxe_glb_settings: + \bool_set_true:N \l_um_init_bool + \seq_clear:N \l_um_char_range_seq + \clist_clear:N \l_um_char_num_range_clist + \seq_clear:N \l_um_mathalph_seq + \seq_clear:N \l_um_missing_alph_seq + \tl_set:Nn \l_um_mversion_tl {normal} + \tl_set:Nn \um_symfont_tl {operators} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_noparse:nNN + \tl_set:Nn \l_um_script_features_tl {Style=MathScript} + \tl_set:Nn \l_um_sscript_features_tl {Style=MathScriptScript} + \tl_set_eq:NN \l_um_script_font_tl \l_um_fontname_tl + \tl_set_eq:NN \l_um_sscript_font_tl \l_um_fontname_tl +} +\DeclareDocumentCommand \setmathfont { O{} m } { + \tl_set:Nn \l_um_fontname_tl {#2} + \um_init: + \cs_if_exist:cF { S@ \f@size } { \calculate@math@sizes } + \csname S@\f@size\endcsname + \keys_set_known:nnN {unicode-math} {#1} \l_um_unknown_keys_clist + \bool_if:NT \l_um_init_bool { \um_log:n {default-math-font} } + \um_fontspec_select_font: + \cs_if_exist:cF { sym \um_symfont_tl } + { + \DeclareSymbolFont{\um_symfont_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } + \SetSymbolFont{\um_symfont_tl}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + \bool_if:nT {\l_um_ot_math_bool && !\g_um_mainfont_already_set_bool} { + \bool_set_true:N \g_um_mainfont_already_set_bool + \um_declare_math_sizes: + \um_setup_legacy_fam_two: + \um_setup_legacy_fam_three: + } + \um_input_math_symbol_table: + \um_remap_symbols: + \um_setup_mathactives: + \um_setup_accents: + \um_setup_delcodes: + \um_setup_alphabets: + \ignorespaces +} +\cs_new:Nn \um_declare_math_sizes: + { + \dim_compare:nF { \fontdimen 10 \l_um_font == 0pt } + { + \DeclareMathSizes { \f@size } { \f@size } + { \um_fontdimen_to_scale:nn {10} {\l_um_font} } + { \um_fontdimen_to_scale:nn {11} {\l_um_font} } + } + } +\cs_new:Nn \um_setup_legacy_fam_two: + { + \fontspec_set_family:Nxn \l_um_family_tl + { + \l_um_font_keyval_tl, + Scale=1.00001, + FontAdjustment={ + \fontdimen8\font= \um_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax + \fontdimen9\font= \um_get_fontparam:nn {42} {FractionNumeratorShiftUp}\relax + \fontdimen10\font=\um_get_fontparam:nn {32} {StackTopShiftUp}\relax + \fontdimen11\font=\um_get_fontparam:nn {45} {FractionDenominatorDisplayStyleShiftDown}\relax + \fontdimen12\font=\um_get_fontparam:nn {44} {FractionDenominatorShiftDown}\relax + \fontdimen13\font=\um_get_fontparam:nn {21} {SuperscriptShiftUp}\relax + \fontdimen14\font=\um_get_fontparam:nn {21} {SuperscriptShiftUp}\relax + \fontdimen15\font=\um_get_fontparam:nn {22} {SuperscriptShiftUpCramped}\relax + \fontdimen16\font=\um_get_fontparam:nn {18} {SubscriptShiftDown}\relax + \fontdimen17\font=\um_get_fontparam:nn {18} {SubscriptShiftDownWithSuperscript}\relax + \fontdimen18\font=\um_get_fontparam:nn {24} {SuperscriptBaselineDropMax}\relax + \fontdimen19\font=\um_get_fontparam:nn {20} {SubscriptBaselineDropMin}\relax + \fontdimen20\font=0pt\relax % delim1 = FractionDelimiterDisplaySize + \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize + \fontdimen22\font=\um_get_fontparam:nn {15} {AxisHeight}\relax + } + } {\l_um_fontname_tl} + \SetSymbolFont{symbols}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } +\cs_new:Nn \um_setup_legacy_fam_three: + { + \fontspec_set_family:Nxn \l_um_family_tl + { + \l_um_font_keyval_tl, + Scale=0.99999, + FontAdjustment={ + \fontdimen8\font= \um_get_fontparam:nn {48} {FractionRuleThickness}\relax + \fontdimen9\font= \um_get_fontparam:nn {28} {UpperLimitGapMin}\relax + \fontdimen10\font=\um_get_fontparam:nn {30} {LowerLimitGapMin}\relax + \fontdimen11\font=\um_get_fontparam:nn {29} {UpperLimitBaselineRiseMin}\relax + \fontdimen12\font=\um_get_fontparam:nn {31} {LowerLimitBaselineDropMin}\relax + \fontdimen13\font=0pt\relax + } + } {\l_um_fontname_tl} + \SetSymbolFont{largesymbols}{\l_um_mversion_tl} + {\encodingdefault}{\l_um_family_tl}{\mddefault}{\updefault} + } +\cs_new:Nn \um_get_fontparam:nn + { \the\fontdimen#1\l_um_font\relax } +\DeclareDocumentCommand \resetmathfont { O{} m } { + \bool_set_false:N \g_um_mainfont_already_set_bool + \setmathfont[#1]{#2} +} +\cs_new:Nn \um_fontspec_select_font: { + \tl_set:Nx \l_um_font_keyval_tl { + BoldFont = {}, ItalicFont = {}, + Script = Math, + SizeFeatures = { + {Size = \tf@size-} , + {Size = \sf@size-\tf@size , + Font = \l_um_script_font_tl , + \l_um_script_features_tl + } , + {Size = -\sf@size , + Font = \l_um_sscript_font_tl , + \l_um_sscript_features_tl + } + }, + \l_um_unknown_keys_clist + } + \fontspec_set_fontface:NNxn \l_um_font \l_um_family_tl + {\l_um_font_keyval_tl} {\l_um_fontname_tl} + \group_begin: + \fontfamily{\l_um_family_tl}\selectfont + \fontspec_if_script:nF {math} {\bool_gset_false:N \l_um_ot_math_bool} + \group_end: +} +\cs_set:Npn \um_process_symbol_noparse:nnn #1#2#3 { + \um_set_mathsymbol:nNNn {\um_symfont_tl} #2#3{#1} +} +\cs_set:Npn \um_process_symbol_parse:nnn #1#2#3 { + \um_if_char_spec:nNNT{#1}{#2}{#3}{ + \um_process_symbol_noparse:nnn {#1}{#2}{#3} + } +} +\cs_new:Npn \um_remap_symbols: { + \um_remap_symbol:nnn{`\-}{\mathbin}{"02212}% hyphen to minus + \um_remap_symbol:nnn{`\*}{\mathbin}{"02217}% text asterisk to "centred asterisk" + \bool_if:NF \g_um_literal_colon_bool { + \um_remap_symbol:nnn{`\:}{\mathrel}{"02236}% colon to ratio (i.e., punct to rel) + } +} +\cs_new:Nn \um_remap_symbol_parse:nnn { + \um_if_char_spec:nNNT {#3} {\@nil} {#2} { + \um_remap_symbol_noparse:nnn {#1} {#2} {#3} + } +} +\cs_new:Nn \um_remap_symbol_noparse:nnn { + \clist_map_inline:nn {#1} { + \um_set_mathcode:nnnn {##1} {#2} {\um_symfont_tl} {#3} + } +} +\cs_new:Npn \um_setup_mathactives: { + \um_make_mathactive:nNN {"2032} \um_prime_single_mchar \mathord + \um_make_mathactive:nNN {"2033} \um_prime_double_mchar \mathord + \um_make_mathactive:nNN {"2034} \um_prime_triple_mchar \mathord + \um_make_mathactive:nNN {"2057} \um_prime_quad_mchar \mathord + \um_make_mathactive:nNN {"2035} \um_backprime_single_mchar \mathord + \um_make_mathactive:nNN {"2036} \um_backprime_double_mchar \mathord + \um_make_mathactive:nNN {"2037} \um_backprime_triple_mchar \mathord + \um_make_mathactive:nNN {`\'} \mathstraightquote \mathord + \um_make_mathactive:nNN {`\`} \mathbacktick \mathord +} +\cs_new:Nn \um_make_mathactive_parse:nNN + { + \um_if_char_spec:nNNT {#1} #2 #3 + { \um_make_mathactive_noparse:nNN {#1} #2 #3 } + } +\cs_new:Nn \um_make_mathactive_noparse:nNN + { + \um_set_mathchar:NNnn #2 #3 {\um_symfont_tl} {#1} + \char_gmake_mathactive:n {#1} + } +\cs_new:Nn \um_assign_delcode_noparse:nn { + \um_set_delcode:nnn \um_symfont_tl {#1} {#2} +} +\cs_new:Nn \um_assign_delcode_parse:nn { + \um_if_char_spec:nNNT {#2}{\@nil}{\@nil} { + \um_assign_delcode_noparse:nn {#1} {#2} + } +} +\cs_new:Nn \um_assign_delcode:n { \um_assign_delcode:nn {#1} {#1} } +\cs_new:Npn \um_setup_delcodes: { + \um_assign_delcode:nn {`\/} {\g_um_slash_delimiter_usv} + \um_assign_delcode:nn {"2044} {\g_um_slash_delimiter_usv} % fracslash + \um_assign_delcode:nn {"2215} {\g_um_slash_delimiter_usv} % divslash + \um_assign_delcode:n {"005C} % backslash + \um_assign_delcode:nn {`\<} {"27E8} % angle brackets with ascii notation + \um_assign_delcode:nn {`\>} {"27E9} % angle brackets with ascii notation + \um_assign_delcode:n {"2191} % up arrow + \um_assign_delcode:n {"2193} % down arrow + \um_assign_delcode:n {"2195} % updown arrow + \um_assign_delcode:n {"219F} % up arrow twohead + \um_assign_delcode:n {"21A1} % down arrow twohead + \um_assign_delcode:n {"21A5} % up arrow from bar + \um_assign_delcode:n {"21A7} % down arrow from bar + \um_assign_delcode:n {"21A8} % updown arrow from bar + \um_assign_delcode:n {"21BE} % up harpoon right + \um_assign_delcode:n {"21BF} % up harpoon left + \um_assign_delcode:n {"21C2} % down harpoon right + \um_assign_delcode:n {"21C3} % down harpoon left + \um_assign_delcode:n {"21C5} % arrows up down + \um_assign_delcode:n {"21F5} % arrows down up + \um_assign_delcode:n {"21C8} % arrows up up + \um_assign_delcode:n {"21CA} % arrows down down + \um_assign_delcode:n {"21D1} % double up arrow + \um_assign_delcode:n {"21D3} % double down arrow + \um_assign_delcode:n {"21D5} % double updown arrow + \um_assign_delcode:n {"21DE} % up arrow double stroke + \um_assign_delcode:n {"21DF} % down arrow double stroke + \um_assign_delcode:n {"21E1} % up arrow dashed + \um_assign_delcode:n {"21E3} % down arrow dashed + \um_assign_delcode:n {"21E7} % up white arrow + \um_assign_delcode:n {"21E9} % down white arrow + \um_assign_delcode:n {"21EA} % up white arrow from bar + \um_assign_delcode:n {"21F3} % updown white arrow +} +\tl_new:N \l_um_nolimits_tl +\tl_set:Nn \l_um_nolimits_tl { + \int\iint\iiint\iiiint\oint\oiint\oiiint + \intclockwise\varointclockwise\ointctrclockwise\sumint + \intbar\intBar\fint\cirfnint\awint\rppolint + \scpolint\npolint\pointint\sqint\intlarhk\intx + \intcap\intcup\upint\lowint +} +\DeclareDocumentCommand \addnolimits {m} { + \tl_put_right:Nn \l_um_nolimits_tl {#1} +} +\DeclareDocumentCommand \removenolimits {m} { + \tl_remove_all:Nn \l_um_nolimits_tl {#1} +} +\tl_new:N \l_um_radicals_tl +\tl_set:Nn \l_um_radicals_tl {\sqrt} +\cs_new_protected_nopar:Nn \um_new_cramped_style:N + { \quark_new:N #1 } +\um_new_cramped_style:N \crampeddisplaystyle +\um_new_cramped_style:N \crampedtextstyle +\um_new_cramped_style:N \crampedscriptstyle +\um_new_cramped_style:N \crampedscriptscriptstyle + \cs_new_nopar:Npn \um_font_dimen:Nnnnn #1 #2 #3 #4 #5 { + \fontdimen + \cs_if_eq:NNTF #1 \displaystyle { + #2 \textfont + } { + \cs_if_eq:NNTF #1 \crampeddisplaystyle { + #3 \textfont + } { + \cs_if_eq:NNTF #1 \textstyle { + #4 \textfont + } { + \cs_if_eq:NNTF #1 \crampedtextstyle { + #5 \textfont + } { + \cs_if_eq:NNTF #1 \scriptstyle { + #4 \scriptfont + } { + \cs_if_eq:NNTF #1 \crampedscriptstyle { + #5 \scriptfont + } { + \cs_if_eq:NNTF #1 \scriptscriptstyle { + #4 \scriptscriptfont + } { + #5 \scriptscriptfont + } + } + } + } + } + } + } + \c_two + } +\cs_new_protected_nopar:Nn \um_font_param:nnnnn +{ + \um_font_param_aux:ccnnnn { um_ #1 :N } { um_set_ #1 :N } + { #2 } { #3 } { #4 } { #5 } +} +\cs_new_protected_nopar:Npn \um_font_param:nnn #1 #2 #3 { + \um_font_param:nnnnn { #1 } { #2 } { #2 } { #3 } { #3 } +} +\cs_new_protected_nopar:Npn \um_font_param:nn #1 #2 { + \um_font_param:nnnnn { #1 } { #2 } { #2 } { #2 } { #2 } +} +\cs_new_protected_nopar:Nn \um_font_param:n + { } +\cs_new_protected_nopar:Nn \um_font_param_aux:NNnnnn + { + \cs_new_nopar:Npn #1 ##1 { + \um_font_dimen:Nnnnn ##1 { #3 } { #4 } { #5 } { #6 } + } + \cs_new_protected_nopar:Npn #2 ##1 ##2 { + #1 ##1 \dim_eval:n { ##2 } + } + } +\cs_generate_variant:Nn \um_font_param_aux:NNnnnn { cc } +\um_font_param:nn { axis } { 15 } +\um_font_param:nn { operator_size } { 13 } +\um_font_param:n { fraction_del_size } +\um_font_param:nnn { fraction_denom_down } { 45 } { 44 } +\um_font_param:nnn { fraction_denom_vgap } { 50 } { 49 } +\um_font_param:nnn { fraction_num_up } { 43 } { 42 } +\um_font_param:nnn { fraction_num_vgap } { 47 } { 46 } +\um_font_param:nn { fraction_rule } { 48 } +\um_font_param:nn { limit_above_bgap } { 29 } +\um_font_param:n { limit_above_kern } +\um_font_param:nn { limit_above_vgap } { 28 } +\um_font_param:nn { limit_below_bgap } { 31 } +\um_font_param:n { limit_below_kern } +\um_font_param:nn { limit_below_vgap } { 30 } +\um_font_param:nn { over_delimiter_vgap } { 41 } +\um_font_param:nn { over_delimiter_bgap } { 38 } +\um_font_param:nn { under_delimiter_vgap } { 40 } +\um_font_param:nn { under_delimiter_bgap } { 39 } +\um_font_param:nn { overbar_kern } { 55 } +\um_font_param:nn { overbar_rule } { 54 } +\um_font_param:nn { overbar_vgap } { 53 } +\um_font_param:n { quad } +\um_font_param:nn { radical_kern } { 62 } +\um_font_param:nn { radical_rule } { 61 } +\um_font_param:nnn { radical_vgap } { 60 } { 59 } +\um_font_param:nn { radical_degree_before } { 63 } +\um_font_param:nn { radical_degree_after } { 64 } +\um_font_param:nn { radical_degree_raise } { 65 } +\um_font_param:nn { space_after_script } { 27 } +\um_font_param:nnn { stack_denom_down } { 35 } { 34 } +\um_font_param:nnn { stack_num_up } { 33 } { 32 } +\um_font_param:nnn { stack_vgap } { 37 } { 36 } +\um_font_param:nn { sub_shift_down } { 18 } +\um_font_param:nn { sub_shift_drop } { 20 } +\um_font_param:n { subsup_shift_down } +\um_font_param:nn { sub_top_max } { 19 } +\um_font_param:nn { subsup_vgap } { 25 } +\um_font_param:nn { sup_bottom_min } { 23 } +\um_font_param:nn { sup_shift_drop } { 24 } +\um_font_param:nnnnn { sup_shift_up } { 21 } { 22 } { 21 } { 22 } +\um_font_param:nn { supsub_bottom_max } { 26 } +\um_font_param:nn { underbar_kern } { 58 } +\um_font_param:nn { underbar_rule } { 57 } +\um_font_param:nn { underbar_vgap } { 56 } +\um_font_param:n { connector_overlap_min } +\def\new@mathversion#1{% + \expandafter\in@\expandafter#1\expandafter{\version@list}% + \ifin@ + \@font@info{Redeclaring math version + `\expandafter\@gobblefour\string#1'}% + \else + \expandafter\newcount\csname c@\expandafter + \@gobble\string#1\endcsname + \def\version@elt{\noexpand\version@elt\noexpand}% + \edef\version@list{\version@list\version@elt#1}% + \fi + \toks@{}% + \count@\z@ + \def\group@elt##1##2{% + \advance\count@\@ne + \addto@hook\toks@{\getanddefine@fonts##1##2}% + }% + \group@list + \global\csname c@\expandafter\@gobble\string#1\endcsname\count@ + \def\alpha@elt##1##2##3{% + \ifx##2\no@alphabet@error + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\no@alphabet@error##1}}% + \else + \toks@\expandafter{\the\toks@\install@mathalphabet##1% + {\select@group##1##2##3}}% + \fi + }% + \alpha@list + \xdef#1{\the\toks@}% +} +\keys_define:nn {unicode-math} + { + version .code:n = + { + \tl_set:Nn \l_um_mversion_tl {#1} + \DeclareMathVersion{\l_um_mversion_tl} + } + } +\keys_define:nn {unicode-math} +{ + script-features .tl_set:N = \l_um_script_features_tl , + sscript-features .tl_set:N = \l_um_sscript_features_tl , + script-font .tl_set:N = \l_um_script_font_tl , + sscript-font .tl_set:N = \l_um_sscript_font_tl , +} +\seq_new:N \l_um_mathalph_seq +\seq_new:N \l_um_char_range_seq +\seq_new:N \l_um_mclass_range_seq +\seq_new:N \l_um_cmd_range_seq +\keys_define:nn {unicode-math} { + range .code:n = { + \bool_set_false:N \l_um_init_bool + \int_incr:N \g_um_fam_int + \tl_set:Nx \um_symfont_tl {um_fam\int_use:N\g_um_fam_int} + \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_parse:nnn + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_parse:Nnn + \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_parse:nnn + \cs_set_eq:NN \um_maybe_init_alphabet:n \use_none:n + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_parse:nn + \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_parse:nn + \cs_set_eq:NN \um_make_mathactive:nNN \um_make_mathactive_parse:nNN + \seq_clear:N \l_um_char_range_seq + \seq_clear:N \l_um_mclass_range_seq + \seq_clear:N \l_um_cmd_range_seq + \seq_clear:N \l_um_mathalph_seq + \clist_map_inline:nn {#1} { + \um_if_mathalph_decl:nTF {##1} { + \seq_put_right:Nx \l_um_mathalph_seq { + { \exp_not:V \l_um_tmpa_tl } + { \exp_not:V \l_um_tmpb_tl } + { \exp_not:V \l_um_tmpc_tl } + } + }{ + \seq_if_in:NnTF \g_um_mathclasses_seq {##1} + { \seq_put_right:Nn \l_um_mclass_range_seq {##1} } + { + \bool_if:nTF { \tl_if_single_p:n {##1} && \token_if_cs_p:N ##1 } + { \seq_put_right:Nn \l_um_cmd_range_seq {##1} } + { \seq_put_right:Nn \l_um_char_range_seq {##1} } + } + } + } + } +} +\seq_new:N \g_um_mathclasses_seq +\seq_set_from_clist:Nn \g_um_mathclasses_seq + { + \mathord,\mathalpha,\mathop,\mathbin,\mathrel, + \mathopen,\mathclose,\mathpunct,\mathaccent, + \mathfence,\mathover,\mathunder + } +\prg_new_conditional:Nnn \um_if_mathalph_decl:n {TF} { + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {#1} } + \tl_clear:N \l_um_tmpb_tl + \tl_clear:N \l_um_tmpc_tl + \tl_if_in:NnT \l_um_tmpa_tl {->} { + \exp_after:wN \um_split_arrow:w \l_um_tmpa_tl \q_nil + } + \tl_if_in:NnT \l_um_tmpa_tl {/} { + \exp_after:wN \um_split_slash:w \l_um_tmpa_tl \q_nil + } + \tl_if_empty:NT \l_um_tmpc_tl { \tl_set_eq:NN \l_um_tmpc_tl \l_um_tmpa_tl } + \seq_if_in:NVTF \g_um_mathstyles_seq \l_um_tmpa_tl { + \prg_return_true: + }{ + \prg_return_false: + } +} +\cs_set:Npn \um_split_arrow:w #1->#2 \q_nil { + \tl_set:Nn \l_um_tmpa_tl {#1} + \tl_if_single:nTF {#2} + { \tl_set:Nn \l_um_tmpc_tl {#2} } + { \exp_args:NNc \tl_set:Nn \l_um_tmpc_tl {math#2} } +} +\cs_set:Npn \um_split_slash:w #1/#2 \q_nil { + \tl_set:Nn \l_um_tmpa_tl {#1} + \tl_set:Nn \l_um_tmpb_tl {#2} +} +\cs_new:Nn \um_if_char_spec:nNNT + { + + % math class: + \seq_if_in:NnT \l_um_mclass_range_seq {#3} + { \use_none_delimit_by_q_nil:w } + + % command name: + \seq_if_in:NnT \l_um_cmd_range_seq {#2} + { \use_none_delimit_by_q_nil:w } + + % character slot: + \seq_map_inline:Nn \l_um_char_range_seq + { + \um_int_if_range_matches_slot:nnT {##1} {#1} + { \seq_map_break:n { \use_none_delimit_by_q_nil:w } } + } + + % this executes if no match was found: + \use_none:nnn + \q_nil + \use:n + { + \clist_put_right:Nx \l_um_char_num_range_clist { \int_eval:n {#1} } + #4 + } + } +\cs_new:Nn \um_int_if_range_matches_slot:nnT + { \um_numrange_parse:nwT {#1} #2 - \q_nil - \q_stop {#3} } +\cs_set:Npn \um_numrange_parse:nwT #1 #2 - #3 - #4 \q_stop #5 + { + \tl_if_empty:nTF {#4} { \int_compare:nT {#1=#2} {#5} } + { + \tl_if_empty:nTF {#3} { \int_compare:nT {#1>=#2} {#5} } + { + \tl_if_empty:nTF {#2} { \int_compare:nT {#1<=#3} {#5} } + { + \int_compare:nT {#1>=#2} { \int_compare:nT {#1<=#3} {#5} } + } } } + } +\AtBeginDocument{\um_resolve_greek:} +\cs_new:Npn \um_resolve_greek: { + \clist_map_inline:nn { + Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda, + alpha,beta,gamma,delta, zeta,eta,theta,iota,kappa,lambda, + Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega, + mu,nu,xi,omicron,pi,rho,sigma,tau,upsilon, chi,psi,omega, + varTheta, + varsigma,vartheta,varkappa,varrho,varpi + }{ + \tl_set:cx {##1} { \exp_not:c { mit ##1 } } + } + \tl_set:Nn \epsilon { + \bool_if:NTF \g_um_texgreek_bool \mitvarepsilon \mitepsilon + } + \tl_set:Nn \phi { + \bool_if:NTF \g_um_texgreek_bool \mitvarphi \mitphi + } + \tl_set:Nn \varepsilon { + \bool_if:NTF \g_um_texgreek_bool \mitepsilon \mitvarepsilon + } + \tl_set:Nn \varphi { + \bool_if:NTF \g_um_texgreek_bool \mitphi \mitvarphi + } +} +\cs_new:Nn \um_new_mathstyle:N { + \um_prepare_mathstyle:f {\exp_after:wN \use_none:nnnnn \token_to_str:N #1} + \seq_put_right:Nn \g_um_mathstyles_seq {#1} +} +\seq_new:N \g_um_default_mathalph_seq +\seq_new:N \g_um_mathstyles_seq +\AtEndOfPackage{ +\clist_map_inline:nn { + {\mathup } {latin,Latin,greek,Greek,num,misc} {\mathup } , + {\mathit } {latin,Latin,greek,Greek,misc} {\mathit } , + {\mathbb } {latin,Latin,num,misc} {\mathbb } , + {\mathbbit } {misc} {\mathbbit } , + {\mathscr } {latin,Latin} {\mathscr } , + {\mathcal } {Latin} {\mathscr } , + {\mathbfcal } {Latin} {\mathbfscr } , + {\mathfrak } {latin,Latin} {\mathfrak } , + {\mathtt } {latin,Latin,num} {\mathtt } , + {\mathsfup } {latin,Latin,num} {\mathsfup } , + {\mathsfit } {latin,Latin} {\mathsfit } , + {\mathbfup } {latin,Latin,greek,Greek,num,misc} {\mathbfup } , + {\mathbfit } {latin,Latin,greek,Greek,misc} {\mathbfit } , + {\mathbfscr } {latin,Latin} {\mathbfscr } , + {\mathbffrak} {latin,Latin} {\mathbffrak} , + {\mathbfsfup} {latin,Latin,greek,Greek,num,misc} {\mathbfsfup} , + {\mathbfsfit} {latin,Latin,greek,Greek,misc} {\mathbfsfit} +}{ + \seq_put_right:Nn \g_um_default_mathalph_seq {#1} + \exp_after:wN \um_new_mathstyle:N \use_i:nnn #1 +} +\um_new_mathstyle:N \mathsf +\um_new_mathstyle:N \mathbf +\um_new_mathstyle:N \mathbfsf +} +\cs_new:Nn \um_prepare_mathstyle:n { + \um_init_alphabet:x {#1} + \cs_set:cpn {_um_math#1_aux:n} ##1 { + \use:c {um_switchto_math#1:} ##1 \egroup + } + \cs_set_protected:cpx {math#1} { + \exp_not:n{ + \bgroup + \mode_if_math:F + { + \egroup\expandafter + \non@alpherr\expandafter{\csname math#1\endcsname\space} + } + \tl_set:Nn \l_um_mathstyle_tl {#1} + } + \exp_not:c {_um_math#1_aux:n} + } +} +\tl_new:N \l_um_mathstyle_tl +\cs_generate_variant:Nn \um_prepare_mathstyle:n {f} +\cs_set:Npn \um_init_alphabet:n #1 { + \um_log:nx {alph-initialise} {#1} + \cs_set_eq:cN {um_switchto_math#1:} \prg_do_nothing: +} +\cs_generate_variant:Nn \um_init_alphabet:n {x} +\cs_new:Npn \um_maybe_init_alphabet:V { + \exp_args:NV \um_maybe_init_alphabet:n +} +\seq_new:N \l_um_missing_alph_seq +\cs_new:Npn \um_setup_alphabets: { + \seq_if_empty:NTF \l_um_mathalph_seq { + \um_log:n {setup-implicit} + \seq_set_eq:NN \l_um_mathalph_seq \g_um_default_mathalph_seq + \bool_set_true:N \l_um_implicit_alph_bool + \um_maybe_init_alphabet:n {sf} + \um_maybe_init_alphabet:n {bf} + \um_maybe_init_alphabet:n {bfsf} + } + { + \um_log:n {setup-explicit} + \bool_set_false:N \l_um_implicit_alph_bool + \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn + \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn + } + \seq_map_inline:Nn \l_um_mathalph_seq { + \tl_set:No \l_um_tmpa_tl { \use_i:nnn ##1 } + \tl_set:No \l_um_tmpb_tl { \use_ii:nnn ##1 } + \tl_set:No \l_um_remap_style_tl { \use_iii:nnn ##1 } + \tl_set:Nx \l_um_remap_style_tl { + \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nnnnn + \exp_after:wN \token_to_str:N \l_um_remap_style_tl + } + \tl_if_empty:NT \l_um_tmpb_tl { + \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n + \tl_set:Nn \l_um_tmpb_tl { latin,Latin,greek,Greek,num,misc } + } + \um_setup_math_alphabet:VVV + \l_um_tmpa_tl \l_um_tmpb_tl \l_um_remap_style_tl + } + \seq_if_empty:NF \l_um_missing_alph_seq { \um_log:n { missing-alphabets } } +} +\cs_new:Nn \um_setup_math_alphabet:Nnn { + \tl_set:Nx \l_um_style_tl { + \exp_after:wN \use_none:nnnnn \token_to_str:N #1 + } + \clist_map_inline:nn {#2} { + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } + \cs_if_exist:cT {um_config_ \l_um_style_tl _\l_um_tmpa_tl :n} { + \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { + \um_maybe_init_alphabet:V \l_um_style_tl + \clist_map_break: + }{ + \um_glyph_if_exist:cT { \um_to_usv:nn {#3}{\l_um_tmpa_tl} }{ + \um_maybe_init_alphabet:V \l_um_style_tl + \clist_map_break: + } + } + } + } + \clist_map_inline:nn {#2} { + \tl_set:Nx \l_um_tmpa_tl { \tl_trim_spaces:n {##1} } + \cs_if_exist:cT {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} { + \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { + \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} + \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} + }{ + \um_glyph_if_exist:cTF { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } { + \um_log:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} + \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} + }{ + \bool_if:NTF \l_um_implicit_alph_bool { + \seq_put_right:Nx \l_um_missing_alph_seq { + \@backslashchar math \l_um_style_tl \space + (\tl_use:c{c_um_math_alphabet_name_ \l_um_tmpa_tl _tl}) + } + }{ + \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {up} + } + } + } + } + } +} +\cs_generate_variant:Nn \um_setup_math_alphabet:Nnn {VVV} +\cs_new:Npn \um_map_char_single:cc { \exp_args:Ncc \um_map_char_single:nn } +\cs_new:Nn \um_map_char_noparse:nn { + \um_set_mathcode:nnnn {#1}{\mathalpha}{\um_symfont_tl}{#2} +} +\cs_new:Nn \um_map_char_parse:nn { + \um_if_char_spec:nNNT {#1} {\@nil} {\mathalpha} { + \um_map_char_noparse:nn {#1}{#2} + } +} +\cs_new:Nn \um_map_char_single:nnn { + \um_map_char_single:cc { \um_to_usv:nn {#1}{#3} } + { \um_to_usv:nn {#2}{#3} } +} +\cs_set:Npn \um_map_single:nnn #1#2#3 { + \cs_if_exist:cT { \um_to_usv:nn {#3} {#1} } + { + \clist_map_inline:nn {#2} { + \um_map_char_single:nnn {##1} {#3} {#1} + } + } +} +\cs_set:Npn \um_map_chars_range:nnn #1#2#3 { + \prg_stepwise_inline:nnnn {0}{1}{#1-1} { + \um_map_char_single:nn {#2+##1}{#3+##1} + } +} +\cs_generate_variant:Nn \um_map_chars_range:nnn {ncc} +\cs_new:Nn \um_map_chars_range:nnnn { + \um_map_chars_range:ncc {#1} { \um_to_usv:nn {#2}{#4} } + { \um_to_usv:nn {#3}{#4} } +} +\cs_new:Nn \um_map_chars_Latin:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {26} {##1} {#2} {Latin} + } +} +\cs_new:Nn \um_map_chars_latin:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {26} {##1} {#2} {latin} + } +} +\cs_new:Nn \um_map_chars_greek:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {25} {##1} {#2} {greek} + \um_map_char_single:nnn {##1} {#2} {varepsilon} + \um_map_char_single:nnn {##1} {#2} {vartheta} + \um_map_char_single:nnn {##1} {#2} {varkappa} + \um_map_char_single:nnn {##1} {#2} {varphi} + \um_map_char_single:nnn {##1} {#2} {varrho} + \um_map_char_single:nnn {##1} {#2} {varpi} + } +} +\cs_new:Nn \um_map_chars_Greek:nn { + \clist_map_inline:nn {#1} { + \um_map_chars_range:nnnn {25} {##1} {#2} {Greek} + \um_map_char_single:nnn {##1} {#2} {varTheta} + } +} +\cs_new:Nn \um_map_chars_numbers:nn { + \um_map_chars_range:nnnn {10} {#1} {#2} {num} +} +\cs_new:Npn \um_set_mathalphabet_char:Ncc { + \exp_args:NNcc \um_set_mathalphabet_char:Nnn +} +\cs_new:Nn \um_mathmap_noparse:Nnn { + \clist_map_inline:nn {#2} { + \tl_put_right:cx {um_switchto_\cs_to_str:N #1:} { + \um_set_mathcode:nnnn{##1}{\mathalpha}{\um_symfont_tl}{#3} + } + } +} +\cs_new:Nn \um_mathmap_parse:Nnn { + \clist_if_in:NnT \l_um_char_num_range_clist {#3} { + \um_mathmap_noparse:Nnn {#1}{#2}{#3} + } +} +\cs_new:Npn \um_set_mathalphabet_char:Nnnn #1#2#3#4 { + \um_set_mathalphabet_char:Ncc #1 { \um_to_usv:nn {#2} {#4} } + { \um_to_usv:nn {#3} {#4} } +} +\cs_new:Npn \um_set_mathalph_range:nNnn #1#2#3#4 { + \prg_stepwise_inline:nnnn {0}{1}{#1-1} + { \um_set_mathalphabet_char:Nnn {#2} { ##1 + #3 } { ##1 + #4 } } +} +\cs_generate_variant:Nn \um_set_mathalph_range:nNnn {nNcc} +\cs_new:Npn \um_set_mathalph_range:nNnnn #1#2#3#4#5 { + \um_set_mathalph_range:nNcc {#1} #2 { \um_to_usv:nn {#3} {#5} } + { \um_to_usv:nn {#4} {#5} } +} +\cs_new:Npn \um_set_mathalphabet_pos:Nnnn #1#2#3#4 { + \cs_if_exist:cT { \um_to_usv:nn {#4}{#2} } { + \clist_map_inline:nn {#3} + { \um_set_mathalphabet_char:Nnnn #1 {##1} {#4} {#2} } + } +} +\cs_new:Nn \um_set_mathalphabet_numbers:Nnn { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {10} #1 {##1} {#3} {num} } +} +\cs_new:Nn \um_set_mathalphabet_Latin:Nnn { + \clist_map_inline:nn {#2} + { \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {Latin} } +} +\cs_new:Nn \um_set_mathalphabet_latin:Nnn { + \clist_map_inline:nn {#2} { + \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {latin} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {h} + } +} +\cs_new:Nn \um_set_mathalphabet_Greek:Nnn { + \clist_map_inline:nn {#2} { + \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {Greek} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varTheta} + } +} +\cs_new:Nn \um_set_mathalphabet_greek:Nnn { + \clist_map_inline:nn {#2} { + \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {greek} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varepsilon} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {vartheta} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varkappa} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varphi} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varrho} + \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varpi} + } +} +\cs_new:Nn \um_config_up_num:n { + \um_map_chars_numbers:nn {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathup {up}{#1} +} +\cs_new:Nn \um_config_up_Latin:n + { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {up} {#1} } + { + \bool_if:NT \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } + } + \um_set_mathalphabet_Latin:Nnn \mathup {up,it}{#1} +} +\cs_new:Nn \um_config_up_latin:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_latin:nn {up} {#1} } + { + \bool_if:NT \g_um_uplatin_bool { + \um_map_chars_latin:nn {up,it} {#1} + \um_map_single:nnn {h} {up,it} {#1} + \um_map_single:nnn {dotlessi} {up,it} {#1} + \um_map_single:nnn {dotlessj} {up,it} {#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathup {up,it}{#1} +} +\cs_new:Nn \um_config_up_Greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {up}{#1} } + { + \bool_if:NT \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } + } + \um_set_mathalphabet_Greek:Nnn \mathup {up,it}{#1} +} +\cs_new:Nn \um_config_up_greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {up} {#1} } + { + \bool_if:NT \g_um_upgreek_bool { + \um_map_chars_greek:nn {up,it} {#1} + } + } + \um_set_mathalphabet_greek:Nnn \mathup {up,it} {#1} +} +\cs_new:Nn \um_config_up_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{up}{up} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{up,it}{up} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{up}{up} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_map_single:nnn {partial}{up,it}{up} + } + } + \um_set_mathalphabet_pos:Nnnn \mathup {partial} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathup {Nabla} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathup {dotlessi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathup {dotlessj} {up,it} {#1} +} +\cs_new:Nn \um_config_it_Latin:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Latin:nn {it} {#1} } + { + \bool_if:NF \g_um_upLatin_bool { \um_map_chars_Latin:nn {up,it} {#1} } + } + \um_set_mathalphabet_Latin:Nnn \mathit {up,it}{#1} +} +\cs_new:Nn \um_config_it_latin:n { + \bool_if:NTF \g_um_literal_bool { + \um_map_chars_latin:nn {it} {#1} + \um_map_single:nnn {h}{it}{#1} + }{ + \bool_if:NF \g_um_uplatin_bool { + \um_map_chars_latin:nn {up,it} {#1} + \um_map_single:nnn {h}{up,it}{#1} + \um_map_single:nnn {dotlessi}{up,it}{#1} + \um_map_single:nnn {dotlessj}{up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathit {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathit {dotlessi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathit {dotlessj} {up,it} {#1} +} +\cs_new:Nn \um_config_it_Greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_Greek:nn {it}{#1} + }{ + \bool_if:NF \g_um_upGreek_bool { \um_map_chars_Greek:nn {up,it}{#1} } + } + \um_set_mathalphabet_Greek:Nnn \mathit {up,it}{#1} +} +\cs_new:Nn \um_config_it_greek:n { + \bool_if:NTF \g_um_literal_bool { \um_map_chars_greek:nn {it} {#1} } + { + \bool_if:NF \g_um_upgreek_bool { \um_map_chars_greek:nn {it,up} {#1} } + } + \um_set_mathalphabet_greek:Nnn \mathit {up,it} {#1} +} +\cs_new:Nn \um_config_it_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{it}{it} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{up,it}{it} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{it}{it} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_map_single:nnn {partial}{up,it}{it} + } + } + \um_set_mathalphabet_pos:Nnnn \mathit {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathit {Nabla} {up,it}{#1} +} +\cs_new:Nn \um_config_bb_latin:n { + \um_set_mathalphabet_latin:Nnn \mathbb {up,it}{#1} +} +\cs_new:Nn \um_config_bb_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbb {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {C} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {H} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {N} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {P} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {Q} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {R} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {Z} {up,it} {#1} +} +\cs_new:Nn \um_config_bb_num:n { + \um_set_mathalphabet_numbers:Nnn \mathbb {up}{#1} +} +\cs_new:Nn \um_config_bb_misc:n { + \um_set_mathalphabet_pos:Nnnn \mathbb {Pi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {pi} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {Gamma} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {gamma} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbb {summation} {up} {#1} +} +\cs_new:Nn \um_config_bbit_misc:n { + \um_set_mathalphabet_pos:Nnnn \mathbbit {D} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {d} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {e} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {i} {up,it} {#1} + \um_set_mathalphabet_pos:Nnnn \mathbbit {j} {up,it} {#1} +} +\cs_new:Nn \um_config_scr_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathscr {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {B}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {E}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {F}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {H}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {I}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {L}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {M}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {R}{up,it}{#1} +} +\cs_new:Nn \um_config_scr_latin:n { + \um_set_mathalphabet_latin:Nnn \mathscr {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {e}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {g}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathscr {o}{up,it}{#1} +} +\cs_new:Nn \um_config_cal_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathcal {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {B}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {E}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {F}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {H}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {I}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {L}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {M}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathcal {R}{up,it}{#1} +} +\cs_new:Nn \um_config_frak_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathfrak {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {C}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {H}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {I}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {R}{up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathfrak {Z}{up,it}{#1} +} +\cs_new:Nn \um_config_frak_latin:n { + \um_set_mathalphabet_latin:Nnn \mathfrak {up,it}{#1} +} +\cs_new:Nn \um_config_sfup_num:n { + \um_set_mathalphabet_numbers:Nnn \mathsf {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathsfup {up}{#1} +} +\cs_new:Nn \um_config_sfup_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {sfup} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_Latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathsfup {up,it}{#1} +} +\cs_new:Nn \um_config_sfup_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {sfup} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathsfup {up,it}{#1} +} +\cs_new:Nn \um_config_sfit_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {sfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_Latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathsfit {up,it}{#1} +} +\cs_new:Nn \um_config_sfit_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {sfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_latin:nn {sfup,sfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathsfit {up,it}{#1} +} +\cs_new:Nn \um_config_tt_num:n { + \um_set_mathalphabet_numbers:Nnn \mathtt {up}{#1} +} +\cs_new:Nn \um_config_tt_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathtt {up,it}{#1} +} +\cs_new:Nn \um_config_tt_latin:n { + \um_set_mathalphabet_latin:Nnn \mathtt {up,it}{#1} +} +\cs_new:Nn \um_config_bfit_Latin:n { + \bool_if:NF \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_Latin:Nnn \mathbfit {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Latin:nn {bfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {it}{#1} + }{ + \bool_if:NF \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfit_latin:n { + \bool_if:NF \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_latin:Nnn \mathbfit {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_latin:nn {bfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {it}{#1} + }{ + \bool_if:NF \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfit_Greek:n { + \um_set_mathalphabet_Greek:Nnn \mathbfit {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Greek:nn {bfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {it}{#1} + }{ + \bool_if:NF \g_um_bfupGreek_bool { + \um_map_chars_Greek:nn {bfup,bfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfit_greek:n { + \um_set_mathalphabet_greek:Nnn \mathbfit {up,it} {#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_greek:nn {bfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {it} {#1} + }{ + \bool_if:NF \g_um_bfupgreek_bool { + \um_map_chars_greek:nn {bfit,bfup} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} + } + } +} +\cs_new:Nn \um_config_bfit_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfit}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfup,bfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfit}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfup,bfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfit {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfit {Nabla} {up,it}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {it}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {it}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_num:n { + \um_set_mathalphabet_numbers:Nnn \mathbf {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathbfup {up}{#1} +} +\cs_new:Nn \um_config_bfup_Latin:n { + \bool_if:NT \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_Latin:Nnn \mathbfup {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Latin:nn {bfup} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {up}{#1} + }{ + \bool_if:NT \g_um_bfupLatin_bool { + \um_map_chars_Latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_latin:n { + \bool_if:NT \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + } + \um_set_mathalphabet_latin:Nnn \mathbfup {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_latin:nn {bfup} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {up}{#1} + }{ + \bool_if:NT \g_um_bfuplatin_bool { + \um_map_chars_latin:nn {bfup,bfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_Greek:n { + \um_set_mathalphabet_Greek:Nnn \mathbfup {up,it}{#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_Greek:nn {bfup}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {up}{#1} + }{ + \bool_if:NT \g_um_bfupGreek_bool { + \um_map_chars_Greek:nn {bfup,bfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfup_greek:n { + \um_set_mathalphabet_greek:Nnn \mathbfup {up,it} {#1} + \bool_if:NTF \g_um_bfliteral_bool { + \um_map_chars_greek:nn {bfup} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {up} {#1} + }{ + \bool_if:NT \g_um_bfupgreek_bool { + \um_map_chars_greek:nn {bfup,bfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} + } + } +} +\cs_new:Nn \um_config_bfup_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfup}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfup,bfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfup}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfup,bfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfup {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfup {Nabla} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfup {digamma} {up}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfup {Digamma} {up}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbf {digamma} {up}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbf {Digamma} {up}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bffrak_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbffrak {up,it}{#1} +} +\cs_new:Nn \um_config_bffrak_latin:n { + \um_set_mathalphabet_latin:Nnn \mathbffrak {up,it}{#1} +} +\cs_new:Nn \um_config_bfscr_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbfscr {up,it}{#1} +} +\cs_new:Nn \um_config_bfscr_latin:n { + \um_set_mathalphabet_latin:Nnn \mathbfscr {up,it}{#1} +} +\cs_new:Nn \um_config_bfcal_Latin:n { + \um_set_mathalphabet_Latin:Nnn \mathbfcal {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_num:n { + \um_set_mathalphabet_numbers:Nnn \mathbfsf {up}{#1} + \um_set_mathalphabet_numbers:Nnn \mathbfsfup {up}{#1} +} +\cs_new:Nn \um_config_bfsfup_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {bfsfup} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathbfsfup {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {bfsfup} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathbfsfup {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_Greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Greek:nn {bfsfup}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {up}{#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Greek:Nnn \mathbfsfup {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfup_greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_greek:nn {bfsfup} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {up} {#1} + }{ + \bool_if:NT \g_um_upsans_bool { + \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} + } + } + \um_set_mathalphabet_greek:Nnn \mathbfsfup {up,it} {#1} +} +\cs_new:Nn \um_config_bfsfup_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfsfup}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfsfup}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfsfup {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfsfup {Nabla} {up,it}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up}{#1} + }{ + \bool_if:NT \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up}{#1} + }{ + \bool_if:NT \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Nn \um_config_bfsfit_Latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Latin:nn {bfsfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Latin:Nnn \mathbfsfit {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfit_latin:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_latin:nn {bfsfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_latin:Nnn \mathbfsfit {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfit_Greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_Greek:nn {bfsfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {it}{#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} + \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} + } + } + \um_set_mathalphabet_Greek:Nnn \mathbfsfit {up,it}{#1} +} +\cs_new:Nn \um_config_bfsfit_greek:n { + \bool_if:NTF \g_um_sfliteral_bool { + \um_map_chars_greek:nn {bfsfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {it} {#1} + }{ + \bool_if:NF \g_um_upsans_bool { + \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} + \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} + } + } + \um_set_mathalphabet_greek:Nnn \mathbfsfit {up,it} {#1} +} +\cs_new:Nn \um_config_bfsfit_misc:n { + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_map_single:nnn {Nabla}{bfsfit}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} + } + } + \bool_if:NTF \g_um_literal_partial_bool { + \um_map_single:nnn {partial}{bfsfit}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} + } + } + \um_set_mathalphabet_pos:Nnnn \mathbfsfit {partial} {up,it}{#1} + \um_set_mathalphabet_pos:Nnnn \mathbfsfit {Nabla} {up,it}{#1} + \bool_if:NTF \g_um_literal_partial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {it}{#1} + }{ + \bool_if:NF \g_um_uppartial_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} + } + } + \bool_if:NTF \g_um_literal_Nabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {it}{#1} + }{ + \bool_if:NF \g_um_upNabla_bool { + \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} + } + } +} +\cs_new:Npn \um_symbol_setup: + { + \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { + \prg_case_tl:Nnn ##3 { \mathover {} \mathunder {} } + { + \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} + } + } + } +\CatchFileEdef \g_um_mathtable_tl {unicode-math-table.tex} {\um_symbol_setup:} +\cs_new:Nn \um_input_math_symbol_table: {\g_um_mathtable_tl} +\group_begin: + \char_set_catcode_other:N \^ + \cs_gset:Npn \um_cs_set_eq_active_char:Nw #1 = "#2 \q_nil { + \tex_lowercase:D { + \tl_rescan:nn { + \ExplSyntaxOn + \char_set_catcode_other:N \{ + \char_set_catcode_other:N \} + \char_set_catcode_other:N \& + \char_set_catcode_other:N \% + \char_set_catcode_other:N \$ + }{ + \cs_gset_eq:NN #1 ^^^^^#2 + } + } + } + \cs_new:Npn \um_active_char_set:wc "#1 \q_nil #2 { + \tex_lowercase:D { + \tl_rescan:nn { \ExplSyntaxOn } + { \cs_gset_protected_nopar:Npx ^^^^^#1 { \exp_not:c {#2} } } + } + } +\group_end: +\AtBeginDocument{\um_define_math_chars:} +\cs_new:Nn \um_define_math_chars: { + \group_begin: + \char_set_catcode_math_superscript:N \^ + \cs_set:Npn \_um_sym:nnn ##1##2##3 { + \bool_if:nF { \cs_if_eq_p:NN ##3 \mathaccent || + \cs_if_eq_p:NN ##3 \mathopen || + \cs_if_eq_p:NN ##3 \mathclose || + \cs_if_eq_p:NN ##3 \mathover || + \cs_if_eq_p:NN ##3 \mathunder } { + \um_cs_set_eq_active_char:Nw ##2 = ##1 \q_nil \ignorespaces + } + } + \char_set_catcode_other:N \# + \um_input_math_symbol_table: + \group_end: +} +\group_begin: + \lccode`\*=`\\ + \char_set_catcode_escape:N \| + \char_set_catcode_other:N \\ + |lowercase{ + |AtBeginDocument{ + |let|backslash=* + } + } +|group_end: +\cs_new:Nn \um_arg_i_before_egroup:n {#1\egroup} +\cs_new:Nn \um_superscript:n { + ^\bgroup #1 + \peek_meaning_remove:NTF ^ \um_arg_i_before_egroup:n \egroup +} +\muskip_new:N \g_um_primekern_muskip +\muskip_gset:Nn \g_um_primekern_muskip { -\thinmuskip/2 }% arbitrary +\int_new:N \l_um_primecount_int +\cs_new:Nn \um_nprimes:Nn { + \um_superscript:n { + #1 + \prg_replicate:nn {#2-1} { \mskip \g_um_primekern_muskip #1 } + } +} +\cs_new:Nn \um_nprimes_select:nn { + \prg_case_int:nnn {#2}{ + {1} { \um_superscript:n {#1} } + {2} { + \um_glyph_if_exist:nTF {"2033} + { \um_superscript:n {\um_prime_double_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + {3} { + \um_glyph_if_exist:nTF {"2034} + { \um_superscript:n {\um_prime_triple_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + {4} { + \um_glyph_if_exist:nTF {"2057} + { \um_superscript:n {\um_prime_quad_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + }{ + \um_nprimes:Nn #1 {#2} + } +} +\cs_new:Nn \um_nbackprimes_select:nn { + \prg_case_int:nnn {#2}{ + {1} { \um_superscript:n {#1} } + {2} { + \um_glyph_if_exist:nTF {"2036} + { \um_superscript:n {\um_backprime_double_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + {3} { + \um_glyph_if_exist:nTF {"2037} + { \um_superscript:n {\um_backprime_triple_mchar} } + { \um_nprimes:Nn #1 {#2} } + } + }{ + \um_nprimes:Nn #1 {#2} + } +} +\cs_new:Npn \um_scan_prime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_zero:N \l_um_primecount_int + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_dprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {1} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_trprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_qprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_prime: { + \int_zero:N \l_um_primecount_int + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_dprime: { + \int_set:Nn \l_um_primecount_int {1} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_trprime: { + \int_set:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Npn \um_scan_sup_qprime: { + \int_set:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N \um_prime_single_mchar +} +\cs_new:Nn \um_scanprime_collect:N { + \int_incr:N \l_um_primecount_int + \peek_meaning_remove:NTF ' { + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_prime: { + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2032 { + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_dprime: { + \int_incr:N \l_um_primecount_int + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2033 { + \int_incr:N \l_um_primecount_int + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_trprime: { + \int_add:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2034 { + \int_add:Nn \l_um_primecount_int {2} + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_qprime: { + \int_add:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2057 { + \int_add:Nn \l_um_primecount_int {3} + \um_scanprime_collect:N #1 + }{ + \um_nprimes_select:nn {#1} {\l_um_primecount_int} + } + } + } + } + } + } + } + } + } +} +\cs_new:Npn \um_scan_backprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_zero:N \l_um_primecount_int + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_backdprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {1} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_backtrprime: { + \cs_set_eq:NN \um_superscript:n \use:n + \int_set:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_sup_backprime: { + \int_zero:N \l_um_primecount_int + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_sup_backdprime: { + \int_set:Nn \l_um_primecount_int {1} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Npn \um_scan_sup_backtrprime: { + \int_set:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N \um_backprime_single_mchar +} +\cs_new:Nn \um_scanbackprime_collect:N { + \int_incr:N \l_um_primecount_int + \peek_meaning_remove:NTF ` { + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_backprime: { + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2035 { + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_backdprime: { + \int_incr:N \l_um_primecount_int + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2036 { + \int_incr:N \l_um_primecount_int + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF \um_scan_backtrprime: { + \int_add:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N #1 + }{ + \peek_meaning_remove:NTF ^^^^2037 { + \int_add:Nn \l_um_primecount_int {2} + \um_scanbackprime_collect:N #1 + }{ + \um_nbackprimes_select:nn {#1} {\l_um_primecount_int} + } + } + } + } + } + } + } +} +\AtBeginDocument{\um_define_prime_commands: \um_define_prime_chars:} +\cs_new:Nn \um_define_prime_commands: { + \cs_set_eq:NN \prime \um_prime_single_mchar + \cs_set_eq:NN \dprime \um_prime_double_mchar + \cs_set_eq:NN \trprime \um_prime_triple_mchar + \cs_set_eq:NN \qprime \um_prime_quad_mchar + \cs_set_eq:NN \backprime \um_backprime_single_mchar + \cs_set_eq:NN \backdprime \um_backprime_double_mchar + \cs_set_eq:NN \backtrprime \um_backprime_triple_mchar +} +\group_begin: + \char_set_catcode_active:N \' + \char_set_catcode_active:N \` + \char_set_catcode_active:n {"2032} + \char_set_catcode_active:n {"2033} + \char_set_catcode_active:n {"2034} + \char_set_catcode_active:n {"2057} + \char_set_catcode_active:n {"2035} + \char_set_catcode_active:n {"2036} + \char_set_catcode_active:n {"2037} + \cs_gset:Nn \um_define_prime_chars: { + \cs_set_eq:NN ' \um_scan_sup_prime: + \cs_set_eq:NN ^^^^2032 \um_scan_sup_prime: + \cs_set_eq:NN ^^^^2033 \um_scan_sup_dprime: + \cs_set_eq:NN ^^^^2034 \um_scan_sup_trprime: + \cs_set_eq:NN ^^^^2057 \um_scan_sup_qprime: + \cs_set_eq:NN ` \um_scan_sup_backprime: + \cs_set_eq:NN ^^^^2035 \um_scan_sup_backprime: + \cs_set_eq:NN ^^^^2036 \um_scan_sup_backdprime: + \cs_set_eq:NN ^^^^2037 \um_scan_sup_backtrprime: + } +\group_end: +\AtBeginDocument{\um_redefine_radical:} +\cs_new:Nn \um_redefine_radical: + { + \@ifpackageloaded { amsmath } { } { + \cs_set_nopar:Npn \r@@t ##1 ##2 { + \hbox_set:Nn \l_tmpa_box { + \c_math_toggle_token + \m@th + ##1 + \sqrtsign { ##2 } + \c_math_toggle_token + } + \um_mathstyle_scale:Nnn ##1 { \kern } { + \fontdimen 63 \l_um_font + } + \box_move_up:nn { + (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) + * \number \fontdimen 65 \l_um_font / 100 + } { + \box_use:N \rootbox + } + \um_mathstyle_scale:Nnn ##1 { \kern } { + \fontdimen 64 \l_um_font + } + \box_use_clear:N \l_tmpa_box + } + } + } +\cs_new:Nn \um_fontdimen_to_percent:nn { + \strip@pt\dimexpr\fontdimen#1#2*65536/100\relax +} +\cs_new:Nn \um_fontdimen_to_scale:nn + { + \um_fontdimen_to_percent:nn {#1} {#2} \dimexpr \f@size pt\relax + } +\cs_new:Nn \um_mathstyle_scale:Nnn { + \ifx#1\scriptstyle + #2\um_fontdimen_to_percent:nn{10}\l_um_font#3 + \else + \ifx#1\scriptscriptstyle + #2\um_fontdimen_to_percent:nn{11}\l_um_font#3 + \else + #2#3 + \fi + \fi +} +\prop_new:N \g_um_supers_prop +\prop_new:N \g_um_subs_prop +\group_begin: +\cs_new:Nn \um_setup_active_superscript:nn { + \prop_gput:Nxn \g_um_supers_prop {\meaning #1} {#2} + \char_set_catcode_active:N #1 + \char_gmake_mathactive:N #1 + \scantokens{ + \cs_gset:Npn #1 { + \tl_set:Nn \l_um_ss_chain_tl {#2} + \cs_set_eq:NN \um_sub_or_super:n \sp + \tl_set:Nn \l_um_tmpa_tl {supers} + \um_scan_sscript: + } + } +} +\um_setup_active_superscript:nn {^^^^2070} {0} +\um_setup_active_superscript:nn {^^^^00b9} {1} +\um_setup_active_superscript:nn {^^^^00b2} {2} +\um_setup_active_superscript:nn {^^^^00b3} {3} +\um_setup_active_superscript:nn {^^^^2074} {4} +\um_setup_active_superscript:nn {^^^^2075} {5} +\um_setup_active_superscript:nn {^^^^2076} {6} +\um_setup_active_superscript:nn {^^^^2077} {7} +\um_setup_active_superscript:nn {^^^^2078} {8} +\um_setup_active_superscript:nn {^^^^2079} {9} +\um_setup_active_superscript:nn {^^^^207a} {+} +\um_setup_active_superscript:nn {^^^^207b} {-} +\um_setup_active_superscript:nn {^^^^207c} {=} +\um_setup_active_superscript:nn {^^^^207d} {(} +\um_setup_active_superscript:nn {^^^^207e} {)} +\um_setup_active_superscript:nn {^^^^2071} {i} +\um_setup_active_superscript:nn {^^^^207f} {n} +\cs_new:Nn \um_setup_active_subscript:nn { + \prop_gput:Nxn \g_um_subs_prop {\meaning #1} {#2} + \char_set_catcode_active:N #1 + \char_gmake_mathactive:N #1 + \scantokens{ + \cs_gset:Npn #1 { + \tl_set:Nn \l_um_ss_chain_tl {#2} + \cs_set_eq:NN \um_sub_or_super:n \sb + \tl_set:Nn \l_um_tmpa_tl {subs} + \um_scan_sscript: + } + } +} +\um_setup_active_subscript:nn {^^^^2080} {0} +\um_setup_active_subscript:nn {^^^^2081} {1} +\um_setup_active_subscript:nn {^^^^2082} {2} +\um_setup_active_subscript:nn {^^^^2083} {3} +\um_setup_active_subscript:nn {^^^^2084} {4} +\um_setup_active_subscript:nn {^^^^2085} {5} +\um_setup_active_subscript:nn {^^^^2086} {6} +\um_setup_active_subscript:nn {^^^^2087} {7} +\um_setup_active_subscript:nn {^^^^2088} {8} +\um_setup_active_subscript:nn {^^^^2089} {9} +\um_setup_active_subscript:nn {^^^^208a} {+} +\um_setup_active_subscript:nn {^^^^208b} {-} +\um_setup_active_subscript:nn {^^^^208c} {=} +\um_setup_active_subscript:nn {^^^^208d} {(} +\um_setup_active_subscript:nn {^^^^208e} {)} +\um_setup_active_subscript:nn {^^^^2090} {a} +\um_setup_active_subscript:nn {^^^^2091} {e} +\um_setup_active_subscript:nn {^^^^1d62} {i} +\um_setup_active_subscript:nn {^^^^2092} {o} +\um_setup_active_subscript:nn {^^^^1d63} {r} +\um_setup_active_subscript:nn {^^^^1d64} {u} +\um_setup_active_subscript:nn {^^^^1d65} {v} +\um_setup_active_subscript:nn {^^^^2093} {x} +\um_setup_active_subscript:nn {^^^^1d66} {\beta} +\um_setup_active_subscript:nn {^^^^1d67} {\gamma} +\um_setup_active_subscript:nn {^^^^1d68} {\rho} +\um_setup_active_subscript:nn {^^^^1d69} {\phi} +\um_setup_active_subscript:nn {^^^^1d6a} {\chi} +\group_end: +\cs_new:Npn \um_scan_sscript: { + \um_scan_sscript:TF { + \um_scan_sscript: + }{ + \um_sub_or_super:n {\l_um_ss_chain_tl} + } +} +\cs_new:Npn \um_scan_sscript:TF #1#2 { + \tl_set:Nx \peek_true_aux:w { \exp_not:n{ #1 } } + \tl_set_eq:NN \peek_true:w \peek_true_remove:w + \tl_set:Nx \peek_false:w { \exp_not:n { \group_align_safe_end: #2 } } + \group_align_safe_begin: + \peek_after:Nw \um_peek_execute_branches_ss: +} +\cs_new:Npn \um_peek_execute_branches_ss: { + \bool_if:nTF { + \token_if_eq_catcode_p:NN \l_peek_token \c_group_begin_token || + \token_if_eq_catcode_p:NN \l_peek_token \c_group_end_token || + \token_if_eq_meaning_p:NN \l_peek_token \c_space_token + } + { \peek_false:w } + { \um_peek_execute_branches_ss_aux: } +} +\cs_new:Npn \um_peek_execute_branches_ss_aux: { + \prop_if_in:cxTF + {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} + { + \prop_get:cxN + {g_um_\l_um_tmpa_tl _prop} {\meaning\l_peek_token} \l_um_tmpb_tl + \tl_put_right:NV \l_um_ss_chain_tl \l_um_tmpb_tl + \peek_true:w + } + { \peek_false:w } +} +\cs_new:Npn \um_define_active_frac:Nw #1 #2/#3 { + \char_set_catcode_active:N #1 + \char_gmake_mathactive:N #1 + \tl_rescan:nn { + \catcode`\_=11\relax + \catcode`\:=11\relax + }{ + \cs_gset:Npx #1 { + \bool_if:NTF \l_um_smallfrac_bool {\exp_not:N\tfrac} {\exp_not:N\frac} + {#2} {#3} + } + } +} +\cs_new:Npn \um_setup_active_frac: { + \group_begin: + \um_define_active_frac:Nw ^^^^2189 0/3 + \um_define_active_frac:Nw ^^^^2152 1/{10} + \um_define_active_frac:Nw ^^^^2151 1/9 + \um_define_active_frac:Nw ^^^^215b 1/8 + \um_define_active_frac:Nw ^^^^2150 1/7 + \um_define_active_frac:Nw ^^^^2159 1/6 + \um_define_active_frac:Nw ^^^^2155 1/5 + \um_define_active_frac:Nw ^^^^00bc 1/4 + \um_define_active_frac:Nw ^^^^2153 1/3 + \um_define_active_frac:Nw ^^^^215c 3/8 + \um_define_active_frac:Nw ^^^^2156 2/5 + \um_define_active_frac:Nw ^^^^00bd 1/2 + \um_define_active_frac:Nw ^^^^2157 3/5 + \um_define_active_frac:Nw ^^^^215d 5/8 + \um_define_active_frac:Nw ^^^^2154 2/3 + \um_define_active_frac:Nw ^^^^00be 3/4 + \um_define_active_frac:Nw ^^^^2158 4/5 + \um_define_active_frac:Nw ^^^^215a 5/6 + \um_define_active_frac:Nw ^^^^215e 7/8 + \group_end: +} +\um_setup_active_frac: +\cs_new:Nn \um_over_bracket:nN + { + \mathop { \vbox { + \setbox\z@\hbox{$\displaystyle#1$} + \dimen@=\dimexpr\wd\z@+3\p@\relax + \setbox\tw@\hbox{$\left #2 \vcenter to\dimen@{\vss} \right. $} + \m@th\ialign + { + ##\crcr\noalign{\kern-\p@}% + \rotatebox[origin=Bl]{-90} + {\box\tw@}\crcr\noalign{\kern0\p@\nointerlineskip}% + \hfil\box\z@\hfil\crcr + } + } } \limits + } +\cs_new:Nn \um_under_bracket:nN + { + \mathop { \vtop { + \setbox\z@\hbox{$\displaystyle#1$} + \dimen@=\dimexpr\wd\z@+3\p@\relax + \setbox\tw@\hbox{$\left #2 \vcenter to\dimen@{\vss} \right. $} + \m@th\ialign + { + ##\crcr\hfil\box\z@\hfil\crcr + \noalign{\kern1\p@\nointerlineskip}% + \rotatebox[origin=Br]{-90}{\box\tw@}\crcr\noalign{\kern0\p@} + } + } } \limits + } +\DeclareDocumentCommand \overbrace {m} { \um_over_bracket:nN {#1} \{ } +\DeclareDocumentCommand \overbracket {m} { \um_over_bracket:nN {#1} [ } +\DeclareDocumentCommand \overparen {m} { \um_over_bracket:nN {#1} ( } +\DeclareDocumentCommand \underbrace {m} { \um_under_bracket:nN {#1} \} } +\DeclareDocumentCommand \underbracket {m} { \um_under_bracket:nN {#1} ] } +\DeclareDocumentCommand \underparen {m} { \um_under_bracket:nN {#1} ) } +\def\to{\rightarrow} +\def\le{\leq} +\def\ge{\geq} +\def\neq{\ne} +\def\triangle{\mathord{\bigtriangleup}} +\def\bigcirc{\mdlgwhtcircle} +\def\circ{\vysmwhtcircle} +\def\bullet{\smblkcircle} +\def\mathyen{\yen} +\def\mathsterling{\sterling} +\def\diamond{\smwhtdiamond} +\def\emptyset{\varnothing} +\def\hbar{\hslash} +\def\land{\wedge} +\def\lor{\vee} +\def\owns{\ni} +\def\gets{\leftarrow} +\def\mathring{\ocirc} +\def\lnot{\neg} +\def\backepsilon{\upbackepsilon} +\def\eth{\matheth} +\def\smallint{{\textstyle\int}\limits} +\@ifpackageloaded{amsmath}{ + % define their own colon, perhaps I should just steal it. (It does look much better.) +}{ + \cs_set_protected:Npn \colon { + \bool_if:NTF \g_um_literal_colon_bool {:} { \mathpunct{:} } + } +} +\def\mathrm{\mathup} +\let\mathfence\mathord +\def\digamma{\updigamma} +\def\Digamma{\upDigamma} +\def\operator@font{\um_switchto_mathup:} +\chk_if_free_cs:N \um_tmpa:w +\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnnn #1 #2 #3 #4 #5 #6 { + \cs_if_exist:NT #1 { + \token_if_macro:NTF #1 { + \group_begin: + #2 \um_tmpa:w #3 { #4 } + \cs_if_eq:NNTF #1 \um_tmpa:w { + \msg_info:nnx { unicode-math } { patch-macro } + { \token_to_str:N #1 } + \group_end: + #2 #1 #3 + { #6 } + } { + \msg_warning:nnxxx { unicode-math } { wrong-meaning } + { \token_to_str:N #1 } { \token_to_meaning:N #1 } + { \token_to_meaning:N \um_tmpa:w } + \group_end: + } + } { + \msg_warning:nnx { unicode-math } { macro-expected } + { \token_to_str:N #1 } + } + } +} +\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnn #1 #2 #3 #4 #5 { + \um_check_and_fix:NNnnnn #1 #2 { #3 } { #4 } { #5 } { #5 } +} +\cs_new_protected_nopar:Npn \um_check_and_fix_luatex:NNnnn #1 #2 #3 #4 #5 { + \luatex_if_engine:T { + \um_check_and_fix:NNnnn #1 #2 { #3 } { #4 } { #5 } + } +} +\cs_generate_variant:Nn \um_check_and_fix_luatex:NNnnn { c } +\AtEndOfPackageFile * {url} { + \tl_put_left:Nn \Url@FormatString { \um_switchto_mathup: } + \tl_put_right:Nn \UrlSpecials { + \do\`{\mathchar`\`} + \do\'{\mathchar`\'} + \do\${\mathchar`\$} + \do\&{\mathchar`\&} + } +} +\AtEndOfPackageFile * {amsmath} { + \tl_remove_once:Nn \@begindocumenthook { + \mathchardef\std@minus\mathcode`\-\relax + \mathchardef\std@equal\mathcode`\=\relax + } + \def\std@minus{\Umathcharnum\Umathcodenum`\-\relax} + \def\std@equal{\Umathcharnum\Umathcodenum`\=\relax} + \cs_set:Npn \@cdots {\mathinner{\cdots}} + \cs_set_eq:NN \dotsb@ \cdots + \def \resetMathstrut@ {% + \setbox\z@\hbox{$($}%) + \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@ + } + \um_check_and_fix:NNnnn \subarray \cs_set:Npn { #1 } { + \vcenter + \bgroup + \Let@ + \restore@math@cr + \default@tag + \baselineskip \fontdimen 10~ \scriptfont \tw@ + \advance \baselineskip \fontdimen 12~ \scriptfont \tw@ + \lineskip \thr@@ \fontdimen 8~ \scriptfont \thr@@ + \lineskiplimit \lineskip + \ialign + \bgroup + \ifx c #1 \hfil \fi + $ \m@th \scriptstyle ## $ + \hfil + \crcr + } { + \vcenter + \c_group_begin_token + \Let@ + \restore@math@cr + \default@tag + \skip_set:Nn \baselineskip { + \um_stack_num_up:N \scriptstyle + + \um_stack_denom_down:N \scriptstyle + } + \lineskip \um_stack_vgap:N \scriptstyle + \lineskiplimit \lineskip + \ialign + \c_group_begin_token + \token_if_eq_meaning:NNT c #1 { \hfil } + \c_math_toggle_token + \m@th + \scriptstyle + \c_parameter_token \c_parameter_token + \c_math_toggle_token + \hfil + \crcr + } + \um_check_and_fix_luatex:NNnnn \plainroot@ \cs_set_nopar:Npn { #1 \of #2 } { + \setbox \rootbox \hbox { + $ \m@th \scriptscriptstyle { #1 } $ + } + \mathchoice + { \r@@t \displaystyle { #2 } } + { \r@@t \textstyle { #2 } }~ + { \r@@t \scriptstyle { #2 } } + { \r@@t \scriptscriptstyle { #2 } } + \egroup + } { + \bool_if:nTF { + \int_compare_p:nNn { \uproot@ } = { \c_zero } + && \int_compare_p:nNn { \leftroot@ } = { \c_zero } + } { + \luatexUroot \l_um_radical_sqrt_tl { #1 } { #2 } + } { + \hbox_set:Nn \rootbox { + \c_math_toggle_token + \m@th + \scriptscriptstyle { #1 } + \c_math_toggle_token + } + \mathchoice + { \r@@t \displaystyle { #2 } } + { \r@@t \textstyle { #2 } } + { \r@@t \scriptstyle { #2 } } + { \r@@t \scriptscriptstyle { #2 } } + } + \c_group_end_token + } + \um_check_and_fix:NNnnnn \r@@t \cs_set_nopar:Npn { #1 #2 } { + \setboxz@h { $ \m@th #1 \sqrtsign { #2 } $ } + \dimen@ \ht\z@ + \advance \dimen@ -\dp\z@ + \setbox\@ne \hbox { $ \m@th #1 \mskip \uproot@ mu $ } + \advance \dimen@ by 1.667 \wd\@ne + \mkern -\leftroot@ mu + \mkern 5mu + \raise .6\dimen@ \copy\rootbox + \mkern -10mu + \mkern \leftroot@ mu + \boxz@ + } { + \hbox_set:Nn \l_tmpa_box { + \c_math_toggle_token + \m@th + #1 + \mskip \uproot@ mu + \c_math_toggle_token + } + \luatexUroot \l_um_radical_sqrt_tl { + \box_move_up:nn { \box_wd:N \l_tmpa_box } { + \hbox:n { + \c_math_toggle_token + \m@th + \mkern -\leftroot@ mu + \box_use:N \rootbox + \mkern \leftroot@ mu + \c_math_toggle_token + } + } + } { + #2 + } + } { + \hbox_set:Nn \l_tmpa_box { + \c_math_toggle_token + \m@th + #1 + \sqrtsign { #2 } + \c_math_toggle_token + } + \hbox_set:Nn \l_tmpb_box { + \c_math_toggle_token + \m@th + #1 + \mskip \uproot@ mu + \c_math_toggle_token + } + \mkern -\leftroot@ mu + \um_mathstyle_scale:Nnn #1 { \kern } { + \fontdimen 63 \l_um_font + } + \box_move_up:nn { + \box_wd:N \l_tmpb_box + + (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) + * \number \fontdimen 65 \l_um_font / 100 + } { + \box_use:N \rootbox + } + \um_mathstyle_scale:Nnn #1 { \kern } { + \fontdimen 64 \l_um_font + } + \mkern \leftroot@ mu + \box_use_clear:N \l_tmpa_box + } +} +\AtEndOfPackageFile * {amsopn} { + \cs_set:Npn \newmcodes@ { + \mathcode`\'39\scan_stop: + \mathcode`\*42\scan_stop: + \mathcode`\."613A\scan_stop: +%% \ifnum\mathcode`\-=45 \else +%% \mathchardef\std@minus\mathcode`\-\relax +%% \fi + \mathcode`\-45\scan_stop: + \mathcode`\/47\scan_stop: + \mathcode`\:"603A\scan_stop: + } +} +\cs_set:Npn \| {\Vert} +\cs_set:Npn \mathellipsis {\mathinner{\unicodeellipsis}} +\cs_set:Npn \cdots {\mathinner{\unicodecdots}} +\cs_new_protected_nopar:Nn \um_setup_accents: + { + \def\widehat{\hat} + \def\widetilde{\tilde} + \def\overrightarrow{\vec} + } +\cs_set_eq:NN \um_text_slash: \slash +\cs_set_protected:Npn \slash { + \mode_if_math:TF {\mathslash} {\um_text_slash:} +} +\AtEndOfPackageFile * { mathtools } { + \chk_if_free_cs:N \g_um_empty_fam + \newfam \g_um_empty_fam + \um_check_and_fix:NNnnn + \MT_cramped_internal:Nn \cs_set_nopar:Npn { #1 #2 } + { + \sbox \z@ { + $ + \m@th + #1 + \nulldelimiterspace = \z@ + \radical \z@ { #2 } + $ + } + \ifx #1 \displaystyle + \dimen@ = \fontdimen 8 \textfont 3 + \advance \dimen@ .25 \fontdimen 5 \textfont 2 + \else + \dimen@ = 1.25 \fontdimen 8 + \ifx #1 \textstyle + \textfont + \else + \ifx #1 \scriptstyle + \scriptfont + \else + \scriptscriptfont + \fi + \fi + 3 + \fi + \advance \dimen@ -\ht\z@ + \ht\z@ = -\dimen@ + \box\z@ + } + { + \hbox_set:Nn \l_tmpa_box { + \color@setgroup + \c_math_toggle_token + \m@th + #1 + \dim_zero:N \nulldelimiterspace + \XeTeXradical \g_um_empty_fam \c_zero { #2 } + \c_math_toggle_token + \color@endgroup + } + \box_set_ht:Nn \l_tmpa_box { + \box_ht:N \l_tmpa_box + - \um_radical_vgap:N #1 + } + \box_use_clear:N \l_tmpa_box + } + \msg_warning:nn { unicode-math } { mathtools } + \NewDocumentCommand \dblcolon { } { \Colon } + \NewDocumentCommand \coloneqq { } { \coloneq } + \NewDocumentCommand \Coloneqq { } { \Coloneq } + \NewDocumentCommand \eqqcolon { } { \eqcolon } +} +\AtEndOfPackageFile * { colonequals } { + \msg_warning:nn { unicode-math } { colonequals } + \RenewDocumentCommand \ratio { } { \mathratio } + \RenewDocumentCommand \coloncolon { } { \Colon } + \RenewDocumentCommand \minuscolon { } { \dashcolon } + \RenewDocumentCommand \colonequals { } { \coloneq } + \RenewDocumentCommand \equalscolon { } { \eqcolon } + \RenewDocumentCommand \coloncolonequals { } { \Coloneq } +} +\ExplSyntaxOff diff --git a/Master/texmf-dist/tex/latex/unicode-math/unicode-math.sty b/Master/texmf-dist/tex/latex/unicode-math/unicode-math.sty index 10187f64053..39631028f3f 100644 --- a/Master/texmf-dist/tex/latex/unicode-math/unicode-math.sty +++ b/Master/texmf-dist/tex/latex/unicode-math/unicode-math.sty @@ -6,7 +6,7 @@ %% %% unicode-math.dtx (with options: `preamble') %% unicode-math.dtx (with options: `msg') -%% unicode-math.dtx (with options: `package,stix') +%% unicode-math.dtx (with options: `load') %% Copyright 2006-2011 Will Robertson %% Copyright 2010-2011 Philipp Stephani %% @@ -16,7 +16,7 @@ %% %% This work is "author-maintained" by Will Robertson. \ProvidesPackage{unicode-math} - [2011/07/31 v0.5e Unicode maths in XeLaTeX and LuaLaTeX] + [2011/09/18 v0.6 Unicode maths in XeLaTeX and LuaLaTeX] \usepackage{ifxetex,ifluatex} \ifxetex\else\ifluatex\else \PackageError{unicode-math}{% @@ -24,25 +24,14 @@ Use XeLaTeX or LuaLaTeX instead.% }\@ehd \fi\fi -\RequirePackage{expl3}[2009/08/12] +\RequirePackage{expl3}[2011/07/01] \RequirePackage{xparse}[2009/08/31] \RequirePackage{l3keys2e} \RequirePackage{fontspec}[2010/10/25] \RequirePackage{catchfile} -\RequirePackage{trimspaces}% I'd like to incorporate this into expl3... \RequirePackage{fix-cm} % avoid some warnings \RequirePackage{filehook}[2011/01/03] \ExplSyntaxOn -\cs_if_exist:NF \char_set_catcode_other:N - { - \cs_set_eq:NN \c_math_toggle_token \c_math_shift_token - \cs_set_eq:NN \char_set_catcode_other:N \char_make_other:N - \cs_set_eq:NN \char_set_catcode_active:N \char_make_active:N - \cs_set_eq:NN \char_set_catcode_active:n \char_make_active:n - \cs_set_eq:NN \char_set_catcode_escape:N \char_make_escape:N - \cs_set_eq:NN \char_set_catcode_math_superscript:N - \char_make_math_superscript:N - } \cs_generate_variant:Nn \tl_put_right:Nn {cx} \cs_generate_variant:Nn \seq_if_in:NnTF {NV} \cs_generate_variant:Nn \prop_gput:Nnn {Nxn} @@ -53,13 +42,11 @@ \cs:w #3 \exp_after:wN \cs_end: \cs:w #4 \cs_end: } +\cs_set_eq:NN \tl_replace_in:Nnn \tl_replace_once:Nnn \cs_new_protected_nopar:Npn \bool_const:Nn #1 #2 { \bool_new:N #1 \bool_set:Nn #1 { #2 } } -\bool_const:Nn \c_um_have_fixed_accents_bool { - \c_luatex_is_engine_bool && \int_compare_p:n { \luatexversion > 64 } -} \bool_new:N \l_um_ot_math_bool \bool_new:N \l_um_init_bool \bool_new:N \l_um_implicit_alph_bool @@ -81,16 +68,16 @@ \bool_new:N \g_um_literal_Nabla_bool \bool_new:N \g_um_literal_partial_bool \bool_new:N \g_um_texgreek_bool -\bool_gset_true:N \g_um_texgreek_bool +\bool_set_true:N \g_um_texgreek_bool \bool_new:N \l_um_smallfrac_bool \bool_new:N \g_um_literal_colon_bool \int_new:N \g_um_fam_int -\tl_set:Nn \g_um_math_alphabet_name_latin_tl {Latin,~lowercase} -\tl_set:Nn \g_um_math_alphabet_name_Latin_tl {Latin,~uppercase} -\tl_set:Nn \g_um_math_alphabet_name_greek_tl {Greek,~lowercase} -\tl_set:Nn \g_um_math_alphabet_name_Greek_tl {Greek,~uppercase} -\tl_set:Nn \g_um_math_alphabet_name_num_tl {Numerals} -\tl_set:Nn \g_um_math_alphabet_name_misc_tl {Misc.} +\tl_const:Nn \c_um_math_alphabet_name_latin_tl {Latin,~lowercase} +\tl_const:Nn \c_um_math_alphabet_name_Latin_tl {Latin,~uppercase} +\tl_const:Nn \c_um_math_alphabet_name_greek_tl {Greek,~lowercase} +\tl_const:Nn \c_um_math_alphabet_name_Greek_tl {Greek,~uppercase} +\tl_const:Nn \c_um_math_alphabet_name_num_tl {Numerals} +\tl_const:Nn \c_um_math_alphabet_name_misc_tl {Misc.} \prg_new_conditional:Nnn \um_glyph_if_exist:n {p,TF,T,F} { \iffontchar \l_um_font #1 \scan_stop: \prg_return_true: @@ -102,514 +89,10 @@ \cs_generate_variant:Nn \um_glyph_if_exist:nTF {c} \cs_generate_variant:Nn \um_glyph_if_exist:nT {c} \cs_generate_variant:Nn \um_glyph_if_exist:nF {c} -\xetex_or_luatex:nnn { \cs_new:Npn \um_cs_compat:n #1 } - { \cs_set_eq:cc {U#1} {XeTeX#1} } - { \cs_set_eq:cc {U#1} {luatexU#1} } -\um_cs_compat:n {mathcode} -\um_cs_compat:n {delcode} -\um_cs_compat:n {mathcodenum} -\um_cs_compat:n {mathcharnum} -\um_cs_compat:n {mathchardef} -\um_cs_compat:n {radical} -\um_cs_compat:n {mathaccent} -\um_cs_compat:n {delimiter} -\luatex_if_engine:T { - \RequirePackage { lualatex-math } [ 2011/05/05 ] -} -\cs_generate_variant:Nn \fontspec_select:nn {x} -\luatex_if_engine:T { - \RequirePackage { luatexbase } - \RequirePackage { luaotfload } [ 2010/11/26 ] - \RequireLuaModule { unicode-math } [ 2011/04/23 ] -} -\cs_new:Npn \um_warning:n { \msg_warning:nn {unicode-math} } -\cs_new:Npn \um_trace:n { \msg_trace:nn {unicode-math} } -\cs_new:Npn \um_trace:nx { \msg_trace:nnx {unicode-math} } -\msg_new:nnn {unicode-math} {disable-beamer} -{ - Disabling~ beamer's~ math~ setup.\\ - Please~ load~ beamer~ with~ the~ [professionalfonts]~ class~ option. -} -\msg_new:nnn {unicode-math} {no-tfrac} -{ - Small~ fraction~ command~ \protect\tfrac\ not~ defined.\\ - Load~ amsmath~ or~ define~ it~ manually~ before~ loading~ unicode-math. -} -\msg_new:nnn {unicode-math} {default-math-font} -{ - Defining~ the~ default~ maths~ font~ as~ '#1'. -} -\msg_new:nnn {unicode-math} {setup-implicit} -{ - Setup~ alphabets:~ implicit~ mode. -} -\msg_new:nnn {unicode-math} {setup-explicit} -{ - Setup~ alphabets:~ explicit~ mode. -} -\msg_new:nnn {unicode-math} {alph-initialise} -{ - Initialising~ \@backslashchar math#1. -} -\msg_new:nnn {unicode-math} {setup-alph} -{ - Setup~ alphabet:~ #1. -} -\msg_new:nnnn { unicode-math } { no-font-selected } { - You've~ loaded~ the~ unicode-math~ package,~ but~ you~ forgot~ to~ select \\ - a~ Unicode~ math~ font.~ Please~ select~ one~ with~ the~ \token_to_str:N \setmathfont \\ - command. -} { - Loading~ the~ unicode-math~ package~ without~ using~ a~ Unicode~ math~ font \\ - is~ not~ supported.~ Either~ select~ a~ Unicode~ math~ font,~ or~ don't~ load \\ - the~ unicode-math~ package. -} -\msg_new:nnn {unicode-math} {macro-expected} -{ - I've~ expected~ that~ #1~ is~ a~ macro,~ but~ it~ isn't. -} -\msg_new:nnn {unicode-math} {wrong-meaning} -{ - I've~ expected~ #1~ to~ have~ the~ meaning~ #3,~ but~ it~ has~ the~ meaning~ #2. -} -\msg_new:nnn {unicode-math} {patch-macro} -{ - I'm~ going~ to~ patch~ macro~ #1. -} -\msg_new:nnn { unicode-math } { mathtools } { - I'm~ going~ to~ overwrite~ the~ following~ commands~ from \\ - the~ `mathtools'~ package: \\ - \token_to_str:N \dblcolon,~ - \token_to_str:N \coloneqq,~ - \token_to_str:N \Coloneqq,~ - \token_to_str:N \eqqcolon. \\ - Note~ that~ since~ I~ won't~ overwrite~ the~ other~ colon-like \\ - commands,~ using~ them~ will~ lead~ to~ inconsistencies. -} -\msg_new:nnn { unicode-math } { colonequals } { - I'm~ going~ to~ overwrite~ the~ following~ commands~ from \\ - the~ `colonequals'~ package: \\ - \token_to_str:N \ratio,~ - \token_to_str:N \coloncolon,~ - \token_to_str:N \minuscolon, \\ - \token_to_str:N \colonequals,~ - \token_to_str:N \equalscolon,~ - \token_to_str:N \coloncolonequals. \\ - Note~ that~ since~ I~ won't~ overwrite~ the~ other~ colon-like \\ - commands,~ using~ them~ will~ lead~ to~ inconsistencies. \\ - Furthermore,~ changing~ \token_to_str:N \colonsep \c_space_tl - or~ \token_to_str:N \doublecolonsep \c_space_tl won't~ have \\ - any~ effect~ on~ the~ re-defined~ commands. -} -\cs_new:Npn \usv_set:nnn #1#2#3 { - \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} -} -\cs_new:Npn \um_to_usv:nn #1#2 { g_um_#1_#2_usv } -\usv_set:nnn {up}{num}{48} -\usv_set:nnn {up}{Latin}{65} -\usv_set:nnn {up}{latin}{97} -\usv_set:nnn {up}{Greek}{"391} -\usv_set:nnn {up}{greek}{"3B1} -\usv_set:nnn {it}{Latin}{"1D434} -\usv_set:nnn {it}{latin}{"1D44E} -\usv_set:nnn {it}{Greek}{"1D6E2} -\usv_set:nnn {it}{greek}{"1D6FC} -\usv_set:nnn {bb}{num}{"1D7D8} -\usv_set:nnn {bb}{Latin}{"1D538} -\usv_set:nnn {bb}{latin}{"1D552} -\usv_set:nnn {scr}{Latin}{"1D49C} -\usv_set:nnn {cal}{Latin}{"1D49C} -\usv_set:nnn {scr}{latin}{"1D4B6} -\usv_set:nnn {frak}{Latin}{"1D504} -\usv_set:nnn {frak}{latin}{"1D51E} -\usv_set:nnn {sf}{num}{"1D7E2} -\usv_set:nnn {sfup}{num}{"1D7E2} -\usv_set:nnn {sfit}{num}{"1D7E2} -\usv_set:nnn {sfup}{Latin}{"1D5A0} -\usv_set:nnn {sf}{Latin}{"1D5A0} -\usv_set:nnn {sfup}{latin}{"1D5BA} -\usv_set:nnn {sf}{latin}{"1D5BA} -\usv_set:nnn {sfit}{Latin}{"1D608} -\usv_set:nnn {sfit}{latin}{"1D622} -\usv_set:nnn {tt}{num}{"1D7F6} -\usv_set:nnn {tt}{Latin}{"1D670} -\usv_set:nnn {tt}{latin}{"1D68A} -\usv_set:nnn {bf}{num}{"1D7CE} -\usv_set:nnn {bfup}{num}{"1D7CE} -\usv_set:nnn {bfit}{num}{"1D7CE} -\usv_set:nnn {bfup}{Latin}{"1D400} -\usv_set:nnn {bfup}{latin}{"1D41A} -\usv_set:nnn {bfup}{Greek}{"1D6A8} -\usv_set:nnn {bfup}{greek}{"1D6C2} -\usv_set:nnn {bfit}{Latin}{"1D468} -\usv_set:nnn {bfit}{latin}{"1D482} -\usv_set:nnn {bfit}{Greek}{"1D71C} -\usv_set:nnn {bfit}{greek}{"1D736} -\usv_set:nnn {bffrak}{Latin}{"1D56C} -\usv_set:nnn {bffrak}{latin}{"1D586} -\usv_set:nnn {bfscr}{Latin}{"1D4D0} -\usv_set:nnn {bfcal}{Latin}{"1D4D0} -\usv_set:nnn {bfscr}{latin}{"1D4EA} -\usv_set:nnn {bfsf}{num}{"1D7EC} -\usv_set:nnn {bfsfup}{num}{"1D7EC} -\usv_set:nnn {bfsfit}{num}{"1D7EC} -\usv_set:nnn {bfsfup}{Latin}{"1D5D4} -\usv_set:nnn {bfsfup}{latin}{"1D5EE} -\usv_set:nnn {bfsfup}{Greek}{"1D756} -\usv_set:nnn {bfsfup}{greek}{"1D770} -\usv_set:nnn {bfsfit}{Latin}{"1D63C} -\usv_set:nnn {bfsfit}{latin}{"1D656} -\usv_set:nnn {bfsfit}{Greek}{"1D790} -\usv_set:nnn {bfsfit}{greek}{"1D7AA} -\usv_set:nnn {bfsf}{Latin}{ \bool_if:NTF \g_um_upLatin_bool \g_um_bfsfup_Latin_usv \g_um_bfsfit_Latin_usv } -\usv_set:nnn {bfsf}{latin}{ \bool_if:NTF \g_um_uplatin_bool \g_um_bfsfup_latin_usv \g_um_bfsfit_latin_usv } -\usv_set:nnn {bfsf}{Greek}{ \bool_if:NTF \g_um_upGreek_bool \g_um_bfsfup_Greek_usv \g_um_bfsfit_Greek_usv } -\usv_set:nnn {bfsf}{greek}{ \bool_if:NTF \g_um_upgreek_bool \g_um_bfsfup_greek_usv \g_um_bfsfit_greek_usv } -\usv_set:nnn {bf}{Latin}{ \bool_if:NTF \g_um_bfupLatin_bool \g_um_bfup_Latin_usv \g_um_bfit_Latin_usv } -\usv_set:nnn {bf}{latin}{ \bool_if:NTF \g_um_bfuplatin_bool \g_um_bfup_latin_usv \g_um_bfit_latin_usv } -\usv_set:nnn {bf}{Greek}{ \bool_if:NTF \g_um_bfupGreek_bool \g_um_bfup_Greek_usv \g_um_bfit_Greek_usv } -\usv_set:nnn {bf}{greek}{ \bool_if:NTF \g_um_bfupgreek_bool \g_um_bfup_greek_usv \g_um_bfit_greek_usv } -\usv_set:nnn {up}{varTheta}{"3F4} -\usv_set:nnn {up}{Digamma}{"3DC} -\usv_set:nnn {up}{varepsilon}{"3F5} -\usv_set:nnn {up}{vartheta}{"3D1} -\usv_set:nnn {up}{varkappa}{"3F0} -\usv_set:nnn {up}{varphi}{"3D5} -\usv_set:nnn {up}{varrho}{"3F1} -\usv_set:nnn {up}{varpi}{"3D6} -\usv_set:nnn {up}{digamma}{"3DD} -\usv_set:nnn {bfup}{varTheta}{"1D6B9} -\usv_set:nnn {bfup}{Digamma}{"1D7CA} -\usv_set:nnn {bfup}{varepsilon}{"1D6DC} -\usv_set:nnn {bfup}{vartheta}{"1D6DD} -\usv_set:nnn {bfup}{varkappa}{"1D6DE} -\usv_set:nnn {bfup}{varphi}{"1D6DF} -\usv_set:nnn {bfup}{varrho}{"1D6E0} -\usv_set:nnn {bfup}{varpi}{"1D6E1} -\usv_set:nnn {bfup}{digamma}{"1D7CB} -\usv_set:nnn {it}{varTheta}{"1D6F3} -\usv_set:nnn {it}{varepsilon}{"1D716} -\usv_set:nnn {it}{vartheta}{"1D717} -\usv_set:nnn {it}{varkappa}{"1D718} -\usv_set:nnn {it}{varphi}{"1D719} -\usv_set:nnn {it}{varrho}{"1D71A} -\usv_set:nnn {it}{varpi}{"1D71B} -\usv_set:nnn {bfit}{varTheta}{"1D72D} -\usv_set:nnn {bfit}{varepsilon}{"1D750} -\usv_set:nnn {bfit}{vartheta}{"1D751} -\usv_set:nnn {bfit}{varkappa}{"1D752} -\usv_set:nnn {bfit}{varphi}{"1D753} -\usv_set:nnn {bfit}{varrho}{"1D754} -\usv_set:nnn {bfit}{varpi}{"1D755} -\usv_set:nnn {bfsfup}{varTheta}{"1D767} -\usv_set:nnn {bfsfup}{varepsilon}{"1D78A} -\usv_set:nnn {bfsfup}{vartheta}{"1D78B} -\usv_set:nnn {bfsfup}{varkappa}{"1D78C} -\usv_set:nnn {bfsfup}{varphi}{"1D78D} -\usv_set:nnn {bfsfup}{varrho}{"1D78E} -\usv_set:nnn {bfsfup}{varpi}{"1D78F} -\usv_set:nnn {bfsfit}{varTheta} {"1D7A1} -\usv_set:nnn {bfsfit}{varepsilon}{"1D7C4} -\usv_set:nnn {bfsfit}{vartheta} {"1D7C5} -\usv_set:nnn {bfsfit}{varkappa} {"1D7C6} -\usv_set:nnn {bfsfit}{varphi} {"1D7C7} -\usv_set:nnn {bfsfit}{varrho} {"1D7C8} -\usv_set:nnn {bfsfit}{varpi} {"1D7C9} -\usv_set:nnn {up} {Nabla}{"02207} -\usv_set:nnn {it} {Nabla}{"1D6FB} -\usv_set:nnn {bfup} {Nabla}{"1D6C1} -\usv_set:nnn {bfit} {Nabla}{"1D735} -\usv_set:nnn {bfsfup}{Nabla}{"1D76F} -\usv_set:nnn {bfsfit}{Nabla}{"1D7A9} -\usv_set:nnn {up} {partial}{"02202} -\usv_set:nnn {it} {partial}{"1D715} -\usv_set:nnn {bfup} {partial}{"1D6DB} -\usv_set:nnn {bfit} {partial}{"1D74F} -\usv_set:nnn {bfsfup}{partial}{"1D789} -\usv_set:nnn {bfsfit}{partial}{"1D7C3} -\usv_set:nnn {up}{B}{`\B} -\usv_set:nnn {up}{C}{`\C} -\usv_set:nnn {up}{D}{`\D} -\usv_set:nnn {up}{E}{`\E} -\usv_set:nnn {up}{F}{`\F} -\usv_set:nnn {up}{H}{`\H} -\usv_set:nnn {up}{I}{`\I} -\usv_set:nnn {up}{L}{`\L} -\usv_set:nnn {up}{M}{`\M} -\usv_set:nnn {up}{N}{`\N} -\usv_set:nnn {up}{P}{`\P} -\usv_set:nnn {up}{Q}{`\Q} -\usv_set:nnn {up}{R}{`\R} -\usv_set:nnn {up}{Z}{`\Z} -\usv_set:nnn {it}{B}{"1D435} -\usv_set:nnn {it}{C}{"1D436} -\usv_set:nnn {it}{D}{"1D437} -\usv_set:nnn {it}{E}{"1D438} -\usv_set:nnn {it}{F}{"1D439} -\usv_set:nnn {it}{H}{"1D43B} -\usv_set:nnn {it}{I}{"1D43C} -\usv_set:nnn {it}{L}{"1D43F} -\usv_set:nnn {it}{M}{"1D440} -\usv_set:nnn {it}{N}{"1D441} -\usv_set:nnn {it}{P}{"1D443} -\usv_set:nnn {it}{Q}{"1D444} -\usv_set:nnn {it}{R}{"1D445} -\usv_set:nnn {it}{Z}{"1D44D} -\usv_set:nnn {up}{d}{`\d} -\usv_set:nnn {up}{e}{`\e} -\usv_set:nnn {up}{g}{`\g} -\usv_set:nnn {up}{h}{`\h} -\usv_set:nnn {up}{i}{`\i} -\usv_set:nnn {up}{j}{`\j} -\usv_set:nnn {up}{o}{`\o} -\usv_set:nnn {it}{d}{"1D451} -\usv_set:nnn {it}{e}{"1D452} -\usv_set:nnn {it}{g}{"1D454} -\usv_set:nnn {it}{h}{"0210E} -\usv_set:nnn {it}{i}{"1D456} -\usv_set:nnn {it}{j}{"1D457} -\usv_set:nnn {it}{o}{"1D45C} -\usv_set:nnn {bb} {h}{"1D559} -\usv_set:nnn {tt} {h}{"1D691} -\usv_set:nnn {scr} {h}{"1D4BD} -\usv_set:nnn {frak} {h}{"1D525} -\usv_set:nnn {bfup} {h}{"1D421} -\usv_set:nnn {bfit} {h}{"1D489} -\usv_set:nnn {sfup} {h}{"1D5C1} -\usv_set:nnn {sfit} {h}{"1D629} -\usv_set:nnn {bffrak}{h}{"1D58D} -\usv_set:nnn {bfscr} {h}{"1D4F1} -\usv_set:nnn {bfsfup}{h}{"1D5F5} -\usv_set:nnn {bfsfit}{h}{"1D65D} -\usv_set:nnn {up}{dotlessi}{"00131} -\usv_set:nnn {up}{dotlessj}{"00237} -\usv_set:nnn {it}{dotlessi}{"1D6A4} -\usv_set:nnn {it}{dotlessj}{"1D6A5} -\usv_set:nnn {bb}{C}{"2102} -\usv_set:nnn {bb}{H}{"210D} -\usv_set:nnn {bb}{N}{"2115} -\usv_set:nnn {bb}{P}{"2119} -\usv_set:nnn {bb}{Q}{"211A} -\usv_set:nnn {bb}{R}{"211D} -\usv_set:nnn {bb}{Z}{"2124} -\usv_set:nnn {up}{Pi} {"003A0} -\usv_set:nnn {up}{pi} {"003C0} -\usv_set:nnn {up}{Gamma} {"00393} -\usv_set:nnn {up}{gamma} {"003B3} -\usv_set:nnn {up}{summation}{"02211} -\usv_set:nnn {it}{Pi} {"1D6F1} -\usv_set:nnn {it}{pi} {"1D70B} -\usv_set:nnn {it}{Gamma} {"1D6E4} -\usv_set:nnn {it}{gamma} {"1D6FE} -\usv_set:nnn {bb}{Pi} {"0213F} -\usv_set:nnn {bb}{pi} {"0213C} -\usv_set:nnn {bb}{Gamma} {"0213E} -\usv_set:nnn {bb}{gamma} {"0213D} -\usv_set:nnn {bb}{summation}{"02140} -\usv_set:nnn {bbit}{D}{"2145} -\usv_set:nnn {bbit}{d}{"2146} -\usv_set:nnn {bbit}{e}{"2147} -\usv_set:nnn {bbit}{i}{"2148} -\usv_set:nnn {bbit}{j}{"2149} -\usv_set:nnn {scr}{B}{"212C} -\usv_set:nnn {scr}{E}{"2130} -\usv_set:nnn {scr}{F}{"2131} -\usv_set:nnn {scr}{H}{"210B} -\usv_set:nnn {scr}{I}{"2110} -\usv_set:nnn {scr}{L}{"2112} -\usv_set:nnn {scr}{M}{"2133} -\usv_set:nnn {scr}{R}{"211B} -\usv_set:nnn {scr}{e}{"212F} -\usv_set:nnn {scr}{g}{"210A} -\usv_set:nnn {scr}{o}{"2134} -\usv_set:nnn {cal}{B}{"212C} -\usv_set:nnn {cal}{E}{"2130} -\usv_set:nnn {cal}{F}{"2131} -\usv_set:nnn {cal}{H}{"210B} -\usv_set:nnn {cal}{I}{"2110} -\usv_set:nnn {cal}{L}{"2112} -\usv_set:nnn {cal}{M}{"2133} -\usv_set:nnn {cal}{R}{"211B} -\usv_set:nnn {frak}{C}{"212D} -\usv_set:nnn {frak}{H}{"210C} -\usv_set:nnn {frak}{I}{"2111} -\usv_set:nnn {frak}{R}{"211C} -\usv_set:nnn {frak}{Z}{"2128} -\usv_set:nnn {stixsfup}{partial}{"E17C} -\usv_set:nnn {stixsfup}{Greek}{"E17D} -\usv_set:nnn {stixsfup}{greek}{"E196} -\usv_set:nnn {stixsfup}{varTheta}{"E18E} -\usv_set:nnn {stixsfup}{varepsilon}{"E1AF} -\usv_set:nnn {stixsfup}{vartheta}{"E1B0} -\usv_set:nnn {stixsfup}{varkappa}{0000} % ??? -\usv_set:nnn {stixsfup}{varphi}{"E1B1} -\usv_set:nnn {stixsfup}{varrho}{"E1B2} -\usv_set:nnn {stixsfup}{varpi}{"E1B3} -\usv_set:nnn {stixupslash}{Greek}{"E2FC} -\usv_set:nnn {stixbbit}{A}{"E154} -\usv_set:nnn {stixbbit}{B}{"E155} -\usv_set:nnn {stixbbit}{E}{"E156} -\usv_set:nnn {stixbbit}{F}{"E157} -\usv_set:nnn {stixbbit}{G}{"E158} -\usv_set:nnn {stixbbit}{I}{"E159} -\usv_set:nnn {stixbbit}{J}{"E15A} -\usv_set:nnn {stixbbit}{K}{"E15B} -\usv_set:nnn {stixbbit}{L}{"E15C} -\usv_set:nnn {stixbbit}{M}{"E15D} -\usv_set:nnn {stixbbit}{O}{"E15E} -\usv_set:nnn {stixbbit}{S}{"E15F} -\usv_set:nnn {stixbbit}{T}{"E160} -\usv_set:nnn {stixbbit}{U}{"E161} -\usv_set:nnn {stixbbit}{V}{"E162} -\usv_set:nnn {stixbbit}{W}{"E163} -\usv_set:nnn {stixbbit}{X}{"E164} -\usv_set:nnn {stixbbit}{Y}{"E165} -\usv_set:nnn {stixbbit}{a}{"E166} -\usv_set:nnn {stixbbit}{b}{"E167} -\usv_set:nnn {stixbbit}{c}{"E168} -\usv_set:nnn {stixbbit}{f}{"E169} -\usv_set:nnn {stixbbit}{g}{"E16A} -\usv_set:nnn {stixbbit}{h}{"E16B} -\usv_set:nnn {stixbbit}{k}{"E16C} -\usv_set:nnn {stixbbit}{l}{"E16D} -\usv_set:nnn {stixbbit}{m}{"E16E} -\usv_set:nnn {stixbbit}{n}{"E16F} -\usv_set:nnn {stixbbit}{o}{"E170} -\usv_set:nnn {stixbbit}{p}{"E171} -\usv_set:nnn {stixbbit}{q}{"E172} -\usv_set:nnn {stixbbit}{r}{"E173} -\usv_set:nnn {stixbbit}{s}{"E174} -\usv_set:nnn {stixbbit}{t}{"E175} -\usv_set:nnn {stixbbit}{u}{"E176} -\usv_set:nnn {stixbbit}{v}{"E177} -\usv_set:nnn {stixbbit}{w}{"E178} -\usv_set:nnn {stixbbit}{x}{"E179} -\usv_set:nnn {stixbbit}{y}{"E17A} -\usv_set:nnn {stixbbit}{z}{"E17B} -\usv_set:nnn {stixsfit}{Numerals}{"E1B4} -\usv_set:nnn {stixsfit}{partial}{"E1BE} -\usv_set:nnn {stixsfit}{Greek}{"E1BF} -\usv_set:nnn {stixsfit}{greek}{"E1D8} -\usv_set:nnn {stixsfit}{varTheta}{"E1D0} -\usv_set:nnn {stixsfit}{varepsilon}{"E1F1} -\usv_set:nnn {stixsfit}{vartheta}{"E1F2} -\usv_set:nnn {stixsfit}{varkappa}{0000} % ??? -\usv_set:nnn {stixsfit}{varphi}{"E1F3} -\usv_set:nnn {stixsfit}{varrho}{"E1F4} -\usv_set:nnn {stixsfit}{varpi}{"E1F5} -\usv_set:nnn {stixcal}{Latin}{"E22D} -\usv_set:nnn {stixcal}{num}{"E262} -\usv_set:nnn {scr}{num}{48} -\usv_set:nnn {it}{num}{48} -\usv_set:nnn {stixsfitslash}{Latin}{"E294} -\usv_set:nnn {stixsfitslash}{latin}{"E2C8} -\usv_set:nnn {stixsfitslash}{greek}{"E32C} -\usv_set:nnn {stixsfitslash}{varepsilon}{"E37A} -\usv_set:nnn {stixsfitslash}{vartheta}{"E35E} -\usv_set:nnn {stixsfitslash}{varkappa}{"E374} -\usv_set:nnn {stixsfitslash}{varphi}{"E360} -\usv_set:nnn {stixsfitslash}{varrho}{"E376} -\usv_set:nnn {stixsfitslash}{varpi}{"E362} -\usv_set:nnn {stixsfitslash}{digamma}{"E36A} -\usv_set:nnn {stixbfupslash}{Greek}{"E2FD} -\usv_set:nnn {stixbfupslash}{Digamma}{"E369} -\usv_set:nnn {stixbfbb}{A}{"E38A} -\usv_set:nnn {stixbfbb}{B}{"E38B} -\usv_set:nnn {stixbfbb}{E}{"E38D} -\usv_set:nnn {stixbfbb}{F}{"E38E} -\usv_set:nnn {stixbfbb}{G}{"E38F} -\usv_set:nnn {stixbfbb}{I}{"E390} -\usv_set:nnn {stixbfbb}{J}{"E391} -\usv_set:nnn {stixbfbb}{K}{"E392} -\usv_set:nnn {stixbfbb}{L}{"E393} -\usv_set:nnn {stixbfbb}{M}{"E394} -\usv_set:nnn {stixbfbb}{O}{"E395} -\usv_set:nnn {stixbfbb}{S}{"E396} -\usv_set:nnn {stixbfbb}{T}{"E397} -\usv_set:nnn {stixbfbb}{U}{"E398} -\usv_set:nnn {stixbfbb}{V}{"E399} -\usv_set:nnn {stixbfbb}{W}{"E39A} -\usv_set:nnn {stixbfbb}{X}{"E39B} -\usv_set:nnn {stixbfbb}{Y}{"E39C} -\usv_set:nnn {stixbfbb}{a}{"E39D} -\usv_set:nnn {stixbfbb}{b}{"E39E} -\usv_set:nnn {stixbfbb}{c}{"E39F} -\usv_set:nnn {stixbfbb}{f}{"E3A2} -\usv_set:nnn {stixbfbb}{g}{"E3A3} -\usv_set:nnn {stixbfbb}{h}{"E3A4} -\usv_set:nnn {stixbfbb}{k}{"E3A7} -\usv_set:nnn {stixbfbb}{l}{"E3A8} -\usv_set:nnn {stixbfbb}{m}{"E3A9} -\usv_set:nnn {stixbfbb}{n}{"E3AA} -\usv_set:nnn {stixbfbb}{o}{"E3AB} -\usv_set:nnn {stixbfbb}{p}{"E3AC} -\usv_set:nnn {stixbfbb}{q}{"E3AD} -\usv_set:nnn {stixbfbb}{r}{"E3AE} -\usv_set:nnn {stixbfbb}{s}{"E3AF} -\usv_set:nnn {stixbfbb}{t}{"E3B0} -\usv_set:nnn {stixbfbb}{u}{"E3B1} -\usv_set:nnn {stixbfbb}{v}{"E3B2} -\usv_set:nnn {stixbfbb}{w}{"E3B3} -\usv_set:nnn {stixbfbb}{x}{"E3B4} -\usv_set:nnn {stixbfbb}{y}{"E3B5} -\usv_set:nnn {stixbfbb}{z}{"E3B6} -\usv_set:nnn {stixbfsfup}{Numerals}{"E3B7} -\usv_set:nnn {stixbfsfit}{Numerals}{"E1F6} -\usv_set:nnn {stixbfbbit}{A}{"E200} -\usv_set:nnn {stixbfbbit}{B}{"E201} -\usv_set:nnn {stixbfbbit}{E}{"E203} -\usv_set:nnn {stixbfbbit}{F}{"E204} -\usv_set:nnn {stixbfbbit}{G}{"E205} -\usv_set:nnn {stixbfbbit}{I}{"E206} -\usv_set:nnn {stixbfbbit}{J}{"E207} -\usv_set:nnn {stixbfbbit}{K}{"E208} -\usv_set:nnn {stixbfbbit}{L}{"E209} -\usv_set:nnn {stixbfbbit}{M}{"E20A} -\usv_set:nnn {stixbfbbit}{O}{"E20B} -\usv_set:nnn {stixbfbbit}{S}{"E20C} -\usv_set:nnn {stixbfbbit}{T}{"E20D} -\usv_set:nnn {stixbfbbit}{U}{"E20E} -\usv_set:nnn {stixbfbbit}{V}{"E20F} -\usv_set:nnn {stixbfbbit}{W}{"E210} -\usv_set:nnn {stixbfbbit}{X}{"E211} -\usv_set:nnn {stixbfbbit}{Y}{"E212} -\usv_set:nnn {stixbfbbit}{a}{"E213} -\usv_set:nnn {stixbfbbit}{b}{"E214} -\usv_set:nnn {stixbfbbit}{c}{"E215} -\usv_set:nnn {stixbfbbit}{e}{"E217} -\usv_set:nnn {stixbfbbit}{f}{"E218} -\usv_set:nnn {stixbfbbit}{g}{"E219} -\usv_set:nnn {stixbfbbit}{h}{"E21A} -\usv_set:nnn {stixbfbbit}{k}{"E21D} -\usv_set:nnn {stixbfbbit}{l}{"E21E} -\usv_set:nnn {stixbfbbit}{m}{"E21F} -\usv_set:nnn {stixbfbbit}{n}{"E220} -\usv_set:nnn {stixbfbbit}{o}{"E221} -\usv_set:nnn {stixbfbbit}{p}{"E222} -\usv_set:nnn {stixbfbbit}{q}{"E223} -\usv_set:nnn {stixbfbbit}{r}{"E224} -\usv_set:nnn {stixbfbbit}{s}{"E225} -\usv_set:nnn {stixbfbbit}{t}{"E226} -\usv_set:nnn {stixbfbbit}{u}{"E227} -\usv_set:nnn {stixbfbbit}{v}{"E228} -\usv_set:nnn {stixbfbbit}{w}{"E229} -\usv_set:nnn {stixbfbbit}{x}{"E22A} -\usv_set:nnn {stixbfbbit}{y}{"E22B} -\usv_set:nnn {stixbfbbit}{z}{"E22C} -\usv_set:nnn {stixbfcal}{Latin}{"E247} -\usv_set:nnn {stixbfitslash}{Latin}{"E295} -\usv_set:nnn {stixbfitslash}{latin}{"E2C9} -\usv_set:nnn {stixbfitslash}{greek}{"E32D} -\usv_set:nnn {stixsfitslash}{varepsilon}{"E37B} -\usv_set:nnn {stixsfitslash}{vartheta}{"E35F} -\usv_set:nnn {stixsfitslash}{varkappa}{"E375} -\usv_set:nnn {stixsfitslash}{varphi}{"E361} -\usv_set:nnn {stixsfitslash}{varrho}{"E377} -\usv_set:nnn {stixsfitslash}{varpi}{"E363} -\usv_set:nnn {stixsfitslash}{digamma}{"E36B} +\cs_generate_variant:Nn \fontspec_set_family:Nnn {Nx} +\cs_generate_variant:Nn \fontspec_set_fontface:NNnn {NNx} \DeclareDocumentCommand \unimathsetup {m} { - \clist_clear:N \l_um_unknown_keys_clist - \keys_set:nn {unicode-math} {#1} + \keys_set:nn {unicode-math} {#1} } \keys_define:nn {unicode-math} { normal-style .choice_code:n = @@ -800,23 +283,15 @@ \keys_define:nn {unicode-math} { trace .choice: , trace / debug .code:n = { - \msg_redirect_module:nnn { unicode-math } { trace } { warning } + \msg_redirect_module:nnn { unicode-math } { log } { warning } } , trace / on .code:n = { - \msg_redirect_module:nnn { unicode-math } { trace } { trace } + % default } , trace / off .code:n = { - \msg_redirect_module:nnn { unicode-math } { trace } { none } + \msg_redirect_module:nnn { unicode-math } { log } { none } } , } -\clist_new:N \l_um_unknown_keys_clist -\keys_define:nn {unicode-math} { - unknown .code:n = { - \clist_put_right:No \l_um_unknown_keys_clist { - \l_keys_key_tl = {#1} - } - } -} \unimathsetup {math-style=TeX} \unimathsetup {slash-delimiter=ascii} \unimathsetup {trace=off} @@ -824,2384 +299,85 @@ \unimathsetup {active-frac=small} } \ProcessKeysOptions {unicode-math} -\tl_map_inline:nn { - \new@mathgroup\cdp@list\cdp@elt\DeclareMathSizes - \@DeclareMathSizes\newmathalphabet\newmathalphabet@@\newmathalphabet@@@ - \DeclareMathVersion\define@mathalphabet\define@mathgroup\addtoversion - \version@list\version@elt\alpha@list\alpha@elt - \restore@mathversion\init@restore@version\dorestore@version\process@table - \new@mathversion\DeclareSymbolFont\group@list\group@elt - \new@symbolfont\SetSymbolFont\SetSymbolFont@\get@cdp - \DeclareMathAlphabet\new@mathalphabet\SetMathAlphabet\SetMathAlphabet@ - \DeclareMathAccent\set@mathaccent\DeclareMathSymbol\set@mathchar - \set@mathsymbol\DeclareMathDelimiter\@xxDeclareMathDelimiter - \@DeclareMathDelimiter\@xDeclareMathDelimiter\set@mathdelimiter - \set@@mathdelimiter\DeclareMathRadical\mathchar@type - \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ -}{ - \tl_remove_in:Nn \@preamblecmds {\do#1} -} -\def\new@mathgroup{\alloc@8\mathgroup\chardef\@cclvi} -\let\newfam\new@mathgroup -\cs_set:Npn \um_set_mathsymbol:nNNn #1#2#3#4 { - \prg_case_tl:Nnn #3 { - \mathop { - \um_set_big_operator:nnn {#1} {#2} {#4} - } - \mathopen { - \tl_if_in:NnTF \l_um_radicals_tl {#2} { - \cs_gset_protected_nopar:cpx {\cs_to_str:N #2 sign} { \um_radical:nn {#1} {#4} } - \tl_set:cn {l_um_radical_\cs_to_str:N #2_tl} {\use:c{sym #1}~ #4} - }{ - \um_set_delcode:nnn {#1} {#4} {#4} - \um_set_mathcode:nnn {#4} \mathopen {#1} - \cs_gset_protected_nopar:Npx #2 { \um_delimiter:Nnn \mathopen {#1} {#4} } - } - } - \mathclose { - \um_set_delcode:nnn {#1} {#4} {#4} - \um_set_mathcode:nnn {#4} \mathclose {#1} - \cs_gset_protected_nopar:Npx #2 { \um_delimiter:Nnn \mathclose {#1} {#4} } - } - \mathaccent { - \cs_gset_protected_nopar:Npx #2 { \um_accent:Nnn #3 {#1} {#4} } - } - \mathfence { - \um_set_mathcode:nnn {#4} {#3} {#1} - \um_set_delcode:nnn {#1} {#4} {#4} - \cs_gset_protected_nopar:cpx {l \cs_to_str:N #2} { \um_delimiter:Nnn \mathopen {#1} {#4} } - \cs_gset_protected_nopar:cpx {r \cs_to_str:N #2} { \um_delimiter:Nnn \mathclose {#1} {#4} } - } - \mathover { % LuaTeX only - \cs_set_protected_nopar:Npn #2 ##1 { \mathop { \um_overbrace:nnn {#1} {#4} {##1} } \limits } - } - \mathunder { % LuaTeX only - \cs_set_protected_nopar:Npn #2 ##1 { \mathop { \um_underbrace:nnn {#1} {#4} {##1} } \limits } - } - }{ - \um_set_mathcode:nnn {#4} {#3} {#1} - } -} -\edef\mathfence{\string\mathfence} -\edef\mathover{\string\mathover} -\edef\mathunder{\string\mathunder} -\cs_new:Npn \um_set_big_operator:nnn #1#2#3 { - \group_begin: - \char_set_catcode_active:n {#3} - \char_gmake_mathactive:n {#3} - \um_active_char_set:wc #3 \q_nil { \cs_to_str:N #2 _sym } - \group_end: - \um_set_mathchar:cNnn {\cs_to_str:N #2 op} \mathop {#1} {#3} - \cs_gset:cpx { \cs_to_str:N #2 _sym } { - \exp_not:c { \cs_to_str:N #2 op } - \exp_not:n { \tl_if_in:NnT \l_um_nolimits_tl {#2} \nolimits } - } -} -\cs_set:Npn \um_set_mathcode:nnnn #1#2#3#4 { - \Umathcode \int_eval:n {#1} = - \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: -} -\cs_set:Npn \um_set_mathcode:nnn #1#2#3 { - \Umathcode \int_eval:n {#1} = - \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#1} \scan_stop: -} -\cs_set:Npn \um_set_mathchar:NNnn #1#2#3#4 { - \Umathchardef #1 = - \mathchar@type#2 \csname sym#3\endcsname \int_eval:n {#4} \scan_stop: -} -\cs_new:Npn \um_set_delcode:nnn #1#2#3 { - \Udelcode#2 = \csname sym#1\endcsname #3 -} -\cs_new:Npn \um_radical:nn #1#2 { - \Uradical \csname sym#1\endcsname #2 \scan_stop: -} -\cs_new:Npn \um_delimiter:Nnn #1#2#3 { - \Udelimiter \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: -} -\xetex_or_luatex:nnn { \cs_new:Npn \um_accent:Nnn #1#2#3 } { - \Umathaccent \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: -} { - \Umathaccent \c_um_accent_keyword_tl \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: -} -\luatex_if_engine:T { - \cs_new_nopar:Npn \um_wide_top_accent:Nnn #1 #2 #3 { - \Umathaccent \mathchar@type #1 \use:c { sym #2 } #3 \scan_stop: - } - \bool_if:NTF \c_um_have_fixed_accents_bool { - \cs_new_nopar:Npn \um_wide_bottom_accent:Nnn #1 #2 #3 { - \Umathaccent bottom~ \mathchar@type #1 \use:c { sym #2 } #3 \scan_stop: - } - \tl_const:Nn \c_um_accent_keyword_tl { fixed } - } { - \tl_const:Nn \c_um_accent_keyword_tl { } - } -} -\cs_generate_variant:Nn \um_set_mathchar:NNnn {c} -\cs_set:Npn \um_overbrace:nnn #1#2#3 { - \luatexUdelimiterover \csname sym#1\endcsname #2 {#3} -} -\cs_set:Npn \um_underbrace:nnn #1#2#3 { - \luatexUdelimiterunder \csname sym#1\endcsname #2 {#3} -} -\cs_new:Npn \char_gmake_mathactive:N #1 { - \global\mathcode `#1 = "8000 \scan_stop: -} -\cs_new:Npn \char_gmake_mathactive:n #1 { - \global\mathcode #1 = "8000 \scan_stop: -} -\cs_new_eq:NN \um_saved_ltxe_glb_settings: \glb@settings -\CheckCommand * \glb@settings { - \expandafter\ifx\csname S@\f@size\endcsname\relax - \calculate@math@sizes - \fi - \csname S@\f@size\endcsname - \ifmath@fonts - \begingroup - \escapechar\m@ne - \csname mv@\math@version \endcsname - \globaldefs\@ne - \math@fonts - \let \glb@currsize \f@size - \endgroup - \the\every@math@size - \fi -} -\cs_set_protected_nopar:Npn \glb@settings { - \msg_error:nn { unicode-math } { no-font-selected } -} -\cs_new:Npn \um_init: { - \let\glb@currsize\relax - \cs_set_eq:NN \glb@settings \um_saved_ltxe_glb_settings: - \bool_set_true:N \l_um_init_bool - \seq_clear:N \l_um_char_range_seq - \clist_clear:N \l_um_char_num_range_clist - \seq_clear:N \l_um_mathalph_seq - \clist_clear:N \l_um_unknown_keys_clist - \seq_clear:N \l_um_missing_alph_seq -} -\DeclareDocumentCommand \setmathfont { O{} m } { - \um_init: - \cs_if_exist:cF { S@ \f@size } { \calculate@math@sizes } - \csname S@\f@size\endcsname - \tl_set:Nn \l_um_mversion_tf {normal} - \DeclareMathVersion{\l_um_mversion_tf} - \tl_set:Nn \l_um_script_features_tl {ScriptStyle} - \tl_set:Nn \l_um_sscript_features_tl {ScriptScriptStyle} - \tl_set:Nn \l_um_script_font_tl {#2} - \tl_set:Nn \l_um_sscript_font_tl {#2} - \keys_set:nn {unicode-math} {#1} - \um_fontspec_select_font:n {#2} - \group_begin: - \fontfamily{\zf@family}\selectfont - \fontspec_if_script:nTF {math} - {\bool_gset_true:N \l_um_ot_math_bool} - {\bool_gset_false:N \l_um_ot_math_bool} - \group_end: - \bool_if:NTF \l_um_init_bool { - \tl_set:Nn \um_symfont_tl {operators} - \msg_trace:nnx {unicode-math} {default-math-font} {#2} - \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_noparse:nnn - \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn - \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_noparse:nnn - \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n - \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn - \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_noparse:nn - }{ - \int_incr:N \g_um_fam_int - \tl_set:Nx \um_symfont_tl {um_fam\int_use:N\g_um_fam_int} - \cs_set_eq:NN \_um_sym:nnn \um_process_symbol_parse:nnn - \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_parse:Nnn - \cs_set_eq:NN \um_remap_symbol:nnn \um_remap_symbol_parse:nnn - \cs_set_eq:NN \um_maybe_init_alphabet:n \use_none:n - \cs_set_eq:NN \um_map_char_single:nn \um_map_char_parse:nn - \cs_set_eq:NN \um_assign_delcode:nn \um_assign_delcode_parse:nn - } - \DeclareSymbolFont{\um_symfont_tl} - {\encodingdefault}{\zf@family}{\mddefault}{\updefault} - - \bool_if:nT {\l_um_ot_math_bool && !\g_um_mainfont_already_set_bool} { - \bool_set_true:N \g_um_mainfont_already_set_bool - \dim_compare:nF { \fontdimen 10 \l_um_font == 0pt } { - \DeclareMathSizes { \f@size } { \f@size } - { \um_fontdimen_to_percent:nn{10}{\l_um_font}\dimexpr \f@size pt\relax } - { \um_fontdimen_to_percent:nn{11}{\l_um_font}\dimexpr \f@size pt\relax } - } - \fontspec_select:xn {\l_um_font_keyval_tl, - Scale=1.00001, - FontAdjustment={ - \fontdimen8\font= \um_get_fontparam:nn {43} {FractionNumeratorDisplayStyleShiftUp}\relax - \fontdimen9\font= \um_get_fontparam:nn {42} {FractionNumeratorShiftUp}\relax - \fontdimen10\font=\um_get_fontparam:nn {32} {StackTopShiftUp}\relax - \fontdimen11\font=\um_get_fontparam:nn {45} {FractionDenominatorDisplayStyleShiftDown}\relax - \fontdimen12\font=\um_get_fontparam:nn {44} {FractionDenominatorShiftDown}\relax - \fontdimen13\font=\um_get_fontparam:nn {21} {SuperscriptShiftUp}\relax - \fontdimen14\font=\um_get_fontparam:nn {21} {SuperscriptShiftUp}\relax - \fontdimen15\font=\um_get_fontparam:nn {22} {SuperscriptShiftUpCramped}\relax - \fontdimen16\font=\um_get_fontparam:nn {18} {SubscriptShiftDown}\relax - \fontdimen17\font=\um_get_fontparam:nn {18} {SubscriptShiftDownWithSuperscript}\relax - \fontdimen18\font=\um_get_fontparam:nn {24} {SuperscriptBaselineDropMax}\relax - \fontdimen19\font=\um_get_fontparam:nn {20} {SubscriptBaselineDropMin}\relax - \fontdimen20\font=0pt\relax % delim1 = FractionDelimiterDisplaySize - \fontdimen21\font=0pt\relax % delim2 = FractionDelimiterSize - \fontdimen22\font=\um_get_fontparam:nn {15} {AxisHeight}\relax - } - } {#2} - \DeclareSymbolFont{symbols} - {\encodingdefault}{\zf@family}{\mddefault}{\updefault} - \fontspec_select:xn {\l_um_font_keyval_tl, - Scale=0.99999, - FontAdjustment={ - \fontdimen8\font= \um_get_fontparam:nn {48} {FractionRuleThickness}\relax - \fontdimen9\font= \um_get_fontparam:nn {28} {UpperLimitGapMin}\relax - \fontdimen10\font=\um_get_fontparam:nn {30} {LowerLimitGapMin}\relax - \fontdimen11\font=\um_get_fontparam:nn {29} {UpperLimitBaselineRiseMin}\relax - \fontdimen12\font=\um_get_fontparam:nn {31} {LowerLimitBaselineDropMin}\relax - \fontdimen13\font=0pt\relax - } - } {#2} - \DeclareSymbolFont{largesymbols} - {\encodingdefault}{\zf@family}{\mddefault}{\updefault} - } - \um_input_math_symbol_table: - \um_remap_symbols: - \um_setup_mathactives: - \um_setup_accents: - \um_setup_delcodes: - \um_setup_alphabets: - \ignorespaces -} -\xetex_or_luatex:nnn { \cs_new:Nn \um_get_fontparam:nn } { - \the\fontdimen#1\zf@basefont\relax -}{ - \directlua{fontspec.mathfontdimen("zf@basefont","#2")} -} -\DeclareDocumentCommand \resetmathfont { O{} m } { - \bool_set_false:N \g_um_mainfont_already_set_bool - \setmathfont[#1]{#2} -} -\cs_new:Npn \um_fontspec_select_font:n #1 { - \tl_set:Nx \l_um_font_keyval_tl { - \luatex_if_engine:T { Renderer = Basic, } - BoldFont = {}, ItalicFont = {}, - Script = Math, - SizeFeatures = { - {Size = \tf@size-} , - {Size = \sf@size-\tf@size , - Font = \l_um_script_font_tl , - \l_um_script_features_tl - } , - {Size = -\sf@size , - Font = \l_um_sscript_font_tl , - \l_um_sscript_features_tl - } - }, - \l_um_unknown_keys_clist - } - \fontspec_select:xn {\l_um_font_keyval_tl} {#1} - \tl_set_eq:NN \l_um_font \zf@basefont -} -\cs_set:Npn \um_process_symbol_noparse:nnn #1#2#3 { - \um_set_mathsymbol:nNNn {\um_symfont_tl} #2#3{#1} -} -\cs_set:Npn \um_process_symbol_parse:nnn #1#2#3 { - \um@parse@term{#1}{#2}{#3}{ - \um_process_symbol_noparse:nnn {#1}{#2}{#3} - } -} -\cs_new:Npn \um_remap_symbols: { - \um_remap_symbol:nnn{`\-}{\mathbin}{"02212}% hyphen to minus - \um_remap_symbol:nnn{`\*}{\mathbin}{"02217}% text asterisk to "centred asterisk" - \bool_if:NF \g_um_literal_colon_bool { - \um_remap_symbol:nnn{`\:}{\mathrel}{"02236}% colon to ratio (i.e., punct to rel) - } -} -\cs_new:Npn \um_remap_symbol_parse:nnn #1#2#3 { - \um@parse@term {#3} {\@nil} {#2} { - \um_remap_symbol_noparse:nnn {#1} {#2} {#3} - } -} -\cs_new:Npn \um_remap_symbol_noparse:nnn #1#2#3 { - \clist_map_inline:nn {#1} { - \um_set_mathcode:nnnn {##1} {#2} {\um_symfont_tl} {#3} - } -} -\cs_new:Npn \um_setup_mathactives: { - \um_make_mathactive:nNN {"2032} \um_prime_single_mchar \mathord - \um_make_mathactive:nNN {"2033} \um_prime_double_mchar \mathord - \um_make_mathactive:nNN {"2034} \um_prime_triple_mchar \mathord - \um_make_mathactive:nNN {"2057} \um_prime_quad_mchar \mathord - \um_make_mathactive:nNN {"2035} \um_backprime_single_mchar \mathord - \um_make_mathactive:nNN {"2036} \um_backprime_double_mchar \mathord - \um_make_mathactive:nNN {"2037} \um_backprime_triple_mchar \mathord - \um_make_mathactive:nNN {`\'} \mathstraightquote \mathord - \um_make_mathactive:nNN {`\`} \mathbacktick \mathord -} -\cs_new:Npn \um_make_mathactive:nNN #1#2#3 { - \um_set_mathchar:NNnn #2 #3 {\um_symfont_tl} {#1} - \char_gmake_mathactive:n {#1} -} -\cs_new:Npn \um_assign_delcode_noparse:nn #1#2 { - \um_set_delcode:nnn \um_symfont_tl {#1} {#2} -} -\cs_new:Npn \um_assign_delcode_parse:nn #1#2 { - \um@parse@term {#2}{\@nil}{\@nil} { - \um_assign_delcode_noparse:nn {#1} {#2} - } -} -\cs_new:Npn \um_assign_delcode:n #1 { - \um_assign_delcode:nn {#1} {#1} -} -\cs_new:Npn \um_setup_delcodes: { - \um_assign_delcode:nn {`\/} {\g_um_slash_delimiter_usv} - \um_assign_delcode:nn {"2044} {\g_um_slash_delimiter_usv} % fracslash - \um_assign_delcode:nn {"2215} {\g_um_slash_delimiter_usv} % divslash - \um_assign_delcode:n {"005C} % backslash - \um_assign_delcode:nn {`\<} {"27E8} % angle brackets with ascii notation - \um_assign_delcode:nn {`\>} {"27E9} % angle brackets with ascii notation - \um_assign_delcode:n {"2191} % up arrow - \um_assign_delcode:n {"2193} % down arrow - \um_assign_delcode:n {"2195} % updown arrow - \um_assign_delcode:n {"219F} % up arrow twohead - \um_assign_delcode:n {"21A1} % down arrow twohead - \um_assign_delcode:n {"21A5} % up arrow from bar - \um_assign_delcode:n {"21A7} % down arrow from bar - \um_assign_delcode:n {"21A8} % updown arrow from bar - \um_assign_delcode:n {"21BE} % up harpoon right - \um_assign_delcode:n {"21BF} % up harpoon left - \um_assign_delcode:n {"21C2} % down harpoon right - \um_assign_delcode:n {"21C3} % down harpoon left - \um_assign_delcode:n {"21C5} % arrows up down - \um_assign_delcode:n {"21F5} % arrows down up - \um_assign_delcode:n {"21C8} % arrows up up - \um_assign_delcode:n {"21CA} % arrows down down - \um_assign_delcode:n {"21D1} % double up arrow - \um_assign_delcode:n {"21D3} % double down arrow - \um_assign_delcode:n {"21D5} % double updown arrow - \um_assign_delcode:n {"21DE} % up arrow double stroke - \um_assign_delcode:n {"21DF} % down arrow double stroke - \um_assign_delcode:n {"21E1} % up arrow dashed - \um_assign_delcode:n {"21E3} % down arrow dashed - \um_assign_delcode:n {"21E7} % up white arrow - \um_assign_delcode:n {"21E9} % down white arrow - \um_assign_delcode:n {"21EA} % up white arrow from bar - \um_assign_delcode:n {"21F3} % updown white arrow -} -\tl_new:Nn \l_um_nolimits_tl { - \int\iint\iiint\iiiint\oint\oiint\oiiint - \intclockwise\varointclockwise\ointctrclockwise\sumint - \intbar\intBar\fint\cirfnint\awint\rppolint - \scpolint\npolint\pointint\sqint\intlarhk\intx - \intcap\intcup\upint\lowint -} -\DeclareDocumentCommand \addnolimits {m} { - \tl_put_right:Nn \l_um_nolimits_tl {#1} -} -\DeclareDocumentCommand \removenolimits {m} { - \tl_remove_all_in:Nn \l_um_nolimits_tl {#1} -} -\tl_new:Nn \l_um_radicals_tl {\sqrt} -\cs_new_protected_nopar:Npn \um_new_cramped_style:N #1 { - \xetex_or_luatex:nn { - \quark_new:N #1 - } { - \cs_new_eq:Nc #1 { luatex \cs_to_str:N #1 } - } -} -\um_new_cramped_style:N \crampeddisplaystyle -\um_new_cramped_style:N \crampedtextstyle -\um_new_cramped_style:N \crampedscriptstyle -\um_new_cramped_style:N \crampedscriptscriptstyle -\xetex_if_engine:T { - \cs_new_nopar:Npn \um_font_dimen:Nnnnn #1 #2 #3 #4 #5 { - \fontdimen - \cs_if_eq:NNTF #1 \displaystyle { - #2 \textfont - } { - \cs_if_eq:NNTF #1 \crampeddisplaystyle { - #3 \textfont - } { - \cs_if_eq:NNTF #1 \textstyle { - #4 \textfont - } { - \cs_if_eq:NNTF #1 \crampedtextstyle { - #5 \textfont - } { - \cs_if_eq:NNTF #1 \scriptstyle { - #4 \scriptfont - } { - \cs_if_eq:NNTF #1 \crampedscriptstyle { - #5 \scriptfont - } { - \cs_if_eq:NNTF #1 \scriptscriptstyle { - #4 \scriptscriptfont - } { - #5 \scriptscriptfont - } - } - } - } - } - } - } - \c_two - } -} -\xetex_or_luatex:nnn { - \cs_new_protected_nopar:Npn \um_font_param:nnnnn #1 #2 #3 #4 #5 -} { - \um_font_param_aux:ccnnnn { um_ #1 :N } { um_set_ #1 :N } - { #2 } { #3 } { #4 } { #5 } -} { - \tl_set:Nn \l_um_tmpa_tl { #1 } - \tl_remove_all_in:Nn \l_um_tmpa_tl { _ } - \um_font_param_aux:ccc { um_ #1 :N } { um_set_ #1 :N } - { luatexUmath \l_um_tmpa_tl } -} -\cs_new_protected_nopar:Npn \um_font_param:nnn #1 #2 #3 { - \um_font_param:nnnnn { #1 } { #2 } { #2 } { #3 } { #3 } -} -\cs_new_protected_nopar:Npn \um_font_param:nn #1 #2 { - \um_font_param:nnnnn { #1 } { #2 } { #2 } { #2 } { #2 } -} -\xetex_or_luatex:nnn { - \cs_new_protected_nopar:Npn \um_font_param:n #1 -} { } { - \um_font_param:nnnnn { #1 } { 0 } { 0 } { 0 } { 0 } -} -\xetex_or_luatex:nn { - \cs_new_protected_nopar:Npn \um_font_param_aux:NNnnnn #1 #2 #3 #4 #5 #6 { - \cs_new_nopar:Npn #1 ##1 { - \um_font_dimen:Nnnnn ##1 { #3 } { #4 } { #5 } { #6 } - } - \cs_new_protected_nopar:Npn #2 ##1 ##2 { - #1 ##1 \dim_eval:n { ##2 } - } - } - \cs_generate_variant:Nn \um_font_param_aux:NNnnnn { cc } -} { - \cs_new_protected_nopar:Npn \um_font_param_aux:NNN #1 #2 #3 { - \cs_new_nopar:Npn #1 ##1 { - #3 ##1 - } - \cs_new_protected_nopar:Npn #2 ##1 ##2 { - #3 ##1 \dim_eval:n { ##2 } - } - } - \cs_generate_variant:Nn \um_font_param_aux:NNN { ccc } -} -\um_font_param:nn { axis } { 15 } -\um_font_param:nn { operator_size } { 13 } -\um_font_param:n { fraction_del_size } -\um_font_param:nnn { fraction_denom_down } { 45 } { 44 } -\um_font_param:nnn { fraction_denom_vgap } { 50 } { 49 } -\um_font_param:nnn { fraction_num_up } { 43 } { 42 } -\um_font_param:nnn { fraction_num_vgap } { 47 } { 46 } -\um_font_param:nn { fraction_rule } { 48 } -\um_font_param:nn { limit_above_bgap } { 29 } -\um_font_param:n { limit_above_kern } -\um_font_param:nn { limit_above_vgap } { 28 } -\um_font_param:nn { limit_below_bgap } { 31 } -\um_font_param:n { limit_below_kern } -\um_font_param:nn { limit_below_vgap } { 30 } -\um_font_param:nn { over_delimiter_vgap } { 41 } -\um_font_param:nn { over_delimiter_bgap } { 38 } -\um_font_param:nn { under_delimiter_vgap } { 40 } -\um_font_param:nn { under_delimiter_bgap } { 39 } -\um_font_param:nn { overbar_kern } { 55 } -\um_font_param:nn { overbar_rule } { 54 } -\um_font_param:nn { overbar_vgap } { 53 } -\um_font_param:n { quad } -\um_font_param:nn { radical_kern } { 62 } -\um_font_param:nn { radical_rule } { 61 } -\um_font_param:nnn { radical_vgap } { 60 } { 59 } -\um_font_param:nn { radical_degree_before } { 63 } -\um_font_param:nn { radical_degree_after } { 64 } -\um_font_param:nn { radical_degree_raise } { 65 } -\um_font_param:nn { space_after_script } { 27 } -\um_font_param:nnn { stack_denom_down } { 35 } { 34 } -\um_font_param:nnn { stack_num_up } { 33 } { 32 } -\um_font_param:nnn { stack_vgap } { 37 } { 36 } -\um_font_param:nn { sub_shift_down } { 18 } -\um_font_param:nn { sub_shift_drop } { 20 } -\um_font_param:n { subsup_shift_down } -\um_font_param:nn { sub_top_max } { 19 } -\um_font_param:nn { subsup_vgap } { 25 } -\um_font_param:nn { sup_bottom_min } { 23 } -\um_font_param:nn { sup_shift_drop } { 24 } -\um_font_param:nnnnn { sup_shift_up } { 21 } { 22 } { 21 } { 22 } -\um_font_param:nn { supsub_bottom_max } { 26 } -\um_font_param:nn { underbar_kern } { 58 } -\um_font_param:nn { underbar_rule } { 57 } -\um_font_param:nn { underbar_vgap } { 56 } -\um_font_param:n { connector_overlap_min } -\keys_define:nn {unicode-math} +\cs_new:Npn \um_warning:n { \msg_warning:nn {unicode-math} } +\cs_new:Npn \um_log:n { \msg_log:nn {unicode-math} } +\cs_new:Npn \um_log:nx { \msg_log:nnx {unicode-math} } +\msg_new:nnn {unicode-math} {no-tfrac} { - script-features .tl_set:N = \l_um_script_features_tl , - sscript-features .tl_set:N = \l_um_sscript_features_tl , - script-font .tl_set:N = \l_um_script_font_tl , - sscript-font .tl_set:N = \l_um_sscript_font_tl , -} -\seq_new:N \l_um_mathalph_seq -\seq_new:N \l_um_char_range_seq -\keys_define:nn {unicode-math} { - range .code:n = { - \bool_set_false:N \l_um_init_bool - \seq_clear:N \l_um_char_range_seq - \seq_clear:N \l_um_mathalph_seq - \clist_map_inline:nn {#1} { - \um_if_mathalph_decl:nTF {##1} { - \seq_put_right:Nx \l_um_mathalph_seq { - { \exp_not:V \l_um_tmpa_tl } - { \exp_not:V \l_um_tmpb_tl } - { \exp_not:V \l_um_tmpc_tl } - } - }{ - \seq_put_right:Nn \l_um_char_range_seq {##1} - } - } - } -} -\prg_new_conditional:Nnn \um_if_mathalph_decl:n {TF} { - \tl_set:Nx \l_um_tmpa_tl { \trim@spaces@noexp {#1} } - \tl_clear:N \l_um_tmpb_tl - \tl_clear:N \l_um_tmpc_tl - \tl_if_in:NnT \l_um_tmpa_tl {->} { - \exp_after:wN \um_split_arrow:w \l_um_tmpa_tl \q_nil - } - \tl_if_in:NnT \l_um_tmpa_tl {/} { - \exp_after:wN \um_split_slash:w \l_um_tmpa_tl \q_nil - } - \tl_if_empty:NT \l_um_tmpc_tl { \tl_set_eq:NN \l_um_tmpc_tl \l_um_tmpa_tl } - \seq_if_in:NVTF \g_um_mathstyles_seq \l_um_tmpa_tl { - \prg_return_true: - }{ - \prg_return_false: - } -} -\cs_set:Npn \um_split_arrow:w #1->#2 \q_nil { - \tl_set:Nn \l_um_tmpa_tl {#1} - \tl_if_single:nTF {#2} - { \tl_set:Nn \l_um_tmpc_tl {#2} } - { \exp_args:NNc \tl_set:Nn \l_um_tmpc_tl {math#2} } -} -\cs_set:Npn \um_split_slash:w #1/#2 \q_nil { - \tl_set:Nn \l_um_tmpa_tl {#1} - \tl_set:Nn \l_um_tmpb_tl {#2} -} -\newcommand\um@parse@term[4]{ - \seq_map_variable:NNn \l_um_char_range_seq \@ii { - \unless\ifx\@ii\@empty - \@tempswafalse - \expandafter\um@firstchar\expandafter{\@ii} - \ifx\@tempa\um@backslash - \expandafter\ifx\@ii#2\relax - \@tempswatrue - \else - \expandafter\ifx\@ii#3\relax - \@tempswatrue - \fi - \fi - \else - \expandafter\um@parse@range\@ii-\@marker-\@nil#1\@nil - \fi - \if@tempswa - \clist_put_right:Nx \l_um_char_num_range_clist { \int_eval:n {#1} } - #4 - \fi - \fi - } -} -\def\um@firstof#1#2\@nil{#1} -\edef\um@backslash{\expandafter\um@firstof\string\string\@nil} -\def\um@firstchar#1{\edef\@tempa{\expandafter\um@firstof\string#1\@nil}} -\def\um@parse@range#1-#2-#3\@nil#4\@nil{ - \def\@tempa{#1} - \def\@tempb{#2} - \expandafter\ifx\expandafter\@marker\@tempb\relax - \int_compare:nT {#4=#1} \@tempswatrue - \else - \ifx\@empty\@tempb - \int_compare:nT {#4>#1-1} \@tempswatrue - \else - \ifx\@empty\@tempa - \int_compare:nT {#4<#2+1} \@tempswatrue - \else - \int_compare:nT {#4>#1-1} { - \int_compare:nT {#4<#2+1} \@tempswatrue - } - \fi - \fi - \fi -} -\AtBeginDocument{\um_resolve_greek:} -\cs_new:Npn \um_resolve_greek: { - \clist_map_inline:nn { - Alpha,Beta,Gamma,Delta,Epsilon,Zeta,Eta,Theta,Iota,Kappa,Lambda, - alpha,beta,gamma,delta, zeta,eta,theta,iota,kappa,lambda, - Mu,Nu,Xi,Omicron,Pi,Rho,Sigma,Tau,Upsilon,Phi,Chi,Psi,Omega, - mu,nu,xi,omicron,pi,rho,sigma,tau,upsilon, chi,psi,omega, - varTheta, - varsigma,vartheta,varkappa,varrho,varpi - }{ - \tl_set:cx {##1} { \exp_not:c { mit ##1 } } - } - \tl_set:Nn \epsilon { - \bool_if:NTF \g_um_texgreek_bool \mitvarepsilon \mitepsilon - } - \tl_set:Nn \phi { - \bool_if:NTF \g_um_texgreek_bool \mitvarphi \mitphi - } - \tl_set:Nn \varepsilon { - \bool_if:NTF \g_um_texgreek_bool \mitepsilon \mitvarepsilon - } - \tl_set:Nn \varphi { - \bool_if:NTF \g_um_texgreek_bool \mitphi \mitvarphi - } + Small~ fraction~ command~ \protect\tfrac\ not~ defined.\\ + Load~ amsmath~ or~ define~ it~ manually~ before~ loading~ unicode-math. } -\cs_new:Npn \um_new_mathstyle:N #1 { - \um_prepare_mathstyle:f {\exp_after:wN \use_none:nnnnn \token_to_str:N #1} - \seq_put_right:Nn \g_um_mathstyles_seq {#1} +\msg_new:nnn {unicode-math} {default-math-font} +{ + Defining~ the~ default~ maths~ font~ as~ '\l_um_fontname_tl'. } -\seq_new:N \g_um_default_mathalph_seq -\seq_new:N \g_um_mathstyles_seq -\AtEndOfPackage{ -\clist_map_inline:nn { - {\mathup } {latin,Latin,greek,Greek,num,misc} {\mathup } , - {\mathit } {latin,Latin,greek,Greek,misc} {\mathit } , - {\mathbb } {latin,Latin,num,misc} {\mathbb } , - {\mathbbit } {misc} {\mathbbit } , - {\mathscr } {latin,Latin} {\mathscr } , - {\mathcal } {Latin} {\mathscr } , - {\mathbfcal } {Latin} {\mathbfscr } , - {\mathfrak } {latin,Latin} {\mathfrak } , - {\mathtt } {latin,Latin,num} {\mathtt } , - {\mathsfup } {latin,Latin,num} {\mathsfup } , - {\mathsfit } {latin,Latin} {\mathsfit } , - {\mathbfup } {latin,Latin,greek,Greek,num,misc} {\mathbfup } , - {\mathbfit } {latin,Latin,greek,Greek,misc} {\mathbfit } , - {\mathbfscr } {latin,Latin} {\mathbfscr } , - {\mathbffrak} {latin,Latin} {\mathbffrak} , - {\mathbfsfup} {latin,Latin,greek,Greek,num,misc} {\mathbfsfup} , - {\mathbfsfit} {latin,Latin,greek,Greek,misc} {\mathbfsfit} -}{ - \seq_put_right:Nn \g_um_default_mathalph_seq {#1} - \exp_after:wN \um_new_mathstyle:N \use_i:nnn #1 +\msg_new:nnn {unicode-math} {setup-implicit} +{ + Setup~ alphabets:~ implicit~ mode. } -\um_new_mathstyle:N \mathsf -\um_new_mathstyle:N \mathbf -\um_new_mathstyle:N \mathbfsf +\msg_new:nnn {unicode-math} {setup-explicit} +{ + Setup~ alphabets:~ explicit~ mode. } -\cs_new:Npn \um_prepare_mathstyle:n #1 { - \um_init_alphabet:x {#1} - \cs_set:cpn {_um_math#1_aux:n} ##1 { - \use:c {um_switchto_math#1:} ##1 \egroup - } - \cs_set_protected:cpx {math#1} { - \exp_not:n{ - \bgroup - \mode_if_math:F { - \egroup\expandafter - \non@alpherr\expandafter{\csname math#1\endcsname\space} - } - } - \exp_not:c {_um_math#1_aux:n} - } +\msg_new:nnn {unicode-math} {alph-initialise} +{ + Initialising~ \@backslashchar math#1. } -\cs_generate_variant:Nn \um_prepare_mathstyle:n {f} -\cs_set:Npn \um_init_alphabet:n #1 { - \um_trace:nx {alph-initialise} {#1} - \cs_set_eq:cN {um_switchto_math#1:} \prg_do_nothing: +\msg_new:nnn {unicode-math} {setup-alph} +{ + Setup~ alphabet:~ #1. } -\cs_generate_variant:Nn \um_init_alphabet:n {x} -\cs_new:Npn \um_maybe_init_alphabet:V { - \exp_args:NV \um_maybe_init_alphabet:n +\msg_new:nnnn { unicode-math } { no-font-selected } { + You've~ loaded~ the~ unicode-math~ package,~ but~ you~ forgot~ to~ select \\ + a~ Unicode~ math~ font.~ Please~ select~ one~ with~ the~ \token_to_str:N \setmathfont \\ + command. +} { + Loading~ the~ unicode-math~ package~ without~ using~ a~ Unicode~ math~ font \\ + is~ not~ supported.~ Either~ select~ a~ Unicode~ math~ font,~ or~ don't~ load \\ + the~ unicode-math~ package. } -\seq_new:N \l_um_missing_alph_seq -\cs_new:Npn \um_setup_alphabets: { - \seq_if_empty:NTF \l_um_mathalph_seq { - \um_trace:n {setup-implicit} - \seq_set_eq:NN \l_um_mathalph_seq \g_um_default_mathalph_seq - \bool_set_true:N \l_um_implicit_alph_bool - \um_maybe_init_alphabet:n {sf} - \um_maybe_init_alphabet:n {bf} - \um_maybe_init_alphabet:n {bfsf} - } +\msg_new:nnn { unicode-math } { missing-alphabets } { - \um_trace:n {setup-explicit} - \bool_set_false:N \l_um_implicit_alph_bool - \cs_set_eq:NN \um_set_mathalphabet_char:Nnn \um_mathmap_noparse:Nnn - \cs_set_eq:NN \um_map_char_single:nn \um_map_char_noparse:nn - } - \seq_map_inline:Nn \l_um_mathalph_seq { - \tl_set:No \l_um_tmpa_tl { \use_i:nnn ##1 } - \tl_set:No \l_um_tmpb_tl { \use_ii:nnn ##1 } - \tl_set:No \l_um_remap_style_tl { \use_iii:nnn ##1 } - \tl_set:Nx \l_um_remap_style_tl { - \exp_after:wN \exp_after:wN \exp_after:wN \use_none:nnnnn - \exp_after:wN \token_to_str:N \l_um_remap_style_tl - } - \tl_if_empty:NT \l_um_tmpb_tl { - \cs_set_eq:NN \um_maybe_init_alphabet:n \um_init_alphabet:n - \tl_set:Nn \l_um_tmpb_tl { latin,Latin,greek,Greek,num,misc } - } - \um_setup_math_alphabet:VVV - \l_um_tmpa_tl \l_um_tmpb_tl \l_um_remap_style_tl - } - \um_warn_missing_alphabets: -} -\cs_new:Npn \um_warn_missing_alphabets: { - \seq_if_empty:NF \l_um_missing_alph_seq { - \typeout{ - Package~unicode-math~Warning:~ - missing~math~alphabets~in~font~ \fontname\l_um_font - } - \seq_map_inline:Nn \l_um_missing_alph_seq { - \typeout{\space\space\space\space##1} - } - } -} -\cs_new:Npn \um_setup_math_alphabet:Nnn #1#2#3 { - \tl_set:Nx \l_um_style_tl { - \exp_after:wN \use_none:nnnnn \token_to_str:N #1 - } - \clist_map_inline:nn {#2} { - \tl_set:Nx \l_um_tmpa_tl { \trim@spaces {##1} } - \cs_if_exist:cT {um_config_ \l_um_style_tl _\l_um_tmpa_tl :n} { - \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { - \um_maybe_init_alphabet:V \l_um_style_tl - \clist_map_break: - }{ - \um_glyph_if_exist:cT { \um_to_usv:nn {#3}{\l_um_tmpa_tl} }{ - \um_maybe_init_alphabet:V \l_um_style_tl - \clist_map_break: - } - } - } - } - \clist_map_inline:nn {#2} { - \tl_set:Nx \l_um_tmpa_tl { \trim@spaces {##1} } - \cs_if_exist:cT {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} { - \str_if_eq:xxTF {\l_um_tmpa_tl}{misc} { - \um_trace:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} - \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} - }{ - \um_glyph_if_exist:cTF { \um_to_usv:nn {#3}{\l_um_tmpa_tl} } { - \um_trace:nx {setup-alph} {math \l_um_style_tl~(\l_um_tmpa_tl)} - \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {#3} - }{ - \bool_if:NTF \l_um_implicit_alph_bool { - \seq_put_right:Nx \l_um_missing_alph_seq { - \@backslashchar math \l_um_style_tl \space - (\tl_use:c{g_um_math_alphabet_name_ \l_um_tmpa_tl _tl}) - } - }{ - \use:c {um_config_ \l_um_style_tl _ \l_um_tmpa_tl :n} {up} - } - } - } - } + Missing~math~alphabets~in~font~ "\fontname\l_um_font" \\ \\ + \seq_map_function:NN \l_um_missing_alph_seq \um_print_indent:n } +\cs_new:Nn \um_print_indent:n { \space\space\space\space #1 \\ } +\msg_new:nnn {unicode-math} {macro-expected} +{ + I've~ expected~ that~ #1~ is~ a~ macro,~ but~ it~ isn't. } -\cs_generate_variant:Nn \um_setup_math_alphabet:Nnn {VVV} -\cs_new:Npn \um_map_char_single:cc { \exp_args:Ncc \um_map_char_single:nn } -\cs_new:Npn \um_map_char_noparse:nn #1#2 { - \um_set_mathcode:nnnn {#1}{\mathalpha}{\um_symfont_tl}{#2} +\msg_new:nnn {unicode-math} {wrong-meaning} +{ + I've~ expected~ #1~ to~ have~ the~ meaning~ #3,~ but~ it~ has~ the~ meaning~ #2. } -\cs_new:Npn \um_map_char_parse:nn #1#2 { - \um@parse@term {#1} {\@nil} {\mathalpha} { - \um_map_char_noparse:nn {#1}{#2} - } +\msg_new:nnn {unicode-math} {patch-macro} +{ + I'm~ going~ to~ patch~ macro~ #1. } -\cs_new:Npn \um_map_char_single:nnn #1#2#3 { - \um_map_char_single:cc { \um_to_usv:nn {#1}{#3} } - { \um_to_usv:nn {#2}{#3} } +\msg_new:nnn { unicode-math } { mathtools } { + I'm~ going~ to~ overwrite~ the~ following~ commands~ from \\ + the~ `mathtools'~ package: \\ + \token_to_str:N \dblcolon,~ + \token_to_str:N \coloneqq,~ + \token_to_str:N \Coloneqq,~ + \token_to_str:N \eqqcolon. \\ + Note~ that~ since~ I~ won't~ overwrite~ the~ other~ colon-like \\ + commands,~ using~ them~ will~ lead~ to~ inconsistencies. } -\cs_set:Npn \um_map_single:nnn #1#2#3 { - \cs_if_exist:cT { \um_to_usv:nn {#3} {#1} } - { - \clist_map_inline:nn {#2} { - \um_map_char_single:nnn {##1} {#3} {#1} - } - } -} -\cs_set:Npn \um_map_chars_range:nnn #1#2#3 { - \prg_stepwise_inline:nnnn {0}{1}{#1-1} { - \um_map_char_single:nn {#2+##1}{#3+##1} - } -} -\cs_generate_variant:Nn \um_map_chars_range:nnn {ncc} -\cs_new:Npn \um_map_chars_range:nnnn #1#2#3#4 { - \um_map_chars_range:ncc {#1} { \um_to_usv:nn {#2}{#4} } - { \um_to_usv:nn {#3}{#4} } -} -\cs_set:Npn \um_map_chars_Latin:nn #1#2 { - \clist_map_inline:nn {#1} { - \um_map_chars_range:nnnn {26} {##1} {#2} {Latin} - } -} -\cs_set:Npn \um_map_chars_latin:nn #1#2 { - \clist_map_inline:nn {#1} { - \um_map_chars_range:nnnn {26} {##1} {#2} {latin} - } -} -\cs_set:Npn \um_map_chars_greek:nn #1#2 { - \clist_map_inline:nn {#1} { - \um_map_chars_range:nnnn {25} {##1} {#2} {greek} - \um_map_char_single:nnn {##1} {#2} {varepsilon} - \um_map_char_single:nnn {##1} {#2} {vartheta} - \um_map_char_single:nnn {##1} {#2} {varkappa} - \um_map_char_single:nnn {##1} {#2} {varphi} - \um_map_char_single:nnn {##1} {#2} {varrho} - \um_map_char_single:nnn {##1} {#2} {varpi} - } -} -\cs_set:Npn \um_map_chars_Greek:nn #1#2 { - \clist_map_inline:nn {#1} { - \um_map_chars_range:nnnn {25} {##1} {#2} {Greek} - \um_map_char_single:nnn {##1} {#2} {varTheta} - } -} -\cs_set:Npn \um_map_chars_numbers:nn #1#2 { - \um_map_chars_range:nnnn {10} {#1} {#2} {num} -} -\cs_new:Npn \um_set_mathalphabet_char:Ncc { - \exp_args:NNcc \um_set_mathalphabet_char:Nnn -} -\cs_set:Npn \um_mathmap_noparse:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \tl_put_right:cx {um_switchto_\cs_to_str:N #1:} { - \um_set_mathcode:nnnn{##1}{\mathalpha}{\um_symfont_tl}{#3} - } - } -} -\cs_set:Npn \um_mathmap_parse:Nnn #1#2#3 { - \clist_if_in:NnT \l_um_char_num_range_clist {#3} { - \um_mathmap_noparse:Nnn {#1}{#2}{#3} - } -} -\cs_new:Npn \um_set_mathalphabet_char:Nnnn #1#2#3#4 { - \um_set_mathalphabet_char:Ncc #1 { \um_to_usv:nn {#2} {#4} } - { \um_to_usv:nn {#3} {#4} } -} -\cs_new:Npn \um_set_mathalph_range:nNnn #1#2#3#4 { - \prg_stepwise_inline:nnnn {0}{1}{#1-1} { - \um_set_mathalphabet_char:Nnn {#2} { ##1 + #3 } { ##1 + #4 } - } -} -\cs_generate_variant:Nn \um_set_mathalph_range:nNnn {nNcc} -\cs_new:Npn \um_set_mathalph_range:nNnnn #1#2#3#4#5 { - \um_set_mathalph_range:nNcc {#1} #2 { \um_to_usv:nn {#3} {#5} } - { \um_to_usv:nn {#4} {#5} } -} -\cs_new:Npn \um_set_mathalphabet_pos:Nnnn #1#2#3#4 { - \cs_if_exist:cT { \um_to_usv:nn {#4}{#2} } { - \clist_map_inline:nn {#3} { - \um_set_mathalphabet_char:Nnnn #1 {##1} {#4} {#2} - } - } -} -\cs_new:Npn \um_set_mathalphabet_numbers:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {10} #1 {##1} {#3} {num} - } -} -\cs_new:Npn \um_set_mathalphabet_Latin:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {Latin} - } -} -\cs_new:Npn \um_set_mathalphabet_latin:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {26} #1 {##1} {#3} {latin} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {h} - } -} -\cs_new:Npn \um_set_mathalphabet_Greek:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {Greek} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varTheta} - } -} -\cs_new:Npn \um_set_mathalphabet_greek:Nnn #1#2#3 { - \clist_map_inline:nn {#2} { - \um_set_mathalph_range:nNnnn {25} #1 {##1} {#3} {greek} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varepsilon} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {vartheta} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varkappa} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varphi} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varrho} - \um_set_mathalphabet_char:Nnnn #1 {##1} {#3} {varpi} - } -} -\cs_new:Npn \um_config_up_num:n #1 { - \um_map_chars_numbers:nn {up}{#1} - \um_set_mathalphabet_numbers:Nnn \mathup {up}{#1} -} -\cs_new:Npn \um_config_up_Latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Latin:nn {up} {#1} - }{ - \bool_if:NT \g_um_upLatin_bool { - \um_map_chars_Latin:nn {up,it} {#1} - } - } - \um_set_mathalphabet_Latin:Nnn \mathup {up,it}{#1} -} -\cs_new:Npn \um_config_up_latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_latin:nn {up} {#1} - }{ - \bool_if:NT \g_um_uplatin_bool { - \um_map_chars_latin:nn {up,it} {#1} - \um_map_single:nnn {h} {up,it} {#1} - \um_map_single:nnn {dotlessi} {up,it} {#1} - \um_map_single:nnn {dotlessj} {up,it} {#1} - } - } - \um_set_mathalphabet_latin:Nnn \mathup {up,it}{#1} -} -\cs_new:Npn \um_config_up_Greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Greek:nn {up}{#1} - }{ - \bool_if:NT \g_um_upGreek_bool { - \um_map_chars_Greek:nn {up,it}{#1} - } - } - \um_set_mathalphabet_Greek:Nnn \mathup {up,it}{#1} -} -\cs_new:Npn \um_config_up_greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_greek:nn {up} {#1} - }{ - \bool_if:NT \g_um_upgreek_bool { - \um_map_chars_greek:nn {up,it} {#1} - } - } - \um_set_mathalphabet_greek:Nnn \mathup {up,it} {#1} -} -\cs_new:Npn \um_config_up_misc:n #1 { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{up}{up} - }{ - \bool_if:NT \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{up,it}{up} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{up}{up} - }{ - \bool_if:NT \g_um_uppartial_bool { - \um_map_single:nnn {partial}{up,it}{up} - } - } - \um_set_mathalphabet_pos:Nnnn \mathup {partial} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathup {Nabla} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathup {dotlessi} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathup {dotlessj} {up,it} {#1} -} -\cs_new:Npn \um_config_it_Latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Latin:nn {it} {#1} - }{ - \bool_if:NF \g_um_upLatin_bool { - \um_map_chars_Latin:nn {up,it} {#1} - } - } - \um_set_mathalphabet_Latin:Nnn \mathit {up,it}{#1} -} -\cs_new:Npn \um_config_it_latin:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_latin:nn {it} {#1} - \um_map_single:nnn {h}{it}{#1} - }{ - \bool_if:NF \g_um_uplatin_bool { - \um_map_chars_latin:nn {up,it} {#1} - \um_map_single:nnn {h}{up,it}{#1} - \um_map_single:nnn {dotlessi}{up,it}{#1} - \um_map_single:nnn {dotlessj}{up,it}{#1} - } - } - \um_set_mathalphabet_latin:Nnn \mathit {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathit {dotlessi} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathit {dotlessj} {up,it} {#1} -} -\cs_new:Npn \um_config_it_Greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_Greek:nn {it}{#1} - }{ - \bool_if:NF \g_um_upGreek_bool { - \um_map_chars_Greek:nn {up,it}{#1} - } - } - \um_set_mathalphabet_Greek:Nnn \mathit {up,it}{#1} -} -\cs_new:Npn \um_config_it_greek:n #1 { - \bool_if:NTF \g_um_literal_bool { - \um_map_chars_greek:nn {it} {#1} - }{ - \bool_if:NF \g_um_upgreek_bool { - \um_map_chars_greek:nn {it,up} {#1} - } - } - \um_set_mathalphabet_greek:Nnn \mathit {up,it} {#1} -} -\cs_new:Npn \um_config_it_misc:n #1 { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{it}{it} - }{ - \bool_if:NF \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{up,it}{it} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{it}{it} - }{ - \bool_if:NF \g_um_uppartial_bool { - \um_map_single:nnn {partial}{up,it}{it} - } - } - \um_set_mathalphabet_pos:Nnnn \mathit {partial} {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathit {Nabla} {up,it}{#1} -} -\cs_new:Npn \um_config_bb_latin:n #1 { - \um_set_mathalphabet_latin:Nnn \mathbb {up,it}{#1} -} -\cs_new:Npn \um_config_bb_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathbb {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {C} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {H} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {N} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {P} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {Q} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {R} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {Z} {up,it} {#1} -} -\cs_new:Npn \um_config_bb_num:n #1 { - \um_set_mathalphabet_numbers:Nnn \mathbb {up}{#1} -} -\cs_new:Npn \um_config_bb_misc:n #1 { - \um_set_mathalphabet_pos:Nnnn \mathbb {Pi} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {pi} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {Gamma} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {gamma} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbb {summation} {up} {#1} -} -\cs_new:Npn \um_config_bbit_misc:n #1 { - \um_set_mathalphabet_pos:Nnnn \mathbbit {D} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbbit {d} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbbit {e} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbbit {i} {up,it} {#1} - \um_set_mathalphabet_pos:Nnnn \mathbbit {j} {up,it} {#1} -} -\cs_new:Npn \um_config_scr_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathscr {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {B}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {E}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {F}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {H}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {I}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {L}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {M}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {R}{up,it}{#1} -} -\cs_new:Npn \um_config_scr_latin:n #1 { - \um_set_mathalphabet_latin:Nnn \mathscr {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {e}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {g}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathscr {o}{up,it}{#1} -} -\cs_new:Npn \um_config_cal_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathcal {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {B}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {E}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {F}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {H}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {I}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {L}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {M}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathcal {R}{up,it}{#1} -} -\cs_new:Npn \um_config_frak_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathfrak {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathfrak {C}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathfrak {H}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathfrak {I}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathfrak {R}{up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathfrak {Z}{up,it}{#1} -} -\cs_new:Npn \um_config_frak_latin:n #1 { - \um_set_mathalphabet_latin:Nnn \mathfrak {up,it}{#1} -} -\cs_new:Npn \um_config_sfup_num:n #1 { - \um_set_mathalphabet_numbers:Nnn \mathsf {up}{#1} - \um_set_mathalphabet_numbers:Nnn \mathsfup {up}{#1} -} -\cs_new:Npn \um_config_sfup_Latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_Latin:nn {sfup} {#1} - \um_set_mathalphabet_Latin:Nnn \mathsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { - \um_map_chars_Latin:nn {sfup,sfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} - } - } - \um_set_mathalphabet_Latin:Nnn \mathsfup {up,it}{#1} -} -\cs_new:Npn \um_config_sfup_latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_latin:nn {sfup} {#1} - \um_set_mathalphabet_latin:Nnn \mathsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { - \um_map_chars_latin:nn {sfup,sfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} - } - } - \um_set_mathalphabet_latin:Nnn \mathsfup {up,it}{#1} -} -\cs_new:Npn \um_config_sfit_Latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_Latin:nn {sfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { - \um_map_chars_Latin:nn {sfup,sfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathsf {up,it}{#1} - } - } - \um_set_mathalphabet_Latin:Nnn \mathsfit {up,it}{#1} -} -\cs_new:Npn \um_config_sfit_latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_latin:nn {sfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { - \um_map_chars_latin:nn {sfup,sfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathsf {up,it}{#1} - } - } - \um_set_mathalphabet_latin:Nnn \mathsfit {up,it}{#1} -} -\cs_new:Npn \um_config_tt_num:n #1 { - \um_set_mathalphabet_numbers:Nnn \mathtt {up}{#1} -} -\cs_new:Npn \um_config_tt_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathtt {up,it}{#1} -} -\cs_new:Npn \um_config_tt_latin:n #1 { - \um_set_mathalphabet_latin:Nnn \mathtt {up,it}{#1} -} -\cs_new:Npn \um_config_bfit_Latin:n #1 { - \bool_if:NF \g_um_bfupLatin_bool { - \um_map_chars_Latin:nn {bfup,bfit} {#1} - } - \um_set_mathalphabet_Latin:Nnn \mathbfit {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_Latin:nn {bfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbf {it}{#1} - }{ - \bool_if:NF \g_um_bfupLatin_bool { - \um_map_chars_Latin:nn {bfup,bfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfit_latin:n #1 { - \bool_if:NF \g_um_bfuplatin_bool { - \um_map_chars_latin:nn {bfup,bfit} {#1} - } - \um_set_mathalphabet_latin:Nnn \mathbfit {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_latin:nn {bfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathbf {it}{#1} - }{ - \bool_if:NF \g_um_bfuplatin_bool { - \um_map_chars_latin:nn {bfup,bfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfit_Greek:n #1 { - \um_set_mathalphabet_Greek:Nnn \mathbfit {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_Greek:nn {bfit}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbf {it}{#1} - }{ - \bool_if:NF \g_um_bfupGreek_bool { - \um_map_chars_Greek:nn {bfup,bfit}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfit_greek:n #1 { - \um_set_mathalphabet_greek:Nnn \mathbfit {up,it} {#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_greek:nn {bfit} {#1} - \um_set_mathalphabet_greek:Nnn \mathbf {it} {#1} - }{ - \bool_if:NF \g_um_bfupgreek_bool { - \um_map_chars_greek:nn {bfit,bfup} {#1} - \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} - } - } -} -\cs_new:Npn \um_config_bfit_misc:n #1 { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{bfit}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{bfup,bfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{bfit}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { - \um_map_single:nnn {partial}{bfup,bfit}{#1} - } - } - \um_set_mathalphabet_pos:Nnnn \mathbfit {partial} {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbfit {Nabla} {up,it}{#1} - \bool_if:NTF \g_um_literal_partial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {it}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {it}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfup_num:n #1 { - \um_set_mathalphabet_numbers:Nnn \mathbf {up}{#1} - \um_set_mathalphabet_numbers:Nnn \mathbfup {up}{#1} -} -\cs_new:Npn \um_config_bfup_Latin:n #1 { - \bool_if:NT \g_um_bfupLatin_bool { - \um_map_chars_Latin:nn {bfup,bfit} {#1} - } - \um_set_mathalphabet_Latin:Nnn \mathbfup {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_Latin:nn {bfup} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbf {up}{#1} - }{ - \bool_if:NT \g_um_bfupLatin_bool { - \um_map_chars_Latin:nn {bfup,bfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfup_latin:n #1 { - \bool_if:NT \g_um_bfuplatin_bool { - \um_map_chars_latin:nn {bfup,bfit} {#1} - } - \um_set_mathalphabet_latin:Nnn \mathbfup {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_latin:nn {bfup} {#1} - \um_set_mathalphabet_latin:Nnn \mathbf {up}{#1} - }{ - \bool_if:NT \g_um_bfuplatin_bool { - \um_map_chars_latin:nn {bfup,bfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfup_Greek:n #1 { - \um_set_mathalphabet_Greek:Nnn \mathbfup {up,it}{#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_Greek:nn {bfup}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbf {up}{#1} - }{ - \bool_if:NT \g_um_bfupGreek_bool { - \um_map_chars_Greek:nn {bfup,bfit}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbf {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfup_greek:n #1 { - \um_set_mathalphabet_greek:Nnn \mathbfup {up,it} {#1} - \bool_if:NTF \g_um_bfliteral_bool { - \um_map_chars_greek:nn {bfup} {#1} - \um_set_mathalphabet_greek:Nnn \mathbf {up} {#1} - }{ - \bool_if:NT \g_um_bfupgreek_bool { - \um_map_chars_greek:nn {bfup,bfit} {#1} - \um_set_mathalphabet_greek:Nnn \mathbf {up,it} {#1} - } - } -} -\cs_new:Npn \um_config_bfup_misc:n #1 { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{bfup}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{bfup,bfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{bfup}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { - \um_map_single:nnn {partial}{bfup,bfit}{#1} - } - } - \um_set_mathalphabet_pos:Nnnn \mathbfup {partial} {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbfup {Nabla} {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbfup {digamma} {up}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbfup {Digamma} {up}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbf {digamma} {up}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbf {Digamma} {up}{#1} - \bool_if:NTF \g_um_literal_partial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbf {Nabla} {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bffrak_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathbffrak {up,it}{#1} -} -\cs_new:Npn \um_config_bffrak_latin:n #1 { - \um_set_mathalphabet_latin:Nnn \mathbffrak {up,it}{#1} -} -\cs_new:Npn \um_config_bfscr_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathbfscr {up,it}{#1} -} -\cs_new:Npn \um_config_bfscr_latin:n #1 { - \um_set_mathalphabet_latin:Nnn \mathbfscr {up,it}{#1} -} -\cs_new:Npn \um_config_bfcal_Latin:n #1 { - \um_set_mathalphabet_Latin:Nnn \mathbfcal {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfup_num:n #1 { - \um_set_mathalphabet_numbers:Nnn \mathbfsf {up}{#1} - \um_set_mathalphabet_numbers:Nnn \mathbfsfup {up}{#1} -} -\cs_new:Npn \um_config_bfsfup_Latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_Latin:nn {bfsfup} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbfsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { - \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} - } - } - \um_set_mathalphabet_Latin:Nnn \mathbfsfup {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfup_latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_latin:nn {bfsfup} {#1} - \um_set_mathalphabet_latin:Nnn \mathbfsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { - \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} - } - } - \um_set_mathalphabet_latin:Nnn \mathbfsfup {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfup_Greek:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_Greek:nn {bfsfup}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbfsf {up}{#1} - }{ - \bool_if:NT \g_um_upsans_bool { - \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} - } - } - \um_set_mathalphabet_Greek:Nnn \mathbfsfup {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfup_greek:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_greek:nn {bfsfup} {#1} - \um_set_mathalphabet_greek:Nnn \mathbfsf {up} {#1} - }{ - \bool_if:NT \g_um_upsans_bool { - \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} - \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} - } - } - \um_set_mathalphabet_greek:Nnn \mathbfsfup {up,it} {#1} -} -\cs_new:Npn \um_config_bfsfup_misc:n #1 { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{bfsfup}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{bfsfup}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { - \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} - } - } - \um_set_mathalphabet_pos:Nnnn \mathbfsfup {partial} {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbfsfup {Nabla} {up,it}{#1} - \bool_if:NTF \g_um_literal_partial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up}{#1} - }{ - \bool_if:NT \g_um_uppartial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up}{#1} - }{ - \bool_if:NT \g_um_upNabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} - } - } -} -\cs_new:Npn \um_config_bfsfit_Latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_Latin:nn {bfsfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbfsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { - \um_map_chars_Latin:nn {bfsfup,bfsfit} {#1} - \um_set_mathalphabet_Latin:Nnn \mathbfsf {up,it}{#1} - } - } - \um_set_mathalphabet_Latin:Nnn \mathbfsfit {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfit_latin:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_latin:nn {bfsfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathbfsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { - \um_map_chars_latin:nn {bfsfup,bfsfit} {#1} - \um_set_mathalphabet_latin:Nnn \mathbfsf {up,it}{#1} - } - } - \um_set_mathalphabet_latin:Nnn \mathbfsfit {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfit_Greek:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_Greek:nn {bfsfit}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbfsf {it}{#1} - }{ - \bool_if:NF \g_um_upsans_bool { - \um_map_chars_Greek:nn {bfsfup,bfsfit}{#1} - \um_set_mathalphabet_Greek:Nnn \mathbfsf {up,it}{#1} - } - } - \um_set_mathalphabet_Greek:Nnn \mathbfsfit {up,it}{#1} -} -\cs_new:Npn \um_config_bfsfit_greek:n #1 { - \bool_if:NTF \g_um_sfliteral_bool { - \um_map_chars_greek:nn {bfsfit} {#1} - \um_set_mathalphabet_greek:Nnn \mathbfsf {it} {#1} - }{ - \bool_if:NF \g_um_upsans_bool { - \um_map_chars_greek:nn {bfsfup,bfsfit} {#1} - \um_set_mathalphabet_greek:Nnn \mathbfsf {up,it} {#1} - } - } - \um_set_mathalphabet_greek:Nnn \mathbfsfit {up,it} {#1} -} -\cs_new:Npn \um_config_bfsfit_misc:n #1 { - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_map_single:nnn {Nabla}{bfsfit}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { - \um_map_single:nnn {Nabla}{bfsfup,bfsfit}{#1} - } - } - \bool_if:NTF \g_um_literal_partial_bool { - \um_map_single:nnn {partial}{bfsfit}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { - \um_map_single:nnn {partial}{bfsfup,bfsfit}{#1} - } - } - \um_set_mathalphabet_pos:Nnnn \mathbfsfit {partial} {up,it}{#1} - \um_set_mathalphabet_pos:Nnnn \mathbfsfit {Nabla} {up,it}{#1} - \bool_if:NTF \g_um_literal_partial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {it}{#1} - }{ - \bool_if:NF \g_um_uppartial_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {partial} {up,it}{#1} - } - } - \bool_if:NTF \g_um_literal_Nabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {it}{#1} - }{ - \bool_if:NF \g_um_upNabla_bool { - \um_set_mathalphabet_pos:Nnnn \mathbfsf {Nabla} {up,it}{#1} - } - } -} -\xetex_or_luatex:nnn { \cs_set:Npn \um_symbol_setup: } - { - \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { - \prg_case_tl:Nnn ##3 { \mathover {} \mathunder {} } - { - \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} - } - } - } - { - \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { - \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} - } - } -\CatchFileEdef \g_um_mathtable_tl {unicode-math-table.tex} {\um_symbol_setup:} -\cs_new:Npn \um_input_math_symbol_table: {\g_um_mathtable_tl} -\begingroup - \char_set_catcode_other:N \^ - \cs_gset:Npn \um_cs_set_eq_active_char:Nw #1 = "#2 \q_nil { - \lowercase{ - \tl_rescan:nn { - \char_set_catcode_other:N \{ - \char_set_catcode_other:N \} - \char_set_catcode_other:N \& - \char_set_catcode_other:N \% - \char_set_catcode_other:N \$ - }{ - \global\let#1=^^^^^#2 - } - } - } - \cs_gnew:Npn \um_active_char_set:wc "#1 \q_nil #2 { - \lowercase { - \tl_rescan:nn { - \catcode`\_=11\relax - \catcode`\:=11\relax - \catcode`\^=7\relax - }{ - \protected\gdef^^^^^#1{\csname #2\endcsname}% - } - } - } -\endgroup -\AtBeginDocument{\um_define_math_chars:} -\cs_set:Nn \um_define_math_chars: { - \group_begin: - \char_set_catcode_math_superscript:N \^ - \cs_set:Npn \_um_sym:nnn ##1##2##3 { - \bool_if:nF { \cs_if_eq_p:NN ##3 \mathaccent || - \cs_if_eq_p:NN ##3 \mathopen || - \cs_if_eq_p:NN ##3 \mathclose || - \cs_if_eq_p:NN ##3 \mathover || - \cs_if_eq_p:NN ##3 \mathunder } { - \um_cs_set_eq_active_char:Nw ##2 = ##1 \q_nil \ignorespaces - } - } - \char_set_catcode_other:N \# - \um_input_math_symbol_table: - \group_end: -} -\group_begin: - \lccode`\*=`\\ - \char_set_catcode_escape:N \| - \char_set_catcode_other:N \\ - |lowercase{ - |AtBeginDocument{ - |let|backslash=* - } - } -|group_end: -\cs_new:Nn \um_arg_i_before_egroup:n {#1\egroup} -\cs_new:Nn \um_superscript:n { - ^\bgroup #1 - \peek_meaning_remove:NTF ^ - \um_arg_i_before_egroup:n \egroup -} -\muskip_new:N \g_um_primekern_muskip -\muskip_gset:Nn \g_um_primekern_muskip { -\thinmuskip/2 }% arbitrary -\int_new:N \l_um_primecount_int -\cs_new:Npn \um_nprimes:Nn #1#2 { - \um_superscript:n { - #1 - \prg_replicate:nn {#2-1} { \mskip \g_um_primekern_muskip #1 } - } -} -\cs_new:Npn \um_nprimes_select:nn #1#2 { - \prg_case_int:nnn {#2}{ - {1} { \um_superscript:n {#1} } - {2} { - \um_glyph_if_exist:nTF {"2033} - { \um_superscript:n {\um_prime_double_mchar} } - { \um_nprimes:Nn #1 {#2} } - } - {3} { - \um_glyph_if_exist:nTF {"2034} - { \um_superscript:n {\um_prime_triple_mchar} } - { \um_nprimes:Nn #1 {#2} } - } - {4} { - \um_glyph_if_exist:nTF {"2057} - { \um_superscript:n {\um_prime_quad_mchar} } - { \um_nprimes:Nn #1 {#2} } - } - }{ - \um_nprimes:Nn #1 {#2} - } -} -\cs_new:Npn \um_nbackprimes_select:nn #1#2 { - \prg_case_int:nnn {#2}{ - {1} { \um_superscript:n {#1} } - {2} { - \um_glyph_if_exist:nTF {"2036} - { \um_superscript:n {\um_backprime_double_mchar} } - { \um_nprimes:Nn #1 {#2} } - } - {3} { - \um_glyph_if_exist:nTF {"2037} - { \um_superscript:n {\um_backprime_triple_mchar} } - { \um_nprimes:Nn #1 {#2} } - } - }{ - \um_nprimes:Nn #1 {#2} - } -} -\cs_new:Npn \um_scan_prime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_zero:N \l_um_primecount_int - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_dprime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_set:Nn \l_um_primecount_int {1} - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_trprime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_set:Nn \l_um_primecount_int {2} - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_qprime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_set:Nn \l_um_primecount_int {3} - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_prime: { - \int_zero:N \l_um_primecount_int - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_dprime: { - \int_set:Nn \l_um_primecount_int {1} - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_trprime: { - \int_set:Nn \l_um_primecount_int {2} - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scan_sup_qprime: { - \int_set:Nn \l_um_primecount_int {3} - \um_scanprime_collect:N \um_prime_single_mchar -} -\cs_new:Npn \um_scanprime_collect:N #1 { - \int_incr:N \l_um_primecount_int - \peek_meaning_remove:NTF ' { - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_prime: { - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2032 { - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_dprime: { - \int_incr:N \l_um_primecount_int - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2033 { - \int_incr:N \l_um_primecount_int - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_trprime: { - \int_add:Nn \l_um_primecount_int {2} - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2034 { - \int_add:Nn \l_um_primecount_int {2} - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_qprime: { - \int_add:Nn \l_um_primecount_int {3} - \um_scanprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2057 { - \int_add:Nn \l_um_primecount_int {3} - \um_scanprime_collect:N #1 - }{ - \um_nprimes_select:nn {#1} {\l_um_primecount_int} - } - } - } - } - } - } - } - } - } -} -\cs_new:Npn \um_scan_backprime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_zero:N \l_um_primecount_int - \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_backdprime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_set:Nn \l_um_primecount_int {1} - \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_backtrprime: { - \cs_set_eq:NN \um_superscript:n \use:n - \int_set:Nn \l_um_primecount_int {2} - \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_sup_backprime: { - \int_zero:N \l_um_primecount_int - \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_sup_backdprime: { - \int_set:Nn \l_um_primecount_int {1} - \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scan_sup_backtrprime: { - \int_set:Nn \l_um_primecount_int {2} - \um_scanbackprime_collect:N \um_backprime_single_mchar -} -\cs_new:Npn \um_scanbackprime_collect:N #1 { - \int_incr:N \l_um_primecount_int - \peek_meaning_remove:NTF ` { - \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_backprime: { - \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2035 { - \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_backdprime: { - \int_incr:N \l_um_primecount_int - \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2036 { - \int_incr:N \l_um_primecount_int - \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF \um_scan_backtrprime: { - \int_add:Nn \l_um_primecount_int {2} - \um_scanbackprime_collect:N #1 - }{ - \peek_meaning_remove:NTF ^^^^2037 { - \int_add:Nn \l_um_primecount_int {2} - \um_scanbackprime_collect:N #1 - }{ - \um_nbackprimes_select:nn {#1} {\l_um_primecount_int} - } - } - } - } - } - } - } -} -\AtBeginDocument{\um_define_prime_commands: \um_define_prime_chars:} -\cs_set:Nn \um_define_prime_commands: { - \cs_set_eq:NN \prime \um_prime_single_mchar - \cs_set_eq:NN \dprime \um_prime_double_mchar - \cs_set_eq:NN \trprime \um_prime_triple_mchar - \cs_set_eq:NN \qprime \um_prime_quad_mchar - \cs_set_eq:NN \backprime \um_backprime_single_mchar - \cs_set_eq:NN \backdprime \um_backprime_double_mchar - \cs_set_eq:NN \backtrprime \um_backprime_triple_mchar -} -\group_begin: - \char_set_catcode_active:N \' - \char_set_catcode_active:N \` - \char_set_catcode_active:n {"2032} - \char_set_catcode_active:n {"2033} - \char_set_catcode_active:n {"2034} - \char_set_catcode_active:n {"2057} - \char_set_catcode_active:n {"2035} - \char_set_catcode_active:n {"2036} - \char_set_catcode_active:n {"2037} - \cs_gset:Nn \um_define_prime_chars: { - \cs_set_eq:NN ' \um_scan_sup_prime: - \cs_set_eq:NN ^^^^2032 \um_scan_sup_prime: - \cs_set_eq:NN ^^^^2033 \um_scan_sup_dprime: - \cs_set_eq:NN ^^^^2034 \um_scan_sup_trprime: - \cs_set_eq:NN ^^^^2057 \um_scan_sup_qprime: - \cs_set_eq:NN ` \um_scan_sup_backprime: - \cs_set_eq:NN ^^^^2035 \um_scan_sup_backprime: - \cs_set_eq:NN ^^^^2036 \um_scan_sup_backdprime: - \cs_set_eq:NN ^^^^2037 \um_scan_sup_backtrprime: - } -\group_end: -\AtBeginDocument{\um_redefine_radical:} -\xetex_or_luatex:nnn { \cs_set:Nn \um_redefine_radical: } { - \@ifpackageloaded { amsmath } { } { - \cs_set_nopar:Npn \r@@t ##1 ##2 { - \hbox_set:Nn \l_tmpa_box { - \c_math_toggle_token - \m@th - ##1 - \sqrtsign { ##2 } - \c_math_toggle_token - } - \um_mathstyle_scale:Nnn ##1 { \kern } { - \fontdimen 63 \l_um_font - } - \box_move_up:nn { - (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) - * \number \fontdimen 65 \l_um_font / 100 - } { - \box_use:N \rootbox - } - \um_mathstyle_scale:Nnn ##1 { \kern } { - \fontdimen 64 \l_um_font - } - \box_use_clear:N \l_tmpa_box - } - } -} { - \@ifpackageloaded { amsmath } { } { - \cs_set:Npn \root ##1 \of ##2 { - \luatexUroot \l_um_radical_sqrt_tl { ##1 } { ##2 } - } - } -} -\cs_new:Npn \um_fontdimen_to_percent:nn #1#2 { - \strip@pt\dimexpr\fontdimen#1#2*65536/100\relax -} -\cs_new:Npn \um_mathstyle_scale:Nnn #1#2#3 { - \ifx#1\scriptstyle - #2\um_fontdimen_to_percent:nn{10}\l_um_font#3 - \else - \ifx#1\scriptscriptstyle - #2\um_fontdimen_to_percent:nn{11}\l_um_font#3 - \else - #2#3 - \fi - \fi -} -\prop_new:N \g_um_supers_prop -\prop_new:N \g_um_subs_prop -\group_begin: -\cs_set:Npn \um_setup_active_superscript:nn #1#2 { - \prop_gput:Nxn \g_um_supers_prop {\meaning #1} {#2} - \char_set_catcode_active:N #1 - \char_gmake_mathactive:N #1 - \scantokens{ - \cs_gset:Npn #1 { - \tl_set:Nn \l_um_ss_chain_tl {#2} - \cs_set_eq:NN \um_sub_or_super:n \sp - \tl_set:Nn \l_um_tmpa_tl {supers} - \um_scan_sscript: - } - } -} -\um_setup_active_superscript:nn {^^^^2070} {0} -\um_setup_active_superscript:nn {^^^^00b9} {1} -\um_setup_active_superscript:nn {^^^^00b2} {2} -\um_setup_active_superscript:nn {^^^^00b3} {3} -\um_setup_active_superscript:nn {^^^^2074} {4} -\um_setup_active_superscript:nn {^^^^2075} {5} -\um_setup_active_superscript:nn {^^^^2076} {6} -\um_setup_active_superscript:nn {^^^^2077} {7} -\um_setup_active_superscript:nn {^^^^2078} {8} -\um_setup_active_superscript:nn {^^^^2079} {9} -\um_setup_active_superscript:nn {^^^^207a} {+} -\um_setup_active_superscript:nn {^^^^207b} {-} -\um_setup_active_superscript:nn {^^^^207c} {=} -\um_setup_active_superscript:nn {^^^^207d} {(} -\um_setup_active_superscript:nn {^^^^207e} {)} -\um_setup_active_superscript:nn {^^^^2071} {i} -\um_setup_active_superscript:nn {^^^^207f} {n} -\cs_set:Npn \um_setup_active_subscript:nn #1#2 { - \prop_gput:Nxn \g_um_subs_prop {\meaning #1} {#2} - \char_set_catcode_active:N #1 - \char_gmake_mathactive:N #1 - \scantokens{ - \cs_gset:Npn #1 { - \tl_set:Nn \l_um_ss_chain_tl {#2} - \cs_set_eq:NN \um_sub_or_super:n \sb - \tl_set:Nn \l_um_tmpa_tl {subs} - \um_scan_sscript: - } - } -} -\um_setup_active_subscript:nn {^^^^2080} {0} -\um_setup_active_subscript:nn {^^^^2081} {1} -\um_setup_active_subscript:nn {^^^^2082} {2} -\um_setup_active_subscript:nn {^^^^2083} {3} -\um_setup_active_subscript:nn {^^^^2084} {4} -\um_setup_active_subscript:nn {^^^^2085} {5} -\um_setup_active_subscript:nn {^^^^2086} {6} -\um_setup_active_subscript:nn {^^^^2087} {7} -\um_setup_active_subscript:nn {^^^^2088} {8} -\um_setup_active_subscript:nn {^^^^2089} {9} -\um_setup_active_subscript:nn {^^^^208a} {+} -\um_setup_active_subscript:nn {^^^^208b} {-} -\um_setup_active_subscript:nn {^^^^208c} {=} -\um_setup_active_subscript:nn {^^^^208d} {(} -\um_setup_active_subscript:nn {^^^^208e} {)} -\um_setup_active_subscript:nn {^^^^2090} {a} -\um_setup_active_subscript:nn {^^^^2091} {e} -\um_setup_active_subscript:nn {^^^^1d62} {i} -\um_setup_active_subscript:nn {^^^^2092} {o} -\um_setup_active_subscript:nn {^^^^1d63} {r} -\um_setup_active_subscript:nn {^^^^1d64} {u} -\um_setup_active_subscript:nn {^^^^1d65} {v} -\um_setup_active_subscript:nn {^^^^2093} {x} -\um_setup_active_subscript:nn {^^^^1d66} {\beta} -\um_setup_active_subscript:nn {^^^^1d67} {\gamma} -\um_setup_active_subscript:nn {^^^^1d68} {\rho} -\um_setup_active_subscript:nn {^^^^1d69} {\phi} -\um_setup_active_subscript:nn {^^^^1d6a} {\chi} -\group_end: -\cs_new:Npn \um_scan_sscript: { - \um_scan_sscript:TF { - \um_scan_sscript: - }{ - \um_sub_or_super:n {\l_um_ss_chain_tl} - } -} -\cs_new:Npn \um_scan_sscript:TF #1#2 { - \tl_set:Nx \l_peek_true_aux_tl { \exp_not:n{ #1 } } - \tl_set_eq:NN \l_peek_true_tl \c_peek_true_remove_next_tl - \tl_set:Nx \l_peek_false_tl {\exp_not:n{\group_align_safe_end: #2}} - \group_align_safe_begin: - \peek_after:NN \um_peek_execute_branches_ss: -} -\cs_new:Npn \um_peek_execute_branches_ss: { - \bool_if:nTF { - \token_if_eq_catcode_p:NN \l_peek_token \c_group_begin_token || - \token_if_eq_catcode_p:NN \l_peek_token \c_group_end_token || - \token_if_eq_meaning_p:NN \l_peek_token \c_space_token - } - { \l_peek_false_tl } - { \um_peek_execute_branches_ss_aux: } -} -\cs_new:Npn \um_peek_execute_branches_ss_aux: { - \prop_if_in:cxTF - {g_um_\l_um_tmpa_tl _prop} - {\meaning\l_peek_token} - { - \prop_get:cxN - {g_um_\l_um_tmpa_tl _prop} - {\meaning\l_peek_token} - \l_um_tmpb_tl - \tl_put_right:NV \l_um_ss_chain_tl \l_um_tmpb_tl - \l_peek_true_tl - } - {\l_peek_false_tl} -} -\cs_new:Npn \um_define_active_frac:Nw #1 #2/#3 { - \char_set_catcode_active:N #1 - \char_gmake_mathactive:N #1 - \tl_rescan:nn { - \catcode`\_=11\relax - \catcode`\:=11\relax - }{ - \cs_gset:Npx #1 { - \bool_if:NTF \l_um_smallfrac_bool {\exp_not:N\tfrac} {\exp_not:N\frac} - {#2} {#3} - } - } -} -\cs_new:Npn \um_setup_active_frac: { - \group_begin: - \um_define_active_frac:Nw ^^^^2189 0/3 - \um_define_active_frac:Nw ^^^^2152 1/{10} - \um_define_active_frac:Nw ^^^^2151 1/9 - \um_define_active_frac:Nw ^^^^215b 1/8 - \um_define_active_frac:Nw ^^^^2150 1/7 - \um_define_active_frac:Nw ^^^^2159 1/6 - \um_define_active_frac:Nw ^^^^2155 1/5 - \um_define_active_frac:Nw ^^^^00bc 1/4 - \um_define_active_frac:Nw ^^^^2153 1/3 - \um_define_active_frac:Nw ^^^^215c 3/8 - \um_define_active_frac:Nw ^^^^2156 2/5 - \um_define_active_frac:Nw ^^^^00bd 1/2 - \um_define_active_frac:Nw ^^^^2157 3/5 - \um_define_active_frac:Nw ^^^^215d 5/8 - \um_define_active_frac:Nw ^^^^2154 2/3 - \um_define_active_frac:Nw ^^^^00be 3/4 - \um_define_active_frac:Nw ^^^^2158 4/5 - \um_define_active_frac:Nw ^^^^215a 5/6 - \um_define_active_frac:Nw ^^^^215e 7/8 - \group_end: -} -\um_setup_active_frac: -\def\to{\rightarrow} -\def\le{\leq} -\def\ge{\geq} -\def\neq{\ne} -\def\triangle{\mathord{\bigtriangleup}} -\def\bigcirc{\mdlgwhtcircle} -\def\circ{\vysmwhtcircle} -\def\bullet{\smblkcircle} -\def\mathyen{\yen} -\def\mathsterling{\sterling} -\def\diamond{\smwhtdiamond} -\def\emptyset{\varnothing} -\def\hbar{\hslash} -\def\land{\wedge} -\def\lor{\vee} -\def\owns{\ni} -\def\gets{\leftarrow} -\def\mathring{\ocirc} -\def\backepsilon{\upbackepsilon} -\def\eth{\matheth} -\def\smallint{{\textstyle\int}\limits} -\@ifpackageloaded{amsmath}{ - % define their own colon, perhaps I should just steal it. (It does look much better.) -}{ - \cs_set_protected:Npn \colon { - \bool_if:NTF \g_um_literal_colon_bool {:} { \mathpunct{:} } - } -} -\def\mathrm{\mathup} -\let\mathfence\mathord -\def\digamma{\updigamma} -\def\Digamma{\upDigamma} -\def\operator@font{\um_switchto_mathup:} -\chk_if_free_cs:N \um_tmpa:w -\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnnn #1 #2 #3 #4 #5 #6 { - \cs_if_exist:NT #1 { - \token_if_macro:NTF #1 { - \group_begin: - #2 \um_tmpa:w #3 { #4 } - \cs_if_eq:NNTF #1 \um_tmpa:w { - \msg_info:nnx { unicode-math } { patch-macro } - { \token_to_str:N #1 } - \group_end: - \xetex_or_luatex:nnn { #2 #1 #3 } { #6 } { #5 } - } { - \msg_warning:nnxxx { unicode-math } { wrong-meaning } - { \token_to_str:N #1 } { \token_to_meaning:N #1 } - { \token_to_meaning:N \um_tmpa:w } - \group_end: - } - } { - \msg_warning:nnx { unicode-math } { macro-expected } - { \token_to_str:N #1 } - } - } -} -\cs_new_protected_nopar:Npn \um_check_and_fix:NNnnn #1 #2 #3 #4 #5 { - \um_check_and_fix:NNnnnn #1 #2 { #3 } { #4 } { #5 } { #5 } -} -\cs_new_protected_nopar:Npn \um_check_and_fix_luatex:NNnnn #1 #2 #3 #4 #5 { - \luatex_if_engine:T { - \um_check_and_fix:NNnnn #1 #2 { #3 } { #4 } { #5 } - } -} -\cs_generate_variant:Nn \um_check_and_fix_luatex:NNnnn { c } -\AtEndOfPackageFile * {url} { - \tl_put_left:Nn \Url@FormatString { \um_switchto_mathup: } - \tl_put_right:Nn \UrlSpecials { - \do\`{\mathchar`\`} - \do\'{\mathchar`\'} - \do\${\mathchar`\$} - \do\&{\mathchar`\&} - } -} -\AtEndOfPackageFile * {amsmath} { - \xetex_if_engine:T { - \tl_remove_in:Nn \@begindocumenthook { - \mathchardef\std@minus\mathcode`\-\relax - \mathchardef\std@equal\mathcode`\=\relax - } - \def\std@minus{\Umathcharnum\Umathcodenum`\-\relax} - \def\std@equal{\Umathcharnum\Umathcodenum`\=\relax} - } - \cs_set:Npn \@cdots {\mathinner{\cdots}} - \cs_set_eq:NN \dotsb@ \cdots - \xetex_if_engine:T { - \def \resetMathstrut@ {% - \setbox\z@\hbox{$($}%) - \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@ - } - } - \xetex_if_engine:T { - \um_check_and_fix:NNnnn \subarray \cs_set:Npn { #1 } { - \vcenter - \bgroup - \Let@ - \restore@math@cr - \default@tag - \baselineskip \fontdimen 10~ \scriptfont \tw@ - \advance \baselineskip \fontdimen 12~ \scriptfont \tw@ - \lineskip \thr@@ \fontdimen 8~ \scriptfont \thr@@ - \lineskiplimit \lineskip - \ialign - \bgroup - \ifx c #1 \hfil \fi - $ \m@th \scriptstyle ## $ - \hfil - \crcr - } { - \vcenter - \c_group_begin_token - \Let@ - \restore@math@cr - \default@tag - \skip_set:Nn \baselineskip { - \um_stack_num_up:N \scriptstyle - + \um_stack_denom_down:N \scriptstyle - } - \lineskip \um_stack_vgap:N \scriptstyle - \lineskiplimit \lineskip - \ialign - \c_group_begin_token - \token_if_eq_meaning:NNT c #1 { \hfil } - \c_math_toggle_token - \m@th - \scriptstyle - \c_parameter_token \c_parameter_token - \c_math_toggle_token - \hfil - \crcr - } - } - \um_check_and_fix_luatex:NNnnn \plainroot@ \cs_set_nopar:Npn { #1 \of #2 } { - \setbox \rootbox \hbox { - $ \m@th \scriptscriptstyle { #1 } $ - } - \mathchoice - { \r@@t \displaystyle { #2 } } - { \r@@t \textstyle { #2 } }~ - { \r@@t \scriptstyle { #2 } } - { \r@@t \scriptscriptstyle { #2 } } - \egroup - } { - \bool_if:nTF { - \int_compare_p:nNn { \uproot@ } = { \c_zero } - && \int_compare_p:nNn { \leftroot@ } = { \c_zero } - } { - \luatexUroot \l_um_radical_sqrt_tl { #1 } { #2 } - } { - \hbox_set:Nn \rootbox { - \c_math_toggle_token - \m@th - \scriptscriptstyle { #1 } - \c_math_toggle_token - } - \mathchoice - { \r@@t \displaystyle { #2 } } - { \r@@t \textstyle { #2 } } - { \r@@t \scriptstyle { #2 } } - { \r@@t \scriptscriptstyle { #2 } } - } - \c_group_end_token - } - \um_check_and_fix:NNnnnn \r@@t \cs_set_nopar:Npn { #1 #2 } { - \setboxz@h { $ \m@th #1 \sqrtsign { #2 } $ } - \dimen@ \ht\z@ - \advance \dimen@ -\dp\z@ - \setbox\@ne \hbox { $ \m@th #1 \mskip \uproot@ mu $ } - \advance \dimen@ by 1.667 \wd\@ne - \mkern -\leftroot@ mu - \mkern 5mu - \raise .6\dimen@ \copy\rootbox - \mkern -10mu - \mkern \leftroot@ mu - \boxz@ - } { - \hbox_set:Nn \l_tmpa_box { - \c_math_toggle_token - \m@th - #1 - \mskip \uproot@ mu - \c_math_toggle_token - } - \luatexUroot \l_um_radical_sqrt_tl { - \box_move_up:nn { \box_wd:N \l_tmpa_box } { - \hbox:n { - \c_math_toggle_token - \m@th - \mkern -\leftroot@ mu - \box_use:N \rootbox - \mkern \leftroot@ mu - \c_math_toggle_token - } - } - } { - #2 - } - } { - \hbox_set:Nn \l_tmpa_box { - \c_math_toggle_token - \m@th - #1 - \sqrtsign { #2 } - \c_math_toggle_token - } - \hbox_set:Nn \l_tmpb_box { - \c_math_toggle_token - \m@th - #1 - \mskip \uproot@ mu - \c_math_toggle_token - } - \mkern -\leftroot@ mu - \um_mathstyle_scale:Nnn #1 { \kern } { - \fontdimen 63 \l_um_font - } - \box_move_up:nn { - \box_wd:N \l_tmpb_box - + (\box_ht:N \l_tmpa_box - \box_dp:N \l_tmpa_box) - * \number \fontdimen 65 \l_um_font / 100 - } { - \box_use:N \rootbox - } - \um_mathstyle_scale:Nnn #1 { \kern } { - \fontdimen 64 \l_um_font - } - \mkern \leftroot@ mu - \box_use_clear:N \l_tmpa_box - } -} -\AtEndOfPackageFile * {amsopn} { - \cs_set:Npn \newmcodes@ { - \mathcode`\'39\scan_stop: - \mathcode`\*42\scan_stop: - \mathcode`\."613A\scan_stop: -%% \ifnum\mathcode`\-=45 \else -%% \mathchardef\std@minus\mathcode`\-\relax -%% \fi - \mathcode`\-45\scan_stop: - \mathcode`\/47\scan_stop: - \mathcode`\:"603A\scan_stop: - } -} -\cs_set:Npn \| {\Vert} -\cs_set:Npn \mathellipsis {\mathinner{\unicodeellipsis}} -\cs_set:Npn \cdots {\mathinner{\unicodecdots}} -\xetex_or_luatex:nnn { \cs_new_protected_nopar:Npn \um_setup_accents: } { - \def\widehat{\hat} - \def\widetilde{\tilde} - \def\overrightarrow{\vec} -} { - \cs_gset_protected_nopar:Npx \widehat { - \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "0302 } - } - \cs_gset_protected_nopar:Npx \widetilde { - \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "0303 } - } - \cs_gset_protected_nopar:Npx \overleftarrow { - \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "20D6 } - } - \cs_gset_protected_nopar:Npx \overrightarrow { - \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "20D7 } - } - \cs_gset_protected_nopar:Npx \overleftrightarrow { - \um_wide_top_accent:Nnn \mathaccent { \um_symfont_tl } { "20E1 } - } - \bool_if:NT \c_um_have_fixed_accents_bool { - \cs_gset_protected_nopar:Npx \underrightharpoondown { - \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EC } - } - \cs_gset_protected_nopar:Npx \underleftharpoondown { - \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20ED } - } - \cs_gset_protected_nopar:Npx \underleftarrow { - \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EE } - } - \cs_gset_protected_nopar:Npx \underrightarrow { - \um_wide_bottom_accent:Nnn \mathaccent { \um_symfont_tl } { "20EF } - } - } -} -\cs_set_eq:NN \um_text_slash: \slash -\cs_set:Npn \slash { - \mode_if_math:TF {\mathslash} {\um_text_slash:} -} -\AtEndOfPackageFile * { mathtools } { - \xetex_if_engine:T { - \um_check_and_fix:NNnnn \MT_cramped_internal:Nn \cs_set_nopar:Npn { #1 #2 } { - \sbox \z@ { - $ - \m@th - #1 - \nulldelimiterspace = \z@ - \radical \z@ { #2 } - $ - } - \ifx #1 \displaystyle - \dimen@ = \fontdimen 8 \textfont 3 - \advance \dimen@ .25 \fontdimen 5 \textfont 2 - \else - \dimen@ = 1.25 \fontdimen 8 - \ifx #1 \textstyle - \textfont - \else - \ifx #1 \scriptstyle - \scriptfont - \else - \scriptscriptfont - \fi - \fi - 3 - \fi - \advance \dimen@ -\ht\z@ - \ht\z@ = -\dimen@ - \box\z@ - } { - \hbox_set:Nn \l_tmpa_box { - \color@setgroup - \c_math_toggle_token - \m@th - #1 - \dim_zero:N \nulldelimiterspace - \radical \c_zero { #2 } - \c_math_toggle_token - \color@endgroup - } - \box_set_ht:Nn \l_tmpa_box { - \box_ht:N \l_tmpa_box - - \um_radical_vgap:N #1 - } - \box_use_clear:N \l_tmpa_box - } - } - \msg_warning:nn { unicode-math } { mathtools } - \NewDocumentCommand \dblcolon { } { \Colon } - \NewDocumentCommand \coloneqq { } { \coloneq } - \NewDocumentCommand \Coloneqq { } { \Coloneq } - \NewDocumentCommand \eqqcolon { } { \eqcolon } -} -\AtEndOfPackageFile * { colonequals } { - \msg_warning:nn { unicode-math } { colonequals } - \RenewDocumentCommand \ratio { } { \mathratio } - \RenewDocumentCommand \coloncolon { } { \Colon } - \RenewDocumentCommand \minuscolon { } { \dashcolon } - \RenewDocumentCommand \colonequals { } { \coloneq } - \RenewDocumentCommand \equalscolon { } { \eqcolon } - \RenewDocumentCommand \coloncolonequals { } { \Coloneq } +\msg_new:nnn { unicode-math } { colonequals } { + I'm~ going~ to~ overwrite~ the~ following~ commands~ from \\ + the~ `colonequals'~ package: \\ + \token_to_str:N \ratio,~ + \token_to_str:N \coloncolon,~ + \token_to_str:N \minuscolon, \\ + \token_to_str:N \colonequals,~ + \token_to_str:N \equalscolon,~ + \token_to_str:N \coloncolonequals. \\ + Note~ that~ since~ I~ won't~ overwrite~ the~ other~ colon-like \\ + commands,~ using~ them~ will~ lead~ to~ inconsistencies. \\ + Furthermore,~ changing~ \token_to_str:N \colonsep \c_space_tl + or~ \token_to_str:N \doublecolonsep \c_space_tl won't~ have \\ + any~ effect~ on~ the~ re-defined~ commands. } -\@ifclassloaded{beamer}{ - \ifbeamer@suppressreplacements\else - \um_warning:n {disable-beamer} - \beamer@suppressreplacementstrue - \fi -}{} -\ExplSyntaxOff +\luatex_if_engine:T { \usepackage{unicode-math-luatex} \endinput } +\xetex_if_engine:T { \usepackage{unicode-math-xetex} \endinput } -- cgit v1.2.3