如果在预编译的 .fmt 文件中使用,则无法获取真正的 currfile

如果在预编译的 .fmt 文件中使用,则无法获取真正的 currfile

背景:

我不确定这是否是一个错误包裹currfile,或者如果我没有正确使用包,或者可能是使用 .fmt文件时出现问题。顺便说一句,这是我第一次尝试使用.fmt文件。

由于我在所有文档中使用相同的前言,因此我试图通过.fmt按照下面引用的问题生成文件来加快编译速度,但在执行某些操作时遇到了麻烦\AtBeginDocument。下面的示例测试以查看标记的值\MyToken是否设置为两个破折号之间的文件名部分。

问题:

使用预编译.fmt文件我得到:

在此处输入图片描述

注意,的值\currfilename是前导文件的文件名,这不是我想要的(也许一些\expandafter魔法可以帮助)。

但是,如果我使用下面给出的两个文件创建一个完整的 .tex 文件(并删除%& MyPreamble),则您得到的输出就是所需的行为。 的值\currfilename是文件的名称。

在此处输入图片描述

部分解决方案

  • 一个部分解决方案是使用\jobname(按照序言中的注释行)。这样在两种情况下都会产生相同的结果。但是,我无法在实际应用程序中使用它,因为我进行了更改\jobname以便从同一源文档生成多个版本。

参考:

笔记:

  • 这里的实际文件名很重要。
  • 为了生成MyPreamble.fmt,我使用:

    pdflatex -ini -jobname=MyPreamble "&pdflatex MyPreamble.tex\dump"
    

代码:MyPreamble.tex

\documentclass{article}
\usepackage{xcolor}
\usepackage{xstring}
\usepackage{lipsum}
\usepackage[realmainfile]{currfile}% 

\newtoks{\MyToken}
\MyToken={oo}% set default value
\AtBeginDocument{%
    \par\noindent\textcolor{blue}{Debug: currfilename = "\currfilename"}\par%
    % These two (StrBefore and StrBetween) statements do not work,
    % if this is used via .fmt file.
    \StrBefore{\currfilename}{.}[\CurrentFileName]% 
    \StrBetween[1,2]{\CurrentFileName}{-}{-}[\ExtractedValue]%
    %
    %\StrBetween[1,2]{\jobname}{-}{-}[\ExtractedValue]% this works
    \IfStrEq*{\ExtractedValue}{\the\MyToken}{}{%
        \par\noindent\textcolor{red}{Error: MyToken (middle) was "\the\MyToken", 
                but was expected to be "\ExtractedValue".}\par%
    }%
}
%% ----- preamble ends here

代码:foo-x-bar.tex

%& MyPreamble

% This file need to be named in three parts separated by two dashes.
% This need to be set to be the value in between the two dashes. So,
% if this file is named "foo-x-bar.tex", then this needs to be "x"
\MyToken={x}%

\begin{document}
    \lipsum[1]
\end{document}

答案1

如果您使用\getmainfile\themainfile,则会使用正确的文件名:

\documentclass{article}
\usepackage{xcolor}
\usepackage{xstring}
\usepackage{lipsum}
\usepackage[realmainfile]{currfile}% 

\newtoks{\MyToken}
\MyToken={oo}% set default value
\AtBeginDocument{%
    \getmainfile
    \par\noindent\textcolor{blue}{Debug: themainfile = "\themainfile"}\par%
    % These two (StrBefore and StrBetween) statements do not work,
    % if this is used via .fmt file.
    \StrBefore{\themainfile}{.}[\CurrentFileName]% 
    \StrBetween[1,2]{\CurrentFileName}{-}{-}[\ExtractedValue]%
    %
    %\StrBetween[1,2]{\jobname}{-}{-}[\ExtractedValue]% this works
    \IfStrEq*{\ExtractedValue}{\the\MyToken}{}{%
        \par\noindent\textcolor{red}{Error: MyToken (middle) was "\the\MyToken",
                but was expected to be "\ExtractedValue".}\par%
    }%
}
%% ----- preamble ends here

pdflatex -recorder foo-x-bar

我第一次就跑到了

在此处输入图片描述

答案2

编译文档文件时,TeX 不会\input加载它,因此没有东西可以currfile挂载,因此 why\currfile不正确。你可以通过使用命令行编译文档文件来解决这个问题

pdflatex -recorder -fmt MyPreamble '\input{foo-x-bar.tex}'

(记住,当currfile使用该选项加载包时realmainfile,您应该使用该-recorder选项进行编译并编译两次。)

相关内容