A run of Unicode code points now needs one pair of carets, not one pair
each: ^9053 53EF 9053^ renders the characters adjacently, and a single
character inside such a run stands for itself. An invalid code point is
an error naming the position that wrote it, rather than an apology
rendered into the finished document; noncharacters are refused alongside
surrogates; and a code point that lands on a Klammertext special is safe
through the re-reads that assemble a document. The character tables now
produce the precomposed form, so a diacritic written as ^a" and one typed
directly are the same text to a search or a copy-paste.
"kdesc -u" describes how to write a Unicode character, with tables of
glyphs beside the codes that produce them. It is new and not yet
complete: it predates the sequence form and the typeface klammer below.
A typeface and a style are no longer both called "font". A typeface is a
family resolved by name; a style code is the one letter naming a type
style. So @document takes :serif_typeface and its siblings, a table takes
:style, captions take :caption_style and :caption_size, the uniform scale
is :text_scale, and the command is "kdesc --typeface". This renames
arguments a document may already use; an old name is a located error
rather than a silent omission.
@typeface sets a passage in another typeface for the length of that
passage:
@typeface Noto Sans Egyptian Hieroglyphs | ^132AA 133CF^ :scale 1.5 @
Writing the klammer is the whole declaration -- the document resolves the
typeface, embeds it in what it produces, and carries its license along.
Two typefaces for scripts no text font covers now ship with Klammertext:
Noto Sans Egyptian Hieroglyphs and Noto Sans Cuneiform. Every typeface in
the distribution now carries its license file.
(from dev 61e598698891)
149 lines
5.2 KiB
Plaintext
149 lines
5.2 KiB
Plaintext
# @@@state font_dirs.list :create Directories containing local fonts @@@
|
|
@@@state font_dirs :desc Directories containing local fonts @@@
|
|
|
|
|
|
@@@argtype style_code |
|
|
a style code: one letter naming a type style
|
|
:pattern r^|i^|b^|s^|t^|c
|
|
@@@
|
|
|
|
@@@argtype style_code_list |
|
|
a list of style codes. One or more of 'r' (roman), 'i' (italic),
|
|
'b' (bold), 's' (sans-serif), 't' (typewriter or monospace) or 'c'
|
|
(code) for each cell in a row. If there are fewer style codes than
|
|
cells in a row, the last code is repeated. Extra codes are
|
|
ignored.
|
|
:pattern ('style_code'^|\s)+
|
|
:python_cast (lambda s : s.split())
|
|
:default r
|
|
@@@
|
|
|
|
#[
|
|
@font was retired 2026-08-25 and replaced by @typeface. It switched the
|
|
main font PERMANENTLY (a bare \setmainfont, no group) for tex, and for
|
|
html and txt its body was "*fontname*" -- so it printed the NAME of the
|
|
font as document text instead of setting anything. @typeface is the
|
|
temporary, all-target replacement.
|
|
]#
|
|
|
|
@@typeface.k name | text :scale.float 1.0 :
|
|
A temporary change of typeface for *text*: the typeface *name* is
|
|
resolved in the Klammertext font store (the directories of
|
|
KLAMMERTEXT_FONTS, then the distribution's own), and the document
|
|
declares and localizes it automatically -- writing this klammer is the
|
|
only declaration needed. *scale* multiplies the surrounding text size,
|
|
which a script whose glyphs are drawn small usually wants.
|
|
|
|
The change ends with *text*: nothing after it is affected. Under the
|
|
txt target a typeface cannot be expressed at all, so *text* is emitted
|
|
unchanged.
|
|
@@
|
|
|
|
@@typeface.html,tex,txt :: @eval font.Typeface(K) @ @@
|
|
|
|
@@r.k text : Use the current Roman font for *text* @@
|
|
@@r.html :: <span class="plain">*text*</span> @@
|
|
@@r.tex :: \textrm{*text*} @@
|
|
@@r.txt :: *text* @@
|
|
|
|
@@b.k text : Use a bold weight of the current font for *text* @@
|
|
@@b.html :: <b>*text*</b> @@
|
|
@@b.tex :: \textbf{*text*} @@
|
|
@@b.txt :: **text** @@
|
|
|
|
@@i.k text : Use an italic style of the current font for *text* @@
|
|
@@i.html :: <i>*text*</i> @@
|
|
@@i.tex :: \emph{*text*} @@ # \begin{emph}{*text*}\end{emph} @@
|
|
@@i.txt :: '*text*' @@
|
|
|
|
@@t.k text : Use the currently defined monospace font for *text* @@
|
|
@@t.html :: <span class="tt">*text*</span> @@
|
|
@@t.tex :: \texttt{*text*} @@
|
|
@@t.txt :: *text* @@
|
|
|
|
@@s.k text : Use the currently defined sans-serif font for *text* @@
|
|
@@s.html :: <span class="text">*text*</span> @@
|
|
@@s.tex :: \textsf{*text*} @@
|
|
@@s.txt :: *text* @@
|
|
|
|
@@u.k text : Underline *text* in the current font @@
|
|
@@u.tex :: \underline{\botstrut{2pt}*text*} @@
|
|
|
|
@@ri.k text : Use a roman italic font for *text* (to override monospace environment) @@
|
|
@@ri.html :: <span class="ritalic">*text*</span> @@
|
|
@@ri.tex :: \textrm{\textit{*text*}} @@
|
|
@@ri.txt :: *text* @@
|
|
|
|
@@ts.k scale.float | text : Resize *text* by *scale* @@
|
|
# @@ts.tex :: {\scalefont{*scale*}\em *text*} @@
|
|
@@ts.tex :: \scalefont{*scale*}{*text*} @@
|
|
@@ts.html :: <span style="font-size: @eval *scale* * 100 @ #- %">*text*</span> @@
|
|
@@ts.txt :: *text* @@
|
|
|
|
@@leading.k n.float : Change LaTeX leading to *n*, multiple of the current line height @@
|
|
#@@leading.tex :: \renewcommand{\baselinestretch}{*n*} @@
|
|
@@leading.tex :: \setstretch{*n*} @@
|
|
|
|
@@default_font.k : Default font for documents @@
|
|
@@default_font.tex ::
|
|
# \setmainfont[Ligatures=TeX,Numbers=Lining]{Garamond Libre}
|
|
\setmainfont{Garamond Libre}
|
|
@@
|
|
|
|
#[
|
|
Before 2026-08-25 every one of these bodies substituted "*cjk*" while the
|
|
declaration named the parameter "text", so @cjk raised "Variable "cjk" not
|
|
defined" under EVERY target -- it had never worked. Rewritten on
|
|
@typeface, which is what it was reaching for.
|
|
|
|
The typeface it names is NOT part of the distribution (a usable Noto Sans
|
|
CJK is some 16-20 MB per weight, and Chinese line breaking needs more
|
|
than a typeface -- xeCJK for the tex path), so this klammer errors with
|
|
the list of available typefaces until one is installed with
|
|
"kdesc --typeface install". That is the honest behaviour: the klammer
|
|
states what it needs and the store reports what it has.
|
|
]#
|
|
@@cjk.k text : Set *text* in a typeface that supports CJK @@
|
|
@@cjk.html,tex,txt :: @typeface Noto Sans CJK SC | *text* @ @@
|
|
|
|
@@fraktur.k s : Set text *s* in Fraktur @@
|
|
@@fraktur.tex :: \textfrak{*s*} @@
|
|
|
|
@@euro.k f : The Euro symbol, followed by the amount *f* @@
|
|
@@euro.html :: &^#x20AC;*f* @@
|
|
@@euro.tex,txt :: €\,*f* @@
|
|
|
|
# TODO: This needs to use MathJax.
|
|
# @@math s :center.bool false : @i *s* @ @@
|
|
|
|
@@sub.k base | script : Subscript: @sub x 2 @ @@
|
|
@@sub.html,tex :: @eval font.Subsuper(K, "sub") eval@ @@
|
|
|
|
@@sup.k base | script : Superscript: @sup x 2 @ @@
|
|
@@sup.html,tex :: @eval font.Subsuper(K, "sup") eval@ @@
|
|
|
|
@@copyright.k : Copyright symbol: © @@
|
|
@@copyright.html :: © @@
|
|
@@copyright.tex :: {\copyright} @@
|
|
|
|
@@registered.k : Registered symbol: ® @@
|
|
@@registered.html :: <sup>®</sup> @@
|
|
@@registered.tex :: \textsuperscript{\textregistered} @@
|
|
|
|
@@trademark.k : Trademark symbol: ™ @@
|
|
@@trademark.html :: <sup>™</sup> @@
|
|
@@trademark.tex :: \texttrademark{} @@
|
|
|
|
@@pi.k : Greek letter pi @@
|
|
@@pi.html :: π @@
|
|
@@pi.tex :: $\pi$ @@
|
|
|
|
@@rightarrow.k : Right-pointing arrow: @rightarrow@ @@
|
|
@@rightarrow.html :: &^#8594; @@
|
|
@@rightarrow.tex :: $\rightarrow$ @@
|
|
|
|
@@dot.k : Vertically entered dot @@
|
|
@@dot.tex :: $\cdot$ @@
|
|
@@dot.html :: ^00B7^ @@
|
|
@@dot.txt :: ^00B7^ @@
|