为什么不能在文档中嵌入 \if 构造

为什么不能在文档中嵌入 \if 构造

我想创建一个 DTX 文件,可以根据用户的选择以两种不同的方式进行编译。一种方法是仅获取用户文档,另一种方法是获取用户文档代码文档。

我不想使用,\StopEventually因为在第二种情况下,我不想将这些文档分成两个不同的部分,而是在整个文档中混合。

为了实现这一点,我设置了一个与通常使用的模板不同且更简单的 DTX 模板,IE来自TeX 技巧或来自约瑟夫·赖特

在几乎所有情况下,一切都运行良好,但在我将其分离并简化为以下 LaTeX 代码块的情况下,却没有一个:

% \newif\ifcode
% \codefalse ^^A Change to \codetrue to include code documentation

% \iffalse
%<*documentation>
\documentclass{ltxdoc}
\begin{document}
 \DocInput{\jobname.dtx}
\end{document}
%</documentation>
%<*latex>
% \fi

% some user command explanations
% \ifcode
% some code explanations
%    \begin{macrocode}
\newif\ifcadre
\cadretrue
\renewcommand{\maketitle}
{
  \ifcadre
    \framebox{title}
  \else
    {title}
  \fi
}
%    \end{macrocode}
% \fi
% some other text
% \iffalse
%</latex>
% \fi
\endinput

当我尝试编译它时pdflatex出现以下错误

! Too many }'s.
l.27 }

?

当第 2 行从 更改为 时,\codefalse一切\codetrue正常。

当删除\ifcadre\else\fi行时,两种情况下一切正常(第 2 行中有\codetrue\codefalse)。

我是否遗漏了文档说明中的某些内容?

答案1

这实际上与 dtx 无关,而是与常见的“不要在条件块中定义条件”问题有关:

% \ifcode
% some code explanations
%    \begin{macrocode}
\newif\ifcadre
\cadretrue
\renewcommand{\maketitle}
{
  \ifcadre
    \framebox{title}
  \else

如果\ifcode为假\begin{macrocode}则为不是执行后,该块不会被逐字读取,而是在匹配 if else fi 标记时被跳过。

\newif\ifcadre没有执行,所以\ifcadre不是if,但是\else是,else并且事情出错了。

答案2

大卫的回答令人大开眼界。

有了这样的解释,就很容易找到解决方法。使用该verbatim包(及其编码良好的环境),当或 时,comment很容易以code不同的方式定义环境。\ifcodetruefalse

当它什么都不做(或几乎不做true)时false跳过里面的每一行。

以下是代码:

% \newif\ifcode
% \codefalse ^^A Change to \codetrue to include code documentation

% \iffalse
%<*documentation>
\documentclass{ltxdoc}
\usepackage{verbatim}
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</documentation>
%<*latex>
% \fi

% \ifcode\let\code\begingroup\let\endcode\endgroup
% \else\let\code\comment\let\endcode\endcomment\fi

% some text explaining things

% \begin{code}
%    \begin{macrocode}
\newif\ifcadre
\cadretrue
\renewcommand{\maketitle}
{
  \ifcadre
    \framebox{title}
  \else
    {title}
  \fi
}
%    \end{macrocode}
% \end{code}

% some other text

% \iffalse
%</latex>
% \fi
\endinput

相关内容