我在文件中存储了以下最少代码file.dtx
:
% \iffalse
% \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\begin{document}
\DocInput{file.dtx}
\end{document}
%</driver>
%<*class>
\RequirePackage{ifpdf}
\ifpdf\RequirePackage[
plainpages=false, % Multiple page numbering support
pdfpagelabels, % Generate pdf page labels
pdftex, % PDF Metadata stamping
pdfcreator={Some string}
]{hyperref}\fi
%</class>
% \end{macrocode}
% \fi
尝试通过排版此代码latex file.dtx
会导致以下错误消息:
! LaTeX Error: \begin{document} ended by \end{macrocode}.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.20 % \end{macrocode}
删除\fi
后\ifpdf ... \fi
错误就会消失,但是通过删除<*class> ... </class>
then 的内容生成的 cls 文件包含未终止的 if。
我做错了什么吗?有没有办法可以阻止这种行为?
答案1
你要
% \iffalse
% \begin{macrocode}
%<*driver>
\documentclass{ltxdoc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\begin{document}
\DocInput{file.dtx}
\end{document}
%</driver>
% \end{macrocode}
% \fi
% \begin{macrocode}
%<*class>
\RequirePackage{ifpdf}
\ifpdf\RequirePackage[
plainpages=false, % Multiple page numbering support
pdfpagelabels, % Generate pdf page labels
pdftex, % PDF Metadata stamping
pdfcreator={Some string}
]{hyperref}\fi
%</class>
% \end{macrocode}
在您的原文中,\DocInput{file.dtx}
文件读入后被%
忽略,因此\iffalse
被看到。因为这是错误% \begin{macrocode}
的跳过所以代码部分是不是逐字阅读。但它们也没有被执行。
因此\RequirePackage{ifpdf}
没有执行,所以\ifpdf
没有定义。特别是它不是一个...\if
然而当你到达{hyperref}\fi
\fi
是定义因此终止\iffalse
%
仍然被忽略因此\end{macrocode}
被执行并生成您陈述的错误。
正如 egreg 注释的那样,第一个macrocode
环境总是被注释掉%
或跳过,\iffalse
所以实际上并没有做任何事情,但如果所有代码部分都这样标记,它可能会简化编辑,并且不会造成任何危害。