![\write18 将 % 传递到 shell](https://linux22.com/image/236860/%5Cwrite18%20%E5%B0%86%20%25%20%E4%BC%A0%E9%80%92%E5%88%B0%20shell.png)
在其他一些帖子中已经提到过这一点,但出于路径原因,我想避免使用 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
还有\@backslashchar
for\
和 also\@charlb
以及\@charrb
for{
和}
。它们在我的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}