代码

代码

该名称不应该\jobname扩展为不带扩展名的文件名吗?

我在看

它说显示结果的含义是宏。我的结果是否意味着这\jobname不是宏?

代码

\documentclass{article}
\begin{document}
\makeatletter
\show\jobname
\makeatother
\end{document}

输出:

> \jobname=\jobname.
l.4 \show\jobname

答案1

\jobname不是一个宏(本质上它没有用定义\def)它是一个可扩展的原语,可以扩展到文件名。

你可以用同样的扩展名制作一个宏

\edef\xjobname{\jobname}

*\show\xjobname
> \xjobname=macro:
->texput.

因此,它们\xjobname具有相同的扩展,\jobname但它们的行为不同\show,并且至关重要的是,如果用

\ifx\jobname\xjobname

但两个具有相同扩展的宏是\ifx相等的。

答案2

通常这就是 TeX 基元的反应方式。从电子书第三章:控制 TeX,第 10 页):

人们如何区分 TeX 基元和已在更高级别定义的控制序列?有两种方法:(1)本手册的索引列出了讨论的所有控制序列,每个基元都标有星号。(2)您可以在运行 TeX 时显示控制序列的含义。如果您输入\show\cs\cs任何控制序列,TeX 将以其当前含义响应。例如,\show\input结果是> \input=\input.,因为\input是基元。另一方面,\show\thinspace产生

> \thinspace=macro:
->\kern .16667em .

这意味着\thinspace已被定义为 的缩写\kern .16667em。通过输入,\show\kern您可以验证\kern是原始的。 的结果\show会出现在您的终端上以及运行 TeX 后获得的日志文件中。

强壮的方式虽然被声明为“宏”,但输出结果却非常奇怪。例如,\show\vspace打印

> \vspace=macro:
->\protect \vspace  .

在终端。

一些原语可以扩展还有一种方法深入了解强健命令的定义对于那些无法扩展的原语,你必须研究TeX 程序-代码.web或者其文档- 为了了解它在做什么。

使用大卫的例子在 TeX 终端中输入以下内容(未指定文件名):

\edef\xjobname{\jobname}

*\show\xjobname
> \xjobname=macro:
->texput.

528.最初作业名称= 0;一旦知道真实姓名,它就变为非零。我们有作业名称= 0 当且仅当log文件尚未打开时,当然除了作业名称变为非零之后的短时间内。

534.打开日志文件常规...

[...]
如果 作业名称= 0然后 作业名称←“ texput”;
[...]

相关内容