LuaLaTeX에서 BiBTeX 소스 생성

LuaLaTeX에서 BiBTeX 소스 생성

컴파일 중인 문서의 LuaLaTeX 소스에서 직접 BibTeX 항목을 생성하는 방법이 있는지 궁금합니다. 특정 파일링 시스템이 주어지면 LuaTeX 소스에는 원하는 모든 정보가 있을 수 있습니다.

  1. 문서 유형(논문, 보고서, 도서)
  2. 작성자/제목
  3. 버전, 부서 등과 같은 사용자 정의 변수 이름

코드의 lua 부분에서 이러한 변수에 액세스할 수 있고 파일 작성이 허용되는 경우 문서 컴파일의 일부로 파일을 \directlua생성하는 것이 가능할 수 있습니다 ..bib

제가 문의한 내용이 유효한지, 위에서 설명한 것과 유사한 시도를 누군가가 이미 시도했는지 궁금합니다.

답변1

루아는 절대 필요하지 않습니다. 내 작업 문서를 위한 템플릿은 다음으로 시작합니다.

%% Metadata
\begin{filecontents}[overwrite,noheader]{\jobname.meta-bib}
@article
author = {test, test},
title = {title},
keywords = {GR},
\end{filecontents}
\documentclass{amsart}
\usepackage{...

이를 통해 환경 내에 원하는 모든 참고문헌 데이터를 넣고 filecontents파일에 저장할 수 있으며 .meta-bib, 그런 다음 쉘 스크립트를 사용하여 정리할 수 있습니다. (내 경우에는 진공 청소기로 청소하는 쉘 스크립트가 자동으로 데이터를 생성하기 때문에 내가 포함하는 데이터가 불완전합니다[일부 중괄호와 식별 키가 누락됨]. 대신 모든 작업을 수동으로 수행할 수 있습니다.)

위의 솔루션은 개별 문서 클래스에 대한 지식/가정이 필요하지 않기 때문에 아마도 가장 유연할 것입니다. 또 다른 방법은 .sty이 프로세스를 자동화하는 패키지( ) 파일을 작성하는 것입니다 . 이것은 필요할 것이다

  • \titlebib 파일에 긴 제목을 쓰도록 재정의합니다 . 에 대한 선택적 인수를 허용하는 문서 클래스에 주의를 기울여야 합니다 \title.

  • \author작성자 정보를 bib 파일에 기록하도록 재정의합니다 . 일부 문서 클래스는 작성자 주소를 명령의 일부로 예상하고 \author일부 문서 클래스는 그렇지 않기 때문에 이는 매우 어려울 수 있습니다. 그리고 일부 문서 클래스는 여러 \author호출을 통해 개별 작성자를 나열하고 일부 문서 클래스는 \author{Author1 \and Author2 \and Author3}.

    내가 사용하는 모든 공통 문서 클래스에 대해 이것을 완전히 자동화할 수 없기 때문에 를 사용하여 filecontents데이터를 직접 작성하는 방법으로 되돌아갔습니다.

  • 어쨌든, 당신의 논문이 출판된다면, 순수하게 출처만으로는 출판 정보(저널, 권, 날짜)를 알 수 있는 방법이 없습니다.~하지 않는 한어떻게든 TeX 파일에 하드 코딩하면 됩니다. 이 경우 filecontents위에서 언급한 솔루션과 거의 동일하지만 유연성이 훨씬 떨어지는 것으로 돌아갑니다 .


요청에 따라 "진공 스크립트"(Git 커밋 정보를 사용하여 타임스탬프를 생성한다는 점을 제외하면 전혀 멋진 것은 아닙니다)

#!/bin/bash

BIBFILE="entries.bib"

echo '% Automatically generated entries database' > $BIBFILE
echo -n '% Updated: ' >> $BIBFILE
date >> $BIBFILE

for texfile in `git ls-tree master --name-only *tex`
do
        bname=`basename -s .tex $texfile`
        if [ ${bname}.meta-bib -ot $texfile ]
        then
                echo "${texfile} out of date, skipping."
        else
                moddate=`git log -n 1 --date="format:%F %R" --format="format:%cd" ${texfile}`
                modcommit=`git log -n 1 --format="format:%h" ${texfile}`
                origdate=`git log  --date="format:%F" --format="format:%cd" --diff-filter=A ${texfile}`
                head -n 1 ${bname}.meta-bib >> $BIBFILE
                echo "{ $bname," >> $BIBFILE
                tail -n +2 ${bname}.meta-bib >> $BIBFILE
                echo "lastdate = {${moddate}}," >> $BIBFILE
                echo "lastcommit = {${modcommit}}," >> $BIBFILE
                echo "origdate = {${origdate}}," >> $BIBFILE
                echo "url = {${texfile}}," >> $BIBFILE
                echo '}' >> $BIBFILE
        fi
done

답변2

lua필수는 아니지만 전송 lua정보를 tex에서 파일로 쉽게 넣을 수 있습니다. 내가 이해한 바로 filecontents는 환경과 같은 말 그대로이며 TeX에서 변수를 전달하는 것은 쉽지 않습니다. 그래서 나는 아래에 보여주는 최소한의 예를 생각해 냈습니다. 이제 변수를 lua에 전달할 수 있으므로 lua에서 작업을 진행하는 데 필요한 스크립트를 복잡하거나 간단하게 작성할 수 있습니다.

\documentclass{article}
\title{New Article}
\author{New Author}

\RequirePackage{luatextra}

\begin{luacode}
  function writebib(author)
  bibtex_file = io.open("meta.bib", "w")
  bibtex_file:write("@techreport{alpha,title={Me},author={")
  bibtex_file:write(author)
  bibtex_file:write("}}")
  end
\end{luacode}

\begin{document}
\maketitle

\makeatletter
\directlua{writebib("\luaescapestring{\@author}")}
\makeatother

\end{document}

관련 정보