![为什么 \jobname 给出的是星号而不是空格,我该如何解决这个问题?](https://linux22.com/image/235964/%E4%B8%BA%E4%BB%80%E4%B9%88%20%5Cjobname%20%E7%BB%99%E5%87%BA%E7%9A%84%E6%98%AF%E6%98%9F%E5%8F%B7%E8%80%8C%E4%B8%8D%E6%98%AF%E7%A9%BA%E6%A0%BC%EF%BC%8C%E6%88%91%E8%AF%A5%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%EF%BC%9F.png)
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)将干净地完成任务。当然,这只有在文件名中没有*
字符时才有效。(不应该有,但它是可能的最终得到这种尴尬的文件名!)