这个问题引出了包中的一个新功能:
从 0.6 版开始currfile
通过新的软件包选项和编译器开关支持所请求的功能-recorder
。有关详细信息,请参阅马丁的回答以下。
根据文献,我推测 Martin Scharrer 的currfile
包会这样做。但是,虽然它可以很好地跟踪\input
s 和\include
s 上的实际文件名,但主文件的名称.tex
仍然设置为\jobname
:
\documentclass{article}
\usepackage{currfile}
\begin{document}
I was compiled as job \texttt{\jobname} from the file \texttt{\currfilename}.
\end{document}
如果另存为test.tex
并编译,pdflatex -jobname bla test.tex
输出为:
即使编译也pdflatex -jobname bla "\input{test.tex}"
不会改变输出。
答案1
随着呼叫
pdflatex -jobname bla "\RequirePackage{currfile}\input{test}"
宏\currfilename
打印test.tex
在执行之前,必须先改变\input
(实际上是)的含义。\@iinput
答案2
你说得对,我的currfile
包应该会给你真正的文件名,但是没有办法直接从 TeX 读取真正的主文件名。因此我不得不使用\jobname
。
但是,我现在找到了一种方法,即读取编译器开关\jobname.fls
生成的文件-recorder
。此功能自 2012/05/06 的 v0.6 版本开始可用。请注意,-recorder
已被使用latexmk
,因此如果您正在使用它,则无需额外努力。
要启用此功能,只需加载currfile
选项即可realmainfile
。相关abspath
选项会为您提供所有输入文件的绝对路径,它还将启用realmainfile
。
% Compile with: (pdf|xe|lua|)latex -recorder filename
% Needs two runs with MiKTeX, one with TeX Live
\documentclass{article}
\usepackage[realmainfile]{currfile}[2012/05/06]
\begin{document}
Jobname: \jobname
Main file (path): \currfilepath
\end{document}
如果您不需要完整的功能currfile
(它将为每个输入文件更新几个宏),那么您可以直接使用子包currfile-abspath
:
% Compile with: (pdf|xe|lua|)latex -recorder filename
% Needs two runs with MiKTeX, one with TeX Live
\documentclass{article}
\usepackage{currfile-abspath}
\getmainfile % In preamble or body
\begin{document}
Jobname: \jobname
Main file: \themainfile
\end{document}