org转Verbatim中的特殊符号如何原文输出?

最近在处理orgmode下导出代码的设置。基本上有两种路线:1. listings环境。2.Verbatim结合fancyvrb环境。 我写了一个测试文件。现在,启用(setq org-latex-listings t) 选项后,基本上是#+begin_src language … #end_src的环境都可以用一个统一格式的lstlisting环境设置。如果需要对listings环境进行特殊设置,需要使用#+attr_latex: :options …。

对于非代码类或者非标准编程语言的部分,我的需求是直接输出内容(如传统的verbatim环境,但希望能加一个框,偶尔需要编号),因此同时设置了fancyvrb的环境。注意的是,在orgmode中,#+begin_verbatim 与 #+begin_Verbatim (V大写)是不同的。前者是org-mode中begin_example 和begin_src的初始格式化样式。

现在基本能够分别使用Verbatim环境和lstlisting环境设置非标准代码和标准代码,但是在使用Verbatim环境时,遇到一个问题:

当Verbatim环境中出现特殊符号如’#’ '$‘时,会导出带有反斜杠的符号,与初衷原文导出不符。出现’\'时则会出现$backslash . 请问那位能指点一下。另外,现在的配置下,需要使用special block来指定Verbatim 及lstlisting环境。原来的begin_example基本上不会被使用。如何制定针对begin_example导出latex的\begin{Verbatim}[options] 环境而不是\begin{verbatim}环境。

另外,**如何实现如begin_src、begin_example的快速补全(<s Tab、<e Tab)相同的补全功能?**如 <l Tab 扩展为: #+begin_lstlisting …#+end_lstlisting. 我知道YASnippet设置一下是可以通过C-c k补全的,我想问问tab补全怎么做?

还有一个问题,当前lstlisting环境中,自动换行最多只能换一行,如果太长的话,会在第二行一直延伸不会继续换行,如何改进这个设置?

测试org文件如下:

#+TITLE: test
#+AUTHOR: shangpeng
#+LATEX_CLASS: cn-article

* 测试
** listings
如下:

#+begin_src fortran
  program main
      implicit none
      print*,"hello, world!"  ! 中文提示号是都发局发生地方酒窝儿积分拉开手机费;矮灵祭反而就 asdfkj;wlejf f 玩儿六块腹肌范德萨会计法wae afjew 玩儿就晚了就
  end program main
#+end_src

另一个listing。如何使用两种不同的设置?

#+attr_latex: :options frame=single,numbers=none,tabsize=2,columns=fixed,framexleftmargin=2mm,backgroundcolor=\color{black!10}
#+begin_src fortran
  program main
      implicit none
      print*,"hello, world!"  ! 中文提示号是都发局发生地方酒窝儿积分拉开手机费;矮灵祭反而就 asdfkj;wlejf f 玩儿六块腹肌范德萨会计法wae afjew 玩儿就晚了就
  end program main
#+end_src

** fancyvrb


 #+begin_Verbatim
   第一句
   第二句
   。。。
   啥啊
   #4
 #+end_Verbatim

新的Verbatim环境
 #+attr_latex: :options [numbers=none]
 #+begin_Verbatim
   第一句
   第二句
   。。。
   啥啊
   #4
 #+end_Verbatim
~               

其输出为:

其内置的配置内容为:

;;  latex export class
(add-to-list 'org-latex-classes
             '("cn-article"
               "\\documentclass[10pt,a4paper]{article}
\\usepackage{graphicx}
\\usepackage[dvipsnames]{xcolor}
\\usepackage{xeCJK}
\\usepackage{fontspec}\\setmainfont{Times New Roman} \\setsansfont{Times New Roman}\\setmonofont{DejaVu Sans Mono}
\\setCJKmainfont[BoldFont={仓耳今楷01简繁 W05},ItalicFont={楷体}]{仓耳今楷01简繁 W03}
\\usepackage{lmodern}
\\usepackage{verbatim}
\\usepackage{fixltx2e}
\\usepackage{longtable}
\\usepackage{float}
\\usepackage{tikz}
\\usepackage{wrapfig}
\\usepackage{soul}
\\usepackage{textcomp}
\\usepackage{listings}
\\usepackage{geometry}
\\usepackage{algorithm}
\\usepackage{algorithmic}
\\usepackage{marvosym}
\\usepackage{wasysym}
\\usepackage{latexsym}
\\usepackage{natbib}
\\usepackage{fancyhdr}
\\usepackage[xetex,colorlinks=true,CJKbookmarks=true,
linkcolor=blue,
urlcolor=blue,
menucolor=blue]{hyperref}
\\usepackage{fontspec,xunicode,xltxtra}
\\hypersetup{unicode=true}
\\geometry{a4paper, textwidth=6.5in, textheight=10in,
marginparsep=7pt, marginparwidth=.6in}
\\definecolor{foreground}{RGB}{220,220,204}%浅灰
%\\definecolor{background}{RGB}{62,62,62}%浅黑
\\definecolor{background}{RGB}{255,248,220}%淡黄
\\definecolor{preprocess}{RGB}{250,187,249}%浅紫
\\definecolor{var}{RGB}{239,224,174}%浅肉色
\\definecolor{string}{RGB}{154,150,230}%浅紫色
\\definecolor{type}{RGB}{225,225,116}%浅黄
\\definecolor{function}{RGB}{140,206,211}%浅天蓝
\\definecolor{keyword}{RGB}{239,224,174}%浅肉色
\\definecolor{comment}{RGB}{180,98,4}%深褐色
\\definecolor{doc}{RGB}{175,215,175}%浅铅绿
\\definecolor{comdil}{RGB}{111,128,111}%深灰
\\definecolor{constant}{RGB}{220,162,170}%粉红
\\definecolor{buildin}{RGB}{127,159,127}%深铅绿

\\usepackage{type1cm}
\\newcommand{\\yihao}{\\fontsize{26pt}{36pt}\\selectfont}           % 一号, 1.4 倍行距
\\newcommand{\\erhao}{\\fontsize{22pt}{28pt}\\selectfont}          % 二号, 1.25倍行距
\\newcommand{\\xiaoer}{\\fontsize{18pt}{18pt}\\selectfont}          % 小二, 单倍行距
\\newcommand{\\sanhao}{\\fontsize{16pt}{24pt}\\selectfont}        % 三号, 1.5倍行距
\\newcommand{\\xiaosan}{\\fontsize{15pt}{22pt}\\selectfont}        % 小三, 1.5倍行距
\\newcommand{\\sihao}{\\fontsize{14pt}{21pt}\\selectfont}            % 四号, 1.5 倍行距
\\newcommand{\\banxiaosi}{\\fontsize{13pt}{19.5pt}\\selectfont}    % 半小四, 1.5倍行距
\\newcommand{\\xiaosi}{\\fontsize{12pt}{18pt}\\selectfont}            % 小四, 1.5倍行距
\\newcommand{\\dawuhao}{\\fontsize{11pt}{11pt}\\selectfont}       % 大五号, 单倍行距
\\newcommand{\\wuhao}{\\fontsize{10.5pt}{15.75pt}\\selectfont}    % 五号, 单倍行距 
\\setCJKfamilyfont{songti}{SimSun}
\\setCJKfamilyfont{kaiti}{KaiTi}
\\setCJKfamilyfont{heiti}{SimHei}
\\setCJKfamilyfont{fangsong}{FangSong}
\\newcommand{\\song}{\\CJKfamily{songti}}
\\newcommand{\\fs}{\\CJKfamily{fangsong}}             % 仿宋体
\\newcommand{\\kai}{\\CJKfamily{kaiti}}          % 楷体
\\newcommand{\\hei}{\\CJKfamily{heiti}}         % 黑体

\\fontfamily{Dejavu Sans Mono}
\\newcommand{\\mono}{\\setmainfont{DejaVu Sans Mono}}  %英文字体命令

\\usepackage{fancyvrb}
\\fvset{numbers=left,frame=lines,framerule=1pt}

\\punctstyle{kaiming}
\\title{}
\\fancyfoot[C]{\\bfseries\\thepage}
\\chead{\\MakeUppercase\\sectionmark}
\\pagestyle{fancy}
\\tolerance=1000

\\usepackage{indentfirst}\\setlength{\\parindent}{2em}
\\renewcommand{\\contentsname}{目录} \\renewcommand{\\listfigurename}{插图目录} \\renewcommand{\\listtablename}{表格目录} \\renewcommand{\\refname}{参考文献} \\renewcommand{\\abstractname}{摘要} \\renewcommand{\\indexname}{索引} \\renewcommand{\\tablename}{表} \\renewcommand{\\figurename}{图}

[NO-DEFAULT-PACKAGES]
[NO-PACKAGES]"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}")))


;;    设置默认编译动作命令
;;org-export latex
(setq org-alphabetical-lists t)

(setq org-latex-pdf-process
	'("xelatex -interaction nonstopmode %f"
	  "bibtex %b"
	  "xelatex -interaction nonstopmode %f"
	  "xelatex -interaction nonstopmode %f"
	  "rm -fr %b.out %b.log %b.tex %b.brf %b.bbl auto"
	  ))
(setq org-latex-compiler "xelatex")



;; 使用Listings宏包格式化源代码(只是把代码框用listing环境框起来,还需要额外的设置)
                                        ;(setq org-export-latex-listings t)
(setq org-latex-listings t)
;; Options for \lset command(reference to listing Manual)
;(setq org-export-latex-listings-options
(setq org-latex-listings-options
      '(
        ("basicstyle" "\\color{foreground}\\small\\mono")           ; 源代码字体样式
        ("keywordstyle" "\\color{function}\\bfseries\\small\\mono") ; 关键词字体样式
        ("identifierstyle" "\\color{doc}\\small\\mono")
        ("commentstyle" "\\color{comment}\\small\\itshape")         ; 批注样式
        ("stringstyle" "\\color{string}\\small")                    ; 字符串样式
        ("showstringspaces" "false")                                ; 字符串空格显示
        ("numbers" "left")                                          ; 行号显示
        ("numberstyle" "\\color{preprocess}")                       ; 行号样式
        ("stepnumber" "1")                                          ; 行号递增
        ("backgroundcolor" "\\color{background}")                   ; 代码框背景色
        ("tabsize" "4")                                             ; TAB等效空格数
        ("captionpos" "t")                                          ; 标题位置 top or buttom(t|b)
        ("breaklines" "true")                                       ; 自动断行
        ("breakatwhitespace" "true")                                ; 只在空格分行
        ("showspaces" "false")                                      ; 显示空格
        ("columns" "flexible")                                      ; 列样式
        ("frame" "shadowbox")                                          ; 代码框:阴影盒
        ("frameround" "tttt")                                       ; 代码框: 圆角
        ("framesep" "0pt")
        ("framerule" "0pt")
        ("rulecolor" "\\color{background}")
        ("fillcolor" "\\color{white}")
        ("rulesepcolor" "\\color{comdil}")
        ("framexleftmargin" "10mm")
        ))

1 个赞

自问自答一下吧:

  1. 关于Verbatim环境下的特殊符号问题 貌似在org导出为latex过程中,如果前方出现空格、或标点符号,其后的符号(包括#、$)会被转义输出为# $等。这在Verbatim环境及导出Table中的$$公式环境时都会出现。 针对Verbatim环境而言,增加选项[commandchars=\{}]即可使该环境内的#转义输出为#. 针对table环境中的$$,$需紧跟在公式的两侧,不能有空格。

  2. 目前来看,tab补全不太好实现。

  3. 第二行延伸不换行是因为设置了只在空格处换行。

("breakatwhitespace" "true")   

设置为false即可。

1 个赞

这个导出挺好看的