• [^] # Re: Indispensable.

    Posté par . En réponse au journal Le retour de pacman en beamer. Évalué à 2.

    Bon je ne sais pas trop comment on peut faire cela avec Beamer/LaTeX, mais le hack dégueu c'est de le faire dans un script python à exécuter dans le Makefile qui compile la présentation...

    1. Générer une liste de booléens qui décrit si chaque frame suit directement une section
    2. Ajouter une condition à tester dans la boucle qui définit la taille du cercle correspondant dans pacman.sty.

    1.

    #!/usr/bin/python
    if __name__ == "__main__":
     # 2 solutions équivalentes pour le faire:
     # a) Pur Python, une boucle: (je plussoie celui qui réécrit ça de manière plus pythonesque)
     arr = []
     isnew = False
     with open('slides.tex', 'r') as f:
     for line in f:
     if r"\section" in line:
     isnew = True
     if r'begin{frame}' in line:
     arr.append(isnew)
     isnew = False
     print "\def\newsec{{",
     for ii in arr: print "%d," % int(ii),
     print "0}}"
     # b) Idem, mais avec NumPy
     with open('slides.tex', 'r') as f:
     data = f.readlines()
     sections = [r"\section" in line for line in data]
     frames = [r"begin{frame}" in line for line in data]
     cframes = np.cumsum(frames) # Cumulative frame position
     secpos = np.where(sections) # positions of the sections
     frame_at_sec = cframes[secpos] # frame number at section positions
     sec_lists = np.zeros(cframes[-1])
     sec_lists[frame_at_sec] = 1
     print "\def\newsec{{",
     for ii in sec_lists: print "%d," % int(ii),
     print "0}}"

    (je suis sûr qu'il existe une regex pour faire pareil...)

    1. Insérer la sortie du code précédent quelque part dans le fichier tex (sed est notre ami, sinon le code Python pourrait le faire), et dans le pacman.sty, remplacer:
    \pgfmathparse{mod(\x,10) ? ".2mm" : ".4mm"}

    par:

    \pgfmathparse{ {\newsec[\x-A]}>0 ? ".4mm" : ".2mm"}

    Ou l'on remplace A par un offset (1 ou 2, selon la config du document).