将枚举项的 \ref 输出格式化为不包含部分名称

将枚举项的 \ref 输出格式化为不包含部分名称

我正在引用另一个文档 (requirements.tex) 中枚举列表中的项目。我可以这样做,但我得到了无法删除的无关信息。

要求.tex:

\documentclass{article}
\usepackage{graphicx}
\usepackage{mathtools}
\usepackage{hyperref}
\usepackage{enumerate}
\begin{document}

\section{Engineering Requirements}
\begin{enumerate}
    \item The system shall turn trees into money. \label{Req:treesToMoney}
    \item The system must be able to process five trees per second. \label{Req:treeRate}
\end{enumerate}
\end{document}

设计.tex:

\documentclass[hidelinks]{article}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{fancyhdr}
\usepackage{amsmath, amsthm ,amssymb}
\usepackage{graphicx}
\usepackage{xr}

\externaldocument{../requirements/Requirements}

\begin{document}
Requirement \ref{Req:treesToMoney} is a functional requirement. 
\end{document}  

design.tex 的输出如下:

要求 1工程要求项目 1 是功能要求。

这个输出看起来很糟糕。我不仅得到了多余的部分名称和 Item.#,而且这些信息没有用空格分隔。

有没有办法格式化 \ref 的输出?可能要排除无关信息,但至少要用空格分隔不同的信息。

答案1

这个包xr是在很久之前编写的hyperref。这个包改变了标签在文件中的存储方式.aux,因此xr可以找到不合适的值并尽其所能。

hyperref如果在文件中使用Requirements.tex,那么您也应该在中使用它,design.tex并使用xr-hyper而不是xr

如果你真的不想hyperref在 中使用design.tex,你可以修改 的工作原理,xr以便\newlabel调用正确的方法。design.tex修改 的内部宏的示例xr

\documentclass{article}
\usepackage{xr}
\makeatletter
\long\def\XR@test#1#2#3#4\XR@{%
  \ifx#1\newlabel
    \mod@newlabel{\XR@prefix#2}#3{}{}\@nil% changed line
  \else\ifx#1\@input
     \edef\XR@list{\XR@list#2\relax}%
  \fi\fi
  \ifeof\@inputcheck\expandafter\XR@aux
  \else\expandafter\XR@read\fi}
% new macro
\def\mod@newlabel#1#2#3#4\@nil{\newlabel{#1}{{#2}{#3}}}
\makeatother

\externaldocument{Requirements}

\begin{document}
Requirement \ref{Req:treesToMoney} is a functional requirement.
\end{document}

答案2

文档Requirements.tex加载包nameref(通过包hyperref),该包会更改文件中标签数据的布局.aux。文档design.tex不使用nameref并且包xr不知道nameref。有时xr-hyper可以使用。在包中,zref-xr我重写了算法以支持从 导入标签zref和将 LaTeX 标签导入zref和/或支持包nameref/ hyperreftitleref和 的LaTeX 标签ntheorem

示例文件design.tex

\documentclass{article}
\usepackage{graphicx}
\usepackage{geometry}
\usepackage{fancyhdr}
\usepackage{amsmath, amsthm ,amssymb}
\usepackage{graphicx}
\usepackage{zref-xr}
\zxrsetup{%
  tozreflabel=false, % not needed, since `zref` is not used otherwise
  toltxlabel=true, % classical LaTeX labels that can be referenced with \ref, \pageref
}
\zexternaldocument*{Requirements}% star form: only LaTeX labels are imported

\begin{document}
Requirement \ref{Req:treesToMoney} is a functional requirement.
\end{document}

结果

相关内容