/
harfbuzz.sty
92 lines (77 loc) · 2.5 KB
/
harfbuzz.sty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
\ProvidesPackage{harfbuzz}
\RequirePackage{luacode,luatexbase,kvoptions}
% use fontspec encoding for LuaLaTeX
% This may be needed
\newattribute\harfbuzzenabled
\harfbuzzenabled=1
\begin{luacode*}
require "hb_paths"
require "hb_lualoader"
luaharfbuzz = require "hb_shaper"
local fontloader = require "hb_fontload"
luatexbase.reset_callback("define_font")
luatexbase.add_to_callback("define_font",fontloader.loader, "font loader")
luatexbase.add_to_callback("pre_linebreak_filter",luaharfbuzz.process_nodes, "harfbuzz")
luatexbase.add_to_callback("hpack_filter",luaharfbuzz.process_nodes, "harfbuzz_hpack")
luatexbase.add_to_callback("vpack_filter",luaharfbuzz.process_nodes, "harfbuzz_vpack")
\end{luacode*}
\newcommand\startharfbuzz{%
%\begin{luacode*}
% \luaexec{
% luatexbase.add_to_callback("pre_linebreak_filter",luaharfbuzz.process_nodes, "harfbuzz")
% -- this fails
% luatexbase.add_to_callback("hpack_filter",luaharfbuzz.process_nodes, "harfbuzz_hpack")
% }
%\end{luacode*}%
\harfbuzzenabled=1
}
\newcommand\stopharfbuzz{%
%\begin{luacode*}
% \luaexec{%
% luatexbase.remove_from_callback("pre_linebreak_filter","harfbuzz")
% -- hbox processing sometimes fails
% luatexbase.remove_from_callback("hpack_filter","harfbuzz_hpack")
% }
%\end{luacode*}%
\harfbuzzenabled=0
}
\newcommand\SetFontOption[2]{%
\luaexec{%
% luaharfbuzz.options["\luatexluaescapestring{#1}"]="\luatexluaescapestrya"ing{#2}"
luaharfbuzz.set_font_option("\luatexluaescapestring{#1}", "\luatexluaescapestring{#2}")
luaharfbuzz.save_options(font.current())
}
}
% Simple font selection scheme
\RequirePackage[EU2]{fontenc}
\newcommand\HbDeclareShape[5]{%
\DeclareFontShape{EU2}{#1}{#2}{#3}%
{<-> "#4\if\relax\detokenize{#5}\relax\else:#5\fi"}{}%
}
\newcommand\HbDeclareFamily[3]{%
\DeclareFontFamily{EU2}{#3}{}
% \DeclareFontShape{EU2}{hbrm}{m}{n}{<-> "#2"}{}
\HbDeclareShape{#3}{m}{n}{#2}{#1}
\HbDeclareShape{#3}{m}{it}{#2/I}{#1}
\HbDeclareShape{#3}{bx}{n}{#2/B}{#1}
\HbDeclareShape{#3}{bx}{it}{#2/BI}{#1}
\HbDeclareShape{#3}{m}{sc}{#2}{#1+smcp}
}
\newcommand\MainFamily[2][]{%
\HbDeclareFamily{#1}{#2}{hbrm}
\renewcommand{\rmdefault}{hbrm}%
}
\newcommand\SansFamily[2][]{%
\HbDeclareFamily{#1}{#2}{hbsf}
\renewcommand{\sfdefault}{hbsf}
}
\newcommand\MonoFamily[2][]{%
\HbDeclareFamily{#1}{#2}{hbtt}
\renewcommand{\ttdefault}{hbtt}
}
\DeclareStringOption[0]{debug}[1]
\ProcessKeyvalOptions*
\luaexec{%
luaharfbuzz.loglevel = tonumber("\luaescapestring{\harfbuzz@debug}")
}
\endinput