如何调用 \write18{pdflatex "\def\param{...}\input{filename}"}?

如何调用 \write18{pdflatex "\def\param{...}\input{filename}"}?

为什么我已启用但仍无法编译以下内容-shell-escape

\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{inputfile.tex}
%\def\paramA{standalone}
\def\paramB{Hello World}
\documentclass{\paramA}
\begin{document}
\paramB
\end{document}
\end{filecontents*}

\begin{document}
\immediate\write18{pdflatex "\def\paramA{standalone}\input{inputfile}"}
\immediate\write18{inputfile.pdf}
done!
\end{document}

日志档案

This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012/W32TeX)
 \write18 enabled.

<< the unnecessary texts are intentionally removed by me for the sake of simplicity >>

No file executor.aux.
! Undefined control sequence.
<write> pdflatex "\def \paramA 
                               {standalone}\input {inputfile}"
l.13 ...\def\paramA{standalone}\input{inputfile}"}

? 

答案1

正如错误消息所描述的,该宏\paramA未定义。

\write18尝试在将其转发到 shell 之前扩展其内容,因此你需要“保护”(不是\protect!)宏\paramA\input使用

  • \noexpand(一次性使用),
  • \string(一次性使用),
  • \unexpanded(多种用途),或
  • \detokenize(多种用途)。

在这种情况下,最简单的解决方案是使用\unexpanded或,\detokenize因为您实际上没有需要扩展的宏:

\immediate\write18{\unexpanded{pdflatex "\def\paramA{standalone}\input{inputfile}"}}

每次都需要保护单个宏:

\immediate\write18{pdflatex "\def\string\paramA{standalone}\string\input{inputfile}"}

相关内容