Estoy intentando alinear una tabla y un gráfico pgfplots usando minipágina. Intenté medir la altura de la mesa y configurarla en el gráfico, pero todavía están desalineadas. Idealmente, los títulos deberían estar a la misma altura y la tabla y los diagramas de página deberían tener las mismas dimensiones. Además de eso, hay una casilla defectuosa que debo eliminar.
Código:
\documentclass[a4paper,12pt,twoside]{article}
\usepackage{geometry}
\geometry{
inner=30mm,
top=30mm,
outer=20mm,
bottom=20mm
}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{caption}
\usepackage{pgfplots}
\usepackage[no-math]{fontspec}
\setmainfont{TeX Gyre Termes}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}
\usepackage[cal=pxtx]{mathalpha}
\setmathfont[range={\mdblkcircle,\mdblksquare,\mdblkdiamond,\blacktriangle,\blacktriangledown,\smallblacktriangleleft,\smallblacktriangleright,\bigstar,\maltese}]{STIX Two Math}
\pgfplotsset{compat=newest}
\newsavebox{\tablebox}
\newlength{\tableheight}
\newenvironment{resizedtabular}[1]
{\begin{lrbox}{\tablebox}\begin{tabular}{#1}}
{\end{tabular}\end{lrbox}%
\sbox{\tablebox}{\resizebox{\textwidth}{!}{\usebox{\tablebox}}}%
\global\tableheight=\ht\tablebox
\global\advance\tableheight\dp\tablebox
\usebox{\tablebox}}
\newsavebox{\measuredSize}
\newcommand{\resizeToWidth}[2]{%
\pgfmathsetmacro{\pgfplotswidth}{#2}%
\begin{lrbox}{\measuredSize}#1\end{lrbox}%
\pgfmathsetmacro{\pgfplotswidth}{2*\pgfplotswidth-\wd\measuredSize}%
#1%
}
\newcommand{\inputPlot}{
\begin{tikzpicture}
\begin{axis}[xmin=90,xmax=610,ymin=0,ymax=1.2,tick pos=left,height=\tableheight,width=\pgfplotswidth,xlabel=XX,ylabel=XX]
\node[above] at (129.746, 0.10363) {$\mdblkcircle$};
\node[above] at (161.767, 0.13399) {$\mdblksquare$};
\node[above] at (194.096, 0.05136) {$\mdblkdiamond$};
\node[above] at (316.332, 0.06316) {$\blacktriangle$};
\node[above] at (329.88, 0.07794) {$\blacktriangledown$};
\node[above] at (376.988, 1) {$\smallblacktriangleleft$};
\node[above] at (429.946, 0.03925) {$\smallblacktriangleright$};
\node[above] at (468.742, 0.07811) {$\bigstar$};
\node[above] at (592.825, 0.04339) {$\maltese$};
\end{axis}
\end{tikzpicture}}
\begin{document}
\begin{table}
\begin{minipage}[c]{0.49\textwidth}
\centering
\begin{resizedtabular}{@{}ccccc@{}}
\toprule
\multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5}
& XX & XX & XX & XX \\ \cmidrule(r){1-1}
$\mdblkcircle$ & 130 & 130 & 130 & 130 \\
$\mdblksquare$ & 162 & 162 & 162 & 163 \\
$\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
$\blacktriangle$ & 316 & 318 & 317 & 318 \\
$\blacktriangledown$ & 330 & 330 & 328 & 331 \\
$\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
$\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
$\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
$\maltese$ & 593 & 591 & 591 & 595 \\ \bottomrule
\end{resizedtabular}
\caption{Some Caption.}
\end{minipage}%
\hfill
\begin{minipage}[c]{0.49\textwidth}
\resizeToWidth{\inputPlot}{\textwidth}
\captionof{figure}{Some Caption.}
\end{minipage}
\end{table}
\end{document}
Cualquier ayuda sería apreciada.
Respuesta1
Propongo una solución basada en el xcoffin
paquete. El código se agregó al final del código del OP para facilitar la comparación.
Los cuatro elementos los puse: trama, cuadro y respectivos pies de foto, sin mayor manipulación, en xcoffins, cajas con asas que permiten una fácil alineación entre sí. También agregué un \fbox
contorno alrededor del gráfico para que sea más fácil comparar anchos y altos. Las reglas de color muestran la posición de los títulos, centradas y alineadas según lo solicitado.
xcoffin
Se pueden encontrar explicaciones un poco más extensas sobre la aplicación en preguntas anteriores y respuestas a problemas, en cierto modo, similares.
¿Crear una caja usando el paquete tcolorbox o cualquier otro? (imagen)
Deje espacio para tres logotipos en la página de título.
Necesito un diseño bastante complejo para una edición académica y no sé por dónde empezar
\documentclass[a4paper,12pt,twoside]{article}
\usepackage{geometry}
\geometry{
inner=30mm,
top=30mm,
outer=20mm,
bottom=20mm
}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{caption}
\usepackage{pgfplots}
\usepackage[no-math]{fontspec}
\setmainfont{TeX Gyre Termes}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}
\usepackage[cal=pxtx]{mathalpha}
\setmathfont[range={\mdblkcircle,\mdblksquare,\mdblkdiamond,\blacktriangle,\blacktriangledown,\smallblacktriangleleft,\smallblacktriangleright,\bigstar,\maltese}]{STIX Two Math}
\pgfplotsset{compat=newest}
\newsavebox{\tablebox}
\newlength{\tableheight}
\newenvironment{resizedtabular}[1]
{\begin{lrbox}{\tablebox}\begin{tabular}{#1}}
{\end{tabular}\end{lrbox}%
\sbox{\tablebox}{\resizebox{\textwidth}{!}{\usebox{\tablebox}}}%
\global\tableheight=\ht\tablebox
\global\advance\tableheight\dp\tablebox
\usebox{\tablebox}}
\newsavebox{\measuredSize}
\newcommand{\resizeToWidth}[2]{%
\pgfmathsetmacro{\pgfplotswidth}{#2}%
\begin{lrbox}{\measuredSize}#1\end{lrbox}%
\pgfmathsetmacro{\pgfplotswidth}{2*\pgfplotswidth-\wd\measuredSize}%
#1%
}
\newcommand{\inputPlot}{%
\begin{tikzpicture}
\begin{axis}[xmin=90,xmax=610,ymin=0,ymax=1.2,tick pos=left,height=\tableheight,width=\pgfplotswidth,xlabel=XX,ylabel=XX]
\node[above] at (129.746, 0.10363) {$\mdblkcircle$};
\node[above] at (161.767, 0.13399) {$\mdblksquare$};
\node[above] at (194.096, 0.05136) {$\mdblkdiamond$};
\node[above] at (316.332, 0.06316) {$\blacktriangle$};
\node[above] at (329.88, 0.07794) {$\blacktriangledown$};
\node[above] at (376.988, 1) {$\smallblacktriangleleft$};
\node[above] at (429.946, 0.03925) {$\smallblacktriangleright$};
\node[above] at (468.742, 0.07811) {$\bigstar$};
\node[above] at (592.825, 0.04339) {$\maltese$};
\end{axis}
\end{tikzpicture}}
\usepackage{xcoffins}
\begin{document}
\begin{table}
\begin{minipage}[c]{0.49\textwidth}
\centering
\begin{resizedtabular}{@{}ccccc@{}}
\toprule
\multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5}
& XX & XX & XX & XX \\ \cmidrule(r){1-1}
$\mdblkcircle$ & 130 & 130 & 130 & 130 \\
$\mdblksquare$ & 162 & 162 & 162 & 163 \\
$\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
$\blacktriangle$ & 316 & 318 & 317 & 318 \\
$\blacktriangledown$ & 330 & 330 & 328 & 331 \\
$\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
$\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
$\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
$\maltese$ & 593 & 591 & 591 & 595 \\ \bottomrule
\end{resizedtabular}
\caption{Some Caption.}
\end{minipage}%
\hfill
\begin{minipage}[c]{0.49\textwidth}
\resizeToWidth{\inputPlot}{\textwidth}
\captionof{figure}{Some Caption.}
\end{minipage}
\end{table}
%%%%%%%%**************** xcoffin solution
\textbf{The xcoffin solution}
\NewCoffin\Framex
\NewCoffin\Tablex
\NewCoffin\CaptionTablex
\NewCoffin\Plotx
\NewCoffin\CaptionPlotx
\NewCoffin\Hrule %for degugging
\SetHorizontalCoffin\Hrule{\color{red}\rule{\textwidth}{0.2pt}}
\NewCoffin\Vrule %for degugging
\SetHorizontalCoffin\Vrule{\color{green}\rule{0.2pt}{0.5\textheight}}
\SetHorizontalCoffin\Tablex{%
\begin{minipage}[c]{0.49\textwidth}
\begin{resizedtabular}{@{}ccccc@{}}
\toprule
\multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5}
& XX & XX & XX & XX \\ \cmidrule(r){1-1}
$\mdblkcircle$ & 130 & 130 & 130 & 130 \\
$\mdblksquare$ & 162 & 162 & 162 & 163 \\
$\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
$\blacktriangle$ & 316 & 318 & 317 & 318 \\
$\blacktriangledown$ & 330 & 330 & 328 & 331 \\
$\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
$\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
$\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
$\maltese$ & 593 & 591 & 591 & 595 \\ \bottomrule
\end{resizedtabular}
\end{minipage}
}
\SetVerticalCoffin\CaptionTablex{0.49\textwidth}{\captionof{table}{Some Caption.}}
\SetHorizontalCoffin\Plotx{%
\fbox{\begin{minipage}[c]{0.49\textwidth}
\resizeToWidth{\inputPlot}{\textwidth}
\end{minipage}}
}
\SetVerticalCoffin\CaptionPlotx{0.49\textwidth}{\captionof{figure}{Some Caption.}}
\ResizeCoffin\Plotx{0.49\textwidth}{\CoffinTotalHeight\Tablex} % adjust plot height to table height
\JoinCoffins*\Framex[hc,vc]\Tablex[l,t]
\JoinCoffins*\Framex[\Tablex-hc, \Tablex-b]\CaptionTablex[hc,t](0pt,-2ex) %down shift of 2ex
\JoinCoffins*\Framex[ \Tablex-r, \Tablex-t]\Plotx[l,t](10pt,0pt) %right shift of 10pt
\JoinCoffins*\Framex[\Plotx-hc, \Plotx-b]\CaptionPlotx[hc,t](0pt,-2ex) %down shift of 2ex
%%------------------------------- checks
\JoinCoffins*\Framex[hc,vc]\Hrule[l,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-l,\Tablex-b]\Hrule[l,t] % comment after cheking alignment
\JoinCoffins*\Framex[\CaptionTablex-l,\CaptionTablex-vc]\Hrule[l,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Plotx-hc,\Plotx-t]\Vrule[r,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-hc,\Tablex-t]\Vrule[r,t] % comment after cheking alignment
%%-------------------------------------
\noindent\TypesetCoffin\Framex
\end{document}
La única mejora hasta ahora es la alineación de los subtítulos. (No se detectó ningún cuadro defectuoso por mi parte, al compilar el código anterior). Pero lo podemos hacer mejor.
El ancho natural de la mesa es menor que 0.49\textwidth
. Entonces, al cambiar el tamaño de esa longitud también estás ampliando el tamaño de la fuente y, en consecuencia, no coincide con los del gráfico. Con algunos pequeños cambios puedes obtener una salida con un aspecto más armónico ( \fbox
agregado):
\documentclass[a4paper,12pt,twoside]{article} %only coffin
\usepackage{geometry}
\geometry{
inner=30mm,
top=30mm,
outer=20mm,
bottom=20mm
}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{caption}
\usepackage{pgfplots}
\usepackage[no-math]{fontspec}
\setmainfont{TeX Gyre Termes}
\usepackage{unicode-math}
\setmathfont{TeX Gyre Termes Math}
\usepackage[cal=pxtx]{mathalpha}
\setmathfont[range={\mdblkcircle,\mdblksquare,\mdblkdiamond,\blacktriangle,\blacktriangledown,\smallblacktriangleleft,\smallblacktriangleright,\bigstar,\maltese}]{STIX Two Math}
\pgfplotsset{compat=newest}
\usepackage{xcoffins} %<<<< added
\usepackage{calc} %<<<< added
\usepackage{kantlipsum}%<<<< added
\begin{document}
\textbf{The xcoffin solution v2}
\NewCoffin\Framex
\NewCoffin\Tablex
\NewCoffin\CaptionTablex
\NewCoffin\Plotx
\NewCoffin\CaptionPlotx
\NewCoffin\Hrule %for degugging
\SetHorizontalCoffin\Hrule{\color{red}\rule{\textwidth}{0.2pt}}
\NewCoffin\Vrule %for degugging
\SetHorizontalCoffin\Vrule{\color{green}\rule{0.2pt}{0.5\textheight}}
\SetHorizontalCoffin\Tablex{%
\begin{tabular}{@{}ccccc@{}}
\toprule
\multirow{2}{*}{XX} & \multicolumn{4}{c}{XX} \\ \cmidrule(l){2-5}
& XX & XX & XX & XX \\ \cmidrule(r){1-1}
$\mdblkcircle$ & 130 & 130 & 130 & 130 \\
$\mdblksquare$ & 162 & 162 & 162 & 163 \\
$\mdblkdiamond$ & 194 & 194 & 192 & 195 \\
$\blacktriangle$ & 316 & 318 & 317 & 318 \\
$\blacktriangledown$ & 330 & 330 & 328 & 331 \\
$\smallblacktriangleleft$ & 377 & 377 & 377 & 379 \\
$\smallblacktriangleright$ & 430 & 430 & 429 & 432 \\
$\bigstar$ & 469 & $\dagger$ & 469 & 471 \\
$\maltese$ & 593 & 591 & 591 & 595 \\
\bottomrule
\end{tabular}
}
\newlength{\TableH}
\setlength{\TableH}{\CoffinTotalHeight\Tablex}
\SetVerticalCoffin\CaptionTablex{\CoffinWidth\Tablex}{\captionof{table}{Some Caption.\label{tab1}}}
\SetHorizontalCoffin\Plotx{%
\fbox{%
\begin{tikzpicture}
\begin{axis}[xmin=90,xmax=610,ymin=0,ymax=1.2,tick pos=left,height=\TableH,width=0.6\textwidth,xlabel=XX,ylabel=XX]
\node[above] at (129.746, 0.10363) {$\mdblkcircle$};
\node[above] at (161.767, 0.13399) {$\mdblksquare$};
\node[above] at (194.096, 0.05136) {$\mdblkdiamond$};
\node[above] at (316.332, 0.06316) {$\blacktriangle$};
\node[above] at (329.88, 0.07794) {$\blacktriangledown$};
\node[above] at (376.988, 1) {$\smallblacktriangleleft$};
\node[above] at (429.946, 0.03925) {$\smallblacktriangleright$};
\node[above] at (468.742, 0.07811) {$\bigstar$};
\node[above] at (592.825, 0.04339) {$\maltese$};
\end{axis}
\end{tikzpicture}
}
}
\ResizeCoffin\Plotx{0.6\textwidth}{\TableH}
\SetVerticalCoffin\CaptionPlotx{\CoffinWidth\Plotx}{\captionof{figure}{Some Caption.\label{fig1}}}
\JoinCoffins*\Framex[hc,vc]\Tablex[l,t]
\JoinCoffins*\Framex[\Tablex-hc, \Tablex-b]\CaptionTablex[hc,t](0pt,-2ex) %down shift of 2ex
\JoinCoffins*\Framex[ \Tablex-r, \Tablex-t]\Plotx[l,t](20pt,0pt) %right shift of 20pt
\JoinCoffins*\Framex[\Plotx-hc, \Plotx-b]\CaptionPlotx[hc,t](0pt,-2ex) %down shift of 2ex
%%------------------------------- checks
\JoinCoffins*\Framex[hc,vc]\Hrule[l,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-l,\Tablex-b]\Hrule[l,t] % comment after cheking alignment
\JoinCoffins*\Framex[\CaptionTablex-l,\CaptionTablex-vc]\Hrule[l,t]% comment after cheking alignment
\JoinCoffins*\Framex[\Plotx-hc,\Plotx-t]\Vrule[r,t] % comment after cheking alignment
\JoinCoffins*\Framex[\Tablex-hc,\Tablex-t]\Vrule[r,t] % comment after cheking alignment
%%-------------------------------------
\noindent\TypesetCoffin\Framex
\newlength{\makeVspace}
\setlength{\makeVspace}{\CoffinTotalHeight\Tablex+\CoffinTotalHeight\CaptionTablex }
\vspace{\makeVspace}
\kant[1]
As shown in Table \ref{tab1} and Figure \ref{fig1}.
\end{document}
Tenga en cuenta que ahora el xcoffin
código es mucho más limpio, ya que solo los entornos tabular
deben tikzpicture
conservarse dentro de los xcoffins. La altura de la trama se establece para que sea igual a la mesa, como lo hizo antes.
ACTUALIZARSegún lo solicitado, agregué algo de texto después de la imagen. Esta es la manera de hacerlo:
\noindent\TypesetCoffin\Framex
colocará el ensamblaje en el siguiente punto de inserción después del título "La solución xcoffin v2", como se puede ver.
El xcoffin \Framex
tiene dimensión cero y sirve como coleccionista de los demás xcoffins.
En este ejemplo elegí usar \JoinCoffin*
en lugar de \JoinCoffin
, por lo que el tamaño de \Framex
permanecerá cero durante el ensamblaje. Eso significa que si quieres poner algún texto u otro material después de la figura debes agregar algún espacio vertical.
Por ejemplo agregando, como mínimo, la altura de la tabla más la altura del título.
El código agregado será entonces (paquetes kantlipsum
y calc
también agregados)
\newlength{\makeVspace}
\setlength{\makeVspace}{\CoffinTotalHeight\Tablex+\CoffinTotalHeight\CaptionTablex}
\vspace{\makeVspace}
\kant[1]