我正在这样做:
\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\#