Insertar números de párrafo predefinidos en el encabezado de la página

Insertar números de párrafo predefinidos en el encabezado de la página

Estoy tratando con textos traducidos que tienen números de "párrafo" que ya están definidos en la fuente, con los cuales debo mantener coherencia. Por lo tanto, no puedo usarlo \theparagraphpara generar los números. Para aumentar la complejidad, muchos párrafos no tienen números; y además, algunos párrafos tienen un rango (1-10, etc.). Estos números predefinidos ya están presentes en mi documento.

Me gustaría presentar estos números en el encabezado de la página en lugar de delante del párrafo, por razones estéticas. Estoy usando fancyhdr. En el encabezado de la página aparecerían en ambas páginas y estarían precedidos por el número de sección (no de capítulo). Entonces, cada encabezado de página incluiría lo siguiente:

A B C

Donde A es el número de sección, B es el número del primer párrafo de la página (que, por supuesto, a menudo será una continuación del último párrafo de la página anterior) y C es el número del último párrafo de la página. .

Esto debería ser bastante complicado, pero además necesitamos manejar rangos. En tales casos, para nuestro número B, seleccionamos el primer dígito del rango; para el número C, seleccionamos el último.

Entonces, si el primer párrafo de la página tuviera el rango 10-14 y el último 16-18, el encabezado de esa página tendría A.10-18.

Espero que quede claro. Avíseme si necesita explicaciones adicionales.

Algunos detalles más. Las secciones comienzan en una página nueva, lo cual hago usando titlesec. (Por alguna razón, el MWE que proporciono a continuación coloca la sección 2 en el encabezado antes de que realmente comience, no lo he verificado).

Las secciones, al igual que los párrafos, tienen números codificados, por lo que podemos usarlos si nos resulta más fácil. Sin embargo, a diferencia de los párrafos, los números de sección son simples y secuenciales, por lo que supongo que probablemente sea más sencillo dejar que LaTeX los cuente, ya que eso es lo que quiere hacer de forma predeterminada. Pero de cualquier manera está bien.

Aquí hay un MWE. No estoy seguro de cuál es la mejor manera de hacer esto, pero cambié el MWE de mi ejemplo original a uno adaptado de la respuesta de Andrew a continuación. Acepté su respuesta como correcta, lo cual en gran medida lo es, pero al usar el código descubrí una serie de errores, que enumero a continuación.

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

Estos son los errores que conozco:

  1. El estilo de página con una nueva sección es sencillo, por lo que no hay encabezado, lo cual es correcto. Sin embargo, en la página siguiente, es decir, la primera página de una sección que tiene un encabezado, el número del primer párrafo es siempre 1, mientras que debería ser el número de párrafo relevante para el primer párrafo de esa página, como ocurre en cualquier otro lugar. De hecho, no puedo hacer que este error aparezca en MWE, pero sí en mi documento completo. La sugerencia de Andrew de reemplazar 1 por 0 en \sectionmarkno solucionó el problema. Actualizaré el MWE si logro que se muestre este error.

  2. En la portada aparece algo de material de encabezado/pie de página, mientras que todos estos deberían estar vacíos en el estilo de página. Aparecen en las páginas que preceden a cualquier título. Vea la segunda página en blanco del MWE.

  3. En algunos casos, el recuento de los números de párrafo es incorrecto. Esto aparece en el MWE en las dos últimas páginas. La penúltima página debería ser 16-19, pero es 16-20; y la última página debe ser 19-20. Esto ocurre con bastante frecuencia en mi documento completo y parece suceder cuando hay un huérfano.

  4. La última página también muestra otro error menor: cuando hay un "rango" de solo un párrafo, debería mostrar solo uno. Por ejemplo, en lugar de "20-20", debería tener sólo "20".

  5. El manejo de rangos de párrafos no es exactamente como se especifica. El tercer párrafo, por ejemplo, tiene un rango de 3 a 5, por lo que el encabezado de la página 4 debe comenzar con elprimeropárrafo de este rango, pero en su lugar tiene 5-20.

  6. El último encabezado de una sección proporciona el número de sección incorrecto. Tiene el número de apartado del siguiente apartado. La página 5 del MWE, por ejemplo, tiene el número 2,20-30, pero está en la primera sección, por lo que debería ser 1,20-30.

Respuesta1

¡Buena pregunta! Aquí hay una forma de hacer esto. He secuestrado el \paragraphcomando para que imprima el argumento que se le proporciona \textbf{#1}y luego establezca contadores de párrafos \firstparay \lastpara, llamando al comando \setparagraphcomo #1-0-|argumento.

La \setparagraphmacro es un poco complicada ya que necesita aceptar argumentos que pueden parecer un solo número, como por ejemplo 6, o un rango de números, como por ejemplo 7-21. Para ello, espera tres argumentos que deben proporcionarse en el formato #1-#2-#3|. Entonces, si 6es el argumento de \paragraph then the arguments for\setparagraph are#1=6 ,#2=0 and#3 is empty. If7-21 is the argument to\paragraph #1=7entonces #2=21y #3=0para \setparagaph.

Después de esto, juego algunos juegos para asegurarme de que \firstparasiempre \lastparaestén configurados con valores apropiados con controles como \ifnum\firstpara=0.... Los rangos de párrafos en los encabezados se imprimen usando \theparagraphy esta macro también se restablece \firstparapara \lastparaque los contadores sean correctos para la página siguiente.

A continuación se muestra un resultado de muestra (con los números de párrafo para que quede claro):

ingrese la descripción de la imagen aquí

y aquí está el código (con los números de párrafo incluidos como referencia):

EDITARCódigo actualizado ligeramente para atender del 1 al 6 en la publicación actualizada.

\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

  1. El problema 2se debió a que el estilo de página vacío no estaba realmente vacío. Más precisamente, no se puso \headrulewidtha cero cero.

  2. No lo uso, fancyhdrasí que esto podría estar mal, pero me parece que es mejor que definas tu propio estilo de página elegante. He definido un paragraphestilo de página arriba. Hice esto porque me gustaba que el fancyestilo de la página no combinara bien con los otros estilos.

  3. El \sectionbreakcomando utilizado por titlesecparece ser la causa de su problema 6. Sospecho que está incrementando el contador de la sección antes de llamar, \sectionbreakpor lo que esto es lo que provocó que el encabezado fuera incorrecto. He solucionado esto evitando \sectionbreaky redefiniendo el comando de sección.

información relacionada