在 \input 和 \includegraphics 命令中使用相对路径

在 \input 和 \includegraphics 命令中使用相对路径

我有以下目录结构

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而不是。\inputmain.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

在此处输入图片描述

相关内容