我有两个 tex 文件
% file1.tex (this is the inputing file)
\input file2
\bye
和
% file2.tex (this is the file input into file1.tex)
\printTheNameOfWhateverFileInputMe
正在显示第一个文件名的是
% file2.tex(这是输入到 file1.tex 的文件)\jobname %(这将打印“file1”)
但如果 file2.tex 是从 file1.tex 中包含的,而 file1.tex 是主要工作,因此\jobname
在这种情况下与 not相吻合
% file0.tex
\input file1
\bye
% file1.tex
\input file2
% file2.tex
\jobname %(shows "file0" instead of "file1")
答案1
currfile
提供文件名挂钩:
\documentclass{article}
\usepackage{currfile,filecontents}
\begin{filecontents*}{file1.tex}
\verb|file1|: \currfilename
\input{file2}
\end{filecontents*}
\begin{filecontents*}{file2.tex}
\verb|file2|: \currfilename
\end{filecontents*}
\begin{document}
\verb|file0|: \jobname .tex
\input{file1}
\end{document}
您还可以捕获\currfilename
以用于另一个输入文件,从而有效地捕获“父文件”。 这是由选项[parent]
和使用提供的\parentfilename
:
\documentclass{article}
\usepackage[parent]{currfile}
\usepackage{filecontents}
\begin{filecontents*}{file1.tex}
\verb|parent|: \parentfilename \par
\verb|file1|: \currfilename
\input{file2}
\end{filecontents*}
\begin{filecontents*}{file2.tex}
\verb|parent|: \parentfilename \par
\verb|file2|: \currfilename
\end{filecontents*}
\begin{document}
\verb|file0|: \jobname .tex
\input{file1}
\end{document}
答案2
expl3
在Plain TeX 上工作的实现如下:
主文件hap.tex
\input expl3-generic
\ExplSyntaxOn
% we implement a stack
\seq_new:N \g_hap_filename_seq
\seq_gput_right:Nx \g_hap_filename_seq { \c_sys_jobname_str }
\cs_new_protected:Npn \sinput #1
{
\seq_gput_right:Nx \g_hap_filename_seq { #1 }
\tex_input:D #1 \scan_stop:
\seq_gpop_right:NN \g_hap_filename_seq \l_tmpa_tl
}
\cs_new:Npn \currentfile
{
\hap_parent:n { -1 }
}
\cs_new:Npn \parentfile
{
\hap_parent:n { -2 }
}
\cs_new:Nn \hap_parent:n
{
\seq_item:Nn \g_hap_filename_seq { #1 }
}
\ExplSyntaxOff
current file: \currentfile, parent file: \parentfile
\sinput{hap-first}
\bye
二级文件hap-first.tex
current file: \currentfile, parent file: \parentfile
\sinput{hap-second}
二级文件hap-second.tex
current file: \currentfile, parent file: \parentfile
输出
仅使用纯 TeX:
\newtoks\filestack
\global\filestack={{\jobname}{}}
\def\sinput#1{%
\edef\sinputtemp{{#1}\the\filestack}%
\global\filestack=\expandafter{\sinputtemp}%
%\immediate\write20{Stack: \the\filestack}% for debugging
\input #1\relax
\edef\sinputtemp{\expandafter\gobble\the\filestack}%
\global\filestack=\expandafter{\sinputtemp}%
%\immediate\write20{Stack: \the\filestack}% for debugging
}
\def\currentfile{\expandafter\firstitem\the\filestack\filestack}
\def\parentfile{\expandafter\seconditem\the\filestack\filestack}
\def\gobble#1{}
\def\firstitem#1#2\filestack{#1}
\def\seconditem#1#2#3\filestack{#2}
current file: \currentfile, parent file: \parentfile
\sinput{hap-first}
\bye