2013-03-29 8 views
9

Moje pytanie dotyczy opcji knitr fig.cap, podczas używania LaTeX. Czy jest możliwe dołączenie \ rinline lub \ Sexpr w ciągu znaków fig.cap?knitr: Użyj wyrażenia w wierszu w opcji porcji fig.cap

Na przykład, chciałbym mieć coś podobnego (używam plik .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} 

Naprawdę chciałbym za to kawałek produkować działkę w moim dokumencie .tex, z napisem "x wynosi 5". Zamiast tego generuje błąd "niezdefiniowanej sekwencji kontrolnej" na kompilacji pdflatex.

Jeśli nie wymknę się rineli (tj. Użyję tylko \ rinline {x}), to kompiluje się, ale podpis jest "x to inlinex".

Czy o to pytam?

To jest moje pierwsze pytanie (często używane odpowiedzi wiele razy, dziękuję!), Więc doceniam wszelkie opinie na temat zadawania lepszych pytań.

Dzięki za pomoc!

Odpowiedz

8

fig.cap jest oceniany jako wyraz R, więc zamiast używać \rinline (a więc posiadające podpis ponownie przeanalizowany przez knitr), można po prostu utworzyć ciąg napisów w R.

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

ale ponieważ jest fig.cap ocenione przedx jest tworzony domyślnie, będziesz musiał odroczyć ocenę fig.cap; aby to zrobić, można to kawałek takiego na początku dokumentu:

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

określa fig.cap być oceniane po fragmencie kodu jest oceniany, czyli gdy x jest dostępna do użycia w rysunku podpis. Zobacz eval.after in the documentation.

Innym sposobem, aby to zrobić jest stworzenie x w poprzedniego kawałku i użyć fig.cap=paste("x is", x) w następnego fragmencie.

+1

Właściwie to myślałem o tym problemie - wydaje mi się, że rozsądne jest, aby opcje porcji, takie jak 'rys.cap', były domyślnie włączone w opcję' eval.after', ponieważ są używane tylko po porcji. –

+0

To świetnie; eval.after jest dokładnie tym, czego szukałem! Wstydzę się, że sam tego nie znalazłem - chyba RTFM. Dzięki chłopaki! –

+0

@ user2225161 Bez problemu; jak już powiedziałem, mogę chcieć, aby to się stało domyślnie zamiast ręcznego ustawiania; 'eval.after' jest dość niezręczne ... –

Powiązane problemy