Cleveref:参考文档另一个版本的标签

Cleveref:参考文档另一个版本的标签

我正在为一个会议写一篇论文。由于行数限制,并非所有内容都适合这篇论文;因此,我正在准备一个完整版,它将上传到 arXiv,其中包含作为附录的附加材料。

\documentclass{scrartcl}
\makeatletter
\usepackage{placeins,etoolbox,amsmath,amsthm}
\usepackage[capitalise,noabbrev]{cleveref}
\numberwithin{figure}{section}
\newtheorem{theorem}{Theorem}[section]
\newtheorem{remark}[theorem]{Remark}

\newif\iffullversion
\fullversiontrue
\fullversionfalse
\iffullversion
    \edef\jobname{\detokenize{fullversion}}
    \crefname{appendixfigure}{Figure}{Figures}
\else
    \usepackage{xr}
    \externaldocument{fullversion}
\fi

\usepackage{apptools}
\newcommand{\CExtra}[3]{
    \AtAppendix{\crefalias{#1}{appendix-#1}}
    \iffullversion
        \crefname{appendix-#1}{#2}{#3}
    \else
        \crefformat{appendix-#1}{#2 ##2##1##3 in the full version}
        \crefrangeformat{appendix-#1}{#3~##3##1##4 to~##5##2##6 in the full version}
        \crefmultiformat{appendix-#1}{#3~##2##1##3}{ and~##2##1##3 in the full version}{, ##2##1##3}{and~##2##1##3 in the full version}
    \fi
}
\CExtra{figure}{Figure}{Figures}
\CExtra{theorem}{Theorem}{Theorems}
\CExtra{remark}{Remark}{Remarks}

\makeatother
\begin{document}
    See \cref{fig:figure in appendix,fig:figure in appendix2}. % Should print as: Figure nn in the full version
    
    See \crefrange{fig:figure in appendix}{fig:figure in appendix2}.
    
    See \cref{thm:app,rmk:app}.
    
    See \cref{rmk:app}.
    \iffullversion
    \appendix   
    \FloatBarrier
    \section{An appendix}
    \begin{figure}
        \rule{\linewidth}{\baselineskip}
        \caption{A figure}
        \label{fig:figure in appendix}
    \end{figure}
    \begin{figure}
        \rule{\linewidth}{\baselineskip}
        \caption{A figure}
        \label{fig:figure in appendix2}
    \end{figure}
    See \cref{fig:figure in appendix} % Should print as: Figure nn
    \begin{theorem}
        \label{thm:app}
        Theorem.
    \end{theorem}
    \begin{remark}
        \label{rmk:app}
        Theorem.
    \end{remark}
    \fi
\end{document}
  • 有没有更好的方法来实现我想要的?

答案1

我认为解决这个问题最有希望的方法是将“完整版本”后缀与标签本身一起存储。因为,否则,您将陷入一场艰苦的战斗,重新定义每一个需要的,crefformat或者说,每一个\the<counter>已经存在的。不幸的是,我们无法使用新的钩子系统进行钩子,\@currentlabel因为它在每次调用时都会被重新定义,\refstepcounter并且钩子会消失。因此,如果没有重新定义\label自身及其cleveref变体,您将陷入困境。

我能想到的最好的解决方案是zref/zref-clever解决方案,我利用 的zref可扩展性并创建一个新属性defaultplus,其中包含适当的后缀,然后我们可以设置zref-clever为默认使用该属性。对于给定引用中的多个相同类型的标签,结果并不十分吸引人,但我认为这是我能扩展用例的最大限度。

正如评论中所讨论的,在构建受限版本时,我们还需要zref-xr能够从“完整版本”中获取标签。这又引出了此解决方案的另一个警告。由于在运行受限版本时,我们不能在\zexternaldocument从中导入标签时使用fullversion前缀参数——因为它们应该是同一文档中的相同标签——属于文档两个版本的标签将尝试重复出现。这就是我运行\zexternaldocument的原因begindocument,以便当前版本的标签占上风。但我看不出有办法避免相应的警告“标签 XYZ 已在文件“fullversion.aux”中使用”。但是,除了令人讨厌之外,它们应该是无害的,你知道它们为什么在那里。

\documentclass{scrartcl}

\newif\iffullversion
\fullversiontrue
\fullversionfalse

\usepackage{placeins}
\usepackage{zref-clever}
\makeatletter
\zref@newprop{defaultplus}{\my@currentlabelplus}
\zref@addprop{main}{defaultplus}
\newcommand{\my@currentlabelplus}{\@currentlabel}
\AddToHook{cmd/appendix/before}{%
  \renewcommand{\my@currentlabelplus}{%
    \@currentlabel%
    \string\iffullversion\string\else
      \string\ in the full version%
    \string\fi
  }%
}
\makeatother
\zcsetup{
  cap,
  noabbrev,
  ref=defaultplus,
}

\counterwithin{figure}{section}

\iffullversion
  \edef\jobname{\detokenize{fullversion}}
\else
  \usepackage{zref-xr}
  \AddToHook{begindocument}{\zexternaldocument{fullversion}}
\fi

\begin{document}

\section{Section 1}

\begin{figure}
  \rule{\linewidth}{\baselineskip}
  \caption{A figure}
  \zlabel{fig:figure1}
\end{figure}

See \zcref{fig:figure in appendix}. % Should print
% as: Figure nn in the full version

See \zcref{fig:figure1}. % Should print as: Figure nn

\iffullversion
  \appendix
  \FloatBarrier
  \section{An appendix}
  \begin{figure}
    \rule{\linewidth}{\baselineskip}
    \caption{A figure}
    \zlabel{fig:figure in appendix}
  \end{figure}
  See \zcref{fig:figure in appendix} % Should print as: Figure nn
\fi

\end{document}

\fullversiontrue

在此处输入图片描述

\fullversionfalse

在此处输入图片描述

相关内容