美文网首页
参考文献排序

参考文献排序

作者: 破旧的大卡车 | 来源:发表于2018-11-28 11:01 被阅读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()
    

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

    相关文章

      网友评论

          本文标题:参考文献排序

          本文链接:https://www.haomeiwen.com/subject/xnzoqqtx.html