ラベルを付けずにセクションまたは章を参照しますか?

ラベルを付けずにセクションまたは章を参照しますか?

すべてのセクションとサブセクションに手動でラベルを付けずに、ドキュメントの章とセクションを参照することは可能ですか?

約 8 つの章があり、その中に数十のセクション/サブセクションがインデントされているので、各セクションにラベルを付けるのは非常に面倒です。

もっと速くて便利な方法はありますか?

答え1

これは実行可能ですが、リスクを伴う可能性があります。次の例では、 または が呼び出されるたびに、各章またはセクションの最初の単語が取得され、ラベルが自動的に構築されます。 のオプション\chapterを使用してタイトルが取得され、 を使用すると、最初の単語が抽出されます。\sectiontitlesecexplicitxstring

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

ここに画像の説明を入力してください

2 つのセクション単位のタイトルの最初の単語が同じである場合、これは失敗しますが、別の文字列を選択してラベルを作成できます。

私の最初の解決策では、タイトルに少なくとも1つの空白が含まれていると想定していましたが、別の文字列を使用することもできます。たとえば、ニコライ・ロストフの答え)セクション単位の全体の名前。この場合、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ファイルをグローブし、それらに対して 1 つずつ置換正規表現を実行する必要があります。使用する正規表現の例を次に示します。

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;

これら 2 つの正規表現は、Tex コード内でそれぞれ と を検索するだけです\chapter{Chapter Title}\section{Section Name}その後にラベルが定義されている場合、スクリプトはそれらを無視します。そうでない場合、スクリプトはそれらのラベル ステートメントを新しい行に追加し、 と を読み込みます\label{chap:Chapter Title}\label{sec:Section Name}この Perl スクリプトを作成して、新しいセクション/章を作成するたびに実行できます。

免責事項:ファイルに対して正規表現を実行したときに発生する可能性のあるデータ損失については、私は責任を負いません.tex。上記の正規表現をテストしましたが、そのようなリスクを回避するために、完全な Perl スクリプトのコードは意図的に含めませんでした。スクリプトに切り取って貼り付け、ファイルで実行すると、私の Perl コードの動作を確認できます.tex。ファイルを変更しなくても、結果は画面に出力されます。必ず独自の Perl スクリプトを作成し、ダミー.texファイルでテストしてください。また、そのようなスクリプトを実行する前に、必ず作業のコピーを作成してください。

関連情報