使用子浮点数代替字母

使用子浮点数代替字母

我有一个文档,figure其环境如下:

\documentclass[a4paper,10pt]{article}
\usepackage{subfig}
\usepackage{tikz}

\makeatletter
\newbox\sf@box
\newenvironment{SubFloat}[2][]%
{\def\sf@one{#1}%
\def\sf@two{#2}%
\setbox\sf@box\hbox
\bgroup}%
{ \egroup
\ifx\@empty\sf@two\@empty\relax
\def\sf@two{\@empty}
\fi
\ifx\@empty\sf@one\@empty\relax
\subfloat[\sf@two]{\box\sf@box}%
\else
\subfloat[\sf@one][\sf@two]{\box\sf@box}%
\fi}
\makeatother

\begin{document}

\begin{figure}
\centering
\begin{SubFloat}
{\label{image1}}
\includegraphics[width=0.4\textwidth]{image1.jpg}
\end{SubFloat}
\qquad
\begin{SubFloat}
{\label{image2}}
\includegraphics[width=0.4\textwidth]{image2.jpg}
\end{SubFloat}
\end{figure}

\end{document}

(编译自pdflatex

LaTeX 在每个图像下方放置字母(、、(a)等),而我希望它放置数字。(b)(c)

我怎能这样做?

答案1

要重新定义包装的标签subfig使用:

\renewcommand*\thesubfigure{\arabic{subfigure}} 

为了使效果保持局部性,请在figure环境中使用它,如下所示。正如您在后续使用中看到的那样,标签将恢复为使用默认(a)格式:

enter image description here

如果您希望这影响您的整个文档,只需将其添加\renewcommand到序言中。

代码:

\documentclass[a4paper,10pt]{article}
\usepackage[demo]{graphicx}% <----- remove "demo" option for real use
\usepackage{subfig}
\usepackage{tikz}
%\usepackage[paperheight=5.5in]{geometry}% For image capture

\makeatletter
\newbox\sf@box
\newenvironment{SubFloat}[2][]%
{\def\sf@one{#1}%
\def\sf@two{#2}%
\setbox\sf@box\hbox
\bgroup}%
{ \egroup
\ifx\@empty\sf@two\@empty\relax
\def\sf@two{\@empty}
\fi
\ifx\@empty\sf@one\@empty\relax
\subfloat[\sf@two]{\box\sf@box}%
\else
\subfloat[\sf@one][\sf@two]{\box\sf@box}%
\fi}
\makeatother

\begin{document}

\begin{figure}
\renewcommand*\thesubfigure{\arabic{subfigure}}
\textcolor{red}{With} \verb|\renewcommand*\thesubfigure{\arabic{subfigure}}| within the \verb|figure|:

\centering
\begin{SubFloat}
{\label{image1}}
\includegraphics[width=0.4\textwidth]{image1.jpg}
\end{SubFloat}
\qquad
\begin{SubFloat}
{\label{image2}}
\includegraphics[width=0.4\textwidth]{image2.jpg}
\end{SubFloat}
\end{figure}

\begin{figure}
\textcolor{red}{Without} \verb|\renewcommand*\thesubfigure{\arabic{subfigure}}|

\centering
\begin{SubFloat}
{\label{image1}}
\includegraphics[width=0.4\textwidth]{image1.jpg}
\end{SubFloat}
\qquad
\begin{SubFloat}
{\label{image2}}
\includegraphics[width=0.4\textwidth]{image2.jpg}
\end{SubFloat}
\end{figure}

\end{document}

答案2

如果你添加

\renewcommand{\thesubfigure}{\arabic{subfigure}}

在你的序言中,那么子图将被编号为 (1)、(2) 等等。然而 a\ref{label1}会打印

11

这显然是错误的。因此你还必须添加类似

\makeatletter
\renewcommand{\p@subfigure}{\thefigure--}
\makeatother

这样就\ref{label1}可以打印

1--1

(根据需要更改分隔符)。


SubFloat您可以通过几种方式改进对环境的定义。

  1. 标准 LaTeX

    \makeatletter
    \newsavebox{\sf@box}
    \newenvironment{SubFloat}[2][]
      {\def\sf@one{#1}\def\sf@two{#2}%
       \begin{lrbox}{\sf@box}}%
      {\end{lrbox}%
       \ifx\@empty\sf@one
         \subfloat[\sf@two]{\box\sf@box}%
       \else
         \subfloat[\sf@one][\sf@two]{\usebox\sf@box}%
       \fi}
    \makeatother
    

    (您对空虚的测试添加了冗余标记。)

  2. xparse

    \usepackage{xparse}
    \makeatletter
    \newsavebox\sf@box
    \NewDocumentEnvironment{SubFloat}{ o m }
     {\begin{lrbox}{\sf@box}}
     {\end{lrbox}%
      \IfNoValueTF{#1}
       {\subfloat[#2]{\usebox{\sf@box}}}
       {\subfloat[#1][#2]{\usebox{\sf@box}}}%
     }
    \makeatother
    

    如您所见,您不需要任何低级测试:如果不存在可选参数,包可以自行区分。

相关内容