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:
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 tikzpicture
s 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.