使用 pdflatex+biblatex+biber 在 .bib 文件中使用 \c{e} 和其他特殊字符:如何避免包 inputenc 错误?

使用 pdflatex+biblatex+biber 在 .bib 文件中使用 \c{e} 和其他特殊字符:如何避免包 inputenc 错误?

我使用 Mendeley 管理我的参考书目,并让它自动更新 .bib 文件。不幸的是,这经常导致编译时出现“Package inputenc Error”。

我把我的问题缩小到这个 MWE(虽然不起作用,但可以删除 .bib 中的 \c{e}):

特殊.tex:

\documentclass{report}
\usepackage[T1]{fontenc} % necessary for "old text encoding" apparently (like for \k{a} (ogonek used in Polish))
\usepackage[utf8]{inputenc}
\usepackage[backend=biber]{biblatex}

\addbibresource{special.bib}

\begin{document}
  text:

  \c{c}
  \k{e}
  \k{a}
  \^{o}
  \c{e}

  \cite{foo2016}
  \printbibliography
\end{document}

特殊.bib:

@article{foo2016,
title = {{title}},
author = {
  \c{c}
  \k{e}
  \k{a}
  \^{o}
  \c{e}
},
}

problematic characters:
{\c{e}}

我编译如下:

pdflatex special.tex
biber special
pdflatex special.tex

当从 bib 条目中删除 \c{e} 时,编译仍然有效,尽管 .tex 文件中存在相同的字符,并且在主文本中呈现没有问题。

虽然我可能在这里只使用 \k{e},这样就行了,但这只是众多条目中的一个,每当我在 Mendeley 或类似软件中进行 DOI 查找时,这些条目都会经常出错。如果可能的话,我宁愿根本不担心编码问题。

版本:

  • biber:v1.9
  • pdflatex:pdfTeX 3.14159265-2.6-1.40.15(TeX Live 2014/Debian)
  • biblatex:v2.9a

(但我在安装了较新软件包的 ubuntu 16.04 上也遇到了同样的问题,尽管我目前无法在那里进行测试)

编辑:这是 Mendeley 中的 DOI 查找生成的完整条目(我创建了一个新条目以确保这不是我自己的错误):

@article{new_test_entry,
author = {Reithmaier, J. P. and S{\c{e}}k, G. and L{\"{o}}ffler, A. and Hofmann, C. and Kuhn, S. and Reitzenstein, S. and Keldysh, L. V. and Kulakovskii, V. D. and Reinecke, T. L. and Forchel, A.},
doi = {10.1038/nature02969},
issn = {0028-0836},
journal = {Nature},
mendeley-groups = {Personal},
month = {nov},
number = {7014},
pages = {197--200},
title = {{Strong coupling in a single quantum dot–semiconductor microcavity system}},
url = {http://www.nature.com/doifinder/10.1038/nature02969},
volume = {432},
year = {2004}
}

答案1

biber 会(并非总是,但经常)将重音命令转换为分解的 unicode 表示“字符 + 组合重音”。但 pdflatex 无法处理组合重音。因此,只要您使用 pdflatex,就必须避免发生这种情况。

为此,您可以

  • --output-safechars使用类似选项告诉 biber 不要以 utf8 格式输出所有内容
  • 或者直接在 bib 中输入正确的 utf8 字符,在您的情况下为拉丁小写字母 E 带下划线' (U+0229) 作为 ȩ。有时您必须为此类字符添加定义。
  • 或者,如果您想使用 bib 中的命令,请使用不同的名称(例如 \cedilla{e})来欺骗 biber,然后在文档中执行\let\cedilla\c。但请注意,biber 不再能识别所需的字形,因此排序可能会出错。

编辑:

其实这是其中一个案例没有输出一个组合重音符。问题很简单,U+0229 没有声明。只需在 bib 中添加\DeclareUnicodeCharacter{0229}{\c{e}} 和即可。\c{e}

为了演示最后两条建议。此 bib 文件

@article{foo2016,
title = {{title}},
author = {
  \c{c}
  \k{e}
  \k{a}
  \^{o}
  \cedilla{e}
  ȩ
},
}

有了这个文件

\documentclass{report}
\usepackage[T1]{fontenc} % necessary for "old text encoding" apparently (like for \k{a} (ogonek used in Polish))
\usepackage[utf8]{inputenc}
\usepackage[backend=biber]{biblatex}

\addbibresource{special.bib}

\newcommand\cedilla{}
\let\cedilla\c
\DeclareUnicodeCharacter{0229}{\c{e}}
\begin{document}
  \cite{foo2016}
  \printbibliography
\end{document}

将给出这个结果

在此处输入图片描述

答案2

我想指出的是xelatex,只要字体包含所有字符,它就可以很好地与 配合使用。它似乎lmodern没有。使用(默认使用,和(的扩展)的ȩ演示):lmodernxelatexerewhonAdobe Utopia

\documentclass{report}
\usepackage{fontspec}
\setmainfont{erewhon}
\usepackage{csquotes} \usepackage[backend=biber]{biblatex}

\addbibresource{special.bib}

\begin{document}
text:

ç
ę
ą
ô
ȩ

\cite{foo2016}
\printbibliography
\end{document} 

围兜文件:

@article{foo2016, title = {{title}}, author = {
  ç
  ę\k{e}
  ą\k{a}
  ô
  ȩ\c{e}
}, }

结果为lmodern

在此处输入图片描述

结果为erewhon

在此处输入图片描述

相关内容