我该如何在lhs2TeX中隐藏代码块?

9

我希望使用latex来记录我的代码,但是在latex文档的开头看到所有这些模块和编译器扩展真的很烦人。有没有一些标志可以传递给lhs2TeX,以防止它在pdf中显示此代码部分,同时仍然让ghc看到代码?

这似乎是一个非常基本的功能,但我在手册中找不到它。

3个回答

6

确实正确的方法是使用条件语句。

简单的选项是完全排除这种代码的lhs2TeX处理:

%if False
Everything you want LaTeX not to see. Can be

> code

as well as other stuff.
%endif

在更高级的场景中,您可能希望使用lhs2TeX预处理LaTeX源代码和Haskell代码。在这种设置下,您可以使用

%if style /= newcode
Everything you want LaTeX not to see, as above.
%else
Everything you want LaTeX to see, but not Haskell.
%endif

这里是一个我在实践中使用它的示例:假设我有一个函数的两个版本;在文档中,我不想区分它们,但在Haskell代码中,它们应该有不同的名称。另一方面,示例的第一个版本是不完整的,所以我有一个省略号,但我仍然希望它通过类型检查。因此,我可以这样做:
%if style /= newcode
%format example1 = example
%format example2 = example
%format DOTS = "\dots "
%else
%format DOTS = "undefined"
%endif

Our first attempt:

> example1 = 42 == DOTS

Now we complete the example:

> example2 = 42 == 6 * 9

你可以使用--newcode 模式处理此文件,以提取预处理的Haskell代码;也可以使用--poly 模式获取通常的LaTeX代码。
手册中在第10节描述了条件语句,11.1节和11.4节提供了条件语句的使用示例。

如果“DOTS”对于正确执行程序非常重要,但由于空间限制而无法在文档中详细介绍,那该怎么办呢?目前,我只能复制整个代码块并用if/else语句包裹起来,只是为了将一个定义更改为“...”。 - undefined
理想情况下,%if/%else/... 应该在代码块内起作用,但事实证明它们并不起作用。 - undefined

5

我使用以下样式。

%if False

\begin{code}
<code>
\end{code}

%endif

编辑:我刚刚发现Andres Löh的幻灯片,我可能是从那里借鉴了这种风格。


4

http://www.haskell.org/haskellwiki/Literate_programming...

如果您想隐藏一些代码,您可以定义:

\long\def\ignore#1{}

辅助功能可以按以下方式隐藏:
\ignore{
\begin{code}
help = putStr "Help me, what is this LiterateProgramming thing??"
\end{code}
}

2
我实际上不鼓励这种解决方案。当然,可以使用像这样的宏来排除TeX文档的某些部分。但是,给定的\ignore很可能会在文档中引入虚假空格(在闭合}之后),并且其存在仍可能以微妙的方式影响周围的文档。如果您想了解所有问题,请查看LaTeX“comment”环境及其文档。在预处理器中进行隐藏完全绕过了这些问题。 - kosmikus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接