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