Ссылочные разделы или главы без маркировки?

Ссылочные разделы или главы без маркировки?

Можно ли ссылаться на главы и разделы документа, не маркируя вручную каждый раздел и подраздел?

У меня около 8 глав и десятки разделов/подразделов внутри них, так что маркировать каждый отдельный раздел довольно утомительно.

Есть ли более быстрый и удобный способ?

решение1

Это можно сделать, но это может быть рискованно; в следующем примере первое слово каждой главы или раздела берется для автоматического создания метки при каждом вызове \chapterили \section; titlesecс его explicitопцией использовался для захвата заголовка; с помощью xstringизвлекается первое слово:

\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}

введите описание изображения здесь

Если в названиях двух секционных единиц содержится одно и то же начальное слово, это не сработает, но вы можете выбрать другую строку для создания меток.

В моем первоначальном решении я предполагал, что заголовки содержат по крайней мере один пробел, но можно было бы использовать и другую строку, например (как вниколай.ростов's answer) полное имя секционного блока. В этом случае пакет xstring больше не нужен и можно просто сказать

\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}

Мои примеры показывают механизм только для глав и разделов, но его можно легко распространить и на другие разделы.

решение2

Вы можете использоватьполное названиеглав или разделов в качестве меток и ссылаться на них с помощью их собственных заголовков.

\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}

решение3

Вы можете автоматизировать процесс создания меток. Это может сделать очень простой скрипт perl. Скрипт perl должен глобусить все ваши .texфайлы и запустить подстановочное регулярное выражение для них, один за другим. Вот пример регулярного выражения, которое вам следует использовать:

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;

Эти два регулярных выражения будут просто искать каждое \chapter{Chapter Title}и \section{Section Name}в вашем tex-коде. Если после этого у них определена метка, скрипт их проигнорирует. Если нет, скрипт добавит для них оператор метки на новой строке, которая читается \label{chap:Chapter Title}как и \label{sec:Section Name}. Вы можете создать этот perl-скрипт и запускать его всякий раз, когда создаете новые разделы/главы.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:Я не несу ответственности за любую потерю данных, с которой вы можете столкнуться при запуске регулярных выражений в ваших .texфайлах. Хотя я и тестировал приведенные выше регулярные выражения, я намеренно не включил код для полного скрипта perl, чтобы избежать такого риска. Вы все равно можете увидеть мой код perl в действии, если скопируете и вставите его в скрипт, запустите его в файле .tex. Он будет работать и выводить результаты на экран без изменения вашего файла. Обязательно напишите свой собственный скрипт Perl и протестируйте его на фиктивных .texфайлах. Кроме того, обязательно всегда делайте копию своей работы перед запуском таких скриптов в нем.

Связанный контент