\write18 将 % 传递到 shell

\write18 将 % 传递到 shell

在其他一些帖子中已经提到过这一点,但出于路径原因,我想避免使用 shell 脚本,而直接在\immediate\write18{...}宏命令中使用 ImageMagick (IM) 转换命令行可执行文件,但在我的 IM 转换指令中,我需要将%(ASCII 37) 作为宏的一部分传递。

然而,我试图构思制作一个%- 我已经尝试了很多方法(!)我总是最终得到我用于传递到命令行的%的 Latex 代码。

显而易见的是,\%直接进入 shell \%,这是所有其他选项都遵循的模式。

我显然似乎需要某种方法来生成 ASCII 或 unicode,%并通过或其他方式将其从 LaTeX 传输到 shell \write18

或者对 LaTeX 的使用进行某种形式的暂时中止,%以便它可以成为的一部分\write18{},并且不会破坏作为注释启动器的命令,因此无需先进行 LaTeX 转义即可传递。

答案1

使用\@percentchar而不是。如果代码不在包或类中或不在...块内,%则需要\makeatletter在 之前\write\makeatother之后说明 以允许在宏名称中使用 。@\makeatletter\makeatother

还有\@backslashcharfor\和 also\@charlb以及\@charrbfor{}。它们在我的macros2e文件中提到LaTeX 内部命令的文档参考?

你现在还可以使用新版本的newverbs包。例如,要为 & 符号定义一个宏,请使用:

\usepackage{newverbs}[2011/07/24]
\Verbdef\amp{&}

请注意,语句中的宏后面的空格也会被删除\write,因此您可能需要使用 手动插入一个\space

答案2

以下是我关于将百分比字符写入文件的看法:

在此处输入图片描述

\documentclass{article}
\usepackage{verbatim}
%
\newwrite\tmpfile
%
\begingroup\lccode`\S=`\%\relax\lowercase{\endgroup\def\mypercent{S}}%
\newcommand\mysecondoftwo[2]{#2}%
%
\immediate\openout\tmpfile test.txt
\immediate\write\tmpfile{Approach 1: Some text and a percent sign\mypercent}%
\immediate\write\tmpfile{Approach 2: Some text and a percent sign\expandafter\mysecondoftwo\string\%}%
\immediate\write\tmpfile{Approach 3: Some text and a percent sign\csname @percentchar\endcsname}%    
\immediate\write\tmpfile{Approach 4: Some text and a percent sign\csname @secondoftwo\expandafter\endcsname\string\%}%        
\makeatletter
\immediate\write\tmpfile{Approach 5: Some text and a percent sign\@percentchar}%
\immediate\write\tmpfile{Approach 6: Some text and a percent sign\expandafter\@secondoftwo\string\%}%
\makeatother
\begingroup
\def\textmacro{Approach 7: Some text and a percent sign}%
\lccode`\S=`\%%
\lowercase{\immediate\write\tmpfile{\textmacro S}}%
\endgroup
\immediate\closeout\tmpfile

\begin{document}
\verbatiminput{test.txt}
\end{document}

相关内容