Diapositives avec colonnes en Pandoc
j'aimerais avoir du code et une image côte à côte dans une diapositive de projecteur.
En LaTeX, je voudrais faire cela avec des colonnes. Je voudrais utiliser markdown dans la structure de la colonne.
begin{columns}
column{.5textwidth}
~~~~~~~~Python
>>> some python code
~~~~~~~
column{.5textwidth}
![](A_generated_image.pdf)
end{columns}
malheureusement Pandoc ne traite pas le markdown dans les instructions BEGIN{columns} et end{columns}. Est-il un moyen de contourner cela?
- Existe-t-il un moyen d'utiliser markdown dans le LaTeX inlined?
- y a-t-il une solution pure markdown?
5 réponses
Le problème est que pandoc
ignore markdown si elle trouve un \begin{}
. Une alternative est d'éditer le modèle de beamer et d'ajouter ce qui suit:
\newcommand{\columnsbegin}{\begin{columns}}
\newcommand{\columnsend}{\end{columns}}
et l'écrire comme ceci:
\columnsbegin
\column{.5\textwidth}
~~~~~~~~Python
>>> some python code
~~~~~~~
\column{.5\textwidth}
![](A_generated_image.pdf)
\columnsend
j'espère toujours valable. J'ai fait un Pandoc filter en Python pour mettre des colonnes facilement, de sorte que vous pouvez écrire vos présentations de cette façon:
# 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]
que le filtre convertira chaque markup en \begin{columns} et \column{.5\textwidth}, donc, le document ci-dessus tournera en
\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}
le filtre de code est ici
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)
si vous n'utilisez jamais de filtre pandoc, sauvegardez simplement le filtre à le même emplacement de document que columnfilter.py
(ou autre nom que vous voulez) et lancer
pandoc -t beamer --filter columnfilter.py yourDocument.mkd
Et profitez-en!
les versions Actuelles de pandoc (c'est à dire, pandoc 2.0 et versions ultérieures) prend en charge clôturé divs . Les divs spécialement nommés sont transformés en colonnes lorsqu'ils ciblent un format de diapositives:
# This slide has columns
::: columns
:::: column
left
::::
:::: column
right
::::
:::
Pandoc traduit ceci en code de beamer en LaTeX:
\begin{frame}{This slide has columns}
\protect\hypertarget{this-slide-has-columns}{}
\begin{columns}[T]
\begin{column}{0.48\textwidth}
left
\end{column}
\begin{column}{0.48\textwidth}
right
\end{column}
\end{columns}
\end{frame}
c'est simple et a l'avantage supplémentaire de donner des résultats similaires en ciblant d'autres formats de présentation comme reveal.js.
vous pouvez utiliser FletcherPenney MultiMarkdown qui peut traiter markdown en LaTeX / Beamer. Par rapport au Pandoc, MultiMarkdown a moins de fonctionnalités. Cependant, surtout lorsque vous travaillez avec LaTeX, cela a l'avantage que vous pouvez intégrer le code LaTeX directement dans le Markdown dans les commentaires HTML.
votre code ressemblerait à ceci:
<!-- \begin{columns} -->
<!-- \column{.5\textwidth} -->
>>> some python code
<!-- \column{.5\textwidth} -->
![](A_generated_image.pdf)
<!-- \end{columns} -->
pour moi Cette solution fonctionne très bien. Avec un bon éditeur (par exemple Scrivener, texte Sublime) vous pouvez écrire le code latex, sans tous les commentaires et trouver/remplacer après l'édition. De plus, le support de métadonnées dans Multimarkdown est beaucoup plus flexible, de sorte qu'il est plus facile de personnaliser les présentations.
entre-temps, j'espère que L'équipe du Pandoc apportera une solution à ce problème. Je pense qu'il y a des utilisateurs qui aimeraient intégrer de petites particules de code LaTex dans leurs documents markdown sans les avoir converties/échappées.
Vous pouvez utiliser MultiMarkDown commentaires ( "" ) avec Pandoc lorsque vous enfermez la commande Pandoc dans laquelle vous transformez votre markdown en LaTeX avec deux commandes sed.
lors de la première exécution sed, vous changez les commentaires MultiMarkDown en"\verb+AAAAAAALaTeX-StuffZZZZZZ+". Puis vous transformez en LaTeX avec Pandoc comme d'habitude, tout à l'intérieur "\verb+AAAAAAALaTeX-StuffZZZZZZZ+" est laissé seul. Puis vous exécutez sed sur le fichier TeX et supprimez le "\verb+AAAAAAA " et "ZZZZZZ+" dévoilant votre code LaTeX.
la première ligne de commande sed avant la transformation Pandoc pourrait ressembler à ceci:
sed -E -e "s/<\!--(.+)--\>/\\verb\+AAAAAAAZZZZZZZ\+/g " \
source.md > source.i.md
puis utilisez Pandoc sur la source.I. md comme d'habitude pour créer source.tex. Deuxième course sed comme ceci:
sed -E -e "s/\\verb\+AAAAAAA(.+)ZZZZZZZ\+//g" -i "" source.tex
j'ai tout automatisé dans un Makefile de sorte que je puisse faire plus de changements par exemple aux définitions de table dans une étape. À première vue, cette approche fonctionne très bien (testé sur les définitions de colonne avec la classe beamer).
avec ces petits scripts sed, vous pouvez utiliser toutes les bonnes choses de Pandoc. Vous n'avez besoin que de MMD-comment les commandes Tex et LaTeX qui se sont échappées ou qui contiennent de plus grandes parties de votre Markdown.