在 \input 文件中,如何确定名称为“\input”的文件?

在 \input 文件中,如何确定名称为“\input”的文件?

我有两个 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

相关内容