O objetivo

O objetivo

O objetivo

Meu objetivo é ter contadores contínuos de páginas (e possivelmente de seções) para vários documentos independentes. O objetivo é uma dissertação cumulativa onde cada artigo deve manter o máximo possível o layout da revista, mas a escola exige paginação contínua. Provavelmente vai ficar feio, como vários papéis colados, mas é essencialmente isso.

Estou ciente de que a maneira limpa de proceder provavelmente seria extrair as informações de formatação dos .clsarquivos dos diários e empacotá-las em ambientes, mas isso provavelmente daria muito trabalho para alguém tão analfabeto TeXquanto eu. Portanto, tentei, com algum sucesso, uma abordagem alternativa: um hack usando o xrpacote. Mas existem alguns problemas residuais.

Deixe-me primeiro explicar o que tenho feito:

Minha configuração

Tenho um arquivo principal que inclui a introdução e as conclusões. Seu contador de páginas e contador de seções devem começar em 1, então tenho que atualizá-los com os valores inseridos no último capítulo do corpo apenas no ponto de ruptura. Tenho tido problemas ao tentar usar \setcounter{page}{\pageref{external-endfile}}o documento que parece ter a ver com a representação da \pagerefsaída de 'como uma string em vez de um número inteiro, e parece ser acionado pelo babelpacote, então coloco os números em um \newcounterque eu em seguida, leia os contadores reais quando necessário. Esta é a aparência deste arquivo principal:

\documentclass{article}
\usepackage{xr} %imports labels from external document
  \externaldocument[finalCh]{file1} %prefix external labels to avoid name clashes
  \newcounter{finalcount}
  \setcounter{finalcount}{\pageref{finalChendfile}}% probably not the most elegant way to pack the input file's page number into a numberical variable, but it works.
  \stepcounter{finalcount}% +1 since counters are initialised at 0

  \newcounter{othersectioncount}
  \setcounter{othersectioncount}{\ref{finalChendfile}}
\usepackage{ifthen} %conditionals
\newcommand{\exportcounters}{
    \ifthenelse{%
              \isodd{\thepage}} % if current page is odd-numbered
              {\newpage \ % new page, forced space to make sure the following command is actually parsed, i.e. the page not treated as totally empty
              }%
              {\relax}
    \label{endfile}
    \newpage
}

%... other packages
\usepackage[english]{babel} %for some reason I don't understand, this clashes with treating \pageref as a number, so you have to put it *after* determining the page number
\usepackage{lipsum}

\begin{document}

\tableofcontents
\section{Introduction}
\subsection{Subsection}
\lipsum[1-2]
\newpage
    \subsection{Another subsection}
\exportcounters

\setcounter{section}{\theothersectioncount}
\section{Conclusions}
\setcounter{page}{\thefinalcount} %load the final pagenumber of the last chapter here

\lipsum[4-40]


\end{document}

Além disso, tenho um arquivo para o capítulo, que fica assim:

\documentclass{article}
\usepackage{substr}
\usepackage{xr} %imports labels from external document
\usepackage{ifthen} %conditionals
  \externaldocument[intro]{introandextro} %prefix external labels to avoid name clashes
  \addtocounter{page}{\pageref{introendfile}}
\newcommand{\exportcounters}{
    \ifthenelse{%
              \isodd{\thepage}} % if current page is odd-numbered
              {\newpage \ % new page, forced space to make sure the following command is actually parsed, i.e. the page not treated as totally empty
              }%
              {\relax}
    \label{endfile}
    \newpage
}

\usepackage{lipsum}

%\setcounter{section}{2}
\begin{document}

\setcounter{section}{\ref{introendfile}}
\section{Chapter I}
\subsection{intro}
\lipsum[1-4]
\newpage
\subsection{Chapter 1 body}
\lipsum[5-44]

\exportcounters
\label{endfile}


\end{document}

Com esta configuração, eu só preciso executar duas vezes cada "pdflatex introandextro", "pdflatex file1" e novamente "pdflatex introandextro" para obter uma numeração contínua de páginas e seções. (Eu tenho um script de shell para fazer isso para mim.) Eu também tenho um script Python para extrair todas tocas informações relevantes dos diferentes auxarquivos e compilar o arquivo principal com isso, toca fim de obter um índice referenciando todas as seções não importa em qual arquivo eles apareçam, o que funciona principalmente como deveria.

Como deveria, \addtocounter{page}{\pageref{introendfile}}importa o contador de páginas no final da introdução para o arquivo1. Também como deveria, \setcounter{section}{\ref{introendfile}}come a parte da seção do valor de retorno das referências externas (1,2 neste caso) e a utiliza apropriadamente para definir o contador da seção. Infelizmente, ele não sabe o que fazer com o resto da expressão, então ele a cospe novamente, escrevendo ".2" no topo da página. Isso é feio, então estou tentando me livrar disso. Meu palpite é que o melhor método para isso seria redefinir temporariamente \labeldentro \exportcounterspara que ele envie apenas o comando de corte superior para .auxand .toc, mas meu texto simples não é bom o suficiente para saber por onde começar.

Problemas residuais

Então, minha pergunta: alguém pode me dar dicas de como redefinir o \label-command apropriadamente? Em outras palavras, como faço para informar o .aux-file \newlabel{endfile}{{<thesection>}{12}}em vez de \newlabel{endfile}{{<\thesection>.<\thesubsection>}{12}}estar incorporado em uma subseção ou mais profundamente? (Como alternativa, como faço para retirar a parte de '.' antes de inseri-la em \setcounter{section}{...}? Eu tentei \SubStringBefore, mas isso produz uma string em vez de um número, gerando um erro "Número ausente, tratado como zero" durante a compilação.)

Um segundo problema que estou tendo é a necessidade de inserir um explícito \newpageonde quero que a primeira página termine em ambos os documentos, caso contrário, o texto seria executado em duas páginas. Este comportamento parece ser desencadeado por xr(ou pela conjunção de xre lipsum). Este é um problema conhecido e há alguma solução alternativa que não envolva \newpages explícitos?

Outro problema (realmente muito menor) é que o pdflatex reclama do uso de \refno preâmbulo ("Missing \begin{document}"), mas estou bem em simplesmente ignorar isso se o resultado parecer correto.

Ou talvez seja possível abordar este problema de um ângulo bem diferente? Existe uma ferramenta para ajudar as pessoas que não entendem muito de TeX simples a empacotar .clscomandos de formatação em um ambiente? Algo como \importasenvironment{<environmentname>}{<classname>.cls}?

Responder1

A importação do valor da página e da seção de um documento anterior pode ser realizada por pacote zref, módulo lastpagee xr.

Primeiro documento

O primeiro documento DocumentAsalva as propriedades pagevaluee sectionvaluena lista de propriedades LastPageque é escrita pelo rótulo LastPage, definida pelo pacote zref-lastpage.

Arquivo de exemplo DocumentA.tex, o primeiro documento:

\documentclass{article}

\usepackage{zref-lastpage}
\makeatletter
\zref@ifpropundefined{pagevalue}{% it is defined by some modules of zref
  \zref@newprop*{pagevalue}[0]{\number\value{page}}%
}{}
\zref@newprop{sectionvalue}[0]{\number\value{section}}%
\zref@addprops{LastPage}{pagevalue,sectionvalue}
\makeatother

\begin{document}
\section{Section A of first document}
\section{Section B of first document}
\newpage
\section{Section C of first document}
\section{Section D of first document}
\end{document}

O pacote zref-lastpagefaz o trabalho:

  • Chegando aorealfinal do documento (via package atveryend).
  • Escrevendo no .auxarquivo via \immediate\write. \labelusa \writepara obter o número da página correto, mas isso requer a saída de uma próxima página. Após a última página, essa página não existe. Além disso, o pacote cuida da correção do número da página.

O .auxarquivo contém:

\zref@newlabel{LastPage}{\default{4}\page{2}\abspage{2}\pagevalue{2}\sectionvalue{4}}

Próximo documento

O próximo documento importa os dados da etiqueta LastPagedo documento anterior e define os contadores. Também utiliza o código do documento anterior para definir as propriedades e escrever os valores dos contadores do próximo documento.

Arquivo de exemplo DocumentB.tex, o próximo documento:

\documentclass{article}

\usepackage{zref-lastpage,zref-xr}

\makeatletter
\zref@ifpropundefined{pagevalue}{% it is defined by some modules of zref
  \zref@newprop*{pagevalue}[0]{\number\value{page}}%
}{}
\zref@newprop{sectionvalue}[0]{\number\value{section}}%
\zref@addprops{LastPage}{pagevalue,sectionvalue}

\zexternaldocument[pre-]{DocumentA}\relax
\zref@ifrefundefined{pre-LastPage}{%
  \@latex@error{Zref label `LastPage' of `DocumentA' is undefined}\@ehc
}{%
  \setcounter{page}{%
    \numexpr\zref@extractdefault{pre-LastPage}{pagevalue}{0}+1\relax
  }%
  \setcounter{section}{%
    \zref@extractdefault{pre-LastPage}{sectionvalue}{0}%
  }%
}
\makeatother

\begin{document}
\section{Section E of second document}
\section{Section F of second document}
\newpage
\section{Section G of second document}
\section{Section H of second document}
\end{document}

Em seguida, a primeira seção do segundo documento Section E of second documenté numerada com 5 e começa na página 3.

Responder2

A resposta de Heiko Oberdiek resolve o caso básico de vários documentos que se complementam perfeitamente.

Para o caso um pouco mais complexo de um arquivo principal que inclui partes antes e depois dos capítulos a serem incluídos, ou seja, que passa seus contadores para um documento externo em um ponto arbitrário do documento e depois recupera o mesmo ou outros documentos externos' contadores também dentro do documento, consegui fazer um ajuste definindo comandos \importcounterse \exportcounterschamando-os nos locais apropriados. Provavelmente pode ser ainda mais reduzido, mas é o mais próximo que chego no momento, com base na postagem de Heiko Oberdiek.

\documentclass{article}

\usepackage{zref-lastpage,zref-xr}

\makeatletter
\zref@ifpropundefined{pagevalue}{% it is defined by some modules of zref
  \zref@newprop*{pagevalue}[0]{\number\value{page}}%
}{}
\zref@newprop{sectionvalue}[0]{\number\value{section}}%
%\zref@addprops{LastPage}{pagevalue,sectionvalue}%


\zexternaldocument[pre-]{DocumentB}\relax

\zref@ifrefundefined{pre-LastPage}{%
  \@latex@error{Zref label `LastPage' of `DocumentB' is undefined}\@ehc
}{%
  \newcounter{@otherpage}
  \setcounter{@otherpage}{%
    \numexpr\zref@extractdefault{pre-LastPage}{pagevalue}{0}+1\relax
  }%
  \newcounter{@othersection}
  \setcounter{@othersection}{%
    \zref@extractdefault{pre-LastPage}{sectionvalue}{0}%
  }%
}

\newcommand{\importcounters}{% enables importing the external page and section counters at an arbitrary point in the document
    \setcounter{section}{\the@othersection}
    \setcounter{page}{\the@otherpage}
}

\newcommand{\exportcounters}{% exporting counters after the intro rather than at the end of the document
    \cleardoublepage \ %
    \zref@labelbyprops{LastIntroPage}{pagevalue,sectionvalue}
}
\makeatother

\usepackage[english]{babel}
\begin{document}
\section{Section A of first document}
\section{Section B of first document}

\exportcounters
\newpage
\importcounters

\section{Section C of first document}
\section{Section D of first document}
\subsection{D 1}
\subsection{D 2}
\end{document}

(Em DocumentB.tex, a única mudança é que eu alimento os contadores pre-LastIntroPageem vez de pre-LastPage.)

Meu próximo objetivo é descobrir como fazer write18o arquivo principal pausar e passar para a compilação dos arquivos dependentes antes de prosseguir, mas isso é uma questão separada.

informação relacionada