查找问题条目的系统自动化方法

查找问题条目的系统自动化方法

将我的 bibtex .tex 文件切换为 UTF-8 并导入一些新条目后,我仍在尝试让 biber 工作。

INFO - This is Biber 1.9
INFO - Config file is '/Users/myname/.biber.conf'
INFO - Logfile is 'Diss.blg'
INFO - Reading 'Diss.bcf'
INFO - Using all citekeys in bib section 0
INFO - Processing section 0
INFO - Looking for bibtex format file 'references.bib' for section 0
INFO - Decoding LaTeX character macros into UTF-8
INFO - Found BibTeX data source 'references.bib'
WARN - Overwriting field 'year' with year value from field 'date' for entry '1991'
WARN - Overwriting field 'year' with year value from field 'date' for entry 'Thomas-Vielma2008'
FATAL - Caught signal: SEGV
Likely your .bib has a very bad entry which causes libbtparse to crash: 

我已经清理了我的 bibtex 文件中的很多内容,但我的 pdf 中仍然没有参考书目,因为 biber 似乎遇到了一些问题,但在 .blg 日志文件中我没有找到关于有问题的行的提示。

  • 是否有其他日志文件可以告诉我这里出了什么问题?
  • 我怎样才能尽快解决这个问题?
  • 看来 biber 处理所有条目,即使它们没有被引用 - 这是正确的吗?
  • biber 是否有一个选项,可以让它对条目不那么“挑剔”,但仍然为工作人员提供至少一个参考书目?
  • .bib 文件中大约有 3000 个条目,因此无法手动测试每个条目。有没有办法自动执行此测试过程或打印出最后处理的条目?

答案1

查找问题条目的系统自动化方法

有人建议删除一半的 bibtex 条目,这样可以进一步减少嫌疑人的数量。

由于我很懒(并且不知道如何轻松地做到这一点),我使用了以下半自动方法(全部在以下方法中Terminal完成MacOS X 10.6

  • 在一个空目录中创建了我的 .bib 文件的副本
  • mkdir bibentries
    创建了一个名为 bibentries 的新目录
  • split -p @ -a 4 mybibfilename.bib ./bibentries/
    将我的 bib 文件拆分为每个条目一个文件,所有文件都创建在 bibentries 目录中
  • cd bibentries
    切换到 bibentries 目录
  • for old in *; do mv $old $old.bib; done
    为 bibentries 目录中的所有文件添加了扩展名 .bib
  • rm -rfbiber --cache``
    清除 biber 缓存
  • sh ~/bin/batchbiber.sh
    在所有文件上运行 biber(参见下面的 bash 脚本)

脚本 batchbiber.sh (位于我的主路径~/bin/)

(如果您的主路径中没有~/bin/,您可以使用 创建它mkdir bin。)

#!/bin/bash
# script processes all .bib files in current direcory with "biber --tool"
let n=0 # counter for files
# count files and print their number
for j in *.bib; do 
let n=n+1
done
echo $n bibtex files found
# process files one by one with biber --tool
for j in *.bib; do 
biber --tool $j
done
  • grep -i SEGV *.blg
    在创建的 .blg 文件中搜索错误消息

...然后,我发现了一个有此错误的条目,并很容易就发现了问题所在:一个多余的逗号:

 Author                   = {Liao,Hongmei and Coyle, ,Thomas W.},

:-)

答案2

已调整 MostlyHarmless 的 Windows 答案,因为带有 git bash 的 split 命令不支持-p @参数。此后 batchbiber.sh 脚本运行正常 :)

mkdir bibentries
split -t @ -l 1 -a 4 mybibfilename.bib ./bibentries/
cd bibentries
for old in *; do mv $old $old.bib; done
for file in *; do
  sed -z -i "1s/^/@/" "$file" &&
  truncate -s-1 $file
done
rm aaaa.bib
rm -rfbiber --cache

因为-t在@后面做了分隔,所以我们需要在每个文件的第一个位置添加@,并删除文件末尾的最后一个字符(也是@)

for file in *; do
  sed -z -i "1s/^/@/" "$file" &&
  truncate -s-1 $file
done

因为第一个文件(aaa.bib)只包含@,所以我们将其删除

rm aaaa.bib

相关内容