2013-03-29 10 views
9

La mia domanda riguarda l'opzione knitr fig.cap, quando si usa LaTeX. È possibile includere un \ rinline o \ Sexpr nella stringa di caratteri fig.cap?knitr: Usa un'espressione incorporata in fig.cap opzione chunk

Per esempio, mi piacerebbe avere qualcosa di simile (sto usando un file .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} 

Mi piacerebbe molto per quel pezzo di produrre una trama nel mio documento .tex, con una didascalia che legge "x è 5". Invece, genera un errore di "sequenza di controllo indefinita" nella compilazione di pdflatex.

Se non scappo dalla linea di risciacquo (utilizzare solo \ rinline {x}), quindi viene compilato, ma la didascalia è "x è inlinex".

È quello che sto chiedendo possibile?

Questa è la mia prima domanda SO (ho usato le risposte qui molte volte, però. Grazie!), Quindi apprezzerei qualsiasi feedback su come fare domande migliori.

Grazie per l'aiuto!

risposta

8

fig.cap è valutato come un'espressione R, quindi invece di usare \rinline (e quindi con la didascalia nuovamente analizzato da knitr), si può semplicemente creare la stringa didascalia in R.

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

ma perché è fig.cap valutato primax viene creato per impostazione predefinita, è necessario posticipare la valutazione di fig.cap; per fare questo, è possibile includere un pezzo come questo all'inizio del documento:

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

Specifica fig.cap da valutare dopo il codice pezzo viene valutata, cioè quando x è disponibile per l'utilizzo nella figura didascalia. Vedi eval.after in the documentation.

L'altro modo per farlo è quello di creare x in un precedente pezzo, e utilizzare fig.cap=paste("x is", x) nel prossimo pezzo.

+1

In realtà ho pensato a questo problema - Penso che sia ragionevole fare opzioni come "fig.cap" nell'opzione "eval.after" di default perché sono usate solo dopo un chunk. –

+0

È fantastico; eval.after è esattamente quello che stavo cercando! Sono imbarazzato che non l'avessi trovato da solo, RTFM, credo. Grazie ragazzi! –

+0

@ user2225161 Nessun problema; come ho detto, potrei volere che succedesse di default invece di essere impostato manualmente; 'eval.after' è una specie di imbarazzo ... –

Problemi correlati