
私が扱っている翻訳テキストには、ソースで既に定義されている「段落」番号があり、その一貫性を保つ必要があります。したがって、 を使用して\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 ですが、他のすべてのページと同様に、そのページの最初の段落に関連する段落番号である必要があります。実際、このバグは MWE では表示されませんが、完全なドキュメントでは表示されます。Andrew の提案に従って 1 を 0 に置き換えても
\sectionmark
問題は解決しませんでした。このバグを表示できるようになったら、MWE を更新します。フロントマターにヘッダー/フッター マテリアルが表示されますが、これらはすべてページスタイルが空である必要があります。これらは、見出しの前のページに表示されます。MWE の 2 番目の空白ページを参照してください。
場合によっては、段落番号のカウントが間違っています。これは、MWE の最後の 2 ページに表示されます。最後から 2 番目のページは 16-19 であるはずですが、16-20 になっています。また、最後のページは 19-20 であるはずです。これは、私の完全なドキュメントでかなり頻繁に発生し、孤立した段落がある場合に発生するようです。
最後のページには、別の小さなバグもあります。1 つの段落のみの「範囲」がある場合、1 つだけが表示される必要があります。たとえば、「20-20」ではなく、「20」だけが表示される必要があります。
段落範囲の扱いは、指定されたとおりではありません。たとえば、3番目の段落の範囲は3~5なので、ページ4のヘッダーは初めこの範囲の段落ではなく、5〜20 です。
セクションの最後のヘッダーに間違ったセクション番号が記載されています。次のセクションのセクション番号が記載されています。たとえば、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 for
are
,
and
is empty. If
is 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}
ノート
問題は
2
、空のページタイルが実際には空ではなかったために発生しました。より正確に言うと、\headrulewidth
ゼロに設定されていませんでした。私は使用していない
fancyhdr
ので、これは間違っているかもしれませんが、独自のページ スタイルを定義したほうがよいと思われます。私は上記でページ スタイルを定義しました。ページ スタイルが他のスタイルとうまく連携していないことがparagraph
わかったため、これを行いました。fancy
\sectionbreak
で使用されているコマンドが問題titlesec
の原因のようです。 を呼び出す前にセクション カウンターを増分しているため、ヘッダーが間違っているのではないか6
と思います。 この問題を回避するために、セクション コマンドを再定義しました。\sectionbreak
\sectionbreak