도구 연동(CSL / arXiv / 관리 프로그램)

참고문헌에서 실제로 시간을 잡아먹는 것은 .bib를 타이핑하는 일이 아닙니다. 학위논문 하나와 투고 논문 세 편, 공저자 두 명 사이에서 단 하나의 .bib를 모순 없이 유지하는 일입니다. 그래서 LaTeX의 문헌 도구는 대부분 입력을 빠르게 하는 도구라기보다, 입력한 뒤에 어디가 망가졌는지 찾아 주는 도구로 설계되어 있습니다. 이 페이지에서는 DOI나 arXiv에서 서지 정보를 가져오고, 지저분한 항목을 씻어 내고, 중복을 없애고, 인용 키를 고정해 공저자에게 넘기기까지의 전 과정을 Zotero와 JabRef 같은 문헌 관리 소프트웨어와, TeX Live에 이미 들어 있는 bibcopcheckcitesbiber --tool 양쪽으로 따라갑니다.

DOI나 arXiv에서 BibTeX 가져오기

논문에 DOI가 있다면 .bib 항목은 명령 한 줄이면 얻을 수 있습니다. 원리는 content negotiation(내용 협상) 입니다. doi.org에 HTTP 헤더로 “BibTeX 형식으로 돌려 달라”고 알리면, 그 DOI를 등록한 기관——학술 논문이라면 대개 Crossref——이 서지 데이터를 BibTeX 항목으로 정리해 돌려줍니다. 출판사 페이지를 열 필요조차 없습니다. DOI 자체가 API인 셈입니다.

terminal
# fetch BibTeX for a DOI; -L follows the redirect to the registration agency
curl -LH "Accept: application/x-bibtex" \
  "https://doi.org/10.1145/3186893" >> refs.bib

-L을 빼면 아무것도 돌아오지 않습니다. doi.org는 어느 기관이 그 DOI의 메타데이터를 가지고 있는지 판단해 그쪽으로 리다이렉트하는 창구일 뿐이라, 리다이렉트를 따라가지 않으면 헛걸음으로 끝납니다. 명령줄이 번거롭다면 같은 content negotiation을 웹으로 감싼 doi2bib.org에 DOI를 붙여 넣으면 됩니다(arXiv ID와 PubMed ID도 받습니다). arXiv 프리프린트는 초록 페이지의 “Export BibTeX citation”에서, Google Scholar는 각 결과의 “Cite → BibTeX”에서 같은 것을 꺼낼 수 있습니다. 어느 경로로 가든 손으로 치는 글자는 거의 없습니다.

가져온 BibTeX를 그대로 쓸 수 없는 이유

내보내는 쪽은 자기 데이터베이스에 들어 있는 문자열을 그대로 뱉을 뿐, LaTeX의 사정을 모르기 때문입니다. 같은 논문을 출판사 사이트, Crossref, Google Scholar 세 곳에서 가져오면 세 개가 모두 다른 BibTeX가 됩니다. 깨지는 곳은 매번 똑같은 네 군데이고, 하나같이 조판 단계에 가서야 드러납니다.

  • 대문자가 보호되지 않습니다. 제목에서 {DNA}, {Fourier}처럼 중괄호로 감싸지 않으면 plain 계열 스타일이 소문자로 바꿔 “dna”, “fourier”가 됩니다. 자세한 원리는 문헌 데이터베이스 페이지에서 다룹니다.
  • 학술지명이 줄었다 안 줄었다 합니다. 같은 학술지가 한 번은 Comput. J., 한 번은 The Computer Journal로 들어와 참고문헌 목록 안에서 표기가 갈립니다. 투고 규정은 대개 둘 중 하나로 통일할 것을 요구합니다.
  • 항목 유형이 틀립니다. 학회 논문이 @article이나 @misc로 내보내지는 일이 잦고, booktitle 없는 @inproceedings는 조판하면 엉망이 됩니다.
  • arXiv판을 출판판으로 착각합니다. 프리프린트 BibTeX에는 journaldoi도 없는 경우가 많아, 논문이 심사지에 실린 뒤에도 옛 기록을 계속 인용하게 됩니다.

.bib 검사와 정규화 — bibcop과 biber --tool

위의 네 가지는 눈으로 찾기보다 린터에게 맡기는 편이 확실합니다. TeX Live에는 .bib 전용 린터 bibcop 이 처음부터 들어 있어, 따로 설치할 것 없이 bibcop refs.bib만 치면 됩니다. 돌아오는 것은 행 번호의 나열이 아니라 완결된 문장으로 된 지적입니다. 예를 들면 Do not shorten the words in the journal, such as Comput., All major words in the title must be capitalized, A mandatory doi tag for @article is missing 같은 식입니다. 읽을 수 있는 문장으로 혼나기 때문에 무엇을 고쳐야 할지 헤맬 일이 없습니다.

terminal
# lint a database in place
bibcop refs.bib

# reformat and sort every entry; also reports duplicate keys
biber --tool --output-align --output-fieldcase=lower \
  --output-file=clean.bib refs.bib

정규화 자체는 biber --tool 이 맡습니다. 문서를 처리하는 보통 모드와 별개로 biber에는 tool 모드 가 있어, .bib를 넣으면 .bib를 내놓는 독립 필터로 동작합니다. 필드를 열에 맞춰 다시 배치하고, 항목을 정렬하며, 키가 겹치면 Duplicate entry key: ... skipping이라고 경고하고 한쪽을 버립니다. 다만 여기에 함정이 하나 있습니다. tool 모드의 출력은 기본적으로 biblatex 필드명으로 정규화되므로 yeardate로, journaljournaltitle로 바뀝니다. biblatex 문서라면 바라던 변환이지만, 순수 BibTeX에 넘길 .bib를 통과시키면 참고문헌 목록에서 연도와 학술지명이 사라집니다.

도구하는 일입수 경로
bibcop.bib를 검사해 축약·대문자·필수 필드 누락을 영문 문장으로 지적TeX Live 기본 포함
biber --tool.bib를 정형·정렬하고 중복 키를 경고(기본적으로 biblatex 필드명으로 변환)TeX Live 기본 포함
checkcites인용되지 않은 항목과, 인용됐지만 .bib에 없는 키를 나열TeX Live 기본 포함
bibexport.aux를 읽어 실제로 인용된 항목만 새 .bib로 추출TeX Live 기본 포함
bibdoiaddCrossref에 질의해 빠진 doi 필드를 채움(crossrefware의 일부)TeX Live 기본 포함
bibtex-tidy정형에 더해 DOI·키·제목으로 중복을 찾아내고 --merge로 합칠 수 있음npm 또는 같은 이름의 웹 버전
bibtool.bib의 정형·병합·키 재생성을 세밀하게 지정할 수 있는 오래된 도구. TeX Live에는 없어 따로 설치해야 함CTAN 또는 각 OS 패키지 관리자

중복 항목과 붕 뜬 인용 키 찾기

같은 키가 두 번 나타나면 BibTeX은 Repeated entry---line 8 of file refs.bib라고 말하며 나중에 온 쪽을 버리고, biber는 Duplicate entry key라고 경고합니다. 더 성가신 것은 키는 다른데 내용이 같은 중복으로, 이것은 아무도 경고해 주지 않습니다. 공저자들이 각자 Zotero에서 내보낸 .bib를 합치면 같은 논문이 smith2020Smith2020a로 두 번 나란히 놓입니다. 조판된 참고문헌 목록에 같은 줄이 두 개 나와야 비로소 알아채는 종류의 사고입니다.

내용으로 중복을 판정할 때 가장 믿을 만한 단서는 DOI 입니다. 저자명과 제목은 표기가 흔들리지만, DOI가 같으면 같은 논문이라고 단정할 수 있습니다. bibtex-tidy가 바로 이것을 구현하고 있어, --duplicates doi(또는 key, abstract, citation)로 판정 기준을 고르고 --merge를 더하면 한쪽으로 합쳐 줍니다. 반대편 문제——.bib에 없는 키를 인용해 본문에 [?] 가 찍히는 경우——에는 checkcites가 듣습니다. --undefined는 인용했지만 정의되지 않은 키를, --unused는 정의했지만 아무도 인용하지 않은 항목을 뽑아 줍니다.

terminal
# BibTeX projects read the .aux; biblatex projects read the .bcf
checkcites paper.aux
checkcites --backend biber paper.bcf

# keys cited but missing from the database
checkcites --undefined paper.aux

문헌 관리 소프트웨어는 무엇을 고를까 — Zotero / JabRef / BibDesk

수십 건까지는 .bib를 손으로 편집해도 돌아가지만, 수백 건이 되면 관리 소프트웨어가 필요합니다. 갈림길은 .bib를 원본으로 볼 것인가, 내보내기 결과로 볼 것인가 입니다. JabRef와 BibDesk는 .bib 자체를 열고 저장하므로 텍스트 편집기로 직접 손대는 작업과 양립합니다. Zotero는 자체 라이브러리를 원본으로 삼고, .bib는 거기서 생성되는 파생물이 됩니다.

  • Zotero — 무료 오픈소스 표준. 브라우저 커넥터로 논문 페이지에서 한 번에 가져오고, PDF를 저장하며, 공유 그룹 라이브러리까지 지원합니다. LaTeX을 쓴다면 확장 Better BibTeX 는 사실상 필수라고 생각하는 편이 좋습니다.
  • Better BibTeX(Zotero 확장) — 패턴으로 인용 키를 생성하고, 라이브러리의 모든 변경을 .bib에 바로 밀어 넣는 auto-export 를 제공합니다. 이 확장의 핵심이 바로 그것으로, .bib가 항상 최신인 생성물이 됩니다.
  • JabRef.bib를 네이티브로 다루는 오픈소스 관리 소프트웨어. 별도의 내부 형식이 없고, DOI・arXiv ID・ISBN에서 항목을 가져오며, 선택한 항목을 한꺼번에 정리하는 일괄 정리 기능도 있습니다. Windows・macOS・Linux에서 동작합니다.
  • BibDesk(macOS) — Mac용 BibTeX 프런트엔드로 MacTeX에 함께 배포됩니다(/Applications/TeX/BibDesk.app). .bib를 직접 편집하고 PDF 자동 정리와 외부 데이터베이스 검색을 지원합니다.
  • Mendeley — 기존 Mendeley Desktop은 2022년 9월 1일에 배포가 중단되었고, .bib를 자동 동기화하던 기능도 그때 함께 사라졌습니다. 후속인 Mendeley Reference Manager도 BibTeX 내보내기는 되지만 수동 작업입니다.
  • Paperpile — Google Docs 연동에 강한 유료 서비스로, BibTeX 내보내기도 지원합니다.

Zotero 쪽 사정은 2026년에 크게 움직였습니다. Zotero 8에서 citation key가 Zotero 본체의 필드가 되어, Better BibTeX가 가지고 있던 키 칸을 대체했습니다. 키는 이제 항상 고정(pinned)된 상태로 기기 간에 동기화되므로, 예전처럼 항목마다 “Pin BibTeX Key”를 누르던 의식은 사라졌습니다. 다만 Zotero 자신은 키를 생성하지 않습니다. 규칙에서 키를 만들고 auto-export로 .bib를 계속 내보내는 역할은 여전히 Better BibTeX가 맡습니다. 또한 Better BibTeX는 Zotero 7 지원을 종료했으므로, 이 구성을 쓰려면 Zotero도 최신으로 올려 두어야 합니다.

인용 키를 고정해 .bib를 공저자와 공유하기

인용 키는 원고와 문헌 데이터베이스 사이의 API 입니다. 그래서 키만은 절대 움직이면 안 됩니다. 내보낼 때마다 키를 새로 뽑도록 설정되어 있으면 본문의 모든 \cite{...}가 한꺼번에 해결되지 않고 PDF가 [?] 로 뒤덮입니다. 명명 규칙 자체는 무엇이든 상관없지만, 저자 성 + 연도 + 제목 축약(knuth1984literate 같은 형태)으로 해 두면 충돌이 잘 나지 않고, 키만 봐도 어떤 논문인지 알 수 있다는 덤이 따라옵니다.

공저자와 공유할 때 사고가 가장 적은 방법은 .bib를 원고와 같은 Git 저장소에 넣는 것입니다. .bib는 플레인 텍스트라 차이를 읽을 수 있고, 누가 어느 항목을 더했는지 이력에 남습니다. 다만 그대로 두면 충돌이 잦으므로 출력 순서를 고정하는 것이 효과적입니다. 모두가 commit 전에 biber --tool을 통과시키거나, Better BibTeX의 auto-export 대상을 한곳으로 정해 두거나——어느 쪽이든 줄 순서가 안정되면 merge conflict가 급격히 줄어듭니다. 반대로 절대 하면 안 되는 일은 각자의 로컬 .bib를 메일로 주고받는 것입니다. 2주 뒤에는 서로 다른 .bib가 네 개 존재하게 됩니다.

terminal
# ship only the entries this paper actually cites
pdflatex paper.tex
bibexport -o submission.bib paper.aux

투고 직전에는 흐름이 반대가 되어, 이번에는 .bib를 잘라내는 작업이 필요합니다. 많은 학술지가 원고 원본 일체를 요구하지만, 거기에 800건짜리 개인 데이터베이스를 딸려 보낼 수는 없습니다. bibexport.aux를 읽어 실제로 \cite된 항목만.bib에 써 주므로 이 용도에 정확히 들어맞습니다(bibtool로도 .aux를 분석해 같은 일을 할 수 있습니다). 같은 이유로 평소에는 커다란 master .bib 하나를 두고 원고마다 잘라 쓰는 운용이 다루기 편합니다.

LaTeX을 쓰지 않는 상대에게 넘기기 — CSL과 pandoc

공저자가 Word로 쓰고 있더라도 .bib를 버릴 필요는 없습니다. CSL(Citation Style Language) 은 인용과 참고문헌 목록의 모양을 기술하는 XML 형식이며, 가장 큰 특징은 조판 엔진에 의존하지 않는다 는 점입니다. BibTeX의 .bst는 BibTeX 전용이고 biblatex 스타일은 LaTeX 안에서만 쓰이지만, .csl은 어떤 체계에도 묶이지 않습니다. 실제 서식화는 citeproc 처리계가 맡고, Zotero・Word용 플러그인・각종 변환 도구가 각자의 citeproc 구현으로 같은 .csl을 해석합니다. Zotero의 스타일 저장소에는 수천 종의 학술지 스타일이 있어 자유롭게 쓸 수 있습니다.

terminal
pandoc paper.md --citeproc \
  --bibliography=refs.bib \
  --csl=ieee.csl \
  -o paper.pdf

이 CSL을 가장 적극적으로 쓰는 도구가 pandoc 입니다. Markdown 원고를 --citeproc을 붙여 변환하면 본문의 [@knuth1984] 같은 인용 키가 형식화된 인용으로 바뀌고, 끝에 참고문헌 목록이 생성됩니다. --bibliography에는 .bib를 그대로 넘길 수 있고(여러 번 지정해 여러 파일을 묶을 수도 있습니다), --csl을 생략하면 Chicago author-date 가 쓰입니다. 요컨대 같은 .bib를 입력으로 삼아 Markdown에서 곧장 PDF・Word・HTML 로 출력할 수 있으며, 경로에 LaTeX은 전혀 끼지 않습니다.

관점BibTeX / biblatexCSL + citeproc
engineLaTeX 안(bibtex / biber)LaTeX 밖에서도(Zotero, Word, pandoc)
style-file.bst(BibTeX) / biblatex 스타일.csl(XML)
authoring스타일 작성이 어려워 주요 학술지의 기성품을 쓰는 것이 보통XML이라 고치기 쉽고 기성 스타일도 수천 종
outputLaTeX → PDFWord, HTML, Markdown → PDF 등
useLaTeX로 본격 조판LaTeX를 쓰지 않음 / 공저자가 Word 사용

결국 이 페이지의 도구는 모두 같은 전제 위에 서 있습니다. 자산은 .bib 그 자체이지 출력 경로가 아니라는 것입니다. DOI에서 가져오고, bibcop에게 혼나고, biber --tool로 다듬고, 키를 고정해 Git에 올려 둔 데이터베이스 하나가 있으면, 그다음부터 biblatex로 PDF를 뽑든 pandoc으로 공저자에게 Word를 건네든 그저 출구의 선택일 뿐입니다. 도구를 늘리는 것보다 데이터베이스를 하나로 유지하는 편이 훨씬 잘 듣습니다.