diff options
Diffstat (limited to 'macros')
-rw-r--r-- | macros/latex/contrib/zref-clever/CHANGELOG.md | 8 | ||||
-rw-r--r-- | macros/latex/contrib/zref-clever/zref-clever-code.pdf | bin | 1217642 -> 880835 bytes | |||
-rw-r--r-- | macros/latex/contrib/zref-clever/zref-clever-code.tex | 5 | ||||
-rw-r--r-- | macros/latex/contrib/zref-clever/zref-clever-doc.pdf | bin | 344167 -> 227507 bytes | |||
-rw-r--r-- | macros/latex/contrib/zref-clever/zref-clever-doc.tex | 38 | ||||
-rw-r--r-- | macros/latex/contrib/zref-clever/zref-clever.dtx | 1265 | ||||
-rw-r--r-- | macros/latex/contrib/zref-clever/zref-clever.ins | 1 | ||||
-rw-r--r-- | macros/luatex/generic/luamplib/NEWS | 6 | ||||
-rw-r--r-- | macros/luatex/generic/luamplib/luamplib.dtx | 353 | ||||
-rw-r--r-- | macros/luatex/generic/luamplib/luamplib.pdf | bin | 184266 -> 196079 bytes | |||
-rw-r--r-- | macros/luatex/generic/luamplib/test-luamplib-latex.tex | 7 | ||||
-rw-r--r-- | macros/luatex/generic/luamplib/test-luamplib-plain.tex | 7 |
12 files changed, 1659 insertions, 31 deletions
diff --git a/macros/latex/contrib/zref-clever/CHANGELOG.md b/macros/latex/contrib/zref-clever/CHANGELOG.md index 89c3c1414c..3cf6c73b25 100644 --- a/macros/latex/contrib/zref-clever/CHANGELOG.md +++ b/macros/latex/contrib/zref-clever/CHANGELOG.md @@ -1,6 +1,12 @@ # Changelog -## [Unreleased](https://github.com/gusbrs/zref-clever/compare/v0.4.4...HEAD) +## [Unreleased](https://github.com/gusbrs/zref-clever/compare/v0.4.5...HEAD) + +## [v0.4.5](https://github.com/gusbrs/zref-clever/compare/v0.4.4...v0.4.5) (2024-05-20) + +### Added +- Provided Russian language file (see PR + [#29](https://github.com/gusbrs/zref-clever/pull/29)). ## [v0.4.4](https://github.com/gusbrs/zref-clever/compare/v0.4.3...v0.4.4) (2024-03-14) diff --git a/macros/latex/contrib/zref-clever/zref-clever-code.pdf b/macros/latex/contrib/zref-clever/zref-clever-code.pdf Binary files differindex 4dd6a24efc..09b441eeb1 100644 --- a/macros/latex/contrib/zref-clever/zref-clever-code.pdf +++ b/macros/latex/contrib/zref-clever/zref-clever-code.pdf diff --git a/macros/latex/contrib/zref-clever/zref-clever-code.tex b/macros/latex/contrib/zref-clever/zref-clever-code.tex index 8aebe70d6f..9be1e8f18b 100644 --- a/macros/latex/contrib/zref-clever/zref-clever-code.tex +++ b/macros/latex/contrib/zref-clever/zref-clever-code.tex @@ -41,6 +41,11 @@ \documentclass{l3doc} +\usepackage{fontspec} +\setmainfont{CMU Serif} +\setsansfont{CMU Sans Serif} +\setmonofont{CMU Typewriter Text} + % Have \GetFileInfo pick up date and version data and used in the % documentation. \usepackage{zref-clever} diff --git a/macros/latex/contrib/zref-clever/zref-clever-doc.pdf b/macros/latex/contrib/zref-clever/zref-clever-doc.pdf Binary files differindex 9973f6d546..5594a06fb3 100644 --- a/macros/latex/contrib/zref-clever/zref-clever-doc.pdf +++ b/macros/latex/contrib/zref-clever/zref-clever-doc.pdf diff --git a/macros/latex/contrib/zref-clever/zref-clever-doc.tex b/macros/latex/contrib/zref-clever/zref-clever-doc.tex index 744732ade0..e088c49915 100644 --- a/macros/latex/contrib/zref-clever/zref-clever-doc.tex +++ b/macros/latex/contrib/zref-clever/zref-clever-doc.tex @@ -41,6 +41,11 @@ \documentclass{l3doc} +\usepackage{fontspec} +\setmainfont{TeX Gyre Pagella} +\setsansfont{TeX Gyre Heros}[Scale=MatchLowercase] +\setmonofont{inconsolata}[Scale=MatchLowercase] + % The package itself *must* be loaded so that \GetFileInfo can pick up date % and version data. Naturally, we also use it. \usepackage{zref-clever} @@ -48,13 +53,6 @@ \usepackage{zref-check} \usepackage{zref-titleref} -\usepackage[T1]{fontenc} - -\usepackage[sc]{mathpazo} -\linespread{1.05} -\usepackage[scale=.88]{tgheros} % sans -\usepackage[varqu,scaled=1.03]{inconsolata} % tt - \usepackage{listings} \usepackage{microtype} @@ -1414,7 +1412,7 @@ indeed required, without users having to worry about it at all. & UKenglish \\ & USenglish \\ french & acadian \\ - & \\ + spanish & \\ \bottomrule \end{tabular} \quad @@ -1431,7 +1429,7 @@ indeed required, without users having to worry about it at all. portuguese & brazilian \\ & brazil \\ & portuges \\ - spanish & \\ + russian & \\ \bottomrule \end{tabular} \caption{Declared languages and aliases} @@ -1480,13 +1478,14 @@ in effect for the languages declared by \pkg{zref-clever}. \toprule Language & declension & gender & allcaps \\ \midrule - dutch & -- & f,m,n & -- \\ - english & -- & -- & -- \\ - french & -- & f,m & -- \\ - german & N,A,D,G & f,m,n & yes \\ - italian & -- & f,m & -- \\ - portuguese & -- & f,m & -- \\ - spanish & -- & f,m & -- \\ + dutch & -- & f,m,n & -- \\ + english & -- & -- & -- \\ + french & -- & f,m & -- \\ + german & N,A,D,G & f,m,n & yes \\ + italian & -- & f,m & -- \\ + portuguese & -- & f,m & -- \\ + spanish & -- & f,m & -- \\ + russian & n,a,g,d,i,p & f,m,n & -- \\ \bottomrule \end{tabular} \caption{Options for declared languages} @@ -2641,6 +2640,7 @@ were generously provided by (in chronological order): % 2023-05-11: https://github.com/T-F-S/tcolorbox/issues/230 % 2023-11-09: https://github.com/gusbrs/zref-clever/issues/20 % 2024-01-20: https://github.com/gusbrs/zref-clever/pull/25 + % 2024-05-04: https://github.com/gusbrs/zref-clever/pull/27 and Lars Madsen. % 2023-07-24: https://chat.stackexchange.com/transcript/message/64039717#64039717 % and following discussion. @@ -2661,8 +2661,12 @@ The package's language files have been provided or improved thanks to: % 2022-01-09: https://github.com/gusbrs/zref-clever/pull/5 % 2022-12-27: https://github.com/gusbrs/zref-clever/pull/12 % 2022-12-27: https://github.com/gusbrs/zref-clever/pull/13 - and Matteo Ferrigato (Italian). % 'matteo339' + Matteo Ferrigato (Italian), % 'matteo339' % 2022-12-12: https://github.com/gusbrs/zref-clever/issues/11 + and Sergey Slyusarev (Russian). % 'jemmybutton' + % 2024-05-18: https://github.com/gusbrs/zref-clever/issues/28 + % 2024-05-19: https://github.com/gusbrs/zref-clever/pull/29 + % 2024-05-20: https://github.com/gusbrs/zref-clever/pull/30 If I have inadvertently left anyone off the list I apologize, and please let me know, so that I can correct the oversight. diff --git a/macros/latex/contrib/zref-clever/zref-clever.dtx b/macros/latex/contrib/zref-clever/zref-clever.dtx index 5767e6ab4f..9c1d73a5a2 100644 --- a/macros/latex/contrib/zref-clever/zref-clever.dtx +++ b/macros/latex/contrib/zref-clever/zref-clever.dtx @@ -43,6 +43,11 @@ %<*driver> \documentclass{l3doc} +\usepackage{fontspec} +\setmainfont{CMU Serif} +\setsansfont{CMU Sans Serif} +\setmonofont{CMU Typewriter Text} + % Have \GetFileInfo pick up date and version data and used in the % documentation. \usepackage{zref-clever} @@ -166,7 +171,7 @@ % % Identify the package. % \begin{macrocode} -\ProvidesExplPackage {zref-clever} {2024-03-14} {0.4.4} +\ProvidesExplPackage {zref-clever} {2024-05-20} {0.4.5} {Clever LaTeX cross-references based on zref} % \end{macrocode} % @@ -10397,6 +10402,1264 @@ type = solution , % \end{macrocode} % % +% \subsection{Russian} +% +% Russian language file initially contributed by \contributor{Sergey Slyusarev +% \username{jemmybutton}} (\githubPR{29}). Russian localization in consistent +% with that of \pkg{cleveref}, with the following exceptions: ``equation'' is +% translated as ``уравнение'', rather than ``formula'', ``proposition'' is +% translated as ``предложение'', rather than ``утверждение''; several +% abbreviations are replaced with more common ones, e.g. abbreviated plural of +% ``item'' is ``пп.'', not ``п.п.''. +% +% \begin{macrocode} +%<*package> +\zcDeclareLanguage + [ declension = { n , a , g , d , i , p } , gender = { f , m , n } ] + { russian } +%</package> +% \end{macrocode} +% +% \begin{macrocode} +%<*lang-russian> +% \end{macrocode} +% +% \begin{macrocode} +namesep = {\nobreakspace} , +pairsep = {~и\nobreakspace} , +listsep = {,~} , +lastsep = {~и\nobreakspace} , +tpairsep = {~и\nobreakspace} , +tlistsep = {,~} , +tlastsep = {,~и\nobreakspace} , +notesep = {~} , +rangesep = {~по\nobreakspace} , ++refbounds-rb = {с\nobreakspace,,,} , + +type = book , + gender = f , + case = n , + Name-sg = Книга , + name-sg = книга , + Name-pl = Книги , + name-pl = книги , + case = a , + Name-sg = Книгу , + name-sg = книгу , + Name-pl = Книги , + name-pl = книги , + case = g , + Name-sg = Книги , + name-sg = книги , + Name-pl = Книг , + name-pl = книг , + case = d , + Name-sg = Книге , + name-sg = книге , + Name-pl = Книгам , + name-pl = книгам , + case = i , + Name-sg = Книгой , + name-sg = книгой , + Name-pl = Книгами , + name-pl = книгами , + case = p , + Name-sg = Книге , + name-sg = книге , + Name-pl = Книгах , + name-pl = книгах , + +type = part , + gender = f , + case = n , + Name-sg = Часть , + name-sg = часть , + Name-pl = Части , + name-pl = части , + Name-sg-ab = Ч. , + name-sg-ab = ч. , + Name-pl-ab = Чч. , + name-pl-ab = чч. , + case = a , + Name-sg = Часть , + name-sg = часть , + Name-pl = Части , + name-pl = части , + Name-sg-ab = Ч. , + name-sg-ab = ч. , + Name-pl-ab = Чч. , + name-pl-ab = чч. , + case = g , + Name-sg = Части , + name-sg = части , + Name-pl = Частей , + name-pl = частей , + Name-sg-ab = Ч. , + name-sg-ab = ч. , + Name-pl-ab = Чч. , + name-pl-ab = чч. , + case = d , + Name-sg = Части , + name-sg = части , + Name-pl = Частям , + name-pl = частям , + Name-sg-ab = Ч. , + name-sg-ab = ч. , + Name-pl-ab = Чч. , + name-pl-ab = чч. , + case = i , + Name-sg = Частью , + name-sg = частью , + Name-pl = Частями , + name-pl = частями , + Name-sg-ab = Ч. , + name-sg-ab = ч. , + Name-pl-ab = Чч. , + name-pl-ab = чч. , + case = p , + Name-sg = Части , + name-sg = части , + Name-pl = Частях , + name-pl = частях , + Name-sg-ab = Ч. , + name-sg-ab = ч. , + Name-pl-ab = Чч. , + name-pl-ab = чч. , + +type = chapter , + gender = f , + case = n , + Name-sg = Глава , + name-sg = глава , + Name-pl = Главы , + name-pl = главы , + Name-sg-ab = Гл. , + name-sg-ab = гл. , + Name-pl-ab = Гл. , + name-pl-ab = гл. , + case = a , + Name-sg = Главу , + name-sg = главу , + Name-pl = Главы , + name-pl = главы , + Name-sg-ab = Гл. , + name-sg-ab = гл. , + Name-pl-ab = Гл. , + name-pl-ab = гл. , + case = g , + Name-sg = Главы , + name-sg = главы , + Name-pl = Глав , + name-pl = глав , + Name-sg-ab = Гл. , + name-sg-ab = гл. , + Name-pl-ab = Гл. , + name-pl-ab = гл. , + case = d , + Name-sg = Главе , + name-sg = главе , + Name-pl = Главам , + name-pl = главам , + Name-sg-ab = Гл. , + name-sg-ab = гл. , + Name-pl-ab = Гл. , + name-pl-ab = гл. , + case = i , + Name-sg = Главой , + name-sg = главой , + Name-pl = Главами , + name-pl = главами , + Name-sg-ab = Гл. , + name-sg-ab = гл. , + Name-pl-ab = Гл. , + name-pl-ab = гл. , + case = p , + Name-sg = Главе , + name-sg = главе , + Name-pl = Главах , + name-pl = главах , + Name-sg-ab = Гл. , + name-sg-ab = гл. , + Name-pl-ab = Гл. , + name-pl-ab = гл. , + +type = section , + gender = m , + case = n , + Name-sg = Раздел , + name-sg = раздел , + Name-pl = Разделы , + name-pl = разделы , + case = a , + Name-sg = Раздел , + name-sg = раздел , + Name-pl = Разделы , + name-pl = разделы , + case = g , + Name-sg = Раздела , + name-sg = раздела , + Name-pl = Разделов , + name-pl = разделов , + case = d , + Name-sg = Разделу , + name-sg = разделу , + Name-pl = Разделам , + name-pl = разделам , + case = i , + Name-sg = Разделом , + name-sg = разделом , + Name-pl = Разделами , + name-pl = разделами , + case = p , + Name-sg = Разделе , + name-sg = разделе , + Name-pl = Разделах , + name-pl = разделах , + +type = paragraph , + gender = m , + case = n , + Name-sg = Абзац , + name-sg = абзац , + Name-pl = Абзацы , + name-pl = абзацы , + case = a , + Name-sg = Абзац , + name-sg = абзац , + Name-pl = Абзацы , + name-pl = абзацы , + case = g , + Name-sg = Абзаца , + name-sg = абзаца , + Name-pl = Абзацев , + name-pl = абзацев , + case = d , + Name-sg = Абзацу , + name-sg = абзацу , + Name-pl = Абзацам , + name-pl = абзацам , + case = i , + Name-sg = Абзацем , + name-sg = абзацем , + Name-pl = Абзацами , + name-pl = абзацами , + case = p , + Name-sg = Абзаце , + name-sg = абзаце , + Name-pl = Абзацах , + name-pl = абзацах , + +type = appendix , + gender = n , + case = n , + Name-sg = Приложение , + name-sg = приложение , + Name-pl = Приложения , + name-pl = приложения , + case = a , + Name-sg = Приложение , + name-sg = приложение , + Name-pl = Приложения , + name-pl = приложения , + case = g , + Name-sg = Приложения , + name-sg = приложения , + Name-pl = Приложений , + name-pl = приложений , + case = d , + Name-sg = Приложению , + name-sg = приложению , + Name-pl = Приложениям , + name-pl = приложениям , + case = i , + Name-sg = Приложением , + name-sg = приложением , + Name-pl = Приложениями , + name-pl = приложениями , + case = p , + Name-sg = Приложении , + name-sg = приложении , + Name-pl = Приложениях , + name-pl = приложениях , + +type = page , + gender = f , + case = n , + Name-sg = Страница , + name-sg = страница , + Name-pl = Страницы , + name-pl = страницы , + Name-sg-ab = С. , + name-sg-ab = с. , + Name-pl-ab = Сс. , + name-pl-ab = сс. , + case = a , + Name-sg = Страницу , + name-sg = страницу , + Name-pl = Страницы , + name-pl = страницы , + Name-sg-ab = С. , + name-sg-ab = с. , + Name-pl-ab = Сс. , + name-pl-ab = сс. , + case = g , + Name-sg = Страницы , + name-sg = страницы , + Name-pl = Страниц , + name-pl = страниц , + Name-sg-ab = С. , + name-sg-ab = с. , + Name-pl-ab = Сс. , + name-pl-ab = сс. , + case = d , + Name-sg = Странице , + name-sg = странице , + Name-pl = Страницам , + name-pl = страницам , + Name-sg-ab = С. , + name-sg-ab = с. , + Name-pl-ab = Сс. , + name-pl-ab = сс. , + case = i , + Name-sg = Страницей , + name-sg = страницей , + Name-pl = Страницами , + name-pl = страницами , + Name-sg-ab = С. , + name-sg-ab = с. , + Name-pl-ab = Сс. , + name-pl-ab = сс. , + case = p , + Name-sg = Странице , + name-sg = странице , + Name-pl = Страницах , + name-pl = страницах , + Name-sg-ab = С. , + name-sg-ab = с. , + Name-pl-ab = Сс. , + name-pl-ab = сс. , + rangesep = {\textendash} , + rangetopair = false , + +refbounds-rb = {,,,} , + +type = line , + gender = f , + case = n , + Name-sg = Строка , + name-sg = строка , + Name-pl = Строки , + name-pl = строки , + case = a , + Name-sg = Строку , + name-sg = строку , + Name-pl = Строки , + name-pl = строки , + case = g , + Name-sg = Строки , + name-sg = строки , + Name-pl = Строк , + name-pl = строк , + case = d , + Name-sg = Строке , + name-sg = строке , + Name-pl = Строкам , + name-pl = строкам , + case = i , + Name-sg = Строкой , + name-sg = строкой , + Name-pl = Строками , + name-pl = строками , + case = p , + Name-sg = Строке , + name-sg = строке , + Name-pl = Строках , + name-pl = строках , + +type = figure , + gender = m , + case = n , + Name-sg = Рисунок , + name-sg = рисунок , + Name-pl = Рисунки , + name-pl = рисунки , + Name-sg-ab = Рис. , + name-sg-ab = рис. , + Name-pl-ab = Рис. , + name-pl-ab = рис. , + case = a , + Name-sg = Рисунок , + name-sg = рисунок , + Name-pl = Рисунки , + name-pl = рисунки , + Name-sg-ab = Рис. , + name-sg-ab = рис. , + Name-pl-ab = Рис. , + name-pl-ab = рис. , + case = g , + Name-sg = Рисунка , + name-sg = рисунка , + Name-pl = Рисунков , + name-pl = рисунков , + Name-sg-ab = Рис. , + name-sg-ab = рис. , + Name-pl-ab = Рис. , + name-pl-ab = рис. , + case = d , + Name-sg = Рисунку , + name-sg = рисунку , + Name-pl = Рисункам , + name-pl = рисункам , + Name-sg-ab = Рис. , + name-sg-ab = рис. , + Name-pl-ab = Рис. , + name-pl-ab = рис. , + case = i , + Name-sg = Рисунком , + name-sg = рисунком , + Name-pl = Рисунками , + name-pl = рисунками , + Name-sg-ab = Рис. , + name-sg-ab = рис. , + Name-pl-ab = Рис. , + name-pl-ab = рис. , + case = p , + Name-sg = Рисунке , + name-sg = рисунке , + Name-pl = Рисунках , + name-pl = рисунках , + Name-sg-ab = Рис. , + name-sg-ab = рис. , + Name-pl-ab = Рис. , + name-pl-ab = рис. , + +type = table , + gender = f , + case = n , + Name-sg = Таблица , + name-sg = таблица , + Name-pl = Таблицы , + name-pl = таблицы , + Name-sg-ab = Табл. , + name-sg-ab = табл. , + Name-pl-ab = Табл. , + name-pl-ab = табл. , + case = a , + Name-sg = Таблицу , + name-sg = таблицу , + Name-pl = Таблицы , + name-pl = таблицы , + Name-sg-ab = Табл. , + name-sg-ab = табл. , + Name-pl-ab = Табл. , + name-pl-ab = табл. , + case = g , + Name-sg = Таблицы , + name-sg = таблицы , + Name-pl = Таблиц , + name-pl = таблиц , + Name-sg-ab = Табл. , + name-sg-ab = табл. , + Name-pl-ab = Табл. , + name-pl-ab = табл. , + case = d , + Name-sg = Таблице , + name-sg = таблице , + Name-pl = Таблицам , + name-pl = таблицам , + Name-sg-ab = Табл. , + name-sg-ab = табл. , + Name-pl-ab = Табл. , + name-pl-ab = табл. , + case = i , + Name-sg = Таблицей , + name-sg = таблицей , + Name-pl = Таблицами , + name-pl = таблицами , + Name-sg-ab = Табл. , + name-sg-ab = табл. , + Name-pl-ab = Табл. , + name-pl-ab = табл. , + case = p , + Name-sg = Таблице , + name-sg = таблице , + Name-pl = Таблицах , + name-pl = таблицах , + Name-sg-ab = Табл. , + name-sg-ab = табл. , + Name-pl-ab = Табл. , + name-pl-ab = табл. , + +type = item , + gender = m , + case = n , + Name-sg = Пункт , + name-sg = пункт , + Name-pl = Пункты , + name-pl = пункты , + Name-sg-ab = П. , + name-sg-ab = п. , + Name-pl-ab = Пп. , + name-pl-ab = пп. , + case = a , + Name-sg = Пункт , + name-sg = пункт , + Name-pl = Пункты , + name-pl = пункты , + Name-sg-ab = П. , + name-sg-ab = п. , + Name-pl-ab = Пп. , + name-pl-ab = пп. , + case = g , + Name-sg = Пункта , + name-sg = пункта , + Name-pl = Пунктов , + name-pl = пунктов , + Name-sg-ab = П. , + name-sg-ab = п. , + Name-pl-ab = Пп. , + name-pl-ab = пп. , + case = d , + Name-sg = Пункту , + name-sg = пункту , + Name-pl = Пунктам , + name-pl = пунктам , + Name-sg-ab = П. , + name-sg-ab = п. , + Name-pl-ab = Пп. , + name-pl-ab = пп. , + case = i , + Name-sg = Пунктом , + name-sg = пунктом , + Name-pl = Пунктами , + name-pl = пунктами , + Name-sg-ab = П. , + name-sg-ab = п. , + Name-pl-ab = Пп. , + name-pl-ab = пп. , + case = p , + Name-sg = Пункте , + name-sg = пункте , + Name-pl = Пунктах , + name-pl = пунктах , + Name-sg-ab = П. , + name-sg-ab = п. , + Name-pl-ab = Пп. , + name-pl-ab = пп. , + +type = footnote , + gender = f , + case = n , + Name-sg = Сноска , + name-sg = сноска , + Name-pl = Сноски , + name-pl = сноски , + case = a , + Name-sg = Сноску , + name-sg = сноску , + Name-pl = Сноски , + name-pl = сноски , + case = g , + Name-sg = Сноски , + name-sg = сноски , + Name-pl = Сносок , + name-pl = сносок , + case = d , + Name-sg = Сноске , + name-sg = сноске , + Name-pl = Сноскам , + name-pl = сноскам , + case = i , + Name-sg = Сноской , + name-sg = сноской , + Name-pl = Сносками , + name-pl = сносками , + case = p , + Name-sg = Сноске , + name-sg = сноске , + Name-pl = Сносках , + name-pl = сносках , + +type = endnote , + gender = f , + case = n , + Name-sg = Сноска , + name-sg = сноска , + Name-pl = Сноски , + name-pl = сноски , + case = a , + Name-sg = Сноску , + name-sg = сноску , + Name-pl = Сноски , + name-pl = сноски , + case = g , + Name-sg = Сноски , + name-sg = сноски , + Name-pl = Сносок , + name-pl = сносок , + case = d , + Name-sg = Сноске , + name-sg = сноске , + Name-pl = Сноскам , + name-pl = сноскам , + case = i , + Name-sg = Сноской , + name-sg = сноской , + Name-pl = Сносками , + name-pl = сносками , + case = p , + Name-sg = Сноске , + name-sg = сноске , + Name-pl = Сносках , + name-pl = сносках , + +type = note , + gender = f , + case = n , + Name-sg = Заметка , + name-sg = заметка , + Name-pl = Заметки , + name-pl = заметки , + case = a , + Name-sg = Заметку , + name-sg = заметку , + Name-pl = Заметки , + name-pl = заметки , + case = g , + Name-sg = Заметки , + name-sg = заметки , + Name-pl = Заметок , + name-pl = заметок , + case = d , + Name-sg = Заметке , + name-sg = заметке , + Name-pl = Заметкам , + name-pl = заметкам , + case = i , + Name-sg = Заметкой , + name-sg = заметкой , + Name-pl = Заметками , + name-pl = заметками , + case = p , + Name-sg = Заметке , + name-sg = заметке , + Name-pl = Заметках , + name-pl = заметках , + +type = equation , + gender = n , + case = n , + Name-sg = Уравнение , + name-sg = уравнение , + Name-pl = Уравнения , + name-pl = уравнения , + Name-sg-ab = Ур. , + name-sg-ab = ур. , + Name-pl-ab = Ур. , + name-pl-ab = ур. , + case = a , + Name-sg = Уравнение , + name-sg = уравнение , + Name-pl = Уравнения , + name-pl = уравнения , + Name-sg-ab = Ур. , + name-sg-ab = ур. , + Name-pl-ab = Ур. , + name-pl-ab = ур. , + case = g , + Name-sg = Уравнения , + name-sg = уравнения , + Name-pl = Уравнений , + name-pl = уравнений , + Name-sg-ab = Ур. , + name-sg-ab = ур. , + Name-pl-ab = Ур. , + name-pl-ab = ур. , + case = d , + Name-sg = Уравнению , + name-sg = уравнению , + Name-pl = Уравнениям , + name-pl = уравнениям , + Name-sg-ab = Ур. , + name-sg-ab = ур. , + Name-pl-ab = Ур. , + name-pl-ab = ур. , + case = i , + Name-sg = Уравнением , + name-sg = уравнением , + Name-pl = Уравнениями , + name-pl = уравнениями , + Name-sg-ab = Ур. , + name-sg-ab = ур. , + Name-pl-ab = Ур. , + name-pl-ab = ур. , + case = p , + Name-sg = Уравнении , + name-sg = уравнении , + Name-pl = Уравнениях , + name-pl = уравнениях , + Name-sg-ab = Ур. , + name-sg-ab = ур. , + Name-pl-ab = Ур. , + name-pl-ab = ур. , + +refbounds-rb = {с\nobreakspace(,,,)} , + refbounds-first-sg = {,(,),} , + refbounds = {(,,,)} , + +type = theorem , + gender = f , + case = n , + Name-sg = Теорема , + name-sg = теорема , + Name-pl = Теоремы , + name-pl = теоремы , + Name-sg-ab = Теор. , + name-sg-ab = теор. , + Name-pl-ab = Теор. , + name-pl-ab = теор. , + case = a , + Name-sg = Теорему , + name-sg = теорему , + Name-pl = Теоремы , + name-pl = теоремы , + Name-sg-ab = Теор. , + name-sg-ab = теор. , + Name-pl-ab = Теор. , + name-pl-ab = теор. , + case = g , + Name-sg = Теоремы , + name-sg = теоремы , + Name-pl = Теорем , + name-pl = теорем , + Name-sg-ab = Теор. , + name-sg-ab = теор. , + Name-pl-ab = Теор. , + name-pl-ab = теор. , + case = d , + Name-sg = Теореме , + name-sg = теореме , + Name-pl = Теоремам , + name-pl = теоремам , + Name-sg-ab = Теор. , + name-sg-ab = теор. , + Name-pl-ab = Теор. , + name-pl-ab = теор. , + case = i , + Name-sg = Теоремой , + name-sg = теоремой , + Name-pl = Теоремами , + name-pl = теоремами , + Name-sg-ab = Теор. , + name-sg-ab = теор. , + Name-pl-ab = Теор. , + name-pl-ab = теор. , + case = p , + Name-sg = Теореме , + name-sg = теореме , + Name-pl = Теоремах , + name-pl = теоремах , + Name-sg-ab = Теор. , + name-sg-ab = теор. , + Name-pl-ab = Теор. , + name-pl-ab = теор. , + +type = lemma , + gender = f , + case = n , + Name-sg = Лемма , + name-sg = лемма , + Name-pl = Леммы , + name-pl = леммы , + case = a , + Name-sg = Лемму , + name-sg = лемму , + Name-pl = Леммы , + name-pl = леммы , + case = g , + Name-sg = Леммы , + name-sg = леммы , + Name-pl = Лемм , + name-pl = лемм , + case = d , + Name-sg = Лемме , + name-sg = лемме , + Name-pl = Леммам , + name-pl = леммам , + case = i , + Name-sg = Леммой , + name-sg = леммой , + Name-pl = Леммами , + name-pl = леммами , + case = p , + Name-sg = Лемме , + name-sg = лемме , + Name-pl = Леммах , + name-pl = леммах , + +type = corollary , + gender = m , + case = n , + Name-sg = Вывод , + name-sg = вывод , + Name-pl = Выводы , + name-pl = выводы , + case = a , + Name-sg = Вывод , + name-sg = вывод , + Name-pl = Выводы , + name-pl = выводы , + case = g , + Name-sg = Вывода , + name-sg = вывода , + Name-pl = Выводов , + name-pl = выводов , + case = d , + Name-sg = Выводу , + name-sg = выводу , + Name-pl = Выводам , + name-pl = выводам , + case = i , + Name-sg = Выводом , + name-sg = выводом , + Name-pl = Выводами , + name-pl = выводами , + case = p , + Name-sg = Выводе , + name-sg = выводе , + Name-pl = Выводах , + name-pl = выводах , + +type = proposition , + gender = n , + case = n , + Name-sg = Предложение , + name-sg = предложение , + Name-pl = Предложения , + name-pl = предложения , + Name-sg-ab = Предл. , + name-sg-ab = предл. , + Name-pl-ab = Предл. , + name-pl-ab = предл. , + case = a , + Name-sg = Предложение , + name-sg = предложение , + Name-pl = Предложения , + name-pl = предложения , + Name-sg-ab = Предл. , + name-sg-ab = предл. , + Name-pl-ab = Предл. , + name-pl-ab = предл. , + case = g , + Name-sg = Предложения , + name-sg = предложения , + Name-pl = Предложений , + name-pl = предложений , + Name-sg-ab = Предл. , + name-sg-ab = предл. , + Name-pl-ab = Предл. , + name-pl-ab = предл. , + case = d , + Name-sg = Предложению , + name-sg = предложению , + Name-pl = Предложениям , + name-pl = предложениям , + Name-sg-ab = Предл. , + name-sg-ab = предл. , + Name-pl-ab = Предл. , + name-pl-ab = предл. , + case = i , + Name-sg = Предложением , + name-sg = предложением , + Name-pl = Предложениями , + name-pl = предложениями , + Name-sg-ab = Предл. , + name-sg-ab = предл. , + Name-pl-ab = Предл. , + name-pl-ab = предл. , + case = p , + Name-sg = Предложении , + name-sg = предложении , + Name-pl = Предложениях , + name-pl = предложениях , + Name-sg-ab = Предл. , + name-sg-ab = предл. , + Name-pl-ab = Предл. , + name-pl-ab = предл. , + +type = definition , + gender = n , + case = n , + Name-sg = Определение , + name-sg = определение , + Name-pl = Определения , + name-pl = определения , + Name-sg-ab = Опр. , + name-sg-ab = опр. , + Name-pl-ab = Опр. , + name-pl-ab = опр. , + case = a , + Name-sg = Определение , + name-sg = определение , + Name-pl = Определения , + name-pl = определения , + Name-sg-ab = Опр. , + name-sg-ab = опр. , + Name-pl-ab = Опр. , + name-pl-ab = опр. , + case = g , + Name-sg = Определения , + name-sg = определения , + Name-pl = Определений , + name-pl = определений , + Name-sg-ab = Опр. , + name-sg-ab = опр. , + Name-pl-ab = Опр. , + name-pl-ab = опр. , + case = d , + Name-sg = Определению , + name-sg = определению , + Name-pl = Определениям , + name-pl = определениям , + Name-sg-ab = Опр. , + name-sg-ab = опр. , + Name-pl-ab = Опр. , + name-pl-ab = опр. , + case = i , + Name-sg = Определением , + name-sg = определением , + Name-pl = Определениями , + name-pl = определениями , + Name-sg-ab = Опр. , + name-sg-ab = опр. , + Name-pl-ab = Опр. , + name-pl-ab = опр. , + case = p , + Name-sg = Определении , + name-sg = определении , + Name-pl = Определениях , + name-pl = определениях , + Name-sg-ab = Опр. , + name-sg-ab = опр. , + Name-pl-ab = Опр. , + name-pl-ab = опр. , + +type = proof , + gender = n , + case = n , + Name-sg = Доказательство , + name-sg = доказательство , + Name-pl = Доказательства , + name-pl = доказательства , + case = a , + Name-sg = Доказательство , + name-sg = доказательство , + Name-pl = Доказательства , + name-pl = доказательства , + case = g , + Name-sg = Доказательства , + name-sg = доказательства , + Name-pl = Доказательств , + name-pl = доказательств , + case = d , + Name-sg = Доказательству , + name-sg = доказательству , + Name-pl = Доказательствам , + name-pl = доказательствам , + case = i , + Name-sg = Доказательством , + name-sg = доказательством , + Name-pl = Доказательствами , + name-pl = доказательствами , + case = p , + Name-sg = Доказательстве , + name-sg = доказательстве , + Name-pl = Доказательствах , + name-pl = доказательствах , + +type = result , + gender = m , + case = n , + Name-sg = Результат , + name-sg = результат , + Name-pl = Результаты , + name-pl = результаты , + case = a , + Name-sg = Результат , + name-sg = результат , + Name-pl = Результаты , + name-pl = результаты , + case = g , + Name-sg = Результата , + name-sg = результата , + Name-pl = Результатов , + name-pl = результатов , + case = d , + Name-sg = Результату , + name-sg = результату , + Name-pl = Результатам , + name-pl = результатам , + case = i , + Name-sg = Результатом , + name-sg = результатом , + Name-pl = Результатами , + name-pl = результатами , + case = p , + Name-sg = Результате , + name-sg = результате , + Name-pl = Результатах , + name-pl = результатах , + +type = remark , + gender = n , + case = n , + Name-sg = Примечание , + name-sg = примечание , + Name-pl = Примечания , + name-pl = примечания , + Name-sg-ab = Прим. , + name-sg-ab = прим. , + Name-pl-ab = Прим. , + name-pl-ab = прим. , + case = a , + Name-sg = Примечание , + name-sg = примечание , + Name-pl = Примечания , + name-pl = примечания , + Name-sg-ab = Прим. , + name-sg-ab = прим. , + Name-pl-ab = Прим. , + name-pl-ab = прим. , + case = g , + Name-sg = Примечания , + name-sg = примечания , + Name-pl = Примечаний , + name-pl = примечаний , + Name-sg-ab = Прим. , + name-sg-ab = прим. , + Name-pl-ab = Прим. , + name-pl-ab = прим. , + case = d , + Name-sg = Примечанию , + name-sg = примечанию , + Name-pl = Примечаниям , + name-pl = примечаниям , + Name-sg-ab = Прим. , + name-sg-ab = прим. , + Name-pl-ab = Прим. , + name-pl-ab = прим. , + case = i , + Name-sg = Примечанием , + name-sg = примечанием , + Name-pl = Примечаниями , + name-pl = примечаниями , + Name-sg-ab = Прим. , + name-sg-ab = прим. , + Name-pl-ab = Прим. , + name-pl-ab = прим. , + case = p , + Name-sg = Примечании , + name-sg = примечании , + Name-pl = Примечаниях , + name-pl = примечаниях , + Name-sg-ab = Прим. , + name-sg-ab = прим. , + Name-pl-ab = Прим. , + name-pl-ab = прим. , + +type = example , + gender = m , + case = n , + Name-sg = Пример , + name-sg = пример , + Name-pl = Примеры , + name-pl = примеры , + case = a , + Name-sg = Пример , + name-sg = пример , + Name-pl = Примеры , + name-pl = примеры , + case = g , + Name-sg = Примера , + name-sg = примера , + Name-pl = Примеров , + name-pl = примеров , + case = d , + Name-sg = Примеру , + name-sg = примеру , + Name-pl = Примерам , + name-pl = примерам , + case = i , + Name-sg = Примером , + name-sg = примером , + Name-pl = Примерами , + name-pl = примерами , + case = p , + Name-sg = Примере , + name-sg = примере , + Name-pl = Примерах , + name-pl = примерах , + +type = algorithm , + gender = m , + case = n , + Name-sg = Алгоритм , + name-sg = алгоритм , + Name-pl = Алгоритмы , + name-pl = алгоритмы , + case = a , + Name-sg = Алгоритм , + name-sg = алгоритм , + Name-pl = Алгоритмы , + name-pl = алгоритмы , + case = g , + Name-sg = Алгоритма , + name-sg = алгоритма , + Name-pl = Алгоритмов , + name-pl = алгоритмов , + case = d , + Name-sg = Алгоритму , + name-sg = алгоритму , + Name-pl = Алгоритмам , + name-pl = алгоритмам , + case = i , + Name-sg = Алгоритмом , + name-sg = алгоритмом , + Name-pl = Алгоритмами , + name-pl = алгоритмами , + case = p , + Name-sg = Алгоритме , + name-sg = алгоритме , + Name-pl = Алгоритмах , + name-pl = алгоритмах , + +type = listing , + gender = m , + case = n , + Name-sg = Листинг , + name-sg = листинг , + Name-pl = Листинги , + name-pl = листинги , + case = a , + Name-sg = Листинг , + name-sg = листинг , + Name-pl = Листинги , + name-pl = листинги , + case = g , + Name-sg = Листинга , + name-sg = листинга , + Name-pl = Листингов , + name-pl = листингов , + case = d , + Name-sg = Листингу , + name-sg = листингу , + Name-pl = Листингам , + name-pl = листингам , + case = i , + Name-sg = Листингом , + name-sg = листинглм , + Name-pl = Листингами , + name-pl = листингами , + case = p , + Name-sg = Листинге , + name-sg = листинге , + Name-pl = Листингах , + name-pl = листингах , + +type = exercise , + gender = n , + case = n , + Name-sg = Упражнение , + name-sg = упражнение , + Name-pl = Упражнения , + name-pl = упражнения , + Name-sg-ab = Упр. , + name-sg-ab = упр. , + Name-pl-ab = Упр. , + name-pl-ab = упр. , + case = a , + Name-sg = Упражнение , + name-sg = упражнение , + Name-pl = Упражнения , + name-pl = упражнения , + Name-sg-ab = Упр. , + name-sg-ab = упр. , + Name-pl-ab = Упр. , + name-pl-ab = упр. , + case = g , + Name-sg = Упражнения , + name-sg = упражнения , + Name-pl = Упражнений , + name-pl = упражнений , + Name-sg-ab = Упр. , + name-sg-ab = упр. , + Name-pl-ab = Упр. , + name-pl-ab = упр. , + case = d , + Name-sg = Упражнению , + name-sg = упражнению , + Name-pl = Упражнениям , + name-pl = упражнениям , + Name-sg-ab = Упр. , + name-sg-ab = упр. , + Name-pl-ab = Упр. , + name-pl-ab = упр. , + case = i , + Name-sg = Упражнением , + name-sg = упражнением , + Name-pl = Упражнениями , + name-pl = упражнениями , + Name-sg-ab = Упр. , + name-sg-ab = упр. , + Name-pl-ab = Упр. , + name-pl-ab = упр. , + case = p , + Name-sg = Упражнении , + name-sg = упражнении , + Name-pl = Упражнениях , + name-pl = упражнениях , + Name-sg-ab = Упр. , + name-sg-ab = упр. , + Name-pl-ab = Упр. , + name-pl-ab = упр. , + +type = solution , + gender = n , + case = n , + Name-sg = Решение , + name-sg = решение , + Name-pl = Решения , + name-pl = решения , + case = a , + Name-sg = Решение , + name-sg = решение , + Name-pl = Решения , + name-pl = решения , + case = g , + Name-sg = Решения , + name-sg = решения , + Name-pl = Решений , + name-pl = решений , + case = d , + Name-sg = Решению , + name-sg = решению , + Name-pl = Решениям , + name-pl = решениям , + case = i , + Name-sg = Решением , + name-sg = решением , + Name-pl = Решениями , + name-pl = решениями , + case = p , + Name-sg = Решении , + name-sg = решении , + Name-pl = Решениях , + name-pl = решениях , +% \end{macrocode} +% +% \begin{macrocode} +%</lang-russian> +% \end{macrocode} +% +% % \PrintIndex % % diff --git a/macros/latex/contrib/zref-clever/zref-clever.ins b/macros/latex/contrib/zref-clever/zref-clever.ins index 17e4599190..0aefb6ce73 100644 --- a/macros/latex/contrib/zref-clever/zref-clever.ins +++ b/macros/latex/contrib/zref-clever/zref-clever.ins @@ -95,5 +95,6 @@ for those people who are interested. \generate{\file{zref-clever-spanish.lang}{\from{zref-clever.dtx}{lang-spanish}}} \generate{\file{zref-clever-dutch.lang}{\from{zref-clever.dtx}{lang-dutch}}} \generate{\file{zref-clever-italian.lang}{\from{zref-clever.dtx}{lang-italian}}} +\generate{\file{zref-clever-russian.lang}{\from{zref-clever.dtx}{lang-russian}}} \endbatchfile diff --git a/macros/luatex/generic/luamplib/NEWS b/macros/luatex/generic/luamplib/NEWS index fdae6fc90c..347f560046 100644 --- a/macros/luatex/generic/luamplib/NEWS +++ b/macros/luatex/generic/luamplib/NEWS @@ -1,5 +1,9 @@ History of the luamplib package +2024/05/21 2.31.0 + * provide a new metapost operator 'mpliboutlinetext', which mimicks + metafun's 'outlinetext'. The syntax is the same as metafun's. + 2024/05/10 2.30.0 * provide a new metapost operator 'mplibglyph', which returns a metapost picture containing outline paths of a glyph in opentype, truetype or type1 @@ -8,7 +12,7 @@ mplibglyph 50 of \fontid\font % slot 50 of current font mplibglyph 50 of "cmr10" % type1 font - mplibglyph "Q" of "TU/TeXGyrePagella(0)/m/n/10" % TeX fontname + mplibglyph "Q" of "TU/TeXGyrePagella(0)/m/n/10" % font csname mplibglyph "똠" of "NotoSansCJKkr-Regular.otf" % raw filename mplibglyph "Q" of "Times.ttc(2)" % subfont number mplibglyph "똠" of "SourceHanSansK-VF.otf[Regular]" % instance name diff --git a/macros/luatex/generic/luamplib/luamplib.dtx b/macros/luatex/generic/luamplib/luamplib.dtx index e5b4adbb5e..506b5c019a 100644 --- a/macros/luatex/generic/luamplib/luamplib.dtx +++ b/macros/luatex/generic/luamplib/luamplib.dtx @@ -85,7 +85,7 @@ See source file '\inFileName' for licencing and contact information. %<*driver> \NeedsTeXFormat{LaTeX2e} \ProvidesFile{luamplib.drv}% - [2024/05/10 v2.30.0 Interface for using the mplib library]% + [2024/05/21 v2.31.0 Interface for using the mplib library]% \documentclass{ltxdoc} \usepackage{metalogo,multicol,mdwlist,fancyvrb,xspace} \usepackage[x11names]{xcolor} @@ -153,7 +153,7 @@ See source file '\inFileName' for licencing and contact information. % \author{Hans Hagen, Taco Hoekwater, Elie Roux, Philipp Gesang and Kim Dohyun\\ % Maintainer: LuaLaTeX Maintainers --- % Support: \email{lualatex-dev@tug.org}} -% \date{2024/05/10 v2.30.0} +% \date{2024/05/21 v2.31.0} % % \maketitle % @@ -504,7 +504,7 @@ See source file '\inFileName' for licencing and contact information. % When a type1 font is specified, metapost primitive |glyph| will be called. % \begin{verbatim} % mplibglyph 50 of \fontid\font % slot 50 of current font -% mplibglyph "Q" of "TU/TeXGyrePagella(0)/m/n/10" % TeX fontname +% mplibglyph "Q" of "TU/TeXGyrePagella(0)/m/n/10" % font csname % mplibglyph "Q" of "texgyrepagella-regular.otf" % raw filename % mplibglyph "Q" of "Times.ttc(2)" % subfont number % mplibglyph "Q" of "SourceHanSansK-VF.otf[Regular]" % instance name @@ -512,7 +512,7 @@ See source file '\inFileName' for licencing and contact information. % Both arguments before and after of ``|of|'' can be either a number or a string. % Number arguments are regarded as a glyph slot (GID) and a font id number, repectively. % String argument at the left side is regarded as a glyph name in the font or a unicode character. -% String argument at the right side is regarded as a \TeX\ fontname (without backslash) or +% String argument at the right side is regarded as a \TeX\ font csname (without backslash) or % the raw filename of a font. When it is a font filename, a number within parentheses % after the filename denotes a % subfont number (starting from zero) of a TTC font; a string within brackets denotes @@ -549,6 +549,17 @@ See source file '\inFileName' for licencing and contact information. % \endmpfig % \end{verbatim} % +% \paragraph{\texttt{mpliboutlinetext}} +% From v2.31, we provide a new metapost operator |mpliboutlinetext|, which mimicks +% metafun's |outlinetext|. So the syntax is the same as metafun's. See the metafun +% manual \textsection\,8.7 (|texdoc metafun|). A simple example: +% \begin{verbatim} +% draw mpliboutlinetext.b ("$\sqrt{2+\alpha}$") +% (withcolor \mpcolor{red!50}) +% (withpen pencircle scaled .2 withcolor red) +% scaled 2 ; +% \end{verbatim} +% % \paragraph{About figure box metrics} % Notice that, after each figure is processed, macro \cs{MPwidth} stores % the width value of latest figure; \cs{MPheight}, the height value. @@ -581,8 +592,8 @@ See source file '\inFileName' for licencing and contact information. luatexbase.provides_module { name = "luamplib", - version = "2.30.0", - date = "2024/05/10", + version = "2.31.0", + date = "2024/05/21", description = "Lua package to typeset Metapost with LuaTeX's MPLib.", } @@ -1394,7 +1405,6 @@ local function colorsplit (res) return t end -local min = math.min luamplib.gettexcolor = function (str, rgb) local res = process_color(str):match'"mpliboverridecolor=(.+)"' if res:find" cs " or res:find"@pdf.obj" then @@ -1413,7 +1423,7 @@ luamplib.gettexcolor = function (str, rgb) local t = colorsplit(res) if #t == 3 or not rgb then return t end if #t == 4 then - return { 1 - min(1,t[1]+t[4]), 1 - min(1,t[2]+t[4]), 1 - min(1,t[3]+t[4]) } + return { 1 - math.min(1,t[1]+t[4]), 1 - math.min(1,t[2]+t[4]), 1 - math.min(1,t[3]+t[4]) } end return { t[1], t[1], t[1] } end @@ -1652,11 +1662,12 @@ end if not table.tofile then require"lualibs-lpeg"; require"lualibs-table"; end function luamplib.glyph (f, c) local filename, subfont, instance, kind, shapedata - local fid = tonumber(f) or font.id(f) -- string: fontname + local fid = tonumber(f) or font.id(f) if fid > 0 then local fontdata = font.getfont(fid) or font.getcopy(fid) filename, subfont, kind = fontdata.filename, fontdata.subfont, fontdata.format instance = fontdata.specification and fontdata.specification.instance + filename = filename:gsub("^harfloaded:","") else local name f = f:match"^%s*(.+)%s*$" @@ -1711,7 +1722,7 @@ function luamplib.glyph (f, c) if not gid then return mperr"cannot get GID (glyph id)" end local fac = 1000 / (shapedata.units or 1000) local t = shapedata.glyphs[gid].segments - if not t then return mperr"glyph has no contour. Maybe blank space" end + if not t then return "image(fill fullcircle scaled 0;)" end for i,v in ipairs(t) do if type(v) == "table" then for ii,vv in ipairs(v) do @@ -1721,11 +1732,256 @@ function luamplib.glyph (f, c) end end end + kind = shapedata.format or kind return glyphimage(t, kind) end % \end{macrocode} % +% mpliboutlinetext : based on mkiv's font-mps.lua +% \begin{macrocode} +local rulefmt = "mplibpic[%i]:=image(addto currentpicture contour \z +unitsquare shifted - center unitsquare;) xscaled %f yscaled %f shifted (%f,%f);" +local outline_horz, outline_vert +function outline_vert (res, box, curr, xshift, yshift) + local b2u = box.dir == "LTL" + local dy = (b2u and -(box.depth or 0) or (box.height or 0))/factor + local ody = dy + while curr do + if curr.id == node.id"rule" then + local ht, dp = curr.height/factor, curr.depth/factor + local hd = ht + dp + if hd ~= 0 then + local wd = curr.width + wd = (wd == -1073741824 and box.width or wd)/factor + dy = dy + (b2u and dp or -ht) + if wd ~= 0 and curr.subtype == 0 then + res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+wd/2, yshift+dy+(ht-dp)/2) + end + dy = dy + (b2u and ht or -dp) + end + elseif curr.id == node.id"glue" then + local vwidth = node.effective_glue(curr,box)/factor + dy = dy + (b2u and vwidth or 0) + if curr.leader then + local curr, kind = curr.leader, curr.subtype + if curr.id == node.id"rule" then + local wd = curr.width/factor + if wd ~= 0 then + local hd = vwidth + local dy = dy - hd + if hd ~= 0 and curr.subtype == 0 then + res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+wd/2, yshift+dy+hd/2) + end + end + elseif curr.head then + local hd = (curr.height + curr.depth)/factor + if hd <= vwidth then + local dy = b2u and dy-vwidth or dy + local n, iy = 0, 0 + if kind == 100 or kind == 103 then -- todo: gleaders + local ady = abs(ody - dy) + local ndy = math.ceil(ady / hd) * hd + local diff = ndy - ady + n = (vwidth-diff) // hd + dy = dy + (b2u and diff or -diff) + else + n = vwidth // hd + if kind == 101 then + local side = vwidth % hd / 2 + dy = dy + (b2u and side or -side) + elseif kind == 102 then + iy = vwidth % hd / (n+1) + dy = dy + (b2u and iy or -iy) + end + end + dy = dy + (b2u and curr.depth or -curr.height)/factor + hd = b2u and hd or -hd + iy = b2u and iy or -iy + local func = curr.id == node.id"hlist" and outline_horz or outline_vert + for i=1,n do + res = func(res, curr, curr.head, xshift+curr.shift/factor, yshift+dy) + dy = dy + hd + iy + end + end + end + end + dy = dy - (b2u and 0 or vwidth) + elseif curr.id == node.id"kern" then + dy = dy + curr.kern/factor * (b2u and 1 or -1) + elseif curr.id == node.id"vlist" then + dy = dy + (b2u and curr.depth or -curr.height)/factor + res = outline_vert(res, curr, curr.head, xshift+curr.shift/factor, yshift+dy) + dy = dy + (b2u and curr.height or -curr.depth)/factor + elseif curr.id == node.id"hlist" then + dy = dy + (b2u and curr.depth or -curr.height)/factor + res = outline_horz(res, curr, curr.head, xshift+curr.shift/factor, yshift+dy) + dy = dy + (b2u and curr.height or -curr.depth)/factor + end + curr = node.getnext(curr) + end + return res +end +function outline_horz (res, box, curr, xshift, yshift) + local r2l = box.dir == "TRT" + local dx = r2l and (box.width or 0)/factor or 0 + local dirs = { { dir = r2l, dx = dx } } + local odx = dx + while curr do + if curr.id == node.id"dir" then + local sign, dir = curr.dir:match"(.)(...)" + local level, newdir = curr.level, r2l + if sign == "+" then + local n = node.getnext(curr) + while n do + if n.id == node.id"dir" and n.level+1 == level then break end + n = node.getnext(n) + end + n = n or node.tail(curr) + newdir = dir == "TRT" + if r2l ~= newdir then + dx = dx + node.rangedimensions(box, curr, n)/factor * (newdir and 1 or -1) + end + dirs[level] = { dir = r2l, dx = dx } + else + local level = level + 1 + newdir = dirs[level].dir + if r2l ~= newdir then + dx = dirs[level].dx + end + end + r2l = newdir + elseif curr.char and curr.font and curr.font > 0 then + local ft = font.getfont(curr.font) or font.getcopy(curr.font) + local gid = ft.characters[curr.char].index or curr.char + local scale = ft.size / factor / 1000 + local slant = (ft.slant or 0)/1000 + local extend = (ft.extend or 1000)/1000 + local squeeze = (ft.squeeze or 1000)/1000 + local expand = 1 + (curr.expansion_factor or 0)/1000000 + local xscale = scale * extend * expand + local yscale = scale * squeeze + dx = dx - (r2l and curr.width/factor*expand or 0) + local xpos = dx + xshift + (curr.xoffset or 0)/factor + local ypos = yshift + (curr.yoffset or 0)/factor + local image + if ft.format == "opentype" or ft.format == "truetype" then + image = luamplib.glyph(curr.font, gid) + else + local name, scale = ft.name, 1 + local vf = font.read_vf(name, ft.size) + if vf and vf.characters[gid] then + local cmds = vf.characters[gid].commands or {} + for _,v in ipairs(cmds) do + if v[1] == "char" then + gid = v[2] + elseif v[1] == "font" and vf.fonts[v[2]] then + name = vf.fonts[v[2]].name + scale = vf.fonts[v[2]].size / ft.size + end + end + end + image = format("glyph %s of %q scaled %f", gid, name, scale) + end + res[#res+1] = format("mplibpic[%i]:=%s xscaled %f yscaled %f slanted %f shifted (%f,%f);", + #res+1, image, xscale, yscale, slant, xpos, ypos) + dx = dx + (r2l and 0 or curr.width/factor*expand) + elseif curr.id == node.id"disc" then + local width = node.dimensions(curr.replace)/factor + dx = dx - (r2l and width or 0) + res = outline_horz(res, curr, curr.replace, xshift+dx, yshift) + dx = dx + (r2l and 0 or width) + elseif curr.id == node.id"rule" then + local wd = curr.width/factor + if wd ~= 0 then + local ht, dp = curr.height, curr.depth + ht = (ht == -1073741824 and box.height or ht)/factor + dp = (dp == -1073741824 and box.depth or dp)/factor + local hd = ht + dp + dx = dx - (r2l and wd or 0) + if hd ~= 0 and curr.subtype == 0 then + res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+dx+wd/2, yshift+(ht-dp)/2) + end + dx = dx + (r2l and 0 or wd) + end + elseif curr.id == node.id"glue" then + local width = node.effective_glue(curr, box)/factor + dx = dx - (r2l and width or 0) + if curr.leader then + local curr, kind = curr.leader, curr.subtype + if curr.id == node.id"rule" then + local ht, dp = curr.height/factor, curr.depth/factor + local hd = ht + dp + if hd ~= 0 then + local wd = width + if wd ~= 0 and curr.subtype == 0 then + res[#res+1] = rulefmt:format(#res+1, wd, hd, xshift+dx+wd/2, yshift+(ht-dp)/2) + end + end + elseif curr.head then + local wd = curr.width/factor + if wd <= width then + local dx = r2l and dx+width or dx + local n, ix = 0, 0 + if kind == 100 or kind == 103 then -- todo: gleaders + local adx = abs(dx-odx) + local ndx = math.ceil(adx / wd) * wd + local diff = ndx - adx + n = (width-diff) // wd + dx = dx + (r2l and -diff-wd or diff) + else + n = width // wd + if kind == 101 then + local side = width % wd /2 + dx = dx + (r2l and -side-wd or side) + elseif kind == 102 then + ix = width % wd / (n+1) + dx = dx + (r2l and -ix-wd or ix) + end + end + wd = r2l and -wd or wd + ix = r2l and -ix or ix + local func = curr.id == node.id"hlist" and outline_horz or outline_vert + for i=1,n do + res = func(res, curr, curr.head, xshift+dx, yshift-curr.shift/factor) + dx = dx + wd + ix + end + end + end + end + dx = dx + (r2l and 0 or width) + elseif curr.id == node.id"kern" then + dx = dx + curr.kern/factor * (r2l and -1 or 1) + elseif curr.id == node.id"math" then + dx = dx + curr.surround/factor * (r2l and -1 or 1) + elseif curr.id == node.id"vlist" then + dx = dx - (r2l and curr.width/factor or 0) + res = outline_vert(res, curr, curr.head, xshift+dx, yshift-curr.shift/factor) + dx = dx + (r2l and 0 or curr.width/factor) + elseif curr.id == node.id"hlist" then + dx = dx - (r2l and curr.width/factor or 0) + res = outline_horz(res, curr, curr.head, xshift+dx, yshift-curr.shift/factor) + dx = dx + (r2l and 0 or curr.width/factor) + end + curr = node.getnext(curr) + end + return res +end +function luamplib.outlinetext (text) + local fmt = process_tex_text(text) + local id = tonumber(fmt:match"mplibtexboxid=(%d+):") + local box = texgetbox(id) + local res = outline_horz({ }, box, box.head, 0, 0) + if #res == 0 then res = { "mplibpic[1]:=image(fill fullcircle scaled 0;);" } end + local t = { } + for i=1, #res do + t[#t+1] = format("addto currentpicture also mplibpic[%i];", i) + end + return tableconcat(res) .. format("mplibpic[0]:=image(%s);", tableconcat(t)) +end + +% \end{macrocode} +% % Our MetaPost preambles % \begin{macrocode} luamplib.preambles = { @@ -1820,6 +2076,81 @@ def mplibdrawglyph expr g = endfor ) enddef; +def mplib_do_outline_text_set_b (text f) (text d) text r = + def mplib_do_outline_options_f = f enddef; + def mplib_do_outline_options_d = d enddef; + def mplib_do_outline_options_r = r enddef; +enddef; +def mplib_do_outline_text_set_f (text f) text r = + def mplib_do_outline_options_f = f enddef; + def mplib_do_outline_options_r = r enddef; +enddef; +def mplib_do_outline_text_set_d (text d) text r = + def mplib_do_outline_options_d = d enddef; + def mplib_do_outline_options_r = r enddef; +enddef; +def mplib_do_outline_text_set_r (text d) (text f) text r = + def mplib_do_outline_options_d = d enddef; + def mplib_do_outline_options_f = f enddef; + def mplib_do_outline_options_r = r enddef; +enddef; +def mplib_do_outline_text_set_n text r = + def mplib_do_outline_options_r = r enddef; +enddef; +def mplib_do_outline_text_set_p = enddef; +def mplib_fill_outline_text (expr p) = + i:=0; + for item within p: + i:=i+1; + addto currentpicture contour pathpart item + if i < length p: withpostscript "collect"; fi + endfor + mplib_do_outline_options_f; +enddef; +def mplib_draw_outline_text (expr p) = + i:=0; + for item within p: + i:=i+1; + addto currentpicture doublepath pathpart item + if i < length p: withpostscript "collect"; fi + endfor + mplib_do_outline_options_d; +enddef; +vardef mpliboutlinetext@# (expr t) text rest = + save kind; string kind; kind := str @#; + save mplibpic, i; picture mplibpic[]; numeric i; + def mplib_do_outline_options_d = enddef; + def mplib_do_outline_options_f = enddef; + def mplib_do_outline_options_r = enddef; + runscript("return luamplib.outlinetext[===["&t&"]===]"); + image ( addto currentpicture also image ( + if kind = "f": + mplib_do_outline_text_set_f rest; + def mplib_do_outline_options_d = withpen pencircle scaled 0 enddef; + mplib_fill_outline_text (mplibpic0); + elseif kind = "d": + mplib_do_outline_text_set_d rest; + mplib_draw_outline_text (mplibpic0); + elseif kind = "b": + mplib_do_outline_text_set_b rest; + mplib_fill_outline_text (mplibpic0); + mplib_draw_outline_text (mplibpic0); + elseif kind = "u": + mplib_do_outline_text_set_f rest; + mplib_fill_outline_text (mplibpic0); + elseif kind = "r": + mplib_do_outline_text_set_r rest; + mplib_draw_outline_text (mplibpic0); + mplib_fill_outline_text (mplibpic0); + elseif kind = "p": + mplib_do_outline_text_set_p; + mplib_draw_outline_text (mplibpic0); + else: + mplib_do_outline_text_set_n rest; + mplib_fill_outline_text (mplibpic0); + fi; + ) mplib_do_outline_options_r; ) +enddef ; ]], legacyverbatimtex = [[ def specialVerbatimTeX (text t) = runscript("luamplibprefig{"&t&"}") enddef; @@ -2776,7 +3107,7 @@ end \else \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{luamplib} - [2024/05/10 v2.30.0 mplib package for LuaTeX] + [2024/05/21 v2.31.0 mplib package for LuaTeX] \ifx\newluafunction\@undefined \input ltluatex \fi diff --git a/macros/luatex/generic/luamplib/luamplib.pdf b/macros/luatex/generic/luamplib/luamplib.pdf Binary files differindex b6f57158f7..5ffccd841a 100644 --- a/macros/luatex/generic/luamplib/luamplib.pdf +++ b/macros/luatex/generic/luamplib/luamplib.pdf diff --git a/macros/luatex/generic/luamplib/test-luamplib-latex.tex b/macros/luatex/generic/luamplib/test-luamplib-latex.tex index faa516f25f..043c34adbb 100644 --- a/macros/luatex/generic/luamplib/test-luamplib-latex.tex +++ b/macros/luatex/generic/luamplib/test-luamplib-latex.tex @@ -225,6 +225,13 @@ endfor \everymplib[@mpfig]{ drawoptions(withcolor mplibrgbtexcolor "olive"); }% \mpfig* input boxes \endmpfig \mpfig circleit.a(btex\tracingcommands0 Box 1 etex); drawboxed(a); \endmpfig +\def\mpfiginstancename{mympfig}% +\mpfig +draw mpliboutlinetext.b ("$\sqrt{2+\alpha}$") + (withcolor .6[red,white]) + (withpen pencircle scaled .2 withcolor red) + scaled 4 ; +\endmpfig \tracingcommands0 \vskip 2\baselineskip diff --git a/macros/luatex/generic/luamplib/test-luamplib-plain.tex b/macros/luatex/generic/luamplib/test-luamplib-plain.tex index 896c7f0a95..63bffc5ad5 100644 --- a/macros/luatex/generic/luamplib/test-luamplib-plain.tex +++ b/macros/luatex/generic/luamplib/test-luamplib-plain.tex @@ -218,6 +218,13 @@ endfor \everymplib[@mpfig]{ drawoptions(withcolor mplibrgbtexcolor"orange"); }% \mpfig* input boxes \endmpfig \mpfig circleit.a(btex\tracingcommands0 Box 1 etex); drawboxed(a); \endmpfig +\def\mpfiginstancename{mympfig}% +\mpfig +draw mpliboutlinetext.b ("$\sqrt{2+\alpha}$") + (withcolor .6[red,white]) + (withpen pencircle scaled .2 withcolor red) + scaled 4 ; +\endmpfig \tracingcommands0 \vskip 2\baselineskip |