更新:感谢大家的帮助,看来我只是误解了 \nameref 的工作原理。我没有意识到它打印了整个标题,因此正如 Ulrike 所评论的那样,代码看起来只是无限/迭代扩展的自引用。我需要找到另一个包/命令来实现我想要的。对不起,我的错误!我会接受 Simon 的回答并关闭问题。
我正在尝试使用 minted 包将一些代码块插入我的 LaTeX 文档(如果相关的话,我正在使用 TeXStudio)。我想在标题中说明这些不同的文件如何相互关联,为此,我在第一个代码块的标题中引用了第二个代码块,反之亦然(即有一个引用循环)。我使用了一个附加环境(“代码”),这样长代码就可以跨越多个页面。
当我使用 \ref 命令(它仅提供代码块/列表的编号)时,一切都按预期工作。工作代码的 MWE:
\documentclass{article}
\usepackage{minted}
\usepackage{caption}
\usepackage{subcaption}
\usepackage[hidelinks]{hyperref}
\usepackage{cleveref}
\newenvironment{code}{\captionsetup{type=listing}}{}
\begin{document}
\begin{code}
\captionof{listing}{Some reference to \ref{code:secondcode}.}
\label{code:firstcode}
\end{code}
\begin{code}
\captionof{listing}{Some reference to \ref{code:firstcode}.}
\label{code:secondcode}
\end{code}
\end{document}
但是,如果我将 \ref 换成 \nameref,则编译时会抛出一个错误:第 15 行:超出 TeX 容量,抱歉 [grouping levels=255]。...e 引用 \nameref{code:secondcode}。}
非工作代码的 MWE:
\documentclass{article}
\usepackage{minted}
\usepackage{caption}
\usepackage{subcaption}
\usepackage[hidelinks]{hyperref}
\usepackage{cleveref}
\newenvironment{code}{\captionsetup{type=listing}}{}
\begin{document}
\begin{code}
\captionof{listing}{Some reference to \nameref{code:secondcode}.}
\label{code:firstcode}
\end{code}
\begin{code}
\captionof{listing}{Some reference to \nameref{code:firstcode}.}
\label{code:secondcode}
\end{code}
\end{document}
我很乐意以某种方式解决这个问题,但我不知道该怎么做,而且解决 nameref 子包中的问题也超出了我的 LaTeX 技能。我不确定它是否与 caption 或 listing 包有任何关系。
有什么建议么?
编辑:忘了说 - 当删除其中一个 \namerefs 时,代码也能正常工作,因此它以某种方式与循环引用相关。
更简单的例子,只需加载nameref
\documentclass{article}
\usepackage{nameref}
\begin{document}
\begin{figure}
\caption{Some reference to \nameref{code:secondcode}.}
\label{code:firstcode}
\end{figure}
\begin{figure}
\caption{Some reference to \nameref{code:firstcode}.}
\label{code:secondcode}
\end{figure}
\end{document}
答案1
使用\Cref
而不是\nameref
。
\documentclass{article}
\usepackage{minted}
\usepackage{caption}
\usepackage{subcaption}
\usepackage[hidelinks]{hyperref}
\usepackage{cleveref}
\newenvironment{code}{\captionsetup{type=listing}}{}
\begin{document}
\begin{code}
\captionof{listing}{Some reference to \Cref{code:secondcode}.}
\label{code:firstcode}
\end{code}
\begin{code}
\captionof{listing}{Some reference to \Cref{code:firstcode}.}
\label{code:secondcode}
\end{code}
\end{document}