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