
Como posso criar um contador que seja fixo depois de definido?
A ideia é inserir algum tipo de observação em um texto que deve ser numerado, mas aumentando com a data de efetiva implementação no código-fonte.
Eles não devem depender da ordem do código-fonte e devem manter seu valor mesmo que alguns deles sejam removidos.
Aqui não é um MWE, mas uma ideia de como deve ser a implementação:
\documentclass{article}
\begin{document}
\mynote{Some note I've added first},
\mynote{A fourth note},
\mynote{A second note},
\mynote{A fifth note},
\mynote{A third note}.
\end{document}
Isso deve fornecer uma saída como:
Nota 1:Alguma nota que adicionei primeiro
Nota 4:Uma quarta nota,
Nota 2:Uma segunda nota,
Nota 5:Uma quinta nota,
Nota 3:Uma terceira nota.
Se eu deletar a linha com a segunda nota, ela deverá dar:
Nota 1:Alguma nota que adicionei primeiro,
Nota 4:Uma quarta nota,
Nota 5:Uma quinta nota,
Nota 3:Uma terceira nota.
Responder1
Aqui está uma prova de conceito, mas usar um arquivo auxiliar dessa forma é muito perigoso, pois um erro pode estragar a cópia anterior e a ordem das notas seria perdida. Portanto, uma rotina que faça backup do .notes
arquivo deve ser executada no final do trabalho LaTeX.
\documentclass{article}
\makeatletter
\newwrite\jjdbout
\newcounter{jjdbnotes}
\def\countnotes#1#2{\stepcounter{jjdbnotes}}
\def\savenote#1#2{%
\expandafter\gdef\csname #1\endcsname{#2}%
\addnote{#1}{#2}%
}
\makeatletter
\def\addnote#1#2{%
\toks@=\expandafter{\jjdbnotes}%
\xdef\jjdbnotes{\the\toks@^^J%
\noexpand\jjdbnote{#1}{#2}}%
}
\makeatother
\let\jjdbnote\countnotes
\InputIfFileExists{\jobname.notes}{}{}
\let\jjdbnote\savenote
\gdef\jjdbnotes{} % initialize
\InputIfFileExists{\jobname.notes}{}{}
\newcommand{\mynote}[1]{%
\par
\ifcsname\pdfmdfivesum{#1}\endcsname
\textbf{Note \csname\pdfmdfivesum{#1}\endcsname: }#1%
\else
\stepcounter{jjdbnotes}%
\expandafter\addnote{\pdfmdfivesum{#1}}{\thejjdbnotes}%
\textbf{Note \thejjdbnotes: }#1%
\fi
}
\AtEndDocument{
\immediate\openout\jjdbout=\jobname.notes
\immediate\write\jjdbout{\unexpanded\expandafter{\jjdbnotes}}
}
\begin{document}
\mynote{Some note I've added first},
\mynote{A fourth note},
\mynote{A second note},
\mynote{A fifth note},
\mynote{A third note}.
\end{document}
O .notes
arquivo é lido duas vezes; o primeiro para contar os lançamentos e o segundo para atribuir um significado às linhas.
Cada nota é armazenada como sua soma de verificação MD5, que deve ser associada exclusivamente ao texto. Obviamente, se o texto de uma nota for alterado, a ordem será perdida novamente.
Portanto, para cada soma de verificação é atribuído o número da nota. Se durante uma execução encontrarmos uma nova nota, ela será adicionada à \jjdbnotes
macro, cujo conteúdo será gravado no .notes
arquivo ao final do trabalho. Observe que o TeX não pode anexar linhas a um arquivo existente.
A saída mostrada foi obtida descomentando as linhas uma por uma de acordo com a ordem indicada.
Uma abordagem melhor seria armazenar as notas em um arquivo separado, notes.tex
no formato
\makeatletter
\newcommand{\savenote}[2]{\@namedef{jjdb@note#2}{#1}}
\newcommand{\mynote}[1]{\@nameuse{jjdb@note#1}}
\makeatother
\savenote{Some note I've added first}{1}
\savenote{A second note}{2}
\savenote{A third note}{3}
\savenote{A fourth note}{4}
\savenote{A fifth note}{5}
e faça \input{notes}
no preâmbulo. Então no documento você pode usar
\mynote{1},
\mynote{4},
\mynote{2},
\mynote{5},
\mynote{3}.
Desta forma, você simplesmente adiciona as notas sequencialmente.
Responder2
Eu acho que o que você quer é exatamente o caso em que a referência cruzada no LaTeX não ajuda: basta codificá-los. Se quiser formatar (negrito e assim por diante), você pode usar um description
ambiente ou criar seu próprio comando como:
\newcommand{\mynote}[1]{\par\noindent\bfseries Note#1}
E use
\mynote{1} some text
\mynote{3} some other text
EDIT: Conforme sugerido por outros usuários, adicione '\write command in
\mynote` para obter algo como:
\documentclass{article}
\begin{document}
\newwrite\notenumber
\immediate\openout\notenumber=note.dat
\newcommand{\mynote}[1]{%
\immediate\write\notenumber{#1}\par\noindent\bfseries Note~#1:}
\mynote{3} the note number 3
\mynote{1} the note number 1
\end{document}
Você pode então classificá-los em seu editor de texto ou em LaTeX usando a resposta deessa questão