082010

我不确定这是不是R和Sweave能达到的最漂亮的境界:

下载:一份由pgfSweave生成的人模狗样的动态文档

这两天花了点时间,把跟LaTeX、LyX、Sweave有关的一系列中文问题从头到脚翻了个遍,目前为止,明白并解决了如下问题(基于带有MikTeX 2.8的CTeX 2.8.0.125、LyX 1.6.5、R 2.10.1、R包pgfSweave 1.0.3,操作系统Win XP,从头到尾一直用UTF-8编码):

  1. LaTeX说中文了)LaTeX生成可复制粘贴的中文PDF文档:由于我的惰性,还用着N年前的CTeX,那个老版本CTeX中的MikTeX貌似一直有问题,比如无法更新LaTeX宏包,更不必说那些dvipdfmx之类的程序了,估计人家作者都已经更新了无数个版本我还不知道。在我陈旧的印象中,要用LaTeX生成可复制粘贴的中文只有一种办法,就是用dvipdfmx把dvi转为pdf,而我陈旧的印象又记得dvi文件只能由latex命令生成,并且用latex编译的文档必须用EPS图形,这一直让我觉得很不爽,因为我实在不爱用EPS,比如R的postscript()设备(可生成EPS图形)不支持半透明色,而且图形中要用中文字符的话配置非常麻烦(N年前我请教了Paul Murrell,虽然搞明白了,但心里仍有疙瘩)。我的偏好是用pdflatex命令编译文档,图形也用PDF格式(pdflatex默认支持PDF和PNG图形),用R生成PDF图形也方便、漂亮,所以配合Sweave很容易生成一篇干净利索的PDF文档;但pdflatex命令直接编译生成的中文文档中,中文字符是不能复制粘贴的,因为复制出来就是乱码。所以呢,我陈旧的知识让我的这个“麻烦问题”一直没有得到解决。
  2. 现如今,发现CTeX已经把MikTeX更新到2.8了(其实早注意到了,就是懒得卸载几百兆的程序然后再下载几百兆的家伙装上),吭哧吭哧下下来发现自己的老问题早已不存在了……虽然我不清楚ctex宏包的细节,但总归是pdflatex可以编译生成可复制粘贴的中文文档了。

    \documentclass[twoside,UTF8]{ctexart}
    \usepackage[T1]{fontenc}
    \usepackage{CJKutf8}
    \usepackage[letterpaper]{geometry}
    \usepackage{esint}
    
    \makeatletter
    \usepackage{Sweave}
    
    \makeatother
    
    \begin{document}
    \begin{CJK}{UTF8}{}%
    
    \title{你好,中文}
    \author{我是作者}
    \maketitle
    
    \setkeys{Gin}{width=.8\linewidth} 
    
    <<setup>>=
    pdf.options(family='GB1')
    @
    
    我是正文。
    
    \begin{figure}
    \begin{center}
    <<rnorm,fig=TRUE>>=
    rnorm(10)
    plot(rnorm(25), pch=1:25, main='中文字符',
         xlab='$\\alpha + \\beta$', ylab='$\\gamma$')
    @
    \end{center}
    \caption{一幅pgfSweave图}
    \end{figure}
    \end{CJK}
    \end{document}

    于是,中文文档可以嵌入PDF图形了,Sweave文档也可用中文编写了。我们要大力感谢ctex宏包的作者们为我们解决了各种中文配置问题。

    有客官也许要问,可复制粘贴的中文文档有那么重要么,一份中文文档可以正常阅读不就可以了么?是滴是滴,可复制粘贴很重要,我的关注点是放在网上的中文文档能否被搜索引擎正确收录。要是它本质上都是乱码,别人就无法通过搜索引擎找到你的东西了。这年头,平民百姓自个儿的网站的访问来源大部分都是来自于搜索引擎,别人要是搜不到你的东西,咋可能来敲门呢。不来敲门,咋会有后面更多的机会呢?

  3. LyX基于LaTeX说中文了)LyX使用ctex系列的layout:ctex宏包提供了三种基本的文档类,即论文、书籍和报告,这让我们写中文文档更符合中文习惯,一些英文名称比如Figure会变成“图”、Abstract会变成“摘要”,等等,让我们省去了大量的重命名工夫。
  4. 我大约用了三四年时间LaTeX,辛辛苦苦敲代码啊敲代码,直到有一天发现了LyX。可以说大多数有界面的文本编辑器都跟MS Word一个德行,为了所见即所得,大大牺牲了质量,用了LaTeX的人大多会“中毒”,看别的什么排版都是垃圾,但LyX绝对是个例外,它聪明地提供了导入导出LaTeX的功能,虽说它也算是所见即所得,但它自己不干排版的事情,而是把这事儿交给LaTeX去办,排版质量当然没得说了。

    要在LyX中能够通过界面点选使用ctex的文档类的话,得自己先写几个*.layout文件放在Resources/layouts/目录下,比如要用ctexart类:

    #% Do not delete the line below; configure depends on this
    #  \DeclareLaTeXClass[ctexart]{article (CTeX)}
    
    # Read the definitions from article.layout
    Input article.layout

    存为ctex-article.layout,然后Reconfigure一下LyX,重启,就可以在Document-->Settings中选择这个类了,记得把语言设置为中文。这样,在LyX中就可以直接编译生成可复制粘贴的中文文档了。

  5. Sweave基于LaTeX和LyX说中文了)联合ctex宏包直接用LyX写中文Sweave文档:CRAN上有关于如何配置LyX使之支持Sweave,所以很容易模仿一个新的layout文件,让LyX支持中文Sweave文件,比如就叫ctex-article-sweave.layout吧。
  6. #% Do not delete the line below; configure depends on this
    #  \DeclareLaTeXClass[ctexart, Sweave.sty]{article (Sweave CTeX)}
    
    # Read the definitions from literate-article.layout
    Input literate-article.layout

    现在,我们就可以在菜单中选文档类为article (Sweave CTeX)了,当然我们要首先保证ctexart.clsSweave.sty都能被LyX找到(可以采取任何手段把R目录下的texmf下的Sweave.sty复制到LaTeX宏包的目录中去),否则这个选项会显示为unavailable。

    接下来,我们就要遇到点麻烦了:这里的看官的Windows系统恐怕都是中文环境,codepage是936,而Sweave读文件时需要正确的编码参数,你要是直接把中文的Rnw文件扔给它,它会把所有多字节字符转化为空白或者NA。所以呢,我们要稍微配置一下R的启动选项,比如在Rprofile.site文件中加上options(encoding = "UTF-8"),这样Sweave就能正确读入UTF-8编码的文件了(实际上这影响的是readLines())。

  7. 动态的R图形基于Sweave、LyX和LaTeX说中文了)R的pdf()图形设备是可以支持中文字符的,只不过要设置family = "GB1"参数,比如:
  8. pdf(family = "GB1")
    plot(1, main = "我是中文,哇哈哈哈", xlab = "顶楼上的!")
    dev.off()

    这个参数可以用pdf.options()函数事先设定,因为我们无法用Sweave的选项去指定pdf()设备的family参数。

    然而,悲剧就在于这种方式生成的R图形中,英文字体很难看,瘦高瘦高的。所以我们需要对PDF图形进行某种处理。

  9. 动态的R图形基于pgfSweave、LyX和LaTeX说漂亮的中文了)pgfSweave包提供了一种解决方案,就是把PDF图形转化为tikz格式(不甚了解,应该类似于pictex吧),然后插入LaTeX文档,这样图形中的所有文本都会被当做原始的LaTeX代码处理,其后果就是PDF图形中的文本格式将会LaTeX文档完全一致,包括数学公式!!比如我最开头的那段Sweave代码中,标签用了LaTeX数学公式,这些东西会被转化为原汁原味的LaTeX公式。
  10. 要想让LyX支持pgfSweave,目前我只能通过暴力修改Sweave的converter,定义为R --verbose --no-save --no-restore -q -e library(pgfSweave);pgfSweave('$$i',compile.tex=FALSE),这样pgfSweave负责运行R代码并生成tex文档,然后LyX会自动将tex编译为PDF。

至此,我们能够在ctex、LaTeX、R和pgfSweave的支持下用LyX创建可复制粘贴中文的、动态的、能使用带有中文字符和原生LaTeX数学公式的PDF图形的PDF文档。显然,这路途颇有些曲折,不过一番周折之后,想想以后写中文的东西只需要点几下鼠标,就能用R生成漂亮的PDF文档,心里还是很舒坦的。我写东西很是受排版影响——只要版式漂亮,俺就有无穷的写作动力。

几点附注:

  1. 我用UTF-8编码的原因是它比较通用,尤其是这次论坛搬家,要是没有颜林林想出办法解决了从GB2312到UTF-8编码的转换,我真是被编码问题愁死了。打这以后,能用UTF-8一律用UTF-8,管它占用空间大小呢。再者,后面我还想大规模使用GitHub,那网站也是UTF-8的,为了源文件在网站上能正确显示,也必须用UTF-8编码。
  2. CRAN上关于LyX的配置(literate-scrap.inc)被我拿来修改了,主要是更改了Scrap的定义,我很不喜欢原作者关于换行符的定义,必须用Ctrl+Enter,使得老夫在LyX中敲R代码很不爽,而且没法跟别的编辑器互相复制粘贴,现在我可以自由自在地敲R代码了。
  3. Sweave到pdfLaTeX的转换器从R CMD Sweave $$i改为了cp $$r/*.{r,txt,pdf} ./ & R --verbose --no-save --no-restore -q -e library(pgfSweave);pgfSweave('$$i',compile.tex=FALSE),原因是LyX会把文档复制到一个临时目录下编译,这一点我觉得挺不好的,尤其是写动态文档时,有些数据文件或者R代码需要在文档中使用,但LyX不会把它们全都复制过去,所以R代码运行时会出错,所以我人为加入了复制*.r/*.txt/*.pdf文件到编译的目录中去的命令,然后用命令行的方式执行R,执行的内容是library(pgfSweave);pgfSweave('$$i',compile.tex=FALSE),这段代码可以用-e参数传给R;设定compile.tex=FALSE的原因是pgfSweave默认会编译LaTeX文档,而我们只需要让它走到生成LaTeX文档那一步就够了。
  4. Sweave不支持给每一幅图形设定宽度,只能通过\setkeys{Gin}{width=}的方式统一设定文档中所有图形的宽度,这一点也让人很不爽,哪有文档能保证所有图形宽度都一样呢,因此我们让Sweave.sty不要统一设定宽度:\usepackage[nogin]{Sweave};然后在每一段R代码块中分别设定width,这样pgfSweave可以根据这些宽度相应设定图形宽度。这一点也反映在对literate-scrap.inc文件的修改上了。
  5. pgfSweave包默认有命令行执行的方式:R CMD pgfSweave,但这个方式是基于Rscript的,它在执行的时候并不会等程序真的运行完了才退出,而是一扫而过,该运行的程序还在后台默默运行。这一点会让LyX昏了头,LyX以为Sweave代码已经执行完毕,可以启动pdflatex编译了,但事实上tex文档压根儿就还没生成出来。因此我采用了R -e的方式,让LyX老老实实等待R运行结束再编译。
  6. 本文的配置对部分客官来说简单,对不常用命令行的客官可能还有好几步路要走,比如把R的bin路径放到系统的PATH环境变量中,以及阅读CRAN上关于LyX+Sweave的配置等等,装LaTeX宏包fancyvrb等(Sweave.sty依赖于它,否则layout在LyX中显示unavailable,尽管Sweave.sty存在)。
下载:文中提到的layout文件们,以及preferences

爷还想看:

37 Responses to “关于LaTeX+LyX+R/Sweave+pgfSweave+PDF图形的若干中文问题”

Comments (36) Pingbacks (1)
  1. Feng Li 说:

    支持中文我觉得用XeTeX比较好,你可以尝试一下。

    • 谢益辉 说:

      XeTeX试过,字体问题死都搞不定,不知道为什么。ctex宏包在Linux下的唯一可能字体似乎只有Adobe的那几款字体,而这些字体名称中有空格,于是总是报错:

      ~/texlive/texmf-dist/tex/latex/ctex/fontset/ctex-xecjk-adobefonts.def
      kpathsea: Invalid fontname `Adobe Song Std', contains ' '

      我把空格前面加上\也一样报错:

      (~/texlive/texmf-dist/tex/latex/ctex/fontset/ctex-xecjk-adobef
      onts.def
      kpathsea: Running mktextfm Adobe
      ~/texlive/texmf/web2c/mktexnam: Could not map source abbreviation A for Adobe.
      ~/texlive/texmf/web2c/mktexnam: Need to update ~/texlive/texmf-dist/fonts/map/fontname/special.map?
      mktextfm: Running mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input Adobe
      This is METAFONT, Version 2.718281 (TeX Live 2009)
      
      kpathsea: Running mktexmf Adobe
      ! I can't find file `Adobe'.
       ...e:=ljfour; mag:=1; nonstopmode; input Adobe
      
      Please type another input file name
      ! Emergency stop.
       ...e:=ljfour; mag:=1; nonstopmode; input Adobe
      
      Transcript written on mfput.log.
      grep: Adobe.log: No such file or directory
      mktextfm: `mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input Adobe' failed to make Adobe.tfm.
      kpathsea: Appending font creation commands to missfont.log.
      
      ! Font \zf@basefont="Adobe" not loadable: Metric (TFM) file or installed font n
      ot found.
      
                         \
      l.5   {Adobe\ Song\ Std}
      
      ? 

      我看网上早年间还有配置cyberbit字体的,那玩意儿我也搞不定……

      • Feng Li 说:

        XeTeX 的优势是可以大大缩减中文文档的大小,因为他不是像普通 cjk 模式那样,需要在每个文档嵌入所有中文字体,而且可以很方便的使用系统字体,如果你能编译成功的话,新的文档大小也许只是你的上面的十分之一,这样屏幕阅读起来也会更顺畅。

        首先你需要检查 Adobe 字体是不是正确安装了 运行

        fc-list :lang=zh-cn

        后你应该至少看到大概这样的输出

        Adobe Song Std,Adobe 宋体 Std,Adobe Song Std L,Adobe 宋体 Std L:style=L,Regular
        Adobe Fangsong Std,Adobe 仿宋 Std,Adobe Fangsong Std R,Adobe 仿宋 Std R:style=R,

        然后你可以试一下这个例子

        % file test.tex
        \documentclass[12pt,a4paper]{article}
        \usepackage{fontspec}
        \usepackage{xunicode}
        \usepackage{xltxtra}
        \setromanfont{Adobe Song Std}
        \begin{document}
        \XeTeX 可以使用系统自带的字体,而不需要再另外生成。
        \end{document}

        运行

        xelatex test.tex

        这个例子在我的老板本的texlive2007都可以实现。

        使用最新的 CTeXKit 可以克服中文拷贝粘贴乱码,里面包含了xeCJK, zhspacing 等常用中文包,如果你用texlive 2009应该没有问题,我用中文tex很少,就没有安装最新的。

        • 谢益辉 说:

          字体貌似是没问题的:

          ***@*** [~/tmp]# fc-list :lang=zh-cn
          Adobe Song Std L,Adobe Song Std,Adobe 宋体 Std,Adobe 宋体 Std L:style=Regular,L
          Adobe Fangsong Std R,Adobe Fangsong Std,Adobe 仿宋 Std,Adobe 仿宋 Std R:style=Regular,R

          运行你这个文档还是我前面说的那个错误,说字体名中有空格:

          ***@*** [~/tmp]# xelatex Text-3.tex
          This is XeTeX, Version 3.1415926-2.2-0.9995.2 (TeX Live 2009)
          entering extended mode
          (./Text-3.tex
          LaTeX2e <2009/09/24>
          Babel  and hyphenation patterns for english...
          (~/texlive/texmf-dist/tex/latex/base/article.cls
          Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
          (~/texlive/texmf-dist/tex/latex/base/size12.clo))
          (~/texlive/texmf-dist/tex/xelatex/fontspec/fontspec.sty
          (~/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty)
          (~/texlive/texmf-dist/tex/latex/tools/calc.sty)
          (~/texlive/texmf-dist/tex/latex/xkeyval/xkeyval.sty
          (~/texlive/texmf-dist/tex/generic/xkeyval/xkeyval.tex
          (~/texlive/texmf-dist/tex/generic/xkeyval/keyval.tex)))
          (~/texlive/texmf-dist/tex/latex/base/fontenc.sty
          (~/texlive/texmf-dist/tex/xelatex/euenc/eu1enc.def)
          (~/texlive/texmf-dist/tex/xelatex/euenc/eu1lmr.fd)Fontconfig error: Cannot load default config file
          )
          fontspec.cfg loaded.
          (~/texlive/texmf-dist/tex/xelatex/fontspec/fontspec.cfg))
          (~/texlive/texmf-dist/tex/xelatex/xunicode/xunicode.sty)
          (~/texlive/texmf-dist/tex/xelatex/xltxtra/xltxtra.sty
          (~/texlive/texmf-dist/tex/latex/metalogo/metalogo.sty
          (~/texlive/texmf-dist/tex/latex/graphics/graphicx.sty
          (~/texlive/texmf-dist/tex/latex/graphics/graphics.sty
          (~/texlive/texmf-dist/tex/latex/graphics/trig.sty)
          (~/texlive/texmf-dist/tex/latex/latexconfig/graphics.cfg)
          (~/texlive/texmf-dist/tex/xelatex/xetex-def/xetex.def))))
          (~/texlive/texmf-dist/tex/latex/etex-pkg/etex.sty)
          (~/texlive/texmf-dist/tex/latex/base/fixltx2e.sty))kpathsea: Invalid fontname `Adobe Song Std', contains ' '
          
          ! Font \zf@basefont="Adobe Song Std" at 10.0pt not loadable: Metric (TFM) file
          or installed font not found.
          \zf@fontspec ...ntname \zf@suffix " at \f@size pt
                                                            \unless \ifzf@icu \zf@set@...
          l.5 \setromanfont{Adobe Song Std}
          
          ?
        • Feng Li 说:

          你是不是需要给字体一下权限

          #chmod 644 /where/is/your/fonts

        • 谢益辉 说:

          呃,改成744都不管用……一模一样的错误信息……

          难道是fontconfig的问题?

        • Feng Li 说:

          那就太奇怪了,不过我看见这里有一个错误,
          (~/texlive/texmf-dist/tex/xelatex/euenc/eu1lmr.fd)Fontconfig error: Cannot load default config file)

  2. 刘思喆 说:

    2.8可以直接中文复制粘贴没留意,不过2.6版本的 CTeX 可以使用 \usepackage{ccmap} 来解决复制粘贴的问题。没尝试过pgfSweave,回头试一试去。关于设置 Sweave 文档中图形参数问题,我一般都是这么解决的:

    <<>>=
    pdf('example1.pdf',width = 6,height = 4)
    x <- rnorm(100)
    par(mar = c(2,2,1,1))
    plot(x,main = '',xlab = '',ylab = '')
    invisible(dev.off())
    @
    \begin{figure}[h]
      \centering
    <<>>=
    cat("\\includegraphics[width = 0.6\\textwidth,height = 0.4\\textwidth]{","example1.pdf","}\n\n",sep = "")
    @
    \caption{Some random points.}
    \label{fig:random}
    \end{figure}
    • 谢益辉 说:

      这确实是一种办法,只是R代码要么就隐藏,要么就让读者看到自己开启和关闭pdf()的两行代码,可能干涉正题了……

  3. 刘思喆 说:

    额,<>= 中间的参数设置被自动吞掉了 ~~

  4. tengfei 说:

    先顶后看。。。
    我前几天因为要用latex写中文,才试了一下如何写,当时用了下面的方法

    \begin{document}
    \begin{CJK}{UTF8}{gbsn}
    \begin{center}
    。。。
    结果出来的字体非常不养眼。。不知道我哪里没配置好。

    • 谢益辉 说:

      你自己的电脑有管理员权限,所以应该好配。我是在hostmonster的服务器上折腾,尤其是字体问题很难整……

  5. DJ 说:

    还没有用pgfsweave写过中文文档,回头按照你的方法试一下。关于LyX默认的Scrap定义,我用起来也很不方便,不过看官方给的示例,都是直接利用 『Insert TeX code』来插入R代码,快捷键 C+L ,换行符也正常。

    • 谢益辉 说:

      之所以必须要用Ctrl+Enter,是因为原作者设置了scrap的LaTeX类型为段落(paragraph),你知道,一旦敲回车,也就是意味着生成下一个新段落,所以必须用Ctrl+Enter(仅仅换行),保证不要生成新段落,否则就跳出scrap环境了。

      我把LaTeXType修改为Environment就不会有这个问题了:

      LatexType             Environment

      可以自由敲回车,如果要换到段落环境中,只需要点工具栏中的Standard下拉框菜单即可。

      • DJ 说:

        嗯,我其实就是不爽那个默认Scrap的回车总会产生新的段落,C+Enter虽然不会产生新段落,但是确有缩进,很无语。而 C+L却没有这个问题,而且还有快捷键可用,如果有很多Code snippets,这个快捷键会大大加快写作效率。

        • 谢益辉 说:

          作者Gregor说Ctrl + L只能保证目前还能用,以后LyX也许会不支持这种用法……这是为什么我花了这么长时间去找一个靠谱的办法的原因……

        • DJ 说:

          呵呵,这个C+L的确有点dirty trick的意思,您的做法也很有借鉴意义,我参照您定义的那个环境重新定义了一个新环境,并给它绑定了一个快捷键(如 A+P C+L),用起来就方便多了。C+L应该没有问题,LyX理论上不会取消TeX Code的嵌入,除非哪一天它变得不是TeX-based了。

        • 谢益辉 说:

          C+L嵌入LaTeX代码这一点LyX肯定不会取消的,问题是LyX将来如何转化C+L生成的LaTeX到LaTeX文档(目前是原文复制的方式),万一将来<<>>= @这东西在转化过程中被改了,那Sweave就找不到R代码了。

          详见Gregor的日志:http://ggorjan.blogspot.com/2009/07/lyx-sweave-mandatory-use-of.html

  6. Cloudly 说:

    感觉PDF中复制/粘贴是编码的事儿,UTF-8的应该都可以,GBK的貌似还是不行。
    不过我现在用的Texlive而不是miktex,另貌似ctex论坛上比较荐xecjk,不过我用的不爽,编译起来太慢。

  7. Cloudly 说:

    恕我愚钝,没看出怎么个动态图形法。貌似上面那个PDF只有一张图……而且我没看出它动起来……

    • 谢益辉 说:

      “动态”的意思不是说文档内有什么东西在动,而是这份文档是蕴含了动态的计算的(就是“动态网页”中的“动态”的意思),你表面上看到的是有图有真相的文档,但实际上我的源文档只有R代码没有图形,图形是在编译过程中调用R动态生成然后插入LaTeX的。将来如果我想改图形的话,只需要在文档中改R代码即可,后面的事情就交给R和LaTeX去处理好了。

  8. Cloudly 说:

    关于那个中文的问题~如果在Git上面的话,我是用xetex还是pdflatex?不过很奇怪的是,我本地的texlive系统似乎出毛病了,xetex和xecjk编译中文都不成功。

    • 谢益辉 说:

      如果你是Windows的话,我建议直接用pdflatex。我装的MikTeX,用xelatex的问题就是不能用ae这个包(牵涉到fontenc的问题,xelatex好像和T1的编码有冲突),而我个人又比较喜欢ae的字体,所以就没用xelatex。

      TeXLive的中文问题我实在搞不定,所以在COS的服务器上定期编译中文LaTeX文档怕是实现不了了,还是自个儿编好了传到GitHub上吧。

      Git跟你用xelatex还是pdflatex没有关系,但你最好用UTF-8编码(LyX文档设定–语言–编码,用Unicode (XeTeX) (utf8),用这种编码还有一个原因,我懒得解释了,说不清,汗)。

      • Cloudly 说:

        我一直以为中英文wordpress之间是trackback无效的……这次居然ping过来了……
        我用pdflatex还是字体的问题,生成的文件巨大(几乎1M/page),让我很是郁闷。所以我想试试服务器编译而不是本地编译……使用xetex也是想绕过字体问题,但现在根本编译不出来……
        我在想要不要重新装一下latex系统,突然发现这东西只要牵扯到中午就真的是超级麻烦啊!!!头痛。

        • 谢益辉 说:

          我觉得解决中文问题还是MikTeX+ctex的方式吧……这个问题太复杂了,毕竟人家已经研究了多年。去下载个CTeX的简版,需要什么LaTeX包直接从MikTeX中装,很方便的。

        • Cloudly 说:

          我窃以为ctex和texlive也是可以合作的……主要不知道为什么我的miktex无法更新,导致几乎编译什么都找不到宏包。
          我在想有没有必要把文档变成一个动态生成的……对于数据的改动性貌似不大。但配置起来实在是好麻烦啊 :(

        • 谢益辉 说:

          你装最新版的CTeX,里面的MikTeX是可以更新和安装包的。我几年前装的那个CTeX也是没法更新或安装包。

          上面我没说的一件事是pgfSweave依赖于cacheSweave包,后者提供了缓存机制,你的代码如果没有更改的话,只需要运行一次就可以了,下次运行的时候会从缓存数据库中读取,但cacheSweave没有缓存图形的机制,而pgfSweave解决了这个问题。所以整体来说编译速度不会太慢。

      • Cloudly 说:

        打错了,”中午”->”中文”,汗。

    • Cloudly 说:

      那个,在“可以采取任何手段把R目录下的texmf下的Sweave.sty复制到LaTeX宏包的目录中去”之后加上去一句“刷新latex数据库”或者运行“texhash”吧,我折腾了半天总是忘记刷新数据库,一直卡在这里了。

      • Cloudly 说:

        另,再加上一条“安装RTools”吧。我发现我真的好笨,一直卡在命令行那里,.sh文件始终无法运行……忽然间记起来自己用的是win…

  9. DJ 说:

    你给出的pgfSweave converter在我这里总报错(可能是参数路径问题),不过我参照
    http://yildizoglu.blogspot.com/2009/02/lyx-and-sweave-under-windows-xp.html
    修改了一下,以pgfSweave替代Sweave,就可以了。

    • 谢益辉 说:

      介个,我总觉得三两句话说不清,因为这个依赖关系实在是有点复杂。你得保证R、LaTeX和LyX都配置好……你可以把错误信息贴出来我诊断诊断,看是缺了哪一样。

      • DJ 说:

        LyX报告cp命令行那里的问题,这个很奇怪,我在独立的batch文件里使用
        cp $$r/*.{r,txt}
        就没有问题,而直接写在preferences里LyX就报错。所有的路径我都检查过了,唯一不同是我这里R安装在 E:\Program Files\R,可能是这个空格的问题。所以我猜测可能是 & R … 这里出错了。

        用batch的好处就是,我可以直接指定R的绝对路径,例如
        “E:\Program Files\R\R-2.10.1\bin\Rterm” [options] …

        另外,把 -e 后的命令单独打包进一个R文件,可以方便的在其中进行一些设定,另外,我使用函数texi2dvi() 直接生成pdf文件的,所以就没了R CMD pgfSweave相关的烦恼。

        • 谢益辉 说:

          据我的经验,报这种错并非cp的问题,而是文中的R代码出错了。用LyX时最难的事情就是查错,每当出错的时候就得用命令行方式重新跑一遍,看哪里出错了,因为LyX不能获得R的出错信息……

        • catfish 说:

          是不是没有将R在我的电脑中设置为环境变量呢?今天我卸载了老版本的R,装了最新的,然后用LyX编译Sweave时总是通不过cp那一关,后来发现是R没有设置成环境变量,没法被LyX直接调用。设置后就成功了。

Leave a Reply

(required)

(required)

WWW.YIHUI.NAME XIE@YIHUI.NAME © 2007 - 2010 by Yihui Xie