Cómo convertir un plano topográfico de tamaño din A1 en pdf para leerlo con un libro electrónico
Cómo convertir un plano topográfico de tamaño din A1 en pdf para leerlo con un libro electrónico
Disponemos de un mapa topográfico de tamaño din A1 en pdf, como por ejemplo, el mapa del Monsacro, obtenido de aquí, y deseamos imprimirlo de tal forma que se pueda visualizar cómodamente en un libro electrónico, donde la naturaleza de la tinta electrónica y las dimensiones de la pantalla dificultan considerablemente su visionado.
La forma más rápida y sencilla consiste en emplear el programa pdfposter, si bien no nos quedamos del todo satisfechos y decidimos editar el pdf a nuestro gusto. La principal ventaja respecto al programa anterior consiste en que creamos un libro en pdf que va muy fluido en el libro electrónico. El principal inconveniente reside en utilizar LaTeX para conseguir ese objetivo y R para automatizar el proceso.
LaTeX básico
Presentamos un ejemplo de cómo LaTeX permite editar un fichero en pdf de forma reiterada sin incrementar el tamaño del fichero original. Creamos una cabecera estándar.
\documentclass[a4paper,14pt]{extarticle} \usepackage[utf8]{inputenc} % Linux \usepackage[spanish,es-tabla,es-nodecimaldot,es-noshorthands]{babel} % Spanish titles \usepackage{fouriernc} % Type of font \usepackage[T1]{fontenc} % To deal with non ascii characters \usepackage{graphicx} % To include graphs. See epslatex.pdf \DeclareGraphicsExtensions{.pdf,.png,.jpg,.mps} \graphicspath{{graphics/}} \author{Emilio Torres-Manzanera}
Las medidas anteriores no sirven para una correcta visualización en el libro electrónico. Diseñamos una página que recoja las medidas de la pantalla de un libro electrónico. Con un metro medimos y resulta que el tamaño de la pantalla del Kobo Aura es de 12 cm. de alto y 9 cm. de ancho. Utilizamos el paquete pdfscreen
para simular en LaTeX esa pantalla.
\usepackage[screen,nopanel]{pdfscreen} \margins{0pt}{0pt}{0pt}{0pt} \screensize{12cm}{9cm} \parindent=0pt
Con el fin de reutilizar la misma imagen sin recargarla de forma reiterada, la almacenamos en un savebox. El fichero E05000520804.pdf debe estar accesible para el programa LaTeX.
\newsavebox\mybox \savebox{\mybox}{\includegraphics{E05000520804.pdf}}%
Y vamos a ir recortando esa caja mediante el paquete adjustbox
, y su opción trim
, que recorta por cada lado de la caja (en pt). Recordemos que un milímetro equivale 2.84526pt.
\usepackage[export]{adjustbox} %% trim=〈all sites〉 %% trim=〈left/right〉 〈top/bottom〉 %% trim=〈left〉 〈bottom〉 〈right〉 〈top〉
Asimismo, incluiremos hiperenlaces para facilitar el desplazamiento por el mapa.
\usepackage{hyperref}
Empezamos a dibujar partes del mapa. El comando \usebox{\mybox}
reutiliza la imagen original sin necesidad de leerla de nuevo. \adjustbox
recorta esa imagen por las medidas que deseamos. Estas medidas se han obtenido mediante ensayo y error, compilando este fichero con diferentes márgenes hasta encontrar las medidas adecuadas. Finalmente, \resizebox
establece las dimensiones en las que se presenta el recorte.
\begin{document}% %% Mapas de escala 50000 de Asturias \resizebox{\paperwidth}{!}{\adjustbox{trim=1450pt 50pt 690pt 1510pt,clip}{\usebox{\mybox}}}% %% Ubicación de este mapa de 5000 en la escala 50000 \resizebox{!}{0.55\paperheight}{\adjustbox{trim=1775pt 25pt 370pt 1478pt,clip}{\usebox{\mybox}}}% \newpage %% Descripción de la zona. \resizebox{\paperwidth}{!}{\adjustbox{trim=2095pt 273pt 50pt 1193pt,clip}{\usebox{\mybox}}}% %% Código del mapa \resizebox{\paperwidth}{!}{\adjustbox{trim=2095pt 573pt 50pt 1050pt,clip}{\usebox{\mybox}}}% {\tiny{} Centro de Cartografía del Principado de Asturias. Escala 1:5000.} \newpage
El siguiente input
lee los comandos en LaTeX generados automáticamente para dividir el mapa en la medida adecuada.
\input{todoscomandosmapa} \end{document}
Estos comandos etiquetan cada página y colocan hipervínculos a las páginas superiores e inferiores.
\resizebox{\paperwidth}{\paperheight}{% \adjustbox{trim=1273pt 627pt 864pt 724pt,clip}{\usebox{\mybox}}}% \phantomsection\label{row3col6}% \hspace*{-0.5\paperwidth}% \vspace*{-4cm}% \raisebox{1cm}[0in][0in]{\makebox[0em]{\pageref{row4col6}}}% \raisebox{11cm}[0in][0in]{\makebox[0em]{\pageref{row2col6}}}%
Recuerde compilar dos veces el fichero TeX para que los enlaces a cada página funcionen correctamente.
Creación del código de LaTeX para cada página
Utilizamos la programación R para generar el código de LaTeX para cada página. Primero introducimos las medidas del lector electrónico y las de la imagen original. Como LaTeX trabaja como pt, empleamos esta unidad de medida.
## %% dim A1 = 594 x 841 mm ## %% mm = 72 / 25.4 ## %% dim A1 = 1684 x 2411 pt ## %% 11 cm = 312 pt ## %% 7 cm = 198 pt ## %% la caja del mapa va de 50 300 375 40 ## %% trim=〈all sites〉 ## %% trim=〈left/right〉 〈top/bottom〉 ## %% trim=〈left〉 〈bottom〉 〈right〉 〈top〉 mmtopt <- 2.84526 ## Convert mm to pt https://tex.stackexchange.com/questions/8260/what-are-the-various-units-ex-em-in-pt-bp-dd-pc-expressed-in-mm dimscreen_h <- 120*mmtopt dimscreen_w <- 90*mmtopt dimpage_h <- 595*mmtopt dimpage_w <- 841*mmtopt ## %% trim=〈left〉 〈bottom〉 〈right〉 〈top〉 ## Trim main map left <- 50 bottom <- 300 right <- 375 top <- 40 trim <- c(left,bottom,right,top) names(trim) <- c("left","bottom","right","top") trimmainmap <- trim
Calculamos el número de filas y columnas en las que lo dividimos. Permitimos un solapamiento entre las diferentes páginas.
## Calculate numbers of columns dimmap_w <- ((dimpage_w) - as.numeric(trimmainmap["left"] + trimmainmap["right"])) numberofcolumns <- ceiling( dimmap_w / dimscreen_w) ##numberofcolumns <- 10^ceiling(log(numberofcolumns,10)) ## Calculate numbers of rows dimmap_h <- ((dimpage_h) - as.numeric(trimmainmap["bottom"] + trimmainmap["top"])) numberofrows <- ceiling( dimmap_h/ dimscreen_h) print(paste("Number of columns",numberofcolumns)) print(paste("Number of rows",numberofrows)) overlap_w <- (dimscreen_w*numberofcolumns - dimmap_w)/(numberofcolumns-1) overlap_h <- (dimscreen_h*numberofrows - dimmap_h)/(numberofrows-1) print(paste("Overlap w",overlap_w)) print(paste("Overlap h",overlap_h))
Ahora toca calcular las posiciones de los márgenes a recortar dependiendo de la columna y la fila. Computamos dichos valores e implementamos su código en LaTeX.
todoscomandos <- NULL row <- 1 col <- 1 for(row in 1:numberofrows){ for(col in 1:numberofcolumns){ labelpage <- paste0("row",row,"col",col) left <- round(trimmainmap["left"] + ifelse(col == 1,0, dimscreen_w*(col-1)-overlap_w*(col-1))) right <- round(dimpage_w - (left + dimscreen_w)) top <- round(trimmainmap["left"] + ifelse(row == 1,0, dimscreen_h*(row-1)-overlap_h*(row-1))) bottom <- round(dimpage_h - (top + dimscreen_h)) labelarriba <- ifelse(row==1,"",paste0("\\pageref{row",row-1,"col",col,"}")) labelabajo <- ifelse(row==numberofrows,"",paste0("\\pageref{row",row+1,"col",col,"}")) margins <- paste0(left,"pt ",bottom,"pt ",right,"pt ",top,"pt") comandos <- paste0(" \\resizebox{\\paperwidth}{\\paperheight}{% \\adjustbox{trim=",margins,",clip}{\\usebox{\\mybox}}}% \\phantomsection\\label{",labelpage,"}% \\hspace*{-0.5\\paperwidth}% \\vspace*{-4cm}% \\raisebox{1cm}[0in][0in]{\\makebox[0em]{",labelabajo,"}}% \\raisebox{11cm}[0in][0in]{\\makebox[0em]{",labelarriba,"}}% \\newpage\n\n ") todoscomandos <- paste(todoscomandos,comandos) } }
Por último, salvamos estos comandos en el fichero que luego será llamado por LaTeX.
cat(todoscomandos,file="todoscomandosmapa.tex")
El resultado
Hemos generado un documento en pdf fácil de leer y manejar con un libro electrónico. Presionando a la izquierda o la derecha se desplaza a la zona correspondiente, mientras que si pincha en los números superior o inferior, se visualiza la página que contiene la proporción del plano superior o inferior, respectivamente (en la figura de abajo la página 4 y la 20). Además, existe un solapamiento entre las páginas. Este documento está optimizado para su visualización en un libro electrónico.
Aquí están todos los ficheros que se generan o necesitan.