我想检查文档中是否有任何图片,以便决定是否要列出图片。这可能吗?不做诸如解析 lof 文件之类的事情是否可行?
请注意,检查 lof 文件是否为空对我来说不是一个好的解决方案,因为某些代码可能会将表格行以外的内容写入其中(例如babel
)。
答案1
这次尝试背后的想法是使用标准 LaTeX 引用来检测figure
文档中是否使用了 a。以下是所涉及的步骤(由 @egreg 进行了一些修改):
- 想出一个你永远不会在文档中使用的标签名称。例如
fig:was:used:in:doc
。 修补环境以在末尾
figure
定义一个空命令(例如)\there@is@a@figure
每一个图。这可以通过使用etoolbox
包裹提供\AtEndEnvironment
。更具体地说,命令\AtEndEnvironment{figure}{\gdef\there@is@a@figure{}}
figure
将被永久地重新定义,直到文档中的最后。在文档的末尾,我们检查是否
\there@is@a@figure
存在(已定义),并定义一个标签\label{fig:was:used:in:doc}
。这个标签包含什么并不重要(它可以是最后使用的图形、章节、表格或其他内容):\AtEndDocument{\ifdefined\there@is@a@figure\label{fig:was:used:in:doc}\fi}
使用以下方式编写自己的“条件 LoF”命令
\newcommand{\conditionalLoF}{\@ifundefined{r@fig:was:used:in:doc}{}{\listoffigures}}%
该命令
\conditionalLoF
检查宏是否\r@fig:was:used:in:doc
已定义。这是工作中的标准 LaTeX 引用机制,因为每个标签都定义<lab>
了一个关联的宏\r@<lab>
。如果未定义,则\@ifundefined{<cs>}{<undef code>}{<def code>}
允许执行,否则执行。<undef code>
<cs>
<def code>
- 使用
\conditionalLoF
而不是\listoffigures
。 - 至少编译您的文档 3 次。
(1) 背后的主要思想是让标签fig:was:used:in:doc
仅在使用时存在figure
,而不必担心它叫什么。 (2) 为环境提供挂钩figure
并允许全局(重新)定义\there@is@a@figure
。 (3) 将标签的定义延迟fig:was:used:in:doc
到文档末尾,以避免导致“多次定义标签”警告。 (4) 和 (5) 为条件 LoF 提供了一个干净的接口。 (6) 可能是唯一的缺点。但是,这是标签引用的标准配置,通常需要至少两次编译才能工作。
这是一个最小工作示例 (MWE)。它使用graphicx
(使用demo
封装选项)和lipsum
只是为了展示,因此实际上没有必要。编译此 MWE
\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\makeatletter
\AtEndEnvironment{figure}{\gdef\there@is@a@figure{}}
\AtEndDocument{\ifdefined\there@is@a@figure\label{fig:was:used:in:doc}\fi}
\newcommand{\conditionalLoF}{\@ifundefined{r@fig:was:used:in:doc}{}{\listoffigures}}%
\makeatother
\begin{document}
\conditionalLoF% Conditionally insert List of Figures
\section{First section}
\lipsum[1]
%\begin{figure}
% \centering\includegraphics{figure}
% \caption{This is a caption}
%\end{figure}
\end{document}
按原样生产
取消注释figure
环境并编译几次会产生
答案2
另一种方法是使用totalcount
包:
\documentclass{article}
\usepackage[demo]{graphicx}% http://ctan.org/pkg/graphicx
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\usepackage[figure]{totalcount}
\begin{document}
% Conditionally insert List of Figures
\iftotalfigures
\listoffigures
\fi
\section{First section}
\lipsum[1]
%\begin{figure}
% \centering\includegraphics{figure}
% \caption{This is a caption}
%\end{figure}
\end{document}
答案3
totcount
这是和的组合assoccnt
(现在已合并xassoccnt
,至少合并了 的一些功能 totcount
)
xassoccnt
定义与主计数器同步的计数器,但如果设置为零figure
则不会重置,即计数器保存数字的总数(除非直接操作)。figure
totalfigures
使用,总计数器的值在编译运行结束时\NewTotalDocumentFeature
写入文件,并在下一次运行中读入,即在文档开始时就知道数字的数量。.aux
沃纳将该refcount
方法与 结合使用assoccnt
(这是 的前身xassoccnt
,比 发达得多assoccnt
(我了解各州——我是 的作者(x)assoccnt
;-))
我\listof...
稍微重新定义了命令。
\documentclass{book}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{xassoccnt}
\usepackage{graphicx}
\usepackage{tabularx}
\NewTotalDocumentCounter{totalfigures}
\NewTotalDocumentCounter{totaltables}
\DeclareAssociatedCounters{figure}{totalfigures}
\DeclareAssociatedCounters{table}{totaltables}
\makeatletter
\renewcommand{\TotalValue}[1]{% A small bug fix
\value{xassoccnt@total@#1}%
}
\let\@@latex@@listoffigures\listoffigures
\let\@@latex@@listoftables\listoftables
\renewcommand{\listoffigures}{%
\ifnum\TotalValue{totalfigures} > 0
\@@latex@@listoffigures%
\fi
}
\renewcommand{\listoftables}{%
\ifnum\TotalValue{totaltables} > 0
\@@latex@@listoftables%
\fi
}
\makeatother
\begin{document}
\tableofcontents
\clearpage
\listoftables
\listoffigures
A figure:
\begin{figure}[htbp]
\centering
\includegraphics[width=0.25\linewidth]{example-image-a}
\caption{A picture}
\label{fig:label}
\end{figure}
A table:
\begin{table}[htbp]
\centering
%\caption{A table}
\label{tab:label}
\begin{tabularx}{\linewidth}{lX}
test & test test test test test test test test test test test test test test test test test test test test
\end{tabularx}
\end{table}
\end{document}
答案4
可以使用assoccnt
包裹你可以将计数器与其他计数器关联起来掌握计数器,将其串联起来。在文档的末尾,你写出一个,\label
它将捕获相关计数器的现有总数。然后,使用refcount
是可扩展的\getrefnumber
,可以打印有条件的 LoF(或其他目录结构)。
\documentclass{article}
\usepackage{graphicx,lipsum,assoccnt,refcount}
\newcounter{totfigure}% This will capture the total number of figures
\DeclareAssociatedCounters{figure}{totfigure}% Step totfigure with every figure
\makeatletter
\AtEndDocument{%
\edef\@currentlabel{\arabic{totfigure}}% Update current \label value
\label{tot:figs:used:in:doc}}% Mark \label
\newcommand{\conditionalLoF}{%
\ifnum\getrefnumber{tot:figs:used:in:doc}>0 % Check whether 'totfigure' > 0
\listoffigures\fi}% If so, print \listoffigures
\makeatother
\begin{document}
\conditionalLoF% Conditionally insert List of Figures
\section{First section}
\lipsum[1]
%\begin{figure}
%\centering\includegraphics[width=.5\linewidth]{example-image}
%\caption{This is a caption}
%\end{figure}
\end{document}