如何在 \write18 命令中使用 %?

如何在 \write18 命令中使用 %?

我正在这样做:

\documentclass{article}
\begin{document}
\write18{echo '100%' > hash.tex}
\input{hash.tex}
\end{document}

但是,这不起作用(无法编译)。有什么解决方法吗?

答案1

由于%是注释字符,因此不能这样使用。有多种解决方案可用。

最简单的方法是使用\@percentchar,但这需要\makeatletter。更简单的是在前言中定义一个别名并在 中使用它\write

\documentclass{article}

\makeatletter\let\percentchar\@percentchar\makeatother

\begin{document}

\immediate\write18{echo '100\percentchar' > hash.tex}
\input{hash.tex}

\end{document}

不那么引人注目可能会

\documentclass{article}
\usepackage{shellesc}

\makeatletter
\newcommand{\exec}[1]{%
  \begingroup
  \let\%\@percentchar
  \ShellEscape{#1}%
  \endgroup
}
\makeatother

\begin{document}

\exec{echo '100\%' > hash.tex}
\input{hash.tex}

\end{document}

为什么shellesc?因为\ShellEscape适用于所有引擎,所以您不需要更改 LuaLaTeX 等代码。它确实\immediate\write18(或等效),这正是您所需要的:如果没有\immediate,执行将推迟到下一个页面 shipout,后续操作\input将失败。

答案2

您可以定义\sstring行为类似于的宏\string,但不打印反斜杠。(请注意,LuaTeX 具有\cssting用于此类任务的特殊原语。)

\def\sstring#1{\expandafter\sstringA\string#1\relax}
\def\sstringA#1#2\relax{#2}

\write18{echo '100\sstring\%' > hash.tex}

这是所有 TeX 敏感字符的通用解决方案,例如等等\sstring\{\sstring\#

相关内容