Querverweis ist nicht richtig verankert

Querverweis ist nicht richtig verankert

Ich habe einen geschriebenen Code wie diesen

\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}

Und ich würde gerne wissen, warum eq:AmbipEqes nicht richtig verankert ist, vielleicht liegt das an \mathclapder \substackVerwendung? Vielen Dank!

Antwort1

Beim Testen Ihres Beispiels erhielt ich die Zeile

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

in die .aux-Datei.

Dies bedeutet, dass das Verweisen auf das Etikett eq:AmbipEqdazu führt, dass die Nummer „gedruckt“ wird, 1.2.1während eine Verknüpfung zu einem Anker mit dem Namen hergestellt wird equation.1.1.

Die .log-Datei enthält einige Warnungen. Eine davon ist:

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

Dies bedeutet, dass es aus irgendeinem Grund zwei Versuche gab, einen Anker mit dem Namen zu platzieren equation.1.1.
Jeder Hyperlink verweist auf die Stelle in der Ausgabedatei/PDF-Datei, die der Stelle in der TeX-Eingabedatei/Quelldatei entspricht, an der der erste Versuch stattfand, diesen Anker zu platzieren.

Was ist der Grund dafür?:

Das Makro \theequationwird verwendet, um anzugeben, wie der Wert des Gleichungszählers „gedruckt“ werden soll.

Wenn Sie das Hyperref-Paket verwenden, gibt es – neben dem Drucken des Werts – ein weiteres Problem:

Wenn eine neue Instanz eines nummerierten „Rubrikationselements“ in die Ausgabedatei (PDF-Datei) eingefügt wird, also eine nummerierte Abschnittsüberschrift, die Bildunterschrift eines nummerierten Bildes, die Bildunterschrift einer nummerierten Tabelle oder die Nummer einer Formel/Gleichung, wird sowohl der Wert des entsprechenden Zählers gedruckt als auch ein Anker für Hyperlinks gesetzt. Dieser Anker muss einen Namen haben, der im gesamten Dokument eindeutig ist.

Das Makro \theHequationwird verwendet, um die Art und Weise anzugeben, in der Ankernamen, die sich auf Gleichungsnummern beziehen, automatisch generiert werden, wenn das Hyperref-Paket verwendet wird.

Das Makro \theHequationmuss so angegeben werden, dass die Eindeutigkeit der Ankernamen gewährleistet ist.

Wenn Sie neu definieren/ändern \theequation, müssen Sie wahrscheinlich auch anpassen/neu definieren, \theHequationum die Eindeutigkeit der Ankernamen sicherzustellen.

Daher schlage ich vor, parallel zur Platzierung

\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}%
}

etwas platzieren wie

\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}%
  }%
}

in die Präambel Ihres Dokuments.

(Bei beiden erstellten Codeschnipseln wird @ein Buchstabe (→ \makeatletter..\makeatother) angenommen.)

Dabei erhalte ich in der .aux-Datei einen Eintrag

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

Das bedeutet, dass beim Verweisen auf das Etikett eq:AmbipEqdie Nummer „gedruckt“ wird, 1.2.1 während eine Verknüpfung zu einem Anker mit dem Namen hergestellt wird equation.1.2.1.

Die entsprechende pdfTeX-Warnung bezüglich Zielen mit gleichem Bezeichner erscheint nicht in der .log-Datei.

\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}

Übrigens:

Ich denke, es ist wichtig, etwas über den Leseapparat von (La)TeX zu lernen und über die Umstände, unter denen (La)TeX Leerzeichen erzeugt (die ein horizontales Leerzeichen in der Ausgabedatei ergeben), wenn ein Leerzeichen in der Eingabedatei gefunden wird.
Beispielsweise erzeugt ein Leerzeichen in der Eingabedatei nach einer öffnenden oder schließenden Klammer ein Leerzeichen, das zu einem horizontalen Leerzeichen in der Ausgabedatei führt (falls dieses Leerzeichen gefunden wird, wenn (La)TeX nicht in einem seiner vertikalen Modi ist).
Beispielsweise erzeugt ein Zeilenumbruch nach einer öffnenden oder schließenden Klammer ebenfalls ein Leerzeichen. Das liegt daran, dass (La)TeX beim Lesen der Eingabe am Ende jeder Zeile ein Leerzeichen einfügt – dies hat mit dem Integer-Parameter zu tun \endlinechar.

Erwägen Sie die Verwendung von Kommentarzeichen %nach öffnenden Klammern am Zeilenende und nach schließenden Klammern am Zeilenende, also {%oder }%, um unerwünschte horizontale Leerzeichen innerhalb der Ausgabedatei/PDF-Datei zu vermeiden.

\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}

verwandte Informationen