標籤:

LaTeX 論文中如何畫這種下圖所示4個圖拼接起來的圖?

此問題中有一些啟發,但是並沒有解決我的問題 如何在LaTeX中製作這樣的插圖(圖片+文字)? - 軟體

如下,是我自己剛才做的圖

我的思路是先在一個tex文件里做出這麼一個pdf圖,並且在圖中標好1234,然後對pdf裁掉白邊,最後直接插入論文里。

代碼:

documentclass{article}
usepackage{graphicx}
usepackage[paperw=81mm, paperh=80mm, scale={1,1}]{geometry}
pagestyle{empty}

egin{document}
egin{center}
egin{figure*}
includegraphics[w=40mm]{1}
includegraphics[w=40mm]{2}
end{figure*}
vspace{-10mm}
egin{figure*}
includegraphics[w=40mm]{3}
includegraphics[w=40mm]{4-}
end{figure*}
end{center}
end{document}

然後問題來了:

  1. 我需要的是控制每幅圖之間的距離為0.5mm,上下兩圖之間的距離明顯太大,該怎麼調整?

  2. 可以看到我設置的頁邊距81mm,其實我想要的是80.5mm,但是換成80.5,左右兩個40mm的圖就換行了,為什麼?
  3. 如何手動設置圖片的解析度以減小文件尺寸?我這四幅圖生成的pdf和四張圖片總大小几乎一樣大,5.5M;
  4. 在Linux下有什麼軟體可以自動裁剪pdf白邊?求推薦

  5. 怎麼往圖上加字?(如下圖,圖來自ELSEVIER的Author Guidance)比如每張圖的左上角插入序號,個人覺得可以用Tikz或者overpic。我從沒用過Tikz或者overpic也還沒查這方面的資料,如果有大神推薦一下用什麼方法的話也是極好的。

謝謝幾位的回答,個人的問題已基本解決。相關的方法或者其他補充也歡迎大家提出來~


  1. 辦法很多,取決於你對 LaTeX 的熟悉程度。像 @孟晨 一樣直接放就可以(但要考慮行距,offinterlineskip 會有用),拼盒子也可以(vbox 套 hbox,很老派的做法),用個 2*2 的表格再調整間距也可以(tabular 有支架,原始的 halign 好用一些),用畫圖的方法也可以。
  2. 單獨把文件做成圖片可以用 standalone 文檔類,自動切邊。不過我覺得沒必要這樣。
  3. DPI 或者準確點 PPI 這種東西可以自己算,插點陣圖的時候已知圖片大小(長寬像素數),指定寬度了,自己除一下就是 DPI。也可以用工具設置,PNG、JPG 都可以指定 DPI 保存,用 ImageMagick 這種命令行工具(-density 選項)或者圖形界面的稍微高級一些的圖像處理軟體(比如 GIMP)都能指定。
  4. 裁白邊用 pdfcrop,命令行工具。
  5. 如果熟悉 tikz 我推薦用畫圖的方式做,靈活一些。否則文字的定位也挺考驗你 TeX 技術的。

一個繪圖定位的例子:

documentclass{article}

usepackage{tikz}
usetikzlibrary{positioning}

egin{document}

egin{tikzpicture}
scope[nodes={inner sep=0,outer sep=0}]

ode[anchor=south east] (a)
{includegraphics[w=4cm]{example-grid-100x100bp.png}};

ode[anchor=south west] (b)
{includegraphics[w=4cm]{example-image-1x1}};

ode[anchor=north east] (c)
{includegraphics[w=4cm]{example-image-1x1}};

ode[anchor=north west] (d)
{includegraphics[w=4cm]{example-grid-100x100bp.png}};

ode[right=1mm of b] (e)
{includegraphics[h=4cm]{example-image-4x3}};

ode[below=2mm of c.south west,anchor=north west] (f)
{includegraphics[w=8cm]{example-image-16x9}};
endscope
foreach
in {a,b,c,d} {

ode[anchor=north west,fill=yellow] at (
.north west) {(
)};
}

ode[anchor=north east,fill=green] at (e.south east) {(e)};

ode[anchor=south west,fill=green] at (f.south east) {(f)};
end{tikzpicture}

end{document}


這種插圖方式用 floatrow 宏包來做也是可以的。

documentclass{article}

usepackage{graphicx}
usepackage{caption,subcaption}
usepackage{floatrow}

usepackage{etoolbox}

makeatletter
patchcmdcaptionlabel{caption@setsubtype*{FR@tmp}}{caption@setsubtype*}{}{}
makeatother

ewfloatcommand{capsidebox}{figure}[capbesideuseFCwidth][FBwidth]

DeclareCaptionLabelFormat{rparen}{
oindentllap{#2),}}
captionsetup[capbesidefigure]{style=base, labelformat=rparen, labelsep=none,
font=small, justification=raggedleft, singlelinecheck=false}
floatsetup[capbesidefigure]{style=plain, heightadjust=object, floatrowsep=none,
capbesideposition={left,bottom}, capbesidew=5mm, capbesidesep=none}

egin{document}

egin{figure}
ffigbox{egin{subfloatrow}[3]
capsidebox{includegraphics[w=3cm]{example-grid-100x100bp.pdf}}{caption{}}
capsidebox{includegraphics[w=3cm]{example-image-a.pdf}}{caption{}}
capsidebox{includegraphics[w=3cm]{example-image-b.pdf}}{caption{}}
end{subfloatrow}
par
ointerlineskipvspace{5mm}%% 上下行的距離為 5mm
egin{subfloatrow}[3]
capsidebox{includegraphics[w=3cm]{example-image-c.pdf}}{caption{}}
capsidebox{includegraphics[w=3cm]{example-image-16x9.pdf}}{caption{}}
capsidebox{includegraphics[w=3cm]{example-image-golden.pdf}}{caption{}}
end{subfloatrow}}{caption{}}
end{figure}

end{document}

如果圖的寬度不一致,並且要求上下行的對齊效果,floatrow 宏包就不好用了。這時最方便的應該是用表格,或者像 @劉海洋 一樣用 TikZ 來定位,用 l3coffins 來定位其實也行。

我們來看 l3coffins 的例子,作為對比,還是用 @劉海洋 的例子。

documentclass{article}

usepackage{expl3}
usepackage{graphicx}
usepackage{color}

egin{document}

makeatletter
ExplSyntaxOn

coffin_new:N l_@@_a_coffin
coffin_new:N l_@@_b_coffin
coffin_new:N l_@@_c_coffin
coffin_new:N l_@@_d_coffin
coffin_new:N l_@@_e_coffin
coffin_new:N l_@@_f_coffin
coffin_new:N l_@@_g_coffin

hcoffin_set:Nn l_@@_a_coffin
{ includegraphics [ width = 4cm ] { example-grid-100x100bp.pdf } }
hcoffin_set:Nn l_@@_b_coffin
{ includegraphics [ width = 4cm ] { example-image-1x1.pdf } }
hcoffin_set:Nn l_@@_c_coffin
{ includegraphics [ width = 4cm ] { example-image-1x1.pdf } }
hcoffin_set:Nn l_@@_d_coffin
{ includegraphics [ width = 4cm ] { example-grid-100x100bp.pdf } }
hcoffin_set:Nn l_@@_e_coffin
{ includegraphics [ height = 4cm ] { example-image-4x3.pdf } }
hcoffin_set:Nn l_@@_f_coffin
{ includegraphics [ width = 8cm ] { example-image-16x9.pdf } }

clist_map_inline:nn { a , b , c , d }
{
hcoffin_set:Nn l_tmpa_coffin { colorbox { yellow } { (#1) } }
coffin_join:cnnNnnnn
{ l_@@_ #1 _coffin } { l } { t }
l_tmpa_coffin { l } { t } { 0pt } { 0pt }
}

hcoffin_set:Nn l_tmpa_coffin { colorbox { green } { (e) } }
coffin_join:NnnNnnnn
l_@@_e_coffin { r } { b }
l_tmpa_coffin { r } { t } { 0pt } { 0pt }

hcoffin_set:Nn l_tmpa_coffin { colorbox { green } { (f) } }
coffin_join:NnnNnnnn
l_@@_f_coffin { r } { b }
l_tmpa_coffin { l } { b } { 0pt } { 0pt }

coffin_clear:N l_tmpa_coffin
coffin_join:NnnNnnnn
l_tmpa_coffin { l } { b }
l_@@_a_coffin { l } { b } { 0pt } { 0pt }
coffin_join:NnnNnnnn
l_tmpa_coffin { r } { b }
l_@@_b_coffin { l } { b } { 0pt } { 0pt }
coffin_join:NnnNnnnn
l_tmpa_coffin { l } { b }
l_@@_c_coffin { l } { t } { 0pt } { 0pt }
coffin_join:NnnNnnnn
l_tmpa_coffin { l_@@_c_coffin-r } { l_@@_b_coffin-b }
l_@@_d_coffin { l } { t } { 0pt } { 0pt }
coffin_join:NnnNnnnn
l_tmpa_coffin { r } { t }
l_@@_e_coffin { l } { t } { 1mm } { 0pt }
coffin_join:NnnNnnnn
l_tmpa_coffin { l } { b }
l_@@_f_coffin { l } { t } { 0pt } { -2mm }

ex_noindent:D coffin_typeset:Nnnnn l_tmpa_coffin { l } { b } { 0pt } { 0pt }

ExplSyntaxOff
makeatother

end{document}

可以看到,這 LaTeX3 語法寫起來稍微冗長一些,使用用戶層面的 xcoffins 宏包要稍微好一些,但都不如 TikZ 的鍵值式語法簡單自然。


1. 我需要的是控制每幅圖之間的距離為0.5mm,上下兩圖之間的距離明顯太大,我想知道怎麼調整

距離來自 figure 環境前後給的 vskip。

center 環境去掉,兩個 figure 環境合併成一個,figure 環境里用 centering 命令,第二幅圖後用 \ 換行。

2. 可以看到我設置的頁邊距81mm,其實我想要的是80.5mm,但是換成80.5,左右兩個40mm的圖就換行了,想知道原因

因為換行被當成了一個空格,而空格的寬度大於 0.5mm。所以整行寬度 40 + (&>0.5) + 40 = (&>80.5),於是換行了。

3. 在Linux下有什麼軟體可以自動裁剪pdf白邊的么,求推薦,不然我就只好手動了

pdfcrop

4. 還有一個重要的問題,如何手動設置圖片的解析度,一般雜誌都是300,500之類的,如圖明顯不夠

這是你生成圖片時候遇到的問題,然而誰也不知道你這些圖片怎麼搞出來的。

5. 關於怎麼往圖上加字,我還沒開始看,如果有大神推薦一下用什麼方法的話也是極好的

把問題問清楚,才是極好的。

documentclass{article}
usepackage{graphicx}
usepackage{calc}

usepackage[paperw=80.5mm, paperh=80mm, scale={1,1}]{geometry}
pagestyle{empty}

egin{document}
egin{figure*}
centering
includegraphics[w=.5linewidth - 0.25mm]{example-image.png}hfill
includegraphics[w=.5linewidth - 0.25mm]{example-image.png}\[0.5mm]
includegraphics[w=.5linewidth - 0.25mm]{example-image.png}hfill
includegraphics[w=.5linewidth - 0.25mm]{example-image.png}
end{figure*}
end{document}


看看這個你就知道了https://tug.org/TUGboat/tb34-1/tb106thurnherr.pdf。


推薦閱讀:

如何評價 ShareLaTeX?
怎樣才能被稱作是美觀的排版?
為什麼有的出版社使用AI排版,而不是Indesign?
CSS 的主要缺陷是什麼?
如何讓前圓括弧與段落邊界視覺對齊?

TAG:排版 | LaTeX |