我想创建一个 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
不同的方式定义环境。\ifcode
true
false
当它什么都不做(或几乎不做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