当我尝试在 RStudio(Windows 7)中为 knitr 文档“编译 PDF”时,报告了多个问题,尽管 .pdf 仍在工作目录中生成。我使用的是 R 3.1.3,我已经安装了 MiKTeX,并且肯定安装了 knitr。我已在 RStudio 中设置了全局选项,以使用 knitr 编织 .Rnw 文件。当我尝试编译以下最小脚本(basic.Rnw:
\documentclass{article}
\begin{document}
Test:
<<>>=
a <- 4
@
\end{document}
在“编译 PDF”选项卡中报告了以下问题:
- 第 57 行 未定义控制序列。1
- 第 57 行 未定义控制序列。1
- 第 57 行 缺失数字,视为零。2
- 第 57 行 计量单位非法(插入 pt)3
- 第 57 行 您不能在垂直模式下使用 \ unskip'。4
- 第 61 行 未定义控制序列。1
和
警告消息:运行命令'“C:\PROGRA~1\MIKTEX~1.9\miktex\bin\x64\texi2dvi.exe”--quiet --pdf“inline.tex”--max-iterations=20 -I“C:/PROGRA~1/R/R-31~1.3/share/texmf/tex/latex”-I“C:/PROGRA~1/R/R-31~1.3/share/texmf/bibtex/bst”'状态为 1
在控制台中。
最后的数字没有报告,对应于 .log 中的以下消息
- 未定义的控制序列 错误消息顶行末尾的控制序列从未被 \def 过。如果拼写错误(例如,“\hobx”),请键入“I”和正确拼写(例如,“I\hbox”)。否则请继续,我会忘记未定义的内容。
- 缺失数字,视为零 这里应该有一个数字;我插入了“0”。(如果您不明白我为什么需要看到一个数字,请在 TeXbook 索引中查找“奇怪的错误”。)
- 非法测量单位(插入 pt)尺寸的单位可以是 em、ex、in、pt、pc、cm、mm、dd、cc、nd、nc、bp 或 sp;但您的单位是新的!我假设您指的是 pt,表示打印点。要从此错误中顺利恢复,最好删除错误的单位;例如,键入“2”以删除两个字母。(请参阅 TeXbook 的第 27 章。)否则继续,我会忘记未定义的内容。
- 您不能在垂直模式下使用 '\unskip' 抱歉...我通常无法从当前页面获取内容。请尝试使用 'I\vskip-\lastskip'。
如果我更改为<<echo=FALSE>>=
不会出现错误并且 .pdf 会打开,但如果我添加print("Hello world")
它会再次返回,所以它与打印任何形式的 R 代码有关。
我在网上查看了解决方案,似乎许多问题都是因为序言中缺少了某些内容而发生的。我知道以前\usepackage{Sweave}
Sweave 需要添加这个,knitr 是否也需要类似的东西?我看过的教程似乎没有表明情况确实如此。
我对 R 和 LaTeX 还很陌生(都不到 1 周),所以如果答案太明显,请见谅。这也是我在这里的第一篇帖子,所以如果格式等方面有任何问题,请告诉我。
编辑:现在在 R/TeXWorks 中 - 类似的问题,如果我在 R 中运行上述 .Rnw 文件(knit("basic.Rnw")
)会生成以下 .tex 文件
\documentclass{article}\usepackage[]{graphicx}\usepackage[]{color}
%% maxwidth is the original width if it is less than linewidth
%% otherwise use linewidth (to make sure the graphics do not exceed the margin)
\makeatletter
\def\maxwidth{ %
\ifdim\Gin@nat@width>\linewidth
\linewidth
\else
\Gin@nat@width
\fi
}
\makeatother
\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345}
\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}%
\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}%
\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}%
\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}%
\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}%
\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}%
\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}%
\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}%
\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}%
\usepackage{framed}
\makeatletter
\newenvironment{kframe}{%
\def\at@end@of@kframe{}%
\ifinner\ifhmode%
\def\at@end@of@kframe{\end{minipage}}%
\begin{minipage}{\columnwidth}%
\fi\fi%
\def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep
\colorbox{shadecolor}{##1}\hskip-\fboxsep
% There is no \\@totalrightmargin, so:
\hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
\MakeFramed {\advance\hsize-\width
\@totalleftmargin\z@ \linewidth\hsize
\@setminipage}}%
{\par\unskip\endMakeFramed%
\at@end@of@kframe}
\makeatother
\definecolor{shadecolor}{rgb}{.97, .97, .97}
\definecolor{messagecolor}{rgb}{0, 0, 0}
\definecolor{warningcolor}{rgb}{1, 0, 1}
\definecolor{errorcolor}{rgb}{1, 0, 0}
\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX
\usepackage{alltt}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
Test:
\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{alltt}
\hlstd{a} \hlkwb{<-} \hlnum{4}
\end{alltt}
\end{kframe}
\end{knitrout}
\end{document}
TeXworks 无法编译 .pdf,因此我不得不中止排版。如果我这样做,basic.log 中会报告以下错误!
未定义控制序列。\kframe ...argin \hskip \columnwidth }\MakeFramed {\advance \hsize -\width ... l.56 ...0.969, 0.969}\color{fgcolor}\begin{kframe}
然后,如果我转到错误、警告、坏框,按照出现错误的链接将我带到该行\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
。
答案1
使用 LaTeX 和 R 代码的文件的编译顺序如下,该文件将通过 knitr 进行处理,其中 * 是您的文件名,不带扩展名。我建议您先使用 TeXworks(与 MikTeX 捆绑在一起)和 R 运行这些文件,然后再在 RStudio 中诊断问题。过去,RStudio 对支持程序的设置非常挑剔(我最近没有使用它)
- *.tex 文件重命名为后缀 *.Rnw(区分大小写)
- 在现在的 *.Rnw 文件中,您需要使用 R 块来加载任何所需的 R 库并执行任何计算。
- 当 *.Rnw 文件准备好进行编译时(并且文件在重命名后就准备好了),您需要启动 R,将工作目录更改为与 *.Rnw 文件相同的目录。现在您需要加载 knitr 包。(如果需要,请安装它,然后加载它。
- 在 R 控制台中发出命令
knit *.Rnw
,这将创建一个 *.tex 文件,其中 R 命令替换为输出。 - 现在返回到您的 LaTeX 并运行 pdflatex 两次,然后运行您的查看器。
如果您使用的是 IDE,则有一些设置允许您在 LaTeX IDE 中完成所有这些操作。但是我不熟悉 RStudio 的当前版本。过去无法从 RStudio 运行 knitr,因为当时 RStudio 是为 Sweave 硬连线的。
我建议你去参观http://yihui.name/knitr/因为 knitr 的作者提供了广泛的帮助和演示网站(示例)。
答案2
问题发生的原因显然是存储framed.sty
目录中的副本存在错误basic.tex
。此错误副本在任何重新安装中均未被删除,因为它位于运行 .tex 文件的文件夹中,而不是 Program Files 等文件夹中。这解释了为什么我在工作和家庭计算机上遇到同样的问题 - 我在两台 PC 上运行的是同一个闪存驱动器。
移除旧的framed.sty
并用 CTAN 的新产品替换它解决了问题。
另一个教训是:如果某些东西不起作用,请尝试将其放在包含最少内容的文件夹中,然后从那里运行代码