minipage を使用して、テーブルと pgfplots グラフを揃えようとしています。テーブルの高さを測り、グラフに設定しようとしましたが、まだ揃っていません。理想的には、キャプションは同じ高さで、テーブルと pgfplots は同じ寸法である必要があります。それに加えて、削除する必要がある不良ボックスがあります。
コード:
\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 のコードの最後にコードを追加しました。
プロット、表、それぞれのキャプションの 4 つの要素を、これ以上処理せずに 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
xcoffins内に保持する必要があるため、コードがはるかにクリーンになっていることに注意してくださいtikzpicture
。プロットの高さは、以前と同様に、テーブルと同じ高さに設定されています。
アップデートご要望に応じて、画像の後にテキストを追加しました。方法は次のとおりです。
\noindent\TypesetCoffin\Framex
ご覧のとおり、アセンブリはタイトル「The xcoffin solution v2」の後の次の挿入ポイントに配置されます。
xcoffinは\Framex
次元がゼロで、他のxcoffinのコレクターとして機能します
この例では、\JoinCoffin*
の代わりにを使用することを選択したため\JoinCoffin
、 のサイズは\Framex
アセンブリ中に 0 のままになります。つまり、図の後にテキストやその他の資料を配置する場合は、垂直方向のスペースを追加する必要があります。
たとえば、少なくともテーブルの高さとキャプションの高さを追加します。
追加されたコードは(パッケージkantlipsum
もcalc
追加されます)
\newlength{\makeVspace}
\setlength{\makeVspace}{\CoffinTotalHeight\Tablex+\CoffinTotalHeight\CaptionTablex}
\vspace{\makeVspace}
\kant[1]