Можно ли ссылаться на главы и разделы документа, не маркируя вручную каждый раздел и подраздел?
У меня около 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
файлах. Кроме того, обязательно всегда делайте копию своей работы перед запуском таких скриптов в нем.