我的main.tex
\catcode`\%=11
\immediate\write18{git log -1 --pretty=format:"%h%x3b%ad" --date=short > \jobname.info}
\catcode`\%=14
它从 git 中提取版本详细信息。现在我想将其放入.sty
我在开始时加载的文件中,以便我可以重复使用此宏。文件中的代码.sty
是:
\newcommand*{\getverhash}{\catcode`\%=11\immediate\write18{git log -1 --pretty=format:"%h%x3b%ad" --date=short > \jobname.info}\catcode`\%=14}
但是,即使没有调用宏,\getverhash
我也会收到以下错误:
Runaway argument?
{\catcode `\%=11\immediate \write 18{git log -1 --pretty=format:"\par \ETC.
./main.tex:17: File ended while scanning use of \@argdef.
<inserted text>
\par
我猜问题在于更改包内的百分号 () 的 catcode %
- 但我不知道如何解决这个问题。\getverhash
在包内定义的正确方法是什么?
答案1
该问题与包无关,如果你在序言中使用它,你会看到相同的问题
\newcommand*{\getverhash}{\catcode`\%=11\immediate\write18{git log -1 --pretty=format:"%h%x3b%ad" --date=short > \jobname.info}\catcode`\%=14}
参数\newcommand
(像任何宏一样)在执行之前会被扫描,因此 TeX 试图找到}
newcommand 参数的结束,但由于%
catcode 更改不会应用,直到此命令被执行用过的已经太晚了。
\catcode`\%=11
\newcommand*{\getverhash}{\immediate\write18{git log -1 --pretty=format:"%h%x3b%ad" --date=short > \jobname.info}
\catcode`\%=14
或者更简单,不需要更改 catcode
\newcommand*{\getverhash}{\immediate\write18{git log -1 --pretty=format:"\@percentchar h\@percentchar x3b\@percentchar ad" --date=short > \jobname.info}