使用自定义构建目录的 -blx 文件路径问题

使用自定义构建目录的 -blx 文件路径问题

我知道充足其他 主题 有关的这个问题,但我读过的所有文章都没有解决这里提出的问题。我提供了一个最小工作示例这里,如果你想重现这个问题。这篇文章重新回顾了我的一个旧问题[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.bibroot
  • 手动添加文件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查找文件:.auxout

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之间的差异以及其他技术考虑,您可能有兴趣阅读以下内容:bibtexbiberbibtex 与 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 命令中生成。

相关内容