回忆录中的子图标签位置和可见性

回忆录中的子图标签位置和可见性

我正在使用 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}

编译结果

我用{}(需要将图与子图分开)包围了每个子图,但您可以将它们放在例如等中minipagesubfigure如果您想自定义标签,请参阅subcaption文档。

答案2

我看到一个不错的答案出现了,但由于我正在研究这个问题,所以我也会介绍它。该\tripleinset宏有 8 个参数加上一个可选参数。它们依次为:

“标签” - 可选参数,供以后使用\ref。子图将ab和添加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}

在此处输入图片描述

相关内容