Como criar um contador fixo?

Como criar um contador fixo?

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 .notesarquivo 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 .notesarquivo é 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 à \jjdbnotesmacro, cujo conteúdo será gravado no .notesarquivo 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.

insira a descrição da imagem aqui

Uma abordagem melhor seria armazenar as notas em um arquivo separado, notes.texno 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 descriptionambiente 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

informação relacionada