交叉引用没有正确锚定

交叉引用没有正确锚定

我有一个这样的代码

\documentclass[8pt,a4paper,dvipsnames]{article}
\usepackage[utf8]{inputenc}
\usepackage[a4paper,hmargin=2cm,vmargin={2cm,2.5cm}]{geometry}
\usepackage[colorlinks=false]{hyperref}
\hypersetup{
    pdftitle={...},
    pdfauthor={...},
    pdfsubject={...},
    pdfkeywords={...},
}
\usepackage{enumitem}
\usepackage{chngcntr}
\usepackage{cleveref}
\usepackage{etoolbox,cancel,mathtools,physics}

\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\counterwithin*{equation}{enumi}

\newif\ifinenumerate
\AtBeginEnvironment{enumerate}{\inenumeratetrue}

\makeatletter
\renewcommand\theequation{%
  \ifnum\value{subsection}>0 \thesubsection.\else
  \ifnum\value{section}>0 \thesection.\fi\fi
  \ifinenumerate \theenumi\fi
  \arabic{equation}}
\makeatother

\begin{document}
\section{Test 1}
\subsection{Test 1.1}
\begin{enumerate}[label=\alph*.]
\item item a
    \begin{itemize}
        \item item a case 1         
        \begin{equation*}
        a = b
        \end{equation*}             
        \begin{itemize}
        \item item a case 1 subcase 1       
        \begin{equation}
        a = b \label{eq:Eq1.1.a.1}
        \end{equation}
        \end{itemize}
    \end{itemize}
    \begin{equation}
    a = b \label{eq:Eq1.1.a.2}
    \end{equation}
\end{enumerate}
\subsection{Test 1.2}
\begin{equation} 
\underbrace{
            \cancel{\pdv{t}\delta n}
            }_{
               \mathclap{\substack{\text{stationary} \\ \text{case}}}
              } 
              + 
\underbrace{
            \cancel{\mu^*\va{E}\grad_{\va{r}}{\var n}}
            }_{
               \substack{\mu^* = 0 \\ \text{if} \\ n_0 = p_0 = n_i}
              } 
              - 
D^*\laplacian_{\va{r}}\delta n 
              - 
\underbrace{
            \frac{\delta n}{\tau^*}
            }_{
               \mathclap{\substack{\text{it vanishes for} \\ \text{lengths less than}\ L}}
              } 
              - 
g_L = 0 \label{eq:AmbipEq}
\end{equation}
\subsection{Test 1.3}
Cross reference to \eqref{eq:AmbipEq} which is not properly anchored 
\end{document}

我想知道为什么eq:AmbipEq没有正确锚定,也许是因为\mathclap\substack使用?非常感谢!

答案1

在测试你的例子时,我得到了

\newlabel{eq:AmbipEq}{{1.2.1}{1}{Test 1.2}{equation.1.1}{}}

进入.aux 文件。

这意味着引用标签eq:AmbipEq会导致“打印”数字,1.2.1同时链接到名为 的锚点equation.1.1

.log 文件包含一些警告。其中之一是:

pdfTeX warning (ext4): destination with the same identifier (name{equation.1.1}) has been already used, duplicate ignored

这意味着由于某种原因,有两次尝试放置名为 的锚点equation.1.1
每个超链接都会链接到输出文件/.pdf 文件中的那个位置,该位置对应于 .TeX 输入文件/源文件中第一次尝试放置该锚点的位置。

这是什么原因呢?

该宏\theequation用于指定如何“打印”方程计数器的值。

当您使用 hyperref 包时,除了打印值之外,还有另一个问题:

当将编号的“注释项”的新实例放入输出文件(pdf 文件)时,即编号的章节标题、编号图片的标题、编号表格的标题或公式/方程的编号,将打印相应计数器的值并放置超链接的锚点。该锚点需要在整个文档中唯一的名称。

该宏\theHequation用于指定使用 hyperref 包时自动生成与方程编号相关的锚点名称的方式。

\theHequation必须以确保锚点名称唯一性的方式指定宏。

当您重新定义/更改时\theequation,您可能也需要调整/重新定义,\theHequation以确保锚点名称的唯一性。

因此我建议同时放置

\renewcommand\theequation{%
  \ifnum\value{subsection}>0 \thesubsection.\else
  \ifnum\value{section}>0 \thesection.\fi\fi
  \ifinenumerate \csname theenum\romannumeral\the\@enumdepth\endcsname\fi
  \arabic{equation}%
}

放置类似

\AtBeginDocument{%
  \renewcommand\theHequation{%
    \ifnum\value{subsection}>0 \theHsubsection.\else
    \ifnum\value{section}>0 \theHsection.\fi\fi
    \ifinenumerate \csname theHenum\romannumeral\the\@enumdepth\endcsname.\fi
    \arabic{equation}%
  }%
}

放入文档的序言中。

(对于这两个代码片段,@假设都是字母 (→ \makeatletter..\makeatother)。)

执行此操作时,我会进入 .aux 文件

\newlabel{eq:AmbipEq}{{1.2.1}{1}{Test 1.2}{equation.1.2.1}{}} 

这意味着引用标签eq:AmbipEq会导致“打印”数字,1.2.1 同时链接到名为 的锚点equation.1.2.1

.log 文件中没有出现有关具有相同标识符的目标的相应 pdfTeX 警告。

\documentclass[8pt,a4paper,dvipsnames]{article}
\usepackage[utf8]{inputenc}
\usepackage[a4paper,hmargin=2cm,vmargin={2cm,2.5cm}]{geometry}
\usepackage[colorlinks=false]{hyperref}
\hypersetup{
    pdftitle={...},
    pdfauthor={...},
    pdfsubject={...},
    pdfkeywords={...},
}
\usepackage{enumitem}
\usepackage{chngcntr}
\usepackage{cleveref}
\usepackage{etoolbox,cancel,mathtools,physics}

\counterwithin*{equation}{section}
\counterwithin*{equation}{subsection}
\counterwithin*{equation}{enumi}

\newif\ifinenumerate
\AtBeginEnvironment{enumerate}{\inenumeratetrue}

\newcommand{\prr}{\\[0.5cm]} %

\makeatletter
\renewcommand\theequation{%
  \ifnum\value{subsection}>0 \thesubsection.\else
  \ifnum\value{section}>0 \thesection.\fi\fi
  \ifinenumerate \csname theenum\romannumeral\the\@enumdepth\endcsname\fi
  \arabic{equation}%
}
\AtBeginDocument{%
  \renewcommand\theHequation{%
    \ifnum\value{subsection}>0 \theHsubsection.\else
    \ifnum\value{section}>0 \theHsection.\fi\fi
    \ifinenumerate \csname theHenum\romannumeral\the\@enumdepth\endcsname.\fi
    \arabic{equation}%
  }%
}
\makeatother

\begin{document}
\section{Test 1}
\subsection{Test 1.1}
\begin{enumerate}[label=\alph*.]
\item item a
    \begin{itemize}
        \item item a case 1
        \begin{equation*}
        a = b
        \end{equation*}
        \begin{itemize}
        \item item a case 1 subcase 1
        \begin{equation}
        a = b \label{eq:Eq1.1.a.1}
        \end{equation}
        \end{itemize}
    \end{itemize}
    \begin{equation}
    a = b \label{eq:Eq1.1.a.2}
    \end{equation}
\end{enumerate}
\subsection{Test 1.2}
\begin{equation}
\underbrace{
            \cancel{\pdv{t}\delta n}
            }_{
               \mathclap{\substack{\text{stationary} \\ \text{case}}}
              }
              +
\underbrace{
            \cancel{\mu^*\va{E}\grad_{\va{r}}{\var n}}
            }_{
               \substack{\mu^* = 0 \\ \text{if} \\ n_0 = p_0 = n_i}
              }
              -
D^*\laplacian_{\va{r}}\delta n
              -
\underbrace{
            \frac{\delta n}{\tau^*}
            }_{
               \mathclap{\substack{\text{it vanishes for} \\ \text{lengths less than}\ L}}
              }
              -
g_L = 0 \label{eq:AmbipEq}
\end{equation}
\begin{align}
n &= N_C e^{\left(\frac{E_F-E_C}{K_B T}\right)} \nonumber
\prr
\frac{N_D^+}{N_D^0} &= \frac{1}{g_D}e^{\left(\frac{E_D-E_F}{K_BT}\right)} \label{eq:EqToLabeling}
\end{align}
\subsection{Test 1.3}
Cross reference to \eqref{eq:AmbipEq} which is hopefully properly anchored

Cross reference to \eqref{eq:EqToLabeling} which is hopefully properly anchored as well.
\end{document}

顺便一提:

我认为了解 (La)TeX 的读取装置以及 (La)TeX 在输入文件中遇到空格字符时会产生空格标记(在输出文件中产生水平空格)的情况非常重要。
例如,输入文件中位于开括号字符或闭括号字符后的空格字符将产生一个空格标记,从而导致输出文件中出现水平空格(如果在 (La)TeX 不处于其垂直模式之一时遇到该空格标记)。
例如,位于开括号字符或闭括号字符后的换行符也会产生一个空格标记。这是因为在读取输入时,(La)TeX 会在每行末尾插入一个空格字符 — 这与整数参数有关\endlinechar

%考虑在行尾的开括号字符后和行尾的闭括号字符后使用注释字符,即{%}%,以避免输出文件/pdf 文件中出现不必要的水平空间。

\documentclass{article}

\newcommand\TeXA{\TeX{
}\TeX}

\newcommand\TeXB{\TeX{}
\TeX}

\newcommand\TeXC{\TeX{%
}\TeX}

\newcommand\TeXD{\TeX{}%
\TeX}

\begin{document}

\noindent There are subtle differences in spacing:

\noindent \TeXA

\noindent \TeXB

\noindent \TeXC

\noindent \TeXD

\end{document}

相关内容