参考文献排序

2018-11-28  本文已影响21人  破旧的大卡车

latex编译的时候, 提示有重复的参考文献. 我就想着那我们用vim来排序吧.

  1. 假设我们有如下的参考文献(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},
}
  1. 由于vim只支持对一行排序, 故先将每个参考文献换成一行:
:g/^@/,/^}$/s/\r\|\n/の

其中の是搜狗拼音de打出来的, 你可以换成任何一个不常用的符号.

这里有个小小的bug, 我们需要先在每个参考文献中插入空行再替换:

:g/^}$/s//}\r
  1. 使用vim自带的排序:sort:
:%sort

或者按照参考文献的key排序

:%sort r /{[A-z0-9]\+,の/
  1. 将の换回换行符
:g/の/s//\r/g
  1. 移除空行
: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()

有了上面这些操作, 是不是写作更加方便了呢?

上一篇下一篇

猜你喜欢

热点阅读