\input 的相对路径以及从不同目录构建的路径

\input 的相对路径以及从不同目录构建的路径

最小示例

如果我有一个包含主要 LaTeX 源文件的目录,并且它用于\input合并另一个文件中的某些数据,则我可以使用相对路径名。例如,对于这些文件:

~/tmp/相对路径-mwe/mwe.tex

\documentclass{article}
\begin{document}
\input{./src/ex.tex}
\end{document}

〜/ tmp /相对路径-mwe / src / ex.tex

some input

现在,从命令行,如果我在~/tmp/relative-paths-mwe,我可以按预期进行构建:

~/tmp/relative-paths-mwe$ pdflatex mwe.tex 
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
...
Output written on mwe.pdf (1 page, 12192 bytes).
Transcript written on mwe.log.

但是,如果我在父目录中,~/tmp/我无法构建,因为相对路径(据我理解,并基于症状)是根据当前工作目录而不是出现的文件解析的\input

~/tmp$ pdflatex relative-paths-mwe/mwe.tex 
...! LaTeX Error: File `./src/ex.tex' not found.

Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: tex)

Enter file name: 

有没有办法以这样的方式指定路径,即我可以使用相对路径引用其他内容,但仍然可以pdflatex从任意目录调用?

非最小示例

我认为以上是一个完整的最小工作示例,如果我得到答案,我就可以解决我的实际问题。万一有人可以提前预测到差异,或者有人想知道为什么我正在尝试做一些不寻常的事情,需要做一些解释。我有一个项目的源代码库,它有一个 LaTeX 文档的子目录,还有一个Apache Maven项目。该文档一直使用 listings 环境来包含来自 Maven 项目的源代码,使用相对路径,如下所示

../mavenproject/src/more-path/code.extension

有一个LaTeX Maven Mojo它应该能够编译 LaTeX 文档,所以我决定尝试将文档目录移动到mavenproject/src/latex/mydoc。现在,mavenproject/src/latex/mydoc如果我将相对路径更改为

../../more-path/code.extension

但我无法使用 LaTeX Mojo 构建这些路径,因为它是从mavenproject文档根目录上方几个目录运行的。我显然可以调整以处理这种情况,但我无法从mydoc。我希望有一种方法可以指定相对于包含文档的路径名,或者指定文档根目录,并写入相对于该路径的路径。我希望上述最小示例的解决方案将转移到我的实际情况。

答案1

而不是

\input{./src/ex.tex}

通常最好这样做

\input{ex.tex}

然后使用(从任何地方)

TEXINPUTS=$HOME/tmp/relative-paths-mwe//:$TEXINPUTS: pdflatex mwe

实际上,相对路径并不是根据当前工作目录解析的,而是根据 TEXINPUTS 中的目录解析的(无论是指定为环境变量还是 texmf.cnf 文件中的 kpathsea 配置)。通过以 结尾的路径,//您可以搜索子目录,这样就ex.tex可以在子目录中找到src,也可以mwe.tex从命令行找到 。TEXINPUTS:中的结尾确保也在标准位置搜索常见的类和包。

答案2

选择:

\documentclass{article}
\usepackage[abspath]{currfile}  % ← need this package
\begin{document}
\input{\currfileabsdir/src/ex.tex}  % use `\currfileabsdir`
\end{document}

它的工作原理应该非常明显。如currfile软件包文档中所述,您需要-recorder标志,并且如果您使用 MikTeX,您可能想要尝试\InputIfFileExists等等(有关详细信息,请参阅该软件包的文档...)

相关内容