├── ejemplo ├── words.txt ├── index.txt ├── config.py ├── notebook.txt ├── fantasmas.txt ├── dentista.txt └── paredon.txt ├── DEVELOPERS.md ├── ejemplo_2 ├── index.txt ├── config.py ├── yumiko.txt ├── programador.txt └── consumo.txt ├── bookcover.pdf ├── slides ├── latex.jpg ├── latexlab.png ├── automagica.odp ├── automagica.pdf ├── britney-spears-python.jpg └── michelle-pfeiffer-latex-catsuit.jpg ├── cover ├── figures │ ├── Gato.png │ ├── bg.jpg │ ├── dice.png │ ├── logo.eps │ ├── logo.png │ ├── mail.png │ ├── tw.png │ ├── cards.png │ ├── salvajes.png │ ├── salvajes.xcf │ ├── tigrebyn.png │ ├── automagica.eps │ ├── automagica.png │ ├── fondo carne.png │ ├── tigrecolor.png │ ├── cuchillo dulce.png │ ├── logo-celeste.png │ ├── automagica-celeste.png │ └── automagica-eps-converted-to.pdf ├── example1.tex ├── example2.tex └── cover_template.tex ├── requirements.txt ├── .travis.yml ├── config.example.py ├── config.py ├── epub.py ├── template.py ├── config_cover.py ├── pdf ├── __init__.py └── booklet.py ├── .gitignore ├── bookcover.ins ├── test.py ├── README.md ├── utils.py ├── template.tex ├── bookcover.log ├── gdocs2latex.gs ├── automagica-cover.py ├── automagica.py ├── ejemplo_single └── contenido.txt └── tests_data ├── index_excluded.tex ├── default.tex ├── jungla.tex └── sueltos.tex /ejemplo/words.txt: -------------------------------------------------------------------------------- 1 | a-gudo 2 | se-cretaria 3 | -------------------------------------------------------------------------------- /DEVELOPERS.md: -------------------------------------------------------------------------------- 1 | * Juanjo Conti 2 | * Francisco Rivera 3 | -------------------------------------------------------------------------------- /ejemplo_2/index.txt: -------------------------------------------------------------------------------- 1 | consumo.txt 2 | yumiko.txt 3 | programador.txt 4 | -------------------------------------------------------------------------------- /bookcover.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/bookcover.pdf -------------------------------------------------------------------------------- /ejemplo/index.txt: -------------------------------------------------------------------------------- 1 | dentista.txt 2 | fantasmas.txt 3 | notebook.txt 4 | paredon.txt 5 | -------------------------------------------------------------------------------- /slides/latex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/slides/latex.jpg -------------------------------------------------------------------------------- /slides/latexlab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/slides/latexlab.png -------------------------------------------------------------------------------- /cover/figures/Gato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/Gato.png -------------------------------------------------------------------------------- /cover/figures/bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/bg.jpg -------------------------------------------------------------------------------- /cover/figures/dice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/dice.png -------------------------------------------------------------------------------- /cover/figures/logo.eps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/logo.eps -------------------------------------------------------------------------------- /cover/figures/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/logo.png -------------------------------------------------------------------------------- /cover/figures/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/mail.png -------------------------------------------------------------------------------- /cover/figures/tw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/tw.png -------------------------------------------------------------------------------- /slides/automagica.odp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/slides/automagica.odp -------------------------------------------------------------------------------- /slides/automagica.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/slides/automagica.pdf -------------------------------------------------------------------------------- /cover/figures/cards.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/cards.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | Jinja2==2.8 2 | MarkupSafe==0.23 3 | pdfrw==0.3 4 | nose==1.3.7 5 | coverage==4.2 6 | -------------------------------------------------------------------------------- /cover/figures/salvajes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/salvajes.png -------------------------------------------------------------------------------- /cover/figures/salvajes.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/salvajes.xcf -------------------------------------------------------------------------------- /cover/figures/tigrebyn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/tigrebyn.png -------------------------------------------------------------------------------- /cover/figures/automagica.eps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/automagica.eps -------------------------------------------------------------------------------- /cover/figures/automagica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/automagica.png -------------------------------------------------------------------------------- /cover/figures/fondo carne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/fondo carne.png -------------------------------------------------------------------------------- /cover/figures/tigrecolor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/tigrecolor.png -------------------------------------------------------------------------------- /cover/figures/cuchillo dulce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/cuchillo dulce.png -------------------------------------------------------------------------------- /cover/figures/logo-celeste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/logo-celeste.png -------------------------------------------------------------------------------- /slides/britney-spears-python.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/slides/britney-spears-python.jpg -------------------------------------------------------------------------------- /cover/figures/automagica-celeste.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/automagica-celeste.png -------------------------------------------------------------------------------- /slides/michelle-pfeiffer-latex-catsuit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/slides/michelle-pfeiffer-latex-catsuit.jpg -------------------------------------------------------------------------------- /cover/figures/automagica-eps-converted-to.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jjconti/automagica/HEAD/cover/figures/automagica-eps-converted-to.pdf -------------------------------------------------------------------------------- /ejemplo_2/config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | CONFIGS = dict( 5 | BASE_FILENAME='sueltos', 6 | TITLE="Capítulos sueltos", 7 | AUTHOR="Juan José Conti", 8 | FONT_SIZE=12, 9 | PAGE_SIZE="a5paper", 10 | ) 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "2.7" 4 | install: 5 | - pip install -r requirements.txt 6 | - pip install coveralls 7 | script: 8 | - nosetests --with-coverage 9 | after_success: 10 | - coveralls 11 | 12 | notifications: 13 | email: false 14 | -------------------------------------------------------------------------------- /ejemplo/config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | CONFIGS = dict( 5 | BASE_FILENAME='jungla', 6 | no_split=True, 7 | TITLE="El libro de la jungla", 8 | AUTHOR="Juan José Conti", 9 | FONT_SIZE=11, 10 | URL='http://www.ellibrodelajungla.com' 11 | ) 12 | -------------------------------------------------------------------------------- /config.example.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | BASE_FILENAME = 'jungla' 5 | 6 | CONFIGS = dict( 7 | TITLE="El libro de la jungla", 8 | AUTHOR="Juan José Conti", 9 | FONT_SIZE=16, 10 | PAGE_SIZE='a5paper', 11 | YEAR='2016', 12 | URL='', 13 | INDEX_TITLE="Índice" 14 | ) 15 | -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from datetime import datetime 3 | 4 | CONFIGS = dict( 5 | 6 | BASE_FILENAME='jungla', 7 | book_path='.', 8 | no_split=True, 9 | pdf=True, 10 | booklet=False, 11 | epub=False, 12 | only_tex=False, 13 | sections=False, 14 | new_page_before_sections=True, 15 | TITLE="TITLE", 16 | SUBTITLE="", 17 | AUTHOR="AUTHOR", 18 | FONT_SIZE=11, 19 | PAGE_SIZE='a5paper', 20 | YEAR=datetime.now().year, 21 | URL='http://www.ellibrodelajungla.com', 22 | exclude_index=False, 23 | no_open=False 24 | ) 25 | -------------------------------------------------------------------------------- /epub.py: -------------------------------------------------------------------------------- 1 | """ 2 | Generate .epub file 3 | """ 4 | 5 | import os 6 | import subprocess 7 | 8 | from utils import filepath 9 | 10 | 11 | def generate_epub(book_path, base_filename, tex_file): 12 | epub_file = filepath(book_path, base_filename, 'epub') 13 | cmd = ['pandoc', '--from=latex', '-o', epub_file, tex_file] 14 | 15 | proc = subprocess.Popen(cmd) 16 | proc.communicate() 17 | 18 | retcode = proc.returncode 19 | 20 | if not retcode == 0: 21 | os.unlink(epub_file) 22 | raise ValueError('Error {} executing command: {}'.format(retcode, ' '.join(cmd))) 23 | -------------------------------------------------------------------------------- /template.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from __future__ import division, print_function, unicode_literals 5 | 6 | import os 7 | 8 | import jinja2 9 | 10 | latex_env = jinja2.Environment( 11 | block_start_string='block{', 12 | block_end_string='}', 13 | variable_start_string='var{', 14 | variable_end_string='}', 15 | comment_start_string='#{', 16 | comment_end_string='}', 17 | line_statement_prefix='%%', 18 | line_comment_prefix='%#', 19 | trim_blocks=True, 20 | autoescape=False, 21 | loader=jinja2.FileSystemLoader(os.path.abspath('.')) 22 | ) 23 | -------------------------------------------------------------------------------- /config_cover.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from datetime import datetime 3 | 4 | CONFIGS = dict( 5 | 6 | BASE_FILENAME='ejemplocover', 7 | book_path='ejemplo', 8 | TITLE="Título", 9 | AUTHOR="Autor", 10 | COVER_WIDTH='12cm', 11 | COVER_HEIGHT='20cm', 12 | SPINE_WIDTH='7mm', 13 | SPINE_INTERTEXT_SPACE='2cm', 14 | TITLE_COLOR='{RGB}{176,216,241}', 15 | TITLE_VSPACE='20mm', 16 | AUTHOR_VSPACE='20mm', 17 | COVER_COLOR='black', 18 | IMAGE_WIDTH='8cm', 19 | IMAGE_PATH='ejemplo/imagen.jpg', 20 | LOGO_WIDTH='3cm', 21 | LOGO_PATH='cover/figures/automagica.png', 22 | SPINE_LOGO_PATH='cover/figures/logo.png', 23 | SPINE_LOGO_WIDTH="3mm", 24 | IMAGE_VSPACE='90mm', 25 | BACK_TEXT='ejemplo/contratapa.txt', 26 | BACK_TEXT_COLOR='{RGB}{176,216,241}', 27 | BACK_VSPACE='20mm' 28 | 29 | ) 30 | -------------------------------------------------------------------------------- /pdf/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | Generate .pdf file 3 | """ 4 | 5 | import os 6 | import subprocess 7 | 8 | from utils import filepath, show_file 9 | 10 | 11 | def generate_pdf(book_path, base_filename, tex_file): 12 | pdf_file = filepath(book_path, base_filename, 'pdf') 13 | cmd = ['pdflatex', '-interaction', 'nonstopmode', '-output-directory', book_path, tex_file] 14 | 15 | proc = subprocess.Popen(cmd) 16 | proc.communicate() 17 | 18 | proc = subprocess.Popen(cmd) 19 | proc.communicate() 20 | 21 | retcode = proc.returncode 22 | 23 | if not retcode == 0: 24 | os.unlink(pdf_file) 25 | raise ValueError('Error {} executing command: {}'.format(retcode, ' '.join(cmd))) 26 | else: 27 | if os.path.isfile(filepath(book_path, base_filename, 'toc')): 28 | os.unlink(filepath(book_path, base_filename, 'toc')) 29 | os.unlink(filepath(book_path, base_filename, 'log')) 30 | os.unlink(filepath(book_path, base_filename, 'aux')) 31 | 32 | return pdf_file 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Ejemplos de libros Automágica 2 | ejemplo*/*.booklet.pdf 3 | ejemplo*/*.epub 4 | ejemplo*/*.html 5 | ejemplo*/*.pdf 6 | ejemplo*/*.tex 7 | ### PyCharm ### 8 | .idea/* 9 | 10 | ### Python ### 11 | # Byte-compiled / optimized / DLL files 12 | __pycache__/ 13 | *.py[cod] 14 | *$py.class 15 | 16 | # C extensions 17 | *.so 18 | 19 | # Distribution / packaging 20 | .Python 21 | env/ 22 | build/ 23 | develop-eggs/ 24 | dist/ 25 | downloads/ 26 | eggs/ 27 | .eggs/ 28 | lib/ 29 | lib64/ 30 | parts/ 31 | sdist/ 32 | var/ 33 | *.egg-info/ 34 | .installed.cfg 35 | *.egg 36 | 37 | # PyInstaller 38 | # Usually these files are written by a python script from a template 39 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 40 | *.manifest 41 | *.spec 42 | 43 | # Installer logs 44 | pip-log.txt 45 | pip-delete-this-directory.txt 46 | 47 | # Unit test / coverage reports 48 | htmlcov/ 49 | .tox/ 50 | .coverage 51 | .coverage.* 52 | .cache 53 | nosetests.xml 54 | coverage.xml 55 | *,cover 56 | .hypothesis/ 57 | 58 | # Translations 59 | *.mo 60 | *.pot 61 | 62 | trabajos/ 63 | -------------------------------------------------------------------------------- /pdf/booklet.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | usage: booklet.py my.pdf 5 | 6 | Creates booklet.my.pdf 7 | 8 | Pages organized in a form suitable for booklet printing, e.g. 9 | to print 4 8.5x11 pages using a single 11x17 sheet (double-sided). 10 | 11 | From https://github.com/pmaupin/pdfrw/blob/master/examples/booklet.py 12 | """ 13 | 14 | import sys 15 | import os 16 | 17 | from pdfrw import PdfReader, PdfWriter, PageMerge 18 | 19 | 20 | def fixpage(*pages): 21 | result = PageMerge() + (x for x in pages if x is not None) 22 | result[-1].x += result[0].w 23 | return result.render() 24 | 25 | 26 | def generate_booklet(input_file, output_file): 27 | ipages = PdfReader(input_file).pages 28 | 29 | # Make sure we have 4*n pages 30 | while len(ipages) % 4: 31 | ipages.append(None) 32 | 33 | opages = [] 34 | while len(ipages): 35 | opages.append(fixpage(ipages.pop(), ipages.pop(0))) 36 | opages.append(fixpage(ipages.pop(0), ipages.pop())) 37 | 38 | opages += ipages 39 | 40 | PdfWriter().addpages(opages).write(output_file) 41 | 42 | if __name__ == '__main__': 43 | inpfn, = sys.argv[1:] 44 | outfn = 'booklet.' + os.path.basename(inpfn) 45 | generate_booklet(inpfn, outfn) 46 | -------------------------------------------------------------------------------- /bookcover.ins: -------------------------------------------------------------------------------- 1 | 2 | % Copyright (C) 2015-2016 Tibor Tomacs 3 | % This file may be distributed and/or modified under the 4 | % conditions of the LaTeX Project Public License, either 5 | % version 1.2 of this license or (at your option) any later 6 | % version. The latest version of this license is in: 7 | % 8 | % http://www.latex-project.org/lppl.txt 9 | % 10 | % and version 1.2 or later is part of all distributions of 11 | % LaTeX version 1999/12/01 or later. 12 | % 13 | \input docstrip.tex 14 | \keepsilent 15 | \usedir{tex/latex/bookcover} 16 | \preamble 17 | This is a generated file. 18 | Copyright (C) 2015-2016 Tibor Tomacs 19 | This file may be distributed and/or modified under the 20 | conditions of the LaTeX Project Public License, either 21 | version 1.2 of this license or (at your option) any later 22 | version. The latest version of this license is in: 23 | 24 | http://www.latex-project.org/lppl.txt 25 | 26 | and version 1.2 or later is part of all distributions of 27 | LaTeX version 1999/12/01 or later. 28 | 29 | \endpreamble 30 | 31 | \generate{\file{bookcover.cls}{\from{./bookcover.dtx}{class}}} 32 | \Msg{*********************************************************} 33 | \Msg{*} 34 | \Msg{* To finish the installation you have to move the} 35 | \Msg{* following file into a directory searched by TeX:} 36 | \Msg{*} 37 | \Msg{* \space\space bookcover.cls} 38 | \Msg{*} 39 | \Msg{* To produce the documentation run the file bookcover.dtx} 40 | \Msg{* through LaTeX.} 41 | \Msg{*} 42 | \Msg{* Happy TeXing!} 43 | \Msg{*********************************************************} 44 | \endbatchfile 45 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import glob 4 | import shutil 5 | import os 6 | import subprocess 7 | from unittest import TestCase 8 | 9 | 10 | # legacy tests 11 | # don't blame me :P 12 | 13 | 14 | class BuildTest(TestCase): 15 | 16 | TESTS_DIR = 'tests_data' 17 | EXAMPLES = { 18 | 'ejemplo': [['--YEAR=2016']], 19 | 'ejemplo_no_config': [['--YEAR=2016']], 20 | 'ejemplo_2': [['--YEAR=2016']], 21 | 'ejemplo_single': [['--YEAR=2016'], ['--YEAR=2016', '--exclude_index', '--BASE_FILENAME=index_excluded']] 22 | } 23 | 24 | @classmethod 25 | def tearDownClass(cls): 26 | for ex in cls.EXAMPLES.keys(): 27 | dir = os.path.join(cls.TESTS_DIR, ex) 28 | if os.path.isdir(dir): 29 | shutil.rmtree(dir) 30 | 31 | @staticmethod 32 | def run_and_assert(cmd, returncode): 33 | print("Running: {}".format(cmd)) 34 | proc = subprocess.run(cmd, stdout=subprocess.PIPE) 35 | #output = proc.communicate()[0] 36 | if proc.returncode != returncode: 37 | print (proc.output) 38 | return proc.returncode 39 | 40 | def test_build(self): 41 | for ex in self.EXAMPLES.keys(): 42 | new_dir = os.path.join(self.TESTS_DIR, ex) 43 | os.mkdir(new_dir) 44 | for f in glob.glob(os.path.join(ex, '*.txt')) + [os.path.join(ex, 'config.py')]: 45 | if os.path.isfile(f): 46 | shutil.copy(f, new_dir) 47 | for params in self.EXAMPLES[ex]: 48 | cmd = ['python', 'automagica.py', '--only_tex'] + params + [os.path.join(self.TESTS_DIR, ex)] 49 | self.run_and_assert(cmd, 0) 50 | 51 | cmd = ['diff', 'tests_data/ejemplo/jungla.tex', 'tests_data/jungla.tex'] 52 | self.assertEqual(self.run_and_assert(cmd, 0), 0) 53 | cmd = ['diff', 'tests_data/ejemplo_2/sueltos.tex', 'tests_data/sueltos.tex'] 54 | self.assertEqual(self.run_and_assert(cmd, 0), 0) 55 | cmd = ['diff', 'tests_data/ejemplo_single/default.tex', 'tests_data/default.tex'] 56 | self.assertEqual(self.run_and_assert(cmd, 0), 0) 57 | cmd = ['diff', 'tests_data/ejemplo_single/index_excluded.tex', 'tests_data/index_excluded.tex'] 58 | self.assertEqual(self.run_and_assert(cmd, 0), 0) 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # automagica 2 | 3 | [![Build Status](https://travis-ci.org/jjconti/automagica.svg?branch=master)](https://travis-ci.org/jjconti/automagica) [![Code Health](https://landscape.io/github/jjconti/automagica/master/landscape.svg?style=flat)](https://landscape.io/github/jjconti/automagica/master) [![Coverage Status](https://coveralls.io/repos/github/jjconti/automagica/badge.svg?branch=master)](https://coveralls.io/github/jjconti/automagica?branch=master) 4 | 5 | Automágica permite maquetar tu texto en forma automática de manera de obtener libros listos para imprimir en una imprenta o para distrubuir digitalmente. 6 | 7 | Funciona en Linux, OS X y Windows. 8 | 9 | [![Estado actual de Automágica](https://i.ytimg.com/vi/oPpIC9GOrEc/hqdefault.jpg)](https://www.youtube.com/watch?v=oPpIC9GOrEc) 10 | 11 | # Instalación 12 | 13 | ## Requerimientos 14 | 15 | * pdflatex 16 | * python 2 17 | * pandoc 18 | * pdfrw 19 | 20 | ## En Linux 21 | 22 | * sudo apt-get install pandoc texlive-full python-jinja2 23 | * sudo pip install Jinja2 pdfrw 24 | 25 | ## En Windows 26 | 27 | ### Forma fácil 28 | 29 | Descargar [Automágica para Windows](https://drive.google.com/file/d/1K_DNzm5Snl9r4CQsduM_tDFtIRZltRm5/view?usp=sharing) 30 | 31 | ### Forma dificil 32 | 33 | Instalar paso a paso: 34 | 35 | * http://mirror.ctan.org/systems/texlive/tlnet/install-tl-windows.exe (para tener pdflatex.exe) 36 | * https://github.com/jgm/pandoc/releases/download/1.17.2/pandoc-1.17.2-windows.msi 37 | * https://www.python.org/ftp/python/2.7.12/python-2.7.12.msi 38 | * Agregar Python al PATH del sistema: 39 | - Apretar las teclas Win y Pause. 40 | - Click en Advanced System Settings. 41 | - Click en Environment Variables. 42 | - Agregar ;C:\python27 a la variable PATH. 43 | - Reiniciar cmd. 44 | * Para instalar pdfrw abrir cmd para entrar a la línea de comandos y ejecutar: 45 | - C:\Python27\Scripts\pip.exe install pdfrw 46 | * Bajar el .zip de automágica desde esta misma página. 47 | 48 | # Uso 49 | 50 | `python automagica.py ejemplo` genera la versión en pdf del libro en la caprpeta ejemplo. 51 | `python automagica.py --pdf --booklet --epub ejemplo` genera la versión en pdf, pdf booklet y epub del libro en la caprpeta ejemplo. 52 | 53 | # GUI 54 | 55 | Para usar la interfaz gráfica: 56 | 57 | `git checkout gui` 58 | 59 | `./wxpython automagica.py` 60 | -------------------------------------------------------------------------------- /utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from __future__ import division, print_function, unicode_literals 5 | 6 | import os 7 | import subprocess 8 | import sys 9 | 10 | 11 | def show_file(filepath): 12 | if sys.platform.startswith('darwin'): 13 | subprocess.call(('open', filepath)) 14 | elif os.name == 'nt': 15 | os.startfile(filepath) 16 | elif os.name == 'posix': 17 | subprocess.call(('xdg-open', filepath)) 18 | 19 | 20 | def filepath(path, base_name, ext): 21 | return os.path.join(path, '{}.{}'.format(base_name, ext)) 22 | 23 | 24 | def latex_chapter_title(title, index_title=None): 25 | if not index_title: 26 | index_title = title 27 | return '\n\n\chapter*{{{title}}} \\addcontentsline{{toc}}{{chapter}}{{{index_title}}}'.format( 28 | title=title.strip(), index_title=index_title.strip()) 29 | 30 | 31 | def latex_section_title(title, index_title=None, new_page_before_sections=False): 32 | if not index_title: 33 | index_title = title 34 | np = '\n\n\\newpage' if new_page_before_sections else '' 35 | return np + '\n\n\section*{{{title}}} \\addcontentsline{{toc}}{{section}}{{{index_title}}}'.format( 36 | title=title.strip(), index_title=index_title.strip()) 37 | 38 | 39 | def latex_subsection_title(title, index_title=None): 40 | return '\n\n\subsection*{{{title}}}'.format(title=title) 41 | 42 | 43 | def latex_part_title(title, index_title=None): 44 | return '\n\n\part*{{{title}}}'.format(title=title) 45 | 46 | 47 | def latex_chapter(path, split_paragraphs=False): 48 | with open(path, 'r') as f: 49 | lines = f.readlines() 50 | lines[0] = latex_chapter_title(lines[0]) 51 | sep = '\n' if split_paragraphs else ' ' 52 | return sep.join(lines).replace('&', '\&') 53 | 54 | 55 | def is_title(i, lines): 56 | return i and lines[i] and not lines[i-1] and not lines[i+1] and len(lines[i]) < 60 and "\\" not in lines[i] 57 | 58 | 59 | def latex_single(path, split_paragraphs=False, use_sections=False, new_page_before_sections=False): 60 | with open(path, 'r') as f: 61 | lines = [''] + [l.strip() for l in f.readlines()] + [''] 62 | for (i, line) in enumerate(lines): 63 | if is_title(i, lines): 64 | if use_sections: 65 | lines[i] = latex_section_title(lines[i], new_page_before_sections=new_page_before_sections) 66 | else: 67 | lines[i] = latex_chapter_title(lines[i]) 68 | sep = '\n\n' if split_paragraphs else ' ' 69 | return sep.join(lines).replace('&', '\&') 70 | 71 | 72 | def latex_hyphenation(word): 73 | return '\hyphenation{{{word}}}'.format(word=word) 74 | -------------------------------------------------------------------------------- /template.tex: -------------------------------------------------------------------------------- 1 | \documentclass[var{FONT_SIZE}pt,twoside,openright]{book} 2 | 3 | \usepackage[var{PAGE_SIZE},hmarginratio={3:2},bottom=0.8in,top=0.8in]{geometry} 4 | 5 | \usepackage{times} 6 | \usepackage[Lenny]{fncychap} 7 | 8 | \usepackage[spanish]{babel} 9 | \usepackage[utf8x]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | 12 | \usepackage{mathptmx} 13 | \usepackage{etoolbox} 14 | 15 | \usepackage[titles]{tocloft} 16 | 17 | \usepackage{pdfpages} 18 | 19 | \usepackage{courier} 20 | 21 | \renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} 22 | 23 | % change the space before the titles 24 | \makeatletter 25 | \patchcmd{\@makechapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 26 | \patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 27 | \makeatother 28 | 29 | % change the space after the titles 30 | \renewcommand{\DOTI}[1]{% 31 | \raggedright 32 | \CTV\FmTi{#1}\par\nobreak 33 | \vskip 10pt} 34 | \renewcommand{\DOTIS}[1]{% 35 | \raggedright 36 | \CTV\FmTi{#1}\par\nobreak 37 | \vskip 10pt} 38 | 39 | 40 | \title{var{TITLE}block{ if SUBTITLE }\bigbreak\large var{SUBTITLE}block{ endif }} 41 | \author{block{ if SUBTITLE }\bigbreak block{ endif }var{AUTHOR}} 42 | \date{} 43 | 44 | var{HYPHENATION} 45 | 46 | % Avoid widows and orphans 47 | \widowpenalty=10000 48 | \clubpenalty=10000 49 | 50 | \begin{document} 51 | 52 | \pagenumbering{gobble} 53 | 54 | \pagestyle{plain} 55 | 56 | 57 | % IF PRINT 58 | %\includepdf{empty.pdf} 59 | %\includepdf{empty.pdf} 60 | 61 | \maketitle 62 | 63 | \cleardoublepage 64 | 65 | \thispagestyle{empty} 66 | \noindent 67 | Edición automágica, var{YEAR}.\\ 68 | 69 | \vspace{0.5cm} 70 | 71 | \noindent 72 | \emph{var{TITLE}} lleva la licencia 73 | \emph{Creative Commons Attribution - NonCommercial - ShareAlike 4.0 Iternational}. 74 | Esto significa que podés compartir esta obra y crear obras derivadas 75 | mencionando al autor, pero no ha\-cer un uso comercial de ella. 76 | 77 | \vfill 78 | 79 | \noindent 80 | %Más información sobre este libro:\\ 81 | var{URL}\\ 82 | 83 | \cleardoublepage 84 | 85 | 86 | block{ if not exclude_index } 87 | \renewcommand*\contentsname{var{INDEX_TITLE}} 88 | 89 | \tableofcontents 90 | 91 | 92 | \cleardoublepage 93 | block{ endif } 94 | 95 | \pagenumbering{arabic} 96 | 97 | var{CONTENT} 98 | 99 | \cleardoublepage 100 | 101 | %IMPRENTA 102 | %\includepdf{empty.pdf} 103 | 104 | \hspace{0pt} 105 | \vfill 106 | \begin{center} 107 | Maqueteado automáticamente utilizando \emph{Automágica}. 108 | \bigbreak 109 | http://www.juanjoconti.com/automagica/ 110 | \end{center} 111 | \vfill 112 | \hspace{0pt} 113 | \end{document} 114 | 115 | -------------------------------------------------------------------------------- /cover/example1.tex: -------------------------------------------------------------------------------- 1 | \documentclass[12pt,spinewidth=25mm,coverwidth=15cm,coverheight=20cm,flapwidth=6cm]{bookcover} 2 | \newbookcovercomponenttype{center rotate}{ 3 | \parbox[t][\partheight][c]{\partwidth}{ 4 | \begin{center} 5 | \rotatebox[origin=c]{90}{#1} 6 | \end{center}}} 7 | \usepackage{contour,lipsum} 8 | \contourlength{1pt} 9 | \definecolor{lightbrown}{RGB}{176,88,0} 10 | \colorlet{title}{yellow!60!black} 11 | \begin{document} 12 | 13 | \begin{bookcover} 14 | 15 | % Black background color on the whole cover 16 | \bookcovercomponent{color}{bg whole}{color=black} 17 | 18 | % Brown background picture on the whole cover, without the flaps 19 | \bookcovercomponent{picture}{bg whole without flaps}{./figures/bg.jpg} 20 | 21 | % Vertical light brown transparent trails on the back cover by a tikz code 22 | \bookcovercomponent{tikz}{bg back}{ 23 | \fill[opacity=0.3,color=lightbrown] 24 | (0mm,0mm) rectangle (20mm,210mm) (100mm,0mm) rectangle (150mm,210mm);} 25 | 26 | % Vertical light brown transparent trails on the front cover by a tikz code 27 | \bookcovercomponent{tikz}{bg front}{ 28 | \fill[opacity=0.3,color=lightbrown] 29 | (0mm,0mm) rectangle (50mm,210mm) (130mm,0mm) rectangle (150mm,210mm);} 30 | 31 | % Remark 32 | \bookcovercomponent{center}{above front}{ 33 | \color{blue}A DUST JACKET} 34 | 35 | % Picture (cards.png) on the front, behind the title 36 | \bookcovercomponent{normal}{front}{ 37 | \vspace{70mm} 38 | \centering 39 | \includegraphics[width=8cm]{./figures/cards.png}} 40 | 41 | % Text on the front cover 42 | \bookcovercomponent{normal}{front}{ 43 | \centering 44 | \vspace{60mm} 45 | \color{title}\sffamily\bfseries 46 | \resizebox*{50mm}{8mm}{\contour[120]{black}{Rose Taylor}} 47 | \par\vspace{20mm} 48 | \resizebox*{90mm}{40mm}{\parbox{35mm}{ 49 | \centering 50 | \contour[120]{black}{PROBABILITY}\\ 51 | \contour[120]{black}{THEORY}\\}}} 52 | 53 | % Text on the spine 54 | \bookcovercomponent{center rotate}{spine}{ 55 | \contour[120]{black}{ 56 | \color{title}\huge\sffamily\bfseries 57 | Rose Taylor -- Probability Theory}} 58 | 59 | % Text on the back cover 60 | \bookcovercomponent{normal}{back}{ 61 | \centering 62 | \vspace{20mm} 63 | \parbox{110mm}{\color{white}\lipsum[1]}} 64 | 65 | % Text and picture (dice.png) on the front flap 66 | \bookcovercomponent{normal}{front flap}{ 67 | \centering 68 | \vspace{20mm} 69 | \parbox{40mm}{\color{white}\lipsum[2]} 70 | \vfill 71 | \includegraphics[width=30mm]{./figures/dice.png} 72 | \vspace{10mm}} 73 | 74 | % Text on the back flap 75 | \bookcovercomponent{normal}{back flap}{ 76 | \centering 77 | \vspace{20mm} 78 | \parbox{40mm}{\color{white}\lipsum[2]}} 79 | 80 | \end{bookcover} 81 | 82 | \end{document} -------------------------------------------------------------------------------- /bookcover.log: -------------------------------------------------------------------------------- 1 | This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=latex 2014.10.17) 25 JAN 2017 12:55 2 | entering extended mode 3 | restricted \write18 enabled. 4 | %&-line parsing enabled. 5 | **bookcover.ins 6 | (./bookcover.ins 7 | LaTeX2e <2014/05/01> 8 | Babel <3.9k> and hyphenation patterns for 78 languages loaded. 9 | (/usr/local/texlive/2014/texmf-dist/tex/latex/base/docstrip.tex 10 | \blockLevel=\count79 11 | \emptyLines=\count80 12 | \processedLines=\count81 13 | \commentsRemoved=\count82 14 | \commentsPassed=\count83 15 | \codeLinesPassed=\count84 16 | \TotalprocessedLines=\count85 17 | \TotalcommentsRemoved=\count86 18 | \TotalcommentsPassed=\count87 19 | \TotalcodeLinesPassed=\count88 20 | \NumberOfFiles=\count89 21 | \inFile=\read1 22 | \inputcheck=\read2 23 | \off@0=\count90 24 | \off@1=\count91 25 | \off@2=\count92 26 | \off@3=\count93 27 | \off@4=\count94 28 | \off@5=\count95 29 | \off@6=\count96 30 | \off@7=\count97 31 | \off@8=\count98 32 | \off@9=\count99 33 | \off@10=\count100 34 | \off@11=\count101 35 | \off@12=\count102 36 | \off@13=\count103 37 | \off@14=\count104 38 | \off@15=\count105 39 | \@maxfiles=\count106 40 | \@maxoutfiles=\count107 41 | 42 | Utility: `docstrip' 2.5d <2005/07/29> 43 | English documentation <2014/04/19> 44 | 45 | ********************************************************** 46 | * This program converts documented macro-files into fast * 47 | * loadable files by stripping off (nearly) all comments! * 48 | ********************************************************** 49 | 50 | ******************************************************** 51 | * No Configuration file found, using default settings. * 52 | ******************************************************** 53 | 54 | ) 55 | 56 | Generating file(s) ./bookcover.cls 57 | \openout0 = `./bookcover.cls'. 58 | 59 | 60 | Processing file ./bookcover.dtx (class) -> bookcover.cls 61 | File ./bookcover.dtx ended by \endinput. 62 | Lines processed: 2006 63 | Comments removed: 873 64 | Comments passed: 69 65 | Codelines passed: 1058 66 | 67 | ********************************************************* 68 | * 69 | * To finish the installation you have to move the 70 | * following file into a directory searched by TeX: 71 | * 72 | * bookcover.cls 73 | * 74 | * To produce the documentation run the file bookcover.dtx 75 | * through LaTeX. 76 | * 77 | * Happy TeXing! 78 | ********************************************************* 79 | ) 80 | Here is how much of TeX's memory you used: 81 | 310 strings out of 493118 82 | 3175 string characters out of 6135458 83 | 57716 words of memory out of 5000000 84 | 3867 multiletter control sequences out of 15000+600000 85 | 3640 words of font info for 14 fonts, out of 8000000 for 9000 86 | 1141 hyphenation exceptions out of 8191 87 | 11i,0n,15p,531b,119s stack positions out of 5000i,500n,10000p,200000b,80000s 88 | 89 | No pages of output. 90 | -------------------------------------------------------------------------------- /cover/example2.tex: -------------------------------------------------------------------------------- 1 | \documentclass[markcolor=black,spinewidth=15mm]{bookcover} 2 | \usepackage[utf8]{inputenc} 3 | \usepackage[T1]{fontenc} 4 | \usepackage[english]{babel} 5 | \usepackage{url} 6 | \definecolor{amiyellow}{cmyk}{0,0,.5,0} 7 | \begin{document} 8 | 9 | % The outside of the book cover 10 | \begin{bookcover} 11 | 12 | % Yellow triangle on the back cover by tikz code 13 | \bookcovercomponent{tikz}{bg back}{ 14 | \fill[color=amiyellow](.5,.5)--(17.5,24.5)--(17.5,0)--(.5,0)--cycle;} 15 | 16 | % Yellow triangle on the front cover by tikz code 17 | \bookcovercomponent{tikz}{bg front}{ 18 | \fill[color=amiyellow](0,0)--(0,24.5)--(17,.5)--(17,0)--cycle;} 19 | 20 | % Yellow background color on the spine 21 | \bookcovercomponent{color}{bg spine}{color=amiyellow} 22 | 23 | % Remark 24 | \bookcovercomponent{center}{above front}{ 25 | \color{red}\textsc{Annales Mathematicae et Informaticae} book cover -- outside} 26 | 27 | % Text on the spine 28 | \bookcovercomponent{center}{spine}{ 29 | \rotatebox[origin=c]{90}{\footnotesize\bfseries 30 | ANNALES MATHEMATICAE ET INFORMATICAE 43.\ (2014)}} 31 | 32 | % Text and pictures (summa.pdf, ekflogo.pdf) on the front cover 33 | \bookcovercomponent{normal}{front}{ 34 | \vspace{30.5mm} 35 | \centering 36 | {\huge\bfseries ANNALES\\ MATHEMATICAE ET\\ INFORMATICAE\\[13mm]} 37 | {\large\bfseries TOMUS 43.\ (2014)}\\[10mm] 38 | \includegraphics{./figures/summa.pdf}\\[5mm] 39 | {\large COMMISSIO REDACTORIUM}\\[3mm] 40 | \parbox{123mm}{ 41 | \centering 42 | Sándor Bácsó (Debrecen), Sonja Gorjanc (Zagreb), Tibor Gyimóthy (Szeged),\\ 43 | Miklós Hoffmann (Eger), József Holovács (Eger), László Kovács (Miskolc),\\ 44 | László Kozma (Budapest), Kálmán Liptai (Eger), Florian Luca (Mexico),\\ 45 | Giuseppe Mastroianni (Potenza), Ferenc Mátyás (Eger),\\ 46 | Ákos Pintér (Debrecen), Miklós Rontó (Miskolc), László Szalay (Sopron),\\ 47 | János Sztrik (Debrecen), Gary Walsh (Ottawa)\par} 48 | \vfill 49 | \includegraphics[height=20mm]{./figures/logo.pdf} 50 | \vfill 51 | {\large\bfseries HUNGARIA, EGER} 52 | \vfill} 53 | 54 | \end{bookcover} 55 | 56 | % The inside of the book cover 57 | \begin{bookcover} 58 | 59 | % Remark 60 | \bookcovercomponent{center}{above front}{ 61 | \color{red}\textsc{Annales Mathematicae et Informaticae} book cover -- inside} 62 | 63 | % Text on the front cover (it is back of the inside book cover!) 64 | \bookcovercomponent{normal}{front}{ 65 | \vspace{27mm} 66 | \begin{center} 67 | \bfseries 68 | ANNALES MATHEMATICAE ET INFORMATICAE\\[3mm] 69 | International journal for mathematics and computer science\\[3mm] 70 | Referred by\\ 71 | Zentralblatt für Mathematik\\ 72 | and\\ 73 | Mathematical Reviews\\ 74 | \end{center} 75 | \bigskip 76 | \begin{center} 77 | \parbox{126mm}{ 78 | The journal of the Institute of Mathematics and Informatics of 79 | Eszterházy Károly University is open for scientific publications 80 | in mathematics and computer science, where the field of number 81 | theory, group theory, constructive and computer aided geometry 82 | as well as theoretical and practical aspects of programming 83 | languages receive particular emphasis. Methodological papers 84 | are also welcome. Papers submitted to the journal should be 85 | written in English. Only new and unpublished material can be 86 | accepted.} 87 | \end{center}} 88 | 89 | \end{bookcover} 90 | 91 | \end{document} -------------------------------------------------------------------------------- /ejemplo/notebook.txt: -------------------------------------------------------------------------------- 1 | Juan 2 | 3 | En el año 1993, yo estaba en tercer grado. Faltaba tiempo para que tenga mi 4 | primera computadora, pero ya me sentía atraído por esas máquinas blancas y 5 | luminosas, mezcla de electrodoméstico con máquina de escribir. Una vez a la 6 | semana teníamos clase de computación, tres alumnos por computadora. Uno 7 | manejaba el teclado, otro el mouse y el tercero miraba sobre los hombros de los 8 | otros dos. 9 | 10 | En mi pueblo había dos escuelas. Casi no conocía a los chicos que iban a la 11 | otra. Un domingo al mediodía, viendo el noticiero local, conocí a uno de esos 12 | desconocidos. Se llamaba Juan. El televisor lo mostraba sentado en una silla de 13 | ruedas; tenía los dedos doblados y hablaba con dificultad mientras se babeaba 14 | un poco. La entrevista se debía a que algún funcionario provincial le había 15 | regalado una computadora. Juan le mostraba a la periodista un juego en el que 16 | un pequeño dinosaurio se movía en la pantalla poniendo huevos explosivos. Lo 17 | odié. A Juan no parecía importarle ni la silla, ni sus dificultades, ni mi 18 | odio. En su cara, bajo un par de lentes grasosos, brillaba una enorme sonrisa. 19 | 20 | Cinco años después, empecé la secundaria. En mi pueblo, había un solo 21 | secundario. El primer día, nos juntaron a los de las dos escuelas, nos 22 | mezclaron y nos dividieron en dos cursos. Cuando me senté por primera vez en mi 23 | pupitre, al otro lado del salón, en la primera fila, sobre ruedas cromadas y 24 | con una \emph{notebook} del tamaño de mi carpeta, estaba Juan, con la misma 25 | sonrisa que había visto por televisión. Para ese entonces, yo ya tenía mi 26 | computadora en casa y me sabía unos cuantos trucos, pero una \emph{notebook} 27 | todavía era algo raro de ver. Así que fingí amistad para poder usarle la 28 | computadora en los recreos. 29 | 30 | Una mañana, la profesora de Lengua entró al salón con el semblante muy serio. 31 | Las otras profesoras, nos informó, se habían quejado de los muchos «horrores» 32 | ortográficos que tenía nuestro curso. Por lo tanto, desde ese día, los primeros 33 | veinte minutos de cada clase se iban a dedicar al dictado de palabras que luego 34 | ella corregiría. 35 | 36 | ---Cierren las carpetas, saquen una hoja y escriban ---dijo y empezó el dictado 37 | sin siquiera darnos tiempo a abuchear el anuncio---: Decisión, azotea, exento, 38 | agazapado, alférez, hosco, delgadez, exequias, habichuela, helénico, hinojo, 39 | ignífugo, ínfulas, levadizo, licencia. 40 | 41 | Luego de cada palabra, la profesora hacía una pausa para que Juan terminara de 42 | tipear. Escribía lento, a razón de una palabra por minuto. Apuntaba a cada 43 | letra con uno de sus largos dedos y luego dejaba caer todo su peso, cual 44 | péndulo humano. Volvía a tomar carrera y repetía el proceso. Luego punto y 45 | \emph{enter}. 46 | 47 | Cuando terminó el dictado, la profesora pasó por los bancos recogiendo las 48 | hojas y señalando los errores más comunes. Cuando llegó a la \emph{notebook} de 49 | Juan, adoptando la pose de una madre piadosa, se arrodilló junto a él, dejando 50 | su rostro a la altura de la pantalla. En voz baja, leyó lo que Juan había 51 | tipeado. Cuando se incorporó, estaba notoriamente emocionada. 52 | 53 | ---Ni un error ---dijo la profesora, marcando con fuerza la palabra «un»---. 54 | Ustedes... ---y bamboleó un índice acusador--- deberían aprender de él ---y con 55 | un rápido movimiento de brazo señaló a Juan--- que, a pesar de todas sus 56 | limitaciones, se esfuerza y estudia todo los días. 57 | 58 | En ese momento no pude contenerme más y, con un ruido estridente de sifonazo de 59 | soda, se me escapó de entre los dientes parte de la carcajada que venía 60 | reteniendo. Para mí, no era ningún secreto que Juan tenía activado el corrector 61 | ortográfico. 62 | 63 | ---¿De qué se ríe, alumno? ---me soltó la profesora con enojo, casi incrédula 64 | de que me estuviera riendo del pobre compañero. 65 | 66 | Las palabras se me ahogaban y de los ojos me caían lágrimas. En uno de los 67 | relinchos, titánico esfuerzo por dejar de reírme para adentro, lo vi a Juan que 68 | desde atrás de la profesora, con un movimiento lento, se llevaba el dedo índice 69 | de la mano derecha sobre los labios. 70 | 71 | No pude traicionarlo y estoicamente acepté el castigo de ser enviado a la 72 | dirección. Desde ese día, Juan y yo somos amigos. 73 | -------------------------------------------------------------------------------- /gdocs2latex.gs: -------------------------------------------------------------------------------- 1 | // Based on http://github.com/mangini/gdocs2md 2 | 3 | function ConvertToSimpleLatex() { 4 | var numChildren = DocumentApp.getActiveDocument().getActiveSection().getNumChildren(); 5 | var text = ''; 6 | var attachments = []; 7 | 8 | // Walk through all the child elements of the doc. 9 | for (var i = 0; i < numChildren; i++) { 10 | var child = DocumentApp.getActiveDocument().getActiveSection().getChild(i); 11 | var result = processParagraph(i, child); 12 | if (result !== null) { 13 | if (result.text && result.text.length > 0) { 14 | text += result.text + '\n'; 15 | } 16 | } 17 | } 18 | 19 | attachments.push({'fileName': DocumentApp.getActiveDocument().getName() + '.txt', 'mimeType': 'text/plain', 'content': text}); 20 | 21 | MailApp.sendEmail(Session.getActiveUser().getEmail(), 22 | '[Automágica] ' + DocumentApp.getActiveDocument().getName(), 23 | 'Convertiste el adjunto a Latex simplificado para usar con Automágica (' + DocumentApp.getActiveDocument().getUrl() + ')' + 24 | '\n\nMás información en http://www.juanjoconti.com/automagica/\n', 25 | { 'attachments': attachments }); 26 | } 27 | 28 | // Process each child element (not just paragraphs). 29 | function processParagraph(index, element) { 30 | // First, check for things that require no processing. 31 | if (element.getNumChildren() == 0) { 32 | return null; 33 | } 34 | // TOC. 35 | if (element.getType() === DocumentApp.ElementType.TABLE_OF_CONTENTS) { 36 | return null; 37 | } 38 | 39 | // Set up for real results. 40 | var result = {}; 41 | var pOut = ''; 42 | var textElements = []; 43 | 44 | // Skip tables 45 | if (element.getType() === DocumentApp.ElementType.TABLE) { 46 | return null; 47 | } 48 | 49 | // Process various types (ElementType) 50 | for (var i = 0; i < element.getNumChildren(); i++) { 51 | var t = element.getChild(i).getType(); 52 | 53 | if (t === DocumentApp.ElementType.TEXT) { 54 | var txt = element.getChild(i); 55 | pOut += txt.getText(); 56 | textElements.push(txt); 57 | } 58 | } 59 | 60 | if (textElements.length == 0) { 61 | return result; 62 | } 63 | 64 | var prefix = findPrefix(element); 65 | var suffix = ''; 66 | if (prefix.lastIndexOf('\\', 0) === 0) { 67 | suffix = '}' 68 | } else if (prefix == '\n\n') { 69 | suffix = '\n\n' 70 | } 71 | 72 | var pOut = ''; 73 | for (var i = 0; i < textElements.length; i++) { 74 | pOut += processTextElement(textElements[i]); 75 | } 76 | 77 | result.text = prefix + pOut + suffix; 78 | 79 | return result; 80 | } 81 | 82 | // Add correct prefix to list items. 83 | function findPrefix(element) { 84 | var prefix=''; 85 | if (element.getType() === DocumentApp.ElementType.PARAGRAPH) { 86 | var paragraphObj = element; 87 | switch (paragraphObj.getHeading()) { 88 | case DocumentApp.ParagraphHeading.HEADING4: prefix+='\\subsection*{'; break; 89 | case DocumentApp.ParagraphHeading.HEADING3: prefix+='\\section*{'; break; 90 | case DocumentApp.ParagraphHeading.HEADING2: prefix+='\n\n'; break; 91 | case DocumentApp.ParagraphHeading.HEADING1: prefix+='\\part*{'; break; 92 | default: 93 | } 94 | } 95 | return prefix; 96 | } 97 | 98 | function processTextElement(txt) { 99 | if (typeof(txt) === 'string') { 100 | return txt; 101 | } 102 | 103 | var pOut = txt.getText(); 104 | if (!txt.getTextAttributeIndices) { 105 | return pOut; 106 | } 107 | 108 | var attrs = txt.getTextAttributeIndices(); 109 | var lastOff = pOut.length; 110 | 111 | for (var i = attrs.length - 1; i >= 0; i--) { 112 | var off = attrs[i]; 113 | if (txt.isBold(off)) { 114 | var d1 = '\\textbf{' 115 | var d2 = '}'; 116 | if (txt.isItalic(off)) { 117 | d1 = '\\textbf{\\textit{'; d2 = '}}'; 118 | } 119 | pOut = pOut.substring(0, off) + d1 + pOut.substring(off, lastOff) + d2 + pOut.substring(lastOff); 120 | } else if (txt.isItalic(off)) { 121 | pOut = pOut.substring(0, off) + '\\textit{' + pOut.substring(off, lastOff) + '}' + pOut.substring(lastOff); 122 | } 123 | lastOff=off; 124 | } 125 | if (pOut == '*') { 126 | pOut = '\\begin{center} * \\end{center}'; 127 | } 128 | return pOut; 129 | } 130 | -------------------------------------------------------------------------------- /cover/cover_template.tex: -------------------------------------------------------------------------------- 1 | \documentclass[12pt,spinewidth=var{SPINE_WIDTH},coverwidth=var{COVER_WIDTH},coverheight=var{COVER_HEIGHT},flapwidth=0cm]{bookcover} 2 | 3 | \usepackage[spanish]{babel} 4 | \usepackage[utf8x]{inputenc} 5 | \usepackage[T1]{fontenc} 6 | 7 | \newbookcovercomponenttype{center rotate}{ 8 | \parbox[t][\partheight][c]{\partwidth}{ 9 | \begin{center} 10 | \rotatebox[origin=c]{90}{#1} 11 | \end{center}}} 12 | \usepackage{contour,lipsum} 13 | \contourlength{1pt} 14 | \definecolor{lightbrown}{RGB}{176,88,0} 15 | var{DEFINED_COLORS} 16 | \colorlet{title}{var{TITLE_COLOR}} 17 | \begin{document} 18 | 19 | \begin{bookcover} 20 | 21 | % Background color on the whole cover 22 | \bookcovercomponent{color}{bg whole}{color=var{COVER_COLOR}} 23 | 24 | % Remark 25 | \bookcovercomponent{center}{above front}{ 26 | \color{blue}var{DESCRIPTION}} 27 | 28 | % Picture on the front, behind the title 29 | \bookcovercomponent{normal}{front}{ 30 | \vspace{var{IMAGE_VSPACE}} 31 | \centering 32 | \includegraphics[width=var{IMAGE_WIDTH}]{var{IMAGE_PATH}} 33 | \vfill 34 | \includegraphics[width=var{LOGO_WIDTH}]{var{LOGO_PATH}} 35 | \vspace{5mm}} 36 | 37 | % Text on the front cover 38 | \bookcovercomponent{normal}{front}{ 39 | \centering 40 | \vspace{var{AUTHOR_VSPACE}} 41 | \color{title}\Large\bfseries 42 | var{AUTHOR} 43 | \par 44 | \vspace{var{TITLE_VSPACE}} 45 | \color{title}\Huge\bfseries 46 | var{TITLE}} 47 | 48 | % Text on the spine 49 | \bookcovercomponent{center rotate}{spine}{ 50 | \color{title}\large 51 | var{TITLE} \hspace{var{SPINE_INTERTEXT_SPACE}} var{AUTHOR}} 52 | 53 | \bookcovercomponent{center}{spine}{ 54 | \vfill 55 | \includegraphics[width=var{SPINE_LOGO_WIDTH}]{var{SPINE_LOGO_PATH}} 56 | \vspace{2mm}} 57 | 58 | % Text on the back cover 59 | \bookcovercomponent{normal}{back}{ 60 | \centering 61 | \vspace{var{BACK_VSPACE}} 62 | \parbox{100mm}{\color{var{BACK_TEXT_COLOR}}var{BACK_TEXT}} 63 | \vfill 64 | %\parbox{100mm}{\color{var{BACK_TEXT_COLOR}}http://www.juanjoconti.com/automagica/} 65 | \vspace{5mm}} 66 | 67 | % Text and picture on the front flap 68 | \bookcovercomponent{normal}{front flap}{ 69 | \centering 70 | \vspace{20mm} 71 | \parbox{75mm}{\color{var{BACK_TEXT_COLOR}} 72 | Juanjo Conti es un escritor y programador nacido en Carlos Pellegrini, provincia de Santa Fe. Se graduó de Ingeniero en Sistemas de Información en la Facultad Regional Santa Fe, perteneciente a la Universidad Tecnológica Nacional, en el año 2008 y en 2012, obtuvo una maestría en la misma especialidad. Dedica su tiempo libre a la lectura y la escritura. 73 | Ha publicado los libros de relatos \textit{La máquina de los cuentos} (2010), \textit{Los Caballeros de la Rosa} (2012), \textit{Santa Furia }(2014), \textit{La prueba del dulce de leche} (2014) y \textit{Carne de los dioses} (2016), y la novela \textit{Xolopes} (2014). 74 | Es el principal desarrollador del software libre Automágica. 75 | Actualmente vive en la ciudad de Santa Fe con su esposa y trabaja como programador y consultor. 76 | 77 | \vspace{1cm} 78 | 79 | 80 | Blog: http://www.juanjoconti.com/\\ 81 | Mail: jjconti@gmail.com\\ 82 | Twitter: @jjconti\\ 83 | 84 | }} 85 | 86 | % Text on the back flap 87 | \bookcovercomponent{normal}{back flap}{ 88 | \vspace{20mm} 89 | \includegraphics[width=50mm]{var{LOGO_PATH}} 90 | \parbox{75mm}{\color{var{BACK_TEXT_COLOR}} 91 | \vspace{1cm} 92 | Automágica es un software libre que toma los originales de un autor escritos en un procesador de texto y genera en forma automática los archivos de tapas e interiores en el formato necesario para que el libro sea enviado a imprenta. 93 | Consta de una interfaz gráfica, en la que se pueden definir variables generales como el título, el nombre del autor, el tamaño de página, el tamaño de letra. Y otras más específicas como el color de la tapa, el ancho de lomo, el texto de la contratapa, el texto de las solapas y la imagen de la cubierta. 94 | También da la flexibilidad necesaria para que usuarios avanzados puedan realizar cambios de diseño no contemplados en la interfaz. 95 | El programa corre en diferentes sistemas operativos y se encuentra en activo desarrollo. 96 | 97 | \vspace{1cm} 98 | 99 | Más información:\\ 100 | http://www.juanjoconti.com/automagica/ 101 | }} 102 | 103 | \end{bookcover} 104 | 105 | \end{document} -------------------------------------------------------------------------------- /ejemplo_2/yumiko.txt: -------------------------------------------------------------------------------- 1 | Yumiko 2 | 3 | Yumiko nació en Kodaira, al oeste de Tokio. Su mamá servía mesas en un gran comedor, junta a la planta principal de una compañía multinacional de neumáticos. Así, comentandole cual era el menú del día, la mamá de Yumiko conoció a quién sería su esposo. 4 | Yumiko creció sin hermanos y realizó en la ciudad sus estudios primarios y secundarios. A la hora de elegir una universidad, optó por estudiar medicina en la Universidad de Tokio. 5 | Un año antes de obtener su título, conoció a un joven que estudiaba literatura en la misma universidad. El joven la invitó a viajar como mochileros por sudamérica y Yumiko, desoyendo el consejo de sus padres, aceptó maravillada. 6 | Su vuelo los dejó en Río de Janeiro y luego de pasar pocos días en la ciudad volaron a Cuzco, donde realmente empezaba su viaje. Caminaban durante el día y acampaban en la noche. Yumiko no hablaba español, pero su compañero sí y se encargaba de hacer las compras de provisiones o de boletos para cuando querían recorrer distancias mayores a las que su ritual de caminar-acampar les permitía. 7 | El joven describía la naturaleza en sus versos mientras que Yumiko registraba en su cuaderno toda la información que obtenía de los pobladores locales sobre plantas medicinales. 8 | En las calles de Potosí una mujer con ropas coloridas pero el rostro cobrizo vendía un extraño ungüento a base a una planta del lugar que, según decía, sanaba cualquier dolor de los huesos. Yumiko, a través de su compañero-traductor, le insistió en que le revele el nombre de aquella planta pero la mujer, cuyas palabras eran apenas audibles, era un muro infranqueable para las acotadas palabras que el muchacho manejaba. 9 | Habían pasado tres meses de su llegada al continente cuando abandonaron Bolivia para adentrarse en Chile. Recorrieron la cordillera durmiendo en posadas de pequeños pueblos ya que las bajas temperaturas ponían en jaque a su carpa. Los pocos ahorros que habían llevado eran reforzados ofreciendo los servicios de enfermería de Yumiko y en una de sus escalas obtuvieron una buena cantidad de dinero pintando por completo una casa. 10 | Una mañana en que el sol rompía en haces púrpuras contra un lago, cruzaron la frontera con el objetivo de empezar a subir en lo que sería la segunda parte de su viaje. 11 | Habían comprado una bicicleta doble y con ella recorrían una ruta hacia el norte, cuando un camión los embistió en lo cerrado de la noche. 12 | Yumiko fue la única que sobrevivió al accidente. Su compañero y el camionero cerraron los ojos para siempre esa noche pero ella los volvió a abrir catorce meses después. 13 | Cuando despertó no recordaba nada. A eso se sumaba el problema de que no conocía el idioma. Los datos que se pudieron recuperar del accidente eran mínimos: su nombre y ciudad de origen en una credencial de la universidad. También se encontró un pasaje de vuelta a Japón que ya había vencido cuando ella despertó. Hubo algunos escasos y burocráticos intentos diplomáticos por devolverla a su país pero nunca se concretaron. Se logró una comunicación con sus padres, pero eran ancianos y no tenían dinero como para buscarla o repatriarla. 14 | Cuando estuvo lista para abandonar el hospital, sus autoridades se encontraban en la disyuntiva de qué hacer con ella. Entonces, la familia del camionero se presentó y se ofreció a recibirla en su casa mientras continuaba con sus rehabilitación y recuperaba la memoria. 15 | Así fue que durante el siguiente año, Yumiko no solo volvió a caminar y recuperó poco a poco la memoria, sino que también aprendió a hablar español. 16 | En la casa vivía la madre y la hermana del camionero. Ahora eran tres mujeres que se acompañaban en el día a día. 17 | Cuando Yumiko estuvo sana y fuerte, llamó a sus padres. Les dijo que no iba a volver. Quería devolver con su vocación algo a esa tierra que le había salvado la vida. 18 | En cada aniversario del día que Yumiko abandonó el hospital, las tres mujeres hacían un pequeño festejo, como si de su cumpleaños se tratara y Yumiko soplaba una vela sobre una pequeña torta. 19 | La madre y la hermana trabajaban cosiendo y lavando ropa. Durante dos años Yumiko hizo lo mismo que ellas durante el día. Durante la noche cursaba la carrera de enfermería. Cuando consiguió su título oficial, se presentó en el mismo hospital donde había permanecido en coma durante catorce meses y entregó su solicitud de trabajo en la recepción. 20 | Trabajó en la institución hasta que se jubiló. Y cuando lo hizo, siguió trabajando como cuidadora de ancianos. 21 | Una noche, el viejo de los microondas fue internado en el lugar. Yumiko fue designada para cuidarlo. En otra iteración de esta historia, el viejo le dijo lo que sentía por ella. 22 | -------------------------------------------------------------------------------- /automagica-cover.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | # https://en.wikibooks.org/wiki/LaTeX/Colors 5 | 6 | from __future__ import division, print_function, unicode_literals 7 | 8 | 9 | import argparse 10 | import os 11 | import sys 12 | import imp 13 | 14 | 15 | from pdf import generate_pdf 16 | from template import latex_env 17 | from utils import filepath, show_file 18 | 19 | 20 | def add_color(value, colors): 21 | color_name = 'color_{}'.format(len(colors)) 22 | colors.append('\definecolor{{{}}}{}'.format(color_name, value)) 23 | return color_name 24 | 25 | 26 | def main(): 27 | parser = argparse.ArgumentParser() 28 | parser.add_argument('--BASE_FILENAME', default='tapa', metavar="Nombre base de los archivos generados") 29 | parser.add_argument('book_path', help='Carpeta dónde se genera la salida.', metavar='Carpeta', default='ejemplo') 30 | parser.add_argument('--TITLE', default='Xolopes', metavar="Título") 31 | parser.add_argument('--AUTHOR', default='Juanjo Conti', metavar="Autor") 32 | parser.add_argument('--COVER_WIDTH', default='12cm', help="Ancho de la tapa. Ej: 12cm.") 33 | parser.add_argument('--COVER_HEIGHT', default='20cm', help="Ancho del lomo. Ej: 20cm.") 34 | parser.add_argument('--SPINE_WIDTH', default='7mm', help="Ancho del lomo. Ej: 10mm.") 35 | parser.add_argument('--SPINE_INTERTEXT_SPACE', default='2cm', help="Separación en el lomo. Ej: cmm.") 36 | parser.add_argument('--TITLE_COLOR', default='{RGB}{176,216,241}', help='Color del título y el nombre del autor.') 37 | parser.add_argument('--TITLE_VSPACE', default='20mm', help="Espacio vertical antes del título. Ej: 20mm.", 38 | metavar='Espacio vertical título') 39 | parser.add_argument('--AUTHOR_VSPACE', default='20mm', help="Espacio vertical antes del nombre del autor. Ej: 20mm.", 40 | metavar='Espacio vertical autor') 41 | parser.add_argument('--COVER_COLOR', default='black', help="Color de fondo de la tapa.") 42 | parser.add_argument('--IMAGE_WIDTH', default='8cm', help="Ancho de la imagen de tapa. Ej: 8cm.", 43 | metavar='Ancho de la imagen') 44 | parser.add_argument('--IMAGE_PATH', help='Imagen de tapa.', metavar='Imagen', default='ejemplo/imagen.jpg') 45 | parser.add_argument('--LOGO_WIDTH', default='3cm', help="Ancho del logo de la editorial. Ej: 4cm.", 46 | metavar='Ancho del logo') 47 | parser.add_argument('--LOGO_PATH', help='Logo de la editorial.', metavar='Logo',default='cover/figures/automagica-celeste.png') 48 | parser.add_argument('--SPINE_LOGO_PATH', help='Logo de la editorial para el lomo.', metavar='Logo en lomo', default='cover/figures/logo-celeste.png') 49 | parser.add_argument('--SPINE_LOGO_WIDTH', help='Ancho del logo de la editorial para el lomo.', default='3mm') 50 | parser.add_argument('--IMAGE_VSPACE', default='90mm', help="Espacio vertical antes de la imagen de tapa. Ej: 90mm.", 51 | metavar='Espacio vertical imagen') 52 | parser.add_argument('--BACK_TEXT', help='Texto de la contratapa.', metavar='Contratapa', default='ejemplo/contratapa.txt') 53 | parser.add_argument('--BACK_TEXT_COLOR', default='{RGB}{176,216,241}', help='Color del texto de la contratapa.') 54 | parser.add_argument('--BACK_VSPACE', default='20mm', help="Espacio vertical antes del texto de contratapa. Ej: 20mm.", 55 | metavar='Espacio vertical contratapa') 56 | args = parser.parse_args() 57 | book_path = args.book_path 58 | 59 | 60 | if not os.path.isdir(book_path): 61 | print('El argumento debe ser un directorio') 62 | exit() 63 | config_file = os.path.join(book_path, 'config_cover.py') 64 | if os.path.isfile(config_file): 65 | config = imp.load_source('config', config_file) 66 | else: 67 | config = imp.load_source('config', 'config_cover.py') 68 | 69 | VARS = {} 70 | VARS.update(config.CONFIGS) 71 | if 'BACK_TEXT' in VARS: 72 | with open(VARS['BACK_TEXT'], 'r') as back_text_file: 73 | VARS['BACK_TEXT'] = back_text_file.read() 74 | else: 75 | VARS['BACK_TEXT'] = '' 76 | new_colors = [] 77 | for k, v in VARS.items(): 78 | if v: 79 | if v.startswith('{gray}') or v.startswith('{rgb}') or v.startswith('{RGB}')or v.startswith('{HTML}') or v.startswith('{cmyk}'): 80 | VARS[k] = add_color(v, new_colors) 81 | 82 | 83 | VARS['DEFINED_COLORS'] = '\n'.join(new_colors) 84 | 85 | TEMPLATE = os.path.join('cover', 'cover_template.tex') 86 | local_template_path = os.path.join(book_path, 'cover_template.tex') 87 | if os.path.isfile(local_template_path): 88 | template = latex_env.from_string(open(local_template_path).read()) 89 | else: 90 | template = latex_env.get_template(TEMPLATE) 91 | 92 | base_filename = VARS['BASE_FILENAME'] 93 | VARS['DESCRIPTION'] = VARS['BASE_FILENAME'].title() 94 | tex_file = filepath(book_path, base_filename, 'tex') 95 | 96 | with open(tex_file, 'w') as f: 97 | f.write(template.render(**VARS)) 98 | 99 | pdf_file = generate_pdf(book_path, base_filename, tex_file) 100 | show_file(pdf_file) 101 | 102 | if __name__ == '__main__': 103 | main() -------------------------------------------------------------------------------- /ejemplo/fantasmas.txt: -------------------------------------------------------------------------------- 1 | Sobre la existencia de los fantasmas 2 | 3 | Una noche de verano en mi pueblo, cuando yo tenía quince años, salí con dos amigos, 4 | como hacíamos todos los sábados. Nos estábamos entusiasmando 5 | con el alcohol, por lo que el plan era sentarse en la mesa de un bar para ver 6 | quién aguantaba más. No queríamos ir a alguno de los bares de la calle 7 | principal porque siempre encontrábamos a algún amigo de nuestros padres 8 | y temíamos que nos delate. La cobardía, entonces, nos llevó a rumbear 9 | por barrios con calles menos asfaltadas y luminosas. 10 | 11 | Hicimos base en un sucucho de la calle Mazzini cerca de la ruta, conocido 12 | como «el bar de Alemandri». Empezaba a llover, así que nos mandamos para 13 | una de las mesas del fondo. Mis laderos pidieron un porrón para 14 | compartir y yo, que no había aprendido a disfrutar de la amargura de la 15 | cerveza, pedí un «aperitivo» (en casa solía tomar un dedo de Gancia 16 | rebajado con soda). En esa ocasión, el mozo me sirvió un vaso repleto 17 | de Cinzano y al costado, clavó un pequeño sifón de soda con el que 18 | (según parecía, así era el ritual) tendría que ir completándolo a medida 19 | que tomaba. Recuerdo que le pregunté a ese viejo flaco si eso se tomaba 20 | puro y, después de reírse de mí con ganas, dijo que así lo tomaban los 21 | hombres. Mis amigos se descostillaban a carcajadas. 22 | 23 | Cuando ya había pasado una hora desde nuestra llegada y aún no había 24 | tomado dos dedos del brebaje, la puerta del boliche se abrió con fuerza 25 | por el viento. 26 | Uno de los parroquianos se levantó para cerrarla, pero, cuando estaba por 27 | hacerlo, un pie se lo impidió. Al pie lo seguía el ser más desagradable 28 | que hasta ese momento había visto en mi vida. Tendría unos sesenta y cinco años, 29 | lucía ropa vieja, o sucia, no sé, tenía el pelo largo, la piel se le veía 30 | grasosa y sus dientes estaban todos podridos. Se sentó en una mesa y pidió 31 | caña Legui. Algunos nos miramos, cómplices, y nos dijimos que no era de por allí. 32 | 33 | Volvimos a nuestra charla sobre fútbol; el mono Navarro Montoya acababa 34 | de hacer una atajada espectacular en el único televisor del antro. Era 35 | una repetición de hace unos años, pero la estábamos siguiendo como si 36 | fuese en vivo. 37 | 38 | Nos volvimos a percatar de su presencia cuando escuchamos los gritos. El 39 | forastero se había trenzado con el dueño del bar en una acalorada discusión 40 | sobre la existencia de los fantasmas. Lo escuché a Alemandri contar la 41 | historia de una tapera en un campo cercano: 42 | 43 | ---Todos los domingos a la noche 44 | se escucha el chirrido de una soga bajando un balde en el aljibe. Lo curioso 45 | es que en ese campo ya no hay aljibe, sino bombas eléctricas. Una familia, 46 | que trabajaba en ese campo y vivía en la tapera, contó que una vez, tras oír los 47 | ruidos, salieron a la noche y con una linterna vieron a un hombre ataviado 48 | con ropas del 1800 sacando agua con un balde de madera. A su lado, una mujer, 49 | supuestamente su esposa, lavaba la ropa y la colgaba para que se seque. 50 | 51 | El forastero bufó con ganas para que lo escuchen. 52 | 53 | ---¿Cómo pueden creer en esos cuentos? 54 | 55 | ---Ningún cuento, señor ---y Alemandri pronunció con desdeño la palabra 56 | «señor»---. Esto que relato me lo contó un primo mío, vecino del campo donde 57 | aparecen las ánimas. Le digo más, en una ocasión llegaron al pueblo dos 58 | misioneros. La tapera estaba desocupada y el dueño se las ofreció para 59 | pasar la noche. Era domingo. A la madrugada, encontraron a los hombres de 60 | Dios en la ruta haciendo dedo para irse. 61 | 62 | ---Habladurías ---dijo el forastero e hizo un gesto con la mano en el aire, 63 | como tratando de tumbar una mosca inexistente para restarle validez a la historia que el otro contaba. 64 | 65 | Entonces, el duelo, que hasta ese momento era solo de vozarrones, se convirtió 66 | también en un duelo de gestos. 67 | 68 | ---Escuchame, sabandija ---y mientras hablaba, el dueño del boliche, que había 69 | dejado de tratarlo de usted, sacudía el dedo índice como quien sacude la 70 | fusta antes de pegarle al caballo---. Vos no vas a venir a mi establecimiento 71 | a decirme qué es verdad y qué no. 72 | 73 | El sabandija lo apuntó con el mentón. 74 | 75 | ---Me imagino, entonces, que si tu 76 | primo es vecino ya habrás ido a la tapera un domingo a la noche a ver a 77 | los fantasmas. 78 | 79 | El cantinero enmudeció primero y tartamudeó después. 80 | 81 | ---Bueno... es que yo 82 | los domingos a la noche tengo el boliche repleto y una excursión paranormal 83 | es un lujo que no me puedo permitir. Además... además... esos de aquella 84 | mesa también los vieron. Fueron en camioneta a cazar palomas al monte que 85 | está atrás de la tapera. Se les hizo la noche y cuando volvían caminando, 86 | vieron la escena. Basta decir que dejaron la camioneta y volvieron al 87 | pueblo corriendo. 88 | 89 | Los dos de la esquina asintieron en silencio y ahora sí, 90 | Alemandri recuperó el color, sacó pecho y empezó a mover la cabeza 91 | esperando que el pelilargo, el aceitoso, el de los dientes podridos, 92 | responda. No lo hizo. El ganador de aquella discusión volvió a tomar la 93 | palabra. 94 | 95 | ---Entonces, ¿usted no cree en los fantasmas? 96 | 97 | ---Yo no ---dijo el forastero. Y tomando el último trago de caña, se evaporó 98 | ante nuestros ojos. 99 | 100 | 101 | -------------------------------------------------------------------------------- /automagica.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | from __future__ import division, print_function, unicode_literals 5 | 6 | 7 | import argparse 8 | import imp 9 | import glob 10 | import os 11 | import sys 12 | from datetime import datetime 13 | 14 | from epub import generate_epub 15 | from pdf import generate_pdf 16 | from pdf.booklet import generate_booklet 17 | from template import latex_env 18 | from utils import filepath, latex_hyphenation, latex_chapter, latex_single, show_file 19 | 20 | 21 | DEFAULTS = dict( 22 | INDEX_TITLE='Índice', 23 | HYPHENATION='', 24 | CONTENT='', 25 | ) 26 | 27 | 28 | def main(): 29 | parser = argparse.ArgumentParser() 30 | parser.add_argument('--BASE_FILENAME') 31 | parser.add_argument('book_path', help='Carpeta con archivos para un libro.', metavar='carpeta') 32 | parser.add_argument('--no-split', help='No separar párrafos.', action='store_true') 33 | parser.add_argument('--pdf', help='Genera la versión pdf del libro.', action='store_true') 34 | parser.add_argument('--booklet', help='Genera la versión booklet del pdf.', action='store_true') 35 | parser.add_argument('--epub', help='Genera la versión epub del libro.', action='store_true') 36 | parser.add_argument('--only_tex', help='Solo genera el archivo latex.', action='store_true') 37 | parser.add_argument('--sections', help='Usar secciones en lugar de capítulos como elemento principal.', action='store_true') 38 | parser.add_argument('--new_page_before_sections', help='Forzar página nueva en las secciones principales.', action='store_true') 39 | parser.add_argument('--TITLE') 40 | parser.add_argument('--SUBTITLE') 41 | parser.add_argument('--AUTHOR') 42 | parser.add_argument('--FONT_SIZE') 43 | parser.add_argument('--PAGE_SIZE') 44 | parser.add_argument('--YEAR') 45 | parser.add_argument('--URL') 46 | parser.add_argument('--exclude_index', action='store_true') 47 | parser.add_argument('--no_open', help='No intenta abrir el archivo para verlo.', action='store_true') 48 | args = parser.parse_args() 49 | book_path = args.book_path 50 | 51 | class EmptyConfig(object): 52 | pass 53 | 54 | if not os.path.isdir(book_path): 55 | print('El argumento debe ser un directorio') 56 | exit() 57 | config_file = os.path.join(book_path, 'config.py') 58 | if os.path.isfile(config_file): 59 | config = imp.load_source('config', config_file) 60 | else: 61 | config = imp.load_source('config', 'config.py') 62 | 63 | # TODO: ver precedencia de archivo config por sobre linea de comandos y valores por defecto (quizas tres pasos) 64 | VARS = DEFAULTS.copy() 65 | VARS.update(config.CONFIGS) 66 | #for k,v in args._get_kwargs(): 67 | # VARS[k] = v 68 | 69 | index_path = os.path.join(book_path, 'index.txt') 70 | 71 | # documentar esto, qué hace por defecto el programa con el texto cuando genera el pdf 72 | split_paragraphs = not VARS['no_split'] 73 | if os.path.isfile(index_path): 74 | with open(index_path, 'r') as f: 75 | content = '' 76 | for filename in f.readlines(): 77 | if VARS['no_split']: 78 | content += latex_chapter(os.path.join(book_path, filename).strip(), split_paragraphs) 79 | else: 80 | content += latex_single(os.path.join(book_path, filename).strip(), split_paragraphs, VARS['sections'], VARS['new_page_before_sections']) 81 | VARS['CONTENT'] = content 82 | else: 83 | text_files = [f for f in glob.glob(os.path.join(book_path, '*.txt')) if not f.endswith('words.txt')] 84 | if text_files: 85 | VARS['CONTENT'] = latex_single(text_files[0], split_paragraphs, VARS['sections'], VARS['new_page_before_sections']) 86 | 87 | # archivo con separación en sílabas para cortar palabras 88 | sep_path = os.path.join(book_path, 'words.txt') 89 | if os.path.isfile(sep_path): 90 | with open(sep_path, 'r') as f: 91 | hyphenation = '' 92 | for word in f.readlines(): 93 | hyphenation += latex_hyphenation(word.strip()) 94 | VARS['HYPHENATION'] = hyphenation 95 | 96 | TEMPLATE = 'template.tex' 97 | local_template_path = os.path.join(book_path, 'template.tex') 98 | if os.path.isfile(local_template_path): 99 | template = latex_env.from_string(open(local_template_path).read()) 100 | else: 101 | template = latex_env.get_template(TEMPLATE) 102 | 103 | base_filename = VARS['BASE_FILENAME'] 104 | tex_file = filepath(book_path, base_filename, 'tex') 105 | 106 | with open(tex_file, 'w') as f: 107 | f.write(template.render(**VARS)) 108 | 109 | if not args.only_tex: 110 | if args.pdf or not args.epub: 111 | pdf_file = generate_pdf(book_path, base_filename, tex_file) 112 | if not args.no_open: 113 | show_file(pdf_file) 114 | if args.booklet: 115 | output_file = filepath(book_path, base_filename, 'booklet.pdf') 116 | generate_booklet(pdf_file, output_file) 117 | if not args.no_open: 118 | show_file(output_file) 119 | if args.epub: 120 | generate_epub(book_path, base_filename, tex_file) 121 | epub_file = filepath(book_path, base_filename, 'epub') 122 | if not args.no_open: 123 | show_file(epub_file) 124 | 125 | 126 | if __name__ == '__main__': 127 | main() 128 | -------------------------------------------------------------------------------- /ejemplo/dentista.txt: -------------------------------------------------------------------------------- 1 | Visita al dentista 2 | 3 | Tengo doce años, o trece, o catorce. O tal vez, diez. Estoy en esa sala de 4 | espera de dos por uno, paredes blancas casi totalmente cubiertas de diplomas, 5 | asientos de cuerina que rechinan y revistero con ejemplares de la década 6 | anterior. 7 | 8 | Estoy solo, esperando. La sala tiene tres puertas. Una da a la calle y es por 9 | donde entré. La otra da al escritorio de la secretaria y la acabo de golpear. 10 | La tercera, desde la que viene un sonido agudo y eléctrico, el sonido de una 11 | pequeña rueda de piedra girando a muchas revoluciones, un sonido que se 12 | enciende y que se apaga a intervalos casi regulares, es la puerta que da al 13 | consultorio del dentista. 14 | 15 | Ahora se abre la segunda puerta, la de la secretaria. Liliana es joven y tiene 16 | rulos negros que siempre aparentan estar húmedos. Me dice que el doctor ya me 17 | va a atender, que cuando termine con la paciente que está viendo ahora, sigue 18 | conmigo. «Viendo». Un eufemismo. 19 | 20 | Tomo una de las revistas y paso, sin mirar, las páginas hasta llegar al final. 21 | Hasta las historietas. Hay una de Quino. Leo. Me río, pero no estoy seguro de 22 | que haya entendido del todo el chiste. Los chistes de Quino siempre tienen dos 23 | niveles. Uno superficial, con el que se puede reír hasta un chico de nueve años 24 | y otro, más profundo. Yo me concentro en esa otra parte. En tratar de entender 25 | el lado B del chiste. El lado que para ser comprendido necesita algo más que 26 | haber leído lo que dicen los personajes o haber visto el dibujo. A veces, se 27 | necesita que el lector haya leído cierto libro, o conozca tal pintura, o haya 28 | oído cierta noticia. 29 | 30 | Arranco la página con el chiste y me la guardo en el bolsillo de la campera. 31 | Estoy dejando la revista en su lugar cuando se abre la tercera puerta. Sale una 32 | mujer agarrándose la cara con la mano izquierda. Con la derecha, cierra tras de 33 | sí la puerta. 34 | 35 | ---Siguiente ---llaman con la voz de un dios mitológico unos segundos después. 36 | 37 | Abro la tercera puerta e ingreso a ese espacio luminoso en donde una multitud 38 | de herramientas filosas cuelgan expuestas, expectantes, esperando a ser 39 | utilizadas. Sin mediar palabra, me acuesto dócil en el asiento reclinado. 40 | 41 | Entonces me asalta un temor, una duda. ¿Me habrá visto el dentista cortar la 42 | hoja de la revista? 43 | 44 | Busco sus ojos. Los encuentro, penetrantes, ojos de dinamita que me miran 45 | detrás del barbijo. No necesito ver las muecas que pueda hacer con la boca. Con 46 | los ojos le alcanza para decirme que fue testigo del momento en que le robé la 47 | historieta y la guardé en el bolsillo de la campera. 48 | 49 | Intento levantarme pero no puedo. Estoy rodeado en su sillón por él en un 50 | flanco y por el brazo hidráulico que le sostiene las herramientas en el otro. 51 | 52 | Me unta la encía con una especie de gel y luego me apunta con una jeringa el 53 | lugar exacto que antes untó. Siento cómo la aguja se clava con fuerza y temo 54 | que la punta aparezca del lado de adentro de la boca. De la bandeja que 55 | sostiene el brazo hidráulico, toma un par de herramientas metálicas que 56 | tintinean entre sí y, en mi desesperación, en las notas producidas por el azar, 57 | descifro una melodía fúnebre. Ya no tengo dudas. Sabe de mi fechoría y me va a 58 | torturar hasta que confiese. Empieza con un gancho que parece un anzuelo de 59 | pescador y lo introduce entre dos muelas. 60 | 61 | ---¿Duele? ---me pregunta con sádico placer mientras escarba con el 62 | instrumento. 63 | 64 | Yo, que no puedo hablar por la anestesia, abro grandes los ojos y emito un 65 | sonido gutural para decirle que sí, que me duele. 66 | 67 | ---Vas a tener que aguantar ---me dice sin mirarme como única respuesta. Y con 68 | el pie acciona un interruptor que pone en funcionamiento una especie de torno 69 | de mano, su herramienta preferida. No puedo verlas, pero imagino que cuando el 70 | artefacto entra en contacto con mis dientes, una catarata de chispas saltan en 71 | el aire como si mi boca fuera la de un volcán en erupción. 72 | 73 | Trato de resistir. Clavo las uñas de las manos en los apoyabrazos de mi asiento 74 | y doblo los dedos de los pies tratando de mantenerme en la superficie de la 75 | Tierra. Nada es suficiente. 76 | 77 | Adivino una sonrisa de placer bajo el barbijo. Esa visión y el sonido de la 78 | rueda que gira sin parar rebotando contra mis dientes le ponen fin a mi 79 | resistencia. Exhalando, me doy por vencido y confieso. 80 | 81 | ---Fui yo, yo me robé el chiste de Quino ---. Pero las palabras no salen. 82 | Apenas un balbuceo que no logra atravesar las capas de saliva, sangre y dolor. 83 | 84 | La secretaria Liliana entra al consultorio y me ve tirado, sangrando, a medio 85 | camino entre la resistencia y la deshonra. Me doy vergüenza. 86 | 87 | Se acerca a donde estoy. Desde mi posición, solo puedo ver sus piernas. Hasta 88 | que se agacha y levanta algo del suelo. 89 | 90 | ---¿Esto es tuyo? 91 | 92 | Mi botín. La página con la historieta. A presencia de prueba, la confesión ya 93 | no es necesaria. 94 | 95 | ---¿Te gusta Quino? ---me pregunta el dentista, y se baja el barbijo para que 96 | le salgan mejor las palabras. 97 | 98 | Muerto de vergüenza ante la prueba que me condena, ya vencido, asiento con la 99 | cabeza. 100 | 101 | ---Si querés ---me dice---, cuando te vayas, fijate en el revistero. Creo que 102 | las revistas que están ahí tienen historietas de ese tipo. Llevate las que 103 | quieras. Y vos, Liliana, a ver si renovamos el catálogo, que ahí todavía hay 104 | revistas de cuando este era el consultorio de mi padre. 105 | 106 | -------------------------------------------------------------------------------- /ejemplo/paredon.txt: -------------------------------------------------------------------------------- 1 | Paredón 2 | 3 | Durante la escuela primaria, jugaba mucho al fútbol. Jugaba en los recreos de 4 | la escuela, en el club y en una canchita cerca de casa. A esa canchita iba en 5 | bici, una bici roja con calcomanías plateadas. La dejaba tirada y corría hasta 6 | donde el resto estaba pateando. Éramos siempre seis o siete. La mayoría, de la 7 | misma escuela; algunos un año más chicos, otros un año más grandes, y, de vez 8 | en cuando, algún que otro desconocido. Por lo general, pensábamos que los 9 | desconocidos no iban a la escuela, a ninguna, y eso les daba un aura de 10 | renegados, un halo de misterio que provocaba admiración y respeto. Si la 11 | pateaban lejos, no les hacíamos buscar la pelota. 12 | 13 | La canchita quedaba al lado de la casa del Sapo; era de tierra y tenía arcos 14 | que su abuelo había hecho con ramas secas atadas con alambre. Nunca conoció la 15 | gramilla. Jugábamos tanto que no le dábamos tiempo al pasto a crecer. Era un 16 | manto marrón violáceo con textura de talco. Parecía que jugábamos en una cancha 17 | de chocolate «El Quilla». 18 | 19 | El Sapo era nuestro mejor delantero. Era zurdo y tenía una pegada que hacía 20 | temblar el alambrado que estaba atrás de los arcos. Muchas veces, si pegaba en 21 | el palo, hacía que el travesaño se cayera. Teníamos que suspender el partido y 22 | arreglar el arco. El resto éramos de regular para abajo. Ninguno iba a llegar a 23 | primera nunca. Sin embargo, el Sapo... sí podría haber llegado. 24 | 25 | Una característica que tenía nuestro grupo era que carecía de arquero. A nadie 26 | le gustaba tener que encargarse de defender el arco. Seguramente por eso, uno 27 | de los juegos más comunes entre nosotros era el «veinticinco». Alguien al azar 28 | empezaba en el arco. Cada vez que atajaba un tiro, podía usar la pelota para 29 | intentar golpear a uno de los otros jugadores. Si lo conseguía sin que la 30 | pelota pique, el jugador golpeado se convertía en el nuevo arquero. La 31 | secuencia seguía hasta llegar a los veinticinco puntos en el marcador global, 32 | que se acumulaban a través de los goles que íbamos haciendo. Diferentes tipos 33 | de goles valían diferente cantidad de puntos. Por ejemplo, un gol normal con el 34 | pie valía uno, pero un gol de cabeza, cinco. Cuando se llegaba a los 35 | veinticinco puntos, quien estaba en el arco tenía que cumplir una prenda. La 36 | clásica era el capotón: la víctima se agachaba, tratando de cubrirse, mientras 37 | todos los demás le pegábamos en la espalda. 38 | 39 | Una de esas tantas tardes, el Sapo estaba en el arco y el puntaje acumulado era 40 | de veinticuatro. En total, éramos seis chicos jugando. Los que no estábamos en 41 | el arco, nos acercábamos tocando la pelota y cuando estábamos lo 42 | suficientemente cerca, pateábamos con la esperanza de hacer un gol. 43 | Inmediatamente después, retrocedíamos a toda velocidad para intentar evitar la 44 | embestida del arquero, que nos arrojaba con potencia la pelota. 45 | 46 | En un determinado momento, Fitipaldi, uno que era nuevo en la escuela, pasó a 47 | tener la pelota. No se animó a patear y me dio un pase muy cerca del área. El 48 | Sapo se me vino arriba y pateé como pude. El Sapo atrapó la pelota en el aire y 49 | antes de que pudiera reaccionar, me la lanzó con suavidad sobre el cuerpo. 50 | Estaba tan cerca que no pude esquivarla y en el intento, me caí. Ante las 51 | carcajadas de todos, tomé mi lugar en el arco con la pelota en la mano. La suma 52 | seguía en veinticuatro. 53 | 54 | Todos estaban a más de quince metros de distancia. Imposible alcanzarlos. De 55 | todas formas, lo intenté. Con fuerza, lancé la pelota con la mano derecha, 56 | apuntando vagamente al montón. Se abrieron. Algunos para la derecha, otros para 57 | la izquierda, y la pelota pasó picando entre ellos. 58 | 59 | En menos de un minuto, luego de otro pase de Fitipaldi, el Sapo pateó al arco 60 | de media distancia y me hizo el gol que sumó veinticinco. 61 | 62 | ---¡Veinticinco, capotón! ---gritó uno mientras yo iba tomando la posición 63 | adecuada para recibir el castigo. 64 | 65 | ---No, mejor no. Tengo otra prenda ---dijo el Sapo y a continuación, explicó el 66 | «paredón»---. El que tiene que cumplir la prenda se para de espalda a nosotros, 67 | mirando la pared. Ponemos la pelota a seis pasos largos y uno patea «a fundir» 68 | para pegarle en la espalda. 69 | 70 | ---¡Sí! ---vitorearon todos con entusiasmo. 71 | 72 | Yo no dije nada; estaba pensando en mis posibilidades. A diferencia del capotón 73 | en el que tenía la golpiza asegurada, en esta nueva modalidad tenía la 74 | posibilidad de salir ileso. Por supuesto, si me embocaban, el golpe sería más 75 | duro. 76 | 77 | ---¿Y quién patea? ---preguntó uno. 78 | 79 | ---El que metió el último gol ---respondió el Sapo. 80 | 81 | Me ubiqué sin chistar y me persigné varias veces repitiendo en silencio una 82 | jaculatoria. «Que le erre», pensaba para mis adentros. 83 | 84 | El sonido pareció uno, pero en realidad fue un repique rápido de tambor: el 85 | botín del Sapo en contacto con la pelota de cuero y una fracción de segundo 86 | después, el cuero de la pelota contra mi espalda. 87 | 88 | ---¡Uhhhhhhh! --- gritó el coro de espectadores que, en una onomatopeya, 89 | expresó lo que yo no pude. Casi tampoco podía respirar. Encorvado y con un 90 | brazo levantado pedía clemencia. 91 | 92 | Como no quería que me vean llorar, agarré la bicicleta y pedaleando rápido me 93 | volví a mi casa. Estaba transpirado y sucio de tierra. Apenas llegué, sin 94 | saludar a nadie, me metí en el baño. Me saqué la remera y mirando para atrás, 95 | me vi la espalda en el espejo. Tenía un círculo rojo perfectamente delimitado. 96 | Mi espalda parecía la bandera de Japón. Ya no me dolía el golpe, pero ahora 97 | sentía un ardor en la piel. Me bañé y no hablé con nadie sobre el asunto. 98 | 99 | Al otro día, con el dolor y la vergüenza casi olvidados, volví a la canchita. 100 | Además de los de siempre, había un chico nuevo. El Crema, me dijeron que se 101 | llamaba. 102 | 103 | Que hubiera uno nuevo era bueno. Todos nos complotábamos para hacerlo perder. 104 | Si no estaba en el arco, hacíamos que se acerque a él mediante falsas promesas 105 | de gol y lo traicionábamos a último momento. Cuando ya estaba en el arco, 106 | pateábamos de lejos sin importar que tardásemos en sumar. Así pasó esa tarde 107 | con el Crema. Cuando entró en el arco, no salió más. 108 | 109 | Veintidós. 110 | 111 | Veintitrés. 112 | 113 | Veinticuatro. 114 | 115 | Yo quería hacer el último gol. Y quería que le hagamos «paredón». Quería 116 | vengarme. No me importaba que el Crema no haya estado el día anterior. Solo 117 | quería darle un \emph{puntinazo} con fuerza a la pelota e incrustársela en la 118 | espalda. 119 | 120 | Veinticinco. 121 | 122 | Otra vez el Sapo, desde muy lejos, metió un zapatazo y cerró el juego. 123 | 124 | ---¿Qué eligen? ---dijo con la pelota bajo el brazo--- ¿capotón o paredón? 125 | 126 | ---¡Paredón! ---grité solo. Se ve que a los demás les daba lo mismo. 127 | 128 | El Crema, que conocía la prenda, se paró resignado mirando la pared. 129 | 130 | El Sapo depositó la pelota en el suelo y como si estuviera por ejecutar un 131 | penal, se paró dos metros atrás. Miró al Crema, miró la pelota. Volvió a mirar 132 | al Crema y luego volvió a mirar la pelota. Tomó carrera y cuando su pie impactó 133 | en el esférico, yo tenía una sonrisa endiablada y me felicité por no estar ahí, 134 | de espaldas, esperando el impacto. 135 | 136 | La pelota no le dio en la espalda. Le pegó en la cabeza. El Crema se quedó 137 | tirado en el piso. Quieto. 138 | -------------------------------------------------------------------------------- /ejemplo_2/programador.txt: -------------------------------------------------------------------------------- 1 | Historia del aprendiz de programador 2 | 3 | Juan Andrés llegó desde el pueblo con la idea romántica de convertirse en un programador de Software Libre. En la ciudad podría adquirir todos los conocimientos necesarios (iría a la universidad, asistiría a charlas y talleres) pero también podría ponerse en contacto con programadores de experiencia: auténticos hackers que trabajaban día a día mejorando software, manteniendo redes o configurando toda clase de equipamiento. 4 | Atrás quedaba el pequeño grupo de usuarios en el que a fuerza de leer revistas extranjeras exprimían el poco conocimiento al que podían acceder. En la ciudad también tendría la posibilidad de conectarse a Internet siempre que quisiera y, con eso, más conocimiento del que podría absorber. 5 | El primer día que llegó a la universidad recibió una pequeña hoja de papel con sus horarios y el carnet de la biblioteca. Guardó el carnet en la billetera y miró el cronograma. Eran las nueve de la mañana y su primera clase, Algoritmos y estructuras de datos, había empezado hacía cuarenta y cinco minutos. (Por un momento se arrepintió de haber elegido el turno mañana en lugar del turno tarde). Sin perder tiempo subió las escaleras y corrió por un largo pasillo mientras iba pasando por aulas numeradas: 12, 13, 14, 15. Esa era, aula 15. Cuando entró, ya todos los demás estaban sentados en sus lugares y un profesor canoso hablaba con una tiza en la mano. 6 | ---Llega tarde, alumno ---le dijo por todo saludo y apuntado con la tiza le indicó, cerca del fondo, el único banco libre del salón. 7 | El profesor, que se apellidaba Marina, continuó hablando y Juan Andrés alcanzó a anotar en su cuaderno la conclusión de aquella disertación: mientras más poderosas las estructuras de datos, más simples los algoritmos que tendrían que escribir. El corolario lógico de eso era que ante un problema, uno no debía, como primer paso, saltar a escribir código a toda velocidad sino tomarse un tiempo para evaluarlo y pensar cuál sería la mejor estructura de datos para resolverlo. Una vez que se había decidido eso, el algoritmo para terminar de darle solución al problema se revelaba solo, ante el programador, de una forma casi mágica. 8 | ---¿Qué lenguaje vamos a usar en esta clase? ---le preguntó Juan Andrés a Gonzalo, el muchacho que estaba sentado junto a él. 9 | ---C. Pero yo prefiero este ---dijo el otro. Y sacó de su mochila un ejemplar original de Programming Pearl, con el famoso dibujo del dromedario en la tapa. 10 | Juan Andrés tomó nota mental de encargar una copia de ese libro en la fotocopiadora más tarde. 11 | ---Es un poco complicado ---siguió Gonzalo---, pero mucho más dinámico. Y mirá esto. 12 | Mientras Marina seguía hablando, Gonzalo abrió el libro en una de las primeras páginas y señaló: estas son, según Larry Walls, las tres virtudes de los programadores: pereza, impaciencia e hibris. Pereza: cuando tenés que hacer algo por una segunda vez, antes de hacerlo preferís escribir un programa que lo haga por vos; esa y todas las veces siguientes. Es lo que hace que escribas programas que ahorren trabajo y escribas documentación para no tener que responder una y otra vez la misma pregunta. Impaciencia: cuando ese programa que escribiste corre demasiado lento, lo optimizás para que corra más rápido. 13 | ---¿Y qué es Hibris? 14 | ---Orgullo excesivo o ego desmesurado. Es una palabra griega. Es lo que hace que quieras publicar programas en internet para que otros vean tu código. Programas tan bien escritos que nadie pueda quejarse de ellos. ¡Aunque lograr esto último es imposible! ¡Jaja! 15 | ---En resumen… ---dijo Juan Andrés que se había quedado un poco perdido. 16 | ---Que los programadores somos haraganes, impacientes y arrogantes. 17 | ---¿Somos? ¿Vos ya sabés programar? 18 | Gonzalo se rió. 19 | ---Desde hace unos cinco años. Trabajo programando en la empresa de mi papá. 20 | Le dijo su nombre y le tendió la mano. 21 | Volvieron a darse la mano cuando un par de meses después decidieron formar equipo para resolver el trabajo práctico de la materia. La propuesta del profesor era desarrollar una hoja de cálculo desde cero; tendrían que elegir una estructura de datos a utilizar (¿una matriz?, ¿listas doblemente enlazadas?, ¿árboles binarios?) y escribir los algoritmos necesarios para que un usuario pueda realizar las operaciones de guardar un valor o una fórmula en una celda y leer el valor de una celda. La dificultad recaía en que una fórmula podía hacer referencia a otras celdas de la hoja de cálculo y los algoritmos de lectura debería tener esto en cuenta a la hora de leer un valor (¿calcularían cada valor cuando sea requerido o irían guardado los valores precalculados en alguna estructura de datos intermedia?). Muchas eran las preguntas y poco el tiempo para responderlas: tres semanas después debían entregar el trabajo y defenderlo. 22 | Juan Andrés no había mudado su computadora desde el pueblo así que todos los días, después del cursado, se juntaban en la casa de Gonzalo a trabajar. Gonzalo tenía su computadora en la pieza, así que podían quedarse trabajando hasta tarde, sin ser interrumpidos. Todos los días, a eso de las diez de la noche, la madre de Gonzalo tocaba la puerta y entraba con una bandeja con sándwiches o alguna otra cosa que se pueda comer rápido. Este sistema les funcionó durante las primeras dos semanas, pero en la tercera notaron que el tiempo se les iba acabando y aún no habían completado las funcionalidades requeridas, mucho menos habían podido probar en forma exhaustiva el programa, por lo que decidieron seguir trabajando en las computadoras de la facultad durante las horas libres y durante las horas de materias más aburridas. 23 | La facultad contaba con un laboratorio de diez computadoras del cual los alumnos podían disponer libremente previa obtención de un turno. Por lo general no había mucha demanda y siempre que llegaban a la sala solo tenían que firmar una planilla y sentarse en alguna de las computadoras desocupadas. Insertaban con mucho cuidado el disquete que tenía la última versión de su trabajo y se ponían a trabajar. Tipeaba uno u el otro en forma indistinta, su estilo de programación era similar por lo que no caían en las todas peleas de los programadores por el formato del código y los dos tenían conocían de principio a fin el programa. Eso sería útil para la defensa, ya que el profesor podría preguntar a cualquiera de los dos por cualquier parte del código. Cuando tenían que irse, se mandaban una copia del trabajo por mail y pisaban la versión del disquete; así y todo, a veces podían encontrarse nombres de archivo conviviendo como: VERSION-FINAL.zip, VERSION-FINAL-2.zip, VERSION-FINAL-3.zip, VERSION-FINAL-ULTIMA.zip, VERSION-FINAL (esta si es la versión final).zip. 24 | El jueves, luego de clases, se fueron a la casa de Gonzalo a dar los últimos retoques a su trabajo. Si bien solo faltaban algunos detalles de la interfaz de usuario, se quedaron despiertos toda la noche, haciendo pequeños ajustes y modificaciones. “¿Qué tal si le ponemos un menú desplegable?”, “Podríamos permitir pintar celdas de colores”, “¡Vamos a hacer que cuando el usuario apriete tal combinación de teclas se ejecute tal funcionalidad!”. La noche pasó entre Coca-Cola y cambios y se cumplió la Ley neumática de la programación. Esta ley dice que el trabajo que tiene que hacer un programador se comporta igual que un gas en un recipiente; donde el recipiente es el tiempo que el programador tiene para completar la tarea. El trabajo se expandirá para ocupar todo el tiempo. 25 | El viernes a la mañana, si no hubiese sido por la madre de Gonzalo, se hubiesen quedado dormidos. Cuando los despertó, faltaban veinte minutos para el horario de la entrega. Corrieron con el mentado disquete en la mano y justo cuando llegaban a la esquina también lo hacía el colectivo que tenían que tomar. Luego de quince minutos eternos, se bajaron en la puerta de la facultad y llegaron corriendo al aula 15. Cuando entraron estaba vacía. ¿Ya se habían ido todos? Deshicieron sus pasos y en la puerta encontraron un papel pegado: “Nos trasladamos al aula 21”. Eso quedaba en el otro ala de la facultad así que volvieron a correr. Cuando estaban llegando, ahora sí, se encontraron con otros alumnos. Ya todos habían entregado sus trabajos y debían esperar a que sean revisados para luego defenderlos. Un jefe de trabajos prácticos los vió llegar y les pidió su entrega. Le entregaron el disquete y una copia impresa de su trabajo. Ahora solo había que esperar. 26 | Aprovecharon el tiempo de espera para charlar con algunos compañeros. Hasta ese día, todos habían sido muy celosos de su implementación y no habían compartido con miembros de otros grupos las decisiones que habían tomado, pero ahora la suerte estaba echada, todos habían alcanzado, de alguna forma, el objetivo planteado (si no no estarían ahí) y el clima relajado que eso generaba, propiciaba el intercambio. No sabían cuánto tiempo habían esperado, cuando el jefe de trabajos prácticos los hizo pasar. 27 | Marina los saludó por su apellido y, con un gesto difícil de descifrar, se sacó los anteojos y los volvió a mirar. 28 | ---¿Qué vamos a hacer con ustedes? 29 | Los compañeros no sabían a qué se refería. 30 | ---Tengo dos trabajos exactamente iguales. Uno es el de ustedes y el otro es de un grupo del turno tarde. 31 | ---¡¿QUÉ?! ---Gonzalo saltó de su silla. 32 | ---No puede ser, no puede ser ---se repetía Juan Andrés más para sí mismo que para los otros---. Tiene que haber un error. 33 | ---No hay error. Se lo puedo mostrar si quieren: los nombres de las variables son distintos y algunas funciones están cambiadas de lugar, pero es obvio que uno es una copia del otro. Al menos que… 34 | ---¿Al menos que qué? ---se apresuró a preguntar Juan Andrés. 35 | ---A menos que no hayan cumplido la consigna y lo hayan hecho entre cuatro. 36 | ---No, nos lo tienen que haber copiado ---dijo Gonzalo sin un atisbo de duda en su voz. 37 | ---Los del otro grupo dicen lo mismo ---concluyó el profesor---. Así que vamos a hacer la defensa en conjunto. Confío en que los autores originales van a poder explicar el programa mucho mejor que los ladrones. 38 | ---¡Eso seguro! ---Gonzalo habló confiado. 39 | ---Muy bien ---dijo por fin el profesor---. Salgan un momento y luego vamos a llamar a ambos grupos. 40 | Los compañeros abandonaron el aula con un sabor agrio en la boca. ¿Cómo podía haber pasado eso? ¿Podría alguien haberse metido en la computadora de Gonzalo para robarles el trabajo? No, eso era ridículo. Alguien con esas habilidades podría haber resuelto sin esfuerzo el trabajo. Tenía que ser otra cosa. Entonces, al mismo tiempo, ambos llegaron a la misma conclusión: las computadoras públicas. No estaban seguros de, todas las veces, haber borrado el trabajo luego de copiarlo al disquete. 41 | -------------------------------------------------------------------------------- /ejemplo_2/consumo.txt: -------------------------------------------------------------------------------- 1 | Un bien más para el consumo 2 | 3 | Hoy lo escuché en las noticias. 4 | Sé que en otros países ya se puede, pero pensé que me iba a morir antes de que lo permitieran acá. 5 | De los viajes en el tiempo se sabe desde hace más de cinco años. El primer viaje publicitado fue en Estados Unidos, durante un programa de televisión. Los encargados de la demostración fueron dos militares. Uno se llamaba John y el otro Carl pero me voy a referir a ellos como Juan y Carlos, para que me sea más fácil contarles la anécdota. 6 | Primero salió un paper en una revista científica y en menos de dos meses ya había grupos de investigación en todo el mundo trabajando (ahí fue cuando lo vi en un diario de aca). En algunos artículos, además de los enunciados teóricos que todos repiten pero casi nadie entiende, se describían experimentos. Recuerdo incluso el recuadrito con la formula esa: la copiaban y pegaban como si fuera un elemento de decoración. Todos los artículos del tema incluían la fórmula: ni siquiera la volvían a escribir, la copiaban y la pegaban como una imagen más, como si fuera una foto. 7 | La de la fórmula podría ser una historia en sí misma: pasó a ser un elemento de cultura pop: una vez la vi escrita con aerosol en una pared. 8 | Se estuvo hablando del tema como un año hasta que por fin se anunció una demostración pública. La propaganda empezó un mes antes, inundando todos los medios de comunicación. No podías ver la hora en tu reloj sin que te salte uno de esos cartelitos: “27 de febrero, primer demostración pública de viaje en el tiempo”. Era en el prime time norteamericano pero acá era de tarde. Un rato antes de la hora, me senté frente a la pantalla. En el centro del estudio, sentados en dos sillones, bien al estilo de los programas de entrevistas de los años dos mil, estaban Juan y Carlos. Los dos de verde musgo. 9 | Entonces el conductor del programa, vestido en un traje azul cansino, entró con un micrófono de mano y saludó al público. El micrófono de mano era más bien un detalle de los ochenta, pero no desentonaba en esa puesta en escena estrafalaria. El hecho de que hubiera público en una emisión, también era totalmente anacrónico, pero supongo que la mezcla habrá logrado el objetivo que buscaban los productores de aquel evento. 10 | “¡Muy buenas noches, América! ¡Muy buenas noches, mundo!”, gritó el conductor y una catarata de gritos y aplausos estremeció el lugar. “Estamos aquí con el sargento Juan y el cabo Carlos, quienes serán los encargados de poner en práctica un ejercicio de libro de viaje en el tiempo. Podría por favor, sargento Juan, contarnos en qué consiste el experimento. ¿Está bien que lo llame así, experimento?”. 11 | Juan habló serio, con voz grave: “sí, cómo no, señor, le explico. En primer lugar una pequeña corrección. Tiene razón en dudar del término. Lo que vamos a realizar aquí no es un experimento ya que no es un procedimiento mediante el cual se trate de comprobar una hipótesis relacionada con un determinado fenómeno, sino que lo que vamos a hacer es ejecutar un ejercicio controlado en el cual tanto las acciones como los resultados son fijos. Lo que haremos aquí tendrá consecuencias que se conocen de antemano. Sus efectos han sido medidos y se ha determinado que su ejecución es segura. El viaje en el tiempo es una ciencia en desarrollo y debe ser utilizada con estricto cuidado y con rigurosa supervisión.” 12 | “Entendido... sargento Juan”, y el conductor hizo una especie de venia ridícula. “Cuéntenos entonces, ahora sí, en qué consistirá la ejecución del ejercicio controlado” y mencionó las últimas cuatro palabras de un modo sutilmente diferente, como si no le hubiese gustado para nada la desacreditación en cámara. El sargento Juan no hizo caso y explicó: 13 | “El ejercicio consiste en lo siguiente: esto que tengo aquí en mi muñeca, con forma de reloj, es un dispositivo construido en base a la teoría original más muchos desarrollos propios que ha hecho el gobierno…” 14 | “La fórmula”, interrumpió el conductor, diciéndole con solemnidad esa palabra a la vez genérica y vacía. 15 | “Sí”, sentenció Juan, mientras que con la mirada le decía que no quería ser interrumpido. 16 | “Voy a viajar media hora al pasado y voy a encontrarlo al cabo Carlos solo en su camarín. Sabemos que él va a estar solo, nos hemos asegurado de eso. Si bien yo estoy preparado psicológicamente para encontrarme conmigo mismo, no hay razón para forzar ese momento incómodo. Apenas lo encuentre voy a raparle la cabeza y luego voy a regresar”. 17 | Y entonces, apretó algo en su reloj y desapareció. El estudio pareció congelarse. El público se quedó en silencio. El conductor también, aunque tenía la boca abierta y el micrófono apuntando a ella. 18 | Dos minutos después, Juan reapareció y siguió hablando: “Como se habrán dado cuenta, el ejercicio ya tuvo lugar”. 19 | Vi en la pantalla cómo el público abucheaba. Yo también lo hice. Carlos había tenido la cabeza rapada desde el momento que se sentó en el sillón. Lo único que el sargento Juan había hecho era un truco de desaparición de prestidigitador de ferias. 20 | El conductor, más confundido que enojado, hizo un gesto con las manos hacia el público para intentar calmarlos. Cuando el clamor bajó, el sargento Juan siguió hablando: 21 | “Alguien podría pensar que el resultado exitoso de un ejercicio como este sería que el cabo Carlos hubiera entrado con una enorme cabellera y que se volviera pelado en un abrir y cerrar de ojos ante ustedes.” 22 | Una risa incómoda recorrió el lugar. 23 | “Creanlo o no, algo así es lo que viví desde mi perspectiva. Cuando entramos con el cabo Carlos, él realmente tenía mucho más pelo que ahora. Yo viajé al pasado y lo rapé, pero desde la perspectiva de ustedes, él estuvo rapado todo el tiempo desde que ingresó porque lo rapé antes de que entráramos. A la realidad que se genera luego de un viaje en el tiempo, la llamamos iteración. Si antes de mi viaje estábamos viviendo en la iteración N, ahora estamos en la iteración N + 1”. 24 | Yo debí haber puesto la misma cara de desconcierto que el conductor. 25 | La disconformidad del público aumentó y lo hizo saber. 26 | “Tranquilidad, por favor”, gritó el conductor. “Tengo entendido que los militares va a realizar una segunda demostración”. 27 | “Así es”, dijo Carlos, tomando la palabra por primera vez en la noche. “Esta segunda prueba tendrá un impacto visual y calmará un poco las ansias. Voy a meter esta lapicera en esta caja y la voy a colocar aquí en el centro. Ahora me voy a dar vuelta por veinte segundos. Luego voy a viajar al pasado a robarme la lapicera y traerla de regreso”. Cerró la caja, se dió vuelta y empezó a contar. 28 | “Uno, dos, tres…” 29 | “¡Holly shit!” gritó el conductor. 30 | “¡La puta que lo parió”, grité yo. 31 | El sargento Juan sonreía. 32 | El cabo Carlos seguía contando tranquilo de espaldas: “...cinco, seis…”. 33 | Y otro Carlos entró al estudio, frente a todas las cámaras y todo el público, en puntas de pie. Todo el mundo gritaba y este se llevaba un dedo a los labios para pedirles silencio. Parecía un mimo y con sus gestos se burlaba de su otro yo que contaba de espaldas. Luego, con la misma suavidad con la que se movía, destapó la caja, sacó la lapicera y la volvió a cerrar. Con exagerados gestos se la llevó al bolsillo de la camisa y luego, nuevamente con una sobreactuada forma de caminar en puntas de pie, salió tras bambalinas. 34 | El primer cabo Carlos terminó de contar y se dio vuelta. “¡Ya vuelvo!”, gritó y tocó algo en su muñeca. Desapareció y a los veinte segundos exactos volvió a aparecer en el mismo lugar. Se llevó la mano al bolsillo de la camisa y mostró la lapicera. No hizo falta que vuelva a abrir la caja. Habíamos entendido. 35 | Un grupo de personas irrumpió con violencia intentando robarle los relojes a los uniformados. Yo miraba la pantalla de pie. Entonces más uniformados entraron en escena y luego la transmisión se cortó. Caí sentado en mi sillón, tratando de procesar lo que había visto. Y recordando, recordando una promesa que me había hecho muchos años atrás. 36 | Al día siguiente los medios daban cuenta de lo que había sido la transmisión. En la redacción, podía no diferir mucho de otros experimentos o experiencias o ejercicios (el nombre es lo de menos) que habían sido descritos antes. Pero el efecto era distinto. Ahora era algo un poco más real. Ya no era teoría. 37 | De aquella primera demostración pública pasaron ya casi cuatro años. El resto es historia conocida: celebrities experimentando viajes y contando su experiencia a todo el mundo a través de las pantallas, anuncios del gobierno, las leyes que se proclamaron y luego lo inevitable: las manifestaciones. En todas las capitales del mundo y en ciudades más chicas también, las personas se concentraban exigiendo a sus gobernantes que esa tecnología estuviera disponible. Un bien más para el consumo. 38 | Los primeros fueron Estados Unidos y Alemania. Acá solo nos llegaban las publicidades. Me acuerdo de una particularmente famosa en la que se mostraba a un hombre de unos treinta y cinco años corriendo por un campo en China. El mismo hombre tomaba un vuelo, después corría por un aeropuerto y tomaba otro, después un tren, después un bus, después un taxi, siempre con la misma música punzante de fondo y el tic-tac de un reloj apenas perceptible. La publicidad terminaba cuando el hombre entraba corriendo a un hospital, abriendo con fuerza puertas blancas que se abrían al medio, una, dos, tres, hasta llegar a una cama vacía. La imagen se fundía a blanco y un mensaje en letras azules era proyectado: “Dé ese último abrazo”. 39 | Con el tiempo, los videos de las celebrities se hundieron en las pantallas y en su lugar flotaron más alto videos publicados por personas comunes contando sus historias, mostrando sus pequeños souvenirs, inofensivos objetos, como un autito de colección cuya obtención había sido autorizada. Lo más común era despedirse de familiares que habían muerto, pero también había historias más raras, como la de ese que usó sus cinco minutos en viajar al 22 de junio del año 1986, Argentina-Inglaterra, minuto 55 para ver cuando Maradona convertía el mejor gol de la historia. Por supuesto, cuando alguien lograba que le autoricen una originalidad como esa, muchas otras personas lo imitaban y cuando se llenaba de gente, ya nadie podía volver ahí. 40 | Desde mañana se van a poder tramitar solicitudes de viaje en el tiempo. 41 | 42 | Solo un mes después del anuncio pude acceder al sistema para solicitar mi viaje. Antes era imposible, todo estaba saturado. Sospecho que se trató de una saturación artificial. Un mecanismo impulsado por los poderosos para poder viajar primero. Una especie de primera clase. Pasa en los recitales, en los partidos de fútbol. ¿Por qué no iba a pasar con esto? Un mes entero esperé. Solo después de ese tiempo el sistema empezó a responder, a reaccionar, y los que no teníamos contactos, los caminantes, los que no nos acomodábamos, pudimos acceder. 43 | -------------------------------------------------------------------------------- /ejemplo_single/contenido.txt: -------------------------------------------------------------------------------- 1 | Sobre la existencia de los fantasmas 2 | 3 | 4 | Una noche de verano en mi pueblo, cuando yo tenía quince años, salí con dos amigos, como hacíamos todos los sábados. Nos estábamos entusiasmando con el alcohol, por lo que el plan era sentarse en la mesa de un bar a ver quién aguantaba más. No queríamos ir a alguno de los bares de la calle principal porque siempre encontrábamos a algún amigo de nuestros padres y temíamos que nos delate. La cobardía, entonces, nos llevó a rumbear por barrios con calles menos asfaltadas y luminosas. 5 | Hicimos base en un sucucho de la calle Mazzini cerca de la ruta, al que todos llaman “el bar de Alemandri”. Empezaba a llover, así que nos mandamos para una de las mesas del fondo. Mis laderos pidieron un porrón para compartir y yo, que no había aprendido a disfrutar de la amargura de la cerveza, pedí un “aperitivo” (en casa solía tomar un dedo de Gancia rebajado con soda). En esa ocasión, el mozo me sirvió un vaso repleto de Cinzano y al costado, clavó un pequeño sifón de soda con el que (según parecía, así era el ritual) tendría que ir completándolo a medida que tomaba. Recuerdo que le pregunté a ese viejo flaco y huesudo si eso se tomaba puro y, después de reírse de mí con ganas, dijo que así lo tomaban los hombres. Mis amigos se descostillaban a carcajadas. 6 | Cuando ya había pasado una hora desde nuestra llegada y aún no había tomado dos dedos del brebaje, la puerta del boliche se abrió por la fuerza del viento. Uno de los parroquianos se levantó a cerrarla, pero, al intentar hacerlo, un pie se lo impidió. Al pie lo seguía el ser más desagradable que hasta ese momento había visto en mi vida. Habrá tenido unos sesenta y cinco años, lucía ropa vieja, o sucia, no sé, tenía el pelo largo, la piel se le veía grasosa y sus dientes estaban todos podridos. Se sentó en una mesa y pidió caña Legui. Algunos nos miramos, cómplices, y nos dijimos que no era de por allí. 7 | Volvimos a nuestra charla sobre fútbol; el mono Navarro Montoya acababa de hacer una atajada espectacular en el único televisor del antro. Era una repetición de unos años atrás, pero la estábamos siguiendo como si fuese en vivo. 8 | Nos volvimos a percatar de la presencia del hombre cuando oímos los gritos. El forastero se había trenzado con el dueño del bar en una acalorada discusión sobre la existencia de los fantasmas. Lo escuchamos a Alemandri contar la historia de una tapera en un campo cercano: 9 | —Todos los domingos a la noche, se oye el chirrido de una soga bajando un balde en el aljibe. Lo curioso es que en ese campo ya no hay aljibe, sino bombas eléctricas. Una familia, que trabajaba allí y vivía en la tapera, contó que una vez, tras oír los ruidos, salieron a la noche y con una linterna iluminaron a un hombre ataviado con ropas del 1800 que sacaba agua con un balde de madera. A su lado, una mujer, supuestamente su esposa, lavaba la ropa y la colgaba para que se seque. 10 | El forastero bufó con ganas, para que lo escuchen. 11 | —¿Cómo pueden creer en esos cuentos? 12 | —Ningún cuento, señor —y Alemandri pronunció con desdeño la palabra “señor”—. Esto que relato me lo contó un primo mío, vecino del campo donde aparecen las ánimas. Le digo más; en una ocasión llegaron al pueblo dos misioneros. La tapera estaba desocupada y el dueño se las ofreció para pasar la noche. Era domingo. A la madrugada encontraron a los hombres de Dios en la ruta haciendo dedo para irse. 13 | —Habladurías —dijo el forastero e hizo un gesto con la mano en el aire, como tratando de espantar una mosca inexistente, para restarle validez a la historia que el otro contaba. 14 | Entonces, el duelo, que hasta ese momento era solo de vozarrones, se convirtió también en un duelo de gestos. 15 | —Escuchame, sabandija —y mientras hablaba, el dueño del boliche, que había dejado de tratarlo de usted, sacudía el dedo índice como quien sacude la fusta antes de pegarle al caballo—. Vos no vas a venir a mi establecimiento a decirme qué es verdad y qué no. 16 | El sabandija lo apuntó con el mentón. 17 | —Me imagino, entonces, que si tu primo es vecino ya habrás ido a la tapera un domingo a la noche a ver a los fantasmas. 18 | El cantinero enmudeció primero y tartamudeó después. 19 | —Bueno… es que yo los domingos a la noche tengo el boliche repleto y una excursión paranormal es un lujo que no me puedo permitir. Además… además… esos de aquella mesa también los vieron. Fueron en camioneta a cazar palomas al monte que está detrás de la tapera. Se les hizo la noche y cuando regresaban caminando, vieron la escena. Basta decir que dejaron la camioneta y volvieron al pueblo corriendo. 20 | Los dos de la esquina asintieron en silencio y ahora sí, Alemandri recuperó el color, sacó pecho y empezó a mover la cabeza esperando que el pelilargo, el aceitoso, el de los dientes podridos, responda. No lo hizo. El ganador de aquella discusión volvió a tomar la palabra. 21 | —Entonces, ¿usted no cree en los fantasmas? 22 | —Yo no —dijo el forastero. Y tomando el último trago de caña, se evaporó ante nuestros ojos. 23 | 24 | El hombre que soñó con su gato 25 | 26 | 27 | Un hombre terminó de cenar, lavó los platos y sacó a su gato al patio para luego irse a dormir. 28 | Mientras dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 29 | Mientras soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 30 | Mientras soñaba que soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 31 | Mientras soñaba que soñaba que soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 32 | La secuencia se repitió cien veces durante la noche. 33 | Cuando se despertó a la mañana siguiente, casi se desmaya cuando vio lo que había en la cocina. 34 | 35 | Barba 36 | 37 | 38 | El 19 de diciembre de 1994, antes de acostarme, me miré en el espejo del baño. En el reflejo, un hombre con una barba frondosa, arbórea, selvática, me miraba. Los pelos se extendían en infinitas ramificaciones oscuras que me cubrían todo el rostro, dejando, apenas, ver los ojos. Ojos pardos y barba negra con algún destello rojizo. Me lavé los dientes y me acosté. 39 | Cuando me desperté al otro día y fui al baño a lavarme la cara, un rostro rasurado, lustroso, brillante, me encandilaba desde el reflejo. Ya no había ni barba negra, ni destello rojizo. Sin embargo, el recuerdo del día anterior, con el rostro lobuno, estaba muy vivo en mi memoria. ¿Lo habría soñado? ¿Me habría despertado sonámbulo a rasurarme? Si hubiese sido al revés, podría concluir que estuve dormido varios meses, pero no fue así. ¿O sí? Estas y otras cosas me pregunté esa mañana. Recuerdo bien la fecha porque ese día cumplí diez años. 40 | 41 | Joel 42 | 43 | 44 | El primer recuerdo que tengo de Joel es en el club San Martín. Blanco y pecoso. Muy pecoso. Tiene una remera rayada y pantalones cortos por los que se deslizan sus piernas flaquitas. También blancas, pero no pecosas. Lo tengo agarrado de la remera rayada y con la otra mano sostengo un palito que en la punta tiene caca. Y yo tengo caca en mi remera blanca. No lo recuerdo claramente, pero supongo que Joel me debe de haber manchado. No recuerdo claramente ese punto, pero sí recuerdo un sentimiento de ojo por ojo. 45 | Joel me dice que si lo mancho, me pega una piña. Alrededor, una veintena de chicos de nuestra edad. No me acuerdo si es un cumpleaños o una clase de gimnasia. Debe de ser un cumpleaños porque tenemos edad de primaria y recién en la secundaria empezamos a tener clases de gimnasia en los clubes del pueblo. 46 | El club San Martín es un predio enorme con distintos sectores bien diferenciados: el edificio, la cancha de básquet, la pileta, la cancha de fútbol y el parque. Nosotros estamos en el parque, entre el quincho y una cancha de volley playero. 47 | —Me manchás y te pego una piña. 48 | La veintena de chicos alienta a que concrete el acto y, como tocándolo con una varita mágica, acerco lentamente el palito con caca hasta que hace contacto con su remera a rayas. 49 | ¡Pum! Me sienta de una piña y los ojos se me humedecen enseguida. Me quiero largar a llorar, pero aguanto como puedo. Los otros chicos empiezan a empujar a Joel, le gritan cosas, lo insultan, le dicen “testigo de Jehová”, confundiendo su religión, porque Joel es evangelista. 50 | Lo siguiente que recuerdo es llegar a mi casa llorando y abrazar a mi mamá. 51 | 52 | Naranjas para don Bordesio 53 | 54 | 55 | En invierno, después de juntar naranjas en el patio, doña Magdalena envía a su hija Florencia con una bolsa repleta de esos tesoros dulces para su vecino de enfrente, don Bordesio. 56 | —¿Cómo vas a salir con los pelos así? —le dice la mamá y la sienta frente al espejo para peinar su cabello rubio y hacerle dos trenzas, una a cada costado. 57 | En julio cumple catorce años. Florencia, con sus trenzas, cruza la calle. El sol de un día cálido de invierno le da de lleno en las piernas blancas que deja ver su jardinero rojo y las calienta. 58 | Entra por la puerta de atrás, sin tocar timbre. La mosquitera rechina, da un golpe y rebota un poco para terminar cerrándose. En la cocina de don Bordesio, un ventilador de techo gira en cámara lenta y una brisa casi imperceptible pero reconfortante se le cuela por el cuello de la remera. En la habitación, a bajo volumen pero imposible de no notar, suena un viejo disco de jazz. La niña, o ex niña, la muchachita, lo conoce de memoria. 59 | El hombre cano de tez morena y tantos lunares como un cielo estrellado está sentado en su sillón, con sus anteojos oscuros. Los de siempre. Reconoce su aroma, su fragancia, antes de que ella hable. Aunque esté mezclada con la de las flores de azahar. Cuando le dice que le trae el regalo de su madre, sonríe y la llama. Con manos ásperas pero movimientos suaves, le acaricia el rostro para saludarla. 60 | Las paredes de la casa están descascaradas, pintadas de un amarillo oscuro que deja ver el color anterior bajo sus cicatrices. De una de las paredes cuelga una foto en blanco y negro. En la foto se ve a un hombre joven montado a caballo, alegre. 61 | La muchacha, que aprendió el ritual de niña y no lo cuestiona, sabe perfectamente lo que ocurrirá. Ella le sacará los anteojos para descubrir un par de ojos blancos y muertos que él rápidamente cerrará y ella besará. Él le desabotonará el jardinero rojo, que caerá pesado junto a los pies de medias con puntilla y zapatitos de charol. Un dedo firme dibujará placeres en el algodón que solo toca la madre de Florencia cuando lava su ropa interior. 62 | —Hoy podés bajarme la bombacha. 63 | Don Bordesio lo hace con manos nerviosas hasta llegar al jardinero rojo. Florencia levanta un pie y luego el otro. Da un paso al frente y se sienta en la rodilla del hombre. Una pierna de cada lado. Esas piernas que unos minutos antes el sol calentaba, ahora tienen temperatura propia. 64 | —Haceme caballito. 65 | Don Bordesio empieza a mover la pierna hacia arriba y hacia abajo, rápido, haciendo toda la fuerza con el pie, como cuando de más chica la hacía jugar. 66 | Tímidos sonidos salen de la boca de la niña, o ex niña, la muchachita, la casi mujer, que siente el par de manos deslizarse por la espalda, bajo la remera, y suben hasta la hebilla, que se desprende y libera aún más su cuerpo. 67 | Los sonidos ya no son tan tímidos y don Bordesio hace los coros de aquel canto sin dejar de hacerle caballito. 68 | En invierno, después de juntar naranjas de sus árboles, doña Magdalena envía a su hija Florencia con una bolsa repleta de esos tesoros dulces para su vecino de enfrente, don Bordesio. En otoño, le manda pan casero o buñuelos. Naranjas, pan casero, buñuelos, chocolates, una torta, perejil, tomates, hojas de aloe, pantallas de lo que en verdad le está enviando. 69 | -------------------------------------------------------------------------------- /tests_data/index_excluded.tex: -------------------------------------------------------------------------------- 1 | \documentclass[11pt,twoside,openright]{book} 2 | 3 | \usepackage[a5paper,hmarginratio={3:2},bottom=0.8in,top=0.8in]{geometry} 4 | 5 | \usepackage{times} 6 | \usepackage[Lenny]{fncychap} 7 | 8 | \usepackage[spanish]{babel} 9 | \usepackage[utf8x]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | 12 | \usepackage{mathptmx} 13 | \usepackage{etoolbox} 14 | 15 | \usepackage[titles]{tocloft} 16 | 17 | \usepackage{pdfpages} 18 | 19 | \usepackage{courier} 20 | 21 | \renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} 22 | 23 | % change the space before the titles 24 | \makeatletter 25 | \patchcmd{\@makechapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 26 | \patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 27 | \makeatother 28 | 29 | % change the space after the titles 30 | \renewcommand{\DOTI}[1]{% 31 | \raggedright 32 | \CTV\FmTi{#1}\par\nobreak 33 | \vskip 10pt} 34 | \renewcommand{\DOTIS}[1]{% 35 | \raggedright 36 | \CTV\FmTi{#1}\par\nobreak 37 | \vskip 10pt} 38 | 39 | 40 | \title{TITLE} 41 | \author{AUTHOR} 42 | \date{} 43 | 44 | 45 | 46 | % Avoid widows and orphans 47 | \widowpenalty=10000 48 | \clubpenalty=10000 49 | 50 | \begin{document} 51 | 52 | \pagenumbering{gobble} 53 | 54 | \pagestyle{plain} 55 | 56 | 57 | % IF PRINT 58 | %\includepdf{empty.pdf} 59 | %\includepdf{empty.pdf} 60 | 61 | \maketitle 62 | 63 | \cleardoublepage 64 | 65 | \thispagestyle{empty} 66 | \noindent 67 | Edición automágica, 2016.\\ 68 | 69 | \vspace{0.5cm} 70 | 71 | \noindent 72 | \emph{TITLE} lleva la licencia 73 | \emph{Creative Commons Attribution - NonCommercial - ShareAlike 4.0 Iternational}. 74 | Esto significa que podés compartir esta obra y crear obras derivadas 75 | mencionando al autor, pero no ha\-cer un uso comercial de ella. 76 | 77 | \vfill 78 | 79 | \noindent 80 | %Más información sobre este libro:\\ 81 | \\ 82 | 83 | \cleardoublepage 84 | 85 | 86 | 87 | \pagenumbering{arabic} 88 | 89 | 90 | 91 | 92 | 93 | \chapter*{Sobre la existencia de los fantasmas} \addcontentsline{toc}{chapter}{Sobre la existencia de los fantasmas} 94 | 95 | 96 | 97 | 98 | 99 | Una noche de verano en mi pueblo, cuando yo tenía quince años, salí con dos amigos, como hacíamos todos los sábados. Nos estábamos entusiasmando con el alcohol, por lo que el plan era sentarse en la mesa de un bar a ver quién aguantaba más. No queríamos ir a alguno de los bares de la calle principal porque siempre encontrábamos a algún amigo de nuestros padres y temíamos que nos delate. La cobardía, entonces, nos llevó a rumbear por barrios con calles menos asfaltadas y luminosas. 100 | 101 | Hicimos base en un sucucho de la calle Mazzini cerca de la ruta, al que todos llaman “el bar de Alemandri”. Empezaba a llover, así que nos mandamos para una de las mesas del fondo. Mis laderos pidieron un porrón para compartir y yo, que no había aprendido a disfrutar de la amargura de la cerveza, pedí un “aperitivo” (en casa solía tomar un dedo de Gancia rebajado con soda). En esa ocasión, el mozo me sirvió un vaso repleto de Cinzano y al costado, clavó un pequeño sifón de soda con el que (según parecía, así era el ritual) tendría que ir completándolo a medida que tomaba. Recuerdo que le pregunté a ese viejo flaco y huesudo si eso se tomaba puro y, después de reírse de mí con ganas, dijo que así lo tomaban los hombres. Mis amigos se descostillaban a carcajadas. 102 | 103 | Cuando ya había pasado una hora desde nuestra llegada y aún no había tomado dos dedos del brebaje, la puerta del boliche se abrió por la fuerza del viento. Uno de los parroquianos se levantó a cerrarla, pero, al intentar hacerlo, un pie se lo impidió. Al pie lo seguía el ser más desagradable que hasta ese momento había visto en mi vida. Habrá tenido unos sesenta y cinco años, lucía ropa vieja, o sucia, no sé, tenía el pelo largo, la piel se le veía grasosa y sus dientes estaban todos podridos. Se sentó en una mesa y pidió caña Legui. Algunos nos miramos, cómplices, y nos dijimos que no era de por allí. 104 | 105 | Volvimos a nuestra charla sobre fútbol; el mono Navarro Montoya acababa de hacer una atajada espectacular en el único televisor del antro. Era una repetición de unos años atrás, pero la estábamos siguiendo como si fuese en vivo. 106 | 107 | Nos volvimos a percatar de la presencia del hombre cuando oímos los gritos. El forastero se había trenzado con el dueño del bar en una acalorada discusión sobre la existencia de los fantasmas. Lo escuchamos a Alemandri contar la historia de una tapera en un campo cercano: 108 | 109 | —Todos los domingos a la noche, se oye el chirrido de una soga bajando un balde en el aljibe. Lo curioso es que en ese campo ya no hay aljibe, sino bombas eléctricas. Una familia, que trabajaba allí y vivía en la tapera, contó que una vez, tras oír los ruidos, salieron a la noche y con una linterna iluminaron a un hombre ataviado con ropas del 1800 que sacaba agua con un balde de madera. A su lado, una mujer, supuestamente su esposa, lavaba la ropa y la colgaba para que se seque. 110 | 111 | El forastero bufó con ganas, para que lo escuchen. 112 | 113 | —¿Cómo pueden creer en esos cuentos? 114 | 115 | —Ningún cuento, señor —y Alemandri pronunció con desdeño la palabra “señor”—. Esto que relato me lo contó un primo mío, vecino del campo donde aparecen las ánimas. Le digo más; en una ocasión llegaron al pueblo dos misioneros. La tapera estaba desocupada y el dueño se las ofreció para pasar la noche. Era domingo. A la madrugada encontraron a los hombres de Dios en la ruta haciendo dedo para irse. 116 | 117 | —Habladurías —dijo el forastero e hizo un gesto con la mano en el aire, como tratando de espantar una mosca inexistente, para restarle validez a la historia que el otro contaba. 118 | 119 | Entonces, el duelo, que hasta ese momento era solo de vozarrones, se convirtió también en un duelo de gestos. 120 | 121 | —Escuchame, sabandija —y mientras hablaba, el dueño del boliche, que había dejado de tratarlo de usted, sacudía el dedo índice como quien sacude la fusta antes de pegarle al caballo—. Vos no vas a venir a mi establecimiento a decirme qué es verdad y qué no. 122 | 123 | El sabandija lo apuntó con el mentón. 124 | 125 | —Me imagino, entonces, que si tu primo es vecino ya habrás ido a la tapera un domingo a la noche a ver a los fantasmas. 126 | 127 | El cantinero enmudeció primero y tartamudeó después. 128 | 129 | —Bueno… es que yo los domingos a la noche tengo el boliche repleto y una excursión paranormal es un lujo que no me puedo permitir. Además… además… esos de aquella mesa también los vieron. Fueron en camioneta a cazar palomas al monte que está detrás de la tapera. Se les hizo la noche y cuando regresaban caminando, vieron la escena. Basta decir que dejaron la camioneta y volvieron al pueblo corriendo. 130 | 131 | Los dos de la esquina asintieron en silencio y ahora sí, Alemandri recuperó el color, sacó pecho y empezó a mover la cabeza esperando que el pelilargo, el aceitoso, el de los dientes podridos, responda. No lo hizo. El ganador de aquella discusión volvió a tomar la palabra. 132 | 133 | —Entonces, ¿usted no cree en los fantasmas? 134 | 135 | —Yo no —dijo el forastero. Y tomando el último trago de caña, se evaporó ante nuestros ojos. 136 | 137 | 138 | 139 | 140 | 141 | \chapter*{El hombre que soñó con su gato} \addcontentsline{toc}{chapter}{El hombre que soñó con su gato} 142 | 143 | 144 | 145 | 146 | 147 | Un hombre terminó de cenar, lavó los platos y sacó a su gato al patio para luego irse a dormir. 148 | 149 | Mientras dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 150 | 151 | Mientras soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 152 | 153 | Mientras soñaba que soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 154 | 155 | Mientras soñaba que soñaba que soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 156 | 157 | La secuencia se repitió cien veces durante la noche. 158 | 159 | Cuando se despertó a la mañana siguiente, casi se desmaya cuando vio lo que había en la cocina. 160 | 161 | 162 | 163 | 164 | 165 | \chapter*{Barba} \addcontentsline{toc}{chapter}{Barba} 166 | 167 | 168 | 169 | 170 | 171 | El 19 de diciembre de 1994, antes de acostarme, me miré en el espejo del baño. En el reflejo, un hombre con una barba frondosa, arbórea, selvática, me miraba. Los pelos se extendían en infinitas ramificaciones oscuras que me cubrían todo el rostro, dejando, apenas, ver los ojos. Ojos pardos y barba negra con algún destello rojizo. Me lavé los dientes y me acosté. 172 | 173 | Cuando me desperté al otro día y fui al baño a lavarme la cara, un rostro rasurado, lustroso, brillante, me encandilaba desde el reflejo. Ya no había ni barba negra, ni destello rojizo. Sin embargo, el recuerdo del día anterior, con el rostro lobuno, estaba muy vivo en mi memoria. ¿Lo habría soñado? ¿Me habría despertado sonámbulo a rasurarme? Si hubiese sido al revés, podría concluir que estuve dormido varios meses, pero no fue así. ¿O sí? Estas y otras cosas me pregunté esa mañana. Recuerdo bien la fecha porque ese día cumplí diez años. 174 | 175 | 176 | 177 | 178 | 179 | \chapter*{Joel} \addcontentsline{toc}{chapter}{Joel} 180 | 181 | 182 | 183 | 184 | 185 | El primer recuerdo que tengo de Joel es en el club San Martín. Blanco y pecoso. Muy pecoso. Tiene una remera rayada y pantalones cortos por los que se deslizan sus piernas flaquitas. También blancas, pero no pecosas. Lo tengo agarrado de la remera rayada y con la otra mano sostengo un palito que en la punta tiene caca. Y yo tengo caca en mi remera blanca. No lo recuerdo claramente, pero supongo que Joel me debe de haber manchado. No recuerdo claramente ese punto, pero sí recuerdo un sentimiento de ojo por ojo. 186 | 187 | Joel me dice que si lo mancho, me pega una piña. Alrededor, una veintena de chicos de nuestra edad. No me acuerdo si es un cumpleaños o una clase de gimnasia. Debe de ser un cumpleaños porque tenemos edad de primaria y recién en la secundaria empezamos a tener clases de gimnasia en los clubes del pueblo. 188 | 189 | El club San Martín es un predio enorme con distintos sectores bien diferenciados: el edificio, la cancha de básquet, la pileta, la cancha de fútbol y el parque. Nosotros estamos en el parque, entre el quincho y una cancha de volley playero. 190 | 191 | —Me manchás y te pego una piña. 192 | 193 | La veintena de chicos alienta a que concrete el acto y, como tocándolo con una varita mágica, acerco lentamente el palito con caca hasta que hace contacto con su remera a rayas. 194 | 195 | ¡Pum! Me sienta de una piña y los ojos se me humedecen enseguida. Me quiero largar a llorar, pero aguanto como puedo. Los otros chicos empiezan a empujar a Joel, le gritan cosas, lo insultan, le dicen “testigo de Jehová”, confundiendo su religión, porque Joel es evangelista. 196 | 197 | Lo siguiente que recuerdo es llegar a mi casa llorando y abrazar a mi mamá. 198 | 199 | 200 | 201 | 202 | 203 | \chapter*{Naranjas para don Bordesio} \addcontentsline{toc}{chapter}{Naranjas para don Bordesio} 204 | 205 | 206 | 207 | 208 | 209 | En invierno, después de juntar naranjas en el patio, doña Magdalena envía a su hija Florencia con una bolsa repleta de esos tesoros dulces para su vecino de enfrente, don Bordesio. 210 | 211 | —¿Cómo vas a salir con los pelos así? —le dice la mamá y la sienta frente al espejo para peinar su cabello rubio y hacerle dos trenzas, una a cada costado. 212 | 213 | En julio cumple catorce años. Florencia, con sus trenzas, cruza la calle. El sol de un día cálido de invierno le da de lleno en las piernas blancas que deja ver su jardinero rojo y las calienta. 214 | 215 | Entra por la puerta de atrás, sin tocar timbre. La mosquitera rechina, da un golpe y rebota un poco para terminar cerrándose. En la cocina de don Bordesio, un ventilador de techo gira en cámara lenta y una brisa casi imperceptible pero reconfortante se le cuela por el cuello de la remera. En la habitación, a bajo volumen pero imposible de no notar, suena un viejo disco de jazz. La niña, o ex niña, la muchachita, lo conoce de memoria. 216 | 217 | El hombre cano de tez morena y tantos lunares como un cielo estrellado está sentado en su sillón, con sus anteojos oscuros. Los de siempre. Reconoce su aroma, su fragancia, antes de que ella hable. Aunque esté mezclada con la de las flores de azahar. Cuando le dice que le trae el regalo de su madre, sonríe y la llama. Con manos ásperas pero movimientos suaves, le acaricia el rostro para saludarla. 218 | 219 | Las paredes de la casa están descascaradas, pintadas de un amarillo oscuro que deja ver el color anterior bajo sus cicatrices. De una de las paredes cuelga una foto en blanco y negro. En la foto se ve a un hombre joven montado a caballo, alegre. 220 | 221 | La muchacha, que aprendió el ritual de niña y no lo cuestiona, sabe perfectamente lo que ocurrirá. Ella le sacará los anteojos para descubrir un par de ojos blancos y muertos que él rápidamente cerrará y ella besará. Él le desabotonará el jardinero rojo, que caerá pesado junto a los pies de medias con puntilla y zapatitos de charol. Un dedo firme dibujará placeres en el algodón que solo toca la madre de Florencia cuando lava su ropa interior. 222 | 223 | —Hoy podés bajarme la bombacha. 224 | 225 | Don Bordesio lo hace con manos nerviosas hasta llegar al jardinero rojo. Florencia levanta un pie y luego el otro. Da un paso al frente y se sienta en la rodilla del hombre. Una pierna de cada lado. Esas piernas que unos minutos antes el sol calentaba, ahora tienen temperatura propia. 226 | 227 | —Haceme caballito. 228 | 229 | Don Bordesio empieza a mover la pierna hacia arriba y hacia abajo, rápido, haciendo toda la fuerza con el pie, como cuando de más chica la hacía jugar. 230 | 231 | Tímidos sonidos salen de la boca de la niña, o ex niña, la muchachita, la casi mujer, que siente el par de manos deslizarse por la espalda, bajo la remera, y suben hasta la hebilla, que se desprende y libera aún más su cuerpo. 232 | 233 | Los sonidos ya no son tan tímidos y don Bordesio hace los coros de aquel canto sin dejar de hacerle caballito. 234 | 235 | En invierno, después de juntar naranjas de sus árboles, doña Magdalena envía a su hija Florencia con una bolsa repleta de esos tesoros dulces para su vecino de enfrente, don Bordesio. En otoño, le manda pan casero o buñuelos. Naranjas, pan casero, buñuelos, chocolates, una torta, perejil, tomates, hojas de aloe, pantallas de lo que en verdad le está enviando. 236 | 237 | 238 | 239 | \cleardoublepage 240 | 241 | %IMPRENTA 242 | %\includepdf{empty.pdf} 243 | 244 | \hspace{0pt} 245 | \vfill 246 | \begin{center} 247 | Maqueteado automáticamente utilizando \emph{Automágica}. 248 | \bigbreak 249 | http://www.juanjoconti.com/automagica/ 250 | \end{center} 251 | \vfill 252 | \hspace{0pt} 253 | \end{document} 254 | -------------------------------------------------------------------------------- /tests_data/default.tex: -------------------------------------------------------------------------------- 1 | \documentclass[11pt,twoside,openright]{book} 2 | 3 | \usepackage[a5paper,hmarginratio={3:2},bottom=0.8in,top=0.8in]{geometry} 4 | 5 | \usepackage{times} 6 | \usepackage[Lenny]{fncychap} 7 | 8 | \usepackage[spanish]{babel} 9 | \usepackage[utf8x]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | 12 | \usepackage{mathptmx} 13 | \usepackage{etoolbox} 14 | 15 | \usepackage[titles]{tocloft} 16 | 17 | \usepackage{pdfpages} 18 | 19 | \usepackage{courier} 20 | 21 | \renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} 22 | 23 | % change the space before the titles 24 | \makeatletter 25 | \patchcmd{\@makechapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 26 | \patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 27 | \makeatother 28 | 29 | % change the space after the titles 30 | \renewcommand{\DOTI}[1]{% 31 | \raggedright 32 | \CTV\FmTi{#1}\par\nobreak 33 | \vskip 10pt} 34 | \renewcommand{\DOTIS}[1]{% 35 | \raggedright 36 | \CTV\FmTi{#1}\par\nobreak 37 | \vskip 10pt} 38 | 39 | 40 | \title{TITLE} 41 | \author{AUTHOR} 42 | \date{} 43 | 44 | 45 | 46 | % Avoid widows and orphans 47 | \widowpenalty=10000 48 | \clubpenalty=10000 49 | 50 | \begin{document} 51 | 52 | \pagenumbering{gobble} 53 | 54 | \pagestyle{plain} 55 | 56 | 57 | % IF PRINT 58 | %\includepdf{empty.pdf} 59 | %\includepdf{empty.pdf} 60 | 61 | \maketitle 62 | 63 | \cleardoublepage 64 | 65 | \thispagestyle{empty} 66 | \noindent 67 | Edición automágica, 2016.\\ 68 | 69 | \vspace{0.5cm} 70 | 71 | \noindent 72 | \emph{TITLE} lleva la licencia 73 | \emph{Creative Commons Attribution - NonCommercial - ShareAlike 4.0 Iternational}. 74 | Esto significa que podés compartir esta obra y crear obras derivadas 75 | mencionando al autor, pero no ha\-cer un uso comercial de ella. 76 | 77 | \vfill 78 | 79 | \noindent 80 | %Más información sobre este libro:\\ 81 | \\ 82 | 83 | \cleardoublepage 84 | 85 | 86 | \renewcommand*\contentsname{Índice} 87 | 88 | \tableofcontents 89 | 90 | 91 | \cleardoublepage 92 | 93 | \pagenumbering{arabic} 94 | 95 | 96 | 97 | 98 | 99 | \chapter*{Sobre la existencia de los fantasmas} \addcontentsline{toc}{chapter}{Sobre la existencia de los fantasmas} 100 | 101 | 102 | 103 | 104 | 105 | Una noche de verano en mi pueblo, cuando yo tenía quince años, salí con dos amigos, como hacíamos todos los sábados. Nos estábamos entusiasmando con el alcohol, por lo que el plan era sentarse en la mesa de un bar a ver quién aguantaba más. No queríamos ir a alguno de los bares de la calle principal porque siempre encontrábamos a algún amigo de nuestros padres y temíamos que nos delate. La cobardía, entonces, nos llevó a rumbear por barrios con calles menos asfaltadas y luminosas. 106 | 107 | Hicimos base en un sucucho de la calle Mazzini cerca de la ruta, al que todos llaman “el bar de Alemandri”. Empezaba a llover, así que nos mandamos para una de las mesas del fondo. Mis laderos pidieron un porrón para compartir y yo, que no había aprendido a disfrutar de la amargura de la cerveza, pedí un “aperitivo” (en casa solía tomar un dedo de Gancia rebajado con soda). En esa ocasión, el mozo me sirvió un vaso repleto de Cinzano y al costado, clavó un pequeño sifón de soda con el que (según parecía, así era el ritual) tendría que ir completándolo a medida que tomaba. Recuerdo que le pregunté a ese viejo flaco y huesudo si eso se tomaba puro y, después de reírse de mí con ganas, dijo que así lo tomaban los hombres. Mis amigos se descostillaban a carcajadas. 108 | 109 | Cuando ya había pasado una hora desde nuestra llegada y aún no había tomado dos dedos del brebaje, la puerta del boliche se abrió por la fuerza del viento. Uno de los parroquianos se levantó a cerrarla, pero, al intentar hacerlo, un pie se lo impidió. Al pie lo seguía el ser más desagradable que hasta ese momento había visto en mi vida. Habrá tenido unos sesenta y cinco años, lucía ropa vieja, o sucia, no sé, tenía el pelo largo, la piel se le veía grasosa y sus dientes estaban todos podridos. Se sentó en una mesa y pidió caña Legui. Algunos nos miramos, cómplices, y nos dijimos que no era de por allí. 110 | 111 | Volvimos a nuestra charla sobre fútbol; el mono Navarro Montoya acababa de hacer una atajada espectacular en el único televisor del antro. Era una repetición de unos años atrás, pero la estábamos siguiendo como si fuese en vivo. 112 | 113 | Nos volvimos a percatar de la presencia del hombre cuando oímos los gritos. El forastero se había trenzado con el dueño del bar en una acalorada discusión sobre la existencia de los fantasmas. Lo escuchamos a Alemandri contar la historia de una tapera en un campo cercano: 114 | 115 | —Todos los domingos a la noche, se oye el chirrido de una soga bajando un balde en el aljibe. Lo curioso es que en ese campo ya no hay aljibe, sino bombas eléctricas. Una familia, que trabajaba allí y vivía en la tapera, contó que una vez, tras oír los ruidos, salieron a la noche y con una linterna iluminaron a un hombre ataviado con ropas del 1800 que sacaba agua con un balde de madera. A su lado, una mujer, supuestamente su esposa, lavaba la ropa y la colgaba para que se seque. 116 | 117 | El forastero bufó con ganas, para que lo escuchen. 118 | 119 | —¿Cómo pueden creer en esos cuentos? 120 | 121 | —Ningún cuento, señor —y Alemandri pronunció con desdeño la palabra “señor”—. Esto que relato me lo contó un primo mío, vecino del campo donde aparecen las ánimas. Le digo más; en una ocasión llegaron al pueblo dos misioneros. La tapera estaba desocupada y el dueño se las ofreció para pasar la noche. Era domingo. A la madrugada encontraron a los hombres de Dios en la ruta haciendo dedo para irse. 122 | 123 | —Habladurías —dijo el forastero e hizo un gesto con la mano en el aire, como tratando de espantar una mosca inexistente, para restarle validez a la historia que el otro contaba. 124 | 125 | Entonces, el duelo, que hasta ese momento era solo de vozarrones, se convirtió también en un duelo de gestos. 126 | 127 | —Escuchame, sabandija —y mientras hablaba, el dueño del boliche, que había dejado de tratarlo de usted, sacudía el dedo índice como quien sacude la fusta antes de pegarle al caballo—. Vos no vas a venir a mi establecimiento a decirme qué es verdad y qué no. 128 | 129 | El sabandija lo apuntó con el mentón. 130 | 131 | —Me imagino, entonces, que si tu primo es vecino ya habrás ido a la tapera un domingo a la noche a ver a los fantasmas. 132 | 133 | El cantinero enmudeció primero y tartamudeó después. 134 | 135 | —Bueno… es que yo los domingos a la noche tengo el boliche repleto y una excursión paranormal es un lujo que no me puedo permitir. Además… además… esos de aquella mesa también los vieron. Fueron en camioneta a cazar palomas al monte que está detrás de la tapera. Se les hizo la noche y cuando regresaban caminando, vieron la escena. Basta decir que dejaron la camioneta y volvieron al pueblo corriendo. 136 | 137 | Los dos de la esquina asintieron en silencio y ahora sí, Alemandri recuperó el color, sacó pecho y empezó a mover la cabeza esperando que el pelilargo, el aceitoso, el de los dientes podridos, responda. No lo hizo. El ganador de aquella discusión volvió a tomar la palabra. 138 | 139 | —Entonces, ¿usted no cree en los fantasmas? 140 | 141 | —Yo no —dijo el forastero. Y tomando el último trago de caña, se evaporó ante nuestros ojos. 142 | 143 | 144 | 145 | 146 | 147 | \chapter*{El hombre que soñó con su gato} \addcontentsline{toc}{chapter}{El hombre que soñó con su gato} 148 | 149 | 150 | 151 | 152 | 153 | Un hombre terminó de cenar, lavó los platos y sacó a su gato al patio para luego irse a dormir. 154 | 155 | Mientras dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 156 | 157 | Mientras soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 158 | 159 | Mientras soñaba que soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 160 | 161 | Mientras soñaba que soñaba que soñaba que dormía, soñó que su gato lloraba en la puerta; se levantó y lo dejó entrar para luego volverse a dormir. 162 | 163 | La secuencia se repitió cien veces durante la noche. 164 | 165 | Cuando se despertó a la mañana siguiente, casi se desmaya cuando vio lo que había en la cocina. 166 | 167 | 168 | 169 | 170 | 171 | \chapter*{Barba} \addcontentsline{toc}{chapter}{Barba} 172 | 173 | 174 | 175 | 176 | 177 | El 19 de diciembre de 1994, antes de acostarme, me miré en el espejo del baño. En el reflejo, un hombre con una barba frondosa, arbórea, selvática, me miraba. Los pelos se extendían en infinitas ramificaciones oscuras que me cubrían todo el rostro, dejando, apenas, ver los ojos. Ojos pardos y barba negra con algún destello rojizo. Me lavé los dientes y me acosté. 178 | 179 | Cuando me desperté al otro día y fui al baño a lavarme la cara, un rostro rasurado, lustroso, brillante, me encandilaba desde el reflejo. Ya no había ni barba negra, ni destello rojizo. Sin embargo, el recuerdo del día anterior, con el rostro lobuno, estaba muy vivo en mi memoria. ¿Lo habría soñado? ¿Me habría despertado sonámbulo a rasurarme? Si hubiese sido al revés, podría concluir que estuve dormido varios meses, pero no fue así. ¿O sí? Estas y otras cosas me pregunté esa mañana. Recuerdo bien la fecha porque ese día cumplí diez años. 180 | 181 | 182 | 183 | 184 | 185 | \chapter*{Joel} \addcontentsline{toc}{chapter}{Joel} 186 | 187 | 188 | 189 | 190 | 191 | El primer recuerdo que tengo de Joel es en el club San Martín. Blanco y pecoso. Muy pecoso. Tiene una remera rayada y pantalones cortos por los que se deslizan sus piernas flaquitas. También blancas, pero no pecosas. Lo tengo agarrado de la remera rayada y con la otra mano sostengo un palito que en la punta tiene caca. Y yo tengo caca en mi remera blanca. No lo recuerdo claramente, pero supongo que Joel me debe de haber manchado. No recuerdo claramente ese punto, pero sí recuerdo un sentimiento de ojo por ojo. 192 | 193 | Joel me dice que si lo mancho, me pega una piña. Alrededor, una veintena de chicos de nuestra edad. No me acuerdo si es un cumpleaños o una clase de gimnasia. Debe de ser un cumpleaños porque tenemos edad de primaria y recién en la secundaria empezamos a tener clases de gimnasia en los clubes del pueblo. 194 | 195 | El club San Martín es un predio enorme con distintos sectores bien diferenciados: el edificio, la cancha de básquet, la pileta, la cancha de fútbol y el parque. Nosotros estamos en el parque, entre el quincho y una cancha de volley playero. 196 | 197 | —Me manchás y te pego una piña. 198 | 199 | La veintena de chicos alienta a que concrete el acto y, como tocándolo con una varita mágica, acerco lentamente el palito con caca hasta que hace contacto con su remera a rayas. 200 | 201 | ¡Pum! Me sienta de una piña y los ojos se me humedecen enseguida. Me quiero largar a llorar, pero aguanto como puedo. Los otros chicos empiezan a empujar a Joel, le gritan cosas, lo insultan, le dicen “testigo de Jehová”, confundiendo su religión, porque Joel es evangelista. 202 | 203 | Lo siguiente que recuerdo es llegar a mi casa llorando y abrazar a mi mamá. 204 | 205 | 206 | 207 | 208 | 209 | \chapter*{Naranjas para don Bordesio} \addcontentsline{toc}{chapter}{Naranjas para don Bordesio} 210 | 211 | 212 | 213 | 214 | 215 | En invierno, después de juntar naranjas en el patio, doña Magdalena envía a su hija Florencia con una bolsa repleta de esos tesoros dulces para su vecino de enfrente, don Bordesio. 216 | 217 | —¿Cómo vas a salir con los pelos así? —le dice la mamá y la sienta frente al espejo para peinar su cabello rubio y hacerle dos trenzas, una a cada costado. 218 | 219 | En julio cumple catorce años. Florencia, con sus trenzas, cruza la calle. El sol de un día cálido de invierno le da de lleno en las piernas blancas que deja ver su jardinero rojo y las calienta. 220 | 221 | Entra por la puerta de atrás, sin tocar timbre. La mosquitera rechina, da un golpe y rebota un poco para terminar cerrándose. En la cocina de don Bordesio, un ventilador de techo gira en cámara lenta y una brisa casi imperceptible pero reconfortante se le cuela por el cuello de la remera. En la habitación, a bajo volumen pero imposible de no notar, suena un viejo disco de jazz. La niña, o ex niña, la muchachita, lo conoce de memoria. 222 | 223 | El hombre cano de tez morena y tantos lunares como un cielo estrellado está sentado en su sillón, con sus anteojos oscuros. Los de siempre. Reconoce su aroma, su fragancia, antes de que ella hable. Aunque esté mezclada con la de las flores de azahar. Cuando le dice que le trae el regalo de su madre, sonríe y la llama. Con manos ásperas pero movimientos suaves, le acaricia el rostro para saludarla. 224 | 225 | Las paredes de la casa están descascaradas, pintadas de un amarillo oscuro que deja ver el color anterior bajo sus cicatrices. De una de las paredes cuelga una foto en blanco y negro. En la foto se ve a un hombre joven montado a caballo, alegre. 226 | 227 | La muchacha, que aprendió el ritual de niña y no lo cuestiona, sabe perfectamente lo que ocurrirá. Ella le sacará los anteojos para descubrir un par de ojos blancos y muertos que él rápidamente cerrará y ella besará. Él le desabotonará el jardinero rojo, que caerá pesado junto a los pies de medias con puntilla y zapatitos de charol. Un dedo firme dibujará placeres en el algodón que solo toca la madre de Florencia cuando lava su ropa interior. 228 | 229 | —Hoy podés bajarme la bombacha. 230 | 231 | Don Bordesio lo hace con manos nerviosas hasta llegar al jardinero rojo. Florencia levanta un pie y luego el otro. Da un paso al frente y se sienta en la rodilla del hombre. Una pierna de cada lado. Esas piernas que unos minutos antes el sol calentaba, ahora tienen temperatura propia. 232 | 233 | —Haceme caballito. 234 | 235 | Don Bordesio empieza a mover la pierna hacia arriba y hacia abajo, rápido, haciendo toda la fuerza con el pie, como cuando de más chica la hacía jugar. 236 | 237 | Tímidos sonidos salen de la boca de la niña, o ex niña, la muchachita, la casi mujer, que siente el par de manos deslizarse por la espalda, bajo la remera, y suben hasta la hebilla, que se desprende y libera aún más su cuerpo. 238 | 239 | Los sonidos ya no son tan tímidos y don Bordesio hace los coros de aquel canto sin dejar de hacerle caballito. 240 | 241 | En invierno, después de juntar naranjas de sus árboles, doña Magdalena envía a su hija Florencia con una bolsa repleta de esos tesoros dulces para su vecino de enfrente, don Bordesio. En otoño, le manda pan casero o buñuelos. Naranjas, pan casero, buñuelos, chocolates, una torta, perejil, tomates, hojas de aloe, pantallas de lo que en verdad le está enviando. 242 | 243 | 244 | 245 | \cleardoublepage 246 | 247 | %IMPRENTA 248 | %\includepdf{empty.pdf} 249 | 250 | \hspace{0pt} 251 | \vfill 252 | \begin{center} 253 | Maqueteado automáticamente utilizando \emph{Automágica}. 254 | \bigbreak 255 | http://www.juanjoconti.com/automagica/ 256 | \end{center} 257 | \vfill 258 | \hspace{0pt} 259 | \end{document} 260 | -------------------------------------------------------------------------------- /tests_data/jungla.tex: -------------------------------------------------------------------------------- 1 | \documentclass[11pt,twoside,openright]{book} 2 | 3 | \usepackage[a5paper,hmarginratio={3:2},bottom=0.8in,top=0.8in]{geometry} 4 | 5 | \usepackage{times} 6 | \usepackage[Lenny]{fncychap} 7 | 8 | \usepackage[spanish]{babel} 9 | \usepackage[utf8x]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | 12 | \usepackage{mathptmx} 13 | \usepackage{etoolbox} 14 | 15 | \usepackage[titles]{tocloft} 16 | 17 | \usepackage{pdfpages} 18 | 19 | \usepackage{courier} 20 | 21 | \renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} 22 | 23 | % change the space before the titles 24 | \makeatletter 25 | \patchcmd{\@makechapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 26 | \patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 27 | \makeatother 28 | 29 | % change the space after the titles 30 | \renewcommand{\DOTI}[1]{% 31 | \raggedright 32 | \CTV\FmTi{#1}\par\nobreak 33 | \vskip 10pt} 34 | \renewcommand{\DOTIS}[1]{% 35 | \raggedright 36 | \CTV\FmTi{#1}\par\nobreak 37 | \vskip 10pt} 38 | 39 | 40 | \title{El libro de la jungla} 41 | \author{Juan José Conti} 42 | \date{} 43 | 44 | \hyphenation{a-gudo}\hyphenation{se-cretaria} 45 | 46 | % Avoid widows and orphans 47 | \widowpenalty=10000 48 | \clubpenalty=10000 49 | 50 | \begin{document} 51 | 52 | \pagenumbering{gobble} 53 | 54 | \pagestyle{plain} 55 | 56 | 57 | % IF PRINT 58 | %\includepdf{empty.pdf} 59 | %\includepdf{empty.pdf} 60 | 61 | \maketitle 62 | 63 | \cleardoublepage 64 | 65 | \thispagestyle{empty} 66 | \noindent 67 | Edición automágica, 2016.\\ 68 | 69 | \vspace{0.5cm} 70 | 71 | \noindent 72 | \emph{El libro de la jungla} lleva la licencia 73 | \emph{Creative Commons Attribution - NonCommercial - ShareAlike 4.0 Iternational}. 74 | Esto significa que podés compartir esta obra y crear obras derivadas 75 | mencionando al autor, pero no ha\-cer un uso comercial de ella. 76 | 77 | \vfill 78 | 79 | \noindent 80 | %Más información sobre este libro:\\ 81 | http://www.ellibrodelajungla.com\\ 82 | 83 | \cleardoublepage 84 | 85 | 86 | \renewcommand*\contentsname{Índice} 87 | 88 | \tableofcontents 89 | 90 | 91 | \cleardoublepage 92 | 93 | \pagenumbering{arabic} 94 | 95 | 96 | 97 | \chapter*{Visita al dentista} \addcontentsline{toc}{chapter}{Visita al dentista} 98 | Tengo doce años, o trece, o catorce. O tal vez, diez. Estoy en esa sala de 99 | espera de dos por uno, paredes blancas casi totalmente cubiertas de diplomas, 100 | asientos de cuerina que rechinan y revistero con ejemplares de la década 101 | anterior. 102 | 103 | Estoy solo, esperando. La sala tiene tres puertas. Una da a la calle y es por 104 | donde entré. La otra da al escritorio de la secretaria y la acabo de golpear. 105 | La tercera, desde la que viene un sonido agudo y eléctrico, el sonido de una 106 | pequeña rueda de piedra girando a muchas revoluciones, un sonido que se 107 | enciende y que se apaga a intervalos casi regulares, es la puerta que da al 108 | consultorio del dentista. 109 | 110 | Ahora se abre la segunda puerta, la de la secretaria. Liliana es joven y tiene 111 | rulos negros que siempre aparentan estar húmedos. Me dice que el doctor ya me 112 | va a atender, que cuando termine con la paciente que está viendo ahora, sigue 113 | conmigo. «Viendo». Un eufemismo. 114 | 115 | Tomo una de las revistas y paso, sin mirar, las páginas hasta llegar al final. 116 | Hasta las historietas. Hay una de Quino. Leo. Me río, pero no estoy seguro de 117 | que haya entendido del todo el chiste. Los chistes de Quino siempre tienen dos 118 | niveles. Uno superficial, con el que se puede reír hasta un chico de nueve años 119 | y otro, más profundo. Yo me concentro en esa otra parte. En tratar de entender 120 | el lado B del chiste. El lado que para ser comprendido necesita algo más que 121 | haber leído lo que dicen los personajes o haber visto el dibujo. A veces, se 122 | necesita que el lector haya leído cierto libro, o conozca tal pintura, o haya 123 | oído cierta noticia. 124 | 125 | Arranco la página con el chiste y me la guardo en el bolsillo de la campera. 126 | Estoy dejando la revista en su lugar cuando se abre la tercera puerta. Sale una 127 | mujer agarrándose la cara con la mano izquierda. Con la derecha, cierra tras de 128 | sí la puerta. 129 | 130 | ---Siguiente ---llaman con la voz de un dios mitológico unos segundos después. 131 | 132 | Abro la tercera puerta e ingreso a ese espacio luminoso en donde una multitud 133 | de herramientas filosas cuelgan expuestas, expectantes, esperando a ser 134 | utilizadas. Sin mediar palabra, me acuesto dócil en el asiento reclinado. 135 | 136 | Entonces me asalta un temor, una duda. ¿Me habrá visto el dentista cortar la 137 | hoja de la revista? 138 | 139 | Busco sus ojos. Los encuentro, penetrantes, ojos de dinamita que me miran 140 | detrás del barbijo. No necesito ver las muecas que pueda hacer con la boca. Con 141 | los ojos le alcanza para decirme que fue testigo del momento en que le robé la 142 | historieta y la guardé en el bolsillo de la campera. 143 | 144 | Intento levantarme pero no puedo. Estoy rodeado en su sillón por él en un 145 | flanco y por el brazo hidráulico que le sostiene las herramientas en el otro. 146 | 147 | Me unta la encía con una especie de gel y luego me apunta con una jeringa el 148 | lugar exacto que antes untó. Siento cómo la aguja se clava con fuerza y temo 149 | que la punta aparezca del lado de adentro de la boca. De la bandeja que 150 | sostiene el brazo hidráulico, toma un par de herramientas metálicas que 151 | tintinean entre sí y, en mi desesperación, en las notas producidas por el azar, 152 | descifro una melodía fúnebre. Ya no tengo dudas. Sabe de mi fechoría y me va a 153 | torturar hasta que confiese. Empieza con un gancho que parece un anzuelo de 154 | pescador y lo introduce entre dos muelas. 155 | 156 | ---¿Duele? ---me pregunta con sádico placer mientras escarba con el 157 | instrumento. 158 | 159 | Yo, que no puedo hablar por la anestesia, abro grandes los ojos y emito un 160 | sonido gutural para decirle que sí, que me duele. 161 | 162 | ---Vas a tener que aguantar ---me dice sin mirarme como única respuesta. Y con 163 | el pie acciona un interruptor que pone en funcionamiento una especie de torno 164 | de mano, su herramienta preferida. No puedo verlas, pero imagino que cuando el 165 | artefacto entra en contacto con mis dientes, una catarata de chispas saltan en 166 | el aire como si mi boca fuera la de un volcán en erupción. 167 | 168 | Trato de resistir. Clavo las uñas de las manos en los apoyabrazos de mi asiento 169 | y doblo los dedos de los pies tratando de mantenerme en la superficie de la 170 | Tierra. Nada es suficiente. 171 | 172 | Adivino una sonrisa de placer bajo el barbijo. Esa visión y el sonido de la 173 | rueda que gira sin parar rebotando contra mis dientes le ponen fin a mi 174 | resistencia. Exhalando, me doy por vencido y confieso. 175 | 176 | ---Fui yo, yo me robé el chiste de Quino ---. Pero las palabras no salen. 177 | Apenas un balbuceo que no logra atravesar las capas de saliva, sangre y dolor. 178 | 179 | La secretaria Liliana entra al consultorio y me ve tirado, sangrando, a medio 180 | camino entre la resistencia y la deshonra. Me doy vergüenza. 181 | 182 | Se acerca a donde estoy. Desde mi posición, solo puedo ver sus piernas. Hasta 183 | que se agacha y levanta algo del suelo. 184 | 185 | ---¿Esto es tuyo? 186 | 187 | Mi botín. La página con la historieta. A presencia de prueba, la confesión ya 188 | no es necesaria. 189 | 190 | ---¿Te gusta Quino? ---me pregunta el dentista, y se baja el barbijo para que 191 | le salgan mejor las palabras. 192 | 193 | Muerto de vergüenza ante la prueba que me condena, ya vencido, asiento con la 194 | cabeza. 195 | 196 | ---Si querés ---me dice---, cuando te vayas, fijate en el revistero. Creo que 197 | las revistas que están ahí tienen historietas de ese tipo. Llevate las que 198 | quieras. Y vos, Liliana, a ver si renovamos el catálogo, que ahí todavía hay 199 | revistas de cuando este era el consultorio de mi padre. 200 | 201 | 202 | 203 | \chapter*{Sobre la existencia de los fantasmas} \addcontentsline{toc}{chapter}{Sobre la existencia de los fantasmas} 204 | Una noche de verano en mi pueblo, cuando yo tenía quince años, salí con dos amigos, 205 | como hacíamos todos los sábados. Nos estábamos entusiasmando 206 | con el alcohol, por lo que el plan era sentarse en la mesa de un bar para ver 207 | quién aguantaba más. No queríamos ir a alguno de los bares de la calle 208 | principal porque siempre encontrábamos a algún amigo de nuestros padres 209 | y temíamos que nos delate. La cobardía, entonces, nos llevó a rumbear 210 | por barrios con calles menos asfaltadas y luminosas. 211 | 212 | Hicimos base en un sucucho de la calle Mazzini cerca de la ruta, conocido 213 | como «el bar de Alemandri». Empezaba a llover, así que nos mandamos para 214 | una de las mesas del fondo. Mis laderos pidieron un porrón para 215 | compartir y yo, que no había aprendido a disfrutar de la amargura de la 216 | cerveza, pedí un «aperitivo» (en casa solía tomar un dedo de Gancia 217 | rebajado con soda). En esa ocasión, el mozo me sirvió un vaso repleto 218 | de Cinzano y al costado, clavó un pequeño sifón de soda con el que 219 | (según parecía, así era el ritual) tendría que ir completándolo a medida 220 | que tomaba. Recuerdo que le pregunté a ese viejo flaco si eso se tomaba 221 | puro y, después de reírse de mí con ganas, dijo que así lo tomaban los 222 | hombres. Mis amigos se descostillaban a carcajadas. 223 | 224 | Cuando ya había pasado una hora desde nuestra llegada y aún no había 225 | tomado dos dedos del brebaje, la puerta del boliche se abrió con fuerza 226 | por el viento. 227 | Uno de los parroquianos se levantó para cerrarla, pero, cuando estaba por 228 | hacerlo, un pie se lo impidió. Al pie lo seguía el ser más desagradable 229 | que hasta ese momento había visto en mi vida. Tendría unos sesenta y cinco años, 230 | lucía ropa vieja, o sucia, no sé, tenía el pelo largo, la piel se le veía 231 | grasosa y sus dientes estaban todos podridos. Se sentó en una mesa y pidió 232 | caña Legui. Algunos nos miramos, cómplices, y nos dijimos que no era de por allí. 233 | 234 | Volvimos a nuestra charla sobre fútbol; el mono Navarro Montoya acababa 235 | de hacer una atajada espectacular en el único televisor del antro. Era 236 | una repetición de hace unos años, pero la estábamos siguiendo como si 237 | fuese en vivo. 238 | 239 | Nos volvimos a percatar de su presencia cuando escuchamos los gritos. El 240 | forastero se había trenzado con el dueño del bar en una acalorada discusión 241 | sobre la existencia de los fantasmas. Lo escuché a Alemandri contar la 242 | historia de una tapera en un campo cercano: 243 | 244 | ---Todos los domingos a la noche 245 | se escucha el chirrido de una soga bajando un balde en el aljibe. Lo curioso 246 | es que en ese campo ya no hay aljibe, sino bombas eléctricas. Una familia, 247 | que trabajaba en ese campo y vivía en la tapera, contó que una vez, tras oír los 248 | ruidos, salieron a la noche y con una linterna vieron a un hombre ataviado 249 | con ropas del 1800 sacando agua con un balde de madera. A su lado, una mujer, 250 | supuestamente su esposa, lavaba la ropa y la colgaba para que se seque. 251 | 252 | El forastero bufó con ganas para que lo escuchen. 253 | 254 | ---¿Cómo pueden creer en esos cuentos? 255 | 256 | ---Ningún cuento, señor ---y Alemandri pronunció con desdeño la palabra 257 | «señor»---. Esto que relato me lo contó un primo mío, vecino del campo donde 258 | aparecen las ánimas. Le digo más, en una ocasión llegaron al pueblo dos 259 | misioneros. La tapera estaba desocupada y el dueño se las ofreció para 260 | pasar la noche. Era domingo. A la madrugada, encontraron a los hombres de 261 | Dios en la ruta haciendo dedo para irse. 262 | 263 | ---Habladurías ---dijo el forastero e hizo un gesto con la mano en el aire, 264 | como tratando de tumbar una mosca inexistente para restarle validez a la historia que el otro contaba. 265 | 266 | Entonces, el duelo, que hasta ese momento era solo de vozarrones, se convirtió 267 | también en un duelo de gestos. 268 | 269 | ---Escuchame, sabandija ---y mientras hablaba, el dueño del boliche, que había 270 | dejado de tratarlo de usted, sacudía el dedo índice como quien sacude la 271 | fusta antes de pegarle al caballo---. Vos no vas a venir a mi establecimiento 272 | a decirme qué es verdad y qué no. 273 | 274 | El sabandija lo apuntó con el mentón. 275 | 276 | ---Me imagino, entonces, que si tu 277 | primo es vecino ya habrás ido a la tapera un domingo a la noche a ver a 278 | los fantasmas. 279 | 280 | El cantinero enmudeció primero y tartamudeó después. 281 | 282 | ---Bueno... es que yo 283 | los domingos a la noche tengo el boliche repleto y una excursión paranormal 284 | es un lujo que no me puedo permitir. Además... además... esos de aquella 285 | mesa también los vieron. Fueron en camioneta a cazar palomas al monte que 286 | está atrás de la tapera. Se les hizo la noche y cuando volvían caminando, 287 | vieron la escena. Basta decir que dejaron la camioneta y volvieron al 288 | pueblo corriendo. 289 | 290 | Los dos de la esquina asintieron en silencio y ahora sí, 291 | Alemandri recuperó el color, sacó pecho y empezó a mover la cabeza 292 | esperando que el pelilargo, el aceitoso, el de los dientes podridos, 293 | responda. No lo hizo. El ganador de aquella discusión volvió a tomar la 294 | palabra. 295 | 296 | ---Entonces, ¿usted no cree en los fantasmas? 297 | 298 | ---Yo no ---dijo el forastero. Y tomando el último trago de caña, se evaporó 299 | ante nuestros ojos. 300 | 301 | 302 | 303 | 304 | \chapter*{Juan} \addcontentsline{toc}{chapter}{Juan} 305 | En el año 1993, yo estaba en tercer grado. Faltaba tiempo para que tenga mi 306 | primera computadora, pero ya me sentía atraído por esas máquinas blancas y 307 | luminosas, mezcla de electrodoméstico con máquina de escribir. Una vez a la 308 | semana teníamos clase de computación, tres alumnos por computadora. Uno 309 | manejaba el teclado, otro el mouse y el tercero miraba sobre los hombros de los 310 | otros dos. 311 | 312 | En mi pueblo había dos escuelas. Casi no conocía a los chicos que iban a la 313 | otra. Un domingo al mediodía, viendo el noticiero local, conocí a uno de esos 314 | desconocidos. Se llamaba Juan. El televisor lo mostraba sentado en una silla de 315 | ruedas; tenía los dedos doblados y hablaba con dificultad mientras se babeaba 316 | un poco. La entrevista se debía a que algún funcionario provincial le había 317 | regalado una computadora. Juan le mostraba a la periodista un juego en el que 318 | un pequeño dinosaurio se movía en la pantalla poniendo huevos explosivos. Lo 319 | odié. A Juan no parecía importarle ni la silla, ni sus dificultades, ni mi 320 | odio. En su cara, bajo un par de lentes grasosos, brillaba una enorme sonrisa. 321 | 322 | Cinco años después, empecé la secundaria. En mi pueblo, había un solo 323 | secundario. El primer día, nos juntaron a los de las dos escuelas, nos 324 | mezclaron y nos dividieron en dos cursos. Cuando me senté por primera vez en mi 325 | pupitre, al otro lado del salón, en la primera fila, sobre ruedas cromadas y 326 | con una \emph{notebook} del tamaño de mi carpeta, estaba Juan, con la misma 327 | sonrisa que había visto por televisión. Para ese entonces, yo ya tenía mi 328 | computadora en casa y me sabía unos cuantos trucos, pero una \emph{notebook} 329 | todavía era algo raro de ver. Así que fingí amistad para poder usarle la 330 | computadora en los recreos. 331 | 332 | Una mañana, la profesora de Lengua entró al salón con el semblante muy serio. 333 | Las otras profesoras, nos informó, se habían quejado de los muchos «horrores» 334 | ortográficos que tenía nuestro curso. Por lo tanto, desde ese día, los primeros 335 | veinte minutos de cada clase se iban a dedicar al dictado de palabras que luego 336 | ella corregiría. 337 | 338 | ---Cierren las carpetas, saquen una hoja y escriban ---dijo y empezó el dictado 339 | sin siquiera darnos tiempo a abuchear el anuncio---: Decisión, azotea, exento, 340 | agazapado, alférez, hosco, delgadez, exequias, habichuela, helénico, hinojo, 341 | ignífugo, ínfulas, levadizo, licencia. 342 | 343 | Luego de cada palabra, la profesora hacía una pausa para que Juan terminara de 344 | tipear. Escribía lento, a razón de una palabra por minuto. Apuntaba a cada 345 | letra con uno de sus largos dedos y luego dejaba caer todo su peso, cual 346 | péndulo humano. Volvía a tomar carrera y repetía el proceso. Luego punto y 347 | \emph{enter}. 348 | 349 | Cuando terminó el dictado, la profesora pasó por los bancos recogiendo las 350 | hojas y señalando los errores más comunes. Cuando llegó a la \emph{notebook} de 351 | Juan, adoptando la pose de una madre piadosa, se arrodilló junto a él, dejando 352 | su rostro a la altura de la pantalla. En voz baja, leyó lo que Juan había 353 | tipeado. Cuando se incorporó, estaba notoriamente emocionada. 354 | 355 | ---Ni un error ---dijo la profesora, marcando con fuerza la palabra «un»---. 356 | Ustedes... ---y bamboleó un índice acusador--- deberían aprender de él ---y con 357 | un rápido movimiento de brazo señaló a Juan--- que, a pesar de todas sus 358 | limitaciones, se esfuerza y estudia todo los días. 359 | 360 | En ese momento no pude contenerme más y, con un ruido estridente de sifonazo de 361 | soda, se me escapó de entre los dientes parte de la carcajada que venía 362 | reteniendo. Para mí, no era ningún secreto que Juan tenía activado el corrector 363 | ortográfico. 364 | 365 | ---¿De qué se ríe, alumno? ---me soltó la profesora con enojo, casi incrédula 366 | de que me estuviera riendo del pobre compañero. 367 | 368 | Las palabras se me ahogaban y de los ojos me caían lágrimas. En uno de los 369 | relinchos, titánico esfuerzo por dejar de reírme para adentro, lo vi a Juan que 370 | desde atrás de la profesora, con un movimiento lento, se llevaba el dedo índice 371 | de la mano derecha sobre los labios. 372 | 373 | No pude traicionarlo y estoicamente acepté el castigo de ser enviado a la 374 | dirección. Desde ese día, Juan y yo somos amigos. 375 | 376 | 377 | \chapter*{Paredón} \addcontentsline{toc}{chapter}{Paredón} 378 | Durante la escuela primaria, jugaba mucho al fútbol. Jugaba en los recreos de 379 | la escuela, en el club y en una canchita cerca de casa. A esa canchita iba en 380 | bici, una bici roja con calcomanías plateadas. La dejaba tirada y corría hasta 381 | donde el resto estaba pateando. Éramos siempre seis o siete. La mayoría, de la 382 | misma escuela; algunos un año más chicos, otros un año más grandes, y, de vez 383 | en cuando, algún que otro desconocido. Por lo general, pensábamos que los 384 | desconocidos no iban a la escuela, a ninguna, y eso les daba un aura de 385 | renegados, un halo de misterio que provocaba admiración y respeto. Si la 386 | pateaban lejos, no les hacíamos buscar la pelota. 387 | 388 | La canchita quedaba al lado de la casa del Sapo; era de tierra y tenía arcos 389 | que su abuelo había hecho con ramas secas atadas con alambre. Nunca conoció la 390 | gramilla. Jugábamos tanto que no le dábamos tiempo al pasto a crecer. Era un 391 | manto marrón violáceo con textura de talco. Parecía que jugábamos en una cancha 392 | de chocolate «El Quilla». 393 | 394 | El Sapo era nuestro mejor delantero. Era zurdo y tenía una pegada que hacía 395 | temblar el alambrado que estaba atrás de los arcos. Muchas veces, si pegaba en 396 | el palo, hacía que el travesaño se cayera. Teníamos que suspender el partido y 397 | arreglar el arco. El resto éramos de regular para abajo. Ninguno iba a llegar a 398 | primera nunca. Sin embargo, el Sapo... sí podría haber llegado. 399 | 400 | Una característica que tenía nuestro grupo era que carecía de arquero. A nadie 401 | le gustaba tener que encargarse de defender el arco. Seguramente por eso, uno 402 | de los juegos más comunes entre nosotros era el «veinticinco». Alguien al azar 403 | empezaba en el arco. Cada vez que atajaba un tiro, podía usar la pelota para 404 | intentar golpear a uno de los otros jugadores. Si lo conseguía sin que la 405 | pelota pique, el jugador golpeado se convertía en el nuevo arquero. La 406 | secuencia seguía hasta llegar a los veinticinco puntos en el marcador global, 407 | que se acumulaban a través de los goles que íbamos haciendo. Diferentes tipos 408 | de goles valían diferente cantidad de puntos. Por ejemplo, un gol normal con el 409 | pie valía uno, pero un gol de cabeza, cinco. Cuando se llegaba a los 410 | veinticinco puntos, quien estaba en el arco tenía que cumplir una prenda. La 411 | clásica era el capotón: la víctima se agachaba, tratando de cubrirse, mientras 412 | todos los demás le pegábamos en la espalda. 413 | 414 | Una de esas tantas tardes, el Sapo estaba en el arco y el puntaje acumulado era 415 | de veinticuatro. En total, éramos seis chicos jugando. Los que no estábamos en 416 | el arco, nos acercábamos tocando la pelota y cuando estábamos lo 417 | suficientemente cerca, pateábamos con la esperanza de hacer un gol. 418 | Inmediatamente después, retrocedíamos a toda velocidad para intentar evitar la 419 | embestida del arquero, que nos arrojaba con potencia la pelota. 420 | 421 | En un determinado momento, Fitipaldi, uno que era nuevo en la escuela, pasó a 422 | tener la pelota. No se animó a patear y me dio un pase muy cerca del área. El 423 | Sapo se me vino arriba y pateé como pude. El Sapo atrapó la pelota en el aire y 424 | antes de que pudiera reaccionar, me la lanzó con suavidad sobre el cuerpo. 425 | Estaba tan cerca que no pude esquivarla y en el intento, me caí. Ante las 426 | carcajadas de todos, tomé mi lugar en el arco con la pelota en la mano. La suma 427 | seguía en veinticuatro. 428 | 429 | Todos estaban a más de quince metros de distancia. Imposible alcanzarlos. De 430 | todas formas, lo intenté. Con fuerza, lancé la pelota con la mano derecha, 431 | apuntando vagamente al montón. Se abrieron. Algunos para la derecha, otros para 432 | la izquierda, y la pelota pasó picando entre ellos. 433 | 434 | En menos de un minuto, luego de otro pase de Fitipaldi, el Sapo pateó al arco 435 | de media distancia y me hizo el gol que sumó veinticinco. 436 | 437 | ---¡Veinticinco, capotón! ---gritó uno mientras yo iba tomando la posición 438 | adecuada para recibir el castigo. 439 | 440 | ---No, mejor no. Tengo otra prenda ---dijo el Sapo y a continuación, explicó el 441 | «paredón»---. El que tiene que cumplir la prenda se para de espalda a nosotros, 442 | mirando la pared. Ponemos la pelota a seis pasos largos y uno patea «a fundir» 443 | para pegarle en la espalda. 444 | 445 | ---¡Sí! ---vitorearon todos con entusiasmo. 446 | 447 | Yo no dije nada; estaba pensando en mis posibilidades. A diferencia del capotón 448 | en el que tenía la golpiza asegurada, en esta nueva modalidad tenía la 449 | posibilidad de salir ileso. Por supuesto, si me embocaban, el golpe sería más 450 | duro. 451 | 452 | ---¿Y quién patea? ---preguntó uno. 453 | 454 | ---El que metió el último gol ---respondió el Sapo. 455 | 456 | Me ubiqué sin chistar y me persigné varias veces repitiendo en silencio una 457 | jaculatoria. «Que le erre», pensaba para mis adentros. 458 | 459 | El sonido pareció uno, pero en realidad fue un repique rápido de tambor: el 460 | botín del Sapo en contacto con la pelota de cuero y una fracción de segundo 461 | después, el cuero de la pelota contra mi espalda. 462 | 463 | ---¡Uhhhhhhh! --- gritó el coro de espectadores que, en una onomatopeya, 464 | expresó lo que yo no pude. Casi tampoco podía respirar. Encorvado y con un 465 | brazo levantado pedía clemencia. 466 | 467 | Como no quería que me vean llorar, agarré la bicicleta y pedaleando rápido me 468 | volví a mi casa. Estaba transpirado y sucio de tierra. Apenas llegué, sin 469 | saludar a nadie, me metí en el baño. Me saqué la remera y mirando para atrás, 470 | me vi la espalda en el espejo. Tenía un círculo rojo perfectamente delimitado. 471 | Mi espalda parecía la bandera de Japón. Ya no me dolía el golpe, pero ahora 472 | sentía un ardor en la piel. Me bañé y no hablé con nadie sobre el asunto. 473 | 474 | Al otro día, con el dolor y la vergüenza casi olvidados, volví a la canchita. 475 | Además de los de siempre, había un chico nuevo. El Crema, me dijeron que se 476 | llamaba. 477 | 478 | Que hubiera uno nuevo era bueno. Todos nos complotábamos para hacerlo perder. 479 | Si no estaba en el arco, hacíamos que se acerque a él mediante falsas promesas 480 | de gol y lo traicionábamos a último momento. Cuando ya estaba en el arco, 481 | pateábamos de lejos sin importar que tardásemos en sumar. Así pasó esa tarde 482 | con el Crema. Cuando entró en el arco, no salió más. 483 | 484 | Veintidós. 485 | 486 | Veintitrés. 487 | 488 | Veinticuatro. 489 | 490 | Yo quería hacer el último gol. Y quería que le hagamos «paredón». Quería 491 | vengarme. No me importaba que el Crema no haya estado el día anterior. Solo 492 | quería darle un \emph{puntinazo} con fuerza a la pelota e incrustársela en la 493 | espalda. 494 | 495 | Veinticinco. 496 | 497 | Otra vez el Sapo, desde muy lejos, metió un zapatazo y cerró el juego. 498 | 499 | ---¿Qué eligen? ---dijo con la pelota bajo el brazo--- ¿capotón o paredón? 500 | 501 | ---¡Paredón! ---grité solo. Se ve que a los demás les daba lo mismo. 502 | 503 | El Crema, que conocía la prenda, se paró resignado mirando la pared. 504 | 505 | El Sapo depositó la pelota en el suelo y como si estuviera por ejecutar un 506 | penal, se paró dos metros atrás. Miró al Crema, miró la pelota. Volvió a mirar 507 | al Crema y luego volvió a mirar la pelota. Tomó carrera y cuando su pie impactó 508 | en el esférico, yo tenía una sonrisa endiablada y me felicité por no estar ahí, 509 | de espaldas, esperando el impacto. 510 | 511 | La pelota no le dio en la espalda. Le pegó en la cabeza. El Crema se quedó 512 | tirado en el piso. Quieto. 513 | 514 | 515 | \cleardoublepage 516 | 517 | %IMPRENTA 518 | %\includepdf{empty.pdf} 519 | 520 | \hspace{0pt} 521 | \vfill 522 | \begin{center} 523 | Maqueteado automáticamente utilizando \emph{Automágica}. 524 | \bigbreak 525 | http://www.juanjoconti.com/automagica/ 526 | \end{center} 527 | \vfill 528 | \hspace{0pt} 529 | \end{document} 530 | -------------------------------------------------------------------------------- /tests_data/sueltos.tex: -------------------------------------------------------------------------------- 1 | \documentclass[12pt,twoside,openright]{book} 2 | 3 | \usepackage[a5paper,hmarginratio={3:2},bottom=0.8in,top=0.8in]{geometry} 4 | 5 | \usepackage{times} 6 | \usepackage[Lenny]{fncychap} 7 | 8 | \usepackage[spanish]{babel} 9 | \usepackage[utf8x]{inputenc} 10 | \usepackage[T1]{fontenc} 11 | 12 | \usepackage{mathptmx} 13 | \usepackage{etoolbox} 14 | 15 | \usepackage[titles]{tocloft} 16 | 17 | \usepackage{pdfpages} 18 | 19 | \usepackage{courier} 20 | 21 | \renewcommand{\cftchapleader}{\cftdotfill{\cftdotsep}} 22 | 23 | % change the space before the titles 24 | \makeatletter 25 | \patchcmd{\@makechapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 26 | \patchcmd{\@makeschapterhead}{\vspace*{50\p@}}{\vspace*{0pt}}{}{} 27 | \makeatother 28 | 29 | % change the space after the titles 30 | \renewcommand{\DOTI}[1]{% 31 | \raggedright 32 | \CTV\FmTi{#1}\par\nobreak 33 | \vskip 10pt} 34 | \renewcommand{\DOTIS}[1]{% 35 | \raggedright 36 | \CTV\FmTi{#1}\par\nobreak 37 | \vskip 10pt} 38 | 39 | 40 | \title{Capítulos sueltos} 41 | \author{Juan José Conti} 42 | \date{} 43 | 44 | 45 | 46 | % Avoid widows and orphans 47 | \widowpenalty=10000 48 | \clubpenalty=10000 49 | 50 | \begin{document} 51 | 52 | \pagenumbering{gobble} 53 | 54 | \pagestyle{plain} 55 | 56 | 57 | % IF PRINT 58 | %\includepdf{empty.pdf} 59 | %\includepdf{empty.pdf} 60 | 61 | \maketitle 62 | 63 | \cleardoublepage 64 | 65 | \thispagestyle{empty} 66 | \noindent 67 | Edición automágica, 2016.\\ 68 | 69 | \vspace{0.5cm} 70 | 71 | \noindent 72 | \emph{Capítulos sueltos} lleva la licencia 73 | \emph{Creative Commons Attribution - NonCommercial - ShareAlike 4.0 Iternational}. 74 | Esto significa que podés compartir esta obra y crear obras derivadas 75 | mencionando al autor, pero no ha\-cer un uso comercial de ella. 76 | 77 | \vfill 78 | 79 | \noindent 80 | %Más información sobre este libro:\\ 81 | \\ 82 | 83 | \cleardoublepage 84 | 85 | 86 | \renewcommand*\contentsname{Índice} 87 | 88 | \tableofcontents 89 | 90 | 91 | \cleardoublepage 92 | 93 | \pagenumbering{arabic} 94 | 95 | 96 | 97 | 98 | 99 | \chapter*{Un bien más para el consumo} \addcontentsline{toc}{chapter}{Un bien más para el consumo} 100 | 101 | 102 | 103 | Hoy lo escuché en las noticias. 104 | 105 | Sé que en otros países ya se puede, pero pensé que me iba a morir antes de que lo permitieran acá. 106 | 107 | De los viajes en el tiempo se sabe desde hace más de cinco años. El primer viaje publicitado fue en Estados Unidos, durante un programa de televisión. Los encargados de la demostración fueron dos militares. Uno se llamaba John y el otro Carl pero me voy a referir a ellos como Juan y Carlos, para que me sea más fácil contarles la anécdota. 108 | 109 | Primero salió un paper en una revista científica y en menos de dos meses ya había grupos de investigación en todo el mundo trabajando (ahí fue cuando lo vi en un diario de aca). En algunos artículos, además de los enunciados teóricos que todos repiten pero casi nadie entiende, se describían experimentos. Recuerdo incluso el recuadrito con la formula esa: la copiaban y pegaban como si fuera un elemento de decoración. Todos los artículos del tema incluían la fórmula: ni siquiera la volvían a escribir, la copiaban y la pegaban como una imagen más, como si fuera una foto. 110 | 111 | La de la fórmula podría ser una historia en sí misma: pasó a ser un elemento de cultura pop: una vez la vi escrita con aerosol en una pared. 112 | 113 | Se estuvo hablando del tema como un año hasta que por fin se anunció una demostración pública. La propaganda empezó un mes antes, inundando todos los medios de comunicación. No podías ver la hora en tu reloj sin que te salte uno de esos cartelitos: “27 de febrero, primer demostración pública de viaje en el tiempo”. Era en el prime time norteamericano pero acá era de tarde. Un rato antes de la hora, me senté frente a la pantalla. En el centro del estudio, sentados en dos sillones, bien al estilo de los programas de entrevistas de los años dos mil, estaban Juan y Carlos. Los dos de verde musgo. 114 | 115 | Entonces el conductor del programa, vestido en un traje azul cansino, entró con un micrófono de mano y saludó al público. El micrófono de mano era más bien un detalle de los ochenta, pero no desentonaba en esa puesta en escena estrafalaria. El hecho de que hubiera público en una emisión, también era totalmente anacrónico, pero supongo que la mezcla habrá logrado el objetivo que buscaban los productores de aquel evento. 116 | 117 | “¡Muy buenas noches, América! ¡Muy buenas noches, mundo!”, gritó el conductor y una catarata de gritos y aplausos estremeció el lugar. “Estamos aquí con el sargento Juan y el cabo Carlos, quienes serán los encargados de poner en práctica un ejercicio de libro de viaje en el tiempo. Podría por favor, sargento Juan, contarnos en qué consiste el experimento. ¿Está bien que lo llame así, experimento?”. 118 | 119 | Juan habló serio, con voz grave: “sí, cómo no, señor, le explico. En primer lugar una pequeña corrección. Tiene razón en dudar del término. Lo que vamos a realizar aquí no es un experimento ya que no es un procedimiento mediante el cual se trate de comprobar una hipótesis relacionada con un determinado fenómeno, sino que lo que vamos a hacer es ejecutar un ejercicio controlado en el cual tanto las acciones como los resultados son fijos. Lo que haremos aquí tendrá consecuencias que se conocen de antemano. Sus efectos han sido medidos y se ha determinado que su ejecución es segura. El viaje en el tiempo es una ciencia en desarrollo y debe ser utilizada con estricto cuidado y con rigurosa supervisión.” 120 | 121 | “Entendido... sargento Juan”, y el conductor hizo una especie de venia ridícula. “Cuéntenos entonces, ahora sí, en qué consistirá la ejecución del ejercicio controlado” y mencionó las últimas cuatro palabras de un modo sutilmente diferente, como si no le hubiese gustado para nada la desacreditación en cámara. El sargento Juan no hizo caso y explicó: 122 | 123 | “El ejercicio consiste en lo siguiente: esto que tengo aquí en mi muñeca, con forma de reloj, es un dispositivo construido en base a la teoría original más muchos desarrollos propios que ha hecho el gobierno…” 124 | 125 | “La fórmula”, interrumpió el conductor, diciéndole con solemnidad esa palabra a la vez genérica y vacía. 126 | 127 | “Sí”, sentenció Juan, mientras que con la mirada le decía que no quería ser interrumpido. 128 | 129 | “Voy a viajar media hora al pasado y voy a encontrarlo al cabo Carlos solo en su camarín. Sabemos que él va a estar solo, nos hemos asegurado de eso. Si bien yo estoy preparado psicológicamente para encontrarme conmigo mismo, no hay razón para forzar ese momento incómodo. Apenas lo encuentre voy a raparle la cabeza y luego voy a regresar”. 130 | 131 | Y entonces, apretó algo en su reloj y desapareció. El estudio pareció congelarse. El público se quedó en silencio. El conductor también, aunque tenía la boca abierta y el micrófono apuntando a ella. 132 | 133 | Dos minutos después, Juan reapareció y siguió hablando: “Como se habrán dado cuenta, el ejercicio ya tuvo lugar”. 134 | 135 | Vi en la pantalla cómo el público abucheaba. Yo también lo hice. Carlos había tenido la cabeza rapada desde el momento que se sentó en el sillón. Lo único que el sargento Juan había hecho era un truco de desaparición de prestidigitador de ferias. 136 | 137 | El conductor, más confundido que enojado, hizo un gesto con las manos hacia el público para intentar calmarlos. Cuando el clamor bajó, el sargento Juan siguió hablando: 138 | 139 | “Alguien podría pensar que el resultado exitoso de un ejercicio como este sería que el cabo Carlos hubiera entrado con una enorme cabellera y que se volviera pelado en un abrir y cerrar de ojos ante ustedes.” 140 | 141 | Una risa incómoda recorrió el lugar. 142 | 143 | “Creanlo o no, algo así es lo que viví desde mi perspectiva. Cuando entramos con el cabo Carlos, él realmente tenía mucho más pelo que ahora. Yo viajé al pasado y lo rapé, pero desde la perspectiva de ustedes, él estuvo rapado todo el tiempo desde que ingresó porque lo rapé antes de que entráramos. A la realidad que se genera luego de un viaje en el tiempo, la llamamos iteración. Si antes de mi viaje estábamos viviendo en la iteración N, ahora estamos en la iteración N + 1”. 144 | 145 | Yo debí haber puesto la misma cara de desconcierto que el conductor. 146 | 147 | La disconformidad del público aumentó y lo hizo saber. 148 | 149 | “Tranquilidad, por favor”, gritó el conductor. “Tengo entendido que los militares va a realizar una segunda demostración”. 150 | 151 | “Así es”, dijo Carlos, tomando la palabra por primera vez en la noche. “Esta segunda prueba tendrá un impacto visual y calmará un poco las ansias. Voy a meter esta lapicera en esta caja y la voy a colocar aquí en el centro. Ahora me voy a dar vuelta por veinte segundos. Luego voy a viajar al pasado a robarme la lapicera y traerla de regreso”. Cerró la caja, se dió vuelta y empezó a contar. 152 | 153 | “Uno, dos, tres…” 154 | 155 | “¡Holly shit!” gritó el conductor. 156 | 157 | “¡La puta que lo parió”, grité yo. 158 | 159 | El sargento Juan sonreía. 160 | 161 | El cabo Carlos seguía contando tranquilo de espaldas: “...cinco, seis…”. 162 | 163 | Y otro Carlos entró al estudio, frente a todas las cámaras y todo el público, en puntas de pie. Todo el mundo gritaba y este se llevaba un dedo a los labios para pedirles silencio. Parecía un mimo y con sus gestos se burlaba de su otro yo que contaba de espaldas. Luego, con la misma suavidad con la que se movía, destapó la caja, sacó la lapicera y la volvió a cerrar. Con exagerados gestos se la llevó al bolsillo de la camisa y luego, nuevamente con una sobreactuada forma de caminar en puntas de pie, salió tras bambalinas. 164 | 165 | El primer cabo Carlos terminó de contar y se dio vuelta. “¡Ya vuelvo!”, gritó y tocó algo en su muñeca. Desapareció y a los veinte segundos exactos volvió a aparecer en el mismo lugar. Se llevó la mano al bolsillo de la camisa y mostró la lapicera. No hizo falta que vuelva a abrir la caja. Habíamos entendido. 166 | 167 | Un grupo de personas irrumpió con violencia intentando robarle los relojes a los uniformados. Yo miraba la pantalla de pie. Entonces más uniformados entraron en escena y luego la transmisión se cortó. Caí sentado en mi sillón, tratando de procesar lo que había visto. Y recordando, recordando una promesa que me había hecho muchos años atrás. 168 | 169 | Al día siguiente los medios daban cuenta de lo que había sido la transmisión. En la redacción, podía no diferir mucho de otros experimentos o experiencias o ejercicios (el nombre es lo de menos) que habían sido descritos antes. Pero el efecto era distinto. Ahora era algo un poco más real. Ya no era teoría. 170 | 171 | De aquella primera demostración pública pasaron ya casi cuatro años. El resto es historia conocida: celebrities experimentando viajes y contando su experiencia a todo el mundo a través de las pantallas, anuncios del gobierno, las leyes que se proclamaron y luego lo inevitable: las manifestaciones. En todas las capitales del mundo y en ciudades más chicas también, las personas se concentraban exigiendo a sus gobernantes que esa tecnología estuviera disponible. Un bien más para el consumo. 172 | 173 | Los primeros fueron Estados Unidos y Alemania. Acá solo nos llegaban las publicidades. Me acuerdo de una particularmente famosa en la que se mostraba a un hombre de unos treinta y cinco años corriendo por un campo en China. El mismo hombre tomaba un vuelo, después corría por un aeropuerto y tomaba otro, después un tren, después un bus, después un taxi, siempre con la misma música punzante de fondo y el tic-tac de un reloj apenas perceptible. La publicidad terminaba cuando el hombre entraba corriendo a un hospital, abriendo con fuerza puertas blancas que se abrían al medio, una, dos, tres, hasta llegar a una cama vacía. La imagen se fundía a blanco y un mensaje en letras azules era proyectado: “Dé ese último abrazo”. 174 | 175 | Con el tiempo, los videos de las celebrities se hundieron en las pantallas y en su lugar flotaron más alto videos publicados por personas comunes contando sus historias, mostrando sus pequeños souvenirs, inofensivos objetos, como un autito de colección cuya obtención había sido autorizada. Lo más común era despedirse de familiares que habían muerto, pero también había historias más raras, como la de ese que usó sus cinco minutos en viajar al 22 de junio del año 1986, Argentina-Inglaterra, minuto 55 para ver cuando Maradona convertía el mejor gol de la historia. Por supuesto, cuando alguien lograba que le autoricen una originalidad como esa, muchas otras personas lo imitaban y cuando se llenaba de gente, ya nadie podía volver ahí. 176 | 177 | Desde mañana se van a poder tramitar solicitudes de viaje en el tiempo. 178 | 179 | 180 | 181 | Solo un mes después del anuncio pude acceder al sistema para solicitar mi viaje. Antes era imposible, todo estaba saturado. Sospecho que se trató de una saturación artificial. Un mecanismo impulsado por los poderosos para poder viajar primero. Una especie de primera clase. Pasa en los recitales, en los partidos de fútbol. ¿Por qué no iba a pasar con esto? Un mes entero esperé. Solo después de ese tiempo el sistema empezó a responder, a reaccionar, y los que no teníamos contactos, los caminantes, los que no nos acomodábamos, pudimos acceder. 182 | 183 | 184 | 185 | 186 | 187 | \chapter*{Yumiko} \addcontentsline{toc}{chapter}{Yumiko} 188 | 189 | 190 | 191 | Yumiko nació en Kodaira, al oeste de Tokio. Su mamá servía mesas en un gran comedor, junta a la planta principal de una compañía multinacional de neumáticos. Así, comentandole cual era el menú del día, la mamá de Yumiko conoció a quién sería su esposo. 192 | 193 | Yumiko creció sin hermanos y realizó en la ciudad sus estudios primarios y secundarios. A la hora de elegir una universidad, optó por estudiar medicina en la Universidad de Tokio. 194 | 195 | Un año antes de obtener su título, conoció a un joven que estudiaba literatura en la misma universidad. El joven la invitó a viajar como mochileros por sudamérica y Yumiko, desoyendo el consejo de sus padres, aceptó maravillada. 196 | 197 | Su vuelo los dejó en Río de Janeiro y luego de pasar pocos días en la ciudad volaron a Cuzco, donde realmente empezaba su viaje. Caminaban durante el día y acampaban en la noche. Yumiko no hablaba español, pero su compañero sí y se encargaba de hacer las compras de provisiones o de boletos para cuando querían recorrer distancias mayores a las que su ritual de caminar-acampar les permitía. 198 | 199 | El joven describía la naturaleza en sus versos mientras que Yumiko registraba en su cuaderno toda la información que obtenía de los pobladores locales sobre plantas medicinales. 200 | 201 | En las calles de Potosí una mujer con ropas coloridas pero el rostro cobrizo vendía un extraño ungüento a base a una planta del lugar que, según decía, sanaba cualquier dolor de los huesos. Yumiko, a través de su compañero-traductor, le insistió en que le revele el nombre de aquella planta pero la mujer, cuyas palabras eran apenas audibles, era un muro infranqueable para las acotadas palabras que el muchacho manejaba. 202 | 203 | Habían pasado tres meses de su llegada al continente cuando abandonaron Bolivia para adentrarse en Chile. Recorrieron la cordillera durmiendo en posadas de pequeños pueblos ya que las bajas temperaturas ponían en jaque a su carpa. Los pocos ahorros que habían llevado eran reforzados ofreciendo los servicios de enfermería de Yumiko y en una de sus escalas obtuvieron una buena cantidad de dinero pintando por completo una casa. 204 | 205 | Una mañana en que el sol rompía en haces púrpuras contra un lago, cruzaron la frontera con el objetivo de empezar a subir en lo que sería la segunda parte de su viaje. 206 | 207 | Habían comprado una bicicleta doble y con ella recorrían una ruta hacia el norte, cuando un camión los embistió en lo cerrado de la noche. 208 | 209 | Yumiko fue la única que sobrevivió al accidente. Su compañero y el camionero cerraron los ojos para siempre esa noche pero ella los volvió a abrir catorce meses después. 210 | 211 | Cuando despertó no recordaba nada. A eso se sumaba el problema de que no conocía el idioma. Los datos que se pudieron recuperar del accidente eran mínimos: su nombre y ciudad de origen en una credencial de la universidad. También se encontró un pasaje de vuelta a Japón que ya había vencido cuando ella despertó. Hubo algunos escasos y burocráticos intentos diplomáticos por devolverla a su país pero nunca se concretaron. Se logró una comunicación con sus padres, pero eran ancianos y no tenían dinero como para buscarla o repatriarla. 212 | 213 | Cuando estuvo lista para abandonar el hospital, sus autoridades se encontraban en la disyuntiva de qué hacer con ella. Entonces, la familia del camionero se presentó y se ofreció a recibirla en su casa mientras continuaba con sus rehabilitación y recuperaba la memoria. 214 | 215 | Así fue que durante el siguiente año, Yumiko no solo volvió a caminar y recuperó poco a poco la memoria, sino que también aprendió a hablar español. 216 | 217 | En la casa vivía la madre y la hermana del camionero. Ahora eran tres mujeres que se acompañaban en el día a día. 218 | 219 | Cuando Yumiko estuvo sana y fuerte, llamó a sus padres. Les dijo que no iba a volver. Quería devolver con su vocación algo a esa tierra que le había salvado la vida. 220 | 221 | En cada aniversario del día que Yumiko abandonó el hospital, las tres mujeres hacían un pequeño festejo, como si de su cumpleaños se tratara y Yumiko soplaba una vela sobre una pequeña torta. 222 | 223 | La madre y la hermana trabajaban cosiendo y lavando ropa. Durante dos años Yumiko hizo lo mismo que ellas durante el día. Durante la noche cursaba la carrera de enfermería. Cuando consiguió su título oficial, se presentó en el mismo hospital donde había permanecido en coma durante catorce meses y entregó su solicitud de trabajo en la recepción. 224 | 225 | Trabajó en la institución hasta que se jubiló. Y cuando lo hizo, siguió trabajando como cuidadora de ancianos. 226 | 227 | Una noche, el viejo de los microondas fue internado en el lugar. Yumiko fue designada para cuidarlo. En otra iteración de esta historia, el viejo le dijo lo que sentía por ella. 228 | 229 | 230 | 231 | 232 | 233 | \chapter*{Historia del aprendiz de programador} \addcontentsline{toc}{chapter}{Historia del aprendiz de programador} 234 | 235 | 236 | 237 | Juan Andrés llegó desde el pueblo con la idea romántica de convertirse en un programador de Software Libre. En la ciudad podría adquirir todos los conocimientos necesarios (iría a la universidad, asistiría a charlas y talleres) pero también podría ponerse en contacto con programadores de experiencia: auténticos hackers que trabajaban día a día mejorando software, manteniendo redes o configurando toda clase de equipamiento. 238 | 239 | Atrás quedaba el pequeño grupo de usuarios en el que a fuerza de leer revistas extranjeras exprimían el poco conocimiento al que podían acceder. En la ciudad también tendría la posibilidad de conectarse a Internet siempre que quisiera y, con eso, más conocimiento del que podría absorber. 240 | 241 | El primer día que llegó a la universidad recibió una pequeña hoja de papel con sus horarios y el carnet de la biblioteca. Guardó el carnet en la billetera y miró el cronograma. Eran las nueve de la mañana y su primera clase, Algoritmos y estructuras de datos, había empezado hacía cuarenta y cinco minutos. (Por un momento se arrepintió de haber elegido el turno mañana en lugar del turno tarde). Sin perder tiempo subió las escaleras y corrió por un largo pasillo mientras iba pasando por aulas numeradas: 12, 13, 14, 15. Esa era, aula 15. Cuando entró, ya todos los demás estaban sentados en sus lugares y un profesor canoso hablaba con una tiza en la mano. 242 | 243 | ---Llega tarde, alumno ---le dijo por todo saludo y apuntado con la tiza le indicó, cerca del fondo, el único banco libre del salón. 244 | 245 | El profesor, que se apellidaba Marina, continuó hablando y Juan Andrés alcanzó a anotar en su cuaderno la conclusión de aquella disertación: mientras más poderosas las estructuras de datos, más simples los algoritmos que tendrían que escribir. El corolario lógico de eso era que ante un problema, uno no debía, como primer paso, saltar a escribir código a toda velocidad sino tomarse un tiempo para evaluarlo y pensar cuál sería la mejor estructura de datos para resolverlo. Una vez que se había decidido eso, el algoritmo para terminar de darle solución al problema se revelaba solo, ante el programador, de una forma casi mágica. 246 | 247 | ---¿Qué lenguaje vamos a usar en esta clase? ---le preguntó Juan Andrés a Gonzalo, el muchacho que estaba sentado junto a él. 248 | 249 | ---C. Pero yo prefiero este ---dijo el otro. Y sacó de su mochila un ejemplar original de Programming Pearl, con el famoso dibujo del dromedario en la tapa. 250 | 251 | Juan Andrés tomó nota mental de encargar una copia de ese libro en la fotocopiadora más tarde. 252 | 253 | ---Es un poco complicado ---siguió Gonzalo---, pero mucho más dinámico. Y mirá esto. 254 | 255 | Mientras Marina seguía hablando, Gonzalo abrió el libro en una de las primeras páginas y señaló: estas son, según Larry Walls, las tres virtudes de los programadores: pereza, impaciencia e hibris. Pereza: cuando tenés que hacer algo por una segunda vez, antes de hacerlo preferís escribir un programa que lo haga por vos; esa y todas las veces siguientes. Es lo que hace que escribas programas que ahorren trabajo y escribas documentación para no tener que responder una y otra vez la misma pregunta. Impaciencia: cuando ese programa que escribiste corre demasiado lento, lo optimizás para que corra más rápido. 256 | 257 | ---¿Y qué es Hibris? 258 | 259 | ---Orgullo excesivo o ego desmesurado. Es una palabra griega. Es lo que hace que quieras publicar programas en internet para que otros vean tu código. Programas tan bien escritos que nadie pueda quejarse de ellos. ¡Aunque lograr esto último es imposible! ¡Jaja! 260 | 261 | ---En resumen… ---dijo Juan Andrés que se había quedado un poco perdido. 262 | 263 | ---Que los programadores somos haraganes, impacientes y arrogantes. 264 | 265 | ---¿Somos? ¿Vos ya sabés programar? 266 | 267 | Gonzalo se rió. 268 | 269 | ---Desde hace unos cinco años. Trabajo programando en la empresa de mi papá. 270 | 271 | Le dijo su nombre y le tendió la mano. 272 | 273 | Volvieron a darse la mano cuando un par de meses después decidieron formar equipo para resolver el trabajo práctico de la materia. La propuesta del profesor era desarrollar una hoja de cálculo desde cero; tendrían que elegir una estructura de datos a utilizar (¿una matriz?, ¿listas doblemente enlazadas?, ¿árboles binarios?) y escribir los algoritmos necesarios para que un usuario pueda realizar las operaciones de guardar un valor o una fórmula en una celda y leer el valor de una celda. La dificultad recaía en que una fórmula podía hacer referencia a otras celdas de la hoja de cálculo y los algoritmos de lectura debería tener esto en cuenta a la hora de leer un valor (¿calcularían cada valor cuando sea requerido o irían guardado los valores precalculados en alguna estructura de datos intermedia?). Muchas eran las preguntas y poco el tiempo para responderlas: tres semanas después debían entregar el trabajo y defenderlo. 274 | 275 | Juan Andrés no había mudado su computadora desde el pueblo así que todos los días, después del cursado, se juntaban en la casa de Gonzalo a trabajar. Gonzalo tenía su computadora en la pieza, así que podían quedarse trabajando hasta tarde, sin ser interrumpidos. Todos los días, a eso de las diez de la noche, la madre de Gonzalo tocaba la puerta y entraba con una bandeja con sándwiches o alguna otra cosa que se pueda comer rápido. Este sistema les funcionó durante las primeras dos semanas, pero en la tercera notaron que el tiempo se les iba acabando y aún no habían completado las funcionalidades requeridas, mucho menos habían podido probar en forma exhaustiva el programa, por lo que decidieron seguir trabajando en las computadoras de la facultad durante las horas libres y durante las horas de materias más aburridas. 276 | 277 | La facultad contaba con un laboratorio de diez computadoras del cual los alumnos podían disponer libremente previa obtención de un turno. Por lo general no había mucha demanda y siempre que llegaban a la sala solo tenían que firmar una planilla y sentarse en alguna de las computadoras desocupadas. Insertaban con mucho cuidado el disquete que tenía la última versión de su trabajo y se ponían a trabajar. Tipeaba uno u el otro en forma indistinta, su estilo de programación era similar por lo que no caían en las todas peleas de los programadores por el formato del código y los dos tenían conocían de principio a fin el programa. Eso sería útil para la defensa, ya que el profesor podría preguntar a cualquiera de los dos por cualquier parte del código. Cuando tenían que irse, se mandaban una copia del trabajo por mail y pisaban la versión del disquete; así y todo, a veces podían encontrarse nombres de archivo conviviendo como: VERSION-FINAL.zip, VERSION-FINAL-2.zip, VERSION-FINAL-3.zip, VERSION-FINAL-ULTIMA.zip, VERSION-FINAL (esta si es la versión final).zip. 278 | 279 | El jueves, luego de clases, se fueron a la casa de Gonzalo a dar los últimos retoques a su trabajo. Si bien solo faltaban algunos detalles de la interfaz de usuario, se quedaron despiertos toda la noche, haciendo pequeños ajustes y modificaciones. “¿Qué tal si le ponemos un menú desplegable?”, “Podríamos permitir pintar celdas de colores”, “¡Vamos a hacer que cuando el usuario apriete tal combinación de teclas se ejecute tal funcionalidad!”. La noche pasó entre Coca-Cola y cambios y se cumplió la Ley neumática de la programación. Esta ley dice que el trabajo que tiene que hacer un programador se comporta igual que un gas en un recipiente; donde el recipiente es el tiempo que el programador tiene para completar la tarea. El trabajo se expandirá para ocupar todo el tiempo. 280 | 281 | El viernes a la mañana, si no hubiese sido por la madre de Gonzalo, se hubiesen quedado dormidos. Cuando los despertó, faltaban veinte minutos para el horario de la entrega. Corrieron con el mentado disquete en la mano y justo cuando llegaban a la esquina también lo hacía el colectivo que tenían que tomar. Luego de quince minutos eternos, se bajaron en la puerta de la facultad y llegaron corriendo al aula 15. Cuando entraron estaba vacía. ¿Ya se habían ido todos? Deshicieron sus pasos y en la puerta encontraron un papel pegado: “Nos trasladamos al aula 21”. Eso quedaba en el otro ala de la facultad así que volvieron a correr. Cuando estaban llegando, ahora sí, se encontraron con otros alumnos. Ya todos habían entregado sus trabajos y debían esperar a que sean revisados para luego defenderlos. Un jefe de trabajos prácticos los vió llegar y les pidió su entrega. Le entregaron el disquete y una copia impresa de su trabajo. Ahora solo había que esperar. 282 | 283 | Aprovecharon el tiempo de espera para charlar con algunos compañeros. Hasta ese día, todos habían sido muy celosos de su implementación y no habían compartido con miembros de otros grupos las decisiones que habían tomado, pero ahora la suerte estaba echada, todos habían alcanzado, de alguna forma, el objetivo planteado (si no no estarían ahí) y el clima relajado que eso generaba, propiciaba el intercambio. No sabían cuánto tiempo habían esperado, cuando el jefe de trabajos prácticos los hizo pasar. 284 | 285 | Marina los saludó por su apellido y, con un gesto difícil de descifrar, se sacó los anteojos y los volvió a mirar. 286 | 287 | ---¿Qué vamos a hacer con ustedes? 288 | 289 | Los compañeros no sabían a qué se refería. 290 | 291 | ---Tengo dos trabajos exactamente iguales. Uno es el de ustedes y el otro es de un grupo del turno tarde. 292 | 293 | ---¡¿QUÉ?! ---Gonzalo saltó de su silla. 294 | 295 | ---No puede ser, no puede ser ---se repetía Juan Andrés más para sí mismo que para los otros---. Tiene que haber un error. 296 | 297 | ---No hay error. Se lo puedo mostrar si quieren: los nombres de las variables son distintos y algunas funciones están cambiadas de lugar, pero es obvio que uno es una copia del otro. Al menos que… 298 | 299 | ---¿Al menos que qué? ---se apresuró a preguntar Juan Andrés. 300 | 301 | ---A menos que no hayan cumplido la consigna y lo hayan hecho entre cuatro. 302 | 303 | ---No, nos lo tienen que haber copiado ---dijo Gonzalo sin un atisbo de duda en su voz. 304 | 305 | ---Los del otro grupo dicen lo mismo ---concluyó el profesor---. Así que vamos a hacer la defensa en conjunto. Confío en que los autores originales van a poder explicar el programa mucho mejor que los ladrones. 306 | 307 | ---¡Eso seguro! ---Gonzalo habló confiado. 308 | 309 | ---Muy bien ---dijo por fin el profesor---. Salgan un momento y luego vamos a llamar a ambos grupos. 310 | 311 | Los compañeros abandonaron el aula con un sabor agrio en la boca. ¿Cómo podía haber pasado eso? ¿Podría alguien haberse metido en la computadora de Gonzalo para robarles el trabajo? No, eso era ridículo. Alguien con esas habilidades podría haber resuelto sin esfuerzo el trabajo. Tenía que ser otra cosa. Entonces, al mismo tiempo, ambos llegaron a la misma conclusión: las computadoras públicas. No estaban seguros de, todas las veces, haber borrado el trabajo luego de copiarlo al disquete. 312 | 313 | 314 | 315 | \cleardoublepage 316 | 317 | %IMPRENTA 318 | %\includepdf{empty.pdf} 319 | 320 | \hspace{0pt} 321 | \vfill 322 | \begin{center} 323 | Maqueteado automáticamente utilizando \emph{Automágica}. 324 | \bigbreak 325 | http://www.juanjoconti.com/automagica/ 326 | \end{center} 327 | \vfill 328 | \hspace{0pt} 329 | \end{document} 330 | --------------------------------------------------------------------------------