diff options
author | Karl Berry <karl@freefriends.org> | 2011-09-18 22:29:36 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-09-18 22:29:36 +0000 |
commit | 793be33975bf8f6986bb6435f2039c7c34ac3c15 (patch) | |
tree | 873887f99fef55a52edf3614dd48ec340b1515e6 /Master/texmf-dist/source/latex | |
parent | 4c7c93512d5ad99119fc38035815ba54a17605a5 (diff) |
unicode-math 0.6 (18sep11)
git-svn-id: svn://tug.org/texlive/trunk@24003 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex')
20 files changed, 1352 insertions, 1020 deletions
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=<abc> - compile file <abc> with XeLaTeX' echo ' lfile F=<abc> - compile file <abc> 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 <foobar>` run that test. diff --git a/Master/texmf-dist/source/latex/unicode-math/testfiles/X204a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-active-sscripts.ltx index 95a219a933d..95a219a933d 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X204a.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-active-sscripts.ltx 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/X205a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-nolimits-spec.ltx index f5887be747d..23900115403 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X205a.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-nolimits-spec.ltx @@ -1,6 +1,6 @@ \input{umtest-preamble} \usepackage{unicode-math} -\setmathfont{Cambria Math} +\setmathfont{xits-math.otf} \begin{document} \[\iiint_V\] \removenolimits\iiint 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/X400a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-pkg-url.ltx index 014bfe1d35a..2d204d33794 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X400a.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-pkg-url.ltx @@ -1,5 +1,5 @@ \input{umtest-preamble} -\usepackage[trace=on]{unicode-math} +\usepackage{unicode-math} \setmainfont{TeX Gyre Pagella} \setsansfont{TeX Gyre Adventor} \setmonofont{TeX Gyre Cursor} 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/X300a.ltx b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-sscript-features.ltx index 694c33da949..3db6e6547c6 100644 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X300a.ltx +++ b/Master/texmf-dist/source/latex/unicode-math/testfiles/F-sscript-features.ltx @@ -1,10 +1,10 @@ \input{umtest-preamble} \usepackage{unicode-math} \setmathfont[script-font = {Asana Math}, - script-features = {ScriptStyle,Colour=FF0000}, + script-features = {Style=MathScript,Colour=FF0000}, sscript-font = {Cambria Math}, - sscript-features= {ScriptScriptStyle,Colour=0000FF}] - {Cambria Math} + sscript-features= {Style=MathScriptScript,Colour=0000FF}] + {XITS Math} \begin{document} \[123456789^{123456789^{123456789}}\] -\end{document}
\ No newline at end of file +\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/X601b.ignore.pdf b/Master/texmf-dist/source/latex/unicode-math/testfiles/X601b.ignore.pdf Binary files differdeleted file mode 100644 index ebb5c2dbc98..00000000000 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X601b.ignore.pdf +++ /dev/null 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 Binary files differdeleted file mode 100644 index d8d62dd116f..00000000000 --- a/Master/texmf-dist/source/latex/unicode-math/testfiles/X601f.ignore.pdf +++ /dev/null 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} %</internal> -%<preamble>\ProvidesPackage{unicode-math} +%<preamble&!XE&!LU>\ProvidesPackage{unicode-math} +%<preamble&XE>\ProvidesPackage{unicode-math-xetex} +%<preamble&LU>\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] %</preamble> %<*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 } +%</load> +% \end{macrocode} +% +% \section{Header code} % -% \section{Things we need} +% The shared part of the code starts here before the split mentioned above. +% +% \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,41 +1180,284 @@ 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} +% +% \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} +\DeclareDocumentCommand \unimathsetup {m} { + \keys_set:nn {unicode-math} {#1} +} +% \end{macrocode} +% \end{macro} +% +% +% \paragraph{math-style} +% \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} , +} +% \end{macrocode} +% +% \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, + } + \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} +% +% \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} % -% \subsubsection{Function variants} % +% \paragraph{Nabla and partial} % \begin{macrocode} -\cs_generate_variant:Nn \fontspec_select:nn {x} +\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} % -% \subsubsection{\Hologo{LuaLaTeX} module} +% \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} % -% We create a \pkg{luatexbase} module that contains Lua functions for use with \hologo{LuaLaTeX}. +% \paragraph{Epsilon and phi shapes} % \begin{macrocode} -\luatex_if_engine:T { - \RequirePackage { luatexbase } - \RequirePackage { luaotfload } [ 2010/11/26 ] - \RequireLuaModule { unicode-math } [ 2011/04/23 ] +\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 + } } -%</preamble> +% \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} +%</preamble&!XE&!LU> %<*lua> local err, warn, info, log = luatexbase.provides_module({ name = "unicode-math", @@ -1222,8 +1487,46 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % (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 +%<XE> { \cs_set_eq:cc {U#1} {XeTeX#1} } +%<LU> { \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} -%<*package> +%<XE>\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 } } +%</LU> +% \end{macrocode} +% +% \begin{macrocode} +%<*LU> +\RequirePackage { lualatex-math } [ 2011/08/07 ] +\RequirePackage { luatexbase } +\RequirePackage { luaotfload } [ 2010/11/26 ] +\RequireLuaModule { unicode-math } [ 2011/04/23 ] +%</LU> % \end{macrocode} % % \subsection{Alphabet Unicode positions} @@ -1234,10 +1537,10 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % Rather than `readable', in the end, this makes the code more extensible. % \begin{macrocode} -\cs_new:Npn \usv_set:nnn #1#2#3 { +\cs_new:Nn \usv_set:nnn { \tl_set:cn { \um_to_usv:nn {#1}{#2} } {#3} } -\cs_new:Npn \um_to_usv:nn #1#2 { g_um_#1_#2_usv } +\cs_new:Nn \um_to_usv:nn { g_um_#1_#2_usv } % \end{macrocode} % \paragraph{Alphabets} % \begin{macrocode} @@ -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} -%</package> +%</package&(XE|LU)> %<*stix> % \end{macrocode} % @@ -1776,284 +2079,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % \begin{macrocode} %</stix> -%<*package> -% \end{macrocode} -% -% \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} -\DeclareDocumentCommand \unimathsetup {m} { - \clist_clear:N \l_um_unknown_keys_clist - \keys_set:nn {unicode-math} {#1} -} -% \end{macrocode} -% \end{macro} -% -% -% \paragraph{math-style} -% \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} , -} -% \end{macrocode} -% -% \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, - } - \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} -% -% \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} +%<*package&(XE|LU)> % \end{macrocode} % % \subsection{Overcoming \cmd\@onlypreamble} @@ -2075,7 +2101,7 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ \set@@mathdelimiter\DeclareMathRadical\mathchar@type \DeclareSymbolFontAlphabet\DeclareSymbolFontAlphabet@ }{ - \tl_remove_in:Nn \@preamblecmds {\do#1} + \tl_remove_once:Nn \@preamblecmds {\do#1} } % \end{macrocode} % @@ -2085,12 +2111,14 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % % 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} +%<*XE> \def\new@mathgroup{\alloc@8\mathgroup\chardef\@cclvi} \let\newfam\new@mathgroup +%</XE> % \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.} % @@ -2102,41 +2130,54 @@ luatexbase.add_to_callback("luaotfload.patch_font", set_sscale_dimens, "unicode_ % 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 { +\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} - }{ + \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} \mathopen {#1} - \cs_gset_protected_nopar:Npx #2 { \um_delimiter:Nnn \mathopen {#1} {#4} } + \um_set_mathcode:nnn {#4} \mathclose {#1} + \cs_gset_protected_nopar:Npx #2 + { \um_delimiter:Nnn \mathclose {#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 } - } + \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} } + } +%<*LU> + \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 } + } +%</LU> }{ \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: + } +%</XE> +%<*LU> + { + \Umathaccent \c_um_accent_keyword_tl + \mathchar@type#1 \csname sym#2\endcsname #3 \scan_stop: + } +%</LU> +%<*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 { } } -} +%</LU> % \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. +% And now we input every single maths char. +% \begin{macrocode} + \um_input_math_symbol_table: +% \end{macrocode} +% Finally, % \begin{itemize} -% \item Math symbols are defined with \cmd\_um_sym:nnn; see \secref{mathsymbol} -% for the individual definitions +% \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} - \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_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 +%<XE> { \the\fontdimen#1\l_um_font\relax } +%<LU> { \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, } +%<LU> 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 +%<XE> { \quark_new:N #1 } +%<LU> { \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 } -} +%</XE> % \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 } -} { +} +%</XE> +%<*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 } } +%</LU> % \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 +%<XE> { } +%<LU> { \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 } +%</XE> +%<*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 } +%</LU> % \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_ } } } +%</XE> +%<*LU> { \cs_set:Npn \UnicodeMathSymbol ##1##2##3##4 { \exp_not:n {\_um_sym:nnn{##1}{##2}{##3}} } } +%</LU> % \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} } -} { + } +%</XE> +%<*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} } -} + } +%</LU> % \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} ) } +%</XE> +% \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 +%<XE> { #6 } +%<LU> { #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} - } +%</XE> % \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 } - } +%</XE> % \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} -} { + } +%</XE> +%<*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 } } } -} + } +%</LU> % \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 } - } +%</XE> % \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} -%</package> +%</package&(XE|LU)> % \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} %</dtx-style> %\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} |