Files
ouc-slide-latex-template/theme/beamerfontthemeOUCSlide.sty
T
laoyang 4bdc1b83ab 修复 allcaps 选项因缺少 textcase 宏包而报未定义命令的问题
title/subtitle/part/frametitle 的 allcaps 选项都引用 \MakeTextUppercase,该命令由
textcase 宏包提供,而本模板并未加载它,因此选择 allcaps 时会报
Undefined control sequence(默认 regular 选项不受影响)。

现改为在 \MakeTextUppercase 未定义时退回到 LaTeX 内核的 \MakeUppercase
(新版内核的大小写转换语义与 textcase 一致),无需额外加载宏包。

验证(xelatex 两遍编译,23 页):
  默认选项 + TL2022 / TL2023 → 通过,0 错误
  全部 allcaps + TL2022 / TL2023 → 通过,0 错误
2026-09-20 07:15:40 +08:00

249 lines
9.7 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
%!TEX program = xelatex
%% 版本:1.0
%% 作者:杨永全
%% 本文件的主要作用,是定义各种元素的字体
%% 完成日期:2022-05-09
\usepackage[UTF8]{ctex}
%\usepackage{xeCJK}
%字体
%设置英文字体 鸿蒙字体
\setmainfont[
Path=fonts/,
BoldFont=HarmonyOS_Sans_Bold.ttf,
ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf,
BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf,
]{HarmonyOS_Sans_Regular.ttf}
\setsansfont[
Path=fonts/,
BoldFont=HarmonyOS_Sans_Bold.ttf,
ItalicFont=HarmonyOS_Sans_Regular_Italic.ttf,
BoldItalicFont=HarmonyOS_Sans_Bold_Italic.ttf,
]{HarmonyOS_Sans_Regular.ttf}
\setmonofont[
Path=fonts/
]{HarmonyOS_Sans_Regular.ttf}
%设置中文字体 鸿蒙字体
\setCJKmainfont[
Path=fonts/,
BoldFont=HarmonyOS_Sans_SC_Bold.ttf,
ItalicFont=HarmonyOS_Sans_SC_Regular.ttf,
BoldItalicFont=HarmonyOS_Sans_SC_Bold.ttf
]{HarmonyOS_Sans_SC_Regular.ttf}
\setCJKsansfont[
Path=fonts/,
BoldFont=HarmonyOS_Sans_SC_Bold.ttf,
ItalicFont=HarmonyOS_Sans_SC_Regular.ttf,
BoldItalicFont=HarmonyOS_Sans_SC_Bold.ttf
]{HarmonyOS_Sans_SC_Regular.ttf}
\setCJKmonofont[
Path=fonts/
]{HarmonyOS_Sans_SC_Regular.ttf}
%以下为原模板代码,未做改动
\mode<presentation>
\setbeamerfont{sectiontitle}{size*={18pt}{20pt},series=\bfseries} % section标题字体大小
\setbeamerfont{title}{size*={15pt}{16pt},series=\bfseries} % 标题字体大小
\setbeamerfont{subtitle short}{size*={11pt}{12pt},series=\mdseries} % 副标题 短的 字体大小
\setbeamerfont{subtitle long}{size*={9pt}{9pt},series=\mdseries} % 副标题 长的 字体大小
\setbeamerfont*{subtitle}{parent=subtitle long} % 使用父标题
\setbeamerfont*{subtitle}{parent=subtitle short} % 使用父标题
%\setbeamerfont{normal text}{size*={8pt}{9pt}} % 14pt, baselineskip 18pt
\setbeamerfont{footline}{size*={6pt}{7pt}} %页脚文字大小
%\setbeamerfont{frametitle}{size*={16pt}{16pt},series=\bfseries} %30pt, baselineskip 36pt
\setbeamerfont{framesubtitle}{size*={10pt}{11pt},series=\mdseries} % 普通页面,副标题的字体大小
% 特殊文本域的字体设置
\setbeamerfont{caption}{size=\small}
\setbeamerfont{caption name}{parent={structure,caption}}
\setbeamerfont{date}{size*={10pt}{10pt}}
\setbeamerfont{footline}{parent={tiny structure}}
\setbeamerfont{headline}{parent={tiny structure}}
\setbeamerfont{institute}{size=\footnotesize, series=\itshape}
\setbeamerfont{navigation symbols}{size*={7pt}{8pt}}
\setbeamerfont{section in toc}{parent=structure}
\setbeamerfont{section in toc shaded}{parent=section in toc}
% 列表
\setbeamerfont{item}{parent=structure}
\setbeamerfont{subitem}{parent=item}
\setbeamerfont{subsubitem}{parent=subitem}
\setbeamerfont{item projected}{size=\tiny, parent={item, projected text}}
\setbeamerfont{subitem projected}{parent=item projected}
\setbeamerfont{subsubitem projected}{parent=subitem projected}
\setbeamerfont{description item}{parent=item}
\setbeamerfont{enumerate item}{parent=item}
\setbeamerfont{enumerate subitem}{parent=subitem}
\setbeamerfont{enumerate subsubitem}{parent=subsubitem}
\setbeamerfont{itemize/enumerate body}{}
\setbeamerfont{itemize/enumerate subbody}{size=\small}
\setbeamerfont{itemize/enumerate subsubbody}{size=\footnotesize}
\setbeamerfont{itemize item}{parent=item}
\setbeamerfont{itemize subitem}{parent=subitem}
\setbeamerfont{itemize subsubitem}{parent=subsubitem}
\makeatletter
%% 字母间距
\providecommand{\emptydummyb}[1]{} % eats argument of \uppercase() and and \addfontfeature{}
\providecommand{\emptydummya}[2][]{#2}{} % eats optional argument of textls and forwards #2 argument
\providecommand{\addfontfeature}[1]{} % defined only if latex or pdflatex is used
\providecommand{\textls}[2][]{#2}{} % defined only if microtype is loaded
%% \MakeTextUppercase 原本由 textcase 宏包提供,但本模板并未加载该宏包,
%% 导致 title/subtitle/part/frametitle 的 allcaps 选项报 Undefined control sequence。
%% 这里在未定义时退回到 LaTeX 内核的 \MakeUppercase(新版内核语义与 textcase 一致)。
\@ifundefined{MakeTextUppercase}{\let\MakeTextUppercase\MakeUppercase}{}
% 定义的一些其他命令
\def\beameroucslide@titleformat#1{#1}
\def\beameroucslide@subtitleformat#1{#1}
\def\beameroucslide@partformat#1{#1}
\def\beameroucslide@frametitleformat#1{#1}
%% 标题文字定义
\pgfkeys{
/beameroucslide/font/title/.cd,
.is choice,
.default=regular,
regular/.code={%
\let\beameroucslide@titleformatcaps\emptydummya%
\let\beameroucslide@titleformatspacinga\emptydummya%
\let\beameroucslide@titleformatspacingb\emptydummyb%
},
allcaps/.code={%
\let\beameroucslide@titleformatcaps\MakeTextUppercase%
\let\beameroucslide@titleformatspacinga\emptydummya%
\let\beameroucslide@titleformatspacingb\emptydummyb%
},
}
%% 副标题文字定义
\pgfkeys{
/beameroucslide/font/subtitle/.cd,
.is choice,
.default=allcaps,
regular/.code={%
\let\beameroucslide@subtitleformatcaps\emptydummya%
\let\beameroucslide@subtitleformatspacinga\emptydummya%
\let\beameroucslide@subtitleformatspacingb\emptydummyb%
\setbeamerfont{subtitle long}{size*={9pt}{11pt},series=\bfseries} % 18pt, baselineskip 22pt
},
allcaps/.code={%
\let\beameroucslide@subtitleformatcaps\MakeTextUppercase%
\let\beameroucslide@subtitleformatspacinga\emptydummya%
\let\beameroucslide@subtitleformatspacingb\emptydummyb%
\setbeamerfont{title}{size*={16pt}{16pt},series=\bfseries} % 30pt, baselineskip 36pt%
},
}
%% 普通页面文字设置
\pgfkeys{
/beameroucslide/font/frametitle/.cd,
.is choice,
.default=allcaps,
regular/.code={%
\let\beameroucslide@frametitleformatcaps\emptydummya%
\let\beameroucslide@frametitleformatspacinga\emptydummya%
\let\beameroucslide@frametitleformatspacingb\emptydummyb%
\setbeamerfont{frametitle}{size*={14pt}{18pt},series=\bfseries} % 32pt, baselineskip 36pt%
},
allcaps/.code={%
\let\beameroucslide@frametitleformatcaps\MakeTextUppercase%
\let\beameroucslide@frametitleformatspacinga\emptydummya%
\let\beameroucslide@frametitleformatspacingb\emptydummyb%
\setbeamerfont{frametitle}{size*={14pt}{18pt},series=\bfseries} % 32pt, baselineskip 36pt%
},
}
%% 段落文字设置
\pgfkeys{
/beameroucslide/font/part/.cd,
.is choice,
.default=allcaps,
regular/.code={%
\let\beameroucslide@partformatcaps\emptydummya%
\let\beameroucslide@partformatspacinga\emptydummya%
\let\beameroucslide@partformatspacingb\emptydummyb%
\setbeamerfont{part}{size*={16pt}{18pt},series=\bfseries} % 30pt, baselineskip 36pt%
},
allcaps/.code={%
\let\beameroucslide@partformatcaps\MakeTextUppercase%
\let\beameroucslide@partformatspacinga\emptydummya%
\let\beameroucslide@partformatspacingb\emptydummyb%
\setbeamerfont{part}{size*={16pt}{18pt},series=\bfseries} % 30pt, baselineskip 36pt%
},
}
% redefine beamer title, subtitle, part and frametitle command
\patchcmd{\beamer@title}%
{\def\inserttitle{#2}}%
{\protected\def\inserttitle{{\beameroucslide@titleformatspacingb{LetterSpace=15.0}\beameroucslide@titleformatcaps{\beameroucslide@titleformatspacinga[120]{#2}}}}}%
{}%
{\PackageError{beameroucslide}{Patching original title failed}\@ehc}
\patchcmd{\beamer@subtitle}%
{\def\insertsubtitle{#2}}%
{\protected\def\insertsubtitle{{\beameroucslide@subtitleformatspacingb{LetterSpace=15.0}\beameroucslide@subtitleformatcaps{\beameroucslide@subtitleformatspacinga[120]{#2}}}}}%
{}%
{\PackageError{beameroucslide}{Patching original subtitle failed}\@ehc}
\patchcmd{\beamer@part}%
{\def\insertpart{\expandafter\hyperlink\partlink}}%
{\def\insertpart{{\beameroucslide@partformatspacingb{LetterSpace=15.0}\beameroucslide@partformatcaps{\beameroucslide@partformatspacinga[120]{\expandafter\hyperlink\partlink}}}}}%
{}%
{\PackageError{beameroucslide}{Patching original part failed}\@ehc}
% beamer 3.69TeX Live 2023)起 \beamer@@frametitle 的定义发生了变化:
% 用 \beamer@insertframetitlecontinuation 取代了 \usebeamertemplate*{frametitle continuation}。
% 因此这里按 beamer 版本分别处理,保证在 TeX Live 2022 与 2023 下都能编译通过。
% 注意:判断必须写在文件顶层(不能把 \patchcmd 嵌进 \@ifundefined 等宏的参数里),
% 否则 \patchcmd 的搜索串会被改写而导致补丁失败。
\ifcsname beamer@insertframetitlecontinuation\endcsname
% 新版 beamerTeX Live 2023 及以后):按新定义重写,并加入标题格式控制
\long\def\beamer@@frametitle[#1]#2{%
\ifblank{#2}{}{%
\gdef\insertframetitle{{\beameroucslide@frametitleformatcaps{#2}%
\ifnum\beamer@autobreakcount>0\relax{}\space%
\beamer@insertframetitlecontinuation\fi}}%
\gdef\beamer@frametitle{#2}%
\gdef\beamer@shortframetitle{#1}%
}%
}%
\else
% 旧版 beamerTeX Live 2022 及以前):沿用原有的补丁方式
\patchcmd{\beamer@@frametitle}
{{%
\gdef\insertframetitle{{#2\ifnum\beamer@autobreakcount>0\relax{}\space%
\usebeamertemplate*{frametitle continuation}\fi}}%
\gdef\beamer@frametitle{#2}%
\gdef\beamer@shortframetitle{#1}%
}}
{{%
\gdef\insertframetitle{{\beameroucslide@frametitleformatcaps{#2}\ifnum%
\beamer@autobreakcount>0\relax{}\space%
\usebeamertemplate*{frametitle continuation}\fi}}%
\gdef\beamer@frametitle{#2}%
\gdef\beamer@shortframetitle{#1}%
}}
{}
{\PackageError{beameroucslide}{Patching original frame title failed}\@ehc}%
\fi
\makeatother