babel-定义语言同义词(用于IEEEtran)

babel-定义语言同义词(用于IEEEtran)

我有一个几乎与此相同的问题其他旧问题。不同之处在于我使用的是 Zotero 和 IEEEtran bib 样式。

Zotero 基本上与 Mendeley 做同样的事情,即在值language中生成字段等。所以这个差异对于这个问题来说并不重要,我在这里仅针对搜索引擎用户说明。.biben

IEEEtran bib 样式发出一些代码,显然会检查language的值是否是已定义的 babel 语言。如果不是,则会发出警告:

** WARNING: IEEEtran.bst: No hyphenation pattern has been
** loaded for the language `en'. Using the pattern for

这来自以下代码:

\providecommand{\BIBforeignlanguage}[2]{{%
\expandafter\ifx\csname l@#1\endcsname\relax
\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%
\typeout{** loaded for the language `#1'. Using the pattern for}%
\typeout{** the default language instead.}%
\else
\language=\csname l@#1\endcsname
\fi
#2}}

就像另一个问题一样,我想使用 bib 样式而不更改文件.bib。但是,另一个问题的解决方法/解决方案不适用于 IEEEtran。

MWE(没有natbib的失效解决方法):

\begin{filecontents*}{\jobname.bib}
@inproceedings{Renyi1961,
    author = {R\'{e}nyi, Alfr\'{e}d},
    booktitle = {Proceedings of the Fourth Berkeley Symposium on Mathematical Statistics 
      and Probability, Volume 1: Contributions to the Theory of Statistics},
    issn = {0097-0433},
    language = {en},
    publisher = {The Regents of the University of California},
    title = {{On Measures of Entropy and Information}},
    url = {http://projecteuclid.org/euclid.bsmsp/1200512181},
    year = {1961}
}
\end{filecontents*}


\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}

\usepackage{hyperref}

\bibliographystyle{IEEEtran}

\begin{document}

    \cite{Renyi1961}

    \bibliography{\jobname}

\end{document}

答案1

编辑。抱歉,我的回答没有解决问题。我假设选择是用 完成的babel,但事实证明并非如此。不过,我不会删除它,因为它在其他情况下可能会有用。

原始答案

这是一个快速破解方法:

\documentclass{article}

\usepackage[danish,english]{babel}

% The hack:
\makeatletter
\let\old@fixname\bbl@fixname
\def\bbl@fixname#1{%
  \@ifundefined{babelalias#1}%
    {\old@fixname{#1}}%
    {\edef\languagename{\csname babelalias#1\endcsname}}}
\makeatother

% The synonymous:
\newcommand{\babelaliasen}{english}
\newcommand{\babelaliasda}{danish}

\begin{document}

\selectlanguage{da}

\languagename --- \chaptername

\selectlanguage{en}

\languagename --- \chaptername

\end{document}

虽然不是很优雅,但似乎可以工作。BCP 47 代码的接口正在研究中,很可能几个月后就可以使用。

答案2

你可以做得更好,请参阅其他帖子。

\begin{filecontents*}{\jobname.bib}
@inproceedings{Renyi1961,
  author = {R{\'{e}}nyi, Alfr{\'{e}}d},
  booktitle = {Proceedings of the Fourth Berkeley Symposium on Mathematical Statistics 
               and Probability, Volume 1: Contributions to the Theory of Statistics},
  issn = {0097-0433},
  language = {en},
  publisher = {The Regents of the University of California},
  title = {{On Measures of Entropy and Information}},
  url = {http://projecteuclid.org/euclid.bsmsp/1200512181},
  year = {1961}
}
\end{filecontents*}

\documentclass{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{doi}

\usepackage{hyperref}

\bibliographystyle{IEEEtran}

\makeatletter
\let\ORIbbl@fixname\bbl@fixname
\def\bbl@fixname#1{%
  \@ifundefined{languagealias@\expandafter\string#1}
    {\ORIbbl@fixname#1}
    {\edef\languagename{\@nameuse{languagealias@#1}}}%
}
\newcommand{\definelanguagealias}[2]{%
  \@namedef{languagealias@#1}{#2}%
}
\let\BIBforeignlanguage\foreignlanguage
\makeatother

\definelanguagealias{en}{english}

\begin{document}

    \cite{Renyi1961}

    \bibliography{\jobname}

\end{document}

诀窍是诱导IEEEtran使用比更好的命令\language\l@<language>,即\foreignlanguage{<language>}{...}

答案3

解决这个问题最简单的方法似乎是使用简单的 TeX 宏来定义别名,例如:

\makeatletter
\def\l@en{\l@english}
\makeatother

但是,我不确定这是否能完全解决问题,而无需回归。但是加载正确的连字设置。另外,我无法为该\definelanguagealias命令声明合适的替换(要么在使用 TeX 基元定义时产生错误,要么无法正确创建 babel/IEEEtran 可以获取的别名)。

我很乐意选择一个更优雅的建议作为正确答案......

相关内容