Browse code

Automatización para JSON, EPUB, MOBI y PDF

NikaZhenya authored on 07/04/2018 18:07:50
Showing 5 changed files
... ...
@@ -1 +1,2 @@
1 1
 .DS_Store
2
+tmp/
2 3
new file mode 100644
... ...
@@ -0,0 +1,335 @@
0
+#!/usr/bin/env ruby
1
+# encoding: UTF-8
2
+# coding: UTF-8
3
+
4
+require 'fileutils'
5
+require 'json'
6
+require 'yaml'
7
+require 'roo'
8
+
9
+Encoding.default_internal = Encoding::UTF_8
10
+
11
+# Dependencias externas #
12
+# - roo (gema)
13
+# - Pecas
14
+# - pandoc
15
+# - pdflatex
16
+
17
+# Funciones #
18
+
19
+def format_date
20
+    f = $date.to_s.split(' ')[0].split('-')
21
+
22
+    def dia d
23
+        return d.to_i.to_s
24
+    end
25
+
26
+    def mes m
27
+        m = m.to_i
28
+
29
+        if    m == 1
30
+            'enero'
31
+        elsif m == 2
32
+            'febrero'
33
+        elsif m == 3
34
+            'marzo'
35
+        elsif m == 4
36
+            'abril'
37
+        elsif m == 5
38
+            'mayo'
39
+        elsif m == 6 
40
+            'junio'
41
+        elsif m == 7
42
+            'julio'
43
+        elsif m == 8
44
+            'agosto'
45
+        elsif m == 9
46
+            'septiembre'
47
+        elsif m == 10
48
+            'octubre'
49
+        elsif m == 11
50
+            'noviembre'
51
+        else  m == 12
52
+            'diciembre'
53
+        end
54
+    end
55
+
56
+    return dia(f[2]) + ' de ' + mes(f[1]) + ' del ' + f[0]
57
+end
58
+
59
+# Obtiene las rutas de los proyectos
60
+def locate project = false
61
+
62
+    # Iteración de los repositorios hermanos
63
+    Dir.glob('../*') do |repo|
64
+        # Si se busca un proyecto en específico
65
+        if project
66
+            if File.basename(repo) == project.strip
67
+                $projects.push(repo)
68
+            end
69
+        # Si se quieren todos los proyectos
70
+        else
71
+            # Se consideran proyectos si el repositorio empieza con «aml-» y no es «aml-general»
72
+            if File.basename(repo) =~ /aml-\w+/ && File.basename(repo) !~ /general/
73
+                $projects.push(repo)
74
+            end
75
+        end
76
+    end
77
+
78
+    # Aborta si no encontró ningún project
79
+    if $projects.length == 0
80
+        puts "ERROR: no se localizaron repositorios de la AML."
81
+        abort
82
+    end
83
+end
84
+
85
+# Translitera el nombre de los archivos para evitar errores
86
+def transliterar texto, oracion = true
87
+	# Elementos particulares a cambiar
88
+	elementos1 = "ñáàâäéèêëíìîïóòôöúùûü"
89
+	elementos2 = "naaaaeeeeiiiioooouuuu"
90
+	
91
+	# Pone el texto en bajas
92
+	texto = texto.downcase
93
+	
94
+	# Limita el nombre a cinco palabras
95
+    if oracion
96
+	    texto = texto.split(/\s+/)
97
+	    texto = texto[0..4].join("_")
98
+    end
99
+	
100
+	# Cambia los elementos particulares
101
+    texto = texto.tr(elementos1, elementos2)
102
+	
103
+	# Todo lo que son etiquetas viejas o nuevas de Pecas o caracteres no alfanuméricos se eliminan
104
+	return texto.gsub(/ºº\w+?ºº/,"").gsub(/--\w+?--/,"").gsub(/\W/,"")
105
+end
106
+
107
+# Convierte los archivos originales a un hash
108
+def convert_to_hash project
109
+    hash = {}
110
+    hash['owner'] = 'Academia Mexicana de la Lengua'
111
+    hash['repository'] = File.basename(project)
112
+    hash['date'] = $date
113
+
114
+    # Si es el diccionario escolar
115
+    if project == '../aml-escolar'
116
+        # Extrae el contenido
117
+        puts "Obteniendo datos del XLSX…"
118
+        xlsx = Roo::Spreadsheet.open(project + '/src/xlsx/diccionario.xlsx')
119
+
120
+        # Datos del hash
121
+        puts "Creando notación de objetos…"
122
+        hash['project'] = "Diccionario escolar"
123
+        hash['collaborators'] = ["Moreno de Alba, José G.", "Garrido, Felipe", "Mandujano Servín, Rocío"]
124
+
125
+        xlsx.sheet(0).each_with_index do |row, i|
126
+            if i == 0
127
+                hash['dictionary'] = []
128
+            else
129
+                hash['dictionary'].push({'word' => row[1], 'definition' => row[3].gsub('<html>', '').gsub('</html>', '')})
130
+            end
131
+        end
132
+    # Si es el diccionario de mexicanismos
133
+    elsif project == '../aml-mexicanismos'
134
+        def docx_extract path
135
+            # Convierte el DOCX a HTML
136
+            puts "  Obteniendo datos de «#{File.basename(path)}»…"
137
+            html_path = Dir.pwd + '/tmp/' + File.basename(path, '.docx') + '.html'
138
+            system("pandoc #{path} -o #{html_path}")
139
+
140
+            # Extrae el contenido del HTML
141
+            archivo_abierto = File.open(html_path, 'r:UTF-8')
142
+            archivo_abierto.each do |line|
143
+                $docx.push(line)
144
+            end
145
+            archivo_abierto.close
146
+
147
+            # Elimina el HTML porque ya no es necesario
148
+            FileUtils.rm_rf(html_path)
149
+        end
150
+
151
+        # Obtiene en orden alfabético cada ruta a los archivos DOCX
152
+        docx_paths = []
153
+        Dir.glob(project + '/src/docx/*.docx') do |path|
154
+            docx_paths.push(path)
155
+        end
156
+        docx_paths = docx_paths.sort_by{|s| transliterar(s, false)}
157
+
158
+        # Extrae el contenido
159
+        puts "Obteniendo datos de los DOCX…"
160
+        $docx = []
161
+        docx_paths.each do |docx_path|
162
+            docx_extract(docx_path)
163
+        end
164
+
165
+        # Datos del hash
166
+        puts "Creando notación de objetos…"
167
+        hash['project'] = "Diccionario de mexicanismos"
168
+        hash['collaborators'] = ["Company, Concepción"]
169
+        hash['dictionary'] = []
170
+
171
+        $docx.each_with_index do |line, i|
172
+            if i == 0 || i.even?
173
+                term = {'word' => line.gsub(/<.*?>/, '').strip, 'definition' => $docx[i + 1].gsub('<p>', '').gsub('</p>', '').strip}
174
+                hash['dictionary'].push(term)
175
+            end
176
+        end
177
+    end
178
+
179
+    return hash
180
+end
181
+
182
+# Crea los EPUB y el MOBI
183
+def create_epub_mobi hash, project
184
+    letter = ''
185
+    appear_ñ = false
186
+
187
+    # Crea el MD que se usará para pc-automata
188
+	archivo = File.new("tmp/#{File.basename(project)}.md", 'w:UTF-8')
189
+    archivo.puts "# #{$warning[0]} {.centrado}\n\n#{$warning[1]} {.centrado}\n\nÚltima actualización {.espacio-arriba1 .centrado}\n\n#{$date_with_format} {.centrado}"
190
+    hash['dictionary'].each do |term|
191
+
192
+        # Agrega la letra del alfabeto si inicia una nueva letra
193
+        if (transliterar(letter, false).upcase != transliterar(term['word'][0], false).upcase) || (appear_ñ == false && term['word'][0].downcase == 'ñ')
194
+            # Necesario para localizar cuándo inicia la «ñ»
195
+            if appear_ñ == false && term['word'][0].downcase == 'ñ'
196
+                letter = term['word'][0].upcase
197
+                appear_ñ = true
198
+            else
199
+                letter = transliterar(term['word'][0], false).upcase
200
+            end
201
+
202
+            archivo.puts "\n# #{letter}"
203
+        end
204
+
205
+        # Agrega la palabra y su definición
206
+        archivo.puts "\n**#{term['word']}**. #{term['definition']} {.frances}"
207
+    end
208
+	archivo.close
209
+
210
+    # Crea el EPUB, el MOBI y más (véase la documentación de pc-automata)
211
+    puts "Creando proyecto EPUB…"
212
+    system("pc-automata --directory tmp --init")
213
+    system("pc-automata -d tmp/epub-automata -y #{project}/src/yaml/meta-data.yaml -f tmp/#{File.basename(project)}.md -c #{project}/src/img/portada.jpg -i #{project}/src/img -x #{project}/src/xhtml -s #{project}/src/css/styles.css --no-analytics --no-legacy --overwrite")
214
+
215
+    # Saca los EPUB y el MOBI del proyecto, los renombra y borra el resto del proyecto
216
+    Dir.glob('tmp/epub-automata/*') do |file|
217
+        if File.extname(file) == '.epub' || File.extname(file) == '.mobi'
218
+            file_name = File.basename(project) + File.extname(file)
219
+            puts "Renombrando «#{File.basename(file)}» por «#{file_name}»…"
220
+            FileUtils.mv(file, Dir.pwd + '/tmp/' + file_name)
221
+        end
222
+    end
223
+    FileUtils.rm_rf('tmp/epub-automata')
224
+
225
+    FileUtils.rm_rf("tmp/#{File.basename(project)}.md")
226
+end
227
+
228
+# Crea el PDF
229
+def create_pdf hash, project
230
+    letter = ''
231
+    appear_ñ = false
232
+
233
+    Dir.mkdir('tmp/tex')
234
+    Dir.chdir('tmp/tex')
235
+
236
+    # Crea el MD que se usará para pc-automata
237
+	archivo = File.new("#{File.basename(project)}.md", 'w:UTF-8')
238
+    archivo.puts "\\newpage\n\n\\vspace*{5em}\n\n\\thispagestyle{empty}\n\n\\begin{center}\n\n\\textbf{#{$warning[0]}}\n\n\\vskip 1em #{$warning[1]}\n\n\\vskip 1em Última actualización\\linebreak#{$date_with_format}\n\n\\end{center}\n\n\\clearpage\n\n"
239
+    hash['dictionary'].each do |term|
240
+
241
+        def to_md text
242
+            text.gsub("□", '$\Box$').gsub(/<\s*i\s*>/, '*').gsub(/<\/\s*i\s*>/, '*').gsub(/<\s*b\s*>/, '**').gsub(/<\/\s*b\s*>/, '**')
243
+        end
244
+
245
+        # Agrega la letra del alfabeto si inicia una nueva letra
246
+        if (transliterar(letter, false).upcase != transliterar(term['word'][0], false).upcase) || (appear_ñ == false && term['word'][0].downcase == 'ñ')
247
+            # Necesario para localizar cuándo inicia la «ñ»
248
+            if appear_ñ == false && term['word'][0].downcase == 'ñ'
249
+                letter = term['word'][0].upcase
250
+                appear_ñ = true
251
+            else
252
+                letter = transliterar(term['word'][0], false).upcase
253
+            end
254
+
255
+            archivo.puts "\n\n# #{letter}"
256
+        end
257
+
258
+        # Agrega la palabra y su definición
259
+        archivo.puts "\n**#{term['word']}**. #{to_md(term['definition'])}"
260
+    end
261
+	archivo.close
262
+
263
+    # Copia la portada
264
+    FileUtils.cp('../../' + project + '/src/img/portada.jpg', '.')
265
+
266
+    # Crea el PDF
267
+    puts "Creando PDF…"
268
+    system("pandoc #{File.basename(project)}.md --pdf-engine=xelatex --template=../../src/latex/template.latex --toc -V lang:es -V documentclass:book -V papersize:a5 -V classoption:openany -V geometry:margin=1in -V title:\"#{hash['project']}\" -V author:\"Academia Mexicana de la Lengua\" -o #{File.basename(project)}.tex")
269
+    system("pdflatex -synctex=1 -interaction=batchmode #{File.basename(project)}.tex")
270
+    system("pdflatex -synctex=1 -interaction=batchmode #{File.basename(project)}.tex")
271
+    system("pdflatex -synctex=1 -interaction=batchmode #{File.basename(project)}.tex")
272
+
273
+    # Saca el PDF del proyecto TeX ya que se elimina
274
+    Dir.chdir('../..')
275
+    FileUtils.mv("tmp/tex/#{File.basename(project)}.pdf", Dir.pwd + "/tmp/#{File.basename(project)}.pdf")
276
+    FileUtils.rm_rf('tmp/tex')
277
+end
278
+
279
+# Variables #
280
+
281
+$projects = []
282
+$date = Time.now
283
+$date_with_format = format_date
284
+$warning = ["Advertencia", "La edición de la presente obra solo es preliminar. Todavía falta su adaptación a las normas de publicación de la lengua española."]
285
+
286
+# Va a la carpeta del script
287
+Dir.chdir(File.dirname(__FILE__))
288
+
289
+# Localiza los proyectos
290
+if ARGF.argv.length == 0
291
+    locate
292
+else
293
+    locate(ARGF.argv[0])
294
+end
295
+
296
+# Inicia la creación de cada formato de cada proyecto
297
+$projects.each do |project|
298
+    puts "\n========================================\n\n"
299
+    puts "Iniciando automatización del repositorio «#{File.basename(project)}»…"
300
+
301
+    # Crea una carpeta temporal donde se estarán poniendo los archivos preliminares
302
+    FileUtils.rm_rf('tmp')
303
+    Dir.mkdir('tmp')
304
+
305
+    # Obtiene la información
306
+    hash = convert_to_hash(project)
307
+
308
+    # Crea los archivos EPUB y MOBI
309
+    create_epub_mobi(hash, project)
310
+
311
+    # Crea el archivo PDF
312
+    create_pdf(hash, project)
313
+
314
+    # Crea el archivo JSON
315
+    puts "Creando archivo JSON…"
316
+	archivo = File.new("tmp/#{File.basename(project)}.json", 'w:UTF-8')
317
+	archivo.puts JSON.pretty_generate(hash)
318
+	archivo.close
319
+
320
+    # Elimina los archivos previos de la carpeta «files» de cada repo
321
+    puts "Eliminando archivos previos de «#{File.basename(project)}/files»…"
322
+    Dir.glob(project + '/files/*') do |file|
323
+        FileUtils.rm_rf(file)
324
+    end
325
+
326
+    # Manda todos los archivos a la carpeta «files» de cada repo
327
+    puts "Moviendo archivos finales a «#{File.basename(project)}/files»…"
328
+    Dir.glob('tmp/*') do |file|
329
+        FileUtils.mv(file, project + '/files')
330
+    end
331
+
332
+    # Elimina la carpeta temporal
333
+    FileUtils.rm_rf('tmp')
334
+end
0 335
deleted file mode 100644
1 336
Binary files a/src/img/logo-aml.jpg and /dev/null differ
2 337
new file mode 100644
3 338
Binary files /dev/null and b/src/img/logo.png differ
4 339
new file mode 100644
... ...
@@ -0,0 +1,321 @@
0
+\documentclass[$if(fontsize)$$fontsize$,$endif$$if(lang)$$babel-lang$,$endif$$if(papersize)$$papersize$paper,$endif$$for(classoption)$$classoption$$sep$,$endfor$]{$documentclass$}
1
+$if(beamerarticle)$
2
+\usepackage{beamerarticle} % needs to be loaded first
3
+$endif$
4
+$if(fontfamily)$
5
+\usepackage[$for(fontfamilyoptions)$$fontfamilyoptions$$sep$,$endfor$]{$fontfamily$}
6
+$else$
7
+\usepackage{lmodern}
8
+$endif$
9
+$if(linestretch)$
10
+\usepackage{setspace}
11
+\setstretch{$linestretch$}
12
+$endif$
13
+\usepackage{amssymb,amsmath}
14
+\usepackage{ifxetex,ifluatex}
15
+\usepackage{fixltx2e} % provides \textsubscript
16
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
17
+  \usepackage[$if(fontenc)$$fontenc$$else$T1$endif$]{fontenc}
18
+  \usepackage[utf8]{inputenc}
19
+$if(euro)$
20
+  \usepackage{eurosym}
21
+$endif$
22
+\else % if luatex or xelatex
23
+  \ifxetex
24
+    \usepackage{mathspec}
25
+  \else
26
+    \usepackage{fontspec}
27
+  \fi
28
+  \defaultfontfeatures{Ligatures=TeX,Scale=MatchLowercase}
29
+$for(fontfamilies)$
30
+  \newfontfamily{$fontfamilies.name$}[$fontfamilies.options$]{$fontfamilies.font$}
31
+$endfor$
32
+$if(euro)$
33
+  \newcommand{\euro}{€}
34
+$endif$
35
+$if(mainfont)$
36
+    \setmainfont[$for(mainfontoptions)$$mainfontoptions$$sep$,$endfor$]{$mainfont$}
37
+$endif$
38
+$if(sansfont)$
39
+    \setsansfont[$for(sansfontoptions)$$sansfontoptions$$sep$,$endfor$]{$sansfont$}
40
+$endif$
41
+$if(monofont)$
42
+    \setmonofont[Mapping=tex-ansi$if(monofontoptions)$,$for(monofontoptions)$$monofontoptions$$sep$,$endfor$$endif$]{$monofont$}
43
+$endif$
44
+$if(mathfont)$
45
+    \setmathfont(Digits,Latin,Greek)[$for(mathfontoptions)$$mathfontoptions$$sep$,$endfor$]{$mathfont$}
46
+$endif$
47
+$if(CJKmainfont)$
48
+    \usepackage{xeCJK}
49
+    \setCJKmainfont[$for(CJKoptions)$$CJKoptions$$sep$,$endfor$]{$CJKmainfont$}
50
+$endif$
51
+\fi
52
+% use upquote if available, for straight quotes in verbatim environments
53
+\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
54
+% use microtype if available
55
+\IfFileExists{microtype.sty}{%
56
+\usepackage[$for(microtypeoptions)$$microtypeoptions$$sep$,$endfor$]{microtype}
57
+\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
58
+}{}
59
+\PassOptionsToPackage{hyphens}{url} % url is loaded by hyperref
60
+$if(verbatim-in-note)$
61
+\usepackage{fancyvrb}
62
+$endif$
63
+\usepackage[unicode=true]{hyperref}
64
+$if(colorlinks)$
65
+\PassOptionsToPackage{usenames,dvipsnames}{color} % color is loaded by hyperref
66
+$endif$
67
+\hypersetup{
68
+$if(title-meta)$
69
+            pdftitle={$title-meta$},
70
+$endif$
71
+$if(author-meta)$
72
+            pdfauthor={$author-meta$},
73
+$endif$
74
+$if(keywords)$
75
+            pdfkeywords={$for(keywords)$$keywords$$sep$, $endfor$},
76
+$endif$
77
+$if(colorlinks)$
78
+            colorlinks=true,
79
+            linkcolor=$if(linkcolor)$$linkcolor$$else$Maroon$endif$,
80
+            citecolor=$if(citecolor)$$citecolor$$else$Blue$endif$,
81
+            urlcolor=$if(urlcolor)$$urlcolor$$else$Blue$endif$,
82
+$else$
83
+            pdfborder={0 0 0},
84
+$endif$
85
+            breaklinks=true}
86
+\urlstyle{same}  % don't use monospace font for urls
87
+$if(verbatim-in-note)$
88
+\VerbatimFootnotes % allows verbatim text in footnotes
89
+$endif$
90
+$if(geometry)$
91
+\usepackage[$for(geometry)$$geometry$$sep$,$endfor$]{geometry}
92
+$endif$
93
+$if(lang)$
94
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
95
+  \usepackage[shorthands=off,$for(babel-otherlangs)$$babel-otherlangs$,$endfor$main=$babel-lang$]{babel}
96
+$if(babel-newcommands)$
97
+  $babel-newcommands$
98
+$endif$
99
+\else
100
+  \usepackage{polyglossia}
101
+  \setmainlanguage[$polyglossia-lang.options$]{$polyglossia-lang.name$}
102
+$for(polyglossia-otherlangs)$
103
+  \setotherlanguage[$polyglossia-otherlangs.options$]{$polyglossia-otherlangs.name$}
104
+$endfor$
105
+\fi
106
+$endif$
107
+$if(natbib)$
108
+\usepackage{natbib}
109
+\bibliographystyle{$if(biblio-style)$$biblio-style$$else$plainnat$endif$}
110
+$endif$
111
+$if(biblatex)$
112
+% \usepackage[$if(biblio-style)$style=$biblio-style$,$endif$$for(biblatexoptions)$$biblatexoptions$$sep$,$endfor$]{biblatex}
113
+\usepackage[backend=biber,style=authoryear,citestyle=authoryear]{biblatex}
114
+$for(bibliography)$
115
+\addbibresource{$bibliography$}
116
+$endfor$
117
+$endif$
118
+$if(listings)$
119
+\usepackage{listings}
120
+$endif$
121
+$if(lhs)$
122
+\lstnewenvironment{code}{\lstset{language=Haskell,basicstyle=\small\ttfamily}}{}
123
+$endif$
124
+$if(highlighting-macros)$
125
+$highlighting-macros$
126
+$endif$
127
+$if(tables)$
128
+\usepackage{longtable,booktabs}
129
+% Fix footnotes in tables (requires footnote package)
130
+\IfFileExists{footnote.sty}{\usepackage{footnote}\makesavenoteenv{long table}}{}
131
+$endif$
132
+$if(graphics)$
133
+\usepackage{graphicx,grffile}
134
+\makeatletter
135
+\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
136
+\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
137
+\makeatother
138
+% Scale images if necessary, so that they will not overflow the page
139
+% margins by default, and it is still possible to overwrite the defaults
140
+% using explicit options in \includegraphics[width, height, ...]{}
141
+\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
142
+$endif$
143
+$if(links-as-notes)$
144
+% Make links footnotes instead of hotlinks:
145
+\renewcommand{\href}[2]{#2\footnote{\url{#1}}}
146
+$endif$
147
+$if(strikeout)$
148
+\usepackage[normalem]{ulem}
149
+% avoid problems with \sout in headers with hyperref:
150
+\pdfstringdefDisableCommands{\renewcommand{\sout}{}}
151
+$endif$
152
+$if(indent)$
153
+$else$
154
+\IfFileExists{parskip.sty}{%
155
+\usepackage{parskip}
156
+}{% else
157
+\setlength{\parindent}{0pt}
158
+\setlength{\parskip}{6pt plus 2pt minus 1pt}
159
+}
160
+$endif$
161
+\setlength{\emergencystretch}{3em}  % prevent overfull lines
162
+\providecommand{\tightlist}{%
163
+  \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}}
164
+$if(numbersections)$
165
+\setcounter{secnumdepth}{$if(secnumdepth)$$secnumdepth$$else$5$endif$}
166
+$else$
167
+\setcounter{secnumdepth}{0}
168
+$endif$
169
+$if(subparagraph)$
170
+$else$
171
+% Redefines (sub)paragraphs to behave more like sections
172
+\ifx\paragraph\undefined\else
173
+\let\oldparagraph\paragraph
174
+\renewcommand{\paragraph}[1]{\oldparagraph{#1}\mbox{}}
175
+\fi
176
+\ifx\subparagraph\undefined\else
177
+\let\oldsubparagraph\subparagraph
178
+\renewcommand{\subparagraph}[1]{\oldsubparagraph{#1}\mbox{}}
179
+\fi
180
+$endif$
181
+$if(dir)$
182
+\ifxetex
183
+  % load bidi as late as possible as it modifies e.g. graphicx
184
+  $if(latex-dir-rtl)$
185
+  \usepackage[RTLdocument]{bidi}
186
+  $else$
187
+  \usepackage{bidi}
188
+  $endif$
189
+\fi
190
+\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
191
+  \TeXXeTstate=1
192
+  \newcommand{\RL}[1]{\beginR #1\endR}
193
+  \newcommand{\LR}[1]{\beginL #1\endL}
194
+  \newenvironment{RTL}{\beginR}{\endR}
195
+  \newenvironment{LTR}{\beginL}{\endL}
196
+\fi
197
+$endif$
198
+
199
+% set default figure placement to htbp
200
+\makeatletter
201
+\def\fps@figure{htbp}
202
+\makeatother
203
+
204
+$for(header-includes)$
205
+$header-includes$
206
+$endfor$
207
+
208
+$if(title)$
209
+\title{$title$$if(thanks)$\thanks{$thanks$}$endif$}
210
+$endif$
211
+$if(subtitle)$
212
+\providecommand{\subtitle}[1]{}
213
+\subtitle{$subtitle$}
214
+$endif$
215
+$if(author)$
216
+\author{$for(author)$$author$$sep$ \and $endfor$}
217
+$endif$
218
+$if(institute)$
219
+\providecommand{\institute}[1]{}
220
+\institute{$for(institute)$$institute$$sep$ \and $endfor$}
221
+$endif$
222
+\date{$date$}
223
+
224
+% Modifica la cornisa
225
+\usepackage{fancyhdr}
226
+\pagestyle{fancy}
227
+\fancyhead[LO]{}
228
+\fancyhead[LE]{}
229
+\fancyhead[CO]{$title$}
230
+\fancyhead[CE]{$author$}
231
+\fancyhead[RO]{}
232
+\fancyhead[RE]{}
233
+%\chead{$title$}
234
+%\lhead{}
235
+%\rhead{}
236
+
237
+% NO HAY BIBLIOGRAFÍA POR EL MOMENTO, por eso se comenta
238
+% \renewcommand*{\nameyeardelim}{\addcomma\space} % Agrega una coma entre el autor y el año en las citas
239
+% \renewcommand*{\finalnamedelim}{\addspace\&\addspace} % Cambia la «y» por un «&» cuando son dos autores en las citas
240
+% \renewcommand*{\bibpagespunct}{ % Cambia a dos puntos la separación antes de los números de página en los artículos
241
+% 	\ifentrytype{article}{
242
+% 		{\addcolon}\space}
243
+% 	{\addperiod\addspace}}
244
+% \defbibheading{bibempty}{}
245
+% \renewbibmacro*{volume+number+eid}{ % Imprime volumen(número) en lugar de volumen.número
246
+% 	\printfield{volume}%
247
+% 	\printfield{number}
248
+% 	\setunit{\addcomma\space}
249
+% 	\printfield{eid}}
250
+% \DeclareFieldFormat[article]{number}{\mkbibparens{#1}}
251
+
252
+% Para la imagen de portada
253
+\usepackage{tikz}
254
+
255
+% Permite párrafos franceses
256
+\usepackage{hanging}
257
+
258
+\begin{document}
259
+
260
+% Elimina el "Capítulo X"
261
+\renewcommand{\chaptername}{}
262
+\renewcommand{\thechapter}{}
263
+
264
+% Portada
265
+\thispagestyle{empty}
266
+\begin{tikzpicture}[remember picture,overlay]
267
+\node[inner sep=0] at (current page.center){\includegraphics[width=\paperwidth,height=\paperheight]{portada.jpg}};
268
+\end{tikzpicture}
269
+
270
+% Portadilla
271
+{\let\cleardoublepage\clearpage 
272
+\maketitle
273
+}
274
+
275
+$for(include-before)$
276
+$include-before$
277
+
278
+$endfor$
279
+$if(toc)$
280
+{
281
+$if(colorlinks)$
282
+\hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$}
283
+$endif$
284
+\setcounter{tocdepth}{$toc-depth$}
285
+\phantomsection
286
+\tableofcontents
287
+}
288
+$endif$
289
+$if(lot)$
290
+\listoftables
291
+$endif$
292
+$if(lof)$
293
+\listoffigures
294
+$endif$
295
+
296
+$body$
297
+
298
+$if(natbib)$
299
+$if(bibliography)$
300
+$if(biblio-title)$
301
+$if(book-class)$
302
+\renewcommand\bibname{$biblio-title$}
303
+$else$
304
+\renewcommand\refname{$biblio-title$}
305
+$endif$
306
+$endif$
307
+\bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}
308
+
309
+$endif$
310
+$endif$
311
+$if(biblatex)$
312
+\printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$
313
+
314
+$endif$
315
+$for(include-after)$
316
+$include-after$
317
+
318
+$endfor$
319
+
320
+\end{document}