我如何从 biber 中获取错误引用的行号?

我如何从 biber 中获取错误引用的行号?

我让我的女朋友用 LaTeX 写她的本科毕业论文,她非常喜欢它。然而她还是会犯一些错误。通常我可以很容易地帮她改正。但这个错误让我抓狂:

WARN - I didn't find a database entry for '[' (section 0)
WARN - I didn't find a database entry for '1' (section 0)

TEX 文件非常大,因此偶然发现这一点并不容易。我尝试使用比文字搜索更智能的正则表达式在整个文档中搜索、和。我只找到了几个{1}正确的,但除此之外,绝对没有任何东西可以解释警告。{[}[1]

BLG 文件也没有提供太多信息:

[786] Utils.pm:304> WARN - I didn't find a database entry for '[' (section 0)
[787] Utils.pm:304> WARN - I didn't find a database entry for '1' (section 0)

输出:pdflatex, 这日志, 这巴比伦, 这血红蛋白基础型

我也尝试过如何让 biber 告诉我要查看的行号。但我就是找不到任何方法来生成它。

有人有办法吗?

答案1

bcf 文件相当长,但结构良好,并且您只对引用键感兴趣。

因此,如果你搜索,bcf:citekey你很快就能找到以

  <bcf:citekey order="1">goepel:2020</bcf:citekey>
  <bcf:citekey order="2">boyd:un:2019</bcf:citekey>

您只需在那里搜索>1<>[您就会找到

<bcf:citekey order="100">lay:2015</bcf:citekey>
<bcf:citekey order="101">[</bcf:citekey>
<bcf:citekey order="102">umweltbundesamt:kyoto</bcf:citekey>
 ....
<bcf:citekey order="137">cusato:2017</bcf:citekey>
<bcf:citekey order="138">1</bcf:citekey>
<bcf:citekey order="139">cusato:2017</bcf:citekey>

这意味着有问题的键位于 {lay:2015} 和 {cusato:2017} 之后,应该不难找到。

查找引文的第二个选项是删除 bbl 文件。然后 LaTeX 会对每个未定义的引文发出警告,您应该在日志文件中看到

LaTeX Warning: Citation '1' on page 1 undefined on input line 13.

答案2

更新

biblatexv3.17 开始,行号警告即使在 Biber 运行后仍然有效,并且应该能够更具体地告诉您有问题的引用在哪里。另请参阅https://github.com/plk/biblatex/issues/1117

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[backend=biber, style=authoryear]{biblatex}

\addbibresource{biblatex-examples.bib}

\begin{document}
\parencite[vgl.][][254]{sigfridsson}[.]

\parencite[vgl.][]16{worman}

\autocite{geer}

\parencite[vgl.][][254]{sigfridsson}[.]

\printbibliography
\end{document}

现在生产

Package biblatex Warning: The following entry could not be found
(biblatex)                in the database:
(biblatex)                1
(biblatex)                Please verify the spelling and rerun
(biblatex)                LaTeX afterwards.


Package biblatex Warning: The following entry could not be found
(biblatex)                in the database:
(biblatex)                [
(biblatex)                Please verify the spelling and rerun
(biblatex)                LaTeX afterwards.

)

LaTeX Warning: Citation '[' on page 1 undefined on input line 11.


LaTeX Warning: Citation '1' on page 1 undefined on input line 13.


LaTeX Warning: Citation '[' on page 1 undefined on input line 17.

旧答案

biblatex目前没有提及 Biber 标记为缺失的条目的行号。如果在这种情况下您想要获取行号,请将以下重新定义应用于\blx@citation@entry

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[backend=biber, style=authoryear]{biblatex}

\makeatletter
\def\blx@citation@entry#1#2{%
  \blx@bibreq{#1}%
  \ifinlist{#1}\blx@cites
    {}
    {\listgadd{\blx@cites}{#1}}%
  \blx@auxwrite\@mainaux{}{\string\abx@aux@cite{#1}}%
  \ifinlistcs{#1}{blx@segm@\the\c@refsection @\the\c@refsegment}
    {}
    {\listcsgadd{blx@segm@\the\c@refsection @\the\c@refsegment}{#1}}%
  \blx@auxwrite\@mainaux{}{\string\abx@aux@segm{\the\c@refsection}%
                                               {\the\c@refsegment}%
                                               {\detokenize{#1}}}%
  \blx@ifdata{#1}
    {}
    {\ifcsdef{blx@miss@\the\c@refsection}
       {\ifinlistcs{#1}{blx@miss@\the\c@refsection}
          {\@latex@warning{#2{#1}}}
          {\blx@logreq@active{#2{#1}}}}
       {\blx@logreq@active{#2{#1}}}}%
  \blx@hook@entrykey{#1}}
\makeatother

\addbibresource{biblatex-examples.bib}

\begin{document}
\parencite[vgl.][][254]{sigfridsson}[.]

\parencite[vgl.][]16{worman}

\autocite{geer}

\parencite[vgl.][][254]{sigfridsson}[.]

\printbibliography
\end{document}

然后.log输出有

Package biblatex Warning: The following entry could not be found
(biblatex)                in the database:
(biblatex)                1
(biblatex)                Please verify the spelling and rerun
(biblatex)                LaTeX afterwards.


Package biblatex Warning: The following entry could not be found
(biblatex)                in the database:
(biblatex)                [
(biblatex)                Please verify the spelling and rerun
(biblatex)                LaTeX afterwards.

)

LaTeX Warning: Citation '[' on page 1 undefined on input line 34.


LaTeX Warning: Citation '1' on page 1 undefined on input line 36.


LaTeX Warning: Citation '[' on page 1 undefined on input line 40.

答案3

我也想过用二分查找法,只是反过来玛丽金的建议。

我在文档中间放置了一个不存在的标记引用,并根据 biber 警告的顺序变化,以减少对数2步的方式向前或向后移动。这样,我就能找出有错误的两个段落:

\parencite[vgl.][][254]{key1}[.]

\parencite[vgl.][]16{key2}

如果您不想重新实现 LaTeX 语法,则使用正则表达式很难找到平衡括号。

我仍然感到难过,因为没有一个参数/工具可以帮助你解决这个问题。

相关内容