答案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
...