![如果在预编译的 .fmt 文件中使用,则无法获取真正的 currfile](https://linux22.com/image/257976/%E5%A6%82%E6%9E%9C%E5%9C%A8%E9%A2%84%E7%BC%96%E8%AF%91%E7%9A%84%20.fmt%20%E6%96%87%E4%BB%B6%E4%B8%AD%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%88%99%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96%E7%9C%9F%E6%AD%A3%E7%9A%84%20currfile.png)
背景:
我不确定这是否是一个错误包裹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
选项进行编译并编译两次。)