2015-03-24 13 views
17

Chcę utworzyć threeparttable w dokumencie Rmd/Knitr i dodać notatkę na dole tabeli. Tabela jest tworzona przez funkcję R wewnątrz porcji z results = "asis". Nie dodałem tej funkcji do działającego przykładu, ponieważ jest dość gadatliwa i problem jest oczywisty z czystego kodu LaTeX.Rmd/Kntir: Cytowania Markdown w środowiskach LaTeX

To działa, a wynik wygląda tak, jak powinien.

--- 
title: "Untitled" 
output: pdf_document 
header-includes: 
- \usepackage{threeparttable} 
- \usepackage{booktabs} 
- \usepackage{longtable} 
references: 
- id: rao2001basic 
    title: Basic Research in Parapsychology 
    author: 
    - family: Rao 
    given: K.R. 
    issued: 
    year: 2001 
    publisher: McFarland 
    type: book 
--- 

\begin{table}[h] 
\centering 
\begin{threeparttable} 
\caption{A summary table of the cars dataset.} 
\begin{tabular}{lrr} 
\toprule 
Descriptives & speed & dist\\ 
\midrule 
Mean & 15.4 & 42.98\\ 
SD & 5.29 & 25.77\\ 
Min & 4 & 2\\ 
Max & 25 & 120\\ 
\bottomrule 
\end{tabular} 
\tablenotes{\item\textit{Note.} This table was created by @rao2001basic. } 
\end{threeparttable} 
\end{table} 

enter image description here

Niestety, cytat w podpisie tabeli nie działa. Działa to dobrze, jeśli wyjmę to ze środowiska LaTeX, ale nie w środku. Czy istnieje sposób na analizowanie Markdown w środowisku LaTeX?

+1

Nie sądzę, że jest to możliwe. Pandoc nie analizuje przecinania wewnątrz surowych bloków tex. Czy byłoby możliwe, aby twój kod wyprowadzał tabelę ze zniżkami zamiast lateksu? – tmpname12345

+1

Nie sądzę, że ten typ formatowania tabel jest możliwy w pandocie od teraz. – crsh

+2

Ponieważ używasz funkcji do generowania tabeli, możesz podzielić ją na dwie części, gdzie emituje cytat i pisać do dwóch plików, a następnie użyć '\ input {part1.txt} [@ rao2001basic] \ input {part2. tekst}. Chociaż może być łatwiejsze i bardziej powtarzalne korzystanie z zewnętrznego pliku bib. – Thell

Odpowiedz

0

odkryłem, że jeśli jesteś gotów użyć formatu na bookdown::pdf_document2(), można użyć text references do rozwiązuje ten problem bez konieczności bałagan z LaTeX:

--- 
title: "Untitled" 
output: bookdown::pdf_document2 
header-includes: 
- \usepackage{threeparttable} 
- \usepackage{booktabs} 
- \usepackage{longtable} 
references: 
- id: rao2001basic 
    title: Basic Research in Parapsychology 
    author: 
    - family: Rao 
    given: K.R. 
    issued: 
    year: 2001 
    publisher: McFarland 
    type: book 
--- 

(ref:tablenote) 
This table was created by @rao2001basic. 

\begin{table}[h] 
\centering 
\begin{threeparttable} 
\caption{A summary table of the cars dataset.} 
\begin{tabular}{lrr} 
\toprule 
Descriptives & speed & dist\\ 
\midrule 
Mean & 15.4 & 42.98\\ 
SD & 5.29 & 25.77\\ 
Min & 4 & 2\\ 
Max & 25 & 120\\ 
\bottomrule 
\end{tabular} 
\tablenotes{\item\textit{Note.} (ref:tablenote)} 
\end{threeparttable} 
\end{table} 

To działa nawet gdy tabele są tworzone przez w R:

```{r results = "asis"} 
knitr::kable(mtcars[1:3, ], caption = "(ref:tablenote)") 
``` 
3

Tego rodzaju problem jest zasadniczo ucieczką, a raczej zagadnieniem unikania automatycznego rozpoznawania początku/końca bloku lateksu.

tym konkretnym przypadku może być napisany w środowisku polecenia bezpośrednio jako

\table[h] 
\centering 
\threeparttable 
\caption{A summary table of the cars dataset.} 
\begin{tabular}{lrr} 
\toprule 
Descriptives & speed & dist\\ 
\midrule 
Mean & 15.4 & 42.98\\ 
SD & 5.29 & 25.77\\ 
Min & 4 & 2\\ 
Max & 25 & 120\\ 
\bottomrule 
\end{tabular} 
\tablenotes[flushleft] 
\item\textit{Note.} This table was created by @rao2001basic. 
\endtablenotes 
\endthreeparttable 
\endtable 

ale jeśli begin{env}/end{env} są rzeczywiście potrzebne wtedy makra mogą być używane jak to

\def \btable{\begin{table}} 
\def \etable{\end{table}} 
\def \bthreeparttable{\begin{threeparttable}} 
\def \ethreeparttable{\end{threeparttable}} 
\def \btablenotes{\begin{tablenotes}} 
\def \etablenotes{\end{tablenotes}} 

Byłoby miło jeśli istniało solidne ogólne rozwiązanie do zmiany nazwy na begin{env}/end{env}, które może pozwolić na selektywne oznaczenie w tex Bloki. Coś jak ...

\newcommand\mdbegin[2]{% 
    \ifstrempty{#1}{% 
    \begin{#2} 
    }{% 
    \begin{#1}[#2] 
    }% 
} 

\newcommand\mdend[1]{% 
    \end{#1} 
} 

który działa za to, wykorzystując pakiet etoolbox, ale nie sądzę, że będzie to zalecane rozwiązanie.

+0

Dzięki, wygląda na to, że to może zadziałać dla moich celów. Przyjrzę się dokładniej. – crsh