Org-mode 导出 PDF 遇到的问题

latex

#1

这是我的Rust 代码,我要把org-mode 里面的代码片段和文字导出成PDF

#[derive(Clone, PartialEq, Eq, Debug)]
pub enum XContentTypeOptions {
    /// 需要检查响应体的 `Content-Type` 头部
    NoSniff,
}

impl Header for XContentTypeOptions {
    fn header_name() -> &'static str {
        NAME
    }

    fn parse_header(raw: &Raw) -> hyper::error::Result<XContentTypeOptions> {
        let value: String = parsing::from_one_raw_str(raw)?;
        match value.to_ascii_lowercase().as_str() {
            "nosniff" => Ok(XContentTypeOptions::NoSniff),
            _ => Err(hyper::error::Error::Header),
        }
    }

    fn fmt_header(&self, f: &mut Formatter) -> fmt::Result {
        f.fmt_line(self)
    }
}

impl fmt::Display for XContentTypeOptions {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        use self::XContentTypeOptions::*;
        match *self {
            NoSniff => f.write_str("nosniff"),
        }
    }
}

但是导出结果如下:

报错如下.

Overfull \hbox (42.01295pt too wide) in paragraph at lines 1155--1156
[][][]$[][][][][] [] [] [] [][][][][][][][][] [] [][][][][][][] [] [][][] [] []
[][][][][] [] [][][][] [] [][][] [] [][][][] [] [][][][][][][] [] [][][][][][][
][][][][][][][][][][][]$[][] 

不知 道怎么把这些超长的行弄好,我知道latex 有 \sloppy 但是不知道怎么用到 Org-mode 上面.

还有另外一个问题:

! Package Listings Error: language rust undefined.

latex 导出时报错,但是我自己定义了一个language, 如下:

\\usepackage[T1]{fontenc}
\\usepackage{beramono}
\\usepackage{listings}
\\usepackage{xcolor}

\\definecolor{dkgreen}{rgb}{0,0.6,0}
\\definecolor{gray}{rgb}{0.5,0.5,0.5}
\\definecolor{mauve}{rgb}{0.58,0,0.82}

\\lstdefinestyle{SamrayRustStyle}{
  frame=tb,
  language=rust,
  aboveskip=3mm,
  belowskip=3mm,
  showstringspaces=false,
  columns=flexible,
  basicstyle={\\small\\ttfamily},
  numbers=none,
  numberstyle=\\tiny\\color{gray},
  keywordstyle=\\color{blue},
  commentstyle=\\color{dkgreen},
  stringstyle=\\color{mauve},
  frame=single,
  breaklines=true,
  breakatwhitespace=true,
  tabsize=3,
}

我知道在latex 是这么用:

\\begin{document}
\\begin{lstlisting}[style=SamrayRustStyle]
pub fn helloworld (){
    println!("Helloworld")
}
\\end{lstlisting}
\\end{document}

在Org-mode 应该怎么对某块Rust 代码应用呢,熟悉Org-mode 和 latex 的同学过来帮忙看看


#2

试试变量 org-latex-listings-langs,还有两个 org-latex-listings 前缀的变量可以参考一下。

不用 Rust,Org babel 可以试试 MELPA 上的 ob-rust


#3

org-latex-listings-langsorg-latex-listings 是这么玩么:

 (setq org-export-latex-listings t)
 (setq org-export-latex-listings-langs (quote ((emacs-lisp "Lisp") (lisp "Lisp") (clojure "Lisp") (c "C") (cc "C++") (fortran "fortran") (perl "Perl") (cperl "Perl") (python "Python") (ruby "Ruby") (html "HTML") (xml "XML") (tex "TeX") (latex "TeX") (shell-script "bash") (gnuplot "Gnuplot") (ocaml "Caml") (caml "Caml") (sql "SQL") (sqlite "sql") (R-mode "R") (rust, "rust"))))

不用 Rust,Org babel 可以试试 MELPA 上的 ob-rust

什么叫不用Rust,这个看得不太懂!


#4

不用 Rust 就是我没有配置 Rust 运行环境,所以一切以你实际情况为准,但是原理是差不多的。

首先你要保证可以手动运行 latex 成功,然后调整 Org 导出的代码。具体见函数 org-latex-src-block 中的 Case 4. Use listings package. 这 一分支。

这个是 latex 的报错么?我这里 listings 并不支持 Rust 的语法高亮。有点怀疑你的这个

是怎么来的。超长行的问题估计也是这个原因(我猜的):没有闭合的 '&'static 之后的内容全都糊了。

或许你可以使用 minted 宏包(我没有用这个),是支持 Rust 的(见 http://pygments.org/languages/)。 相关设置见 org-latex-minted-langsorg-latex-minted-options

假设以上手动能运行成功,可以配置 Org 相关变量。

  1. 不清楚你用的是什么版本的 Org,我这里这几个变量是不带 export 的,即 org-latex-listings

  2. org-latex-listings-langs 添加语言,第一项是 major mode 去掉后面的 -mode,第二项是 lstlisting 环境的 language 参数。你这里中间多了一个逗号。若两者写法相同,不用添加也没事(如你这例两个分别是 rust"rust" )。

  3. org-latex-listings-options 可以用来设置一些参数,如你这例

    (setq org-latex-listings-options '(("style" "SamrayRustStyle")))

#5

如楼上所说,listings 是个挺老的包了,使用更酷更新的 minted 包吧。

org mode 应该支持直接嵌入 latex 代码吧?不行的话,就来入 rst 的坑吧 :wink:

For example, the following input would be passed untouched by an HTML Writer:

.. raw:: html
   <hr width=50 size=10>

A LaTeX Writer could insert the following raw content into its output stream:

.. raw:: latex
   \setlength{\parindent}{0pt}

Raw data can also be read from an external file, specified in a directive option. In this case, the content block must be empty. For example:

.. raw:: html
   :file: inclusion.html

http://docutils.sourceforge.net/docs/ref/rst/directives.html#id67


#6

感激.按照你的建议和这篇博文 http://praveen.kumar.in/2012/03/10/org-mode-latex-and-minted-syntax-highlighting/ 我已經可以导出包含Rust 代码的org 文件了.只是还有一点小问题, 那篇博文的 erlang 例子,我复制到我的文件,全部内容如下:

#+begin_src erlang
  %% A process whose only job is to keep a counter.

  -module(counter).
  -export([start/0, codeswitch/1]).

  start() -> loop(0).

  loop(Sum) ->
    receive
       {increment, Count} ->
          loop(Sum+Count);
       reset ->
          loop(0);
       {counter, Pid} ->
          Pid ! {counter, Sum},
          loop(Sum);
       code_switch ->
          ?MODULE:codeswitch(Sum)
    end.

  codeswitch(Sum) -> loop(Sum).
#+end_src

导出的效果图如下:

我并没有引入 LATEX_CLASS, 但是为什么这个还是糊了~


#7

我不用 minted ,但我想应该和缩进有关,8 个空格被转义成了 ^^I,看看宏包文档有没有这方面的配置。


#8

我终于解决了这个问题了,这个和宏包没关系,当我把渲染引擎从 xelatex 换成 pdflatex的时候,上面的 erlang 代码就可以正确渲染了,但是pdflatex 并不支持xeCJK, 所以只能换回 xelatex. 最后确定了是 xelatex 的锅,我也找到了解决方案,在xelatex后面加上 -8bit 选项,详细说明见下:

效果图如下:

渲染出来的时候,我自己都被自己感动了 (/•ิ_•ิ)/ . 非常感谢 @fontux


#9

@Samray 你能分享下你的相关配置么?让我参考下。


#10

latex 相关配置.

org-mode 相关配置

更多内容你就要翻我的repo 配置了 :zipper_mouth_face:


#11

@Samray 你知道怎么修改代码片段高亮的颜色style么? 另外我用了你的配置,大部分沿用了。但是导出中文还是不行。 这是贴我的配置

https://gist.github.com/e4128c84c55b6a1353773860941272a1


#12

修改代码高亮配置:

使用pyments 内置的主题, 详细的主题可以查看: https://help.farbox.com/pygments.html

选定一个主题,然后在 Org 文件顶端添加

#+LATEX_HEADER: \usemintedstyle{manni}

效果如下:

你也可以自定义style, pymetns 也有文档说明: http://pygments.org/docs/styles/

不过我就没有自己自定义过style了,我觉得默认的style 就很不错了~

PDF 导出中文

org-mode 导出中文问题,论坛已经有很多帖子,你可以参考一下.先弄出中文.比如对应的包装了没有,对应的字体有没有等等.最重要的,是查看 Latex PDF Export log


#13

我也终于可以用pygments 在中文PDF了,感谢啊。 现在的问题是,代码字体,或者字号可以更改吗?


#14

可以修改的, 按照文档的说明:

https://orgmode.org/worg/org-tutorials/org-latex-export.html#orgf446e52

可以通过

#+LaTeX_HEADER: \newminted{common-lisp}{fontsize=\footnotesize}

来指定字体和字号.不过我觉得如果要做这样的细颗粒度的控制,还是用latex 会比较好一点. 我后来都是直接编辑org-mode 生成的latex 文件了.


#15

受教了,美中不足啊