我正在尝试调用 ImageMagic 来裁剪图片。我用 向系统发送命令\write18
,我需要在命令行中使用百分号。不能使用“ \%
”,但\@percentchar
效果几乎不错。几乎是因为它忽略了宏后和行内的所有空格:
\makeatletter
\immediate\write18{start cmd echo /k magick convert _SDC2664.jpg -crop 50\@percentchar x100\@percentchar +repage _SDC2664.jpg}
\makeatother
我收到错误
"convert: invalid argument for option '-crop': 50%x100%+repage @ error/convert.c/
ConvertImageCommand/1210."
因此,我需要一个空格“”。"50%x100%+repage"
改成50%x100% +repage
有什么建议么?
答案1
使用\@percentchar\space
(一个好问题是:为什么\@percentchar
只是一个内部命令?more-available\percentchar
在 doc.dtx 中定义。)
答案2
您可以定义自己的命令
\makeatletter
\edef\wpercent{\@percentchar\space}
\makeatother
并使用
\immediate\write18{start cmd echo /k magick convert _SDC2664.jpg -crop 50\wpercent x100\wpercent +repage _SDC2664.jpg}
如果你不打算将命令行作为参数传递给另一个命令,你可以这样做
\makeatletter
\newcommand{\magick}{\begingroup\catcode`\%=12 \@magick}
\newcommand{\@magick}[1]{\immediate\write18{#1}\endgroup}
\makeatother
\magick{start cmd echo /k magick convert _SDC2664.jpg -crop 50% x100% +repage _SDC2664.jpg}
(您的编辑器的语法颜色可能会因此而受到干扰,正如您所见,将其添加\magick
到逐字命令列表中)。
如果您的转换使用完全相同的参数,您可以用更简单的方法完成:
\providecommand{\magick}{}% to check it's not defined
\begingroup\catcode`\%=12
\gdef\magick#1{start cmd echo /k magick convert #1 -crop 50% x100% +repage #1}
\endgroup
然后简单地调用\magick{_SDC2664.jpg}
没有的话可以吗\gdef
? 是:
\begingroup\lccode`?=`\% \lowercase{\endgroup
\newcommand{\magick}[1]{start cmd echo /k magick convert #1 -crop 50? x100? +repage #1}
}
它利用了“参数化”命令行中没有大写字符这一事实。这不会影响调用时参数中的大写,因为\lowercase
它只在定义时执行。