Seções de referência ou capítulos sem rotulagem?

Seções de referência ou capítulos sem rotulagem?

É 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 \chapterou \section; titleseccom sua explicitopçã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}

insira a descrição da imagem aqui

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 .texarquivos 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 .texarquivos. 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 .texarquivo. Funcionará e imprimirá os resultados na tela sem modificar seu arquivo. Certifique-se de escrever seu próprio script Perl e testá-lo em .texarquivos fictícios. Além disso, certifique-se de sempre fazer uma cópia do seu trabalho antes de executar tais scripts nele.

informação relacionada