我有以下目录结构
Thesis/
main.tex
Chapter1/
section1.tex
subsection1.1.tex
figure1.png
figure2.png
Chapter2/
section1.tex
主要.tex:
...
\input{Chapter1/section1.tex}
\input{Chapter2/section1.tex}
...
第 1 章/第 1 节.tex:
...
\input{subsection1.1.tex}
...
\includegraphics{figure1.png}
...
在文件“Chapter1/section1.tex”中使用相对路径包含“subsection1.1.tex”会引发错误! LaTeX Error: File subsection1.1.tex not found
。有没有办法使用相对路径在“Chapter1/section1.tex”中包含文件“subsection1.1.tex”?
答案1
尝试一下(至少需要 LaTeX 2020-10-01):
\documentclass{article}
\ExplSyntaxOn
\tl_new:N \l__bourne_tmpa_tl
\cs_new_protected:Npn \bourne_path_push:
{
\seq_put_left:NV \l_file_search_path_seq \CurrentFilePath
\AddToHookNext {file/after/\CurrentFile} { \bourne_path_pop: }
}
\cs_new_protected:Npn \bourne_path_pop:
{ \seq_pop_left:NN \l_file_search_path_seq \l__bourne_tmpa_tl }
\NewDocumentCommand \topinput { }
{ \AddToHookNext {file/before} { \bourne_path_push: } \input }
\ExplSyntaxOff
\usepackage{graphicx}
\begin{document}
\topinput{Chapter1/section1.tex}
\topinput{Chapter2/section1.tex}
\end{document}
该\topinput
命令将给定的路径添加到\l_file_search_path_seq
,以便在该文件中搜索该路径,因此\topinput{Chapter1/section1.tex}
将添加Chapter1
到搜索路径。文件结束后,将立即删除该路径,以便不会搜索重复的文件(但不建议拥有同名的文件!)。
答案2
您可以使用进口包。它定义了两个命令:
\import{〈full-path〉}{〈file〉
\subimport{〈path-extension〉}{〈file〉}
当您使用\import
或 时\subimport
,包含的文件可以引用相对于该包含文件的路径的文件。
就你的情况而言:
...
\subimport{Chapter1}{section1.tex}
\subimport{Chapter2}{section1.tex}
...
然后在 Chapter1/section1.tex 中:
...
\input{subsection1.1.tex}
...
\includegraphics{figure1.png}
...
如果文件 Chapter1/subsection1.1.tex 和 Chapter1/figure1.png 存在,则应该可以工作。
答案3
我有一个尚未完全准备好广泛分发的软件包,这是我为此目的创建的,供我自己使用。我不保证它的适用性。将它放入betterinclude.sty
,然后在您的文件中使用它\include
而不是。\input
main.tex
更新代码以支持最新 LaTeX 中的包含挂钩。
\ProvidesPackage{betterinclude}
\def\@finddir#1#2#3/#4//#5.{
\def\@tempa{#4}%
\ifx\@tempa\@empty % There is no directory name provided
\gdef#1{}
\gdef#2{#3}
\else % There is a directory name provided
\gdef#1{#3/}
\gdef#2{#4}
\fi
}
% Redefine \@include to find any directory portion of the input name
\def\@include#1 {%
\@finddir\bi@@dir\bi@@name#1///.%
\clearpage
\if@filesw
\immediate\write\@mainaux{\string\@input{\bi@@name.aux}}%
\fi
\@tempswatrue
\if@partsw
\@tempswafalse
\edef\reserved@b{#1}%
\@for\reserved@a:=\@partlist\do
{\ifx\reserved@a\reserved@b\@tempswatrue\fi}%
\fi
\if@tempswa
\let\@auxout\@partaux
\if@filesw
\immediate\openout\@partaux \bi@@name.aux
\immediate\write\@partaux{\relax}%
\fi
\let\bi@iinput\@iinput
\edef\@iinput##1{\noexpand\bi@iinput{\bi@@dir##1}}
\let\bi@vi\verbatiminput
\edef\verbatiminput##1{\noexpand\bi@vi{\bi@@dir##1}}
\graphicspath{{\bi@@dir}}
\bi@setinputs
\@filehook@set@CurrentFile
\UseHook{include/before}%
\UseHook{include/before/#1}%
\@input@{#1.tex}%
\UseHook{include/end/#1}%
\UseHook{include/end}%
\let\@iinput\bi@iinput
\let\verbatiminput\bi@vi
\bi@restoreinputs
\clearpage
\@writeckpt{#1}%
\if@filesw
\immediate\closeout\@partaux
\fi
\else
\deadcycles\z@
\@nameuse{cp@#1}%
\fi
\let\@auxout\@mainaux}
\let\bi@setinputs\relax
\let\bi@restoreinputs\relax
(这是非常古老的代码——最初的代码是我在 90 年代编写的,后来进行了更新以处理\includegraphics
最新的代码)。
答案4
您可以组织文件,使第 1 节中的所有内容都包含在文件中subsection1.1.tex
,并且每个节和子节都有自己的文件。这样做的好处是使main.tex
文件中的输入清晰明了。更改每个输入之前的图形路径。
主要.tex:
\begin{document}
\graphicspath{{Chapter1/}}
\input{Chapter1/section1.tex}
\input{Chapter1/subsection1.1.tex}
\graphicspath{{Chapter2/}}
\input{Chapter2/section2.tex}
\input{Chapter2/subsection2.1.tex}
\end{document}
我建议不要将文件命名为“section1.tex”。让 LaTeX 进行编号。将文件命名为有意义的名称,例如“introduction.tex”,并使用标签来引用各节。这样,如果第 2 节变成第 3 节,您就不必重命名文件。
目录结构:
Thesis/
thesis_main.tex
introduction/
introduction.tex
intro_sec1_filename.tex
figures/
figure1_name.png
figure2_name.png
theory/
theory.tex
theory_sec1_filename.tex
figures/
论文主要内容:
\documentclass[12pt]{book}
% List of packages
\usepackage{graphicx}
\begin{document}
% INTRODUCTION
\graphicspath{{introduction/figures/}}
\input{introduction/introduction.tex}
\input{introduction/intro_sec1_filename.tex}
% THEORY
\graphicspath{{theory/figures/}}
\input{theory/theory}
\input{theory/theory_sec1_filename.tex}
\end{document}
引言.tex
% Introduction
\chapter{Introduction}
This is content in the first part of the introduction
\includegraphics{figure1.png}
intro_sec1_文件名.tex
% Title of introduction section
\section{Title of introduction section}
This includes all of introduction section 1 content, including subsections
\subsection{Title of introduction section subsection}
This is the first subsection content
\includegraphics{figure2.png}
理论.tex
% Theory
\chapter{Theory}
This is content in the first part of the theory section
理论_sec1_文件名.tex
% Title of theory section
\section{Title of theory section}
This includes all theory section 1 content, including subsections
图1.png
图2.png