¿Secciones de referencia o capítulos sin etiquetar?

¿Secciones de referencia o capítulos sin etiquetar?

¿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 \chaptero \section; titleseccon su explicitopció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}

ingrese la descripción de la imagen aquí

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 .texarchivos 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 .texarchivos. 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 .texarchivo. Funcionará e imprimirá los resultados en la pantalla sin modificar su archivo. Asegúrese de escribir su propio script Perl y probarlo en .texarchivos ficticios. Además, asegúrese de tomar siempre una copia de su trabajo antes de ejecutar dichos scripts en él.

información relacionada