参考文献排序
2018-11-28 本文已影响21人
破旧的大卡车
latex编译的时候, 提示有重复的参考文献. 我就想着那我们用vim来排序吧.
- 假设我们有如下的参考文献(bib):
@article {EellsJamesSampson1964Harmonic,
AUTHOR = {Eells, Jr., James and Sampson, J. H.},
TITLE = {Harmonic mappings of {R}iemannian manifolds},
JOURNAL = {Amer. J. Math.},
FJOURNAL = {American Journal of Mathematics},
VOLUME = {86},
YEAR = {1964},
PAGES = {109--160},
ISSN = {0002-9327},
MRCLASS = {53.72 (57.50)},
MRNUMBER = {0164306},
MRREVIEWER = {J. A. Wolf},
DOI = {10.2307/2373037},
URL = {https://doi.org/10.2307/2373037},
}
@article {Helein1990Regularite,
AUTHOR = {H\'{e}lein, Fr\'{e}d\'{e}ric},
TITLE = {R\'{e}gularit\'{e} des applications faiblement harmoniques entre une
surface et une sph\`ere},
JOURNAL = {C. R. Acad. Sci. Paris S\'{e}r. I Math.},
FJOURNAL = {Comptes Rendus de l'Acad\'{e}mie des Sciences. S\'{e}rie I.
Math\'{e}matique},
VOLUME = {311},
YEAR = {1990},
NUMBER = {9},
PAGES = {519--524},
ISSN = {0764-4442},
MRCLASS = {58E20 (35J45)},
MRNUMBER = {1078114},
MRREVIEWER = {John C. Wood},
}
@article {GastelScheven2009Regularity,
AUTHOR = {Gastel, Andreas and Scheven, Christoph},
TITLE = {Regularity of polyharmonic maps in the critical dimension},
JOURNAL = {Comm. Anal. Geom.},
FJOURNAL = {Communications in Analysis and Geometry},
VOLUME = {17},
YEAR = {2009},
NUMBER = {2},
PAGES = {185--226},
ISSN = {1019-8385},
MRCLASS = {58E20 (35J48 46E35 49N60)},
MRNUMBER = {2520907},
MRREVIEWER = {Anna Zatorska-Goldstein},
DOI = {10.4310/CAG.2009.v17.n2.a2},
URL = {https://doi.org/10.4310/CAG.2009.v17.n2.a2},
}
- 由于vim只支持对一行排序, 故先将每个参考文献换成一行:
:g/^@/,/^}$/s/\r\|\n/の
其中の是搜狗拼音de打出来的, 你可以换成任何一个不常用的符号.
这里有个小小的bug, 我们需要先在每个参考文献中插入空行再替换:
:g/^}$/s//}\r
- 使用vim自带的排序
:sort
:
:%sort
或者按照参考文献的key排序
:%sort r /{[A-z0-9]\+,の/
- 将の换回换行符
:g/の/s//\r/g
- 移除空行
:g/^$/d
使用宏
那么是否每次都要执行上面几个操作步骤呢? 当然我们可以用到下面的宏来自动执行. 将下面的代码存入当前工作目录(:set acd)的.vimrc
文本中:
let @b=':norm zR^M'
\. ':g/\(@\w\+\){/s//\1 {^M'
\. ':g/^}$/s//}\r^M'
\. ':g/^@/,/^}$/s/\r\|\n/の/g^M'
\. ':%sort r /{[0-9A-Za-z_]\+,の/^M'
\. ':g/の/s//\r/g^M'
\. ':g/^$/d^M'
\. ':norm zM^M'
\. ':w^M'
然后执行:so %
, 这时我们就定义好了这个宏b
; 在bib文件中, 当你添加了新的参考文献, 那么可以执行@b
来实现排序.
这里需要注意, ^M
实际上代表的是回车键, 在vim中可以通过ctrl+v ctrl+m来输入。我发现上述命令不一定能:so %
成功。 此时可以选中该命令(^v$), 然后复制(y), 最后将其粘贴到vim控制台并运行(:ctrl+R")。
当然, 你也可以在.vimrc
中添加自动执行命令:
au! BufWritePost *.bib :norm @b<CR>
最后, 我们还可以在你主要的.vimrc
中添加如下函数来实现自动载入上面定义的.vimrc
" Custom vimrc
fu! CustomConfig()
let custom_vimrc = expand('%:p:h').'/.vimrc'
if filereadable(custom_vimrc)
exec 'so' custom_vimrc
endif
endfu
" Auto Load .vimrc in the Working Root
"set exrc
au! BufNewFile,BufReadPost,BufEnter *.tex call CustomConfig()
有了上面这些操作, 是不是写作更加方便了呢?