我正在生成一个文档(考试,基于考试文档类),该文档随机选取一组问题并使用 导入它们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}