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