summaryrefslogtreecommitdiff
path: root/Documentation/sphinx/kerneldoc-preamble.sty
blob: 4e56ccea1dbd7723f80828a32069a5e327cf69b3 (plain)
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
% -*- coding: utf-8 -*-
% SPDX-License-Identifier: GPL-2.0
%
% LaTeX preamble for "make latexdocs" or "make pdfdocs" including:
%   - TOC width settings
%   - Setting of tabulary (\tymin)
%   - Headheight setting for fancyhdr
%   - Fontfamily settings for CJK (Chinese, Japanese, and Korean) translations
%
% Note on the suffix of .sty:
%   This is not implemented as a LaTeX style file, but as a file containing
%   plain LaTeX code to be included into preamble.
%   ".sty" is chosen because ".tex" would cause the build scripts to confuse
%   this file with a LaTeX main file.
%
% Copyright (C) 2022  Akira Yokosawa

% Custom width parameters for TOC --- Redefine low-level commands
% defined in report.cls
\makeatletter
%% Redefine \@pnumwidth (page number width)
\renewcommand*\@pnumwidth{2.7em}
%% Redefine \l@chapter (chapter list entry)
\renewcommand*\l@chapter[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \vskip 1.0em \@plus\p@
    \setlength\@tempdima{1.8em}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil
      \nobreak\hb@xt@\@pnumwidth{\hss #2%
                                 \kern-\p@\kern\p@}\par
      \penalty\@highpenalty
    \endgroup
  \fi}
%% Redefine \l@section and \l@subsection
\renewcommand*\l@section{\@dottedtocline{1}{1.8em}{3.2em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{5em}{4.3em}}
\makeatother
%% Sphinx < 1.8 doesn't have \sphinxtableofcontentshook
\providecommand{\sphinxtableofcontentshook}{}
%% Undefine it for compatibility with Sphinx 1.7.9
\renewcommand{\sphinxtableofcontentshook}{} % Empty the hook
% Prevent column squeezing of tabulary.
\setlength{\tymin}{20em}

% Adjust \headheight for fancyhdr
\addtolength{\headheight}{1.6pt}
\addtolength{\topmargin}{-1.6pt}

% Translations have Asian (CJK) characters which are only displayed if
% xeCJK is used
\IfFontExistsTF{Noto Sans CJK SC}{
    % This is needed for translations
    \usepackage{xeCJK}
    \IfFontExistsTF{Noto Serif CJK KR}{
	\setCJKmainfont{Noto Serif CJK KR}[AutoFakeSlant]
    }{
	\setCJKmainfont{Noto Sans CJK KR}[AutoFakeSlant]
    }
    \setCJKsansfont{Noto Sans CJK KR}[AutoFakeSlant]
    \setCJKmonofont{Noto Sans Mono CJK KR}[AutoFakeSlant]
    \xeCJKDeclareCharClass{HalfLeft}{`“,`‘}
    \xeCJKDeclareCharClass{HalfRight}{`”,`’}
    % CJK Language-specific font choices
    \IfFontExistsTF{Noto Serif CJK SC}{
	\newCJKfontfamily[SCmain]\scmain{Noto Serif CJK SC}[AutoFakeSlant]
	\newCJKfontfamily[SCserif]\scserif{Noto Serif CJK SC}[AutoFakeSlant]
    }{
	\newCJKfontfamily[SCmain]\scmain{Noto Sans CJK SC}[AutoFakeSlant]
	\newCJKfontfamily[SCserif]\scserif{Noto Sans CJK SC}[AutoFakeSlant]
    }
    \newCJKfontfamily[SCsans]\scsans{Noto Sans CJK SC}[AutoFakeSlant]
    \newCJKfontfamily[SCmono]\scmono{Noto Sans Mono CJK SC}[AutoFakeSlant]
    \IfFontExistsTF{Noto Serif CJK TC}{
	\newCJKfontfamily[TCmain]\tcmain{Noto Serif CJK TC}[AutoFakeSlant]
	\newCJKfontfamily[TCserif]\tcserif{Noto Serif CJK TC}[AutoFakeSlant]
    }{
	\newCJKfontfamily[TCmain]\tcmain{Noto Sans CJK TC}[AutoFakeSlant]
	\newCJKfontfamily[TCserif]\tcserif{Noto Sans CJK TC}[AutoFakeSlant]
    }
    \newCJKfontfamily[TCsans]\tcsans{Noto Sans CJK TC}[AutoFakeSlant]
    \newCJKfontfamily[TCmono]\tcmono{Noto Sans Mono CJK TC}[AutoFakeSlant]
    \IfFontExistsTF{Noto Serif CJK KR}{
	\newCJKfontfamily[KRmain]\krmain{Noto Serif CJK KR}[AutoFakeSlant]
	\newCJKfontfamily[KRserif]\krserif{Noto Serif CJK KR}[AutoFakeSlant]
    }{
	\newCJKfontfamily[KRmain]\krmain{Noto Sans CJK KR}[AutoFakeSlant]
	\newCJKfontfamily[KRserif]\krserif{Noto Sans CJK KR}[AutoFakeSlant]
    }
    \newCJKfontfamily[KRsans]\krsans{Noto Sans CJK KR}[AutoFakeSlant]
    \newCJKfontfamily[KRmono]\krmono{Noto Sans Mono CJK KR}[AutoFakeSlant]
    \IfFontExistsTF{Noto Serif CJK JP}{
	\newCJKfontfamily[JPmain]\jpmain{Noto Serif CJK JP}[AutoFakeSlant]
	\newCJKfontfamily[JPserif]\jpserif{Noto Serif CJK JP}[AutoFakeSlant]
    }{
	\newCJKfontfamily[JPmain]\jpmain{Noto Sans CJK JP}[AutoFakeSlant]
	\newCJKfontfamily[JPserif]\jpserif{Noto Sans CJK JP}[AutoFakeSlant]
    }
    \newCJKfontfamily[JPsans]\jpsans{Noto Sans CJK JP}[AutoFakeSlant]
    \newCJKfontfamily[JPmono]\jpmono{Noto Sans Mono CJK JP}[AutoFakeSlant]
    % Dummy commands for Sphinx < 2.3 (no 'extrapackages' support)
    \providecommand{\onehalfspacing}{}
    \providecommand{\singlespacing}{}
    % Define custom macros to on/off CJK
    \newcommand{\kerneldocCJKon}{\makexeCJKactive\onehalfspacing}
    \newcommand{\kerneldocCJKoff}{\makexeCJKinactive\singlespacing}
    \newcommand{\kerneldocBeginSC}{%
	\begingroup%
	\scmain%
	\xeCJKDeclareCharClass{FullLeft}{`“,`‘}%
	\xeCJKDeclareCharClass{FullRight}{`”,`’}%
	\renewcommand{\CJKrmdefault}{SCserif}%
	\renewcommand{\CJKsfdefault}{SCsans}%
	\renewcommand{\CJKttdefault}{SCmono}%
	\xeCJKsetup{CJKspace = false}%
	% For CJK ascii-art alignment
	\setmonofont{Noto Sans Mono CJK SC}[AutoFakeSlant]%
    }
    \newcommand{\kerneldocEndSC}{\endgroup}
    \newcommand{\kerneldocBeginTC}{%
	\begingroup%
	\tcmain%
	\xeCJKDeclareCharClass{FullLeft}{`“,`‘}%
	\xeCJKDeclareCharClass{FullRight}{`”,`’}%
	\renewcommand{\CJKrmdefault}{TCserif}%
	\renewcommand{\CJKsfdefault}{TCsans}%
	\renewcommand{\CJKttdefault}{TCmono}%
	\xeCJKsetup{CJKspace = false}%
	% For CJK ascii-art alignment
	\setmonofont{Noto Sans Mono CJK TC}[AutoFakeSlant]%
    }
    \newcommand{\kerneldocEndTC}{\endgroup}
    \newcommand{\kerneldocBeginKR}{%
	\begingroup%
	\krmain%
	\renewcommand{\CJKrmdefault}{KRserif}%
	\renewcommand{\CJKsfdefault}{KRsans}%
	\renewcommand{\CJKttdefault}{KRmono}%
	% \xeCJKsetup{CJKspace = true} % true by default
	% For CJK ascii-art alignment (still misaligned for Hangul)
	\setmonofont{Noto Sans Mono CJK KR}[AutoFakeSlant]%
    }
    \newcommand{\kerneldocEndKR}{\endgroup}
    \newcommand{\kerneldocBeginJP}{%
	\begingroup%
	\jpmain%
	\renewcommand{\CJKrmdefault}{JPserif}%
	\renewcommand{\CJKsfdefault}{JPsans}%
	\renewcommand{\CJKttdefault}{JPmono}%
	\xeCJKsetup{CJKspace = false}%
	% For CJK ascii-art alignment
	\setmonofont{Noto Sans Mono CJK JP}[AutoFakeSlant]%
    }
    \newcommand{\kerneldocEndJP}{\endgroup}
    % Single spacing in literal blocks
    \fvset{baselinestretch=1}
    % To customize \sphinxtableofcontents
    \usepackage{etoolbox}
    % Inactivate CJK after tableofcontents
    \apptocmd{\sphinxtableofcontents}{\kerneldocCJKoff}{}{}
    \xeCJKsetup{CJKspace = true} % For inter-phrase space of Korean TOC
}{ % No CJK font found
    % Custom macros to on/off CJK (Dummy)
    \newcommand{\kerneldocCJKon}{}
    \newcommand{\kerneldocCJKoff}{}
    \newcommand{\kerneldocBeginSC}[1]{%
	\begin{sphinxadmonition}{note}{Note:}
	    ``Noto Sans CJK'' fonts are not found while building this PDF\@.
	    Translations of zh\_CN, zh\_TW, ko\_KR, and ja\_JP are skipped.
	\end{sphinxadmonition}}
    \newcommand{\kerneldocEndSC}{}
    \newcommand{\kerneldocBeginTC}[1]{}
    \newcommand{\kerneldocEndTC}{}
    \newcommand{\kerneldocBeginKR}[1]{}
    \newcommand{\kerneldocEndKR}{}
    \newcommand{\kerneldocBeginJP}[1]{}
    \newcommand{\kerneldocEndJP}{}
}