为什么 \jobname 给出的是星号而不是空格,我该如何解决这个问题?

为什么 \jobname 给出的是星号而不是空格,我该如何解决这个问题?

test 1.tex当我用 LaTeX 编写以代码命名的文件时\edef\temp{\jobname.txt}\show\temp,我得到了

> \temp=macro:
->test*1.txt.

这似乎与 LaTeX 的内部命令配合得很好,但如果我将其与 混合\write18,就会失败。
例如,

\newwrite\tempwrite
\immediate\openout\tempwrite\temp\relax
\immediate\write\tempwrite{test}
\immediate\closeout\tempwrite
\immediate\write18{rm "\temp"}

我怎样才能获得一个\jobname实际使用空格而不是星号的版本?(我可以用 catcodes 做一些花哨的事情来将\write18星号转换为空格吗?)

答案1

此行为是 MiKTeX 特有的:Windows 上的 TeX Live 的行为与其他平台上的行为相同,并引用文件名。

你可以做的是将*字符转换为空格。例如

\edef\Jobname{\jobname}
\catcode`\*=\active
\def*{ }
\edef\Jobname{"\detokenize\expandafter{\scantokens\expandafter{\Jobname\noexpand}"}}
\edef\Jobname{\detokenize\expandafter{\Jobname}}
\catcode`\*=12 %
\show\Jobname

(使用 e-TeX)将干净地完成任务。当然,这只有在文件名中没有*字符时才有效。(不应该有,但它是可能的最终得到这种尴尬的文件名!)

相关内容