解决方案

解决方案

问题: 这个问题困扰了我很长时间。如果你有多个文件,那么你必须让所有input路径相对于maintex 文件(或实际上是编译文件的目录main),而不是相对于调用input.

出场: 还有其他人期望路径是相对于当前路径的 这里这里这里这里或者这里

软件包: 我知道import包。但是,我认为奇怪的是,不同的级别有不同的命令。此外subfiles可以用于相对路径。

结论:不过,我觉得应该有一个基本的解决方案。因此,我最终想出了一个非常简短的解决方案。

答案1

解决方案

一种使用 LaTeX3“数据类型”的可能解决方案实际上非常简单。它可以任意嵌套多次。我猜这个解决方案可以由技术高超的人进一步改进,所以请随意改进它并在其他软件包中使用它。

\ExplSyntaxOn

\seq_new:N \g_relinput_stack_seq
\tl_new:N \g_relinput_dump_tl

\NewDocumentCommand{\relinput}{O{./}m}{
  % add the new relative input to the history path
  \seq_put_right:Nn \g_relinput_stack_seq {#1}
  % input the file
  \input{\seq_use:Nn \g_relinput_stack_seq {} #2}
  % remove the new relative input from the history
  \seq_gpop_right:NN \g_relinput_stack_seq \g_relinput_dump_tl
}

\ExplSyntaxOff

我甚至不确定是否需要 dump 变量,但\seq_gpop_right:NN需要两个参数。显然,这可以很容易地为命令扩展\include。只需添加

\NewDocumentCommand{\relinclude}{O{./}m}{
  % add the new relative input to the history path
  \seq_put_right:Nn \g_relinput_stack_seq {#1}
  % input the file
  \include{\seq_use:Nn \g_relinput_stack_seq {} #2}
  % remove the new relative input from the history
  \seq_gpop_right:NN \g_relinput_stack_seq \g_relinput_dump_tl
}

例子

使用方法非常简单。假设我们有以下文件夹结构

src/
   main.tex
   chapter1/
      chapter1.tex
      tikz/
         tikz-picture.tex
   chapter2/
      chapter2.tex
      big-table.tex

然后在主文件中main.tex我们有

...
\begin{document}

\relinput[./chapter1]{chapter1}
\relinput[./chapter2]{chapter2}
...
\end{document}

chapter1.tex

...
\relinput[./tikz]{tikz-picture}
...

chapter2.tex

...
\relinput{big-table} % \relinput[./]{big-table} would also work
...

相关内容