
Estou lidando com textos traduzidos que possuem números de "parágrafos" já definidos na fonte, com os quais devo manter a consistência. Portanto, não posso usar \theparagraph
para gerar os números. Para aumentar a complexidade, muitos parágrafos não possuem números; e além disso, alguns parágrafos possuem um intervalo (1-10, etc.). Esses números predefinidos já estão presentes no meu documento.
Gostaria de apresentar esses números no cabeçalho da página e não antes do parágrafo, por razões estéticas. Estou usando o fantasiahdr. No cabeçalho da página eles apareceriam em ambas as páginas e seriam precedidos pelo número da seção (não do capítulo). Portanto, cada cabeçalho de página incluiria o seguinte:
ABC
Onde A é o número da seção, B é o número do primeiro parágrafo da página – que, é claro, muitas vezes será uma continuação do último parágrafo da página anterior – e C é o número do último parágrafo da página .
Isso deve ser bastante complicado, mas além disso precisamos lidar com intervalos. Nesses casos, para o nosso número B, selecionamos o primeiro dígito do intervalo; para o número C, selecionamos o último.
Portanto, se o primeiro parágrafo da página tivesse o intervalo 10-14 e o último tivesse 16-18, o cabeçalho dessa página teria A.10-18.
Espero que esteja claro. Informe-me se forem necessárias explicações adicionais.
Mais alguns detalhes. As seções começam em uma nova página, o que faço usando o titlesec. (Por alguma razão, o MWE que forneço abaixo coloca a seção 2 no cabeçalho antes de realmente começar, não verifiquei isso.)
As seções, assim como os parágrafos, possuem números codificados, então podemos usá-los se for mais fácil. No entanto, diferentemente dos parágrafos, os números das seções são simples e sequenciais, então imagino que provavelmente seja mais simples deixar o LaTeX contá-los, já que é isso que ele quer fazer por padrão. Mas de qualquer forma está tudo bem.
Aqui está um MWE. Não tenho certeza da melhor maneira de fazer isso, mas mudei o MWE do meu exemplo original para um adaptado da resposta de Andrew abaixo. Aceitei sua resposta como correta, o que em grande parte é, mas ao usar o código descobri vários bugs, que listo abaixo.
\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}
Aqui estão os bugs que conheço:
O estilo de página com uma nova seção é simples, portanto não há cabeçalho, o que é correto. No entanto, na página seguinte, ou seja, na primeira página de uma secção que tem um cabeçalho, o número do primeiro parágrafo é sempre 1, embora deva ser o número do parágrafo relevante para o primeiro parágrafo dessa página, como acontece em qualquer outro lugar. Na verdade, não consigo fazer com que esse bug apareça no MWE, mas aparece no meu documento completo. A sugestão de Andrew de substituir 1 por 0
\sectionmark
não resolveu o problema. Atualizarei o MWE se conseguir que esse bug apareça.No frontmatter aparece algum material de cabeçalho/rodapé, enquanto todos devem estar vazios no estilo da página. Eles aparecem nas páginas que precedem qualquer título. Veja a segunda página em branco do MWE.
Em alguns casos a contagem dos números dos parágrafos está incorreta. Isso aparece no MWE nas duas últimas páginas. A penúltima página deveria ser 16-19, mas é 16-20; e a última página deve ser 19-20. Isso ocorre com bastante frequência em meu documento completo e parece acontecer quando há um órfão.
A última página também mostra outro pequeno bug: quando há um “intervalo” de apenas um parágrafo, deveria mostrar apenas um. Por exemplo, em vez de "20-20", deveria ter apenas "20".
O tratamento dos intervalos de parágrafos não é exatamente como especificado. O terceiro parágrafo, por exemplo, tem um intervalo de 3 a 5, portanto o cabeçalho da página 4 deve começar com oprimeiroparágrafo deste intervalo, mas em vez disso tem 5-20.
O último cabeçalho de uma seção fornece o número da seção incorreto. Possui o número da seção da seção seguinte. A página 5 do MWE, por exemplo, tem o número 2,20-30, mas está na primeira seção, então deveria ser 1,20-30.
Responder1
Boa pergunta! Aqui está uma maneira de fazer isso. Eu sequestrei o \paragraph
comando para que ele imprima o argumento fornecido \textbf{#1}
e, em seguida, defina contadores de parágrafo \firstpara
e \lastpara
, chamando o comando \setparagraph
com #1-0-|
como argumento.
A \setparagraph
macro é um pouco complicada, pois precisa aceitar argumentos que podem se parecer com um único número, como 6
, ou um intervalo de números, como 7-21
. Ele faz isso esperando três argumentos que precisam ser fornecidos no formato #1-#2-#3|
. Portanto , if 6
é o argumento para \paragraph then the arguments for
\setparagraph are
#1=6 ,
#2=0 and
#3 is empty. If
7-21 is the argument to
\paragraph then e for .#1=7
#2=21
#3=0
\setparagaph
Depois disso, jogo alguns jogos para ter certeza de que \firstpara
estão \lastpara
sempre definidos com valores apropriados com verificações como \ifnum\firstpara=0...
. Os intervalos de parágrafos nos títulos são impressos usando \theparagraph
esta macro também zera \firstpara
e \lastpara
para que os contadores fiquem corretos para a próxima página.
Aqui está um exemplo de saída (com os números dos parágrafos para deixar claro):
e aqui está o código (com os números dos parágrafos incluídos para referência):
EDITARCódigo ligeiramente atualizado para atender 1 a 6 na postagem atualizada.
\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}
Notas
O problema
2
ocorreu porque o pagetysle vazio não estava realmente vazio. Mais precisamente, não foi definido\headrulewidth
como zero.Eu não uso,
fancyhdr
então isso pode estar errado, mas me parece que é melhor você definir seu próprio estilo de página sofisticado. Eu defini umparagraph
estilo de página acima. Fiz isso porque achei que ofancy
estilo da página não combinava bem com os outros estilos.O
\sectionbreak
comando usado portitlesec
parece ser a causa do seu problema6
. Suspeito que ele esteja incrementando o contador de seção antes de chamar,\sectionbreak
então foi isso que causou o erro do cabeçalho. Eu contornei isso evitando\sectionbreak
e redefinindo o comando da seção.