
Tengo un código escrito como este.
\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}
Y me gustaría saber por qué eq:AmbipEq
no está bien anclado, ¿tal vez sea por el uso \mathclap
o por eso \substack
? ¡muchas gracias!
Respuesta1
Al probar tu ejemplo, obtuve la línea
\newlabel{eq:AmbipEq}{{1.2.1}{1}{Test 1.2}{equation.1.1}{}}
en el archivo .aux.
Esto significa que hacer referencia a la etiqueta eq:AmbipEq
lleva a "imprimir" el número 1.2.1
mientras se vincula a un ancla cuyo nombre es equation.1.1
.
El archivo .log contiene algunas advertencias. Uno de ellos es:
pdfTeX warning (ext4): destination with the same identifier (name{equation.1.1}) has been already used, duplicate ignored
Esto quiere decir que por alguna razón hubo dos intentos de colocar un ancla cuyo nombre es equation.1.1
.
Cada hipervínculo enlaza a ese lugar en el archivo de salida/archivo .pdf que corresponde al lugar en el archivo de entrada .TeX/archivo fuente donde tuvo lugar el intento de colocar ese ancla la primera vez.
¿Cuál es la razón para esto?:
La macro \theequation
se utiliza para especificar cómo "imprimir" el valor del contador de ecuaciones.
Cuando usas el paquete hyperref, hay, además de imprimir el valor, otro problema:
Cuando se coloca una nueva instancia de un "elemento de rubrificación" numerado en el archivo de salida (archivo pdf), es decir, un encabezado de sección numerado, o el título de una imagen numerada, o el título de una tabla numerada, o el número de una fórmula/una ecuación, se imprime tanto el valor del contador correspondiente como se coloca un ancla para hipervínculos. Ese ancla necesita un nombre que sea único en todo el documento.
La macro \theHequation
se utiliza para especificar la forma en que los nombres de anclaje relacionados con los números de ecuación se generarán automáticamente cuando el paquete hyperref esté en uso.
La macro \theHequation
debe especificarse de manera que garantice la unicidad de los nombres de anclaje.
Cuando redefina/cambie \theequation
, probablemente también necesite ajustar/redefinir \theHequation
para garantizar la unicidad de los nombres de anclaje.
Por lo tanto sugiero paralelamente colocar
\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}%
}
colocando algo como
\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}%
}%
}
en el preámbulo de su documento.
(Para ambos fragmentos de código @
que se crean \makeatletter..\makeatother
se supone una letra (→).
Al hacer esto, ingreso al archivo .aux una entrada
\newlabel{eq:AmbipEq}{{1.2.1}{1}{Test 1.2}{equation.1.2.1}{}}
lo que significa que hacer referencia a la etiqueta eq:AmbipEq
lleva a "imprimir" el número 1.2.1
mientras se vincula a un ancla cuyo nombre es equation.1.2.1
.
La advertencia pdfTeX correspondiente sobre el destino con el mismo identificador no aparece dentro del archivo .log.
\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}
Por cierto:
Creo que es importante aprender sobre el aparato de lectura de (La)TeX y sobre las circunstancias bajo las cuales (La)TeX producirá tokens de espacio (que generan un espacio horizontal en el archivo de salida) cuando encuentre un carácter de espacio en la entrada. archivo.
Por ejemplo, un carácter de espacio en el archivo de entrada después de un carácter de llave de apertura o después de un carácter de llave de cierre producirá un token de espacio que conduce al espacio horizontal en el archivo de salida (si ese token de espacio se encuentra cuando ( La)TeX no está en uno de sus modos verticales).
Por ejemplo, un salto de línea después de un carácter de llave de apertura o después de un carácter de llave de cierre también generará una ficha de espacio. Esto se debe a que al leer la entrada, (La)TeX inserta un carácter de espacio al final de cada línea; esto tiene que ver con el parámetro de número entero \endlinechar
.
Considere usar el carácter de comentario %
después de abrir los caracteres de llave en los finales de línea y después de cerrar los caracteres de llave en los finales de línea, es decir, {%
o }%
, para evitar espacios horizontales no deseados dentro del archivo de salida/archivo 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}