Browse Source

tout.py et genauteur.py ok

Thierry Dumont 1 tháng trước cách đây
mục cha
commit
08cafb3499
6 tập tin đã thay đổi với 519 bổ sung60 xóa
  1. 204 0
      extr.py
  2. 50 0
      genauteur.py
  3. 35 0
      memmod.py
  4. 57 0
      retpl.py
  5. 113 0
      tout.py
  6. 60 60
      tpl.tex

+ 204 - 0
extr.py

@@ -0,0 +1,204 @@
+#!/home/moi/ProtoMemoires/venv/bin/python
+
+# de docx ou odt ver LaTeX
+#
+import sys,pypandoc,os,re,subprocess,yaml,hashlib
+#---------------------------------------------
+sys.path.append(f"{os.getcwd()}/..")
+from memmod import *
+#----
+def fancyshort(s,t):
+    # restreindre le texte de fancyhead (s est le nom, t le titre,
+    # qu'il faut éventuellement racourcir pour qu'il tienne sur une seule
+    # ligne.
+    #
+    # s (le nom de l'orateur, par exemple) est toujours affiché.
+    # t est éventuellement raccourci.
+    #
+    limit =75 #taille max en caratères
+    if len(s+t)<limit:
+        return s,t
+    else:
+        tl=t.split()
+        tl.pop()
+        while sum(len(x) for x in tl)>limit:
+            tl.pop()
+        return  s, " ".join(tl)+"\\ldots"# pointillés à la fin.
+
+def star_sec(l):
+    # \section est transformée en \section* et on ne garde comme argument
+    # que ce qui est nécessaire.
+    it=iter(L)
+    ret=[]
+    passed= False
+    for x in it:
+        if "begin{document" in x:
+            passed= True
+        if passed and "section[" in x:
+            s=x
+            while "label" not in x:
+                x=next(it)
+                s=s+" "+x
+
+            if not "}" in s:
+                x=next(it)
+                s=s+x
+            k=s.find("]")
+            r=(s[:k]+"}").replace("[","*{")+" "
+            ret.append(r)
+            ret.append("\n")
+        else:
+            ret.append(x)
+    return ret
+#---------------------------------------------------------------------
+# ligne de command [nocompile]
+#
+# nocompile pour ne pas compiler
+#
+#
+compile= not  "nocompile" in sys.argv
+#-----------------------------------------------------------------------
+# Construire le titre à partir du fichier data.yml.
+#-----------------------------------------------------------------------
+#---clés du fichier data.yml
+data_yml_mandatory_keys=['fichier', 'date',  'auteur', 'titre']
+data_yml_order=['date','type','auteur','statut','titre']
+#
+with open("data.yml") as f:
+    lt=yaml.safe_load(f)
+    print("data_yml lu")
+# on vérifie que le fichier "data.yml" est correct:
+for x in data_yml_mandatory_keys: #vérifier la présence des clés obligatoires
+    if not x in lt.keys():
+        raise Exception(f"\n\n Il manque la clé  {x} dans data.yml\n\n")
+# si statut est défini, type doit l'être aussi:
+if "statut" in lt.keys(): # membre t=itulaire, correspondant, d'honneur...
+    if "type" not in lt.keys():
+        raise Exception(f"\n\n statut est défini, mais pas type\n\n")
+    lt['statut']=", "+lt["statut"]
+else: # si statut n'est pas défini, on le définit  à " " et type à "Conférence".
+    lt["statut"]=" "
+    if "type" not in lt.keys():
+        lt["type"]="Conférence"
+print("data.yml analysé")
+# ---les paramètres:
+auteur= lt["auteur"]
+titre= lt["titre"]
+label=dolabel(auteur,titre)
+# biblio ?
+has_bib= "biblio"in lt.keys()
+if has_bib:
+    if len(lt["biblio"].split()) ==2:
+        bibfile=  lt["biblio"].split()[0]
+        citeall = lt["biblio"].split()[1] == "citeall"
+    else:
+        bibfile= lt["biblio"]
+        citeall=False
+#-------------------------------------------------
+#
+# le fichier (docx, odt) qu'on va traiter:
+#
+fich=lt["fichier"].strip()
+#
+# fabriquer le titre à partir des données yml
+#
+titre_elements="}{".join([lt[x].replace("\n","") for x in data_yml_order])
+s,t=fancyshort(lt['auteur'],lt['titre'])
+titre_elements= titre_elements+"}{"+t
+le_titre= f"\\titre{{{titre_elements}}}\n"
+
+
+#--------------------------------------------------------------------
+template="../tpl.tex" # le template
+#---------------------------------------------------------------------
+exten=fich.split(".")[-1]
+#
+# Traitement du fichier source
+# ---------------------------
+if exten=="docx" or exten=="odt":
+    futurTex= fich.replace(exten,"tex")
+else:
+    s=f"\n{fich} : extension incorrecte"
+    raise Exception(s)
+
+#répertoire pour les images
+images= fich.split(".")[0]+"-media"
+print("Répertoire des images : ",images)
+if not os.path.isdir(images):
+    os.mkdir(images)
+#
+# conversion en latex
+#
+#extra_args= ["-s",f"--template={template}",f"--extract-media={images}"]
+extra_args= ["-s",f"--template={template}",f"--extract-media={images}",
+             f"--lof=true"]
+L = pypandoc.convert_file(fich, 'tex',
+                          extra_args=extra_args).splitlines()
+
+#-----------------------------------------------------------------------
+
+# section -> section*
+rechsec= r"section[{\[]"
+rechsecc=re.compile(rechsec)
+
+# pour modifier le latex en changeant le chemin vers les images.
+if exten=="docx":
+    rechgra=r"includegraphics\[.*\]{media.*}"
+    repPath=("media",f"{images}/word/media")
+elif exten=="odt":
+    rechgra=r"includegraphics\[.*\]{Pictures.*}"
+    repPath=("Pictures",f"{images}/Pictures")
+    
+rechgrac=re.compile(rechgra)
+#
+# On crée le fichier LaTex
+#
+with open(futurTex,"w") as f:
+    L1=star_sec(L)
+    
+    rp0,rp1= repPath
+    for l in L1:
+        if has_bib and "addbibresource{}" in l:
+            #bibfile=lt['biblio']
+            l=l.replace("{","{"+bibfile)
+        while (q:=rechgrac.search(l)) != None:
+            l=l.replace(rp0,rp1)
+        l=treatline(l)
+        
+        #
+        if "@@fin" in l:
+            
+            if has_bib:
+                #f.write("\\begin{center}\\textbf{Bibliographie}\\end{center}\n")
+                #f.write("\\citeall[\\fullcite]\n")
+                f.write("\\section*{Bibliographie}")
+                if citeall:
+                    f.write(nocite_all(bibfile)+"\n")
+                f.write("\\printbibliography[heading=none]\n")
+            f.write("\\FloatBarrier\n")
+            f.write("\\end{refsection}\n")
+        f.write(l)
+           
+        f.write("\n")
+
+        
+        if "@@debut" in l:
+            f.write("\\begin{refsection}\n")
+            f.write("\\fancyhead{}\n")
+            f.write("\\fancyhead[CE]{Mémoires: 2\\ieme{} partie}\n")
+            #f.write(f"\\fancyhead[CO]{{{s}  {t}}}\n")
+            f.write(le_titre)
+            f.write(f"\\label{{{label}}}\n")
+        
+#
+#---fin d'éciture du fichier tex
+#
+# lualatex, 2 fois si pas de bib, 3 fois + biber sinon:
+#
+if compile:
+    subprocess.run(["/usr/bin/lualatex", futurTex])
+    if has_bib:
+        subprocess.run(["/usr/bin/biber", futurTex.replace(".tex","")])
+        subprocess.run(["/usr/bin/lualatex", futurTex])
+    subprocess.run(["/usr/bin/lualatex", futurTex])
+#--- fin

+ 50 - 0
genauteur.py

@@ -0,0 +1,50 @@
+import yaml,sys,os
+#
+# Fabriquer la table des auteurs.
+#
+excludedirs={"ChapitresEtParties","Academie"}
+#---------------------------------------------
+
+sys.path.append(f"{os.getcwd()}/..")
+from memmod import *
+#
+with open("all_texts") as f:
+    L= f.readlines()
+D={}
+for x in L:
+    d0=x.split('/')[0]
+    
+    if not d0 in excludedirs and d0[0]!="#":
+        d= f"../Sources/Courante/{d0}/data.yml"
+        with open(d) as f:
+            lt=yaml.safe_load(f)
+            auteur= lt["auteur"]
+            titre= lt["titre"]
+            D.setdefault(auteur,[]).append(titre)
+            print(auteur,titre)
+# On a un dictionnaire D: auteur -> liste des textes.
+# fabriquer le LaTeX.
+with open("refauteur.tex","w") as f:
+    s="\\begin{center} \\Large{\\bfseries INDEX DES AUTEURS}\\end{center}\n"
+    f.write(s)
+    f.write("\n")
+    # trier les clés pas noms (pas forcément exact)
+    DK=sorted([x for x in D.keys()], key=lambda x: s.split()[-1])
+    for k in DK:
+        print(k,len(D[k]))
+        if len(D[k])==1:
+            x=D[k][0]
+            cle= dolabel(k,x)
+            print("Clé:",k,"/",x,cle,"\n")
+            s= f"{k}, \\textit{{{x}}} \\dotfill \\pageref{{{cle}}}\n\n"
+            f.write(s)
+        else:
+            f.write(f"{k}:\n\n")
+            for x in D[k]:
+                space="\\hspace*{0.75cm}"
+                cle= dolabel(k,x)
+                print("Clé:",k,"/",x,cle,"\n")
+                s= f"{space}\\textit{{{x}}} \\dotfill \\pageref{{{cle}}}\n\n"
+                f.write(s)
+
+        f.write("\n")

+ 35 - 0
memmod.py

@@ -0,0 +1,35 @@
+import hashlib
+def dolabel(k,t):
+    # faire une étiquette "unique" à partir de deux chaines de caratères k et t.
+    s=(k+t).encode("UTF-8")
+    return hashlib.sha1(s).hexdigest()
+
+# attention, l'ordre est important !
+tabler={"textsuperscript{e}":"ieme{}",
+        "\\begin{quote}":"",
+        "\\end{quote}":"",
+        "subsection{":"subsection*{",
+        "\\textquotesingle ":"'",
+        "\\textquotesingle":"",
+        "~":"",
+        }
+def treatline(l):
+    # Les substitutions éventuelles à faire sur une ligne
+    for x,y in tabler.items():
+        l=l.replace(x,y)
+
+    return l
+def nocite_all(fich):
+    # Créeer un nocite{...} avec toutes les entrées du fichier fich
+    # (un fichier .bib).
+    with open(fich) as f:
+        L=f.readlines()
+    ret="\nocite{"
+    all=[]
+    for x in L:
+        if "@" in x:
+            d=x.find("{")+1
+            e=x.find(",")
+            all.append(x[d:e])
+    return f"\\nocite{{{','.join(all)}}}"
+                       

+ 57 - 0
retpl.py

@@ -0,0 +1,57 @@
+#!/home/moi/ProtoMemoires/venv/bin/python
+#
+# Moderniser un fichier source.
+#
+import yaml
+def dolabel(k,t):
+    return str(hash(k+t)).replace("-","m")
+ft=input("fichier .tex ?")
+#
+# fichier de config:
+#
+with open("data.yml") as f:
+    lt=yaml.safe_load(f)
+has_bib= "biblio"in lt.keys()
+
+#--------------------------------------------------------------------
+template="../tpl.tex" # le template
+#-----------------------------------------------------------------
+with open(template) as f:
+    Ltmpl=f.readlines()
+#
+# ne garder du template que le début
+# et mentionner les ressouces pour biblatex
+#
+Lall=[]
+for l in Ltmpl:
+    if "%@@debut" in l:
+        break
+    elif has_bib and  "addbibresource" in l:
+        # ajouter le chemin vers le fichier bib
+        Lall.append(f"\\addbibresource{{{lt['biblio']}}}\n")
+                
+    Lall.append(l)
+#
+with open(ft) as f:
+    LL=f.readlines()
+    # insérer ce qui entre %@@debut et "%@@fin":
+    start= False
+    for x in LL:
+        if "@@debut" in x:
+            start= True
+            print("--> start")
+        if "@@fin" in x:
+            break
+        if start and "newcounter{none}" not in x:
+            Lall.append(x)
+
+fr=input("fichier à construire ?")
+with open(fr,"w") as f:
+    for x in Lall[:-1]:
+        f.write(x)
+    f.write("\\FloatBarrier\n")
+    f.write("%@@fin\n")
+    f.write("\\tableofcontents\n")
+    f.write("\\end{document}\n")
+#---
+print("fin\n")

+ 113 - 0
tout.py

@@ -0,0 +1,113 @@
+#!/home/moi/ProtoMemoires/venv/bin/python
+import glob,subprocess
+#-------------------------------------------            
+def addpath(x,ajout):
+    # Pour transformer les chemins vers les images
+    #if "includegraphics" in x:
+    if "input" in x:
+        return x.replace("{",ajout)
+    else:
+        return x
+#
+# Récupérer la liste des textes à introduire
+#
+with open("all_texts") as f:
+    lf0=  f.readlines()
+    lf=[]
+    for x in lf0:
+        if x[0]!= "#":
+            xs=x.split()
+            if len(xs) ==1:
+                lf.append((xs[0],))
+            else:
+                lf.append((xs[0],xs[1]))
+# faire la liste des *.bib (éventuels):
+forbiblatex={}
+for f in lf:
+    forbiblatex[f]=",".join([x for x
+                             in glob.glob(f"../Sources/Courante/{f[0].split("/")[0]}/*.bib")])
+allbibfiles=[forbiblatex[k] for k in forbiblatex.keys()  if forbiblatex[k]!=""]
+
+print("\nFichiers bib",allbibfiles,"\n")
+
+#
+# Récuperer le template
+#
+templat= "../tpl.tex"
+#
+with open(templat) as f:
+    Ltmpl=f.readlines()
+
+#
+# ne garder du template que le début
+# en ajoutant les ressouces pour biblatex
+#
+Lall=[]
+for l in Ltmpl:
+    if "%@@debut" in l:
+        break
+    else:
+        if "addbibresource" in l:
+            # ajouter les chemins vers les fichiers bib
+            # 
+            for x in allbibfiles:
+                Lall.append(f"\\addbibresource{{{x}}}\n")
+            T=[f'{{../Sources/Courante/{x[0].split("/")[0]}}}' for x in lf]
+            T=f"\\graphicspath{{ {''.join(T)} }}\n"
+            Lall.append(T)
+        Lall.append(l)
+
+#
+# parcourir les fichiers à assembler:
+#
+for l in lf:
+    do_eject= len(l) == 1 or (len(l)>1 and not "noeject" in l[1])
+    do_vfill= len(l) == 1 or (len(l)>1 and not "novfill" in l[1])
+    lok="../Sources/Courante/"+l[0].replace("\n","")
+    print("On traite :",lok)
+    with open(lok) as g:
+        LL=g.readlines()
+    # insérer ce qui entre %@@debut et "%@@fin":
+    start= False
+    Z= []
+    for x in LL:
+        if "@@debut" in x:
+            start= True
+            print("--> start")
+        
+        if start:
+            Z.append(x)
+            if "@@fin" in x:
+                break
+            
+    print("--> nl:",len(Z))
+    # graphiques: modifier les chemins:
+    ajout="{../Sources/Courante/"+l[0].split("/")[0]+"/"
+    #ajout=""
+    
+    Lall+=[addpath(x,ajout) for x in Z if not "newcounter" in x]
+    
+    if do_vfill:
+        #Lall.append("\\vfill\n")
+        pass
+    if do_eject:
+        #Lall.append("\\eject\n")
+        Lall.append("\\newpage\n")
+    print("<-- ok\n")
+#
+# sauver le resultat....
+with open("final.tex","w") as f:
+    for x in Lall[:-1]:
+        f.write(x)
+    f.write("\\newpage\n")
+    f.write("\\thispagestyle{empty}\n")
+    f.write("\\fancyhead{}\n")
+    f.write("\\input{refauteur.tex}\n")
+    f.write("\\tableofcontents\n")
+    f.write("\\end{document}\n")
+
+
+print("Nombre d'entrées par auteur :")
+with open("../genauteur.py") as f:
+    exec(f.read())
+print("-fin-\n")

+ 60 - 60
tpl.tex

@@ -3,39 +3,39 @@
 \geometry{
 total={130mm,212mm},
   }
-%\usepackage[showframe,b5paper]{geometry}
+  % \usepackage[showframe,b5paper]{geometry}
+  
 %
-%\setcounter{secnumdepth}{-4}
-%\setcounter{tocdepth}{0}
 \usepackage{mfirstuc}% mettre en majuscule une 1re letter
 %
+\usepackage{manyfoot}
 %\usepackage[fontsize=10]{fontsize}
 %
 %\sepackage[cam]{crop}
 %\usepackage[cross,b5,center]{crop}
 %\usepackage[showframe,b5paper,verbose]{geometry}
+
 \counterwithin{figure}{section}
 %\usepackage{fontspec}
-%\usepackage{lmodern}
+%
 \usepackage{ebgaramond}
 \usepackage{unicode-math}
 \setmathfont{Garamond-Math}
-
+ 
 \usepackage[export]{adjustbox}
-\usepackage{wrapfig}
+\usepackage{wrapfig,subcaption}
+\usepackage{multicol}
 
 \usepackage[french]{babel}
 %\frenchsetup{og=«, fg=»} % inutile avec lualatex
 
 \usepackage{textcomp}% des symboles?
 \usepackage{epigraph,csquotes,verse}
-
 \usepackage{graphicx}
 \usepackage{layout}
-
 %
 \usepackage{titlesec}
-\usepackage{chngcntr}
+\usepackage{chngcntr}%bidouiller les compteurs
 \usepackage{upquote}
 \usepackage{microtype}
 \usepackage{xcolor}
@@ -44,88 +44,88 @@ total={130mm,212mm},
 \usepackage{bookmark}
 \usepackage{array}
 \usepackage{calc}
-
-%\usepackage{footnotehyper}
-%\usepackage{footnote}
 \usepackage{soul}
 \usepackage{multirow}
 \usepackage{placeins}% pour avoir \FloatBarrier
-%
-\usepackage{fancyhdr}
-
+\usepackage{etoolbox}
 %
 \usepackage[style=authoryear]{biblatex}
-\usepackage{citeall}
+%\usepackage{citeall}
 \addbibresource{}
 %
+\usepackage{fancyhdr}
+\usepackage{lipsum}
+%
+%\usepackage[hydelinks]{hyperref}
+\usepackage[para]{footmisc}
+%
 \providecommand{\tightlist}{%
 	   \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
 
-% \renewcommand{\thesection}{}
-% \renewcommand{\thesubsection}{\arabic{section}.\arabic{subsection}}
-% \makeatletter
-% \def\@seccntformat#1{\csname #1ignore\expandafter\endcsname\csname the#1\endcsname\quad}
-% \let\sectionignore\@gobbletwo
-% \let\latex@numberline\numberline
-% \def\numberline#1{\if\relax#1\relax\else\latex@numberline{#1}\fi}
-% \makeatother
-
 \newcommand{\mysection}[2]{\section*{ #2}}
 
-\newcommand{\titre}[5]{% date / type /auteur/ membre/ titre
+% Pour ajouter du texte aux \part. ! devient insdispensabem aux \part%
+\makeatletter
+\newcommand{\extraPartText}[1]{\def\@extraPartText{#1}}
+\pretocmd{\@endpart}{\vspace{5.5cm}\begingroup\@extraPartText\par\endgroup\let\@extraPartText\relax}{}{}
+\makeatother
+
+\newcommand{\titre}[6]{% date / type /auteur/ membre/ titre /titre
+  % (éventuellement raccourci.
   {\raggedright{\textsl{\bfseries\large \capitalisewords{#1}}}}\\%
-  {\raggedright{\bfseries\large \capitalisewords{{#2}} de #3} \textsl{#4}}%
-   \addcontentsline{toc}{section}{{\bfseries #1.} \capitalisewords{#2}
-     de #3, #4.\\\textsl{#5}}%
+  {\raggedright{\bfseries\large \capitalisewords{{#2}} de #3 } \textsl{#4}}%
+  \addcontentsline{toc}{section}{{\bfseries #1.}
+    \capitalisewords{#2}~%
+     ~de #3, #4.\\%
+   \textsl{#5}}%
   \vspace*{24pt}%
   \begin{center}{\Large\bfseries #5}\end{center}%
   \vspace*{5mm}%
   \fancyhead{}%
   \fancyhead[CE]{Mémoires: 2\ieme{} partie}%
-  \fancyhead[CO]{#3. #5}%
-}
-
-\newcommand{\epigraphnorule}[1]{%
-\vspace*{\beforeepigraphskip}%
-\begin{flushright}%
-  \begin{minipage}{\epigraphwidth}\raggedright\small
-#1%
-\end{minipage}%
-\end{flushright}%
-\vspace*{\afterepigraphskip}%
+  \fancyhead[CO]{#3. #6}%
+  \setcounter{footnote}{0}%
+  \pagestyle{fancy}%
+  \thispagestyle{empty}% pas de haut de page sur la 1ere page
 }
-\renewcommand{\thefigure}{\arabic{figure}}
-% \makeatletter
 
-% \renewcommand\section{\@startsection {section}{1}{\z@}%
-%                                    {-3.5ex \@plus -1ex \@minus -.2ex}%
-%                                    {-1em}%
-%                                    {\normalfont\large\scshape}}
+% pour avoir plusieurs références à la même footnote
+\makeatletter
+\newcommand\footnoteref[1]{\protected@xdef\@thefnmark{\ref{#1}}\@footnotemark}
+\makeatother
 
-% \makeatother
+\newcommand{\epigraphnorule}[1]{% épigraphe, sans ligne séparatrice.
+  \newlength{\oldepirule}%
+  \setlength{\oldepirule}{\epigraphrule}%
+  \setlength{\epigraphrule}{0mm}%
+  \epigraph{#1}{}%
+  \setlength{\epigraphrule}{\oldepirule}%
+  }
+  
+\renewcommand{\thefigure}{\arabic{figure}}
 %
 \titleformat{\section}[block]{\large\bfseries}{}{100em}{}
 \titleformat{\subsection}{\normalsize\bfseries}{}{}{}
 %
-% \makeatletter
-% \titleformat{\part}[display]
-%   {\Huge\scshape\filright}
-%   {\partname~}
-%   {20pt}
-%   \makeatother
 %
-\begin{document}%\layout
+% Pour avoir des displayquote poussés à droite:
+%
 
-%\pagestyle{plain}
+\newenvironment{specialquote}{\begin{list}{}
+{\setlength{\rightmargin}{0pt}}\item[]}
+{\end{list}}
+\SetBlockEnvironment{specialquote}
+%
+\begin{document}%\layout
+%
+\setcounter{footnote}{0}
 \pagestyle{fancy}
 \newcounter{none}
-%\fancyhead{} 
-%\fancyhead[RO,LE]{\textbf{blabla}}
+\fancyhead{}
+\fancyfoot{}
+\fancyfoot[LE,RO]{\thepage}
 %@@debut
-% \maketitle
-
   $body$
-  
 %@@fin
 \tableofcontents
 \end{document}