테이블과 pgfplots 그래프 정렬

테이블과 pgfplots 그래프 정렬

미니페이지를 사용하여 테이블과 pgfplots 그래프를 정렬하려고 합니다. 테이블 높이를 측정해서 그래프에 맞추려고 했는데 여전히 정렬이 어긋나네요. 이상적으로는 캡션의 높이가 동일해야 하며 테이블과 pgfplot의 크기도 동일해야 합니다. 게다가 제거해야 할 불량 상자도 있습니다.

암호:

\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}

어떤 도움이라도 주시면 감사하겠습니다.

답변1

패키지를 기반으로 솔루션을 제안합니다 xcoffin. 더 쉬운 비교를 위해 OP 코드 끝에 코드가 추가되었습니다.

나는 플롯, 테이블 및 각 캡션이라는 네 가지 요소를 더 이상 처리하지 않고 서로 쉽게 정렬할 수 있는 핸들이 있는 상자인 xcoffins에 넣습니다. 또한 \fbox너비와 높이를 쉽게 비교할 수 있도록 플롯 주위에 추가했습니다 . 색상 눈금자는 요청한 대로 중앙에 정렬된 캡션의 위치를 ​​표시합니다.

신청에 대한 좀 더 광범위한 설명은 xcoffin어떤 면에서 유사한 문제에 대한 이전 질문과 답변에서 찾을 수 있습니다.

tcolorbox 패키지나 다른 패키지를 사용하여 상자를 만드시겠습니까? (영상)

제목 페이지에 3개의 로고를 위한 공간을 남겨두세요

학술 에디션을 위한 다소 복잡한 레이아웃이 필요한데 어디서부터 시작해야 할지 모르겠습니다.

\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}

산출

지금까지 유일한 개선점은 캡션 정렬입니다. (위 코드를 컴파일하면 내 쪽에서는 불량 상자가 감지되지 않습니다.) 하지만 우리는 더 잘할 수 있습니다.

테이블의 자연 너비는 0.49\textwidth. 따라서 해당 길이의 크기를 조정하면 글꼴 크기도 커지므로 결과적으로 플롯의 크기와 일치하지 않습니다. 약간만 변경하면 더욱 조화로운 출력을 얻을 수 있습니다( \fbox추가됨).

\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}

g3New

이제 xcoffin환경 tabulartikzpicturexcoffins 내부에만 유지해야 하므로 코드가 훨씬 더 깔끔해졌습니다. 플롯의 높이는 이전과 마찬가지로 테이블과 동일하게 설정됩니다.

업데이트요청에 따라 사진 뒤에 텍스트를 추가했습니다. 방법은 다음과 같습니다.

\noindent\TypesetCoffin\Framex볼 수 있듯이 "The xcoffin Solution v2"라는 제목 뒤의 다음 삽입 지점에 어셈블리를 배치합니다.

xcoffin은 \Framex차원이 0이고 다른 xcoffin의 수집기 역할을 합니다.

\JoinCoffin*이 예에서는 대신 을 사용하기로 선택했습니다 . 따라서 조립 중에 \JoinCoffin크기는 0으로 유지됩니다. \Framex즉, 그림 뒤에 텍스트나 기타 자료를 넣으려면 수직 공간을 추가해야 합니다.

예를 들어 최소한 표 높이에 캡션 높이를 더한 값을 추가합니다.

kantlipsum그러면 추가된 코드는 (패키지 및 calc추가됨)이 됩니다 .

\newlength{\makeVspace}
\setlength{\makeVspace}{\CoffinTotalHeight\Tablex+\CoffinTotalHeight\CaptionTablex} 
\vspace{\makeVspace}

\kant[1]    

관련 정보