Unicode -(U+301) 错误出现在 biblatex 中,但不出现在正文中:{\'{\i}}

Unicode -(U+301) 错误出现在 biblatex 中,但不出现在正文中:{\'{\i}}

当使用 biblatex 编译我的文档嵌入参考文献时,我收到错误消息:

包 inputenc 错误:Unicode 字符 ́ (U+301)(inputenc) 未设置为用于 LaTeX

借助此网站的各种 unicode/biblatex 问题,我发现{\'{\i}}其中一个参考文献中的字符是罪魁祸首。有趣的是,{\'{\i}}正文中的设置确实不是抛出错误信息:

\begin{filecontents}{biblio.bib}
    @Article{Zheng2016,
        %author    = {Qinsi Zheng and Steffen Jockusch and Gabriel G. Rodr{\'{\i}}guez-Calero and Zhou Zhou and Hong Zhao and Roger B. Altman and H{\'e}ctor D. Abru{\~n}a and Scott C. Blanchard},
        author    = {Qinsi Zheng and Gabriel G. Rodr{\'i}guez-Calero and Steffen Jockusch and Zhou Zhou and Hong Zhao and Roger B. Altman and H{\'e}ctor D. Abru{\~n}a and Scott C. Blanchard},
        title     = {Intra-molecular triplet energy transfer is a general approach to improve organic fluorophore photostability},
        journal   = {Photochemical {\&} Photobiological Sciences},
        year      = {2016},
        volume    = {15},
        number    = {2},
        pages     = {196--203},
        doi       = {10.1039/c5pp00400d},
        publisher = {Royal Society of Chemistry ({RSC})},
    }

    @Article{Pennacchietti2018,
        author    = {Francesca Pennacchietti and Ekaterina O. Serebrovskaya and Aline R. Faro and Irina I. Shemyakina and Nina G. Bozhanova and Alexey A. Kotlobay and Nadya G. Gurskaya and Andreas Bod{\'{e}}n and Jes Dreier and Dmitry M. Chudakov and Konstantin A. Lukyanov and Vladislav V. Verkhusha and Alexander S. Mishin and Ilaria Testa},
        title     = {Fast reversibly photoswitching red fluorescent proteins for live-cell {RESOLFT} nanoscopy},
        journal   = {Nature Methods},
        year      = {2018},
        volume    = {15},
        number    = {8},
        month     = {jul},
        pages     = {601--604},
        doi       = {10.1038/s41592-018-0052-9},
        publisher = {Springer Nature America, Inc},
    }
\end{filecontents}



\documentclass[pdfa,a4paper,11pt,
                        bibliography=totoc,
                        numbers=noenddot,
                        abstracton,
                        twoside,openright,
                        parskip=half]{scrartcl}

\usepackage[english]{babel} % provides the dictionary for proper hyphenation
\frenchspacing % single space after full stop
\raggedbottom
\usepackage[utf8]{inputenc} % for font encoding

\usepackage{filecontents}

\usepackage{csquotes} % needed for babel / polyglossia
\usepackage[
natbib = true, % allows usage of citet, citep etc. commands
citestyle = authoryear, bibstyle = authoryear, %
backend = biber, %
sortcites = true, % sorts multiple refs in one cite command
hyperref = true, %backref = true, %
giveninits = true, %
terseinits = false, % if true: D. E. => DE
%uniquelist = true,
maxbibnames = 30, maxcitenames = 2, %
uniquename = init, uniquelist = minyear, % uniquelist = minyear only cites 2nd author if first author and year are identical
date = year,
url = false, isbn = false]{biblatex} % package for the bibliography
\addbibresource{biblio.bib}
\usepackage{hyperref} % crossreferencing

\begin{document}

\section{Introduction}
\citep{Zheng2016}
\citep{Pennacchietti2018}

S\'{\i}

\printbibliography

\end{document}

为了解决这个问题,我发现了不同的尝试,例如

  • 按照建议使用 {\'i}这个答案有效。但是,对于自动导入的参考书目条目,找到所有有问题的字符是件很乏味的事,尤其是当错误可能出现在建议的不同预组合字符组合中时这里

  • --output-safechars因此,我尝试使用建议的选项配置 biblatex在这个答案中。从终端手动编译,似乎工作正常。

  • 但是,我更喜欢使用latexmk(尤其是当编译工作流需要多次运行各种编译器时)进行编译。然后我发现这个答案,解释如何将biber选项传递给latexmk。我在本地目录中创建了文件latexmk,其中包含行$biber='biber --output-safechars';。这终于起作用了。

然而,我担心整个工作流程超出了我老板愿意忍受 LaTeX 的优势的范围。

所以我想我这里有两个选择:

1) 有没有办法自动删除有问题的字符?我发现这个答案,但恐怕这远远超出了我的理解范围。

2) 如果没有,是否有任何方法可以强制latexmk/biber正确编译此类字符,而无需任何额外的文件或设置?理想情况下,我正在寻找一些可以在 .tex 文件的开头“悄悄潜入”的神奇命令。

编辑:我刚刚在整个文档上测试了工作流程.latexmkrc,现在出现了错误

未定义控制序列。在命令后的一行中\printbibliography。显然,我的 200 多个参考书目中的某些条目与该--output-safechars选项冲突。

我会对此进行研究,但看起来这个工作流程最终可能对我来说也不起作用。

答案1

对于biblatexBiber 来说,最好的解决方案™ 当然是使用正确的 Unicode 字符(最好是预制字符:Åström,不是源文件中组合字符:Åström 的组合。

author    = {Qinsi Zheng and Steffen Jockusch and Gabriel G. Rodríguez-Calero
             and Zhou Zhou and Hong Zhao and Roger B. Altman and Héctor D. Abruña
             and Scott C. Blanchard},

这种解决方案的好处是它更容易阅读,只需工作即可,并且避免了 BibTeX 所需的额外括号(并且为了简单和向后兼容而保留在 Biber 中,这些括号可能会破坏字距调整,并且对于 Biber 来说没有必要,请参阅如何在参考书目中书写“ä”及其他变音符号和重音字母?为什么 BibTeX 需要它们)。


如果这不可能,并且您无法在源中替换{\'{\i}}{\'i}则可以尝试使用源映射,如下所示保丽康回答从 Biber 1.9 升级到 Biber 2.1 后出现输入编码错误

该方法的逻辑缺点是您需要为每个可能出现问题的组合添加替换规则。

为了比 PLK 的答案提供一些额外的好处,下面的代码使用新的循环功能来替换\`{\i}\'{\i}\^{\i}\"{\i}所有 Latin-1 无点-i 组合)(希望)所有有意义的字段。

\documentclass{article}
\usepackage[english]{babel}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\usepackage[style = authoryear, backend = biber, maxbibnames=999]{biblatex}
\addbibresource{\jobname.bib}

\DeclareDatafieldSet{setall}{
  \member[datatype=literal]
  \member[datatype=name]
  \member[field=journal]% journal is special since it is
                        % actually journaltitle
}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map[overwrite, foreach={setall}]{
      % \`{\i}
      \step[fieldsource=\regexp{$MAPLOOP},
            match=\regexp{\x{0131}\x{0300}},
            replace=\regexp{\x{00EC}}]
      % \'{\i}
      \step[fieldsource=\regexp{$MAPLOOP},
            match=\regexp{\x{0131}\x{0301}},
            replace=\regexp{\x{00ED}}]
      % \^{\i}
      \step[fieldsource=\regexp{$MAPLOOP},
            match=\regexp{\x{0131}\x{0302}},
            replace=\regexp{\x{00EE}}]
      % \"{\i}
      \step[fieldsource=\regexp{$MAPLOOP},
            match=\regexp{\x{0131}\x{0308}},
            replace=\regexp{\x{00EF}}]
    }
  }
}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@article{itest,
  author  = {Lo{\"{\i}}c Rodr{\'{\i}}guez-Calero},
  title   = {Lor{\"{\i}}m {\'{\i}}psum and {\`{\i}}v{\^{\i}}n},
  journal = {Dol{\"{\i}}r s{\'{\i}}t},
  note    = {Am{\"{\i}}t cons{\'{\i}}ctur},
  date    = {2018},
}
@article{Zheng2016,
  author    = {Qinsi Zheng and Steffen Jockusch
               and Gabriel G. Rodr{\'{\i}}guez-Calero
               and Zhou Zhou and Hong Zhao and Roger B. Altman
               and H{\'e}ctor D. Abru{\~n}a and Scott C. Blanchard},
  title     = {Intra-molecular triplet energy transfer is a general
               approach to improve organic fluorophore photostability},
  journal   = {Photochemical {\&} Photobiological Sciences},
  year      = {2016},
  volume    = {15},
  number    = {2},
  pages     = {196--203},
  doi       = {10.1039/c5pp00400d},
}
\end{filecontents}

\begin{document}
\parencite{Zheng2016}
\cite{itest}

\printbibliography
\end{document}

Rodríguez-Calero,Loïc(2018)。 “Lorïm ípsum 和 ìvîn”。在:Dolïr sít。同意。


为什么这个 Unicode 业务会成为一个问题?

Unicode 通过在基本字形后添加组合标记来组合字符。LaTeX 的工作方式恰恰相反:组合重音符号添加到字形之前(作为以基本字形为参数的宏)。

Biber '解析' LaTeX 字符宏并将其转换为 Unicode 字符,以便进行排序等。这是根据将宏简单转换为 Unicode 点和复杂的 Unicode 规则完成的。

组合涉及的字符尤其复杂,因为 LaTeX 通常以“无点 i”(\i-ı,U+0131)为基础来表示其字符,以避免重音和标题冲突,而 Unicode 似乎更喜欢基于“小 i”(i-i,U+0069)的组合字符http://unicode.org/faq/char_combmark.html#22。这意味着\'i会转换为 í ( í,U+00ED),但\'\i会转换为 ı́ ( ı́,U+0131 + U+0301,无点 i 和重音符号的组合)。

LaTeXinputenc只能处理 Unicode 的一个合理子集,并且无法处理ı́(U+0131 + U+0301),但可以í很好地处理 (U+00ED)。

另请参阅 PLK 的解释链接的答案以及评论https://github.com/plk/biber/issues/65https://github.com/plk/biblatex/issues/819


另一个不需要这样的技巧但可能与您的工作流程不兼容的解决方案是使用适当的 Unicode 引擎(如 LuaLaTeX 或 XeLaTeX)和具有正确字距重音的字体(例如 Linux Libertine)。

答案2

U+0301 是组合重音符。PDFLaTeX 无法处理它们,只能处理预组合字符。

因此,您的选择是将有问题的字符转换为预组合(NFC 或 NFKC)形式,或切换到现代引擎。

相关内容