biblatex 和 babel 的语言问题

biblatex 和 babel 的语言问题

我尝试使用和biblatex,但出现错误:。使用常规,一切正常。MWE 如下:IEEEtranbabelPackage 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

您有两个选择:

  1. 改变错误的重新定义\markboth

    \makeatletter
    \def\markboth#1#2{%
      \def\leftmark{\@IEEEcompsoconly{\sffamily}#1}%
      \def\rightmark{\@IEEEcompsoconly{\sffamily}#2}}
    \makeatother
    

    IEEEtran 定义有\MakeUppercase{#1}\MakeUppercase{#2}

  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 是\shown undefined[但不是命令/宏/令牌],并且\ifx不会将\relaxand\undefined视为相同:

? i
insert>\ifx\relax\undefined\typeout{A}\else\typeout{B}\fi
B

好吧,希望这个问题已经解决了,那么 - 也许是时候写另一个 TexLive 版本条件了(在 pdflatex 中获取 Texlive 版本?)...

相关内容