辅助文件中的宏

辅助文件中的宏

我将展示两个类似的文件。第一个文件

\documentclass{amsart}
\begin{document}
\def\Site{left}
\section{Left Space}
\label{s:\Site Space}
\begin{equation}
\label{product from \Site}
a=bC
\end{equation}
\def\Site{right}
\section{\Site Space}
\label{s:\Site Space}
\begin{equation}
\label{product from \Site}
a=Cb
\end{equation}
\end{document}

创建以下辅助文件

\relax 
\newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{0pt}
\newlabel{tocindent1}{17.77782pt}
\newlabel{tocindent2}{0pt}
\newlabel{tocindent3}{0pt}
\@writefile{toc}{\contentsline {section}{\tocsection {}{1}{Left Space}}{1}{}\protected@file@percent }
\newlabel{s:leftSpace}{{1}{1}}
\newlabel{product from left}{{1}{1}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{2}{rightSpace}}{1}{}\protected@file@percent }
\newlabel{s:rightSpace}{{2}{1}}
\newlabel{product from right}{{2}{1}}
\gdef \@abspage@last{1}

一切都很好。然而,这段代码中的一些小变化

\documentclass{amsart}
\usepackage[unicode]{hyperref}
\begin{document}
\def\Site{left}
\section{Left Space}
\label{s:\Site Space}
\begin{equation}
\label{product from \Site}
a=bC
\end{equation}
\def\Site{right}
\section{\Site Space}
\label{s:\Site Space}
\begin{equation}
\label{product from \Site}
a=Cb
\end{equation}
\end{document}

创建不同的辅助文件

\relax 
\providecommand\hyper@newdestlabel[2]{}
\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument}
\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined
\global\let\oldnewlabel\newlabel
\gdef\newlabel#1#2{\newlabelxx{#1}#2}
\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}}
\AtEndDocument{\ifx\hyper@anchor\@undefined
\let\newlabel\oldnewlabel
\fi}
\fi}
\global\let\hyper@last\relax 
\gdef\HyperFirstAtBeginDocument#1{#1}
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{0pt}
\newlabel{tocindent1}{17.77782pt}
\newlabel{tocindent2}{0pt}
\newlabel{tocindent3}{0pt}
\@writefile{toc}{\contentsline {section}{\tocsection {}{1}{Left Space}}{1}{section.1}\protected@file@percent }
\newlabel{s:leftSpace}{{1}{1}{Left Space}{section.1}{}}
\newlabel{product from left}{{1}{1}{Left Space}{equation.1.1}{}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{2}{rightSpace}}{1}{section.2}\protected@file@percent }
\newlabel{s:rightSpace}{{2}{1}{\Site Space}{section.2}{}}
\newlabel{product from right}{{2}{1}{\Site Space}{equation.2.2}{}}
\gdef \@abspage@last{1}

问题是我该如何重写代码以确保宏不会出现在辅助文件中。我喜欢使用包 xr 的宏 \externaldocument 来显示对外部文档的引用。但是当我将包含宏的辅助文件读入内存时,会出现错误。

答案1

nameref 使用 gettitlestring 包来存储分段命令的标题。您可以更改所用的方法expand

\documentclass{amsart}


\usepackage[unicode]{hyperref}
\GetTitleStringSetup{expand}

\begin{document}
\def\Site{left}
\section{Left Space}
\label{s:\Site Space}
\begin{equation}
\label{product from \Site}
a=bC
\end{equation}
\def\Site{right}
\section{\Site Space}
\label{s:\Site Space}
\begin{equation}
\label{product from \Site}
a=Cb
\end{equation}
\end{document}

这将给出辅助信息:

\newlabel{s:rightSpace}{{2}{1}{rightSpace}{section.2}{}}
\newlabel{product from right}{{2}{1}{rightSpace}{equation.2.2}{}}

答案2

编辑:正如乌克兰所指出的,这并不能解决问题,它只是扩大了已经扩大的标签文本。

添加hyperref不是小改动。它重新定义了标签和分段命令以添加超链接。您对的调用\Site被新的捕获为未展开的标记hyperref label

我能想到的最简单的解决方案是在将标签命令传递给标签之前包装扩展参数的标签命令,因此如下所示:

\def\wrappedlabel#1{%
  {\edef\arg{#1}%
  \expandafter\label\expandafter{\arg}}%
}

使用方式与原始标签命令类似。

其要点是先使用 来edef完全扩展参数的内容,然后再使用标准expandafter序列对其进行扩展,然后再由 读取label。我们需要 来edef处理您希望\Site位于标签文本中第一个标记以外的其他位置的情况。

相关内容