我有一个相当大的项目,我根据需要从中选择部分内容。此选择使用复杂的\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}