图号按定理调整

图号按定理调整

我正在尝试调整与其所显示的定理相关的图形编号。如果一个定理只包含一个图形,则图形编号为theorem number;对于多个图形,图形将按以下方式编号theorem numberfigure number

我努力了:

\documentclass[10pt]{article}
\usepackage{graphicx, thmtools, lipsum, float}
\declaretheorem{Job}

\makeatletter
\let\c@equation\c@figure
\makeatother
\renewcommand{\thefigure}{\arabic{Job}.\arabic{equation}}

\begin{document}

\begin{Job}[Off home]
\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{coalminer}
  \caption{Coal-miner}
\end{figure}

\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{engineer}
  \caption{Engineer}
\end{figure}
\end{Job}

\begin{Job}[Home]
\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{police}
  \caption{Police}
\end{figure}
\end{Job}
\end{document}

它对于多个图形的情况工作正常,但对于单个图形的情况它不起作用(Police工作的图形编号应该只是2):

我怎样才能做到这一点?

答案1

与第一个图一样,您需要知道在同一个环境中是否还有更多图可供跟踪。

不幸的是,LaTeX 本身无法执行这种“前瞻性”操作。

无论如何,您可以使用 .aux 文件来存储每个作业环境中的数字总数,并在下一次运行 latex 时在每个作业环境开始时处理该数字。

由于重新定义 thmtool 的环境相当混乱,我将使用临时环境作为“包装器”来存储和处理辅助文件的代码。

首先,我们重命名 thmtools-Environment,因为我们不会在后续文档中直接使用它:

\declaretheorem[name=Jobs]{TempJob}

我们覆盖了显示的定理名称,因为它应该是“Job”而不是“TempJob”。

然后我们组成自己的 Job 环境,将 TempJob 环境放入其中;并传递可选参数来拯救环境的本地标签:

\newenvironment{Job}[1][]{%
  \begin{TempJob}[#1]%
}{%
  \end{TempJob}%
}

现在,到了棘手的部分:

在作业环境的末尾,我们需要将该环境中的数字总数存储在 .aux 文件中。因此,我们添加

...
}{%
  \immediate\write\@auxout{\noexpand\auxcontent{\arabic{TempJob}}{\arabic{equation}}}%
  \end{TempJob}%
}

的第三个参数\newenvironment

在此步骤中,我们将命令写入\auxcontent.aux 文件,该文件获取两个参数:#1是我们当前作业环境的数量,#2是图形计数器的当前(和总)值(或者,在您的情况下,是方程式计数器)。

auxcontent命令先前定义如下:

\def\auxcontent#1#2{%
  \def\@rgi{#1}%
  \def\@rgii{#2}%
  \global\expandafter\let\csname totalFigsIn\@rgi\endcsname\@rgii%
}

也就是说,对于每个作业环境,我们创建一个唯一的命令,称为\totalFigsIn<job-counter>,代表该环境中的数字总数。

最后,我们可以用这个数字做一些事情:我们根据数字总数是否为真来定义数字计数器1。该评估在我们的作业环境开始时进行:

  \edef\CurrentTotalFigs{\csname totalFigsIn\arabic{TempJob}\endcsname}
  \ifx\my@ne\CurrentTotalFigs
     \renewcommand{\thefigure}{\arabic{TempJob}}%
   \else
     \renewcommand{\thefigure}{\arabic{TempJob}.\arabic{equation}}%
   \fi

首先,我们将数字传递给一个临时宏,因为 LaTeX 的 if 结构无法处理复杂的指令链。\CurrentTotalFigs上面的代码片段中调用了这个临时宏。

该数字one通过自定义宏来表示\my@ne,其定义简单为:

\def\my@ne{1}

现在,我们可以区分一下:如果\CurrentTotalFigs等于 1,\thefigure则与我们当前的 TempJob 计数器(之前的部分)完全相同\else。如果数字总数不为 1,则我们使用 Job.Figure 变量(之后的部分\else

最后,为了使每个作业环境的数字计数从 0 开始,我们需要在每个作业环境开始时重置计数器:

\setcounter{equation}{0}%

总而言之,\begin{document}现在你的序言看起来应该是这样的:

\documentclass[10pt]{article}
\usepackage{graphicx, thmtools, lipsum, float}
\declaretheorem[name=Jobs]{TempJob}

\makeatletter
\def\my@ne{1}
\let\c@equation\c@figure
\def\auxcontent#1#2{%
  \def\@rgi{#1}%
  \def\@rgii{#2}%
  \global\expandafter\let\csname totalFigsIn\@rgi\endcsname\@rgii%
}
\newenvironment{Job}[1][]{%
  \setcounter{equation}{0}%
  \begin{TempJob}[#1]%
  \edef\CurrentTotalFigs{\csname totalFigsIn\arabic{TempJob}\endcsname}
  \ifx\my@ne\CurrentTotalFigs
     \renewcommand{\thefigure}{\arabic{TempJob}}%
   \else
     \renewcommand{\thefigure}{\arabic{TempJob}.\arabic{equation}}%
   \fi
}{%
  \immediate\write\@auxout{\noexpand\auxcontent{\arabic{TempJob}}{\arabic{equation}}}%
  \end{TempJob}%
}

\makeatother

最后一点说明:由于我们使用的是 .aux 文件,因此我们需要两次 latex 运行才能在更改后获得所需的结果。

答案2

您可以使用chngcntr包并执行

\usepackage{chngcntr}
\counterwithin{equation}{Job}    %% you can do this too because you defined it
%% \counterwithin{figure}{Job}    

完整代码:

\documentclass[10pt,demo]{article}                %%% remove demo
\usepackage{graphicx, thmtools, lipsum, float}
\declaretheorem{Job}

\makeatletter
\let\c@equation\c@figure
\makeatother
\renewcommand{\thefigure}{\arabic{Job}.\arabic{equation}}
\usepackage{chngcntr}
\counterwithin{equation}{Job}
\begin{document}

\begin{Job}[Off home]
\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{coalminer}
  \caption{Coal-miner}
\end{figure}

\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{engineer}
  \caption{Engineer}
\end{figure}
\end{Job}

\begin{Job}[Home]
\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{police}
  \caption{Police}
\end{figure}
\end{Job}
\end{document}

在此处输入图片描述

答案3

如果可行的话,您可以重置每个定理中的图形计数器。也许您想重新定义定理环境,以便自动执行此操作,但我不知道该怎么做。每个定理一行应该可以。

对于您的具体问题:我不知道 LaTeX 应如何通知一个定理中包含一个还是两个数字。我认为将其命名为 2.1 而不是 2 要容易得多。

在此处输入图片描述

\documentclass[10pt]{article}
\usepackage{thmtools, lipsum, float}
\usepackage[demo]{graphicx}
\declaretheorem{Job}

\makeatletter
\let\c@equation\c@figure
\makeatother
\renewcommand{\thefigure}{\arabic{Job}.\arabic{equation}}

\begin{document}

\begin{Job}[Off home]
\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{coalminer}
  \caption{Coal-miner}
\end{figure}

\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{engineer}
  \caption{Engineer}
\end{figure}
\end{Job}

\begin{Job}[Home]
\setcounter{figure}{0}
\lipsum[2]
\begin{figure}[H]
  \centering
  \includegraphics[height=.6in]{police}
  \caption{Police}
\end{figure}
\end{Job}
\end{document}

相关内容