如题,考虑如下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模板中,上述代码表现为:

注意到在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}{参考文献}
}都能满足需求,但不是问题的关键。
使用意大利语方案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}
应但是bug...
理论上lang=cn与lang=it都应该覆盖\bibname,不应该出现这种行为的不一致性。
在 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 的标题却是正确的意大利语。
% 第 403-407 行:biblatex 在语言分支之前加载
\RequirePackage[
backend=\ELEGANT@bibend,
citestyle=\ELEGANT@citestyle,
bibstyle=\ELEGANT@bibstyle]{biblatex}加载顺序为:
ctex 或 babel(语言分支,第 192 行起)biblatex(第 407 行)\renewcommand 覆盖(第 409 行起)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=it | lang=cn | |
|---|---|---|
| 语言包 | \RequirePackage[italian]{babel} | \RequirePackage[...]{ctex} |
| 是否注册 babel 语言 | 是 | 否 |
| biblatex 识别的语言 | italian | english(回退默认) |
| biblatex 加载的 .lbx | italian.lbx | english.lbx |
| bibliography 字符串 | Bibliografia | Bibliography |
\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.cls 的 lang=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}