<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Keep on Fighting! &#187; pgfSweave</title>
	<atom:link href="http://yihui.name/cn/tag/pgfsweave/feed/" rel="self" type="application/rss+xml" />
	<link>http://yihui.name/cn</link>
	<description>谢益辉</description>
	<lastBuildDate>Fri, 13 Jan 2012 04:46:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>LyX 2.0横空出世</title>
		<link>http://yihui.name/cn/2011/05/lyx-2-0-released/</link>
		<comments>http://yihui.name/cn/2011/05/lyx-2-0-released/#comments</comments>
		<pubDate>Tue, 10 May 2011 06:28:42 +0000</pubDate>
		<dc:creator>谢益辉</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[LyX 2.0]]></category>
		<category><![CDATA[pgfSweave]]></category>
		<category><![CDATA[Sweave]]></category>

		<guid isPermaLink="false">http://yihui.name/cn/?p=2014</guid>
		<description><![CDATA[这是旧闻了。只不过我这两天在埋头苦改其中的Sweave部分，刚刚改得差不多了，发了个大大的SVN补丁过去。可惜没能赶在2.0之前搞定。pgfSweave也作为单独的模块加进去了，有超级牛力。不知能否赶上2.0.1的趟，也不知2.0.1啥时侯发布。 总之以后不用费劲折腾了，配置啥的都将变得很简单。 爷还想看：2011/02/09 -- LyX 2.0与Sweave/pgfSweave (12)2010/02/08 -- 关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题 (43)2011/08/21 -- 得意程序侦察另一则 (6)2011/04/13 -- 可能是史上最强更新：R 2.13.0 (9)2011/03/07 -- LyX 2.0终于告别beta了 (29)]]></description>
			<content:encoded><![CDATA[<p>这是旧闻了。只不过我这两天在埋头苦改其中的Sweave部分，刚刚改得差不多了，发了个大大的SVN补丁过去。可惜没能赶在2.0之前搞定。pgfSweave也作为单独的模块加进去了，有超级牛力。不知能否赶上2.0.1的趟，也不知2.0.1啥时侯发布。</p>
<p>总之以后不用费劲折腾了，配置啥的都将变得很简单。</p>
<h2  class="related_post_title">爷还想看：</h2><ul class="related_post"><li>2011/02/09 -- <a href="http://yihui.name/cn/2011/02/lyx-2-0-and-sweave/" title="LyX 2.0与Sweave/pgfSweave">LyX 2.0与Sweave/pgfSweave</a> (12)</li><li>2010/02/08 -- <a href="http://yihui.name/cn/2010/02/misc-issues-in-latex-lyx-r-sweave-pgfsweave/" title="关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题">关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题</a> (43)</li><li>2011/08/21 -- <a href="http://yihui.name/cn/2011/08/proud-debugging/" title="得意程序侦察另一则">得意程序侦察另一则</a> (6)</li><li>2011/04/13 -- <a href="http://yihui.name/cn/2011/04/r-updated-to-2-13-0/" title="可能是史上最强更新：R 2.13.0">可能是史上最强更新：R 2.13.0</a> (9)</li><li>2011/03/07 -- <a href="http://yihui.name/cn/2011/03/lyx-2-0-rc1/" title="LyX 2.0终于告别beta了">LyX 2.0终于告别beta了</a> (29)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://yihui.name/cn/2011/05/lyx-2-0-released/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>LyX 2.0与Sweave/pgfSweave</title>
		<link>http://yihui.name/cn/2011/02/lyx-2-0-and-sweave/</link>
		<comments>http://yihui.name/cn/2011/02/lyx-2-0-and-sweave/#comments</comments>
		<pubDate>Wed, 09 Feb 2011 20:00:39 +0000</pubDate>
		<dc:creator>谢益辉</dc:creator>
				<category><![CDATA[程序开发]]></category>
		<category><![CDATA[计算机应用]]></category>
		<category><![CDATA[animate]]></category>
		<category><![CDATA[LyX]]></category>
		<category><![CDATA[MikTeX]]></category>
		<category><![CDATA[pgfSweave]]></category>
		<category><![CDATA[Sweave]]></category>
		<category><![CDATA[TeXLive]]></category>

		<guid isPermaLink="false">http://yihui.name/cn/?p=1867</guid>
		<description><![CDATA[眼间LyX 2.0已经陆续发布beta 1, 2, 3, 4，希望不要再发beta 5，直接出正式版吧。这回在LyX 2.0中Sweave有了内生支持，不过它自带的Sweave的缺点一大堆，前天上午本来想给LyX报告一下这些事情，结果写着写着，自个儿发现了解决办法，昏死，写了几大段道理，白写了。抄起键盘给2.0写了个Sweave自动配置脚本，仅仅在Ubuntu下测试了一下，貌似还挺好使。勇猛的Linux用户可以自行下载LyX 2.0 beta4源代码包编译安装，然后在R里运行： source('http://gitorious.org/yihui/lyx-sweave/blobs/raw/lyx2/lyx-sweave-config.R') 示例文件：http://gitorious.org/yihui/lyx-sweave/blobs/raw/lyx2/demo/pgfSweave-in-LyX-2.0.lyx 关键之处在于，Sweave从此变成了LyX的一个模块（module），对LyX了解的人都知道这样做的意义：它意味着你可以对任意文档应用Sweave，从此脱离了layout的限制。只要一个文档应用了pgfSweave这个模块，那么LyX就会认为这是个文学编程文档，从而调用R去执行文档中的代码生成LaTeX。这是最显著的进步。 其次，我以前提过，LyX/Sweave文档中的R代码中如果使用回车换行，那么得到的结果是代码之间会产生空行。这也是让人很不爽的一点，在2.0中也已经由ParbreakIsNewline标签解决了。这将增强格式化R代码的功能，用户可以用keep.source = TRUE来保留自己的代码格式而不必担心空行的问题。 LyX 2.0另一个牛哄哄的地方在于它终于能显示debug的信息了，这让我们可以省下不少力气去研究什么命令行重定向之类的玩意儿：直接勾上LyX菜单View &#8211;&#62; View Messages，就可以看到整个编译的过程了，包括R里面的进度，都一清二楚，哪个代码段要是出错了立马就能知道。这给查错带来了无穷的便利。 总结一句话：牛可牛，非常牛。 近段时间发现Ubuntu下编LaTeX似乎比Windows下快很多，尤其是动画，Windows下每一页图都要编上一两秒，整个动画编出来黄花菜都凉了。另外发现animate宏包实际上已经能和\def\input@path一起用，所以动画文件不必写绝对路径，在LyX中就可以用了。只可惜Ubuntu中的TeXLive更新实在是太慢太慢，让我花了很长时间才意识到animate已经更新了，我的问题已经解决了；我对Ubuntu中最不满的一个软件就是TeXLive，它的宏包管理功能比MiKTeX差太远太远了。现在MiKTeX有个简单的Linux版本的宏包管理器，算是可以凑合着用吧（从源代码编译会出错，不过Google一下就解决了）。 爷还想看：2010/02/08 -- 关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题 (43)2011/08/21 -- 得意程序侦察另一则 (6)2011/05/10 -- LyX 2.0横空出世 (6)2010/12/24 -- 灯火阑珊处 (2)2010/12/06 -- LyX、Sweave杂记 (5)]]></description>
			<content:encoded><![CDATA[<p><a href="http://yihui.name/cn/2011/02/lyx-2-0-and-sweave/"><span class="dropcap-red">转</span></a>眼间LyX 2.0已经陆续发布beta 1, 2, 3, 4，希望不要再发beta 5，直接出正式版吧。这回在LyX 2.0中Sweave有了内生支持，不过它自带的Sweave的缺点一大堆，前天上午本来想给LyX报告一下这些事情，结果写着写着，自个儿发现了解决办法，昏死，写了几大段道理，白写了。抄起键盘给2.0写了个Sweave自动配置脚本，仅仅在Ubuntu下测试了一下，貌似还挺好使。勇猛的Linux用户可以自行下载LyX 2.0 beta4源代码包编译安装，然后在R里运行：</p>
<pre class="brush: r">source('http://gitorious.org/yihui/lyx-sweave/blobs/raw/lyx2/lyx-sweave-config.R')</pre>
<p>示例文件：<a href="http://gitorious.org/yihui/lyx-sweave/blobs/raw/lyx2/demo/pgfSweave-in-LyX-2.0.lyx">http://gitorious.org/yihui/lyx-sweave/blobs/raw/lyx2/demo/pgfSweave-in-LyX-2.0.lyx</a></p>
<p>关键之处在于，Sweave从此变成了LyX的一个模块（module），对LyX了解的人都知道这样做的意义：它意味着你可以对任意文档应用Sweave，从此脱离了layout的限制。只要一个文档应用了pgfSweave这个模块，那么LyX就会认为这是个文学编程文档，从而调用R去执行文档中的代码生成LaTeX。这是最显著的进步。</p>
<p>其次，<a href="http://yihui.name/cn/2010/12/lyx-sweave-misc-notes/">我以前提过</a>，LyX/Sweave文档中的R代码中如果使用回车换行，那么得到的结果是代码之间会产生空行。这也是让人很不爽的一点，在2.0中也已经由<code>ParbreakIsNewline</code>标签解决了。这将增强格式化R代码的功能，用户可以用<code>keep.source = TRUE</code>来保留自己的代码格式而不必担心空行的问题。</p>
<p>LyX 2.0另一个牛哄哄的地方在于它终于能显示debug的信息了，这让我们可以省下不少力气去研究什么命令行重定向之类的玩意儿：直接勾上LyX菜单View &#8211;&gt; View Messages，就可以看到整个编译的过程了，包括R里面的进度，都一清二楚，哪个代码段要是出错了立马就能知道。这给查错带来了无穷的便利。</p>
<p>总结一句话：牛可牛，非常牛。</p>
<p>近段时间发现Ubuntu下编LaTeX似乎比Windows下快很多，尤其是动画，Windows下每一页图都要编上一两秒，整个动画编出来黄花菜都凉了。另外发现animate宏包实际上已经能和<code>\def\input@path</code>一起用，所以动画文件不必写绝对路径，在LyX中就可以用了。只可惜Ubuntu中的TeXLive更新实在是太慢太慢，让我花了很长时间才意识到animate已经更新了，我的问题已经解决了；我对Ubuntu中最不满的一个软件就是TeXLive，它的宏包管理功能比MiKTeX差太远太远了。现在MiKTeX有个简单的Linux版本的宏包管理器，算是可以凑合着用吧（从源代码编译会出错，不过Google一下就解决了）。</p>
<h2  class="related_post_title">爷还想看：</h2><ul class="related_post"><li>2010/02/08 -- <a href="http://yihui.name/cn/2010/02/misc-issues-in-latex-lyx-r-sweave-pgfsweave/" title="关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题">关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题</a> (43)</li><li>2011/08/21 -- <a href="http://yihui.name/cn/2011/08/proud-debugging/" title="得意程序侦察另一则">得意程序侦察另一则</a> (6)</li><li>2011/05/10 -- <a href="http://yihui.name/cn/2011/05/lyx-2-0-released/" title="LyX 2.0横空出世">LyX 2.0横空出世</a> (6)</li><li>2010/12/24 -- <a href="http://yihui.name/cn/2010/12/solutions-in-the-origin/" title="灯火阑珊处">灯火阑珊处</a> (2)</li><li>2010/12/06 -- <a href="http://yihui.name/cn/2010/12/lyx-sweave-misc-notes/" title="LyX、Sweave杂记">LyX、Sweave杂记</a> (5)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://yihui.name/cn/2011/02/lyx-2-0-and-sweave/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>灯火阑珊处</title>
		<link>http://yihui.name/cn/2010/12/solutions-in-the-origin/</link>
		<comments>http://yihui.name/cn/2010/12/solutions-in-the-origin/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 05:13:47 +0000</pubDate>
		<dc:creator>谢益辉</dc:creator>
				<category><![CDATA[计算机应用]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[LyX]]></category>
		<category><![CDATA[parser]]></category>
		<category><![CDATA[pgf]]></category>
		<category><![CDATA[pgfSweave]]></category>
		<category><![CDATA[tikz]]></category>
		<category><![CDATA[UTF-8编码]]></category>
		<category><![CDATA[编码]]></category>
		<category><![CDATA[路径]]></category>

		<guid isPermaLink="false">http://yihui.name/cn/?p=1788</guid>
		<description><![CDATA[我回忆了好半天，还是想不起当初我为什么对LyX留下了一个错误的印象：它生成的LaTeX文档的前四行是无效的。即这样的代码： \batchmode \makeatletter \def\input@path{{\string"path/to/some where/\string"/}} \makeatother 当年我并没有仔细研究第三行，但凭感觉，它是用来定义文档中的外部文件的输入路径的，比如\includegraphics{}的根路径。这个感觉并没有错，但当年阴差阳错失败了。我发现LyX的文件名弄乱机制（filename mangling）是因为当时想在Sweave中输出动画，因而需要使用animate包和\animategraphics{}命令，但是死活由于找不到输入文件而报错，我花了好几天时间，终于发现原来有这么个机制，以及LyX的编译过程（先复制到临时文件夹再编译）。于是我只好想办法把动画文件先复制到临时文件夹再编译，这当然不是个好办法。还有Sweave，我都是用R脚本把需要的文件复制到LyX的临时文件夹下再让LyX编译，比如需要读入的数据和需要引用的图片文件等。这都是为了让LyX不要抱怨找不到文件。 今天在考虑animation包中的saveLatex()如何在Sweave中使用，于是再度看了一下LaTeX的animate宏包的文档，看着看着，突然见到其中有个单词“Important”可以闪动，于是好奇它是怎么做到的，自然也就把源文档找出来看；打开源文档，无意看到这么一句： \graphicspath{{files/}} 凭直觉，我觉得这是指定图片文件的根路径，即：文档中的图片引用都以files/为基准，在这个文件夹下去寻找。抬手Google了一下，没错，是这样。我想，这不就是我很久以来想要的东西么，只要定义了图片的输入路径，就不必发愁在LyX文档目录和临时文件目录下拷来拷去了。试了一下，对图片\includegraphics{}的确管用，但由于我用pgfSweave，图片都是用\input{}的方式，这招不管用。 恍惚间，想起了本文开头的那几行命令，琢磨着为什么它们不管用呢，难道有bug？再在LyX中输入了几行LaTeX代码试了试，\includegraphics{}和\input{}都不写绝对路径，只写相对于LyX文档的相对路径，编译，居然成功了！这简直是个灵异事件。 这下R代码中可以setwd()到文档目录了，解决了许久以来的一大麻烦——这是跟人说不清道不明的麻烦。缓存也有了（包括R对象的缓存和图片的缓存），代码高亮也有了，这下可以理直气壮说pgfSweave好用了。 ######################过了一天的分割线###################### 灯火阑珊处之二：路径的问题解决之后本以为天下太平了，结果新的问题来了。如果使用external = TRUE来让pgfSweave缓存图片，那么它会将tikz图片转化为PDF图片（以便下次编译的时候直接引用PDF而不必重新生成一遍tikz，这就是图片能够被缓存的原理），而这些tikz文件默认不是UTF-8编码的，而且我也没有办法控制它的编码。研究了半天，只好用R把tikz读进来用iconv()手工转一下编码，于是中文的图片文件也可以正确生成了。但由编码问题导致的悲剧还不只是图片，highlight包对R代码高亮的时候如果遇到中文也死翘翘，关于这一点，实在太难找出原因，因为这个过程中同时涉及到pgfSweave包、highlight包和依赖的包——当错误来源有多种可能的时候查错就很可怕了。最初我以为是我的tidy.source()函数有问题，改了半天，未果；然后发现把关掉高亮highlight = FALSE之后中文文档可以跑pgfSweave，这说明不是tidy.source()的问题；经过艰苦卓绝的追逐，终于发现问题来自parser包的parser()函数，它里面涉及到代码读写进出文件，这个问题就像我的formatR包一样，在读写文件过程中，文本的编码信息就丢失了，所以需要在读写之前把编码改成自然编码options(encoding = "native.enc")。搞了半天，原来是个老问题。给作者提交了一个patch文件，不知下一个版本是否会更新。 ######################现在的pgfSweave+LyX状态###################### 说实话，我一直以来并没有理解图片的缓存是怎么回事。这两天鼓起勇气打开那七百多页的pgf手册瞄了两眼，才真的明白了。现在我的自动配置脚本已经做了大幅度更新，就速度而言基本上已经优化到最佳状态，例如设置默认图形设备为空设备（这样相比起默认的无用的PDF设备要更节约时间）；将tikz字形字典的目录固定到了文档目录下，这样tikz设备也不必每次都去不同的地方查询字形信息；大量减少了文件的复制，编译的时候只有少数几个文件需要在当前目录和临时目录下互拷；等等。现在的LyX/Sweave（中文）文档，终于完全自由了。 爷还想看：2010/02/08 -- 关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题 (43)2011/08/21 -- 得意程序侦察另一则 (6)2011/06/20 -- 只是来发个笑话：LaTeX里的路径中的空格 (6)2011/05/31 -- 在LyX中使用中文 (35)2011/03/30 -- 关于气煞人的LaTeX浮动 (7)]]></description>
			<content:encoded><![CDATA[<p>我回忆了好半天，还是想不起当初我为什么对LyX留下了一个错误的印象：它生成的LaTeX文档的前四行是无效的。即这样的代码：</p>
<pre class="brush: plain">\batchmode
\makeatletter
\def\input@path{{\string"path/to/some where/\string"/}}
\makeatother</pre>
<p>当年我并没有仔细研究第三行，但凭感觉，它是用来定义文档中的外部文件的输入路径的，比如<code>\includegraphics{}</code>的根路径。这个感觉并没有错，但当年阴差阳错失败了。我发现LyX的文件名弄乱机制（filename mangling）是因为当时想在Sweave中输出动画，因而需要使用animate包和<code>\animategraphics{}</code>命令，但是死活由于找不到输入文件而报错，我花了好几天时间，终于发现原来有这么个机制，以及LyX的编译过程（先复制到临时文件夹再编译）。于是我只好想办法把动画文件先复制到临时文件夹再编译，这当然不是个好办法。还有Sweave，我都是用R脚本把需要的文件复制到LyX的临时文件夹下再让LyX编译，比如需要读入的数据和需要引用的图片文件等。这都是为了让LyX不要抱怨找不到文件。</p>
<p>今天在考虑animation包中的<code>saveLatex()</code>如何在Sweave中使用，于是再度看了一下LaTeX的animate宏包的文档，看着看着，突然见到其中有个单词“Important”可以闪动，于是好奇它是怎么做到的，自然也就把源文档找出来看；打开源文档，无意看到这么一句：</p>
<pre class="brush: plain">\graphicspath{{files/}}</pre>
<p>凭直觉，我觉得这是指定图片文件的根路径，即：文档中的图片引用都以<code>files/</code>为基准，在这个文件夹下去寻找。抬手Google了一下，没错，是这样。我想，这不就是我很久以来想要的东西么，只要定义了图片的输入路径，就不必发愁在LyX文档目录和临时文件目录下拷来拷去了。试了一下，对图片<code>\includegraphics{}</code>的确管用，但由于我用pgfSweave，图片都是用<code>\input{}</code>的方式，这招不管用。</p>
<p>恍惚间，想起了本文开头的那几行命令，琢磨着为什么它们不管用呢，难道有bug？再在LyX中输入了几行LaTeX代码试了试，<code>\includegraphics{}</code>和<code>\input{}</code>都不写绝对路径，只写相对于LyX文档的相对路径，编译，居然成功了！这简直是个灵异事件。</p>
<p>这下R代码中可以<code>setwd()</code>到文档目录了，解决了许久以来的一大麻烦——这是跟人说不清道不明的麻烦。缓存也有了（包括R对象的缓存和图片的缓存），代码高亮也有了，这下可以理直气壮说pgfSweave好用了。<span id="more-1788"></span></p>
<p style="text-align: center;">######################过了一天的分割线######################</p>
<p>灯火阑珊处之二：路径的问题解决之后本以为天下太平了，结果新的问题来了。如果使用<code>external = TRUE</code>来让pgfSweave缓存图片，那么它会将tikz图片转化为PDF图片（以便下次编译的时候直接引用PDF而不必重新生成一遍tikz，这就是图片能够被缓存的原理），而这些tikz文件默认不是UTF-8编码的，而且我也没有办法控制它的编码。研究了半天，只好用R把tikz读进来用<code>iconv()</code>手工转一下编码，于是中文的图片文件也可以正确生成了。但由编码问题导致的悲剧还不只是图片，highlight包对R代码高亮的时候如果遇到中文也死翘翘，关于这一点，实在太难找出原因，因为这个过程中同时涉及到pgfSweave包、highlight包和依赖的包——当错误来源有多种可能的时候查错就很可怕了。最初我以为是我的<code>tidy.source()</code>函数有问题，改了半天，未果；然后发现把关掉高亮<code>highlight = FALSE</code>之后中文文档可以跑pgfSweave，这说明不是<code>tidy.source()</code>的问题；经过艰苦卓绝的追逐，终于发现问题来自parser包的<code>parser()</code>函数，它里面涉及到代码读写进出文件，这个问题就像我的formatR包一样，在读写文件过程中，文本的编码信息就丢失了，所以需要在读写之前把编码改成自然编码<code>options(encoding = "native.enc")</code>。搞了半天，原来是个老问题。给作者提交了一个patch文件，不知下一个版本是否会更新。</p>
<p style="text-align: center;">######################现在的pgfSweave+LyX状态######################</p>
<p>说实话，我一直以来并没有理解图片的缓存是怎么回事。这两天鼓起勇气打开那七百多页的pgf手册瞄了两眼，才真的明白了。现在我的自动配置脚本已经做了大幅度更新，就速度而言基本上已经优化到最佳状态，例如设置<a href="http://yihui.name/en/2010/12/a-special-graphics-device-in-r-the-null-device/" target="_blank">默认图形设备为空设备</a>（这样相比起默认的无用的PDF设备要更节约时间）；将tikz字形字典的目录固定到了文档目录下，这样tikz设备也不必每次都去不同的地方查询字形信息；大量减少了文件的复制，编译的时候只有少数几个文件需要在当前目录和临时目录下互拷；等等。现在的LyX/Sweave（中文）文档，终于完全自由了。</p>
<h2  class="related_post_title">爷还想看：</h2><ul class="related_post"><li>2010/02/08 -- <a href="http://yihui.name/cn/2010/02/misc-issues-in-latex-lyx-r-sweave-pgfsweave/" title="关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题">关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题</a> (43)</li><li>2011/08/21 -- <a href="http://yihui.name/cn/2011/08/proud-debugging/" title="得意程序侦察另一则">得意程序侦察另一则</a> (6)</li><li>2011/06/20 -- <a href="http://yihui.name/cn/2011/06/spaces-in-latex-path-names/" title="只是来发个笑话：LaTeX里的路径中的空格">只是来发个笑话：LaTeX里的路径中的空格</a> (6)</li><li>2011/05/31 -- <a href="http://yihui.name/cn/2011/05/write-chinese-in-lyx/" title="在LyX中使用中文">在LyX中使用中文</a> (35)</li><li>2011/03/30 -- <a href="http://yihui.name/cn/2011/03/latex-float-no-longer-sucks/" title="关于气煞人的LaTeX浮动">关于气煞人的LaTeX浮动</a> (7)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://yihui.name/cn/2010/12/solutions-in-the-origin/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>关于LaTeX + LyX + R/Sweave + pgfSweave + PDF图形的若干中文问题</title>
		<link>http://yihui.name/cn/2010/02/misc-issues-in-latex-lyx-r-sweave-pgfsweave/</link>
		<comments>http://yihui.name/cn/2010/02/misc-issues-in-latex-lyx-r-sweave-pgfsweave/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 07:04:49 +0000</pubDate>
		<dc:creator>谢益辉</dc:creator>
				<category><![CDATA[R 语言]]></category>
		<category><![CDATA[推荐]]></category>
		<category><![CDATA[计算机应用]]></category>
		<category><![CDATA[ctex]]></category>
		<category><![CDATA[EPS]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[LyX]]></category>
		<category><![CDATA[MikTeX]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[pgfSweave]]></category>
		<category><![CDATA[R语言]]></category>
		<category><![CDATA[Sweave]]></category>
		<category><![CDATA[UTF-8编码]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[动态文档]]></category>
		<category><![CDATA[可复制粘贴]]></category>

		<guid isPermaLink="false">http://yihui.name/cn/?p=1269</guid>
		<description><![CDATA[我不确定这是不是R和Sweave能达到的最漂亮的境界： 这两天花了点时间，把跟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编码）： （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命令直接编译生成的中文文档中，中文字符是不能复制粘贴的，因为复制出来就是乱码。所以呢，我陈旧的知识让我的这个“麻烦问题”一直没有得到解决。 现如今，发现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} &#60;&#60;setup&#62;&#62;= pdf.options(family='GB1') @ 我是正文。 \begin{figure} \begin{center} &#60;&#60;rnorm,fig=TRUE&#62;&#62;= 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宏包的作者们为我们解决了各种中文配置问题。 有客官也许要问，可复制粘贴的中文文档有那么重要么，一份中文文档可以正常阅读不就可以了么？是滴是滴，可复制粘贴很重要，我的关注点是放在网上的中文文档能否被搜索引擎正确收录。要是它本质上都是乱码，别人就无法通过搜索引擎找到你的东西了。这年头，平民百姓自个儿的网站的访问来源大部分都是来自于搜索引擎，别人要是搜不到你的东西，咋可能来敲门呢。不来敲门，咋会有后面更多的机会呢？ （LyX基于LaTeX说中文了）LyX使用ctex系列的layout：ctex宏包提供了三种基本的文档类，即论文、书籍和报告，这让我们写中文文档更符合中文习惯，一些英文名称比如Figure会变成“图”、Abstract会变成“摘要”，等等，让我们省去了大量的重命名工夫。 我大约用了三四年时间LaTeX，辛辛苦苦敲代码啊敲代码，直到有一天发现了LyX。可以说大多数有界面的文本编辑器都跟MS Word一个德行，为了所见即所得，大大牺牲了质量，用了LaTeX的人大多会“中毒”，看别的什么排版都是垃圾，但LyX绝对是个例外，它聪明地提供了导入导出LaTeX的功能，虽说它也算是所见即所得，但它自己不干排版的事情，而是把这事儿交给LaTeX去办，排版质量当然没得说了。 要在LyX中能够通过界面点选使用ctex的文档类的话，得自己先写几个*.layout文件放在Resources/layouts/目录下，比如要用ctexart类： #% Do not [...]]]></description>
			<content:encoded><![CDATA[<p>我不确定这是不是R和Sweave能达到的最漂亮的境界：</p>
<span class="download">下载：<a href="http://yihui.name/cn/wp-content/uploads/2010/02/lyx-pgfsweave.pdf">一份由pgfSweave生成的人模狗样的动态文档</a></span>
<p>这两天花了点时间，把跟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编码）：</p>
<ol>
<li>（<strong>LaTeX说中文了</strong>）LaTeX生成可复制粘贴的中文PDF文档：由于我的惰性，还用着N年前的CTeX，那个老版本CTeX中的MikTeX貌似一直有问题，比如无法更新LaTeX宏包，更不必说那些<code>dvipdfmx</code>之类的程序了，估计人家作者都已经更新了无数个版本我还不知道。在我陈旧的印象中，要用LaTeX生成可复制粘贴的中文只有一种办法，就是用<code>dvipdfmx</code>把dvi转为pdf，而我陈旧的印象又记得dvi文件只能由<code>latex</code>命令生成，并且用<code>latex</code>编译的文档必须用EPS图形，这一直让我觉得很不爽，因为我实在不爱用EPS，比如R的<code>postscript()</code>设备（可生成EPS图形）不支持半透明色，而且图形中要用中文字符的话配置非常麻烦（N年前我请教了Paul Murrell，虽然搞明白了，但心里仍有疙瘩）。我的偏好是用<code>pdflatex</code>命令编译文档，图形也用PDF格式（<code>pdflatex</code>默认支持PDF和PNG图形），用R生成PDF图形也方便、漂亮，所以配合Sweave很容易生成一篇干净利索的PDF文档；但<code>pdflatex</code>命令直接编译生成的中文文档中，中文字符是不能复制粘贴的，因为复制出来就是乱码。所以呢，我陈旧的知识让我的这个“麻烦问题”一直没有得到解决。<span id="more-1269"></span></li>
<p>现如今，发现CTeX已经把MikTeX更新到2.8了（其实早注意到了，就是懒得卸载几百兆的程序然后再下载几百兆的家伙装上），吭哧吭哧下下来发现自己的老问题早已不存在了……虽然我不清楚ctex宏包的细节，但总归是pdflatex可以编译生成可复制粘贴的中文文档了。</p>
<pre class="brush: r">\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} 

&lt;&lt;setup&gt;&gt;=
pdf.options(family='GB1')
@

我是正文。

\begin{figure}
\begin{center}
&lt;&lt;rnorm,fig=TRUE&gt;&gt;=
rnorm(10)
plot(rnorm(25), pch=1:25, main='中文字符',
     xlab='$\\alpha + \\beta$', ylab='$\\gamma$')
@
\end{center}
\caption{一幅pgfSweave图}
\end{figure}
\end{CJK}
\end{document}</pre>
<p>于是，中文文档可以嵌入PDF图形了，Sweave文档也可用中文编写了。我们要大力感谢<code>ctex</code>宏包的作者们为我们解决了各种中文配置问题。</p>
<p>有客官也许要问，可复制粘贴的中文文档有那么重要么，一份中文文档可以正常阅读不就可以了么？是滴是滴，可复制粘贴很重要，我的关注点是放在网上的中文文档能否被搜索引擎正确收录。要是它本质上都是乱码，别人就无法通过搜索引擎找到你的东西了。这年头，平民百姓自个儿的网站的访问来源大部分都是来自于搜索引擎，别人要是搜不到你的东西，咋可能来敲门呢。不来敲门，咋会有后面更多的机会呢？</p>
<li>（<strong>LyX基于LaTeX说中文了</strong>）LyX使用ctex系列的layout：ctex宏包提供了三种基本的文档类，即论文、书籍和报告，这让我们写中文文档更符合中文习惯，一些英文名称比如Figure会变成“图”、Abstract会变成“摘要”，等等，让我们省去了大量的重命名工夫。</li>
<p>我大约用了三四年时间LaTeX，辛辛苦苦敲代码啊敲代码，直到有一天发现了LyX。可以说大多数有界面的文本编辑器都跟MS Word一个德行，为了所见即所得，大大牺牲了质量，用了LaTeX的人大多会“中毒”，看别的什么排版都是垃圾，但LyX绝对是个例外，它聪明地提供了导入导出LaTeX的功能，虽说它也算是所见即所得，但它自己不干排版的事情，而是把这事儿交给LaTeX去办，排版质量当然没得说了。</p>
<p>要在LyX中能够通过界面点选使用<code>ctex</code>的文档类的话，得自己先写几个<code>*.layout</code>文件放在<code>Resources/layouts/</code>目录下，比如要用<code>ctexart</code>类：</p>
<pre class="brush: r">#% Do not delete the line below; configure depends on this
#  \DeclareLaTeXClass[ctexart]{article (CTeX)}

# Read the definitions from article.layout
Input article.layout</pre>
<p>存为<code>ctex-article.layout</code>，然后Reconfigure一下LyX，重启，就可以在<code>Document--&gt;Settings</code>中选择这个类了，记得把语言设置为中文。这样，在LyX中就可以直接编译生成可复制粘贴的中文文档了。</p>
<li>（<strong>Sweave基于LaTeX和LyX说中文了</strong>）联合ctex宏包直接用LyX写中文Sweave文档：<a title="http://cran.r-project.org/contrib/extra/lyx/" href="http://cran.r-project.org/contrib/extra/lyx/" target="_blank">CRAN上有关于如何配置LyX使之支持Sweave</a>，所以很容易模仿一个新的layout文件，让LyX支持中文Sweave文件，比如就叫<code>ctex-article-sweave.layout</code>吧。</li>
<pre class="brush: r">#% 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</pre>
<p>现在，我们就可以在菜单中选文档类为<code>article (Sweave CTeX)</code>了，当然我们要首先保证<code>ctexart.cls</code>和<code>Sweave.sty</code>都能被LyX找到（可以采取任何手段把R目录下的texmf下的Sweave.sty复制到LaTeX宏包的目录中去），否则这个选项会显示为unavailable。</p>
<p>接下来，我们就要遇到点麻烦了：这里的看官的Windows系统恐怕都是中文环境，codepage是936，而Sweave读文件时需要正确的编码参数，你要是直接把中文的Rnw文件扔给它，它会把所有多字节字符转化为空白或者NA。所以呢，我们要稍微配置一下R的启动选项，比如在<code>Rprofile.site</code>文件中加上<code>options(encoding = "UTF-8")</code>，这样Sweave就能正确读入UTF-8编码的文件了（实际上这影响的是<code>readLines()</code>）。</p>
<li>（<strong>动态的R图形基于Sweave、LyX和LaTeX说中文了</strong>）R的<code>pdf()</code>图形设备是可以支持中文字符的，只不过要设置<code>family = "GB1"</code>参数，比如：</li>
<pre class="brush: r">pdf(family = "GB1")
plot(1, main = "我是中文，哇哈哈哈", xlab = "顶楼上的！")
dev.off()</pre>
<p>这个参数可以用<code>pdf.options()</code>函数事先设定，因为我们无法用Sweave的选项去指定<code>pdf()</code>设备的family参数。</p>
<p>然而，悲剧就在于这种方式生成的R图形中，英文字体很难看，瘦高瘦高的。所以我们需要对PDF图形进行某种处理。</p>
<li>（<strong>动态的R图形基于pgfSweave、LyX和LaTeX说漂亮的中文了</strong>）pgfSweave包提供了一种解决方案，就是把PDF图形转化为tikz格式（不甚了解，应该类似于pictex吧），然后插入LaTeX文档，这样图形中的所有文本都会被当做原始的LaTeX代码处理，其后果就是PDF图形中的文本格式将会LaTeX文档完全一致，包括数学公式！！比如我最开头的那段Sweave代码中，标签用了LaTeX数学公式，这些东西会被转化为原汁原味的LaTeX公式。</li>
<p>要想让LyX支持pgfSweave，目前我只能通过暴力修改Sweave的converter，定义为<code>R --verbose --no-save --no-restore -q -e library(pgfSweave);pgfSweave('$$i',compile.tex=FALSE)</code>，这样pgfSweave负责运行R代码并生成tex文档，然后LyX会自动将tex编译为PDF。</ol>
<p>至此，我们能够在ctex、LaTeX、R和pgfSweave的支持下用LyX创建<strong>可复制粘贴中文的、动态的、能使用带有中文字符和原生LaTeX数学公式的PDF图形的</strong>PDF文档。显然，这路途颇有些曲折，不过一番周折之后，想想以后写中文的东西只需要点几下鼠标，就能用R生成漂亮的PDF文档，心里还是很舒坦的。我写东西很是受排版影响——只要版式漂亮，俺就有无穷的写作动力。</p>
<p>几点附注：</p>
<ol>
<li>我用UTF-8编码的原因是它比较通用，尤其是这次论坛搬家，要是没有颜林林想出办法解决了从GB2312到UTF-8编码的转换，我真是被编码问题愁死了。打这以后，能用UTF-8一律用UTF-8，管它占用空间大小呢。再者，后面我还想大规模使用GitHub，那网站也是UTF-8的，为了源文件在网站上能正确显示，也必须用UTF-8编码。</li>
<li>CRAN上关于LyX的配置（literate-scrap.inc）被我拿来修改了，主要是更改了Scrap的定义，我很不喜欢原作者关于换行符的定义，必须用Ctrl+Enter，使得老夫在LyX中敲R代码很不爽，而且没法跟别的编辑器互相复制粘贴，现在我可以自由自在地敲R代码了。</li>
<li>Sweave到pdfLaTeX的转换器从<code>R CMD Sweave $$i</code>改为了<code>cp $$r/*.{r,txt,pdf} ./ &amp; R --verbose --no-save --no-restore -q -e library(pgfSweave);pgfSweave('$$i',compile.tex=FALSE)</code>，原因是LyX会把文档复制到一个临时目录下编译，这一点我觉得挺不好的，尤其是写动态文档时，有些数据文件或者R代码需要在文档中使用，但LyX不会把它们全都复制过去，所以R代码运行时会出错，所以我人为加入了复制*.r/*.txt/*.pdf文件到编译的目录中去的命令，然后用命令行的方式执行R，执行的内容是<code>library(pgfSweave);pgfSweave('$$i',compile.tex=FALSE)</code>，这段代码可以用-e参数传给R；设定compile.tex=FALSE的原因是pgfSweave默认会编译LaTeX文档，而我们只需要让它走到生成LaTeX文档那一步就够了。</li>
<li>Sweave不支持给每一幅图形设定宽度，只能通过<code>\setkeys{Gin}{width=}</code>的方式统一设定文档中所有图形的宽度，这一点也让人很不爽，哪有文档能保证所有图形宽度都一样呢，因此我们让Sweave.sty不要统一设定宽度：<code>\usepackage[nogin]{Sweave}</code>；然后在每一段R代码块中分别设定width，这样pgfSweave可以根据这些宽度相应设定图形宽度。这一点也反映在对<code>literate-scrap.inc</code>文件的修改上了。</li>
<li>pgfSweave包默认有命令行执行的方式：<code>R CMD pgfSweave</code>，但这个方式是基于Rscript的，它在执行的时候并不会等程序真的运行完了才退出，而是一扫而过，该运行的程序还在后台默默运行。这一点会让LyX昏了头，LyX以为Sweave代码已经执行完毕，可以启动<code>pdflatex</code>编译了，但事实上tex文档压根儿就还没生成出来。因此我采用了<code>R -e</code>的方式，让LyX老老实实等待R运行结束再编译。</li>
<li>本文的配置对部分客官来说简单，对不常用命令行的客官可能还有好几步路要走，比如把R的bin路径放到系统的PATH环境变量中，以及阅读CRAN上关于LyX+Sweave的配置等等，装LaTeX宏包fancyvrb等（Sweave.sty依赖于它，否则layout在LyX中显示unavailable，尽管Sweave.sty存在）。</li>
</ol>
<span class="download">下载：<a href="http://yihui.name/cn/wp-content/uploads/2010/02/lyx-pgfsweave.zip">文中提到的layout文件们，以及preferences</a></span>
<h2  class="related_post_title">爷还想看：</h2><ul class="related_post"><li>2011/02/09 -- <a href="http://yihui.name/cn/2011/02/lyx-2-0-and-sweave/" title="LyX 2.0与Sweave/pgfSweave">LyX 2.0与Sweave/pgfSweave</a> (12)</li><li>2010/12/24 -- <a href="http://yihui.name/cn/2010/12/solutions-in-the-origin/" title="灯火阑珊处">灯火阑珊处</a> (2)</li><li>2011/05/31 -- <a href="http://yihui.name/cn/2011/05/write-chinese-in-lyx/" title="在LyX中使用中文">在LyX中使用中文</a> (35)</li><li>2011/08/21 -- <a href="http://yihui.name/cn/2011/08/proud-debugging/" title="得意程序侦察另一则">得意程序侦察另一则</a> (6)</li><li>2011/05/10 -- <a href="http://yihui.name/cn/2011/05/lyx-2-0-released/" title="LyX 2.0横空出世">LyX 2.0横空出世</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://yihui.name/cn/2010/02/misc-issues-in-latex-lyx-r-sweave-pgfsweave/feed/</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
	</channel>
</rss>

