我使用 pandoc 作为库,相关代码片段是:
module Lib
( latexDirToTex, latexToTxt
) where
import qualified Data.ByteString as BS
import Data.List (isSuffixOf)
import qualified Data.Text as T
import qualified Data.Text.IO as TIO
import ForeignLib (chdir)
import Path
import System.Directory (getDirectoryContents )
import Text.Pandoc
import Text.Pandoc.UTF8 (toText)
latexToTxt :: Path b File -> IO T.Text
latexToTxt fPath = do
fileBS <- BS.readFile $ toFilePath fPath
result <- runIO $ do
doc <- readLaTeX def $ toText fileBS
writePlain def doc
handleError result
Run Code Online (Sandbox Code Playgroud)
由此,您可以看到我基本上只是调用readLaTeX来读取 LaTeX 文档。
然而,当我尝试运行这段代码时,在实践中遇到了很多麻烦,出现了像标题中的错误:
[WARNING] Could not convert TeX math '\begin{array}{ccccccccccc}
& & 1 & 2 & 4 & 7 & 11 & 15 & 15 & & \\
\hline
0 & \vline & 1 & 0 & 0 & 0 & 0 & 0 & 0 & \vline & 1 \\
1 & \vline & 1 & 1 & 0 & 0 & 0 & 0 & 0 & \vline & 3 \\
2 & \vline & 1 & 2 & 1 & 0 & 0 & 0 & 0 & \vline & 9 \\
3 & \vline & 1 & 3 & 3 & 1 & 0 & 0 & 0 & \vline & 26 \\
4 & \vline & 1 & 4 & 6 & 4 & 1 & 0 & 0 & \vline & 72 \\
5 & \vline & 1 & 5 & 10 & 10 & 5 & 1 & 0 & \vline & 191 \\
6 & \vline & 0 & 6 & 15 & 20 & 15 & 6 & 1 & \vline & 482 \\
7 & \vline & 0 & 0 & 21 & 35 & 35 & 21 & 7 & \vline & 1134 \\
8 & \vline & 0 & 0 & 0 & 56 & 70 & 56 & 28 & \vline & 2422 \\
9 & \vline & 0 & 0 & 0 & 0 & 126 & 126 & 34 & \vline & 4536 \\
10 & \vline & 0 & 0 & 0 & 0 & 0 & 252 & 210 & \vline & 6930 \\
11 & \vline & 0 & 0 & 0 & 0 & 0 & 0 & 462 & \vline & 6930
\end{array}', rendering as TeX:
0 & \vline & 1 & 0 & 0 & 0 & 0 & 0 &
^
unexpected "\\"
expecting "&", "\\\\", white space or "\\end"
arxiv-pandoc-static: <stdout>: commitAndReleaseBuffer: invalid argument (invalid character)
Run Code Online (Sandbox Code Playgroud)
与直接使用 pandoc 可执行文件相比,不会发生此类错误,并且我收到了很好的输出。我想将 pandoc 阅读器配置得尽可能灵活,并且不会出现错误(或者更好的是,首先避免错误)。我如何通过 pandoc API 实现这一点?
我相信这不是一个 pandoc 问题,而是一个 GHC 或文本包问题。答案可以在一个完全不相关的 Haskell 项目hledger 文档中找到:
收到诸如“非法字节序列”或“无效或不完整的多字节或宽字符”或“commitAndReleaseBuffer:无效参数(无效字符)”之类的错误
使用 GHC 编译的程序(hledger、haskell 构建工具等)需要在环境中配置支持 UTF-8 的语言环境,否则在遇到非 ascii 字符时会因此类错误而失败。
要修复此问题,请将 LANG 环境变量设置为支持 UTF-8 的某个区域设置。您选择的区域设置必须安装在您的系统上。
export LANG=C.UTF-8因此,在 shell 中运行类似的命令应该可以解决这个问题。