미니페이지를 사용하여 테이블과 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 패키지나 다른 패키지를 사용하여 상자를 만드시겠습니까? (영상)
학술 에디션을 위한 다소 복잡한 레이아웃이 필요한데 어디서부터 시작해야 할지 모르겠습니다.
\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}
이제 xcoffin
환경 tabular
과 tikzpicture
xcoffins 내부에만 유지해야 하므로 코드가 훨씬 더 깔끔해졌습니다. 플롯의 높이는 이전과 마찬가지로 테이블과 동일하게 설정됩니다.
업데이트요청에 따라 사진 뒤에 텍스트를 추가했습니다. 방법은 다음과 같습니다.
\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]