【问题标题】:Open pdf viewer at a certain line (forward-search) from within an .Rnw (Sweave) file从 .Rnw(Sweave)文件中的某一行(向前搜索)打开 pdf 查看器
【发布时间】:2025-12-26 02:30:16
【问题描述】:

我正在使用 Ubuntu 12.04、Emacs 24 和 (pdf) 查看器 Okular 0.14。我希望能够从.Rnw(Sweave)文件中打开 Okular(并跳转到特定行)。通过使用

(setq TeX-view-program-list
      '(("Okular" "okular --unique %o#src:%n`pwd`/./%b")))

~/.emacs 中,这已经适用于.tex 文件,甚至在包含master.tex 和章节chapter.tex 的多文件项目中。通过使用C-c C-v(或C-c C-c View)可以跳转到相应的行(此功能也称为前向搜索)。

我也想在.Rnw 文件中进行前向搜索,其中chapter.texchapter.Rnw 替换(Sweave)。然而,通过上述设置,C-c C-c View(从chapter.Rnw 内部执行)给了我"Output file "chapter.pdf" does not exist."。显然,master.pdf 应该已经打开了。

我尝试在chapter.Rnw 中设置局部变量(这适用于C-c C-_ 上的纯.tex 文档),但对于.Rnw 文件似乎在两种意义上都被忽略了:首先,C-c C-_ 没有t 再插入任何东西,其次,在C-c C-c 上,仍然尝试打开错误的文件chapter.pdf。在C-c C-c View 上,我看到%o%n%b 的实际调用...展开:

okular --unique chapter.pdf#src:8`pwd`/./chapter.Rnw

如果我手动将chapter.pdf 替换为master.pdf,那么我可以从chapter.Rnw 跳转到master.pdf 中的对应行。所以该命令基本上可以工作,但它没有从.Rnw 文件中找到正确的主文件。

这是一个最小的例子:

章节.Rnw:

% patchDVI setup (see vignette)
\SweaveOpts{concordance=TRUE}
<<echo=FALSE>>=
.TexRoot <- "master.tex" 
@

foo bar foo bar
\clearpage
<<hist, echo=TRUE, fig=true>>=
X <- rnorm(50, mean=20, sd = 3)
hist(X)
@
foo bar foo bar

%%% Local Variables:
%%% mode: latex
%%% TeX-master: "master.tex"
%%% End:

master.tex:

\documentclass{scrbook}

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[american]{babel}
\usepackage{blindtext}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{fancyvrb}
\usepackage{Sweave}

\fvset{listparameters={\setlength{\topsep}{0pt}}}
\renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}}

\begin{document}

\input{chapter}

\end{document}

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

包装器.Rnw:

% patchDVI setup (see vignette)
<<echo=FALSE>>=
.SweaveFiles <- c("chapter.Rnw") 
@

我使用Rscript -e "patchDVI::SweavePDF('chapter.Rnw', encoding='utf8')" 编译它(所以使用Duncan Murdoch 的R 包patchDVI 来与.Rnw 文件同步。也可以编译整个项目,只需将chapter.Rnw 替换为wrapper.Rnw

【问题讨论】:

  • .Rnw 文件是什么?您是否在latex-mode(来自 AucTeX 的那个)中编辑这些文件?如果是,您是否为这些文件设置了TeX-master 变量(即通过文件局部变量)?
  • .Rnw 文件是 .Snw 文件的 R 等价物(我相信);见?RweaveLatex。我在上面添加了一些更多信息以及一个最小示例。希望这可以帮助。稍后我会添加更多内容。
  • 您是否尝试过TeX-master: "master",即省略扩展名?只是一个疯狂的猜测,因为我手头没有 Emacs 来真正深入研究这个问题。
  • 我试过了,但它并没有改变问题的行为。
  • 您确认TeX-master 的值正确吗?将光标移动到chapter.Rnw 缓冲区,然后按C-h v TeX-master。这是否将"master" 显示为当前缓冲区本地值?顺便说一句,我需要什么工具来构建 .Rnw 文件?我想尝试使用您的文件构建自己……

标签: emacs sweave auctex


【解决方案1】:

问题是TeX-normal-mode.Rnw 文件中丢失,因此对于.tex 文件的前向搜索不再起作用。要保留TeX-normal-mode,请使用:

(add-hook 'noweb-select-doc-mode-hook
      '(lambda ()
         (unless (boundp 'in-noweb-select-doc-mode-hook)
           (let* ((in-noweb-select-doc-mode-hook t)
              (deactivate-mark))
         (TeX-normal-mode t)))))

【讨论】: