使用子文件时获取主文档的名称

使用子文件时获取主文档的名称

当使用该subfiles包时,是否有一些命令可以获取主文档的名称,即使在编译其中一个子文档时也是如此?

下面是一个 MWE,它表达了我的想法:

\RequirePackage{filecontents}
%
\begin{filecontents*}{main.tex}
\documentclass{article}
\usepackage{subfiles}
\end{filecontents*}
%
\documentclass[main.tex]{subfiles}
\begin{document}
Child document's name: \jobname % this displays 'Child document's name: <the_name_you_gave_to_this_document>

Main document's name: % <some_command>  -- this should display 'Main document's name: main'
\end{document}

<some_command>我正在寻找的命令在哪里。

答案1

您传递给类的选项subfiles存储在 中\preamble@file,稍后\input由类使用。要获取文件的基本名称,您可以使用 LaTeX 的\filename@parse,它将基本名称存储在 中\filename@base

\RequirePackage{filecontents}
%
\begin{filecontents*}{main.tex}
\documentclass{article}
\usepackage{subfiles}
\makeatletter
\let\noibe@ifloaded\@ifl@aded
\def\mainfilename{%
  \noibe@ifloaded{cls}{subfiles}%
    {\filename@parse{\preamble@file}\filename@base}
    {\jobname}%
}
\makeatother
\begin{document}
Child document's name: \jobname % this displays 'Child document's name: <the_name_you_gave_to_this_document>

Main document's name: \mainfilename % -- this should display 'Main document's name: main'
\end{document}
\end{filecontents*}
%
\documentclass[main.tex]{subfiles}
\makeatletter
\let\noibe@ifloaded\@ifl@aded
\def\mainfilename{%
  \noibe@ifloaded{cls}{subfiles}%
    {\filename@parse{\preamble@file}\filename@base}
    {\jobname}%
}
\makeatother
\begin{document}
Child document's name: \jobname % this displays 'Child document's name: <the_name_you_gave_to_this_document>

Main document's name: \mainfilename % -- this should display 'Main document's name: main'
\end{document}

该命令检查加载的类是否为subfiles。如果是,则您位于子文件中,主文件名存储在中\preamble@file。否则,您位于主文件中,文件名是\jobname其本身。当您在主文件中时,该命令\preamble@file不存在,因此该命令会检查加载了哪个类并采取相应措施。

相关内容