Re: Fallback fonts in LuaTeX via 'luaotfload.add_fallback' (was "Fontsets")
On 12/07/2022 22:26, Juan Manuel Macías wrote: Today I discovered that luaotfload included in v. 3.12 a new experimental function, luaotfload.add_fallback, to be able to add a list of fallback fonts to a LuaTeX document, at a low level. ... \documentclass{article} \usepackage{fontspec} \directlua{ luaotfload.add_fallback ("fallbacktest",{ "oldstandard:mode=harf;script=grek;color=FF;", "oldstandard:mode=harf;script=cyrl;color=FF;", "freeserif:mode=harf;script=arab;color=FF;", "freeserif:mode=harf;script=dev2;color=FF;", })} \setmainfont{latinmodernroman}[RawFeature={fallback=fallbacktest}] ... The main drawback I've found to this (at least I don't know how to solve it at the moment) is that the fallback feature cannot be added via \defaultfontfeatures. That would avoid having to (re)define all the main/sans/mono/math families. I agree that defining fallbacks for each font family is inconvenient. Defining font per script resembles specifying fonts per language in babel configuration, however fallback should work without explicit switching of language. I have seen that babel may determine language from character code points, but I have not tried if it works reliable and if it affects performance (as it does for fallback fonts). Maybe I did not read the manual with enough attention, maybe I tried it with too old version of LuaTeX, but I had a problem with Emoji. Depending on font such symbols either broke compilation or did not appear in PDF (accordingly to pdffonts font was embedded, text may be copied, but PDF viewers displayed blank space). https://list.orgmode.org/orgmode/scuirf$m7o$1...@ciao.gmane.io/ Maxim Nikulin. Re: org-mode export to (latex) PDF. Sat, 17 Jul 2021 19:35:57 +0700
Fallback fonts in LuaTeX via 'luaotfload.add_fallback' (was "Fontsets")
Today I discovered that luaotfload included in v. 3.12 a new experimental function, luaotfload.add_fallback, to be able to add a list of fallback fonts to a LuaTeX document, at a low level. (More info on page 18 of the luaotfload manual, with some examples). I've been experimenting a bit with this function. For example: #+begin_src latex \documentclass{article} \usepackage{fontspec} \directlua{ luaotfload.add_fallback ("fallbacktest", { "oldstandard:mode=harf;script=grek;color=FF;", "oldstandard:mode=harf;script=cyrl;color=FF;", "freeserif:mode=harf;script=arab;color=FF;", "freeserif:mode=harf;script=dev2;color=FF;", } ) } \setmainfont{latinmodernroman}[RawFeature={fallback=fallbacktest}] \begin{document} Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec hendrerit tempor tellus. Donec pretium posuere tellus. Δαρείου καὶ Παρυσάτιδος γίγνονται παῖδες δύο, πρεσβύτερος μὲν Ἀρταξέρξης, νεώτερος δὲ Κῦρος· ἐπεὶ δὲ ἠσθένει Δαρεῖος καὶ ὑπώπτευε τελευτὴν τοῦ βίου, ἐβούλετο τὼ παῖδε ἀμφοτέρω παρεῖναι. ὁ μὲν οὖν πρεσβύτερος παρὼν ἐτύγχανε· Κῦρον δὲ μεταπέμπεται ἀπὸ τῆς ἀρχῆς ἧς αὐτὸν σατράπην ἐποίησε, καὶ στρατηγὸν δὲ αὐτὸν ἀπέδειξε πάντων ὅσοι ἐς Καστωλοῦ πεδίον ἁθροίζονται. Emacs написан на двух языках: C и Emacs Lisp (Elisp, диалект Лиспа). При этом сам редактор является интерпретатором Elisp. По сути дела, большая часть Emacs написана на языке Elisp, и её можно рассматривать как расширение к основной программе. Пользователи могут сами создавать части Emacs, от отдельных функций до новых основных режимов. При этом можно переопределять любые Elisp-функции, в том числе и те, что являются частью самого редактора, и модифицировать функциональность Emacs, изменив соответствующим образом некоторые функции. Native speakers of Arabic generally do not distinguish between Modern Standard Arabic and Classical Arabic as separate languages; they refer to both as al-ʻArabīyah al-Fuṣḥá (العربية الفصحى) meaning the pure Arabic. They consider the two forms to be two registers of one language. When the distinction is made, they are referred to as فصحى العصر Fuṣḥá al-ʻAṣr (MSA) and فصحى التراث Fuṣḥá al-Turāth (CA) respectively. उदु ज्योतिरमृतं विश्वजन्यं विश्वानरः सविता देवो अश्रेत् ।\\ क्रत्वा देवानामजनिष्ट चक्षुराविरकर्भुवनं विश्वमुषाः ॥ १ ॥\\ प्र मे पन्था देवयाना अदृश्रन्नमर्धन्तो वसुभिरिष्कृतासः ।\\ अभूदु केतुरुषसः पुरस्तात्प्रतीच्यागादधि हर्म्येभ्यः ॥ २ ॥ \end{document} #+end_src The main drawback I've found to this (at least I don't know how to solve it at the moment) is that the fallback feature cannot be added via \defaultfontfeatures. That would avoid having to (re)define all the main/sans/mono/math families. Best regards, Juan Manuel
Re: fontsets
Stefan Nobis writes: > Hmmm... maybe add optional extra config/output option to the fontset, > like so: > > ┌ > │ ;; Fonts > │ ((myfonta . ((pdflatex . "etc.") (lualatex ...) (html ...) ...)) > │ (myfontb ...) > │ ...) > │ ;; Fontsets > │ ((myfontset . > │ ((sans . myfonta) > │(serif . myfontb) > │(mono . myfontc) > │(extra . ((lualatex . "\\defaultfontfeatures{Scale=MatchLowercase}") > │ (html "some CSS...")...)) > │...)) > │ ...) > └ > > This way it may be possible to build a fontset library of fonts that > blend well together, including some necessary fine-tuning. I think it's a good idea. And I definitely like Timothy's idea of fontsets, but I still think that LuaLaTeX and XelaTeX should be unified in some way. Perhaps one or two default fontsets could be added. It was commented in some previous message about the possibility of checking if a font is present in the system. To add some extra information, TeX live 2022 includes a lua script, luafindfont, which runs luaotfload in the background. It is very useful because, in addition to system fonts, it also returns results from TeX live fonts. I use this script via helm, and I wrote this to extract a list of candidates: #+begin_src emacs-lisp (defun build-luafindfont-candidates-list (candidate) (interactive) (let* ((query (shell-command-to-string (concat "luafindfont " candidate))) (str (with-temp-buffer (insert query) (goto-char (point-min)) (let ((from (save-excursion (re-search-forward "1\\." nil t) (beginning-of-line) (point))) (to (save-excursion (goto-char (point-max)) (point (save-restriction (narrow-to-region from to) (buffer-string) (str-clean (split-string (with-temp-buffer (insert str) (replace "[[:digit:]]+\\.\s+" "") (replace "\\(.+\\)\\(\\.otf\\|\\.ttf\\)\s+" "") (replace "\s+" " -- ") (buffer-string)) "\n" t))) (setq luafindfont-list (mapcar 'identity str-clean #+end_src On the other hand, fontspec includes the \IfFontExistsTF command. According to the fontspec documentation: -- \IfFontExistsTF{⟨font name⟩}{⟨true branch⟩}{⟨false branch⟩} The conditional \IfFontExistsTF is provided to test whether the ⟨font name⟩ exists or is loadable. If it is, the ⟨true branch⟩ code is executed; otherwise, the ⟨false branch⟩ code is. This command can be slow since the engine may resort to scanning the filesystem for a missing font. Nonetheless, it has been a popular request for users who wish to define ‘fallback fonts’ for their documents for greater portability. In this command, the syntax for the ⟨font name⟩ is a restricted/simplified version of the font loading syntax used for \fontspec and so on. Fonts to be loaded by filename are detected by the presence of an appropriate extension (.otf, etc.), and paths should be included inline. E.g.: \IfFontExistsTF{cmr10}{T}{F} \IfFontExistsTF{Times New Roman}{T}{F} \IfFontExistsTF{texgyrepagella-regular.otf}{T}{F} \IfFontExistsTF{/Users/will/Library/Fonts/CODE2000.TTF}{T}{F} --- Best regards, Juan Manuel
Re: fontsets
Juan Manuel Macías writes: > [1] I have to add, by the way, that MatchLowercase is not always a > panacea. Hmmm... maybe add optional extra config/output option to the fontset, like so: ┌ │ ;; Fonts │ ((myfonta . ((pdflatex . "etc.") (lualatex ...) (html ...) ...)) │ (myfontb ...) │ ...) │ ;; Fontsets │ ((myfontset . │ ((sans . myfonta) │(serif . myfontb) │(mono . myfontc) │(extra . ((lualatex . "\\defaultfontfeatures{Scale=MatchLowercase}") │ (html "some CSS...")...)) │...)) │ ...) └ This way it may be possible to build a fontset library of fonts that blend well together, including some necessary fine-tuning. -- Until the next mail..., Stefan.
Re: fontsets
Hi, Timothy, Timothy writes: > Yep, so in my config’s implementation I have an alist of fontset names and > individual fonts. For something part of org-mode itself, we’d probably want to > add a format level to this, something like: > > ┌ > │ ((fontset-name . > │ ((serif . > │ ((pdflatex . "\\usepackage{myserif}") > │ (lualatex . "etc.") > │ (html . "and so on"))) > │(sans ...) ... )) > │ (another-fontset ...) ...) > └ > > Actually, now that I think of it maybe it would be better to seperate out the > fontsets and fots, e.g. > > ┌ > │ ;; Fonts > │ ((myfonta . ((pdflatex . "etc.") (lualatex ...) (html ...) ...)) > │ (myfontb ...) > │ ...) > │ ;; Fontsets > │ ((myfontset . > │ ((sans . myfonta) > │(serif . myfontb) > │(mono . myfontc) > │...)) > │ ...) > └ > >> In any case, I think it would also be nice if the user could add only >> one family for roman, sans, mono or math, if he/she prefers it that way. >> Something like: >> >> #+options: rmfont:Minion Pro > > Sure. There’s another bit of functionality in my config which I think is worth > noting, you can add a -sans/-serif/-mono suffix to the fontset name to > override > the default body text font. I see. I like your approach. And the idea of fontsets also seems very productive. I suppose that a minimum configuration in fontspec (Scale=MatchLowercase) should be ensured, in order to balance the x-height when using fonts from different families in a single document[1]. The fact that all of this can also be "reusable" for other outputs such as html, is a not insignificant plus! I definitely really like all of these ideas and I don't think there is any contradiction with a balance between those users who are content with minimal out-of-the-box font configuration to be able to read non-latin characters, and those who want more control over fontspec (font features, etc). And there are also the users (me among them) who leave little or almost no space for Org to write the preamble for us :-) On the other hand, maybe (I think) it would be nice not to differentiate between xelatex and lualatex, since at least at this level both engines support the same fontspec settings. [1] I have to add, by the way, that MatchLowercase is not always a panacea. In many cases, and depending on the fonts, it may be better to allow some contrast between families. Maybe it would be nice to add to the documentation or to worg (at least for users who may be interested in these topics) some basic recommendations for combining families (for example, combining a bodoni with a bembo is usually a catastrophic marriage :-). Best regards, Juan Manuel
Re: fontsets (was: [possible patch] Basic fontspec code for LuaLaTeX and XelaTeX (was "LaTeX export: when is it more useful..."))
Hi Juan, > When you talk about fontset, I understand that you mean lists of > families with their options that you have previously defined, is that > right? Yep, so in my config’s implementation I have an alist of fontset names and individual fonts. For something part of org-mode itself, we’d probably want to add a format level to this, something like: ┌ │ ((fontset-name . │ ((serif . │ ((pdflatex . "\\usepackage{myserif}") │ (lualatex . "etc.") │ (html . "and so on"))) │(sans ...) ... )) │ (another-fontset ...) ...) └ Actually, now that I think of it maybe it would be better to seperate out the fontsets and fots, e.g. ┌ │ ;; Fonts │ ((myfonta . ((pdflatex . "etc.") (lualatex ...) (html ...) ...)) │ (myfontb ...) │ ...) │ ;; Fontsets │ ((myfontset . │ ((sans . myfonta) │(serif . myfontb) │(mono . myfontc) │...)) │ ...) └ > In any case, I think it would also be nice if the user could add only > one family for roman, sans, mono or math, if he/she prefers it that way. > Something like: > > #+options: rmfont:Minion Pro Sure. There’s another bit of functionality in my config which I think is worth noting, you can add a -sans/-serif/-mono suffix to the fontset name to override the default body text font. All the best, Timothy