É possível fazer referência a capítulos e seções de um documento sem rotular manualmente cada seção e subseção?
Tenho cerca de 8 capítulos e dezenas de seções/subseções recuadas dentro deles, rotular cada seção é bastante tedioso.
Existe uma maneira mais rápida e conveniente?
Responder1
Isto pode ser feito, mas pode ser arriscado; no exemplo a seguir, a primeira palavra de cada capítulo ou seção é usada para construir automaticamente o rótulo com cada invocação de \chapter
ou \section
; titlesec
com sua explicit
opção foi usada para pegar o título; usando xstring
, a primeira palavra é extraída:
\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}
Se duas unidades seccionais tiverem a mesma palavra inicial em seus títulos, isso falhará, mas você poderá selecionar uma sequência diferente para construir os rótulos.
Na minha solução inicial presumi que os títulos continham pelo menos um espaço em branco, mas seria possível usar outra string; por exemplo (como emNicolai.rostovresposta) o nome completo da unidade seccional. Neste caso, o pacote xstring não é mais necessário e pode-se simplesmente dizer
\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}
Meus exemplos mostram apenas o mecanismo para capítulos e seções, mas podem ser facilmente estendidos a outras unidades seccionais.
Responder2
Você pode usar otítulo completode capítulos ou seções como rótulos e consultá-los por meio de seus próprios 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}
Responder3
Você pode automatizar o processo de criação de etiquetas. Um script perl muito básico pode fazer isso. O script perl precisa mapear todos os seus .tex
arquivos e executar uma regex de substituição neles, um por um. Aqui está um exemplo de regex que você deve 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;
Esses dois regex simplesmente procurarão cada um \chapter{Chapter Title}
em \section{Section Name}
seu código tex. Se eles tiverem um rótulo definido depois disso, o script irá ignorá-los. Caso contrário, o script adicionará uma instrução de rótulo para eles em uma nova linha que diz \label{chap:Chapter Title}
e \label{sec:Section Name}
. Você pode criar este script Perl e executá-lo sempre que criar novas seções/capítulos.
AVISO LEGAL:Não sou responsável por qualquer perda de dados que você possa encontrar ao executar regex em seus .tex
arquivos. Embora eu tenha testado as regex acima, intencionalmente não incluí o código para um script perl completo, para evitar tal risco. Você ainda pode ver meu código Perl em ação se recortá-lo e colá-lo em um script e executá-lo em um .tex
arquivo. Funcionará e imprimirá os resultados na tela sem modificar seu arquivo. Certifique-se de escrever seu próprio script Perl e testá-lo em .tex
arquivos fictícios. Além disso, certifique-se de sempre fazer uma cópia do seu trabalho antes de executar tais scripts nele.