同一文件中多种语言的语法高亮显示:StatWeave/SAS/LaTeX
Posted
技术标签:
【中文标题】同一文件中多种语言的语法高亮显示:StatWeave/SAS/LaTeX【英文标题】:Syntax highlighting for multiple languages in same file: StatWeave/SAS/LaTeX 【发布时间】:2010-10-24 22:02:26 【问题描述】:我正在使用 StatWeave 从 LaTeX 文件中运行 SAS 代码。我希望能够在文本编辑器中打开一个文件并查看带有 LaTeX 语法突出显示的主要 LaTeX 文档和带有 SAS 语法突出显示的嵌入式 SAS“代码块”。 (“代码块”是真实的(工作的)代码,不仅仅是为了显示,所以我认为 LaTeX 列表包不会工作。)我确信必须有一种方法可以用 emacs 做到这一点,但我没有'不知道它是什么......在这一点上,我对任何编辑器的任何解决方案都持开放态度。
2010 年 2 月 5 日更新:我认为最好的方法实际上是停止尝试使用 StatWeave 和 SAS,而是学习使用 Sweave 和 R。我对 Vim 中的 Sweave 突出显示很满意,但我知道其他对 ESS 非常满意的人,所以我会继续接受这个答案,这样我们就可以结束这个问题了。
【问题讨论】:
【参考方案1】:讨论 jean 的回应: 我一直遇到的 ESS 问题是 Windows(我运行 SAS 的地方)支持的功能不足。
因此 Statweave 对我一点用处都没有。
现在有一个 SAS Linux 版本,所以我想它可以更好地工作。
【讨论】:
【参考方案2】:您可以尝试新的 StatReport LateX 类,它有点像 Sweave,但完全在 LaTeX 中实现。
工作流程: 运行一次并获取 SAS 代码,在 SAS 中运行该代码,再次运行 laTeX 并获取包含的输出。
如果我没记错的话,我认为它会为代码着色(使用 SASnRdisplay 类)。
在此处查看论文:http://support.sas.com/resources/papers/proceedings12/324-2012.pdf 以及用于包文档的 CTAN http://mirror.switch.ch/ftp/mirror/tex/macros/latex/contrib/statrep/statrep.pdf
【讨论】:
【参考方案3】:如果您使用的是 xemacs,您可以使用 mmmmode 来突出显示语法。我将 ESS 与 statweave 一起使用,因此第一人称回答为什么不使用 ESS 来突出显示并使用 statweave 来完成工作。然而,我不使用 SAS,但在同一个文件中使用了 stata 和 R,它们都使用自己的语法突出显示。 (需要'mmm-mode) (需要'mmm-vars) (setq mmm-global-mode '也许) (setq mmm-submode-decoration-level 1)
(嗯-添加-组 '乳胶统计 '((r标签 :submode r 模式 :face mmm-code-submode-face :delimiter-mode 无 :front "开始Rcode" :back "结束Rcode" :back-offset (backward-char -1) :insert ((?R R-tag nil @ "\beginRcode" @ "\n" _ "\n" @ "\endRcode" @)) ) (静态标签 :submode STA-模式 :face mmm-code-submode-face :delimiter-mode 无 :front "开始Statacode" :back "结束 Statacode" :back-offset (backward-char -1) :insert ((?S STATA-tag nil @ "\beginStatacode" @ "\n" _ "\n" @ "\endStatacode" @)) )))
(添加到列表'mmm-mode-ext-classes-alist '(nil "-swv.tex" 乳胶统计数据))
您只需要更改为 SAS 模式(我想如果这就是所谓的) 我在我的 latex.el 文件(在 init.el 中加载了一个 lambda)中有以下内容 (本地设置键 [ (控制 f1)] '(λ() (交互的) (如果(字符串匹配“\.tex”缓冲区文件名) (预测 (让(文件名文件名1文件名wihoutswv) (setq 文件名 (缓冲区文件名)) (setq file-name1 (file-name-nondirectory file-name)) (setq 文件名-wihoutswv (replace-regexp-in-string "-swv" "" 文件名1)) (setq 文件名-wihoutswv (replace-regexp-in-string "\.tex" "" 文件名-wihoutswv)) (如果(字符串匹配“-swv\.tex”缓冲区文件名) (查找文件-其他窗口(连接文件名-wihoutswv“.tex”)) (查找文件-其他窗口(连接文件名-wihoutswv“-swv.tex”)) ) ) ) (消息“您处于 Latex 模式,这既不是 swv 也不是 TeX 文件。无法打开相应的 tex 或 sweave 文件”) )))
和
(全局设置键 [f1] '(λ() (交互的) (保存缓冲区) (如果(字符串匹配“-swv\.tex”缓冲区文件名) (预测 (交互的) (乳胶模式) ;;(字体锁定字体缓冲) (平衡窗口) (mylatex-删除-缩进) (保存缓冲区) (保存窗口游览(运行当前状态编织文件)) ; (mylatex-清洁) ) (如果(字符串匹配“\.tex”缓冲区文件名) (预测 (交互的) (乳胶模式) ;(字体锁定字体缓冲区) (平衡窗口) (做-pdf) ; (mylatex-清洁) ) (消息“这既不是 TeX 也不是 SWV 文件,除了将缓冲区保存到文件之外,我不知道该怎么做。所以我做了”) )) )
)
(defun run-current-statweave-file () “在 -swv.tex 文件上执行 statweave 并启动 evince 以查看输出” (交互的) (让(文件名文件名1文件名wihoutswv cmd1-str cmd2-str状态) (setq 文件名 (缓冲区文件名)) (setq file-name1 (file-name-nondirectory file-name)) (setq 文件名-wihoutswv (replace-regexp-in-string "-swv\.tex" ".pdf" file-name1)) ;; (setq cmd1-str (concat "statweave " file-name1 " && evince " file-name-wihoutswv " &" )) (setq cmd1-str (concat "statweave" file-name1)) (setq cmd2-str (concat "evince " file-name-wihoutswv " &")) ;; (shell 命令 cmd1-str) (setq 输出缓冲区“swvoutput”) (save-window-excursion (setq status (shell-command cmd1-str output-buffer))) ;;(消息状态) ;; (let (status) ((shell-command cmd1-str output-buffer))))) ))
它看起来很糟糕,而且我不是 lisp 专家,所以我确信它有很多效率低下的地方,但它确实有效。
【讨论】:
【参考方案4】:UltaEdit 可能有效,但您必须进行大量设置
【讨论】:
【参考方案5】:是否可以选择不在代码中直接包含 sas 文件,而是使用 '\input' 反而?我经常对源示例做的一件事是 将它们放在子目录 samples/ 中,然后使用“highlight”创建可以包含在主文件中的 LaTeX 文件。这样我就可以在每次更改源文件时执行它们以检查它们是否正常工作。 tex 代码的(重新)生成可以通过 shell 脚本或 make 如果它是一个更大的项目来完成。在大多数情况下,一个简单的 generate_tex.sh 脚本对于我在更改任何示例后调用的项目就足够了。它的内容可能类似于
#!/bin/bash
highlight -L -f --wrap-simple *.css --outdir ../input/
highlight -L -f --wrap-simple *.html --outdir ../input/
highlight -L -f --wrap-simple *.php --outdir ../input/
对于一个网络项目。然后在主 tex 文件中包含示例使用
\inputfilename.css
【讨论】:
谢谢——在这种情况下,我确实希望将 sas 文件直接放在 LaTeX 文档中,但很高兴了解这个其他选项——【参考方案6】:也许 Emacs Wiki 上 MultipleModes 页面上的解决方案之一会有所帮助。此外,Sweave 的手册说Emacs Speaks Statistics 可以处理 Sweave 文件,因此由于 StatWeave 看起来很相似,也许您也可以破解 ESS 来处理这些文件。 ESS 似乎已经支持 SAS,因此所需的更改可能不会太大。
【讨论】:
以上是关于同一文件中多种语言的语法高亮显示:StatWeave/SAS/LaTeX的主要内容,如果未能解决你的问题,请参考以下文章