我正在为一个会议写一篇论文。由于行数限制,并非所有内容都适合这篇论文;因此,我正在准备一个完整版,它将上传到 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
: