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

时间:2013-11-03 09:13:44

标签: python latex bibtex

from pybtex.database.input import bibtex
parser = bibtex.Parser()
bibdata = parser.parse_file("sample.bib")

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

例如,根据LaTeX/Special CharactersHow to write “ä” and other umlauts and accented letters in bibliography?\"{o}应该转换为ö{\"o}也是如此。

2 个答案:

答案 0 :(得分:3)

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

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

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

import pybtex.database.input.bibtex
import pybtex.plugin
import codecs
import latexcodec

style = pybtex.plugin.find_plugin('pybtex.style.formatting', 'plain')()
backend = pybtex.plugin.find_plugin('pybtex.backends', 'latex')()
parser = pybtex.database.input.bibtex.Parser()
with codecs.open("test.bib", encoding="latex") as stream:
    # this shows what the latexcodec does to the source
    print stream.read()
with codecs.open("test.bib", encoding="latex") as stream:
    data = parser.parse_stream(stream)
for entry in style.format_entries(data.entries.itervalues()):
    print entry.text.render(backend)

test.bib是

@Article{test,
  author =       {John Doe},
  title =        {Testing \"UTEST \"{U}TEST},
  journal =      {Journal of Test},
  year =         {2000},
}

这将打印latexcodec如何将test.bib转换为unicode(为便于阅读而编辑):

@Article{test,
   author = {John Doe}, title = {Testing ÜTEST {Ü}TEST},
   journal = {Journal of Test}, year = {2000},
}

后跟pybtex渲染条目(在本例中,生成乳胶代码):

John Doe.
\newblock Testing ütest {Ü}test.
\newblock \emph{Journal of Test}, 2000.

如果编解码器要删除括号,pybtex会错误地转换该情况。此外,在(病理)案例中,journal = {\"u}显然也无法删除括号。

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

答案 1 :(得分:0)

pylatexenc(https://pypi.org/project/pylatexenc/

from pylatexenc.latex2text import LatexNodes2Text 

latex_text = 'Gl{\\"o}ckner'
text = LatexNodes2Text().latex_to_text(latex_text)

print(text) # Glöckner