core-book/lib/rpgfonts.sty
Joe bellus 7b33fef50e Initial commit
Initial project scaffolding
2025-03-10 18:21:53 -04:00

349 lines
15 KiB
TeX

\ExplSyntaxOn
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Font definitions
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{lettrine}
\RequirePackage{Royal}
\RequirePackage[auto]{contour}
\bool_if:NT \l__rpg_layout_bool
{
\RequirePackage{bookman}
\RequirePackage[type1]{gillius2}
\RequirePackage[notext,nomath,nott]{kpfonts}
\RequirePackage[T1]{fontenc}
\renewcommand{\sfdefault}{jkpss}
}
\cs_new_protected:Npn \__rpg_sf_initial_family:
{
\bool_if:NTF \l__rpg_layout_bool
{ \gilliustwo }
{ \sffamily }
}
\keys_define:nn { rpg / fonts }
{
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sectioning commands
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Part
part-family .tl_set:N = \l__rpg_part_family_tl,
part-family .initial:n = \normalfont,
part-family .value_required:n = true,
part-style .tl_set:N = \l__rpg_part_style_tl,
part-style .initial:n = \color{titlered} \Huge \scshape,
part-style .value_required:n = true,
% Chapter
chapter-family .tl_set:N = \l__rpg_chapter_family_tl,
chapter-family .initial:n = \normalfont,
chapter-family .value_required:n = true,
chapter-style .tl_set:N = \l__rpg_chapter_style_tl,
chapter-style .initial:n = \linespread{.9} \color{titlered} \Huge \scshape,
chapter-style .value_required:n = true,
% Section
section-family .tl_set:N = \l__rpg_section_family_tl,
section-family .initial:n = \normalfont,
section-family .value_required:n = true,
section-style .tl_set:N = \l__rpg_section_style_tl,
section-style .initial:n = \linespread{.9} \color{titlered} \huge \scshape \RaggedRight,
section-style .value_required:n = true,
% Subsection
subsection-family .tl_set:N = \l__rpg_subsection_family_tl,
subsection-family .initial:n = \normalfont,
subsection-family .value_required:n = true,
subsection-style .tl_set:N = \l__rpg_subsection_style_tl,
subsection-style .initial:n = \linespread{.9} \color{titlered} \Large \scshape \RaggedRight,
subsection-style .value_required:n = true,
% subsubsection
subsubsection-family .tl_set:N = \l__rpg_subsubsection_family_tl,
subsubsection-family .initial:n = \normalfont,
subsubsection-family .value_required:n = true,
subsubsection-style .tl_set:N = \l__rpg_subsubsection_style_tl,
subsubsection-style .initial:n = \linespread{.9} \color{titlered} \large \scshape \RaggedRight,
subsubsection-style .value_required:n = true,
% paragraph
paragraph-family .tl_set:N = \l__rpg_paragraph_family_tl,
paragraph-family .value_required:n = true,
paragraph-style .tl_set:N = \l__rpg_paragraph_style_tl,
paragraph-style .initial:n = \bfseries \slshape,
paragraph-style .value_required:n = true,
% subparagraph
subparagraph-family .tl_set:N = \l__rpg_subparagraph_family_tl,
subparagraph-family .value_required:n = true,
subparagraph-style .tl_set:N = \l__rpg_subparagraph_style_tl,
subparagraph-style .initial:n = \bfseries \slshape,
subparagraph-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Tables
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Table title
table-title-family .tl_set:N = \l__rpg_table_title_family_tl,
table-title-family .initial:n = \sffamily,
table-title-family .value_required:n = true,
table-title-style .tl_set:N = \l__rpg_table_title_style_tl,
table-title-style .initial:n = \bfseries \scshape \large,
table-title-style .value_required:n = true,
% Table header
table-header-family .tl_set:N = \l__rpg_table_header_family_tl,
table-header-family .initial:n = \sffamily,
table-header-family .value_required:n = true,
table-header-style .tl_set:N = \l__rpg_table_header_style_tl,
table-header-style .initial:n = \bfseries,
table-header-style .value_required:n = true,
% Table body
table-body-family .tl_set:N = \l__rpg_table_body_family_tl,
table-body-family .initial:n = \__rpg_sf_initial_family:,
table-body-family .value_required:n = true,
table-body-style .tl_set:N = \l__rpg_table_body_style_tl,
table-body-style .initial:n = \small,
table-body-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Comment boxes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Comment title
comment-title-family .tl_set:N = \l__rpg_comment_title_family_tl,
comment-title-family .initial:n = \sffamily,
comment-title-family .value_required:n = true,
comment-title-style .tl_set:N = \l__rpg_comment_title_style_tl,
comment-title-style .initial:n = \bfseries \scshape,
comment-title-style .value_required:n = true,
% Comment body
comment-body-family .tl_set:N = \l__rpg_comment_body_family_tl,
comment-body-family .initial:n = \__rpg_sf_initial_family:,
comment-body-family .value_required:n = true,
comment-body-style .tl_set:N = \l__rpg_comment_body_style_tl,
comment-body-style .initial:n = \small,
comment-body-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sidebars
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sidebar title
sidebar-title-family .tl_set:N = \l__rpg_sidebar_title_family_tl,
sidebar-title-family .initial:n = \sffamily,
sidebar-title-family .value_required:n = true,
sidebar-title-style .tl_set:N = \l__rpg_sidebar_title_style_tl,
sidebar-title-style .initial:n = \bfseries \scshape,
sidebar-title-style .value_required:n = true,
% Sidebar body
sidebar-body-family .tl_set:N = \l__rpg_sidebar_body_family_tl,
sidebar-body-family .initial:n = \__rpg_sf_initial_family:,
sidebar-body-family .value_required:n = true,
sidebar-body-style .tl_set:N = \l__rpg_sidebar_body_style_tl,
sidebar-body-style .initial:n = \small,
sidebar-body-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Read-aloud boxes
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
readaloud-family .tl_set:N = \l__rpg_readaloud_family_tl,
readaloud-family .initial:n = \__rpg_sf_initial_family:,
readaloud-family .value_required:n = true,
readaloud-style .tl_set:N = \l__rpg_readaloud_style_tl,
readaloud-style .initial:n = \small,
readaloud-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Table of Contents
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Part
toc-part-family .tl_set:N = \l__rpg_toc_part_family_tl,
toc-part-family .initial:n = \normalfont,
toc-part-family .value_required:n = true,
toc-part-style .tl_set:N = \l__rpg_toc_part_style_tl,
toc-part-style .initial:n = \Large \scshape \color{titlered},
toc-part-style .value_required:n = true,
% Chapter
toc-chapter-family .tl_set:N = \l__rpg_toc_chapter_family_tl,
toc-chapter-family .initial:n = \normalfont,
toc-chapter-family .value_required:n = true,
toc-chapter-style .tl_set:N = \l__rpg_toc_chapter_style_tl,
toc-chapter-style .initial:n = \large \scshape \color{titlered},
toc-chapter-style .value_required:n = true,
% Section
toc-section-family .tl_set:N = \l__rpg_toc_section_family_tl,
toc-section-family .initial:n = \normalfont,
toc-section-family .value_required:n = true,
toc-section-style .tl_set:N = \l__rpg_toc_section_style_tl,
toc-section-style .initial:n = \normalsize,
toc-section-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Stat blocks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Stat block title
stat-block-title-family .tl_set:N = \l__rpg_stat_block_title_family_tl,
stat-block-title-family .initial:n = \normalfont,
stat-block-title-family .value_required:n = true,
stat-block-title-style .tl_set:N = \l__rpg_stat_block_title_style_tl,
stat-block-title-style .initial:n = \bfseries \scshape \LARGE,
stat-block-title-style .value_required:n = true,
% Stat block body
stat-block-body-family .tl_set:N = \l__rpg_stat_block_body_family_tl,
stat-block-body-family .initial:n = \__rpg_sf_initial_family:,
stat-block-body-family .value_required:n = true,
stat-block-body-style .tl_set:N = \l__rpg_stat_block_body_style_tl,
stat-block-body-style .initial:n = \small,
stat-block-body-style .value_required:n = true,
% Stat block section
stat-block-section-family .tl_set:N = \l__rpg_stat_block_section_family_tl,
stat-block-section-family .initial:n = \sffamily,
stat-block-section-family .value_required:n = true,
stat-block-section-style .tl_set:N = \l__rpg_stat_block_section_style_tl,
stat-block-section-style .initial:n = \color{titlered} \scshape \large,
stat-block-section-style .value_required:n = true,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Miscellaneous
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Footer
footer-family .tl_set:N = \l__rpg_footer_family_tl,
footer-family .initial:n = \normalfont,
footer-family .value_required:n = true,
footer-style .tl_set:N = \l__rpg_footer_style_tl,
footer-style .initial:n = \scriptsize \textcolor{pagegold},
footer-style .value_required:n = true,
% Page number
page-number-family .tl_set:N = \l__rpg_page_number_family_tl,
page-number-family .initial:n = \normalfont,
page-number-family .value_required:n = true,
page-number-style .tl_set:N = \l__rpg_page_number_style_tl,
page-number-style .initial:n = \scriptsize \textcolor{pagegold},
page-number-style .value_required:n = true,
% Drop caps
drop-cap-family .tl_set:N = \l__rpg_drop_cap_family_tl,
drop-cap-family .initial:n = \Royal,
drop-cap-family .value_required:n = true,
drop-cap-style .tl_set:N = \l__rpg_drop_cap_style_tl,
drop-cap-style .value_required:n = true,
}
\NewDocumentCommand { \RpgSetFonts } { o }
{
\keys_set:nn { rpg / fonts } { #1 }
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Font access functions combine the selected family and style
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Sectioning commands
\NewDocumentCommand{\RpgFontPart}{}
{ \l__rpg_part_family_tl \l__rpg_part_style_tl}
\NewDocumentCommand{\RpgFontChapter}{}
{ \l__rpg_chapter_family_tl \l__rpg_chapter_style_tl }
\NewDocumentCommand{\RpgFontSection}{}
{ \l__rpg_section_family_tl \l__rpg_section_style_tl }
\NewDocumentCommand{\RpgFontSubsection}{}
{ \l__rpg_subsection_family_tl \l__rpg_subsection_style_tl }
\NewDocumentCommand{\RpgFontSubsubsection}{}
{ \l__rpg_subsubsection_family_tl \l__rpg_subsubsection_style_tl }
\NewDocumentCommand{\RpgFontParagraph}{}
{ \l__rpg_paragraph_family_tl \l__rpg_paragraph_style_tl }
\NewDocumentCommand{\RpgFontSubaragraph}{}
{ \l__rpg_subparagraph_family_tl \l__rpg_subparagraph_style_tl }
% Tables
\NewDocumentCommand{\RpgFontTableTitle}{}
{ \l__rpg_table_title_family_tl \l__rpg_table_title_style_tl }
\NewDocumentCommand{\RpgFontTableHeader}{}
{ \l__rpg_table_header_family_tl \l__rpg_table_header_style_tl }
\NewDocumentCommand{\RpgFontTableBody}{}
{ \l__rpg_table_body_family_tl \l__rpg_table_body_style_tl }
% Comment boxes
\NewDocumentCommand{\RpgFontCommentTitle}{}
{ \l__rpg_comment_title_family_tl \l__rpg_comment_title_style_tl }
\NewDocumentCommand{\RpgFontCommentBody}{}
{ \l__rpg_comment_body_family_tl \l__rpg_comment_body_style_tl }
% Sidebars
\NewDocumentCommand{\RpgFontSidebarTitle}{}
{ \l__rpg_sidebar_title_family_tl \l__rpg_sidebar_title_style_tl }
\NewDocumentCommand{\RpgFontSidebarBody}{}
{ \l__rpg_sidebar_body_family_tl \l__rpg_sidebar_body_style_tl }
% Read-aloud boxes
\NewDocumentCommand{\RpgFontReadAloud}{}
{ \l__rpg_readaloud_family_tl \l__rpg_readaloud_style_tl }
% Table of Contents
\NewDocumentCommand{\RpgFontTocPart}{}
{ \l__rpg_toc_part_family_tl \l__rpg_toc_part_style_tl}
\NewDocumentCommand{\RpgFontTocChapter}{}
{ \l__rpg_toc_chapter_family_tl \l__rpg_toc_chapter_style_tl}
\NewDocumentCommand{\RpgFontTocSection}{}
{ \l__rpg_toc_section_family_tl \l__rpg_toc_section_style_tl}
% Stat blocks
\NewDocumentCommand{\RpgFontStatBlockTitle}{}
{ \l__rpg_stat_block_title_family_tl \l__rpg_stat_block_title_style_tl }
\NewDocumentCommand{\RpgFontStatBlockBody}{}
{ \l__rpg_stat_block_body_family_tl \l__rpg_stat_block_body_style_tl }
\NewDocumentCommand{\RpgFontStatBlockSection}{}
{ \l__rpg_stat_block_section_family_tl \l__rpg_stat_block_section_style_tl }
% Miscellaneous
\NewDocumentCommand{\RpgFontFooter}{}
{ \l__rpg_footer_family_tl \l__rpg_footer_style_tl }
\NewDocumentCommand{\RpgFontPageNumber}{}
{ \l__rpg_page_number_family_tl \l__rpg_page_number_style_tl }
\NewDocumentCommand{\RpgFontDropCap}{}
{ \l__rpg_drop_cap_family_tl \l__rpg_drop_cap_style_tl }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Drop Caps
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\renewcommand{\LettrineFontHook}
{ \l__rpg_drop_cap_family_tl \l__rpg_drop_cap_style_tl }
% Usage: RpgDropCapLine[<lettrine options>]{<first letter>}{<small caps line>}
% It takes trial and error to get the 2nd argument to align with
% the linebreak. Lettrine package will not play nicely with \FirstLine. See
% the lettrine package for options.
\NewDocumentCommand{\RpgDropCapLine}{ O{} m m }
{
\lettrine[
lines = 4,
depth = 0,
findent = \l__rpg_space_dim,
nindent = 0pt,
#1
]
{#2}
{#3}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Contour that can break across lines. Can accept \newline to force a break.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\cs_new_protected:Npn \__rpg_contour_preserve_space:nn #1#2
{
\group_begin:
\seq_set_split:Nnn \l_tmpa_seq { ~ } { #2 }
\seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \exp_not:n {\contour{#1}{##1}} }
\seq_use:Nn \l_tmpb_seq { ~ }
\group_end:
}
\NewDocumentCommand{\RpgContour}{ O{contourgray} m }
{
\group_begin:
\seq_set_split:Nnn \l_tmpa_seq { \newline } { #2 }
\seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq { \exp_not:n {\__rpg_contour_preserve_space:nn{#1}{##1}} }
\seq_use:Nn \l_tmpb_seq { \newline }
\group_end:
}