使用答案包时出现不完整的 \iffalse 错误

使用答案包时出现不完整的 \iffalse 错误

此代码

\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}}

相关内容