
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 .cls
arquivos dos diários e empacotá-las em ambientes, mas isso provavelmente daria muito trabalho para alguém tão analfabeto TeX
quanto eu. Portanto, tentei, com algum sucesso, uma abordagem alternativa: um hack usando o xr
pacote. 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 \pageref
saída de 'como uma string em vez de um número inteiro, e parece ser acionado pelo babel
pacote, então coloco os números em um \newcounter
que 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 toc
as informações relevantes dos diferentes aux
arquivos e compilar o arquivo principal com isso, toc
a 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 \label
dentro \exportcounters
para que ele envie apenas o comando de corte superior para .aux
and .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 \newpage
onde 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 xr
e lipsum
). Este é um problema conhecido e há alguma solução alternativa que não envolva \newpage
s explícitos?
Outro problema (realmente muito menor) é que o pdflatex reclama do uso de \ref
no 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 .cls
comandos 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 lastpage
e xr
.
Primeiro documento
O primeiro documento DocumentA
salva as propriedades pagevalue
e sectionvalue
na lista de propriedades LastPage
que é 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-lastpage
faz o trabalho:
- Chegando aorealfinal do documento (via package
atveryend
). - Escrevendo no
.aux
arquivo via\immediate\write
.\label
usa\write
para 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 .aux
arquivo 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 LastPage
do 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 \importcounters
e \exportcounters
chamando-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-LastIntroPage
em vez de pre-LastPage
.)
Meu próximo objetivo é descobrir como fazer write18
o arquivo principal pausar e passar para a compilação dos arquivos dependentes antes de prosseguir, mas isso é uma questão separada.