knitr 1.5 / patchDVI 1.9似乎没有产生evince + emacs可接受的一致性

时间:2013-10-21 16:17:25

标签: pdf emacs knitr ess auctex

设置:这是sessionInfo():

R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=fr_FR.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=fr_FR.UTF-8        LC_COLLATE=fr_FR.UTF-8    
 [5] LC_MONETARY=fr_FR.UTF-8    LC_MESSAGES=fr_FR.UTF-8   
 [7] LC_PAPER=fr_FR.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=fr_FR.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] patchDVI_1.9 knitr_1.5   

loaded via a namespace (and not attached):
[1] compiler_3.0.2 evaluate_0.5.1 formatR_0.9    highr_0.2.1    stringr_0.6.2 
[6] tcltk_3.0.2    tools_3.0.2   

我正在尝试使用emacs和AucTeX将我的.Rnw源文件与evince同步,以便从源代码返回到comiled文本。

我已经检查过.tex源和PDF之间的同步工作正常。

我的.Rnw文件以:

开头
\documentclass[a4paper,twoside,12pt]{article}
\synctex=1 %% Should force concordance generation
\pdfcompresslevel=0 %% Should force avoidance of PDF compression, which patchDVI does
\pdfobjcompresslevel=0 %% not handle
<<include=FALSE>>= %% Modificaton of what Sweave2kinitr does
## opts_chunk$set(concordance=TRUE, self.contained=TRUE) ## No possible effect
opts_knit$set(concordance=TRUE, self.contained=TRUE) ## Seems reasonable
@
%% \SweaveOpts{concordance=TRUE} %% That's where inspiration came from

考虑以下日志(编辑不相关的部分):

> options("knitr.concordance")
$knitr.concordance
[1] TRUE

> opts_knit$get("concordance")
[1] TRUE
> knit("IntroStat.Rnw")


processing file: IntroStat.Rnw
  |......................                                           |  33%
  ordinary text without R code

  |...........................................                      |  67%
label: unnamed-chunk-1 (with options) 
List of 1
 $ include: logi FALSE

  |.................................................................| 100%
  ordinary text without R code


output file: IntroStat.tex

[1] "IntroStat.tex"
> system("pdflatex -synctex=1 IntroStat.tex")

[编辑不相关]

SyncTeX written on IntroStat.synctex.gz.

注意:符号 *已* 生成 !!! **

Transcript written on IntroStat.log.

让我们再次修复引用:

> system("pdflatex -synctex=1 IntroStat.tex")

[编辑不相关]

Output written on IntroStat.pdf (1 page, 136907 bytes).
SyncTeX written on IntroStat.synctex.gz.

注意:一致 *已* * em>生成 * * * **

Transcript written on IntroStat.log.
> patchDVI("IntroStat.pdf")
[1] "0 patches made. Did you set \\SweaveOpts{concordance=TRUE}?"

*我不明白*

> patchSynctex("IntroStat.synctex.gz")
[1] "0 patches made. Did you set \\SweaveOpts{concordance=TRUE}?"

*同上*

似乎工具集中的某些内容无法像宣传的那样工作:dviPatch无法识别法律索引\ specials或pdflatex dfoes不生成它们。它 生成一些东西,但是......

我检查了生成的PDF使evince能够与.tex文件同步,但不能在.Rnw文件中同步。此外,当在emacs中打开.Rnw文件时,在AucTeX中使用“Cc Cv View”启动查看器确实启动了查看器(在请求打开我授权的服务器之后),但是查看器是空的,我得到了这个: “TeX-evince-sync-view:找不到文件的Evince实例:///home/charpent/Boulot/Cours/ODF/Chapitres/Ch3-StatMath/IntroStat.Rnw.pdf” 在“消息”缓冲区中。

所以我们在这里遇到了第二个问题。

第三个是将所有这些透明地集成到AucTeX生产链中,但这是另一个故事......

我真的希望将emacs作为我R / \ LaTeX / Sage工作的主要工具,而不是切换到RStudio,这可能不会像我每天/每周所需的SageTeX和其他工具那样多...

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

也许这https://github.com/jan-glx/patchKnitrSynctex会有所帮助。我在一个简单的文件上尝试过它,它确实有效。

关于第二个和第三个问题,我有这个脚本(注意我从jan-glx中获取上面的代码;相应地修改路径):

#!/bin/bash
FILE=$1
BASENAME=$(basename $FILE .Rnw)
Rscript -e 'library(knitr); opts_knit$set("concordance" = TRUE); knit("'$1'")'
pdflatex --synctex=1 --file-line-error --shell-escape "${1%.*}"
Rscript -e "source('~/Sources/patchKnitrSynctex.R'); patchKnitrSynctex('${1%.*}.tex')"
ln -s $BASENAME.synctex.gz $BASENAME.Rnw.synctex.gz
ln -s $BASENAME.pdf $BASENAME.Rnw.pdf

这些链接是解决“无法找到实例(...)”的愚蠢方式。

如果你的.Rnw在Emacs缓冲区中,请转到shell缓冲区,然后调用该脚本。完成后,来自Emacs的C-c C-v将打开您配置的PDF查看器(在我的情况下为okular)。在PDF中,shift +鼠标左键单击(至少是okular)会将您带到Emacs .Rnw缓冲区中的正确位置。

这并不理想:如果你跳转到错误,它会转到.tex,而不是.Rnw。而且我希望能够通过C-c C-c或类似方式调用它(但我不知道如何--- elisp无知)。