如何使用 subfigimg 宏和 \label

如何使用 subfigimg 宏和 \label

我正在使用此处提供的宏子图邮政运行良好。但我的问题是我想 \ref 其中一个子图(使用 subfigimg 宏),但我不知道该怎么做。

举个例子,我想做这样的事情:

\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}[H]
  \centering
  \begin{tabular}{p{0.5\linewidth}@{}p{0.5\linewidth}}
     \subfigimg[width=\linewidth]{(a)}{example-image-a}
     \label{fig:1} &
     \subfigimg[width=\linewidth]{(b)}{example-image-b}
     \label{fig:2}
  \end{tabular}
  \caption{bla bla bla}
\end{figure}
\end{document}

这当然不起作用,结果是??而不是数字。有没有办法解决这个问题?或者在宏中添加标签选项?

我对 tex 和这个论坛还很陌生,所以如果我犯了任何错误,请原谅我的菜鸟身份。

谢谢,liron

答案1

我构建了一些东西,它是 a) 完整的 MWE,并且 b) 可以实现您想要的功能。

现在标签显示为“1.a”,字母变为小写字母。如果您想更改子图标签的格式,请根据\renewcommand*{\thesubfigs}自己的喜好更改,请注意,这只会更改标签的显示方式,而不会更改图像内的标签,为此,请更改\alph{subfigs}定义中的\@subfigimg

该命令\subfigimg有带星号和不带星号的版本。如果您\caption在 之前使用 图形环境,请使用带星号的版本,在 之前使用不带星号的版本。这是必要的,因为如果在 之后使用 ,\subfigimg我们必须c@figure暂时增加 -counter 才能获得正确的标签。\caption\subfigimg

如果不需要标签,\subfigimg则将最后一个参数留空。

我添加了使用两个附加参数更改标签位置的可能性。它们将插入到两个强制参数之间。第一个参数插入<horizontal><>作为分隔符)并更改水平偏移,第二个参数[vertical]更改垂直偏移。

\documentclass[preview,border=4mm]{standalone}

\usepackage{graphicx}
\usepackage{xparse}

\newcounter{subfigs}[figure]
\renewcommand*{\thesubfigs}{\thefigure.\alph{subfigs}}

\makeatletter
\NewDocumentCommand{\subfigimg}{s O{} m D<>{10pt} O{2\baselineskip} m}{%
    \IfBooleanTF{#1}%
        {\@subfigimg{#2}{#3}{#6}{0}{#4}{#5}}%
        {\@subfigimg{#2}{#3}{#6}{1}{#4}{#5}}%
}
\newcommand*{\@subfigimg}[6]{%
  \bgroup%
  \advance\c@figure by #4%
  \refstepcounter{subfigs}%
  \ifx\relax#3\relax\else%
  \label{#3}%
  \fi%
  \setbox1=\hbox{\includegraphics[#1]{#2}}% Store image in box
  \leavevmode\rlap{\usebox1}% Print image
  \rlap{\hspace*{#5}\raisebox{\dimexpr\ht1-#6\relax}{(\alph{subfigs})}}% Print label
  \phantom{\usebox1}% Insert appropriate spcing
  \egroup%
}

\makeatother

\begin{document}
\begin{figure}
  \centering
  \begin{tabular}{p{0.5\linewidth}@{}p{0.5\linewidth}}
     \subfigimg[width=\linewidth]{example-image-c}{fig:s11}
      &
     \subfigimg[width=\linewidth]{example-image-b}{fig:s12}
  \end{tabular}
  \caption{bla bla bla}
  \label{fig:1}
\end{figure}
See subfigures \ref{fig:s11} and \ref{fig:s12} of figure~\ref{fig:1}
\begin{figure}
  \centering
  \caption{bla bla bla}
  \label{fig:2}
  \begin{tabular}{p{0.5\linewidth}@{}p{0.5\linewidth}}
     \subfigimg*[width=\linewidth]{example-image-c}<20pt>[4\baselineskip]{fig:s21}
      &
     \subfigimg*[width=\linewidth]{example-image-b}{fig:s22}
  \end{tabular}
\end{figure}
See subfigures \ref{fig:s21} and \ref{fig:s22} of figure~\ref{fig:2}
\end{document}

请注意,subfigs仅当数字计数器增加或您使用类似方法手动重置计数器时,计数器才会重置\setcounter{subfigs}{0}

在此处输入图片描述

答案2

这是一个使用广泛使用的包的解决方案,它提供了名为和 的subcaptionLaTeX 环境。该包还提供了许多用于配置所有字幕格式的选项。subfiguresubtable

在此处输入图片描述

\documentclass{revtex4-1}
\usepackage{graphicx,subcaption} 
\makeatletter
\renewcommand{\p@subfigure}{\thefigure.} % note the '.'
\makeatletter

\begin{document}

\begin{figure}

\begin{subfigure}{0.475\textwidth}
\includegraphics[width=\linewidth]{example-image-a}
\caption{First subfigure}\label{fig:small_a}
\end{subfigure}\hfill
\begin{subfigure}{0.475\textwidth}
\includegraphics[width=\linewidth]{example-image-b}
\caption{Second subfigure}\label{fig:small_b}
\end{subfigure}

\caption{bla bla bla} \label{fig:big}
\end{figure}

\noindent
Some cross-references to Figure \ref{fig:big} and to Subfigures \ref{fig:small_a} and \ref{fig:small_b}.
\end{document}

相关内容