pybtex 是否支持 .bib 文件中的重音/特殊字符?

Dra*_*uan 6 python latex bibtex

from pybtex.database.input import bibtex
parser = bibtex.Parser()
bibdata = parser.parse_file("sample.bib")
Run Code Online (Sandbox Code Playgroud)

上面的代码片段在解析 .bib 文件时效果非常好,但它似乎不支持重音字符,例如{\"u}\"{u}(来自 LaTeX)。就像确认pybtex是否支持。

例如,根据LaTeX/Special CharactersHow to write “ä” 和其他变音和重音字母在参考书目中?,\"{o}应转换为ö, 也应转换为{\"o}

Mat*_*aes 4

更新:自 0.20 版本起,pybtex 现在支持此功能。

\n\n

目前还没有。但是您可以在使用 pybtex 处理之前使用 Latex 编解码器读取 bib 文件,例如使用https://pypi.python.org/pypi/latexcodec/该编解码器将为您将(多种)LaTeX 命令转换为 unicode 。

\n\n

但是,您必须在后处理阶段删除括号。为什么?为了优雅地处理 bibtex 代码,\\"{U} 必须转换为{\xc3\x9c}而不是变成\xc3\x9c以防止其在标题中小写。以下示例演示了此行为:

\n\n
import pybtex.database.input.bibtex\nimport pybtex.plugin\nimport codecs\nimport latexcodec\n\nstyle = pybtex.plugin.find_plugin(\'pybtex.style.formatting\', \'plain\')()\nbackend = pybtex.plugin.find_plugin(\'pybtex.backends\', \'latex\')()\nparser = pybtex.database.input.bibtex.Parser()\nwith codecs.open("test.bib", encoding="latex") as stream:\n    # this shows what the latexcodec does to the source\n    print stream.read()\nwith codecs.open("test.bib", encoding="latex") as stream:\n    data = parser.parse_stream(stream)\nfor entry in style.format_entries(data.entries.itervalues()):\n    print entry.text.render(backend)\n
Run Code Online (Sandbox Code Playgroud)\n\n

其中 test.bib 是

\n\n
@Article{test,\n  author =       {John Doe},\n  title =        {Testing \\"UTEST \\"{U}TEST},\n  journal =      {Journal of Test},\n  year =         {2000},\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将打印 Latexcodec 如何将 test.bib 转换为 unicode(为了可读性而进行编辑):

\n\n
@Article{test,\n   author = {John Doe}, title = {Testing \xc3\x9cTEST {\xc3\x9c}TEST},\n   journal = {Journal of Test}, year = {2000},\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来是 pybtex 渲染的条目(在本例中,生成乳胶代码):

\n\n
John Doe.\n\\newblock Testing \xc3\xbctest {\xc3\x9c}test.\n\\newblock \\emph{Journal of Test}, 2000.\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果编解码器去掉括号,pybtex 就会错误地转换大小写。此外,在(病理)情况下,例如journal = {\\"u}显然括号也不能被删除。

\n\n

一个明显的缺点是,如果渲染到非 LaTeX 后端,则必须在后处理阶段删除括号。但无论如何你可能想要这样做来处理任何特殊的 LaTeX 命令(例如\\url)。如果 pybtex 能够以某种方式为您做到这一点,那就太好了,但目前还没有。

\n