elegantbook中的lang=cn对\bibname的覆盖失效?

发布于 2025-11-10 16:48:16

如题,考虑如下MWE:

\documentclass[
    lang=cn,fontset=fandol,
]{elegantbook}
\geometry{paperheight=8cm}
\addbibresource{xampl.bib}
% \AtBeginDocument{%
%     \renewcommand{\bibname}{参考文献}
% }
\begin{document}

\chapter{第一章}
Hello\cite{article-minimal} World! 中文!

\printbibliography

% \printbibliography[title={参考文献}]

\end{document}

elegantbook.cls模板中,上述代码表现为:

image.png

注意到在elegantbook.cls中的:

% Line 21
\DeclareStringOption[en]{lang}

设置了默认值为lang=en

且有:

% Line 411
\ifdefstring{\ELEGANT@lang}{cn}{
  \renewcommand{\baselinestretch}{1.3}
  \renewcommand{\contentsname}{目录}
  \renewcommand{\figurename}{图}
  \renewcommand{\tablename}{表}
  \renewcommand{\partname}{\color{structurecolor}}
  \renewcommand{\thepart}{第\zhnumber{\arabic{part}}部分}
  \renewcommand{\listfigurename}{插图目录}
  \renewcommand{\listtablename}{表格目录}
  \renewcommand{\bibname}{参考文献}
  \newcommand{\ebibname}{参考文献}
  \renewcommand{\appendixname}{附录}
  \renewcommand{\appendixtocname}{附录}
  \renewcommand{\indexname}{索\hspace{2em}引}
  \newcommand\figref[1]{\textbf{图}~\ref{#1}}
  \newcommand\tabref[1]{\textbf{表}~\ref{#1}}
  \newcommand{\authorname}{\citshape 作者:}
  \newcommand{\institutename}{\citshape 组织:}
  \newcommand{\datename}{\citshape 时间:}
  \newcommand{\versionname}{\citshape 版本:}
  \newcommand{\notename}{笔记}
  \renewcommand*{\proofname}{证明}
  \newcommand{\definitionname}{定义}
  \newcommand{\theoremname}{定理}
  \newcommand{\axiomname}{公理}
  \newcommand{\postulatename}{公设}
  \newcommand{\lemmaname}{引理}
  \newcommand{\propositionname}{命题}
  \newcommand{\corollaryname}{推论}
  \newcommand{\examplename}{例题} %
  \newcommand{\instancename}{示例} %
  \newcommand{\problemname}{问题} % 问题
  \newcommand{\exercisename}{练习} % 练习=习题
  \newcommand{\remarkname}{注}
  \newcommand{\assumptionname}{假设}
  \newcommand{\conclusionname}{结论}
  \newcommand{\solutionname}{解}
  \newcommand{\propertyname}{性质}
  \newcommand{\introductionname}{内容提要}
  \newcommand\bioinfo[2]{\gdef\@bioinfo{{\citshape #1}:#2}}
  \newcommand{\updatename}{更新:}
  \newcommand{\historyname}{版本更新历史}
  \newcommand{\beforechap}{第}
  \newcommand{\afterchap}{章}
}{\relax}

但在MWE中的表现却为:

  • \chaptername正确更改
  • \bibname并未正确更改

这是不是elegant-latex在lang=cn时的非预期行为呢?


BTW,使用:

\printbibliography[title={参考文献}]

或者

\AtBeginDocument{%
    \renewcommand{\bibname}{参考文献}
}

都能满足需求,但不是问题的关键。

Edited:

使用意大利语方案lang=it,似乎一切正常...

\documentclass[lang=it]{elegantbook}
\geometry{paperheight=8cm}
\addbibresource{xampl.bib}
\begin{document}
\chapter{Chapter Name}
Hello\cite{article-minimal} World! 

\printbibliography
\end{document}

image.png

查看更多

关注者
0
被浏览
1.6k
1 个回答
Sagittarius Rover
Sagittarius Rover 2026-05-04
这家伙很懒,什么也没写!

应但是bug...

理论上lang=cnlang=it都应该覆盖\bibname,不应该出现这种行为的不一致性。

以下部分由codex-5.5辅助生成:

第一步:定位 elegantbook.cls 中两段代码的差异

elegantbook.cls 中,语言分支的代码结构如下:

cn 分支(第 192-219 行 + 第 409-453 行):

% 第 194 行:加载 ctex 处理中文排版
\RequirePackage[UTF8, scheme=plain, fontset=none]{ctex}

% 第 418 行:手动重定义 \bibname
\renewcommand{\bibname}{参考文献}

cn 分支没有加载 babel,也没有做任何与 biblatex 语言字符串相关的设置。

it 分支(第 492-526 行):

% 第 494 行:加载 babel 意大利语
\RequirePackage[italian]{babel}

it 分支甚至没有手动写 \renewcommand{\bibname}{...},但 \printbibliography 的标题却是正确的意大利语。

第二步:确认 biblatex 的加载位置

% 第 403-407 行:biblatex 在语言分支之前加载
\RequirePackage[
  backend=\ELEGANT@bibend,
  citestyle=\ELEGANT@citestyle,
  bibstyle=\ELEGANT@bibstyle]{biblatex}

加载顺序为:

  1. ctexbabel(语言分支,第 192 行起)
  2. biblatex(第 407 行)
  3. 各语言的 \renewcommand 覆盖(第 409 行起)

第三步:理解 biblatex 的标题机制

biblatex 有两套并行的标题系统

系统机制命令
LaTeX 标题宏\bibname / \refname\renewcommand 修改
biblatex 本地化字符串bibliography / references.lbx 文件或 \DeclareBibliographyStrings 定义

关键点:\printbibliography 的默认标题不是直接读取 \bibname,而是读取 biblatex 自己的本地化字符串 bibliography。biblatex 在初始化和 \begin{document} 时刻会用自己的字符串系统同步覆盖 \bibname

第四步:追踪两种语言的完整链路

lang=it 的完整链路:

elegantbook.cls 第 494 行:
  \RequirePackage[italian]{babel}
       ↓
  babel 将文档主语言注册为 italian
       ↓
  biblatex 检测到 babel 语言为 italian
       ↓
  自动加载 italian.lbx
  (路径:texmf-dist/tex/latex/biblatex/lbx/italian.lbx)
       ↓
  italian.lbx 第 90 行定义:
    bibliography = {{Bibliografia}{Bibliografia}}
       ↓
  \begin{document} 时,biblatex 用 italian.lbx 的字符串初始化
       ↓
  \printbibliography 标题 → Bibliografia ✓

lang=cn 的完整链路:

elegantbook.cls 第 194 行:
  \RequirePackage[...]{ctex}
       ↓
  ctex 只处理中文排版(字体、断行等),不注册 babel 语言
       ↓
  biblatex 检测不到中文语言环境
       ↓
  且 biblatex 标准发行版中没有 chinese.lbx
       ↓
  biblatex 回退到默认语言 → english
       ↓
  english.lbx 定义:
    bibliography = {{Bibliography}{Bibliography}}
       ↓
  elegantbook.cls 第 418 行:
    \renewcommand{\bibname}{参考文献}
  ← 此时 \bibname 暂时被改为"参考文献"
       ↓
  \begin{document} 时,biblatex 用 english.lbx 的字符串
  重新初始化,\bibname 被覆盖回 "Bibliography"
       ↓
  \printbibliography 标题 → Bibliography ✗

第五步:验证——为什么两种绕过方式有效

用户提到的两种绕过方式:

% 方式一:延迟到 \begin{document} 之后覆盖
\AtBeginDocument{%
    \renewcommand{\bibname}{参考文献}
}

有效原因:\AtBeginDocument 在 biblatex 的 \begin{document} 初始化之后执行,所以覆盖不会被 biblatex 再冲掉。

% 方式二:直接指定标题
\printbibliography[title={参考文献}]

有效原因:title= 参数直接覆盖了 biblatex 的默认标题逻辑,绕过了整个字符串系统。


根因结论

lang=itlang=cn
语言包\RequirePackage[italian]{babel}\RequirePackage[...]{ctex}
是否注册 babel 语言
biblatex 识别的语言italianenglish(回退默认)
biblatex 加载的 .lbxitalian.lbxenglish.lbx
bibliography 字符串BibliografiaBibliography
\renewcommand{\bibname} 是否生效不需要(.lbx 已处理)写了但被 biblatex 覆盖

一句话总结lang=it 之所以正常,是因为 \RequirePackage[italian]{babel} 触发了 biblatex 自身的本地化机制(加载 italian.lbx),biblatex 从自己的字符串系统中获得了正确的意大利语标题。而 lang=cn 只是通过 \renewcommand{\bibname}{参考文献} 修改了 LaTeX 层面的标题宏,并没有对接 biblatex 的本地化字符串系统;biblatex 在 \begin{document} 时仍按默认的 english.lbx 重新初始化 \bibname,导致中文设置被覆盖。

这本质上是 elegantbook.cls 的 lang=cn 分支只做了一半的工作:改了 LaTeX caption macro,但遗漏了 biblatex 的 DeclareBibliographyStrings 接口。


推荐修复方案

elegantbook.clslang=cn 分支中,用 \DefineBibliographyStrings 接入 biblatex 的本地化字符串系统。由于 cn 分支没有注册 babel 语言,biblatex 实际加载的是 english.lbx,所以需要覆盖 english 语言的字符串。

修改位置

elegantbook.cls 第 418-419 行之后(\bibname\ebibname 定义之后),添加:

\ifdefstring{\ELEGANT@lang}{cn}{
  \renewcommand{\baselinestretch}{1.3}
  \renewcommand{\contentsname}{目录}
  \renewcommand{\figurename}{图}
  \renewcommand{\tablename}{表}
  \renewcommand{\partname}{\color{structurecolor}}
  \renewcommand{\thepart}{第\zhnumber{\arabic{part}}部分}
  \renewcommand{\listfigurename}{插图目录}
  \renewcommand{\listtablename}{表格目录}
  \renewcommand{\bibname}{参考文献}
  \newcommand{\ebibname}{参考文献}
  % >>> 新增:接入 biblatex 本地化字符串系统 >>>
  \DefineBibliographyStrings{english}{
    bibliography = {参考文献},
    references   = {参考文献},
  }
  % <<< 新增结束 <<<
  \renewcommand{\appendixname}{附录}
  % ... 后续不变 ...
}{\relax}

修改后的测试:

\documentclass[
    lang=cn,fontset=fandol,
]{elegantbook}
\geometry{paperheight=8cm}
\addbibresource{xampl.bib}
\begin{document}

\chapter{第一章}
Hello\cite{article-minimal} World! 中文!

\printbibliography

\end{document}

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览