有没有办法从父目录构建 LaTeX 文档?

有没有办法从父目录构建 LaTeX 文档?

我为当前项目编写了一个 makefile,它生成所有可交付成果(可执行文件,用 C 编写,以及报告,用 LaTeX 编写)。我有一个目录结构,其中 Makefile 和输出(pdf 和可执行文件)位于父目录中,源代码位于 Code/ 目录中,LaTeX 位于 /Report 目录中,类似于:

目录结构图

目前,在运行 LaTeX 之前,Makefile(在 Project 目录中)必须cd放入 Report 目录中,有点像下面这样:

Report: $(CODEFILES) $(TEXFILES) Report/Build
    cd Report/;         $(TEX) $(TEXARGS) Report.tex

有没有办法让 LaTeX 像在另一个目录中一样运行,或者我是否已经以最佳方式完成了此操作?这似乎有点敷衍,我一直渴望了解更清晰的解决方案!

谢谢。

已编辑更新图表,并指出真正的问题是由于 Report.tex 包含子文件,导致我无法执行latex Report/Report.tex

答案1

(添加评论作为答案)

更改目录没有什么问题(大多数 Makefile 都会这样做),但您应该始终使用cd ... && ...,否则如果失败,您会遇到麻烦cd。要将输出文件放在其他位置,请使用--output-directory命令行选项。

答案2

我发现问题在于,您试图通过明确地将输入文件的路径交给 TeX,从而让其屈服,但又试图从上一个目录运行它。也就是说,尽管您 cd 进入 Project/Report,但您试图将输出放入 Project。

TeX 讨厌这种情况,尽管您可以让它工作,但您永远无法干净地做到这一点。

示例:直到最近,我有一个“核心”目录,用于存放我的所有文档(跨多个 GitHub 存储库)。我不得不使用“\input{../core/trmsdocumentation.tex}”,因为我无法让它搜索该路径,而“\include”会导致辅助文件等出现各种问题。如果我的文件中出现错误core,我就完蛋了。没有什么可以正确报告它,调试总是指向有问题的文件中调用宏的行。没有。有帮助。

解决此问题的最佳方法是将文档树放在文件中的 TEXMF 路径内texmf.cnf,可能使用TEXMFHOME树。我的是:

TEXMFHOME = $HOME/src/tex/texmf-trms

如果您有许多项目并且只想激活您正在处理的项目,请在启动编辑器之前创建一个执行路径命令的批处理文件。

你可能会读到:

TEXMFHOME = /Project/texmf-project

你可以 CD 到你的项目目录Project然后latex texmf-project/local/Report/Report.tex从那里运行,它会运行良好,无论目录中的子目录如何local(本地是 TDS 的东西,我会解释的)。你也可以只设置TEXMFHOME到你的Project目录,但这意味着你的所有源代码也会被搜索。这不是问题,但在这里你又滥用了 TeX 的精神,而 TeX 有办法让你付出代价。

相反,如果你花些时间阅读TDS:TeX 目录结构简而言之,如果您使用 TDS 结构设置自己的本地文件,随着时间的推移,您会发​​现自己将自己的通用宏放入所有项目都可以访问的公共目录中。然后,您可以将这些文件保存在以自己的速度更新的源存储库中,从而让您也可以对常用的 TeX 工作进行源代码控制。这些通用文件将位于单独的“TEXMFHOME”TDS 路径下,而您当前的项目可能位于项目内上述其他“TEXMFHOME”TDS 下。

TEXMFHOME 示例:

TEXMFHOME=/Projects/myproject/texmf-myproject;/Projects/texmf-common

注 1:如果您使用的是 MikTeX,他们有添加“本地文本树”或类似内容的功能。如果您添加了源树,您应该能够干净利落地完成您想要的操作

注 2:您的里程可能会因发行版而异。请注意,您的项目是第一位的,而您的通用文件是第二位的。如果您想要进行本地修改,您的项目将覆盖您的通用文件。

正如我所提到的,像预期的那样使用 TDS,您可以在其中制作文档/Projects/texmf-project/local/Reportlocal它是为此目的保留的,您可以将它放在树中的任何位置以将您自己的工作放入其中。

我知道我没有直接回答你提出的问题,但在某种程度上,我做得更好。我告诉你要成长,接受 TeX 希望你做的事情,不要再试图挑战它,而是从其他人为让它按照你现在试图对抗的方式工作而付出的辛勤工作中获益。:)

值得深思。

如果这不清楚,请告诉我,我会尽力澄清。:)

相关内容