我尝试使用和biblatex
,但出现错误:。使用常规,一切正常。MWE 如下:IEEEtran
babel
Package babel Error: You haven't defined the language ENGLISH yet.
Bibtex
\documentclass[english]{IEEEtran}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[strict,autostyle]{csquotes}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\bibliography{/usr/local/texlive/2012/texmf-dist/doc/latex/biblatex-ieee/biblatex-ieee.bib}
\usepackage{blindtext}
\begin{document}
\Blindtext
\nocite{*}
\printbibliography
\end{document}
答案1
错误似乎确实是由组合biblatex
/ babel
/引起的IEEEtran
——您的示例(带有适当的.bib
文件)适用于该类article
。一种解决方法是伪造该语言ENGLISH
的(大写)方言english
。
\documentclass[english]{IEEEtran}
\usepackage{babel}
\makeatletter
\adddialect\l@ENGLISH\l@english
\makeatother
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[strict,autostyle]{csquotes}
\usepackage[style=ieee,backend=bibtex]{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage{blindtext}
\nocite{*}
\begin{document}
\Blindtext
\printbibliography
\end{document}
答案2
问题是,改变了应用另一个的IEEEtran.cls
含义,\markboth
\MakeUppercase
\protect\foreignlanguage{english}{%
\protect\bbl@restore@actives\MakeUppercase{\refname}}
被传递,导致 LaTeX 尝试执行
\foreignlanguage{ENGLISH}
给出了错误。这是由 引起的\printbibliography
,但不是 的责任biblatex
,而是由 不太明智的重新定义 引起的\markboth
可以注意到\refname
已经传递给了\MakeUppercase
。
您有两个选择:
改变错误的重新定义
\markboth
:\makeatletter \def\markboth#1#2{% \def\leftmark{\@IEEEcompsoconly{\sffamily}#1}% \def\rightmark{\@IEEEcompsoconly{\sffamily}#2}} \makeatother
IEEEtran 定义有
\MakeUppercase{#1}
和\MakeUppercase{#2}
。ENGLISH
启用以下虚假语言english
:\makeatletter \let\l@ENGLISH\l@english \makeatother
只需将两段代码中的一段放在文档的序言中即可。可能第二段是最安全的。
答案3
检查你的 bib 文件,查找谷歌或期刊在你导出引文时经常添加的行。
language={english}
删除它,然后删除.bbl 和.aux,然后重新编译
答案4
我刚刚用全新的 TexLive 2014 尝试了这些示例;我\let\l@ENGLISH\l@english
在 TexLive 2011 中已经成功使用了一段时间的修复,但现在在 2014 中,同一篇文档却给了我可怕的警告:
Package babel Warning: You haven't loaded the language ENGLISH yet
(babel) I'll proceed, but expect unexpected results.
(babel) Reported on input line 38.
这是我使用的示例,现在可以在 TexLive 2014 中编译而没有警告:
\documentclass[english]{IEEEtran}
\usepackage{trace}
% \traceon
\usepackage{babel}
\makeatletter
% \adddialect\l@ENGLISH\l@english
% \global\let\l@ENGLISH\l@english
\let\l@ENGLISH\relax
\show\l@english
\show\l@ENGLISH
\typeout{BABEL TEST:}
\ifx \csname l@english\endcsname\relax
\typeout{l@english here}
\fi
\ifx \csname l@ENGLISH\endcsname\relax
\typeout{l@ENGLISH here}
\fi
\makeatother
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[strict,autostyle]{csquotes}
\usepackage[style=ieee,backend=biber]{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage{lipsum}
\nocite{*}
\begin{document}
\lipsum[1]
\printbibliography
\end{document}
奇怪的是 - 在 TexLive 2014 版本中,\let\l@ENGLISH\l@english
实际上触发器警告出现。我曾经trace
扫描过一点,下面是概述:
最后,当 Latex 需要打印章节标题时,它会调用\foreignlanguage
,例如:
\foreignlanguage #1#2->\begingroup \foreign@language {#1}#2\endgroup
#1<-ENGLISH
#2<-\protect \bbl@restore@actives \protect \MakeUppercase {REFERENCES}
{\begingroup}
{entering semi simple group (level 12) at line 29}
在执行过程中,我们最终会遇到这个条件,当\let\l@ENGLISH\l@english
生效时,它会采取错误分支:
\@ifundefined #1->\expandafter \ifx \csname #1\endcsname \relax \expandafter \@
firstoftwo \else \expandafter \@secondoftwo \fi
#1<-\bbl@tempe ENGLISH
{\expandafter}
{\csname}
\bbl@tempe ->l@
{\ifx}
{false}
{\expandafter}
{\fi}
\@ifundefined
让我们仔细看看:
\expandafter %
\ifx \csname #1\endcsname \relax %
\expandafter \@firstoftwo %
\else %
\expandafter \@secondoftwo %
\fi
因此在这种情况下,\ifx
基本上检查和的扩展版本(参见下面的注释)是否相同;并且由于是不可扩展的(Tex 原语?),显然对于任何不同于的值,例如(内容仅为),都将为假。\l@ENGLISH
\relax
\relax
\ifx
\l@ENGLISH
\relax
\l@english
\char"0
因此,TexLive 2014 的解决方案要么是\let\l@ENGLISH\relax
- 或者根本不解决它(这对我来说有点奇怪,因为在这种情况下, \l@ENGLISH 是\show
n undefined
[但不是命令/宏/令牌],并且\ifx
不会将\relax
and\undefined
视为相同:
? i
insert>\ifx\relax\undefined\typeout{A}\else\typeout{B}\fi
B
)
好吧,希望这个问题已经解决了,那么 - 也许是时候写另一个 TexLive 版本条件了(在 pdflatex 中获取 Texlive 版本?)...