修正上一步修复中的写法问题:版本判断移到文件顶层
上一步把 \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 页渲染与文本完全一致。
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user