티스토리 툴바


공부/LaTeX2011/12/31 08:53
보통 참고문헌을 정리하기 위한 목적으로 많이 사용되는 것이 EndNote라고 한다. 하지만 이 프로그램은 MS Windows 환경만을 지원하는데다가, 특히 MS Word와의 연계가 좋은 것으로 알려져있다. 게다가 EndNote는 bibtex 포맷을 지원하지 않기 때문에 나같이 LaTeX 환경을 좋아하는 사람에게는 그다지 사용하고 싶은 툴은 아닌 것 같다. 대신에 나는 Jabref를 사용하는데 이 녀석은 기본적으로 bibtex 파일포맷으로 저장해주는데다가 Open software이면서 EndNote에서 제공하는 기능 중 많은 부분을 제공하고 있기때문에 EndNote 대신으로 크게 불편하지 않게 사용할 수 있는 것 같다. 물론 java로 만들어져있다는 것이 마음에 걸리긴 하지만.

이 프로그램에서 제공해주는 기능중에 Push to XXX 라는 것이 있다. 이 기능은 Jabref 에서 선택한 citation을 편집중인 editor로 citation key를 보내주는 역할을 하는데, 물론 수작업으로 citation key를 찾아서 TeX 편집창에 직접 넣을 수도 있지만 여러개의 citation을 인용할 때 일일이 key를 찾아서 넣는 것도 만만치만은 않은 일이다. 그런데 이 기능 중에서 Emacs와 동작하는 기능이 제대로 작동하지 않는 문제가 있다. 원인은 push 기능을 구현하기 위해서 jabref가 gnuserv/gnuclient를 이용하는데 Emacs가 23으로 판올림하면서 인터페이스를 gnuserv/gnuclient에서 emacsclient로 바꾸었기 때문이다. 그래서 Jabref 사이트에서 gnuclient 대신 emacsclient를 이용할 수 있게 하는 plugin (http://jabref.sourceforge.net/resources.php) 제공하고 있는데 emacsclient에서 사용하는 문법이 바뀌기 전의 내용을 반영하고 있어서 이 또한 제대로 동작하지 않는다. 인터넷을 뒤진 결과 plugin 소스파일 중에서 PushToEmacsClient.java (소스파일을 받아서 열어보면 이 파일 하나밖에 없다.)을 열어 다음과 같은 줄을 찾아서
   new String[] {"emacsclient", "--eval",
       "(insert \\\"\\\\" + 
       Globals.prefs.get("citeCommandEmacs").replaceAll("\\\\", "\\\\\\\\") +
       "{" + keys + "}\\\")"}
    :   // Linux gnuclient escaping:
        // java string: "(insert \"\\\\cite{Blah2001}\")"
        // so sh receives: (insert "\\cite{Blah2001}")
        // so emacs receives: (insert "\cite{Blah2001}")
    new String[] {"emacsclient", "--eval",
       //              new String[] {"gnuclient", "-batch", "-eval",
       "(insert \"" +
       Globals.prefs.get("citeCommandEmacs").replaceAll("\\\\", "\\\\\\\\") +
       "{" + keys + "}\")"};

아래와 같이 고쳐주면 된다고 한다. (출처 http://manuelonsoftware.wordpress.com/2010/05/10/fixing-jabref-to-work-with-emacs23-in-ubuntu-10-04/)
new String[] {"emacsclient", "--eval",
        "(with-current-buffer (window-buffer) 
         (insert \\\"\\\\" + 
         Globals.prefs.get("citeCommandEmacs").replaceAll("\\\\", "\\\\\\\\") +
         "{" + keys + "}\\\"))"}
    :        // Linux gnuclient escaping:
        // java string: "(insert \"\\\\cite{Blah2001}\")"
        // so sh receives: (insert "\\cite{Blah2001}")
        // so emacs receives: (insert "\cite{Blah2001}")
    new String[] {"emacsclient", "--eval",
//      new String[] {"gnuclient", "-batch", "-eval",
        "(with-current-buffer (window-buffer)  
        (insert \"" + Globals.prefs.get("citeCommand.replaceAll("\\\\", "\\\\\\\\") +
        "{" + keys + "}\"))"};

하지만 내가 해본 결과 emacsclient 경로를 찾지 못하는 문제가 있는 것을 알았다. 이런저런 시행착오 끝에 직접 emacsclient를 full path로 적어주고 실행해본 결과 제대도 동작하는 것을 확인하였다. ( 내 컴의 경우에는 /usr/bin/emacsclient 로 되어있다.).

덧붙여서, plugin을 많이 사용하는 것도 아닌데 emacs 하나때문에 plugin을 사용하는게 싫어서 직접 소스코드를 수정해서 재컴파일해서 사용중이다. 파일이름은 src/java/net/sf/jabref/external/PushToEmacs.java 을 수정하면 되는데 수정내용은 plugin 수정 내용과 동일하다. 참고를 위해서 patch 파일을 첨부한다.

P.S. 현재 Jabref 2.6 을 사용중인데 최신 버전은 Jabref 2.7.2 이다. 하지만 소스파일을 열어본 결과 Push to emacs 기능은 여전히 gnuclient를 사용하고 있는 것을 확인하였다.




Posted by 다루치기