当没有图表时,如何列出图表?

当没有图表时,如何列出图表?

我有一个相当大的项目,我根据需要从中选择部分内容。此选择使用复杂的\include\input命令系统完成。我想为输出生成一个图表列表和一个表格列表,但如果没有图表,图表列表就不应该出现。表格也应该如此。

以下是 MWE:

\documentclass[10pt,twocolumn]{文章}
\usepackage{lipsum}
\usepackage[margin=0.75in]{几何}
\usepackage{float}
\floatstyle{盒装}


\restylefloat{图}
\restylefloat{表格}

\def\ignoreTable#1\end{表格}{}
\def\ignoreFigure#1\end{图}{}
\开始{文档}

\目录
\addcontentsline{toc}{section}{图片列表}
\图列表
\addcontentsline{toc}{section}{表格列表}
\表列表

\section{第一部分}
\lipsum[\inputlineno]
\忽略图
\begin{图}[H]\centering
乳胶乳胶
\caption{我的身材}
\结束{图}
\lipsum[\inputlineno]
\begin{图}[H]\centering
\LaTeX\TeX
\caption{另一幅图}
\结束{图}
\section{第二部分}
\lipsum[\inputlineno]
\忽略表
\begin{table}[H]\centering
\TeX\LaTeX
\caption{我的桌子}
\茶几}
\lipsum[\inputlineno]
\忽略表
\begin{table}[H]\centering
\TeX\TeX
\caption{另一张桌子}
\茶几}
\lipsum[\inputlineno]
\结束{文档}

在此处输入图片描述

如果我写

\def\ignoreTable{\relax}
\def\ignoreFigure{\relax}

\begin{document}输出内容如下:

在此处输入图片描述


理想情况下,会有一个“优雅”的宏或包,如果没有表格,它会消除表格列表,包括其在目录中的条目。

答案1

这是另一种方法。它的作用是在文档末尾检查figure和计数器的值,并根据这些值是零还是正数table向文件添加布尔标志设置。.aux

然后,您将进行下一次运行\iffigures,并\iftables允许您有条件地采取行动。

在下面的代码中,也许\global不是真正需要的,我没有检查。

另请参见底部的变体,它不使用figure/table计数器,因为它们可能会由于文档分段而被重置为零(如egreg评论中所指出的那样)。

\documentclass[10pt,twocolumn]{article}
\usepackage{lipsum}
\usepackage[margin=0.75in]{geometry}
\usepackage{float}
\floatstyle{boxed}

\restylefloat{figure}
\restylefloat{table}

\newif\iffigures
\newif\iftables

\makeatletter
\AtEndDocument {%
    \if@filesw
       \ifnum\value{figure}=\z@ % no figures
          \immediate\write\@mainaux {\global\string\figuresfalse}%
       \else
          \immediate\write\@mainaux {\global\string\figurestrue}%
       \fi
       \ifnum\value{table}=\z@ % no tables
          \immediate\write\@mainaux {\global\string\tablesfalse}%
       \else
          \immediate\write\@mainaux {\global\string\tablestrue}%
       \fi
    \fi
}
\makeatother 

% for the purpose of testing

% this will make a MWE without tables
\long\def\IGNORE #1\ENDIGNORE{}

% uncomment to make a MWE with tables
% \let\IGNORE\empty
% \let\ENDIGNORE\empty

\begin{document}

\tableofcontents

% 
\iffigures
   \addcontentsline{toc}{section}{List of Figures}
   \listoffigures
\fi

% 
\iftables
   \addcontentsline{toc}{section}{List of Table}
   \listoftables
\fi

\section{First section}
\lipsum[\inputlineno]
\begin{figure}[H]\centering
\LaTeX\LaTeX
\caption{my figure}
\end{figure}
\lipsum[\inputlineno]
\begin{figure}[H]\centering
\LaTeX\TeX
\caption{another figure}
\end{figure}
\section{Second section}
\lipsum[\inputlineno]
\IGNORE
\begin{table}[H]\centering
\TeX\LaTeX
\caption{my table}
\end{table}
\ENDIGNORE
\lipsum[\inputlineno]
\IGNORE
\begin{table}[H]\centering
\TeX\TeX
\caption{another table}
\end{table}
\ENDIGNORE
\lipsum[\inputlineno]
\end{document}

这是一份有图但没有表格的文档:

没有桌子

如果有表格:

带桌子

需要三次编译。

变体。我不知道修补到什么程度\figure,但\table这里没问题,可能取决于与浮动相关的包。最坏的情况下,我猜之后立即进行修补\begin{document}应该就足够了(如果某个包在开始文档期间做了一些事情,那么在序言末尾进行修补可能不够)。

\documentclass[10pt,twocolumn]{article}
\usepackage{lipsum}
\usepackage[margin=0.75in]{geometry}
\usepackage{float}
\floatstyle{boxed}

\restylefloat{figure}
\restylefloat{table}

\newif\iffigures
\newif\iftables

\makeatletter

\let\OLDfigure\figure
\def\figure {\figures@in@document\OLDfigure }
\let\OLDtable\table
\def\table  {\tables@in@document\OLDtable }

\def\figures@in@document {%
    \immediate\write\@mainaux {\global\string\figurestrue}%
    \global\let\figures@in@document\empty
}

\def\tables@in@document {%
    \immediate\write\@mainaux {\global\string\tablestrue}%
    \global\let\tables@in@document\empty
}

\makeatother

% for the purpose of testing

% this will make a MWE without tables
\long\def\IGNORE #1\ENDIGNORE{}

% uncomment to make a MWE with tables
%\let\IGNORE\empty
%\let\ENDIGNORE\empty

\begin{document}

\tableofcontents

% 
\iffigures
   \addcontentsline{toc}{section}{List of Figures}
   \listoffigures
\fi

% 
\iftables
   \addcontentsline{toc}{section}{List of Table}
   \listoftables
\fi

\section{First section}
\lipsum[\inputlineno]
\begin{figure}[H]\centering
\LaTeX\LaTeX
\caption{my figure}
\end{figure}
\lipsum[\inputlineno]
\begin{figure}[H]\centering
\LaTeX\TeX
\caption{another figure}
\end{figure}
\section{Second section}
\lipsum[\inputlineno]
\IGNORE
\begin{table}[H]\centering
\TeX\LaTeX
\caption{my table}
\end{table}
\ENDIGNORE
\lipsum[\inputlineno]
\IGNORE
\begin{table}[H]\centering
\TeX\TeX
\caption{another table}
\end{table}
\ENDIGNORE
\lipsum[\inputlineno]
\end{document}

答案2

为了将列表添加到目录中,我建议使用tocbibind,即使列表超过一页,也能确保页码正确。

诀窍是测量.lof.lot文件的内容:如果它们不产生任何输出,我们就省略它们,但我们仍然启动它们的生产。

\documentclass[10pt,twocolumn]{article}
\usepackage{lipsum}
\usepackage[margin=0.75in]{geometry}
\usepackage{float}
\usepackage[nottoc]{tocbibind}
\floatstyle{boxed}


\restylefloat{figure}
\restylefloat{table}

\def\ignoreTable#1\end{table}{}
\def\ignoreFigure#1\end{figure}{}
%\def\ignoreTable{}
%\def\ignoreFigure{}

\makeatletter
\let\tocbibind@tocfile\tocfile
\renewcommand{\tocfile}[2]{%
  \setbox\z@=\vbox{\@input{\jobname.#2}}
  \ifdim\ht\z@>\z@
    \tocbibind@tocfile{#1}{#2}%
  \else
    % do the same as \@starttoc without the \@input instruction
    \begingroup
    \makeatletter
    \if@filesw
      \expandafter\newwrite\csname tf@#2\endcsname
      \immediate\openout \csname tf@#2\endcsname \jobname.#2\relax
    \fi
    \@nobreakfalse
    \endgroup
  \fi
}
\makeatother


\begin{document}

\tableofcontents
\listoffigures
\listoftables

\section{First section}
\lipsum[\inputlineno]
\ignoreFigure
\begin{figure}[H]\centering
\LaTeX\LaTeX
\caption{my figure}
\end{figure}
\lipsum[\inputlineno]
\ignoreFigure
\begin{figure}[H]\centering
\LaTeX\TeX
\caption{another figure}
\end{figure}
\section{Second section}
\lipsum[\inputlineno]
\ignoreTable
\begin{table}[H]\centering
\TeX\LaTeX
\caption{my table}
\end{table}
\lipsum[\inputlineno]
\ignoreTable
\begin{table}[H]\centering
\TeX\TeX
\caption{another table}
\end{table}
\lipsum[\inputlineno]
\end{document}

\ignoreTable使用未注释的和的定义,\ignoreFigure我们得不到任何结果,输出为

在此处输入图片描述

如果我启用图形但不启用表格,则输出为

在此处输入图片描述

最后,如果我启用表格和图形,我得到

在此处输入图片描述


替代方法

使用最新的 TeX 发行版,该assoccnt软件包可用,并且可以与一起使用更安全的测试totcount

将上面的代码改为

\documentclass[10pt,twocolumn]{article}
\usepackage{lipsum}
\usepackage[margin=0.75in]{geometry}
\usepackage{float}
\usepackage[nottoc]{tocbibind}
\floatstyle{boxed}

\usepackage{totcount,assoccnt}
\newtotcounter{totallof}
\newtotcounter{totallot}
\DeclareAssociatedCounters{figure}{totallof}
\DeclareAssociatedCounters{table}{totallot}

\restylefloat{figure}
\restylefloat{table}

\def\ignoreTable#1\end{table}{}
\def\ignoreFigure#1\end{figure}{}
%\def\ignoreTable{}
%\def\ignoreFigure{}

\makeatletter
\let\tocbibind@tocfile\tocfile
\renewcommand{\tocfile}[2]{%
  \ifnum\totvalue{total#2}>\z@ % there are figures or tables
    \tocbibind@tocfile{#1}{#2}%
  \else
    % do the same as \@starttoc without the \@input instruction
    \begingroup
    \makeatletter
    \if@filesw
      \expandafter\newwrite\csname tf@#2\endcsname
      \immediate\openout \csname tf@#2\endcsname \jobname.#2\relax
    \fi
    \@nobreakfalse
    \endgroup
  \fi
}
\makeatother


\begin{document}

\tableofcontents
\listoffigures
\listoftables

\section{First section}
\lipsum[\inputlineno]
\ignoreFigure
\begin{figure}[H]\centering
\LaTeX\LaTeX
\caption{my figure}
\end{figure}
\lipsum[\inputlineno]
\ignoreFigure
\begin{figure}[H]\centering
\LaTeX\TeX
\caption{another figure}
\end{figure}
\section{Second section}
\lipsum[\inputlineno]
\ignoreTable
\begin{table}[H]\centering
\TeX\LaTeX
\caption{my table}
\end{table}
\lipsum[\inputlineno]
\ignoreTable
\begin{table}[H]\centering
\TeX\TeX
\caption{another table}
\end{table}
\lipsum[\inputlineno]
\end{document}

答案3

您可以测量列表,如果列表只有标题,则可以将其丢弃:

\documentclass[10pt,twocolumn]{article}
\usepackage{lipsum}
\usepackage[margin=0.75in]{geometry}
\usepackage{float}
\floatstyle{boxed}

\def\wheninteresting#1{%
\setbox0\vbox{#1}%
\ifdim\ht0>35pt
\unvbox0
\fi}

\restylefloat{figure}
\restylefloat{table}

\def\ignoreTable#1\end{table}{}
\def\ignoreFigure#1\end{figure}{}
\begin{document}

\tableofcontents
\wheninteresting{
\addcontentsline{toc}{section}{List of Figures}
\listoffigures
}

\wheninteresting{
\addcontentsline{toc}{section}{List of Table}
\listoftables
}
\section{First section}
\lipsum[\inputlineno]
\ignoreFigure
\begin{figure}[H]\centering
\LaTeX\LaTeX
\caption{my figure}
\end{figure}
\lipsum[\inputlineno]
\begin{figure}[H]\centering
\LaTeX\TeX
\caption{another figure}
\end{figure}
\section{Second section}
\lipsum[\inputlineno]
\ignoreTable
\begin{table}[H]\centering
\TeX\LaTeX
\caption{my table}
\end{table}
\lipsum[\inputlineno]
\ignoreTable
\begin{table}[H]\centering
\TeX\TeX
\caption{another table}
\end{table}
\lipsum[\inputlineno]
\end{document}

相关内容