
¿Cómo puedo crear un contador que se arregle una vez configurado?
La idea es insertar algún tipo de comentario en un texto que debería estar numerado, pero que aumentará con la fecha de implementación real en el código fuente.
No deberían depender del orden en el código fuente y deberían mantener su valor incluso si se eliminan algunos de ellos.
Aquí no se trata de un MWE, sino de una idea de cómo debería verse la implementación:
\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}
Esto debería dar un resultado como:
Nota 1:Alguna nota que agregué primero
Nota 4:Una cuarta nota,
Nota 2:Una segunda nota,
Nota 5:Una quinta nota,
Nota 3:Una tercera nota.
Si elimino la línea con la segunda nota, debería dar:
Nota 1:Alguna nota que agregué primero,
Nota 4:Una cuarta nota,
Nota 5:Una quinta nota,
Nota 3:Una tercera nota.
Respuesta1
Aquí hay una prueba de concepto, pero usar un archivo auxiliar de esta manera es muy peligroso, porque un error podría arruinar la copia anterior y se perdería el orden de las notas. Por lo tanto, se debe ejecutar una rutina que haga una copia de seguridad del .notes
archivo al final del trabajo de 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}
El .notes
archivo se lee dos veces; el primero para contar las entradas y el segundo para asignar un significado a las líneas.
Cada nota se almacena como su suma de comprobación MD5, que debe estar asociada de forma única al texto. Por supuesto, si se cambia el texto de una nota, el orden se perderá nuevamente.
Entonces a cada suma de verificación se le asigna el número de nota. Si durante una ejecución encontramos una nueva nota, se agregará a la \jjdbnotes
macro, cuyo contenido se escribirá en el .notes
archivo al final del trabajo. Tenga en cuenta que TeX no puede agregar líneas a un archivo existente.
El resultado mostrado se obtuvo descomentando las líneas una por una según el orden indicado.
Un mejor enfoque sería almacenar las notas en un archivo separado, notes.tex
por ejemplo en el formulario
\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}
y hacerlo \input{notes}
en el preámbulo. Luego en el documento puedes usar
\mynote{1},
\mynote{4},
\mynote{2},
\mynote{5},
\mynote{3}.
De esta manera simplemente agregas las notas de forma secuencial.
Respuesta2
Creo que lo que quieres es exactamente el caso en el que las referencias cruzadas en LaTeX no te ayudan: basta con codificarlas. Si desea formatear (negrita, etc.), puede usar un description
entorno o crear su propio comando como:
\newcommand{\mynote}[1]{\par\noindent\bfseries Note#1}
y use
\mynote{1} some text
\mynote{3} some other text
EDITAR: según lo sugerido por otros usuarios, agregue '\write command in
\mynote` para obtener 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}
Luego puedes ordenarlos en tu editor de texto o en LaTeX usando la respuesta deesta pregunta