Saltar al contenido

Cómo escalar una imagen tikz a textwidth

Nuestros investigadores estrellas han agotado sus provisiones de café, buscando diariamente por la solución, hasta que Marisol encontró el arreglo en GitHub por lo tanto ahora la comparte aquí.

Solución:

Esta pregunta fue hecha en comp.text.tex y recibió una buena respuesta de Ulrike Fischer. Funciona componiendo el tikzpicture una vez, mida su ancho y luego vuelva a escribirlo al ancho correcto calculando automáticamente la escala requerida.

Aquí hay una interfaz más fácil de usar para esta solución usando el paquete environment. Funciona usando un scaletikzpicturetowidth entorno con el ancho deseado como primer argumento en combinación con la especificación del [scale=tikzscale] opción al tikzpicture. Por ejemplo, para escalar un tikzpicture para textwidth, usarías:

begincenter
beginscaletikzpicturetowidthtextwidth
begintikzpicture[scale=tikzscale]
draw (0,0) rectangle (1,1) node[below left] $A$;
draw (2,1) circle (1cm) node [below] $B$;
endtikzpicture
endscaletikzpicturetowidth
endcenter

Aquí hay un código compilable completo que muestra tanto el sin escalar tikzpicture y el escalado:

tikzpicture sin escalar y escalado en comparación

documentclassarticle
usepackagetikz
usepackageenviron
makeatletter
newsavebox[email protected]
NewEnvironscaletikzpicturetowidth[1]% def[email protected]#1% deftikzscale1beginlrbox[email protected]% BODY endlrbox% pgfmathparse#1/wd[email protected]% edeftikzscalepgfmathresult% BODY makeatother begindocument Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. begincenter begintikzpicture draw (0,0) rectangle (1,1) node[below left] $A$; draw (2,1) circle (1cm) node [below] $B$; endtikzpicture endcenter Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. begincenter beginscaletikzpicturetowidthtextwidth begintikzpicture[scale=tikzscale] draw (0,0) rectangle (1,1) node[below left] $A$; draw (2,1) circle (1cm) node [below] $B$; endtikzpicture endscaletikzpicturetowidth endcenter Bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla bla. enddocument

1)

Para los más pequeños tikzpictures simplemente puede usar el resizebox macro desde el graphics (o graphicx) paquete:

resizeboxtextwidth!%
begintikzpicture
  draw (0,0) .... ;
endtikzpicture
%

Sin embargo, esto hace que la imagen forme parte de un macro argumento que, por ejemplo, no permite texto literal dentro de los nodos. TikZ en sí mismo hace un esfuerzo para procesar el contenido del nodo como caja no como macro argumento para permitir cualquier forma de código en su interior, incluso textualmente.

El uso de la environ el paquete también debe evitarse en el caso general porque también hace que el cuerpo ambiental sea un macro argumento.


2)

En puede simplemente definir su propio entorno usando lrbox como en la respuesta de Philippe, pero como normal medio ambiente y con resizebox:

newsaveboxmybox
newenvironmentresizedtikzpicture[1]%
  defmywidth#1%
  beginlrboxmybox%
  begintikzpicture
%
  endtikzpicture%
  endlrbox%
  resizeboxmywidth!useboxmybox%

%
% Usage example:
beginresizedtikzpicturetextwidth[]
  draw .... ;
endresizedtikzpicture

3)

Recientemente creé el paquete adjustbox para dar a los usuarios el poder de includegraphics opciones para texto u otros contenidos. Esto se puede usar aquí muy bien:

% Preamble
usepackageadjustbox

% Document
beginadjustboxwidth=textwidth% there is also 'max width' to only scale it down if it is larger
begintikzpicture[]
  draw .... ;
endtikzpicture
endadjustbox

Admite contenido textual y otro contenido especial y funciona con texto normal y con otros entornos de imágenes.

Quizás la forma más sencilla de usar coordenadas relativas es usar scale=textwidth/1cm y luego solo use valores entre 0 y 1 para sus coordenadas (asumiendo que su tamaño de escala básico es de 1 cm). También puedes estimar el tamaño de tu figura y usar el mismo truco. Tuve ese problema porque la figura ya estaba hecha y quería escalarla después.

begintikzpicture[scale=textwidth/15.2cm,samples=200]
    %x axis
    draw[->] (-0.1,0) -- (15.1,0) node[below] $x$;

    %y axis
    draw[->] (0,-0.1) -- (0,6.1) node[left] $y$;

    %exponential function
    draw[color=red, thick, domain=0.0:9.5] plot[id=efunc] function1.5**(x-5) - 1.5**(-5) + 0.1 node[color=red, anchor=west] $y = e^x$;

    %logistic function
    draw[color=blue, thick, domain=0.0:15.0] plot[id=logfunc] function5/(1 + 2**(-x+7.5)) - 5/(1 + 2**(7.5)) + 0.1 node[color=blue, anchor=north east] $y = cfrac11 + e^-x$;
endtikzpicture

Más adelante puedes encontrar las referencias de otros creadores, tú además puedes insertar el tuyo si lo deseas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *