ESS/AucTeX/Sweave integration

青春壹個敷衍的年華 提交于 2019-12-20 23:27:12

问题


I'm using GNU/Linux distro (Arch, if that's relevant), Emacs v23.2.1, ESS v5.9 and AucTeX v11.86.

I want to setup AucTeX to recognize .Rnw files, so I can run LaTeX on .Rnw files with C-c C-c and get .dvi file automatically. I reckon it's quite manageable by editing .emacs file, but I still haven't got a firm grasp on Elisp.

Yet another problem is quite annoying - somehow, LaTeX is not recognizing \usepackage{Sweave} in preambule, so I actually need to copy Sweave.sty file (in my case located in /usr/share/R/texmf/Sweave.sty) to directory where .Rnw file is located (and I'm becoming more frustrated by the fact that this is common bug on Windows platforms!)

My question boils down to two problems:

  • how to make LaTeX recognize \usepackage{Sweave} (without copying Sweave.sty to "home" folder each time) [Edit: managed to do this; see comment after Dirk's answer]
  • how to setup AucTeX to compile .Rnw files to .dvi

回答1:


That's two different questions.

For the first one, my Debian R packages make sure that there is a soft link from the $RHOME/share/texmf/ directory into the TeX file system tree, e.g. as /usr/share/texmf/tex/latex/R.

For the second question: dunno. I tend to run Sweave via a small shell script I crafted years ago even though I do all the editing in Emacs.

Edit, a few months later: Use ESS, rather than AucTeX. Then M-n s (i.e Alt-n followed by s) runs the Sweave step and M-n P runs the LaTeX compilation, with a call to Bibtex if needed.




回答2:


After brief and efficient Googling, I've found this link, and at first glance, everything seems OK, but pdf file gets garbled after Sweaving... So I tackled this problem another way around: when in doubt, go bash! I've shamelessly stolen error checking function from Dirk's Sweave bash script available here. Basically, this is a workaround: R CMD Sweave gets executed on .Rnw file, hence latex comes in, and pdflatex after that...

I'll post a bash script that does the job for me. I must state that I'm not an advanced bash programmer, moreover I'm not even a programmer by vocation, so there's a great chance that this script can be optimized/written properly. Here goes:

#!/bin/bash

FILEBASE=${1%.*}
FILEXT=${1##*.}
FILEPATH=${1%/*}

TEXFILE=$FILEBASE.tex
PDFFILE=$FILEBASE.pdf

# errorexit

function errorexit () {
    echo "Error: $1"
    exit 1
}

# check if file exists
if [ ! -f $1 ]; then
    errorexit "File $1 not found!"
else
# check for filename length
    if [ ${#1} -lt 1 ]; then
    errorexit "Need to specify argument file!"
    else
    # if filelength OK, check extension
    if [ $FILEXT != "Rnw" ]; then
        errorexit "You must pass Sweave (.Rnw) file!"
        # finally, run Sweave
    else
        cd $FILEPATH && R CMD Sweave $1
        # latex $TEXFILE
        pdflatex $TEXFILE
        # xdg-open $PDFFILE
    fi
    fi
fi

Then save/copy/move this script in any of echo $PATH folders (I keep mine in /usr/bin/), and make sure that it's named sweave, or choose whatever name you like, then put these lines in your .emacs file:

(global-set-key (kbd "C-c s")
        (lambda ()
          (interactive)
          (shell-command (concat "sweave " buffer-file-name))))

Of course, you can change keybinding to suite your needs, and be sure to change sweave with script name placed in /usr/bin/.

Bare in mind that this is not an answer, but a workaround. If you have found a way to deal with AucTeX/ESS/Sweave integration, post it, and I'll give it a checkmark.

Prior to this workaround, I had to do M-n s to Sweave, followed by C-c C-c which is default keybind in AucTeX for LaTeX file compilation. Produced file is erroneous, so I had to give it a try with bash. It works for me, if you have any suggestions, please let me know.

Kind regards,
aL3xa

EDIT:
Inserted cd $FILEPATH



来源:https://stackoverflow.com/questions/2940756/ess-auctex-sweave-integration

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!