所以我一直在用 Latex 写我的论文,最近我偶然发现了一个难以解决的问题,我希望这里有人可以帮助我。
我正在使用 subcaption 创建多图像图形。我成功地交叉引用了一组图像,但第二组图像出现了问题。代码完全相同,只是其中一个出现了错误。我附上了我的代码,显示了某些引用如何显示为“??”。
\documentclass{book}
\usepackage{typedref}
\usepackage[demo]{graphicx}
\usepackage{caption,subcaption}
\usepackage{listings}
\begin{document}
Test \figureref{protonTimeComparison}.
\begin{figure}
\begin{center}
\begin{subfigure}[b]{1\textwidth}
\graphicspath{{./Figures/}}
\includegraphics[width=1\linewidth]{cheers.png}
\subcaption{Test 1a}
\label{proton5min}
\end{subfigure}
\begin{subfigure}[b]{1\textwidth}
\graphicspath{{./Figures/}}
\includegraphics[width=1\linewidth]{Thirty_Minute_Average_Flux_Jan2000.png}
\subcaption{test 1b}
\label{protonthreemin}
\end{subfigure}
\caption{test 1}
\label{protonTimeComparison}
\end{center}
\end{figure}
Test sublabels \figureref{proton5min} and \figureref{protonthreemin}.
Test \figureref{protonP1Issue}
\begin{figure}
\begin{center}
\begin{subfigure}[b]{1\textwidth}
\graphicspath{{./Figures/}}
\includegraphics[width=1\linewidth]{April_2002_Channel_P1.png}
\subcaption{test 2a}
\label{P1Apr}
\end{subfigure}
\begin{subfigure}[b]{1\textwidth}
\graphicspath{{./Figures/}}
\includegraphics[width=1\linewidth]{April_2002_Channel_P2.png}
\subcaption{test 2b}
\label{PApr}
\end{subfigure}
\caption{test 2}
\label{protonP1Issue}
\end{center}
\end{figure}
Test sublabels \figureref{P1Apr} and \figureref{PApr}.
\end{document}
我认为这可能与类型引用我用于交叉引用的包,但我不确定。谢谢你的帮助。
答案1
我认为没有必要使用诸如类型引用—— 它似乎是与 MikTeX 一起发布的,但是不是使用 TeXlive——如果有一个更强大、更通用的交叉引用包,例如聪明人可以代替使用。
哦,请[b]
从subfigure
环境中省略位置说明符,因为它们什么都不做(除了提供代码混乱)。
\documentclass{book}
%%\usepackage{typedref} % not part of TeXLive
\usepackage[demo]{graphicx}
\usepackage{subcaption,listings}
\usepackage[noabbrev,capitalize]{cleveref}
\begin{document}
Test: \cref{protonTimeComparison}.
Test: \cref{proton5min} and \cref{protonthreemin}.
Or: \cref{proton5min,protonthreemin}.
\begin{figure}
\begin{subfigure}{1\textwidth}
\graphicspath{{./Figures/}}
\includegraphics[width=1\linewidth]{cheers.png}
\caption{Test 1a}
\label{proton5min}
\end{subfigure}
\medskip % insert some vertical whitespace to separate the subfigures
\begin{subfigure}{1\textwidth}
\graphicspath{{./Figures/}}
\includegraphics[width=1\linewidth]{Thirty_Minute_Average_Flux_Jan2000.png}
\caption{Test 1b}
\label{protonthreemin}
\end{subfigure}
\caption{Test 1}
\label{protonTimeComparison}
\end{figure}
\end{document}
答案2
尝试对你的 MWE 进行以下修改:
\documentclass{book}
%\usepackage{typedref} % source of the problem
\usepackage[demo]{graphicx}
\usepackage{caption,subcaption}
%\usepackage{listings}
\graphicspath{{./Figures/}}
\begin{document}
Test \ref{protonTimeComparison}.
\begin{figure}
\centering
\begin{subfigure}{\textwidth}
\includegraphics[width=\linewidth]{cheers}
\caption{Test 1a}
\label{proton5min}
\end{subfigure}
\begin{subfigure}{\textwidth}
\includegraphics[width=\linewidth]{Thirty_Minute_Average_Flux_Jan2000}
\caption{test 1b}
\label{protonthreemin}
\end{subfigure}
\caption{test 1}
\label{protonTimeComparison}
\end{figure}
Test sub-labels \ref{proton5min} and \ref{protonthreemin}.
Test \ref{protonP1Issue}
\begin{figure}
\centering
\begin{subfigure}{\textwidth}
\includegraphics[width=\linewidth]{April_2002_Channel_P1.png}
\caption{test 2a}
\label{P1Apr}
\end{subfigure}\hfil
\begin{subfigure}{\textwidth}
\includegraphics[width=\linewidth]{April_2002_Channel_P2.png}
\caption{test 2b}
\label{PApr}
\end{subfigure}
\caption{test 2}
\label{protonP1Issue}
\end{figure}
Test sub-labels \ref{P1Apr} and \ref{PApr}.
\end{document}
与您的 MWE 相比,主要变化如下:
- 图像路径被移动到序言中它们的位置在哪里(如果你的所有图像都在同一个文件夹中)
- 用来
subfigure
代替\caption
subcaption
- 您已
\figureref
按包定义typedref
。由于发现后者与不兼容,subcaption
因此最好将其自身定义figureref
为\newcommand\figureref[1]{Fig. \ref{#1}}
或使用其他包进行引用。
附录:
问题的根源是包typedref
,它大量重新定义了label
definition。如果没有它,上述示例可以正常工作(如报告所示)。有关更好的解决方案,请参阅米科答案,他提出并展示了如何使用cleaveref
包。