
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:AmbipEq
es nicht richtig verankert ist, vielleicht liegt das an \mathclap
der \substack
Verwendung? 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:AmbipEq
dazu führt, dass die Nummer „gedruckt“ wird, 1.2.1
wä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 \theequation
wird 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 \theHequation
wird 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 \theHequation
muss 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, \theHequation
um 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:AmbipEq
die 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}