可以安全地重新定义 \jobname 吗?

可以安全地重新定义 \jobname 吗?

我想从外部文档访问标签——一般来说这不是软件包的问题xr。但在这种情况下,两个文档都是在 sharelatex 上编译的,并且\jobname始终设置为output。所以我想知道如何保存来自外部文档的辅助文件,以便它不会被下一次编译覆盖。

我的一个想法是重新定义\jobname

\def\jobname{testnewjobname} %better before the class ...
\documentclass{article}

\begin{document}
\tableofcontents
\section{a}\label{abc}\ref{abc}


\end{document}

在这么小的例子中,这似乎运行良好,但我想知道它是否会在更大的设置中爆发。

编辑

我对 sharelatex 进行了一些测试,这个想法似乎很好。sharelatex 写入并查找辅助文件。当清除辅助文件的缓存时,它们也会被删除。

答案1

TeX(任何引擎)以以下方式决定用于主输出和日志文件的作业名称

  1. 如果在命令行中指定了文件名,则该文件名将用作作业名称
  2. \input如果以交互模式启动,则提示符下的第一个文件**决定作业名称
  3. 但是,如果在确定作业名称之前需要将某些内容写入日志文件,或者\jobname访问原语,则作业名称将设置为texput

请注意,-jobname命令行选项会覆盖上述步骤并让 TeX 将作业名称设置为选项所指定的名称。

当作业名称确定后, 的含义\jobname就变成了表示之前确定的作业名称的字符串(包含类别代码 12 的字符)(空格保留类别代码 10,但前提是 TeX 引擎的实现能够处理文件名中的空格)。

此后,将无法进行“内部”访问\jobname,也无法更改主输出文件(DVI 或 PDF)或日志文件的文件名。

因此可以改变 的含义\jobname。宏将使用 的当前含义\jobname,但它应该是原始的或扩展为字符串的宏。

例如,LaTeX\@input{\jobname.aux}在处理时会执行以下任务\begin{document},然后,除非\if@filesw返回 false \immediate\openout\@mainaux\jobname.aux,。

宏如将基于等等\makeindex设置输出流。主输出文件名不可用于 TeX,除非使用\jobname原始 \jobname

因此,我认为重新定义它没有什么问题。但是,为了统一,它应该是一个字符串(类别代码 12 个字符),以避免某些宏检查时出现问题\jobname。因此

\edef\TeXjobname{\jobname} % keep a copy just for safety
\edef\jobname{\detokenize{WHATEVER}}

似乎就是您所需要的,其中WHATEVER代表您想要使用的字符串。

如果不假设 e-TeX,则第二个定义可以是

\begingroup\escapechar=-1
\xdef\jobname{\expandafter\string\csname WHATEVER\endcsname}
\endgroup

作为\jobname一个可扩展的原语,只要重新定义的\jobname是扩展为字符串的宏,行为上就不应该有差异。

请注意,在 pdfTeX 和 LuaTeX 中,可以使用\pdfprimitive\jobname来访问原始含义。\primitive\jobname在 XeTeX 中是这样的。因此,使用上述代码保存原始含义对于 Knuth TeX 来说确实是必要的。

相关内容