ページヘッダーに定義済みの段落番号を挿入する

ページヘッダーに定義済みの段落番号を挿入する

私が扱っている翻訳テキストには、ソースで既に定義されている「段落」番号があり、その一貫性を保つ必要があります。したがって、 を使用して\theparagraph番号を生成することはできません。複雑さを増すのは、多くの段落に番号がなく、さらに、一部の段落には範囲 (1 ~ 10 など) があることです。これらの定義済み番号は、すでにドキュメントに存在しています。

見た目の理由から、これらの番号を段落の前ではなくページ ヘッダーに表示したいと思います。fancyhdr を使用しています。ページ ヘッダーでは、番号は両方のページに表示され、その前にセクション番号 (章番号ではありません) が付きます。したがって、各ページ ヘッダーには次の内容が含まれます。

AB-C

ここで、A はセクション番号、B はページの最初の段落の番号 (もちろん、前のページの最後の段落の続きになることが多い)、C はページの最後の段落の番号です。

これだけでも十分複雑ですが、さらに範囲を処理する必要があります。このような場合、B 番号の場合は範囲​​の最初の数字を選択し、C 番号の場合は最後の数字を選択します。

したがって、ページの最初の段落の範囲が 10 ~ 14 で、最後の段落の範囲が 16 ~ 18 の場合、そのページのヘッダーには A.10 ~ 18 と表示されます。

それが明確であることを願います。追加の説明が必要な場合はお知らせください。

さらに詳細をいくつか。セクションは新しいページから始まり、私は titlesec を使ってそれを行います。(何らかの理由で、以下に示す MWE では、セクション 2 が実際に始まる前にヘッダーに配置されますが、これについては確認していません。)

段落と同様に、セクションにもハードコードされた番号が付いているので、簡単になるならこれを使用できます。ただし、段落とは異なり、セクション番号は単純で連続しているため、LaTeX がデフォルトで実行しようとしているように、LaTeX にカウントさせる方が簡単だと思います。ただし、どちらの方法でも問題ありません。

これが MWE です。これを行う最善の方法はわかりませんが、MWE を元の例から、以下の Andrew の回答から適応したものに変更しました。彼の回答は正しいと受け入れましたが、大部分は正しいのですが、コードを使用したところ、いくつかのバグを発見しました。以下にリストします。

\documentclass{book}
\usepackage{lipsum}
\setlipsumdefault{1}
\usepackage{titlesec}

% fancy headings as defined by the OP except we need to be more careful
% with plain headings
\usepackage{fancyhdr}
\fancypagestyle{plain}{% need to reset \firstpara on pages without headers
  \fancyhf{} % clear all header and footer fields
  \renewcommand{\headrulewidth}{0pt}
  \fancyfoot[C]{\bfseries \thepage}
  \xdef\firstpara{\lastpara}
}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[LE,RO]{\thepage}
\fancyhead[CO]{\rightmark}
\renewcommand{\sectionmark}[1]{%
   \markright{#1}%
   \def\firstpara{1}\def\lastpara{1}% reset counters each section
}
\fancyhead[CE]{\leftmark}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\fancyhead[LO,RE]{\thesection.\theparagraph}

\newcommand{\sectionbreak}{\clearpage\thispagestyle{plain}}
\renewcommand\thesection{\arabic{section}}

% now the macros for tracking the paragraph numbers
\def\firstpara{1}%    set to 1 by default
\def\lastpara{1}% set to 1 by default
\def\setparagraph#1-#2-#3|{%
   % if \firstpara=0 => new page => set \firstpara
   \ifnum\firstpara=0\def\firstpara{#1}\fi%
   % if #2=0 => only #1 is meaningful to set \lastpara to this
   % otherwise use #2
   \ifnum#2=0\def\lastpara{#1}\else\def\lastpara{#2}\fi%
}
\def\paragraph#1{%\textbf{#1}\space
  \setparagraph#1-0-|%
}
\def\theparagraph{%
  % if \firstpara=\lastpara print only \firstpara otherwise print a range
  \ifnum\firstpara=\lastpara\firstpara\else\firstpara--\lastpara\fi
  % reset firstpara and lastpara
  \xdef\firstpara{\lastpara}%
  %\let\lastpara\relax%
}

% back to the MWe
\begin{document}

\null
\pagestyle{empty}

\newpage

\newpage

\pagestyle{fancy}

\chapter{A Chapter}

\section{First Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Second Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Third Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3}\lipsum

\paragraph{4}\lipsum

\paragraph{5}\lipsum

\paragraph{6}\lipsum

\paragraph{7}\lipsum

\paragraph{8}\lipsum

\paragraph{9}\lipsum

\paragraph{10}\lipsum

\paragraph{11}\lipsum

\paragraph{12}\lipsum

\paragraph{13}\lipsum

\paragraph{14}\lipsum

\paragraph{15}\lipsum

\paragraph{16}\lipsum

\paragraph{17}\lipsum

\paragraph{18}\lipsum

\paragraph{19}\lipsum

\paragraph{20}\lipsum

\end{document}

私が認識しているバグは次のとおりです:

  1. 新しいセクションのページスタイルはプレーンなので、ヘッダーはありません。これは正しいことです。ただし、次のページ、つまりヘッダーのあるセクションの最初のページでは、最初の段落番号は常に 1 ですが、他のすべてのページと同様に、そのページの最初の段落に関連する段落番号である必要があります。実際、このバグは MWE では表示されませんが、完全なドキュメントでは表示されます。Andrew の提案に従って 1 を 0 に置き換えても\sectionmark問題は解決しませんでした。このバグを表示できるようになったら、MWE を更新します。

  2. フロントマターにヘッダー/フッター マテリアルが表示されますが、これらはすべてページスタイルが空である必要があります。これらは、見出しの前のページに表示されます。MWE の 2 番目の空白ページを参照してください。

  3. 場合によっては、段落番号のカウントが間違っています。これは、MWE の最後の 2 ページに表示されます。最後から 2 番目のページは 16-19 であるはずですが、16-20 になっています。また、最後のページは 19-20 であるはずです。これは、私の完全なドキュメントでかなり頻繁に発生し、孤立した段落がある場合に発生するようです。

  4. 最後のページには、別の小さなバグもあります。1 つの段落のみの「範囲」がある場合、1 つだけが表示される必要があります。たとえば、「20-20」ではなく、「20」だけが表示される必要があります。

  5. 段落範囲の扱いは、指定されたとおりではありません。たとえば、3番目の段落の範囲は3~5なので、ページ4のヘッダーは初めこの範囲の段落ではなく、5〜20 です。

  6. セクションの最後のヘッダーに間違ったセクション番号が記載されています。次のセクションのセクション番号が記載されています。たとえば、MWE の 5 ページには 2.20-30 という番号が記載されていますが、これは最初のセクションにあるため、1.20-30 のはずです。

答え1

いい質問ですね。これを行う 1 つの方法を以下に示します。コマンドをハイジャックして\paragraph、 で指定された引数を出力し、を引数としてコマンドを呼び出すことで\textbf{#1}段落カウンタと を設定します。\firstpara\lastpara\setparagraph#1-0-|

この\setparagraphマクロは、 などの単一の数値、6または などの数値の範囲の引数を受け入れる必要があるため、少し扱いに​​くいです7-21。 これは、 の形式で指定する必要がある 3 つの引数を想定することによって行われます。 したがって、 が\setparagraph #1=6 #2=0 #3 7-21 \paragraphへの引数である#1-#2-#3|場合、に対して となり、に対して となります。6\paragraph then the arguments forare,andis empty. Ifis the argument to#1=7#2=21#3=0\setparagaph

\firstparaこの後、 などのチェックを使用して、 と が\lastpara常に適切な値に設定されていることを確認するために、いくつかのゲームをプレイします\ifnum\firstpara=0...。見出し内の段落範囲は を使用して印刷され\theparagraph、このマクロは と もリセットするため\firstpara\lastpara次のページでカウンターが正しくなります。

以下にサンプル出力を示します (わかりやすくするために段落番号を付けています)。

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

ここにコードがあります(参照用に段落番号が含まれています)。

編集更新された投稿の 1 ~ 6 に対応するためにコードを若干更新しました。

\documentclass{book}
\usepackage{lipsum}
\setlipsumdefault{1}
\usepackage{titlesec}
%\usepackage[hmargin=63mm,vmargin=68mm]{geometry}

% fancy headings as defined by the OP except we need to be more careful
% with plain headings
\usepackage{fancyhdr}
\fancypagestyle{empty}{
  \fancyhf{}
  \renewcommand{\headrulewidth}{0pt}
}
\fancypagestyle{plain}{
  \fancyhf{}% clear all header and footer fields
  \renewcommand{\headrulewidth}{0pt}
  \renewcommand{\footrulewidth}{0pt}
  \fancyfoot[C]{\bfseries \thepage}%
  % need to reset \firstpara on pages without headers
  \xdef\firstpara{\midpara}%
}
\fancypagestyle{paragraphs}{
  \fancyhead[LE,RO]{\thepage}
  \fancyhead[CO]{\rightmark}
  \fancyhead[CE]{\leftmark}
  \fancyhead[LO,RE]{\ifnum\firstpara>0\relax\thesection.\theparagraph\fi}
}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\renewcommand{\sectionmark}[1]{%
   \markright{#1}%
   % reset paragraph counters in each section
   \def\firstpara{0}\def\midpara{0}\def\lastpara{0}
}
%\newcommand{\sectionbreak}{\newpage\thispagestyle{plain}}
\let\realSection\section
\renewcommand\section[2][\relax]{\clearpage%
  \thispagestyle{plain}%
  \ifx#1\relax\relax\realSection{#2}%
  \else\realSection[#1]{#2}%
  \fi
}
\renewcommand\thesection{\arabic{section}}

% now the macros for tracking the paragraph numbers
\def\firstpara{0}%    set to 1 by default
\def\midpara{0}%    set to 1 by default
\def\lastpara{0}% set to 1 by default
\def\setparagraph#1-#2-#3|{\def\midpara{#1}%
   % if \firstpara=0 => new page => set \firstpara
   \ifnum\firstpara=0\relax\def\firstpara{#1}\fi%
   % if #2=0 => only #1 is meaningful to set \lastpara to this
   % otherwise use #2
   \ifnum#2=0\relax\def\lastpara{#1}%
   \else\def\lastpara{#2}%
   \fi%
}
\def\paragraph#1{\textbf{#1}\space
  \setparagraph#1-0-|%
}
\def\theparagraph{%
  % if \firstpara=\lastpara print only \firstpara otherwise print a range
  \ifnum\firstpara=\lastpara\relax\firstpara\else\firstpara--\lastpara\fi
  % reset firstpara and lastpara
  \xdef\firstpara{\midpara}%
  %\let\lastpara\relax%
}

% back to the MWe
\begin{document}

\null
\pagestyle{empty}

\newpage

\newpage

\pagestyle{paragraphs}

\chapter{A Chapter}

\section{First Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Second Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3-5}\lipsum

\paragraph{6}\lipsum

\paragraph{7-17}\lipsum

\paragraph{18}\lipsum

\paragraph{19-20}\lipsum

\paragraph{21-28}\lipsum

\paragraph{29}\lipsum

\paragraph{30}\lipsum

\section{Third Section}

\paragraph{1}\lipsum

\paragraph{2}\lipsum

\paragraph{3}\lipsum

\paragraph{4}\lipsum

\paragraph{5}\lipsum

\paragraph{6}\lipsum

\paragraph{7}\lipsum

\paragraph{8}\lipsum

\paragraph{9}\lipsum

\paragraph{10}\lipsum

\paragraph{11}\lipsum

\paragraph{12}\lipsum

\paragraph{13}\lipsum

\paragraph{14}\lipsum

\paragraph{15}\lipsum

\paragraph{16}\lipsum

\paragraph{17}\lipsum

\paragraph{18}\lipsum

\paragraph{19}\lipsum

\paragraph{20}\lipsum

\end{document}

ノート

  1. 問題は2、空のページタイルが実際には空ではなかったために発生しました。より正確に言うと、\headrulewidthゼロに設定されていませんでした。

  2. 私は使用していないfancyhdrので、これは間違っているかもしれませんが、独自のページ スタイルを定義したほうがよいと思われます。私は上記でページ スタイルを定義しました。ページ スタイルが他のスタイルとうまく連携していないことがparagraphわかったため、これを行いました。fancy

  3. \sectionbreakで使用されているコマンドが問題titlesecの原因のようです。 を呼び出す前にセクション カウンターを増分しているため、ヘッダーが間違っているのではないか6と思います。 この問題を回避するために、セクション コマンドを再定義しました。\sectionbreak\sectionbreak

関連情報