为什么我已启用但仍无法编译以下内容-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}"}