我有一个主文件,test.tex
还有一些文件夹sub1/
和。每个文件夹sub2/
都有一个 TeX 文件:sub1/sub1.tex
和sub2/sub2.tex
。在sub1/
和中sub2/
还有一些片段sub1/snip11.tikz
,sub1/snip12.tikz
和。文件如下所示:sub2/snip21.tikz
sub2/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.tikz
sub1/
有什么方法可以让它\input
看起来与包含 TeX 文件的文件夹位于同一文件夹中?
当然,我可以在中添加正确的路径sub1/sub1.tex
,但是我有大量子文件夹,而且这也不是我想要的解决方案。
答案1
常见问题解答建议使用以下软件包import
或chapterfolder
:
答案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