summaryrefslogtreecommitdiff
path: root/fonts/junicodevf/lualatex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2024-01-03 03:03:02 +0000
committerNorbert Preining <norbert@preining.info>2024-01-03 03:03:02 +0000
commit92effab22b73c432933e7eb8e12c1cefda221df9 (patch)
treecdf3576ee645074d1df994e376d9ca2483c81ec5 /fonts/junicodevf/lualatex
parent6b10e9901a24325e837f0fdc2cbce8f43f18ccff (diff)
CTAN sync 202401030303
Diffstat (limited to 'fonts/junicodevf/lualatex')
-rw-r--r--fonts/junicodevf/lualatex/junicodevf.lua198
-rw-r--r--fonts/junicodevf/lualatex/junicodevf.sty393
2 files changed, 591 insertions, 0 deletions
diff --git a/fonts/junicodevf/lualatex/junicodevf.lua b/fonts/junicodevf/lualatex/junicodevf.lua
new file mode 100644
index 0000000000..7148668331
--- /dev/null
+++ b/fonts/junicodevf/lualatex/junicodevf.lua
@@ -0,0 +1,198 @@
+alt_styles = {
+ Reg = { 400, 100 }, -- Regular
+ Cond = { 400, 75 },
+ SmCond = { 400, 87.5 },
+ SmExp = { 400, 112.5 },
+ Exp = { 400, 125 },
+ Light = { 300, 100 }, -- Light
+ CondLight = { 300, 75 },
+ SmCondLight = { 300, 87.5 },
+ SmExpLight = { 300, 112.5 },
+ ExpLight = { 300, 125 },
+ Medium = { 500, 100 }, -- Medium
+ CondMedium = { 500, 75 },
+ SmCondMedium = { 500, 87.5 },
+ SmExpMedium = { 500, 112.5 },
+ ExpMedium = { 500, 125 },
+ Smbold = { 600, 100 }, -- Semibold
+ CondSmbold = { 600, 75 },
+ SmCondSmbold = { 600, 87.5 },
+ SmExpSmbold = { 600, 112.5 },
+ ExpSmbold = { 600, 125 },
+ Bold = { 700, 100 }, -- Bold
+ CondBold = { 700, 75 },
+ SmCondBold = { 700, 87.5 },
+ SmExpBold = { 700, 112.5 },
+ ExpBold = { 700, 125 }
+}
+
+
+-- 1: Regular, 2: Light, 3: Medium
+regular_weights = {
+ junicodevf_at_RwghtOne = { 490, 390, 590 },
+ junicodevf_at_RwghtTwo = { 440, 340, 540 },
+ junicodevf_at_RwghtThree = { 390, 290, 490 },
+ junicodevf_at_RwghtFour = { 370, 270, 470 },
+ junicodevf_at_RwghtFive = { 350, 250, 450 },
+ junicodevf_at_IwghtOne = { 525, 425, 625 },
+ junicodevf_at_IwghtTwo = { 475, 375, 575 },
+ junicodevf_at_IwghtThree = { 425, 325, 525 },
+ junicodevf_at_IwghtFour = { 370, 270, 470 },
+ junicodevf_at_IwghtFive = { 350, 250, 450 }
+}
+
+-- 1: Bold, 2: Semibold
+bold_weights = {
+ junicodevf_at_BwghtOne = { 790, 690 },
+ junicodevf_at_BwghtTwo = { 740, 640 },
+ junicodevf_at_BwghtThree = { 690, 590 },
+ junicodevf_at_BwghtFour = { 650, 550 },
+ junicodevf_at_BwghtFive = { 600, 500 },
+ junicodevf_at_BIwghtOne = { 800, 700 },
+ junicodevf_at_BIwghtTwo = { 775, 675 },
+ junicodevf_at_BIwghtThree = { 725, 625 },
+ junicodevf_at_BIwghtFour = { 675, 575 },
+ junicodevf_at_BIwghtFive = { 625, 525 }
+}
+
+ -- 1: regular, 2: condensed, 3: semicondensed, 4: semiexpanded, 5: expanded
+all_widths = {
+ junicodevf_at_RwdthOne = { 115, 95, 100, 125, 150 },
+ junicodevf_at_RwdthTwo = { 107.5, 85, 95, 120, 137.5 },
+ junicodevf_at_RwdthThree = { 100, 82.5, 90, 112.5, 125 },
+ junicodevf_at_RwdthFour = { 95, 75, 87.5, 107.5, 120 },
+ junicodevf_at_RwdthFive = { 90, 70, 77.5, 102.5, 115 },
+ junicodevf_at_IwdthOne = { 115, 95, 100, 125, 150 },
+ junicodevf_at_IwdthTwo = { 107.5, 85, 95, 120, 137.5 },
+ junicodevf_at_IwdthThree = { 100, 82.5, 90, 112.5, 125 },
+ junicodevf_at_IwdthFour = { 95, 75, 87.5, 107.5, 120 },
+ junicodevf_at_IwdthFive = { 90, 70, 77.5, 102.5, 115 },
+ junicodevf_at_BwdthOne = { 115, 95, 100, 125, 150 },
+ junicodevf_at_BwdthTwo = { 107.5, 85, 95, 120, 137.5 },
+ junicodevf_at_BwdthThree = { 100, 82.5, 90, 112.5, 125 },
+ junicodevf_at_BwdthFour = { 95, 75, 87.5, 107.5, 120 },
+ junicodevf_at_BwdthFive = { 90, 70, 77.5, 102.5, 115 },
+ junicodevf_at_BIwdthOne = { 115, 95, 100, 125, 150 },
+ junicodevf_at_BIwdthTwo = { 107.5, 85, 95, 120, 137.5 },
+ junicodevf_at_BIwdthThree = { 100, 82.5, 90, 112.5, 125 },
+ junicodevf_at_BIwdthFour = { 95, 75, 87.5, 107.5, 120 },
+ junicodevf_at_BIwdthFive = { 90, 70, 77.5, 102.5, 115 }
+}
+
+function adjustweight(weight, adjustment)
+ adjusted = weight + adjustment
+ if adjusted > 800 then adjusted = 800 end
+ if adjusted < 200 then adjusted = 200 end
+ return adjusted
+end
+
+function adjustwidth(width, adjustment)
+ adjusted = width + adjustment
+ if adjusted > 125 then adjusted = 125 end
+ if adjusted < 75 then adjusted = 75 end
+ return adjusted
+end
+
+ function mkaltcommands()
+ for k, v in pairs(alt_styles) do
+ romdef = k .. "Def"
+ romsizedef = k .. "SizeDef"
+ italsizedef = k .. "ItalicSizeDef"
+ romfeat = k .. "Features"
+ romsizefeat = k .. "SizeFeatures"
+ italsizefeat = k .. "ItalicSizeFeatures"
+ if k == "Reg" then
+ romdef = "RegDef"
+ italsizedef = "ItalicSizeDef"
+ romfeat = "RegularFeatures"
+ romsizefeat = "RegularSizeFeatures"
+ italsizefeat = "ItalicSizeFeatures"
+ end
+ tex.print("\\newcommand{\\" .. romdef .. "}{}")
+ tex.print("\\newcommand{\\" .. romsizedef .. "}{SizeFeatures={{Size={5-}, RawFeature={axis={wght=" ..
+ v[1] .. ",wdth=" .. v[2] .. "}}}}}")
+ tex.print("\\DeclareOptionX{" .. romfeat .. "}{\\renewcommand*{\\" .. romdef .. "}{#1,}}")
+ tex.print("\\DeclareOptionX{" .. romsizefeat .. "}{\\renewcommand*{\\" .. romsizedef .. "}{\\directlua{mksizecommand({#1})}}}")
+ tex.print("\\DeclareOptionX{" .. italsizefeat .. "}{\\renewcommand*{\\" .. romsizedef .. "}{\\directlua{mksizecommand({#1})}}}")
+ end
+end
+
+function mkregweightcommands(wtidx,adjustment)
+ for k, wt in pairs(regular_weights) do
+ cmd, n = string.gsub(k, "_at_", "@")
+ tex.print("\\newcommand*{\\" .. cmd .. "}{" .. adjustweight(wt[wtidx],adjustment) .. "}")
+ end
+end
+
+function mkboldweightcommands(wtidx,adjustment)
+ for k, wt in pairs(bold_weights) do
+ cmd, n = string.gsub(k, "_at_", "@")
+ tex.print("\\newcommand*{\\" .. cmd .. "}{" .. adjustweight(wt[wtidx],adjustment) .. "}")
+ end
+end
+
+function mkwidthcommands(wdidx, adjustment)
+ for k, wd in pairs(all_widths) do
+ cmd, n = string.gsub(k, "_at_", "@")
+ tex.print("\\newcommand*{\\" .. cmd .. "}{" .. adjustwidth(wd[wdidx],adjustment) .. "}")
+ end
+end
+
+function mkfontcommands()
+ for k, v in pairs(alt_styles) do
+ defcmd = k .. "Def"
+ defsizecmd = k .. "SizeDef"
+ romfontcmd = "j" .. k
+ italfontcmd = "j" .. k .. "Italic"
+ if k == "Reg" then
+ romfontcmd = "jRegular"
+ italfontcmd = "jItalic"
+ end
+ tex.print("\\junicodevf@newfont{\\" .. romfontcmd .. "}{JunicodeVF}{\\" .. defcmd .. "}{\\" .. defsizecmd .. "}")
+ tex.print("\\junicodevf@newfont{\\" .. italfontcmd .. "}{JunicodeVF-Italic}{\\" .. defcmd .. "}{\\" .. defsizecmd .. "}")
+ end
+end
+
+function mksizecommand(sizetable)
+ result = "Nothing yet"
+ if #sizetable > 0 then
+ result = "SizeFeatures={"
+ lastsize = 0
+ for i, v in ipairs(sizetable) do
+ if v["size"] then
+ axiscount = 0
+ sizeitem = "{Size={"
+ currentsize = v["size"]
+ csnum = v["size"]
+ if i == #sizetable then
+ currentsize = currentsize .. "-"
+ elseif lastsize == 0 then
+ currentsize = "-" .. currentsize
+ else
+ currentsize = lastsize .. "-" .. currentsize
+ end
+ lastsize = csnum
+ sizeitem = sizeitem .. currentsize .. "},RawFeature={axis={"
+ if v["wght"] then
+ sizeitem = sizeitem .. "wght=" .. v["wght"]
+ axiscount = axiscount + 1
+ end
+ if v["wdth"] then
+ if axiscount >= 1 then sizeitem = sizeitem .. "," end
+ sizeitem = sizeitem .. "wdth=" .. v["wdth"]
+ axiscount = axiscount + 1
+ end
+ if v["ENLA"] then
+ if axiscount >= 1 then sizeitem = sizeitem .. "," end
+ sizeitem = sizeitem .. "ENLA=" .. v["ENLA"]
+ end
+ sizeitem = sizeitem .. "}}},"
+ result = result .. sizeitem
+ end
+ end
+ result = result .. "}"
+ tex.print(result)
+ end
+end
+
+
diff --git a/fonts/junicodevf/lualatex/junicodevf.sty b/fonts/junicodevf/lualatex/junicodevf.sty
new file mode 100644
index 0000000000..c01ccafa57
--- /dev/null
+++ b/fonts/junicodevf/lualatex/junicodevf.sty
@@ -0,0 +1,393 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{junicodevf}[%
+ 2023/12/19 (Peter Baker) Supports Junicode VF (2.204 and up) variable fonts for LuaLaTeX.]
+
+\RequirePackage{ifluatex,xkeyval,fontspec}
+
+\RequireLuaTeX
+
+% OPTIONS FOR WEIGHT AND WIDTH
+
+\def\junicodevf@regweight{1}
+\DeclareOptionX{light}{\def\junicodevf@regweight{2}}
+\DeclareOptionX{medium}{\def\junicodevf@regweight{3}}
+
+\def\junicodevf@boldweight{1}
+\DeclareOptionX{semibold}{\def\junicodevf@boldweight{2}}
+
+\def\junicodevf@width{1}
+\DeclareOptionX{condensed}{\def\junicodevf@width{2}}
+\DeclareOptionX{semicondensed}{\def\junicodevf@width{3}}
+\DeclareOptionX{semiexpanded}{\def\junicodevf@width{4}}
+\DeclareOptionX{expanded}{\def\junicodevf@width{5}}
+
+\def\wghtadjust{0}
+\DeclareOptionX{weightadjustment}{\def\wghtadjust{#1}}
+
+\def\wdthadjust{0}
+\DeclareOptionX{widthadjustment}{\def\wdthadjust{#1}}
+
+% FIGURES (default is OldStyle Proportional)
+
+\newif\ifjunicodevf@lining \junicodevf@liningfalse
+\newif\ifjunicodevf@tabular \junicodevf@tabularfalse
+
+\DeclareOptionX{lining}{\junicodevf@liningtrue}
+\DeclareOptionX{tabular}{\junicodevf@tabulartrue}
+\DeclareOptionX{proportional}{\junicodevf@tabularfalse}
+\DeclareOptionX{oldstyle}{\junicodevf@liningfalse}
+
+% COMMANDS FOR ADDING FEATURES TO MAIN TEXT
+
+%\directlua{dofile("junicodevf.lua")}
+\directlua{dofile(kpse.find_file("junicodevf.lua"))}
+
+% Features for all four Main faces
+
+\newcommand*{\MainDef}{}
+
+% Features for each of the four Main faces.
+
+\newcommand*{\MainRegDef}{}
+\newcommand*{\MainItalicDef}{}
+\newcommand*{\MainBoldDef}{}
+\newcommand*{\MainBoldItalicDef}{}
+
+\DeclareOptionX{MainFeatures}{\renewcommand*{\MainDef}{#1,}}
+\DeclareOptionX{MainRegularFeatures}{\renewcommand*{\MainRegDef}{#1,}}
+\DeclareOptionX{MainItalicFeatures}{\renewcommand*{\MainItalicDef}{#1,}}
+\DeclareOptionX{MainBoldFeatures}{\renewcommand*{\MainBoldDef}{#1,}}
+\DeclareOptionX{MainBoldItalicFeatures}{\renewcommand*{\MainBoldItalicDef}{#1,}}
+
+\DeclareOptionX{MainRegularSizeFeatures}{\newcommand*{\MainRegSizeDef}{\directlua{mksizecommand({#1})}}}
+\DeclareOptionX{MainItalicSizeFeatures}{\newcommand*{\MainItalicSizeDef}{\directlua{mksizecommand({#1})}}}
+\DeclareOptionX{MainBoldSizeFeatures}{\newcommand*{\MainBoldSizeDef}{\directlua{mksizecommand({#1})}}}
+\DeclareOptionX{MainBoldItalicSizeFeatures}{\newcommand*{\MainBoldItalicSizeDef}{\directlua{mksizecommand({#1})}}}
+
+% SUPPORT FOR ENLA AXIS
+
+\newcommand*{\ENLAOneSizeDef}{SizeFeatures={{Size={5-}, RawFeature={axis={wght=400,wdth=100,ENLA=32}}}}}
+\newcommand*{\ENLATwoSizeDef}{SizeFeatures={{Size={5-}, RawFeature={axis={wght=400,wdth=100,ENLA=47}}}}}
+\newcommand*{\ENLAThreeSizeDef}{SizeFeatures={{Size={5-}, RawFeature={axis={wght=400,wdth=100,ENLA=75}}}}}
+\newcommand*{\ENLAFourSizeDef}{SizeFeatures={{Size={5-}, RawFeature={axis={wght=400,wdth=100,ENLA=100}}}}}
+
+\DeclareOptionX{ENLAOneSizeFeatures}{\renewcommand*{\ENLAOneSizeDef}{\directlua{mksizecommand({#1})}}}
+\DeclareOptionX{ENLATwoSizeFeatures}{\renewcommand*{\ENLATwoSizeDef}{\directlua{mksizecommand({#1})}}}
+\DeclareOptionX{ENLAThreeSizeFeatures}{\renewcommand*{\ENLAThreeSizeDef}{\directlua{mksizecommand({#1})}}}
+\DeclareOptionX{ENLAFourSizeFeatures}{\renewcommand*{\ENLAFourSizeDef}{\directlua{mksizecommand({#1})}}}
+
+% Declare the options for each of the Alternate Styles.
+
+\directlua{mkaltcommands()}
+
+% Declare an option that will catch anything undefined and issue a warning.
+% Then process the options.
+
+\DeclareOptionX*{\PackageWarning{JunicodeVF}{Unknown option `\CurrentOption' ignored}}
+\ProcessOptionsX\relax
+
+% DEFINE THE WEIGHTS AND WIDTHS (depending on weight and width options)
+
+\def\mkregweightcommands#1#2{%
+\directlua{wtindex = #1
+adjustment = #2
+mkregweightcommands(wtindex, adjustment)}}
+
+\def\mkboldweightcommands#1#2{%
+\directlua{wtindex = #1
+adjustment = #2
+mkboldweightcommands(wtindex, adjustment)}}
+
+\def\mkwidthcommands#1#2{%
+\directlua{wdindex = #1
+adjustment = #2
+mkwidthcommands(wdindex, adjustment)}}
+
+\mkregweightcommands{\junicodevf@regweight}{\wghtadjust}
+
+\mkboldweightcommands{\junicodevf@boldweight}{\wghtadjust}
+
+\mkwidthcommands{\junicodevf@width}{\wdthadjust}
+
+% DEFINE SizeFeatures (if we don't already have them)
+
+\@ifundefined{MainRegSizeDef}{
+ \newcommand*{\MainRegSizeDef}{%
+ SizeFeatures={
+ {Size={-8.5}, RawFeature={axis={wght=\junicodevf@RwghtOne,wdth=\junicodevf@RwdthOne}}},
+ {Size={8.5-10.99}, RawFeature={axis={wght=\junicodevf@RwghtTwo,wdth=\junicodevf@RwdthTwo}}},
+ {Size={10.99-17.99}, RawFeature={axis={wght=\junicodevf@RwghtThree,wdth=\junicodevf@RwdthThree}}},
+ {Size={17.99-23.99}, RawFeature={axis={wght=\junicodevf@RwghtFour,wdth=\junicodevf@RwdthFour}}},
+ {Size={23.99-}, RawFeature={axis={wght=\junicodevf@RwghtFive,wdth=\junicodevf@RwdthFive}}}
+ }
+ }
+}{}
+
+\@ifundefined{MainItalicSizeDef}{
+ \newcommand*{\MainItalicSizeDef}{%
+ SizeFeatures={
+ {Size={-8.5}, RawFeature={axis={wght=\junicodevf@IwghtOne,wdth=\junicodevf@IwdthOne}}},
+ {Size={8.5-10.99}, RawFeature={axis={wght=\junicodevf@IwghtTwo,wdth=\junicodevf@IwdthTwo}}},
+ {Size={10.99-17.99}, RawFeature={axis={wght=\junicodevf@IwghtThree,wdth=\junicodevf@IwdthThree}}},
+ {Size={17.99-23.99}, RawFeature={axis={wght=\junicodevf@IwghtFour,wdth=\junicodevf@IwdthFour}}},
+ {Size={23.99-}, RawFeature={axis={wght=\junicodevf@IwghtFive,wdth=\junicodevf@IwdthFive}}}
+ }
+ }
+}{}
+
+\@ifundefined{MainBoldSizeDef}{
+ \newcommand*{\MainBoldSizeDef}{%
+ SizeFeatures={
+ {Size={-8.5}, RawFeature={axis={wght=\junicodevf@BwghtOne,wdth=\junicodevf@BwdthOne}}},
+ {Size={8.5-10.99}, RawFeature={axis={wght=\junicodevf@BwghtTwo,wdth=\junicodevf@BwdthTwo}}},
+ {Size={10.99-17.99}, RawFeature={axis={wght=\junicodevf@BwghtThree,wdth=\junicodevf@BwdthThree}}},
+ {Size={17.99-23.99}, RawFeature={axis={wght=\junicodevf@BwghtFour,wdth=\junicodevf@BwdthFour}}},
+ {Size={23.99-}, RawFeature={axis={wght=\junicodevf@BwghtFive,wdth=\junicodevf@BwdthFive}}}
+ }
+ }
+}{}
+
+\@ifundefined{MainBoldItalicSizeDef}{
+ \newcommand*{\MainBoldItalicSizeDef}{%
+ SizeFeatures={
+ {Size={-8.5}, RawFeature={axis={wght=\junicodevf@BIwghtOne,wdth=\junicodevf@BIwdthOne}}},
+ {Size={8.5-10.99}, RawFeature={axis={wght=\junicodevf@BIwghtTwo,wdth=\junicodevf@BIwdthTwo}}},
+ {Size={10.99-17.99}, RawFeature={axis={wght=\junicodevf@BIwghtThree,wdth=\junicodevf@BIwdthThree}}},
+ {Size={17.99-23.99}, RawFeature={axis={wght=\junicodevf@BIwghtFour,wdth=\junicodevf@BIwdthFour}}},
+ {Size={23.99-}, RawFeature={axis={wght=\junicodevf@BIwghtFive,wdth=\junicodevf@BIwdthFive}}}
+ }
+ }
+}{}
+
+% NUMBER STRINGS for fontspec.
+
+\def\junicodevf@figurestyle{Lowercase}
+\ifjunicodevf@lining\def\junicodevf@figurestyle{Uppercase}\fi
+\def\junicodevf@figurealign{Proportional}
+\ifjunicodevf@tabular\def\junicodevf@figurealign{Monospaced}\fi
+
+% DECLARE THE FONTS
+
+\setmainfont{Junicode VF}[
+ ItalicFont = {*-Italic},
+ BoldFont = {*},
+ BoldItalicFont = {*-Italic},
+ Renderer = HarfBuzz,
+ Numbers = {\junicodevf@figurealign,\junicodevf@figurestyle},
+ \MainDef,
+ UprightFeatures = {\MainRegDef
+ \MainRegSizeDef},
+ BoldFeatures = {\MainBoldDef
+ \MainBoldSizeDef},
+ ItalicFeatures = {\MainItalicDef
+ \MainItalicSizeDef},
+ BoldItalicFeatures = {\MainBoldItalicDef
+ \MainBoldItalicSizeDef}
+]
+
+\newcommand*{\junicodevf@newfont}[4]{
+ \setfontface#1{#2}[
+ Renderer = HarfBuzz,
+ Numbers = {\junicodevf@figurealign,\junicodevf@figurestyle},
+ SmallCapsFont = {*},
+ SmallCapsFeatures = {Letters=SmallCaps},
+ #3
+ #4
+ ]
+}
+
+\directlua{mkfontcommands()}
+
+% ENLARGED FACES
+
+\setfontface\EnlargedOne{JunicodeVF}[
+ Renderer = HarfBuzz,
+ \ENLAOneSizeDef
+]
+
+\setfontface\EnlargedOneItalic{JunicodeVF-Italic}[
+ Renderer = HarfBuzz,
+ \ENLAOneSizeDef
+]
+
+\setfontface\EnlargedTwo{JunicodeVF}[
+ Renderer = HarfBuzz,
+ \ENLATwoSizeDef
+]
+
+\setfontface\EnlargedTwoItalic{JunicodeVF-Italic}[
+ Renderer = HarfBuzz,
+ \ENLATwoSizeDef
+]
+
+\setfontface\EnlargedThree{JunicodeVF}[
+ Renderer = HarfBuzz,
+ \ENLAThreeSizeDef
+]
+
+\setfontface\EnlargedThreeItalic{JunicodeVF-Italic}[
+ Renderer = HarfBuzz,
+ \ENLAThreeSizeDef
+]
+
+\setfontface\EnlargedFour{JunicodeVF}[
+ Renderer = HarfBuzz,
+ \ENLAFourSizeDef
+]
+
+\setfontface\EnlargedFourItalic{JunicodeVF-Italic}[
+ Renderer = HarfBuzz,
+ \ENLAFourSizeDef
+]
+
+% Convenience commands for non-verbose access to the cvNN features.
+% See also the "jcv" mnemonics below.
+
+\newcommand*{\textcv}[3][0]{{\addfontfeature{CharacterVariant=#2:#1}#3}}
+\newcommand*{\jcv}[2][0]{\addfontfeature{CharacterVariant=#2:#1}}
+
+% Convenience commands for accessing the Stylistic Sets. These are
+% intended to be mnemonic.
+
+\newcommand*{\AltThornEth}{\addfontfeature{StylisticSet=1}} % ss01
+\newcommand*{\textAltThornEth}[1]{{\addfontfeature{StylisticSet=1}#1}}
+\newcommand*{\InsularLetterForms}{\addfontfeature{StylisticSet=2}} % ss02
+\newcommand*{\textInsularLetterForms}[1]{{\addfontfeature{StylisticSet=2}#1}}
+\newcommand*{\IPAAlternates}{\addfontfeature{StylisticSet=3}} % ss03
+\newcommand*{\textIPAAlternates}[1]{{\addfontfeature{StylisticSet=3}#1}}
+\newcommand*{\HighOverline}{\addfontfeature{StylisticSet=4}} % ss04
+\newcommand*{\textHighOverline}[1]{{\addfontfeature{StylisticSet=4}#1}}
+\newcommand*{\MediumHighOverline}{\addfontfeature{StylisticSet=5}} % ss05
+\newcommand*{\textMediumHighOverline}[1]{{\addfontfeature{StylisticSet=5}#1}}
+\newcommand*{\EnlargedMinuscules}{\addfontfeature{StylisticSet=6}} % ss06
+\newcommand*{\textEnlargedMinuscules}[1]{\addfontfeature{{StylisticSet=6}#1}}
+\newcommand*{\Underdotted}{\addfontfeature{StylisticSet=7}} % ss07
+\newcommand*{\textUnderdotted}[1]{{\addfontfeature{StylisticSet=7}#1}}
+\newcommand*{\ContextualLongS}{\addfontfeature{StylisticSet=8}} % ss08
+\newcommand*{\textContextualLongS}[1]{{\addfontfeature{StylisticSet=8}#1}}
+\newcommand*{\AlternateFigures}{\addfontfeature{StylisticSet=9}} % ss09
+\newcommand*{\textAlternateFigures}[1]{{\addfontfeature{StylisticSet=9}#1}}
+\newcommand*{\EntitiesAndTags}{\addfontfeature{StylisticSet=10}} % ss10
+\newcommand*{\textEntitiesAndTags}[1]{{\addfontfeature{StylisticSet=10}#1}}
+% \newcommand*{\}{} % ss11 not yet used
+\newcommand*{\EarlyEnglishFuthorc}{\addfontfeature{StylisticSet=12}} % ss12
+\newcommand*{\textEarlyEnglishFuthorc}[1]{{\addfontfeature{StylisticSet=12}#1}}
+\newcommand*{\ElderFuthark}{\addfontfeature{StylisticSet=13}} % ss13
+\newcommand*{\textElderFuthark}[1]{{\addfontfeature{StylisticSet=13}#1}}
+\newcommand*{\YoungerFuthark}{\addfontfeature{StylisticSet=14}} % ss14
+\newcommand*{\textYoungerFuthark}[1]{{\addfontfeature{StylisticSet=14}#1}}
+\newcommand*{\LongBranchToShortTwig}{\addfontfeature{StylisticSet=15}} % ss15
+\newcommand*{\textLongBranchToShortTwig}[1]{{\addfontfeature{StylisticSet=15}#1}}
+\newcommand*{\ContextualRRotunda}{\addfontfeature{StylisticSet=16}} % ss16
+\newcommand*{\textContextualRRotunda}[1]{{\addfontfeature{StylisticSet=16}#1}}
+\newcommand*{\RareDigraphs}{\addfontfeature{StylisticSet=17}} % ss17
+\newcommand*{\textRareDigraphs}[1]{{\addfontfeature{StylisticSet=17}#1}}
+\newcommand*{\OldStylePunctuation}{\addfontfeature{StylisticSet=18}} % ss18
+\newcommand*{\textOldStylePunctuation}[1]{{\addfontfeature{StylisticSet=18}#1}}
+\newcommand*{\LatinToGothic}{\addfontfeature{StylisticSet=19}} % ss19
+\newcommand*{\textLatinToGothic}[1]{{\addfontfeature{StylisticSet=19}#1}}
+\newcommand*{\LowDiacritics}{\addfontfeature{StylisticSet=20}} % ss20
+\newcommand*{\textLowDiacritics}[1]{{\addfontfeature{StylisticSet=20}#1}}
+
+% Tiny macros for providing mnemonic access to the cvNN features.
+
+\def\jcvA{1}
+\def\jcva{2}
+\def\jcvB{3}
+\def\jcvb{4}
+\def\jcvC{5}
+\def\jcvc{6}
+\def\jcvD{7}
+\def\jcvd{8}
+\def\jcvE{9}
+\def\jcve{10}
+\def\jcvF{11}
+\def\jcvf{12}
+\def\jcvG{13}
+\def\jcvg{14}
+\def\jcvH{15}
+\def\jcvh{16}
+\def\jcvI{17}
+\def\jcvi{18}
+\def\jcvJ{19}
+\def\jcvj{20}
+\def\jcvK{21}
+\def\jcvk{22}
+\def\jcvL{23}
+\def\jcvl{24}
+\def\jcvM{25}
+\def\jcvm{26}
+\def\jcvN{27}
+\def\jcvn{28}
+\def\jcvO{29}
+\def\jcvo{30}
+\def\jcvP{31}
+\def\jcvp{32}
+\def\jcvQ{33}
+\def\jcvq{34}
+\def\jcvR{35}
+\def\jcvr{36}
+\def\jcvS{37}
+\def\jcvs{38}
+\def\jcvT{39}
+\def\jcvt{40}
+\def\jcvU{41}
+\def\jcvu{42}
+\def\jcvV{43}
+\def\jcvv{44}
+\def\jcvW{45}
+\def\jcvw{46}
+\def\jcvX{47}
+\def\jcvx{48}
+\def\jcvY{49}
+\def\jcvy{50}
+\def\jcvZ{51}
+\def\jcvz{52}
+\def\jcvAogonek{53}
+\def\jcvaogonek{54}
+\def\jcvaa{55}
+\def\jcvAE{56}
+\def\jcvae{57}
+\def\jcvAO{58}
+\def\jcvao{59}
+\def\jcvav{60}
+\def\jcvdbar{61}
+\def\jcvdcroat{61}
+\def\jcvEogonek{62}
+\def\jcvYogh{63}
+\def\jcvlhighstroke{64} %somehow escaped the documentation
+\def\jcvoPolish{65}
+\def\jcvthorncrossed{66}
+\def\jcvspacingzigzag{67}
+\def\jcvglottal{68}
+\def\jcvTironianEt{69}
+\def\jcvperiod{70}
+\def\jcvmiddot{71}
+\def\jcvcomma{72}
+\def\jcvsemicolon{73}
+\def\jcvpunctuselevatus{74}
+\def\jcvexclam{75}
+\def\jcvquestion{76}
+\def\jcvASCIItilde{77}
+\def\jcvasterisk{78}
+\def\jcvslash{79}
+\def\jcvrum{80}
+\def\jcvcombiningzigzag{81}
+\def\jcvspacingusabbrev{82}
+\def\jcvetabbrev{83}
+\def\jcvmacron{84}
+\def\jcvcombiningopena{85}
+\def\jcvcombininginsulard{86}
+\def\jcvcombiningrrotunda{87}
+\def\jcvcombiningdieresis{88}
+\def\jcvcombiningoverline{89}
+\def\jcvHcombiningdoublemacron{90}
+\def\jcvEng{91}
+\def\jcvbrevebelow{92}
+\def\jcvcurrency{93}
+\def\jcvlb{94}
+\def\jcvsterling{95}
+\def\jcvGermanpenny{96}
+\def\jcvflorin{97}
+\def\jcvounce{98}
+%\def\notyetused{99}