From d69eeb3f1194b9fd83168482f4e97f93a485886c Mon Sep 17 00:00:00 2001 From: laoyang Date: Sun, 20 Sep 2026 07:00:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=8A=E4=B8=80=E6=AD=A5?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=AD=E7=9A=84=E5=86=99=E6=B3=95=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9A=E7=89=88=E6=9C=AC=E5=88=A4=E6=96=AD=E7=A7=BB?= =?UTF-8?q?=E5=88=B0=E6=96=87=E4=BB=B6=E9=A1=B6=E5=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 上一步把 \patchcmd 嵌套在 \@ifundefined 的参数里,而 \patchcmd 的搜索串 会被用于定义上下文,嵌套后 #1/#2 令牌被改写,导致在 TeX Live 2022 下补丁 匹配失败(Patching original frame title failed)。 现改为顶层 \ifcsname beamer@insertframetitlecontinuation\endcsname \else ... \fi 的结构,两个分支都在顶层: - 新版 beamer(TL2023):按新定义重写 \beamer@@frametitle; - 旧版 beamer(TL2022):保留原有 \patchcmd。 验证矩阵(xelatex 编译 slides.tex): 2022 分支 + TL2022 : 通过,23 页,0 错误 2022 分支 + TL2023 : 失败(Patching original frame title failed)——故需要 2023 分支 2023 分支 + TL2022 : 通过,23 页,0 错误 2023 分支 + TL2023 : 通过,23 页,0 错误 另做像素级回归:TL2023 下修正前后全部 23 页渲染与文本完全一致。 --- theme/beamerfontthemeOUCSlide.sty | 63 ++++++++++++++++--------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/theme/beamerfontthemeOUCSlide.sty b/theme/beamerfontthemeOUCSlide.sty index 18652ea..44f5c2f 100644 --- a/theme/beamerfontthemeOUCSlide.sty +++ b/theme/beamerfontthemeOUCSlide.sty @@ -206,37 +206,38 @@ {}% {\PackageError{beameroucslide}{Patching original part failed}\@ehc} % beamer 3.69(TeX Live 2023)起 \beamer@@frametitle 的定义发生了变化: -% 1. 内部增加了 \ifblank 判断; -% 2. 用 \beamer@insertframetitlecontinuation 取代了 \usebeamertemplate*{frametitle continuation}。 +% 用 \beamer@insertframetitlecontinuation 取代了 \usebeamertemplate*{frametitle continuation}。 % 因此这里按 beamer 版本分别处理,保证在 TeX Live 2022 与 2023 下都能编译通过。 -\@ifundefined{beamer@insertframetitlecontinuation} - {% 旧版 beamer(TeX 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}% - } - {% 新版 beamer(TeX 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}% - }% +% 注意:判断必须写在文件顶层(不能把 \patchcmd 嵌进 \@ifundefined 等宏的参数里), +% 否则 \patchcmd 的搜索串会被改写而导致补丁失败。 +\ifcsname beamer@insertframetitlecontinuation\endcsname + % 新版 beamer(TeX 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 + % 旧版 beamer(TeX 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