¿Es posible hacer referencia a capítulos y secciones de un documento sin etiquetar manualmente cada sección y subsección?
Tengo alrededor de 8 capítulos y docenas de secciones/subsecciones sangradas dentro de ellos, etiquetar cada sección es bastante tedioso.
¿Existe una forma más rápida y cómoda?
Respuesta1
Esto se puede hacer, pero podría ser arriesgado; en el siguiente ejemplo, se toma la primera palabra de cada capítulo o sección para construir automáticamente la etiqueta con cada invocación de \chapter
o \section
; titlesec
con su explicit
opción se utilizó para hacerse con el título; usando xstring
, se extrae la primera palabra:
\documentclass[10pt]{book}
\usepackage[explicit]{titlesec}
\usepackage{xstring}
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge\StrBefore{#1}{ }[\mlabel]#1\label{\mlabel}}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{\StrBefore{#1}{ }[\mlabel]#1\label{\mlabel}}
\begin{document}
Some references to chapters: \ref{Some} and \ref{Other} and some references to sections: \ref{A} and \ref{Another}
\chapter{Some Chapter}
\section{A Test Section}
\chapter{Other Chapter}
\section{Another Test Section}
\end{document}
Si dos unidades seccionales tienen la misma palabra inicial en sus títulos, esto fallará, pero luego podrá seleccionar una cadena diferente para crear las etiquetas.
En mi solución inicial supuse que los títulos contienen al menos un espacio en blanco, pero se podría usar otra cadena; por ejemplo (como ennicolai.rostovRespuesta de) el nombre completo de la unidad seccional. En este caso, el paquete xstring ya no es necesario y se podría decir simplemente
\documentclass[10pt]{book}
\usepackage[explicit]{titlesec}
\titleformat{\chapter}[display]
{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge#1\label{#1}}
\titleformat{\section}
{\normalfont\Large\bfseries}{\thesection}{1em}{#1\label{#1}}
\begin{document}
Some references to chapters: \ref{Some Chapter} and \ref{Other Chapter} and some references to sections: \ref{A Test Section} and \ref{Another Test Section}
\chapter{Some Chapter}
\section{A Test Section}
\chapter{Other Chapter}
\section{Another Test Section}
\end{document}
Mis ejemplos sólo muestran el mecanismo para capítulos y secciones, pero se puede extender fácilmente a otras unidades seccionales.
Respuesta2
Puedes usar eltítulo completode capítulos o secciones como etiquetas, y hacer referencia a ellos mediante sus propios títulos.
\documentclass{book}
\let\origchapter=\chapter
\let\origsection=\section
\renewcommand\chapter[1]{\origchapter{#1}\label{#1}}
\renewcommand\section[1]{\origsection{#1}\label{#1}}
\begin{document}
\chapter{My first chapter}
\section{My first section}
I said in section~\ref{My first section} at the
beginning of chapter~\ref{My first chapter} that
\end{document}
Respuesta3
Puede automatizar el proceso de creación de etiquetas. Un script en Perl muy básico puede hacerlo. El script Perl tiene que agrupar todos sus .tex
archivos y ejecutar una expresión regular de sustitución en ellos, uno por uno. Aquí hay un ejemplo de la expresión regular que debes usar:
my $input_str = do{ local $/; <> };
$input_str =~ s/(\\section{(.*?)}(?!\s*\\label))/$1\n\\label{sec:$2}/mg;
$input_str =~ s/(\\chapter{(.*?)}(?!\s*\\label))/$1\n\\label{chap:$2}/mg;
print $input_str;
Estas dos expresiones regulares simplemente buscarán cada una \chapter{Chapter Title}
y \section{Section Name}
en su código tex. Si tienen una etiqueta definida después de eso, el script los ignorará. De lo contrario, el script agregará una declaración de etiqueta para ellos en una nueva línea que dice \label{chap:Chapter Title}
y \label{sec:Section Name}
. Puede crear este script en Perl y ejecutarlo cada vez que cree nuevas secciones/capítulos.
DESCARGO DE RESPONSABILIDAD:No soy responsable de ninguna pérdida de datos que pueda encontrar al ejecutar expresiones regulares en sus .tex
archivos. Aunque probé las expresiones regulares anteriores, intencionalmente no incluí el código de un script Perl completo para evitar dicho riesgo. Aún puedes ver mi código Perl en acción si lo cortas y lo pegas en un script y lo ejecutas en un .tex
archivo. Funcionará e imprimirá los resultados en la pantalla sin modificar su archivo. Asegúrese de escribir su propio script Perl y probarlo en .tex
archivos ficticios. Además, asegúrese de tomar siempre una copia de su trabajo antes de ejecutar dichos scripts en él.