【问题标题】:knitr: Use an inline expression in fig.cap chunk optionknitr:在 fig.cap 块选项中使用内联表达式
【发布时间】:2013-03-29 17:25:11
【问题描述】:

我的问题是关于 knitr 选项 fig.cap,在使用 LaTeX 时。是否可以包含 \rinline 或 \Sexpr 在 fig.cap 字符串中?

例如,我想要类似的东西(我正在使用 .Rtex 文件):

\documentclass{article}
\begin{document}
%% begin.rcode fig.cap="x is \\rinline{x}"
% x <- 5
% p <- seq(0,5)
% q <- x*p
% plot(p,q)
%% end.rcode
\end{document}

我真的很希望该块在我的 .tex 文档中生成一个图,标题为“x 为 5”。相反,它会在 pdflatex 编译时引发“未定义的控制序列”错误。

如果我不转义 rinline(即只使用 \rinline{x}),那么它会编译,但标题是“x is inlinex”。

我问的可能吗?

这是我的第一个 SO 问题(虽然多次使用这里的答案。谢谢!),所以我很感激任何有关如何提出更好问题的反馈。

感谢您的帮助!

【问题讨论】:

    标签: knitr


    【解决方案1】:

    fig.cap 被评估为 R 表达式,因此您可以在 R 中创建标题字符串,而不是使用 \rinline(因此标题再次由 knitr 解析)。

    %% begin.rcode fig.cap=paste("x is", x)
    

    但是因为fig.cap 被评估之前 x 是默认创建的,你需要推迟fig.cap 的评估;为此,您可以在文档的开头包含这样的块:

    %% begin.rcode setup, include=FALSE
    %% opts_knit$set(eval.after = 'fig.cap')
    %% end.rcode
    

    它指定fig.cap 在代码块被评估之后被评估,即当x 可供您在图形标题中使用时。见eval.after in the documentation

    另一种方法是在上一个块中创建x,并在下一个块中使用fig.cap=paste("x is", x)

    【讨论】:

    • 其实我一直在思考这个问题——我认为将fig.cap这样的chunk选项默认设置为eval.after选项是合理的,因为它们只在一个chunk之后使用。
    • 太好了; eval.after 正是我想要的!我很尴尬我自己没有找到它——我猜是 RTFM。谢谢大家!
    • @user2225161 没问题;正如我所说,我可能希望默认情况下发生这种情况,而不是手动设置; eval.after 有点尴尬……
    • @Yihui 感谢您完成我的回答。我忘记了设置eval.after,因为我在我的默认模板中设置了它,所以我不必每次都记住它。
    • @Yihui 我同意这将是一个更好的默认设置。您是否想到了不利的一面,或者只是还没有考虑到这一点?
    猜你喜欢
    • 1970-01-01
    • 2021-07-18
    • 2013-09-28
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多