我知道充足的其他 主题 有关的这个问题,但我读过的所有文章都没有解决这里提出的问题。我提供了一个最小工作示例这里,如果你想重现这个问题。这篇文章重新回顾了我的一个旧问题[1]。
期望行为
我想要一个自定义构建文件夹,其中包含所有 PDFLaTeX / LUALaTeX 中间构建(以及最终输出)文件。项目结构类似于以下内容:
root
┣━━ main.tex
┣━━ figures/
┣━━ bib/
┗━━ out/
所有构建文件都位于out/
文件夹中,而不是项目根目录中。这也将使 giting 更加方便,只需在文件/out/*
中添加一行简单的代码即可.gitignore
。
问题
使用在这个话题(我相信这是关于该主题的最完整的主题),我运行了以下命令[2]:
lualatex -synctex=1 --output-directory=./out -interaction=nonstopmode ./biblio_test.tex
它运行良好并在文件夹中创建了一堆东西out
,然后:
bibtex ./out/biblio_test.aux
但是 bibtex 失败并出现以下错误:
I couldn't open database file biblio_test-blx.bib
---line 3 of file out/biblio_test.aux
: \bibdata{biblio_test-blx
: ,bib/my_bib}
lualatex
这导致了生成的文件的内容biblio_test.aux
:
\bibdata{biblio_test-blx,bib/my_bib}
应为:\bibdata{out/biblio_test-blx,bib/my_bib}
。
临时解决方案
我现在可以想到两种方法来解决这个问题(已经测试过,有效):
- 移至文件
biblio_text-blx.bib
夹root
。 - 手动添加文件
out/
的相对路径biblio_test.aux
。
然而这些都不是解决方案,因为这些文件在每次编译时都会发生变化。
问题
- 这是命令的错误
lualatex
吗?我在这里做错了什么吗? - 我该如何解决这个问题?
附加信息
- 我也尝试使用
pdflatex
命令 (pdflatex -synctex=1 -output-directory=./out -interaction=nonstopmode ./"biblio_test".tex
,参数中只有一个破折号-output-directory
)。 - 我的 LaTeX 发行版是 TeX Live 2020,在 Mac OS Catalina(10.15.6)下运行。
- 我还可以想到一些肮脏但有效的解决方案,例如为我的
bibtex
命令定义一个别名,执行类似 (bash draft) 的操作mv out/biblio_test.aux ./biblio_test.aux && bibtek ./biblio_test.aux && mv ./biblio_test.bbl out/biblio_test.bbl && rm ./biblio_test.aux
,但我不想这样做。
[1]:最初的问题没有得到回答,标记为废弃。 下列的关于此主题的 meta 讨论,我只是重新问了一个原问题的改进版本,并回答了它。
[2]:重要的:out
如果使用,请务必先使用mkdir out
或类似命令创建一个文件夹建议的最小工作示例。
答案1
嗯,这是一个很好的例子,说明为什么使用--output-directory
是有问题的(以及为什么我从不使用它)。
正如您所要求的,biblatex 写入的内部 bib 文件已写入目录out
,但 biblatex 的内部命令不知道这一点。因此这里out/
缺少:
\def\blx@auxinit#1{%
\blx@auxwrite\blx@aux
{\def\do##1{,\blx@stripbib{##1}}}
{\ifx\blx@aux\@mainaux
\else
\blx@msg@aux
\fi
\string\bibstyle{biblatex}\blx@nl
\string\bibdata{%
\blx@ctrlfile\blxauxsuffix %<--- should be out/\blx@ctrlfile\blxauxsuffix
\ifx#1\@empty
\else
\dolistloop#1%
\fi}\blx@nl
\string\citation{biblatex-control}}}
使用 biber 就不会有问题,因为它不需要特殊的围兜即可工作。
只需将文件留在工具和包所需的位置,您就可以节省大量的调试时间(并使包作者免于考虑此类设置和添加选项的麻烦)。
答案2
未经测试也许你应该在out
当前目录下运行 BibTex,即在 TeXStudio 中使用此模板
cd out && bibtex %.aux
最重要的是在根目录中创建一个指向 out/biblio_test-blx.bbl 的符号链接 biblio_test-blx.bbl
答案3
对于幕后发生的复杂细节,我没有确切的答案,但据我所知,问题出在bibtex
。事实上,我没有找到一种方法来告诉bibtex
它在目录内完成所有工作。我只能告诉它使用以下命令在目录内out
查找文件:.aux
out
bibtex ./out/biblio_test.aux
biblio_test-blx
但它总是在根文件夹中搜索,而不是在out
目录中搜索。
解决方案:使用 biber
相反,biber
确实提供了两个用于指定输入/输出目录的选项(完整的选项列表可通过以下方式获得biber --help
):
--input-directory [directory]
:将首先在目录中查找 .bcf 和数据文件。请参阅 biber PDF 文档以了解其他可能性以及它如何与“--output-directory”选项交互。--output-directory [directory]
:输出文件(包括日志文件)输出到目录而不是当前目录。输入文件也会在当前目录之前的目录中查找,除非还指定了“--input-directory”,在这种情况下,输入文件只会在“--input-directory”指定的目录中查找。
然后我在 TeXStudio 中替换了书目工具命令行:
bibtex out/%.aux
经过
biber --output-directory out %
这很有效和 允许使用后端的高级功能。若要进一步了解和biber
之间的差异以及其他技术考虑,您可能有兴趣阅读以下内容:bibtex
biber
bibtex 与 biber 以及 biblatex 与 natbib 的比较
请不要犹豫,改进这个答案或在评论中提出适当的意见,我会相应地升级我的答案。我知道这只是一种解决方法,并没有真正解决最初的bibtex
问题。但这是我目前想到的最好的办法。
答案4
对于那些仍然想同时使用 -output-directory 和 bibtex 并避免 <report_name>-blx.bib 问题的人......这里有一个解决方法:
在你的 makefile 中:
DOCNAME=main
OUTDIR=out
BLX=main-blx.bib
.PHONY: clean
all: pdf
pdf: | outdir
pdflatex --shell-escape -output-directory=$(OUTDIR) $(DOCNAME).tex
MOVE .\$(OUTDIR)\$(BLX) .
bibtex $(OUTDIR)/$(DOCNAME)
del $(BLX)
pdflatex --shell-escape -output-directory=$(OUTDIR) $(DOCNAME).tex
pdflatex --shell-escape -output-directory=$(OUTDIR) $(DOCNAME).tex
clean:
rmdir $(OUTDIR)
这种方式非常有效,而且由于它只被 bibtex 使用一次,所以可以删除它......它将在下一个 make 命令中生成。