235 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
		
			9.4 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| % -*- 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.
 | ||
| %  - Indent of 2 chars is preserved for ease of comparison.
 | ||
| % Summary of changes from default params:
 | ||
| %   Width of page number (\@pnumwidth): 1.55em -> 2.7em
 | ||
| %   Width of chapter number:            1.5em  -> 2.4em
 | ||
| %   Indent of section number:           1.5em  -> 2.4em
 | ||
| %   Width of section number:            2.6em  -> 3.2em
 | ||
| %   Indent of subsection number:        4.1em  -> 5.6em
 | ||
| %   Width of subsection number:         3.5em  -> 4.3em
 | ||
| %
 | ||
| % These params can have 4 digit page counts, 3 digit chapter counts,
 | ||
| % section counts of 4 digits + 1 period (e.g., 18.10), and subsection counts
 | ||
| % of 5 digits + 2 periods (e.g., 18.7.13).
 | ||
| \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{2.4em}%
 | ||
|     \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}{2.4em}{3.2em}}
 | ||
| \renewcommand*\l@subsection{\@dottedtocline{2}{5.6em}{4.3em}}
 | ||
| \makeatother
 | ||
| %% Prevent default \sphinxtableofcontentshook from overwriting above tweaks.
 | ||
| \renewcommand{\sphinxtableofcontentshook}{} % Empty the hook
 | ||
| 
 | ||
| % Prevent column squeezing of tabulary.  \tymin is set by Sphinx as:
 | ||
| %   \setlength{\tymin}{3\fontcharwd\font`0 }
 | ||
| % , which is too short.
 | ||
| \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
 | ||
| \usepackage{ifthen}
 | ||
| \newboolean{enablecjk}
 | ||
| \setboolean{enablecjk}{false}
 | ||
| \IfFontExistsTF{Noto Sans CJK SC}{
 | ||
|     \IfFileExists{xeCJK.sty}{
 | ||
| 	\setboolean{enablecjk}{true}
 | ||
|     }{}
 | ||
| }{}
 | ||
| \ifthenelse{\boolean{enablecjk}}{
 | ||
|     % Load xeCJK when both the Noto Sans CJK font and xeCJK.sty are available.
 | ||
|     \usepackage{xeCJK}
 | ||
|     % Noto CJK fonts don't provide slant shape. [AutoFakeSlant] permits
 | ||
|     % its emulation.
 | ||
|     % Select KR variant at the beginning of each document so that quotation
 | ||
|     % and apostorph symbols of half-width is used in TOC of Latin documents.
 | ||
|     \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]
 | ||
|     % Teach xeCJK of half-width symbols
 | ||
|     \xeCJKDeclareCharClass{HalfLeft}{`“,`‘}
 | ||
|     \xeCJKDeclareCharClass{HalfRight}{`”,`’}
 | ||
|     % CJK Language-specific font choices
 | ||
|     %% for Simplified Chinese
 | ||
|     \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]
 | ||
|     %% for Traditional Chinese
 | ||
|     \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]
 | ||
|     %% for Korean
 | ||
|     \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]
 | ||
|     %% for Japanese
 | ||
|     \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]
 | ||
|     % Define custom macros to on/off CJK
 | ||
|     %% One and half spacing for CJK contents
 | ||
|     \newcommand{\kerneldocCJKon}{\makexeCJKactive\onehalfspacing}
 | ||
|     \newcommand{\kerneldocCJKoff}{\makexeCJKinactive\singlespacing}
 | ||
|     % Define custom macros for switching CJK font setting
 | ||
|     %% for Simplified Chinese
 | ||
|     \newcommand{\kerneldocBeginSC}{%
 | ||
| 	\begingroup%
 | ||
| 	\scmain%
 | ||
| 	\xeCJKDeclareCharClass{FullLeft}{`“,`‘}% Full-width in SC
 | ||
| 	\xeCJKDeclareCharClass{FullRight}{`”,`’}% Full-width in SC
 | ||
| 	\renewcommand{\CJKrmdefault}{SCserif}%
 | ||
| 	\renewcommand{\CJKsfdefault}{SCsans}%
 | ||
| 	\renewcommand{\CJKttdefault}{SCmono}%
 | ||
| 	\xeCJKsetup{CJKspace = false}% gobble white spaces by ' '
 | ||
| 	% For CJK ascii-art alignment
 | ||
| 	\setmonofont{Noto Sans Mono CJK SC}[AutoFakeSlant]%
 | ||
|     }
 | ||
|     \newcommand{\kerneldocEndSC}{\endgroup}
 | ||
|     %% for Traditional Chinese
 | ||
|     \newcommand{\kerneldocBeginTC}{%
 | ||
| 	\begingroup%
 | ||
| 	\tcmain%
 | ||
| 	\xeCJKDeclareCharClass{FullLeft}{`“,`‘}% Full-width in TC
 | ||
| 	\xeCJKDeclareCharClass{FullRight}{`”,`’}% Full-width in TC
 | ||
| 	\renewcommand{\CJKrmdefault}{TCserif}%
 | ||
| 	\renewcommand{\CJKsfdefault}{TCsans}%
 | ||
| 	\renewcommand{\CJKttdefault}{TCmono}%
 | ||
| 	\xeCJKsetup{CJKspace = false}% gobble white spaces by ' '
 | ||
| 	% For CJK ascii-art alignment
 | ||
| 	\setmonofont{Noto Sans Mono CJK TC}[AutoFakeSlant]%
 | ||
|     }
 | ||
|     \newcommand{\kerneldocEndTC}{\endgroup}
 | ||
|     %% for Korean
 | ||
|     \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}
 | ||
|     %% for Japanese
 | ||
|     \newcommand{\kerneldocBeginJP}{%
 | ||
| 	\begingroup%
 | ||
| 	\jpmain%
 | ||
| 	\renewcommand{\CJKrmdefault}{JPserif}%
 | ||
| 	\renewcommand{\CJKsfdefault}{JPsans}%
 | ||
| 	\renewcommand{\CJKttdefault}{JPmono}%
 | ||
| 	\xeCJKsetup{CJKspace = false}% gobble white space by ' '
 | ||
| 	% 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
 | ||
|     % Suppress extra white space at latin .. non-latin in literal blocks
 | ||
|     \AtBeginEnvironment{sphinxVerbatim}{\CJKsetecglue{}}
 | ||
| }{ % Don't enable CJK
 | ||
|     % Custom macros to on/off CJK and switch CJK fonts (Dummy)
 | ||
|     \newcommand{\kerneldocCJKon}{}
 | ||
|     \newcommand{\kerneldocCJKoff}{}
 | ||
|     %% By defining \kerneldocBegin(SC|TC|KR|JP) as commands with an argument
 | ||
|     %% and ignore the argument (#1) in their definitions, whole contents of
 | ||
|     %% CJK chapters can be ignored.
 | ||
|     \newcommand{\kerneldocBeginSC}[1]{%
 | ||
| 	%% Put a note on missing CJK fonts or the xecjk package in place of
 | ||
| 	%% zh_CN translation.
 | ||
| 	\begin{sphinxadmonition}{note}{Note on missing fonts and a package:}
 | ||
| 	    Translations of Simplified Chinese (zh\_CN), Traditional Chinese
 | ||
| 	    (zh\_TW), Korean (ko\_KR), and Japanese (ja\_JP) were skipped
 | ||
| 	    due to the lack of suitable font families and/or the texlive-xecjk
 | ||
| 	    package.
 | ||
| 
 | ||
| 	    If you want them, please install non-variable ``Noto Sans CJK''
 | ||
| 	    font families along with the texlive-xecjk package by following
 | ||
| 	    instructions from
 | ||
| 	    \sphinxcode{./scripts/sphinx-pre-install}.
 | ||
| 	    Having optional non-variable ``Noto Serif CJK'' font families will
 | ||
| 	    improve the looks of those translations.
 | ||
| 	\end{sphinxadmonition}}
 | ||
|     \newcommand{\kerneldocEndSC}{}
 | ||
|     \newcommand{\kerneldocBeginTC}[1]{}
 | ||
|     \newcommand{\kerneldocEndTC}{}
 | ||
|     \newcommand{\kerneldocBeginKR}[1]{}
 | ||
|     \newcommand{\kerneldocEndKR}{}
 | ||
|     \newcommand{\kerneldocBeginJP}[1]{}
 | ||
|     \newcommand{\kerneldocEndJP}{}
 | ||
| }
 |