宏 \@percentchar 后的空格

宏 \@percentchar 后的空格

我正在尝试调用 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它只在定义时执行。

相关内容