简单任务

简单任务

简单任务

假设有一个example.tex包含 Haskell 列表的文件:

\documentclass{article}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{code}{Verbatim}{fontsize=\small}

\begin{document}
\begin{code}
sequence :: [IO a] -> IO [a]
sequence      [] = return []
sequnce (c : cs) = do
  x <- c
  xs <- sequence cs
  return (x : xs)
\end{code}
\end{document}

之前容易

让我们准备通过以下方式处理此文件lhs2TeX

\documentclass{article}
%include lhs2TeX.fmt
%include lhs2TeX.sty

\begin{document}
\begin{code}
sequence :: [IO a] -> IO [a]
sequence      [] = return []
sequnce (c : cs) = do
  x <- c
  xs <- sequence cs
  return (x : xs)
\end{code}
\end{document}
  • lhs2TeX example.tex -o example_new.tex
  • pdflatex example_new.tex

我们所拥有的:

容易之后

这正是我想要的来源样子。

真实示例

\input在现实世界中,主文件中通常有许多包含 haskell 源的文件,这些文件由命令收集:

hardmod.tex

\documentclass{disser}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{code}{Verbatim}{fontsize=\small}
\begin{document}
\input{first}
\input{second}
\end{document}

first.tex

Some stuff

\begin{code}
sequence :: [IO a] -> IO [a]
sequence      [] = return []
sequnce (c : cs) = do
  x <- c
  xs <- sequence cs
  return (x : xs)
\end{code}

and more words.

second.tex

Another example of code:
\begin{code}
ap :: Monad m => m (a -> b) -> m a -> m b
ap mf mx = do
  f <- mf
  x <- mx
  return (f x)
\end{code}
And a conclusion. 

lhs2TeX生成整个乳胶文档,这就是为什么hardmod.tex使用准备的良好源代码进行编译有点棘手的原因lhs2TeX

问题:如何lhs2TeX在这种复杂结构化的文档中使用以获得良好的源格式?

答案1

实际答案

您有两个选择:

  1. 使用lhs2TeX%include指令而不是\input。这是最简单的方法,我推荐它。

  2. 使用 分别处理每个文件lhs2TeX,然后合并结果。每个文件必须有一行%include polycode.fmt。如果您需要对代码的不同部分使用非常不同的格式指令(例如,如果您使用lhs2TeX来处理不同的编程语言),则此选项非常有用。

请注意,您的问题实际上是lhs2TeX 手册

一些补充说明

  1. 您应该将源代码放在.lhs文件中,而不是.tex文件里。关键在于lhs2TeX您拥有有文化的 Haskell 源代码,并且它们仍然是有效的 Haskell。

  2. 你不应该使用

    %include lhs2TeX.fmt
    %include lhs2TeX.sty
    

    这早已被弃用。相反,使用

    %include polycode.fmt
    
  3. 你说你的示例看起来和你想要的排版 Haskell 代码完全一样,但实际上,你没有利用 的lhs2TeX对齐功能,这是使用它的主要优点之一。要使=输出中的符号对齐,请确保在源中符号前面有两个空格。

相关内容