我正在使用 Memoir 撰写我的硕士论文。我希望所有子图的标签都位于左上角。到目前为止,我已经使用 tikz 完成了此操作,但我想找到更优雅的解决方案,因为我当前的解决方案存在缺陷。
我希望能够自动引用文本中的图形,而无需手动指定子图。这意味着每个图形都需要有一个标签。但是,如果我标记子图,则该标签总是出现在图形下方,我不知道如何移动它、更改其颜色等等。
无论如何,当前和期望的解决方案的 mwe 和图像:
\documentclass{memoir}
\usepackage{tikz,siunitx,mwe}
\newsubfloat{figure}
\newcommand{\scalebarimg}[6]{
\begin{tikzpicture}
\draw node[name=micrograph] {\includegraphics[width=#2\textwidth]{#1}}; %I fetch the image
\draw[ultra thick,#6] (micrograph.south west)++(0.03*0#2\textwidth,0.035*0#2\textwidth)--++(#2*#3\textwidth,0)node[above,midway]{#4 \si{\micro\meter}}; %I draw the scalebar
\draw (micrograph.north west) node[anchor=north west,yshift=-1,#6]{\textbf{\small{(#5)}}}; %I draw the image label
\end{tikzpicture}
}
\begin{document}
\begin{figure}
\centering
\subbottom[\label{fig:one}]{
\scalebarimg{example-image}{.45}{0.33933}{50}{a}{black}
}\subbottom[\label{fig:two}]{
\scalebarimg{example-image}{.45}{0.33933}{50}{b}{white}
}
\caption{Figures (a) and (b) should not be doubly labeled.}
\end{figure}
See Figure~\ref{fig:one} and \subcaptionref{fig:two}.
\end{document}
但我想要
有没有办法让 LaTeX 将标签定位到我想要的位置,相对于图像的左上角?或者至少隐藏每个子图的标题,同时仍然标记它?
答案1
我会使用subcaption
包和\phantomsubcaption
(或者\phantomcaption
如果您决定使用例如subfigure
环境)。请注意,您需要 subcaption 包的 1.1 版本。以下是您改编的 MME:
\documentclass{memoir}
\usepackage{tikz,siunitx,mwe}
\usepackage{subcaption}
\newsubfloat{figure}
\newcommand{\scalebarimg}[6]{
\begin{tikzpicture}
\draw node[name=micrograph] {\includegraphics[width=#2\textwidth]{#1}}; %I fetch the image
\draw[ultra thick,#6] (micrograph.south west)++(0.03*0#2\textwidth,0.035*0#2\textwidth)--++(#2*#3\textwidth,0)node[above,midway]
{#4 \si{\micro\meter}}; %I draw the scalebar
\draw (micrograph.north west) node[anchor=north west,yshift=-1,#6]{\textbf{\small{#5}}}; %I draw the image label
\end{tikzpicture}
}
\begin{document}
\begin{figure}
{\phantomsubcaption\label{fig:one}
\scalebarimg{example-image}{.45}{0.33933}{50}{\subref{fig:one}}{black}}
{\phantomsubcaption\label{fig:two}
\scalebarimg{example-image}{.45}{0.33933}{50}{\subref{fig:two}}{white}}
\caption{Figures (a) and (b) should not be doubly labeled.}
\end{figure}
See Figure~\ref{fig:one} and \subcaptionref{fig:two}.
\end{document}
我用{}
(需要将图与子图分开)包围了每个子图,但您可以将它们放在例如等中minipage
。subfigure
如果您想自定义标签,请参阅subcaption
文档。
答案2
我看到一个不错的答案出现了,但由于我正在研究这个问题,所以我也会介绍它。该\tripleinset
宏有 8 个参数加上一个可选参数。它们依次为:
“标签” - 可选参数,供以后使用\ref
。子图将a
、b
和添加c
到此标签
\labelhoffset
- 标签的水平插入。“0in”实际上应该位于左边距的中心,但为了防止这种情况发生,它被移动了。
\labevhoffset
- 用于标签的垂直插入。“0in”实际上应该位于顶部边距的中心,但为了防止这种情况发生,它被移动了。
\interfiggap
- 图形之间的水平间隙
\figa
- 最左边的图
\figb
- 中心人物
\figc
- 最右边的图
\figurelableoffset
- 最低子图和标题之间的差距
“caption” - 标题
\documentclass{memoir}
\usepackage{hyperref}
\usepackage[usestackEOL]{stackengine}
\usepackage{subcaption}
\usepackage{graphicx}
\newlength\gapa
\newlength\gapb
\newlength\gapc
\newlength\labelhoffset
\newlength\labelvoffset
\newlength\figlabeloffset
\newlength\vskiplength
\newlength\interfiggap
\newlength\totalheight
\newcommand\tripleinset[9][]{%
\labelhoffset=#2\relax% cannot exceed 1/2 the figure width or figures shift
\labelvoffset=#3\relax
\figlabeloffset=#8\relax
\interfiggap=#4\relax
\def\figa{#5}
\def\figb{#6}
\def\figc{#7}
\ifdim\labelvoffset<.5\baselineskip\labelvoffset=.5\baselineskip\relax\fi
\setbox0=\hbox{\figa}\setlength\gapa{\dimexpr\wd0+\interfiggap-2\labelhoffset\relax}
\totalheight=\ht0\relax
\setbox1=\hbox{\figb}\setlength\gapb{\dimexpr\wd1+\interfiggap-2\labelhoffset\relax}
\ifdim\ht1>\totalheight\totalheight=\ht1\relax\fi
\setbox2=\hbox{\figc}\setlength\gapc{\dimexpr\wd2-2\labelhoffset\relax}
\ifdim\ht2>\totalheight\totalheight=\ht2\relax\fi
\vskiplength=\dimexpr\totalheight-\labelvoffset-\baselineskip+\figlabeloffset\relax
\savestack{\capfiga}{%
\subcaptionbox{\label{#1a}}[2\labelhoffset]{\smash{\belowbaseline[\baselineskip-\labelvoffset]{\figa}}}}
\savestack{\capfigb}{%
\subcaptionbox{\label{#1b}}[2\labelhoffset]{\smash{\belowbaseline[\baselineskip-\labelvoffset]{\figb}}}}
\savestack{\capfigc}{%
\subcaptionbox{\label{#1c}}[2\labelhoffset]{\smash{\belowbaseline[\baselineskip-\labelvoffset]{\figc}}}}
\vspace{\labelvoffset}
\capfiga\hspace{\gapa}\capfigb\hspace{\gapb}\capfigc\hspace{\gapc}\vspace{\vskiplength}%
\caption{#9\label{#1}}
}
\begin{document}
\begin{figure}[htbp]
\centering
\tripleinset[fg:]{0.15in}{0.15in}{0.3in}
{\includegraphics[width=1in,height=1in]{example-image}}
{\includegraphics[width=1in,height=1in]{example-image}}
{\includegraphics[width=1in,height=1in]{example-image}}
{0.5\baselineskip}{This is my figure}
\end{figure}
\noindent In figure \ref{fg:}, \ref{fg:a}, \ref{fg:b} and \ref{fg:c}.
\begin{figure}[htbp]
\centering
\tripleinset{0.3in}{0.10in}{0.15in}
{\includegraphics[width=.9in,height=.9in]{example-image}}
{\includegraphics[width=1in,height=1in]{example-image}}
{\includegraphics[width=1.1in,height=1.1in]{example-image}}
{0.2\baselineskip}{This is my other figure}
\end{figure}
\end{document}