如何使“\include”-d 文件中的“\input”使用正确的当前路径?

如何使“\include”-d 文件中的“\input”使用正确的当前路径?

我有一个主文件,test.tex还有一些文件夹sub1/和。每个文件夹sub2/都有一个 TeX 文件:sub1/sub1.texsub2/sub2.tex。在sub1/和中sub2/还有一些片段sub1/snip11.tikzsub1/snip12.tikz和。文件如下所示:sub2/snip21.tikzsub2/snip22.tikz

test.tex

\documentclass[12pt,a4paper]{scrartcl}

\usepackage{tikz}

\begin{document}

\section{sub1}
\include{sub1/sub1}

\section{sub2}
\include{sub2/sub2}

\end{document}

sub1/sub1.tex

\input{snip11.tikz}
\input{snip12.tikz}

sub2/sub2.tex

\input{snip21.tikz}
\input{snip22.tikz}

包含snip??.tikz一些tikzpicture

\begin{tikzpicture}
    \draw (0,1) arc (90:130:1);
\end{tikzpicture}

如果有人尝试编译它,它显然会失败,因为在sub1/sub1.tex命令中会在根文件夹而不是文件夹中\input查找。snip11.tikzsub1/

有什么方法可以让它\input看起来与包含 TeX 文件的文件夹位于同一文件夹中?

当然,我可以在中添加正确的路径sub1/sub1.tex,但是我有大量子文件夹,而且这也不是我想要的解决方案。

答案1

常见问题解答建议使用以下软件包importchapterfolder

https://texfaq.org/FAQ-docotherdir

答案2

从相对目录进行工作并不容易,\input因为 TeX 宏层不知道您的sub.tex` 在哪里,它可能位于 TEXINPUTS 路径中的任何位置。但是,如果您的 TEXINPUTS 设置(环境变量或 texmf.cnf 设置)包含 .//,则您可以使用相同的功能,然后 Tex 将递归搜索每个文件的所有子目录,因此只要您的文件名不同,它们位于哪个子目录中就无关紧要。

所以

$ latex test
This is pdfTeX, Version 3.1415926-1.40.11 (Web2C 2010)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2009/09/24>
Babel <v3.8l> and hyphenation patterns for english, dumylang, nohyphenation, ge
rman-x-2009-06-19, ngerman-x-2009-06-19, ancientgreek, ibycus, arabic, armenian
, basque....

! LaTeX Error: File `hmm.tex' not found.

但设置路径:

$ TEXINPUTS=";.//" latex test
This is pdfTeX, Version 3.1415926-1.40.11 (Web2C 2010)
 restricted \write18 enabled.
entering extended mode
(./test.tex
LaTeX2e <2009/09/24>
Babel <v3.8l> and hyphenation patterns for english, dumylang, nohyphenation, ge
rman-x-2009-06-19, ngerman-x-2009-06-19, ancientgreek, ibycus, arabic, armenian
, basque,...
(./sub1/hmm.tex

hmm.tex此处已在子目录中找到该文件。

test.tex这只是

 \input{hmm}

此处,TEXINPUTS 已在命令行上进行了更改,仅适用于此命令(bash 语法),该命令可能可用,也可能不可用,具体取决于您的系统,但您将能够设置 TEXINPUTS某处

答案3

如果所有子文件夹中只有不同名称的文件,我建议删除主文档中的子文件夹调用,仅\input{file}在将相关文件夹添加到环境变量时进行调用TEXINPUTS,例如:

TEXINPUTS=".:./sub1:./sub2:./sub3:$TEXINPUTS" latex main.tex

您可以包含图形的路径,\includegraphics{}并且它还可以充当命令的角色\graphicspath{}

如果两个不同的子文件夹中有两个同名的文件,那么可能会更棘手。

答案4

这是一个潜在的解决方案,它使用每次加载新文件时都会更改的变量。它应该适用于任意数量的子文件夹。

对于您的主文件,test.tex

\documentclass[12pt,a4paper]{scrartcl}

\usepackage{tikz}

%these are the relevant lines%
\newcommand\subfolder{}      
\newcommand\rinclude[2]{
\renewcommand\subfolder{#1} 
\include{#1/#2}}
\newcommand\rinput[1]{
\input{\subfolder/#1}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\section{sub1}
\rinclude{sub1}{sub1}

\section{sub2}
\rinclude{sub2}{sub2}

\end{document}

然后,在你的sub1/sub1.tex您将使用的文件:

\rinput{snip11.tikz}
\rinput{snip12.tikz}

同样,在你的sub2/sub2.tex文件:

\rinput{snip21.tikz}
\rinput{snip22.tikz}

对于此解决方案,您只需在子文件夹中的文件中使用 new 命令\rinclude代替,使用代替。该命令的第一个参数是子文件夹,第二个参数是文件名。 的参数与 的参数相同。\include.tex\rinput\input\rinclude\rinput\input

相关内容