使用 subfig 包将子图标签放入图形中

使用 subfig 包将子图标签放入图形中

我想将子图标签(a)、(b)等放在子图的左上角,如下图所示:

图像

我知道有一些解决方法,例如这个帖子(与stackengine)或这个帖子(带)。但是,除非真的没有办法,否则subcaption我不想使用,而 REVTeX4 排除了该选项。因此,我想知道是否存在专门针对包的解决方法(并且可能与 REVTeX4 兼容)。stackenginesubcaptionsubfig

以下 MWE 尝试实现预期效果,但未能成功:

\documentclass{revtex4-1}
\usepackage{graphicx}
\usepackage{subfig}
\captionsetup[subfloat]{farskip=-10pt, position=top}

\begin{document}
\begin{figure}
\centering
    \subfloat[][]{
    \includegraphics[width=0.45\linewidth]{example-image-a}}
    \subfloat[][]{
    \includegraphics[width=0.45\linewidth]{example-image-b}}\\
    \subfloat[][]{
        \includegraphics[width=0.45\linewidth]{example-image-c}}
    \subfloat[][]{
        \includegraphics[width=0.45\linewidth]{example-image-a}}
    \caption{abcd}
\end{figure}
\end{document}

答案1

我建议编写自己的宏来放置子图编号:

在此处输入图片描述

\documentclass{revtex4-1}% http://ctan.org/pkg/ltxutil
\usepackage{graphicx}% http://ctan.org/pkg/graphicx
\newcommand{\subfigimg}[3][,]{%
  \setbox1=\hbox{\includegraphics[#1]{#3}}% Store image in box
  \leavevmode\rlap{\usebox1}% Print image
  \rlap{\hspace*{10pt}\raisebox{\dimexpr\ht1-2\baselineskip}{#2}}% Print label
  \phantom{\usebox1}% Insert appropriate spcing
}
\begin{document}
\begin{figure}
  \centering
  \begin{tabular}{@{}p{0.45\linewidth}@{\quad}p{0.45\linewidth}@{}}
    \subfigimg[width=\linewidth]{A)}{example-image-a} &
    \subfigimg[width=\linewidth]{B)}{example-image-b} \\
    \subfigimg[width=\linewidth]{C)}{example-image-c} &
    \subfigimg[width=\linewidth]{D)}{example-image-a}
  \end{tabular}
  \caption{A caption}
\end{figure}
\end{document}

一旦获得了图像,您就可以将其打印在盒子中并提取其尺寸,以便使用它们来定位标签。

上面的宏\subfigimg[<options>]{<label>}{<image>}就是这么做的。它使用<image>选项插入<options>并打印<label>从图像左侧开始的 10pt 和从图像顶部开始的 2 个基线跳跃。

没有包裹,也没有胡闹。只是箱子操作。


通过字符串比较来定位一些额外的功能......

pdfTeX 引入\pdfstrcmp字符串比较版本 1.30

\pdfstrcmp{<a>}{<b>}比较两个字符串,如果等于则返回字符串“0” ,如果小于则返回字符串<b>“-1” ,如果大于则返回字符串“1” 。<a><b><a><b>

在此处输入图片描述

\documentclass{revtex4-1}% http://ctan.org/pkg/ltxutil
\usepackage{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{xkeyval,xcolor}% http://ctan.org/pkg/{xkeyval,xcolor}
\makeatletter
\newlength{\sfp@hseplen}\newlength{\sfp@vseplen}
\define@cmdkey{subfigpos}[sfp@]{pos}[ul]{}% \sfp@pos
\define@cmdkey{subfigpos}[sfp@]{font}[\small]{}% \sfp@font
\define@cmdkey{subfigpos}[sfp@]{vsep}[2\baselineskip]{\setlength{\sfp@vseplen}{\sfp@vsep}}% \sfp@vsep
\define@cmdkey{subfigpos}[sfp@]{hsep}[10pt]{\setlength{\sfp@hseplen}{\sfp@hsep}}% \sfp@hsep
\newcommand{\subfigimg}[3][,]{%
  \setkeys{Gin,subfigpos}{pos,font,vsep,hsep,#1}% Set (default) keys
  \setbox1=\hbox{\includegraphics{#3}}% Store image in box
  \ifnum\pdfstrcmp{\sfp@pos}{ul}=0% UPPER LEFT placement of subfig label
    \leavevmode\rlap{\usebox1}% Print image
    \rlap{\hspace*{\sfp@hsep}\raisebox{\dimexpr\ht1-\sfp@vsep}{\sfp@font{#2}}}% Print label
    \phantom{\usebox1}% Insert appropriate spacing
  \else\ifnum\pdfstrcmp{\sfp@pos}{ur}=0% UPPER RIGHT placement of subfig label
    \leavevmode\usebox1% Print image
    \llap{\raisebox{\dimexpr\ht1-\sfp@vsep}{\sfp@font{#2}}\hspace*{\sfp@hsep}}% Print label
  \else\ifnum\pdfstrcmp{\sfp@pos}{lr}=0% LOWER RIGHT placement of subfig label
    \leavevmode\usebox1% Print image
    \llap{\raisebox{\sfp@vsep}{\sfp@font{#2}}\hspace*{\sfp@hsep}}% Print label
  \else% Assume LOWER LEFT placement of subfig label
    \leavevmode\rlap{\usebox1}% Print image
    \rlap{\hspace*{\sfp@hseplen}\raisebox{\sfp@vsep}{\sfp@font{#2}}}% Print label
    \phantom{\usebox1}% Insert appropriate spacing
  \fi\fi\fi
}
\makeatother
\begin{document}
\begin{figure}
  \centering
  \begin{tabular}{@{}p{0.45\linewidth}@{\quad}p{0.45\linewidth}@{}}
    \subfigimg[width=\linewidth,pos=lr]{A)}{example-image-a} &
    \subfigimg[width=\linewidth,pos=ll,font=\color{green!30!red}]{B)}{example-image-b} \\
    \subfigimg[width=\linewidth,pos=ur,font=\LARGE]{C)}{example-image-c} &
    \subfigimg[width=\linewidth,pos=ul]{D)}{example-image-a}
  \end{tabular}
  \caption{A caption}
\end{figure}
\end{document}

上述 MWE 将、 和posfont添加到组合中。反过来,它们允许选择要使用的标签的设置、水平和垂直设置。hsepvsepposfonthsepvsep

答案2

stackengine作为解决方案的作者和提供者图内有数字的子图,我应该有点不愿意削弱自己,并提供替代解决方案。但这就是它(我们都参与其中)。远没有那么优雅,相当蛮力,但它避免使用包。

经过编辑,删除了解决方案的残留部分。

\documentclass{article}
\usepackage{graphicx}
\begin{document}
xxx

\includegraphics[width=5in]{vjbrp}\llap{
  \parbox[b]{4.5in}{(A)\\\rule{0ex}{2.2in}
  }}

yyy
\end{document} 

在此处输入图片描述

答案3

我想填充标签(a)、(b)的背景,并且我想将图像插入 tikzpicture 环境中,如下所示:

如何在 tikzpicture 环境中嵌入外部图像?

结果如下: 带有标记 (a) 和 (b) 的鸭子

\documentclass{article}

\usepackage{graphicx}
\usepackage{tikz}
\usepackage{subcaption}

\begin{document}
\begin{figure}[htbp]
    \centering
    \begin{subfigure}[htbp]{0.48\textwidth}
        \begin{tikzpicture}
        \node[inner sep=0pt] (duck) at (0,0)
        {\includegraphics[width=\textwidth]{duck}};
        \node[align=center,fill=white,draw] at (-2.4,2.1) {(a)};
        \end{tikzpicture}
    \end{subfigure}
    ~
    \begin{subfigure}[htbp]{0.48\textwidth}
        \begin{tikzpicture}
        \node[inner sep=0pt] (duck2) at (0,0)
        {\includegraphics[width=\textwidth]{duck}};
        \node[align=center,fill=white,draw] at (-2.4,2.1) {(b)};
        \end{tikzpicture}
    \end{subfigure}
    \caption{text}
    \label{duck}
\end{figure}
\end{document}

鸭子的图片: https://www.thoughtco.com/fun-facts-about-ducks-4043231

相关内容