컴파일 중인 문서의 LuaLaTeX 소스에서 직접 BibTeX 항목을 생성하는 방법이 있는지 궁금합니다. 특정 파일링 시스템이 주어지면 LuaTeX 소스에는 원하는 모든 정보가 있을 수 있습니다.
- 문서 유형(논문, 보고서, 도서)
- 작성자/제목
- 버전, 부서 등과 같은 사용자 정의 변수 이름
코드의 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
이 프로세스를 자동화하는 패키지( ) 파일을 작성하는 것입니다 . 이것은 필요할 것이다
\title
bib 파일에 긴 제목을 쓰도록 재정의합니다 . 에 대한 선택적 인수를 허용하는 문서 클래스에 주의를 기울여야 합니다\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}