此代码
\documentclass{book}
\usepackage{answers}
\Opensolutionfile{foo}
\begin{document}
%\Writetofile{foo}{whatever} % OK
\Writetofile{foo}{\noexpand\chapter{bar}} % fails
\end{document}
产生此错误
Output from handle foo going to foo.tex
(c:\eb\tex\q.aux)
! Incomplete \iffalse; all text was ignored after line 10.
<inserted text>
\fi
l.10 \Writetofile{foo}{\noexpand\chapter{bar}}
% fails
该构造在另一台安装了相对较新的 MiKTeX 的计算机(现已损坏)上完美运行。在这台 Windows 7 机器上,我运行
C:\eb\tex>pdflatex -version
MiKTeX-pdfTeX 2.9.4902 (1.40.14) (MiKTeX 2.9)
我查看了具有类似\iffalse
错误消息的相关问题,但无济于事。
答案1
该answers
包(现在)使用标准 LaTeX2e\protect
机制写入外部文件。这里的实现细节并不重要,但关键结果是您不应该使用 TeX 原语\noexpand
,而应该使用\protect
命令
\documentclass{book}
\usepackage{answers}
\Opensolutionfile{foo}
\begin{document}
%\Writetofile{foo}{whatever} % OK
\Writetofile{foo}{\protect\chapter{bar}} % fails
\end{document}
\protect
(背景故事:LaTeX2e 的机制根据上下文改变了的定义。在这里,\noexpand
不是正确的选择。)
答案2
这是另一种解决方案
\documentclass{book}
\usepackage{answers}
\Opensolutionfile{foo}
\begin{document}
\begin{Filesave}{foo}
\chapter{bar}
\end{Filesave}
\makeatletter
\immediate\write\foo@file{\unexpanded{\section{too}}}
\makeatother
\end{document}
你可以使用以下命令定义新命令
\makeatletter
\newcommand{\mtwrite}[2]{%
\immediate\write\csname #1@file\endcsname{\unexpanded{#2}}}
\makeatother
并使用它
\mtwrite{foo}{\chapter{too}}