避免重复定义多次的图形

避免重复定义多次的图形

我正在生成一个文档(考试,基于考试文档类),该文档随机选取一组问题并使用 导入它们input。每个问题都引用一个“源图像”,例如问题 A 引用图 F1,B 引用 F2,C 引用 F1。图像可以在每个问题中重复使用。由于问题是从池中随机抽取的,我无法控制将出现哪些图像。我的目标是避免在主文档中重复出现图像,只显示一次图像。

\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics[width=\textwidth]{img1.png}
\includegraphics[width=\textwidth]{img1.png}
\includegraphics[width=\textwidth]{img2.png}
\end{document}

我希望它能产生一份文件

  • img1 和 img2 仅包含一次
  • 为图片添加标题
  • 最好将数字包裹在figure浮点数中
  • 最好将图表放在文档末尾

在开始涉及复杂的 latexcode 的疯狂尝试之前,我想在这里检查一下,看看我是否缺少一些可以帮助我的简单和默认行为。谢谢!

附言:我最初的想法是使用一个命令来引用图形的名称,例如“f1”。然后该命令可以初始化/增加一个计数器,我在实际生成图形之前可以检查该计数器。

答案1

它有点非标准 LaTeX 代码,但使用\csname ... \endcsname它很容易“记住”事情,这是类和包中使用的一种标准技术。所以这里有一个使用该技术的解决方案。它会记住\csname image:#1\endcsname图像是否已加载,如果没有,则将其放入 a 中figure并创建一个标签来引用它。figure将 s 放入 a 中\AtEndDocument以将其移动到文档末尾。

\documentclass{article}
\usepackage{graphicx}
\newcommand{\refimage}[1]{%
  \expandafter\ifx\csname image:#1\endcsname\relax %image not yet loaded
  \AtEndDocument{\begin{figure}[bp]
    \includegraphics[width=\textwidth]{#1}
    \caption{Image #1}
    \label{image:#1}
  \end{figure}}
  \expandafter\gdef\csname image:#1\endcsname{image:#1}
  \fi
  \ref{image:#1}
}
\begin{document}
\listoffigures

\section{Introduction}

This section used figure \refimage{example-image-a}.

\subsection{Subsec}

This subsection uses figure \refimage{example-image-a}.

\subsection{Another sub}

This section used figure \refimage{example-image-b}

\end{document}

在此处输入图片描述

答案2

根据 Pieter 的回答,我拼凑了一个替代解决方案(尽管并不完全等效)。它使用全局计数器并与foreach循环结合使用。我将其包含在内以供将来参考,或者如果其他人可能觉得这有用。

\documentclass[12pt]{article}

\usepackage{etoolbox}
\usepackage{graphicx}
\usepackage{tikz}
\usepackage{float}

% https://tex.stackexchange.com/questions/279780/on-demand-ad-hoc-counters
\makeatletter
\newcommand{\figurecounter}[1]{%
  \@ifundefined{c@#1}{%
    \newcounter{#1}%
    \global\defcounter{#1}{0}% global counter makes sure it doesn't reset in the foreach loop
  }{%
    \global\stepcounter{#1}%
  }%
}
\makeatother

\newcommand{\inputfigure}[1]{%
    \figurecounter{#1}% bump the counter
    \ifnumcomp{\csname the#1\endcsname}{=}{0}% if the counter has not yet been used, input the figure
    {
        \begin{figure}[H]
            \centering
            \includegraphics[width=0.1\textwidth]{example-image-a}
            \caption{image ``#1''}
            \label{fig:#1}
        \end{figure}    
    }%
    {}%
}

\newcommand*{\questionsets}{%
    setone,%
    settwo%
}%

\begin{document}
    \foreach \questionset in \questionsets {%
        questionset: \questionset \\
        \inputfigure{a}
        \inputfigure{a}
        \inputfigure{b}
        \inputfigure{b}
    }
\end{document}

相关内容