ifpdf 提前终止 iffalse

ifpdf 提前终止 iffalse

我在文件中存储了以下最少代码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所以实际上并没有做任何事情,但如果所有代码部分都这样标记,它可能会简化编辑,并且不会造成任何危害。

相关内容