2013-02-28 29 views
19

Chciałbym mieć kod i obraz obok siebie w slajdzie z programu Beamer.Slajdy z kolumnami w Pandoc

W LaTeX zrobiłbym to z kolumnami. Chciałbym użyć markdown w strukturze kolumny.

\begin{columns} 
\column{.5\textwidth} 

~~~~~~~~Python 
>>> some python code 
~~~~~~~ 

\column{.5\textwidth} 

![](A_generated_image.pdf) 

\end{columns} 

Niestety Pandoc nie przetwarza przecen w instrukcjach \ begin {columns} i \ end {columns}. Czy istnieje sposób obejścia tego?

  • Czy istnieje sposób na wykorzystanie przeceny w ramach wbudowanego LaTeXa?
  • Czy istnieje czyste rozwiązanie obniżania cen?
+0

Możesz być zainteresowany w tym ostatnim pytaniem na tex.sx: http: // tex .stackexchange.com/questions/101717/konwersja-markdown-to-latex-in-latex/101731. –

+0

Czy próbowałeś wstawić figurkę do stołu? – Jakob

Odpowiedz

2

Można użyć narzędzia FletcherPenney MultiMarkdown, które może przetworzyć proces obniżania wartości do LaTeX/Beamer. W porównaniu do Pandoc, MultiMarkdown ma niewiele funkcji. Jednak szczególnie przy pracy z LaTeX ma tę zaletę, że możesz osadzić kod LaTeX bezpośrednio w komentarzach HTML w Markdownie.

Twój kod będzie wyglądać następująco:

<!-- \begin{columns} --> 
<!-- \column{.5\textwidth} --> 

     >>> some python code 


<!-- \column{.5\textwidth} --> 

![](A_generated_image.pdf) 

<!-- \end{columns} --> 

Dla mnie to rozwiązanie działa dobrze. Z dobrym edytorem (np. Scrivener, Sublime Text) możesz napisać kod lateksu bez wszystkich komentarzy i znaleźć/zastąpić je po edycji. Ponadto obsługa metadanych w Multimarkdown jest znacznie bardziej elastyczna, dzięki czemu łatwiej jest dostosowywać prezentacje.

W międzyczasie mam nadzieję, że zespół Pandoc dostarczy rozwiązanie tego problemu. Sądzę, że niektórzy użytkownicy chcieliby osadzić małe fragmenty kodu LaTex w swoich dokumentach skoku, bez konieczności ich konwertowania/ucieczki.

2

Możesz użyć komentarzy MultiMarkDown ("<! - Twój kod LaTeX wewnątrz ->") z Pandoc po zamknięciu polecenia Pandoc, w którym przekształcasz swoje obniżenie na LaTeX za pomocą dwóch poleceń sed.

W pierwszym biegu sed zmieniono komentarze MultiMarkDown na "\ verb + AAAAAAALaTeX-StuffZZZZZZ +". Potem jak zwykle przekształcasz się w LaTeX z Pandoc, wszystko wewnątrz "\ verb + AAAAAAALaTeX-StuffZZZZZZZ +" pozostaje samo. Następnie uruchom sed na pliku TeX-a i usuń "\ verb + AAAAAAA" i "ZZZZZZ +" rozwijając kod LaTeX.

Pierwszy wiersz polecenia sed przed transformacja Pandoc mógłby wyglądać następująco:

sed -E -e "s/<\\!--(.+)--\\>/\\\\verb\+AAAAAAA\1ZZZZZZZ\+/g " \ 
    source.md > source.i.md 

Następnie użyj Pandoc na source.i.md jak zwykle do tworzenia source.tex. Drugi sed działa w następujący sposób:

sed -E -e "s/\\\\verb\+AAAAAAA(.+)ZZZZZZZ\+/\1/g" -i "" source.tex 

Zautomatyzowałem wszystko w pliku Makefile, dzięki czemu mogę wprowadzić więcej zmian, np. do tabel definicji w jednym kroku. Na pierwszy rzut oka to podejście działa dobrze (testowano je na definicjach kolumn z klasą beamer).

Dzięki tym małym skryptom sed możesz używać wszystkich miłych rzeczy od Pandoc. Potrzebujesz tylko do mmd-comment tych poleceń TeX i LaTeX, które stają się albo uciekłymi, albo zamknij większe części Twojego Markdown.

15

Mam nadzieję, że nadal cenne.Zrobiłem Pandoc filter w Pythonie umieścić kolumny łatwo, więc można napisać swoje prezentacje w ten sposób:

# Hello World 

[columns] 

[column=0.5] 

~~~python 
    if __name__ == "__main__": 
     print "Hello World" 
~~~ 

[column=0.5] 

This is how a "Hello World" looks like in Python 

[/columns] 

że filtr zamieni każdy znaczników do \ begin {kolumn} i \ kolumnę {0,5 \} textwidth tak, dokument powyżej okaże się

\begin{frame}[fragile]{Hello} 

\begin{columns} 

\column{0.5\textwidth} 

\begin{Shaded} 
\begin{Highlighting}[] 
    \NormalTok{some python code} 
\end{Highlighting} 
\end{Shaded} 

\column{0.5\textwidth} 

Hello World 

\end{columns} 

\end{frame} 

Filtr kod jest tutaj

import pandocfilters as pf 

def latex(s): 
    return pf.RawBlock('latex', s) 

def mk_columns(k, v, f, m): 
    if k == "Para": 
     value = pf.stringify(v) 
     if value.startswith('[') and value.endswith(']'): 
      content = value[1:-1] 
      if content == "columns": 
       return latex(r'\begin{columns}') 
      elif content == "/columns": 
       return latex(r'\end{columns}') 
      elif content.startswith("column="): 
       return latex(r'\column{%s\textwidth}' % content[7:]) 

if __name__ == "__main__": 
    pf.toJSONFilter(mk_columns) 

Jeśli nigdy nie użyć filtru pandoc, wystarczy zapisać filtr do tej samej lokalizacji dokumentu jako columnfilter.py (lub inną nazwę, którą chcesz) i uruchom

I baw się dobrze!

+0

To jest naprawdę miłe, dzięki! – naught101

+1

Byłoby miło umieścić to w sensie (lub podobnym miejscu), w którym użytkownik może zgłosić problem. – Dilawar

17

Problem polega na tym, że pandoc ignoruje przecenę, jeśli znajdzie \begin{}. Alternatywą jest do edycji szablonu beamer i dodać następujące:

\newcommand{\columnsbegin}{\begin{columns}} 
\newcommand{\columnsend}{\end{columns}} 

I napisać to tak:

\columnsbegin 
\column{.5\textwidth} 

~~~~~~~~Python 
>>> some python code 
~~~~~~~ 

\column{.5\textwidth} 

![](A_generated_image.pdf) 

\columnsend