Как создать фиксированный счетчик?

Как создать фиксированный счетчик?

Как создать счетчик, который фиксируется после установки?

Идея состоит в том, чтобы вставить в текст своего рода примечания, которые должны быть пронумерованы, но возрастать по мере появления даты фактического внедрения в исходный код.

Они не должны зависеть от порядка в исходном коде и должны сохранять свое значение даже при удалении некоторых из них.

Вот не MWE, а идея того, как должна выглядеть реализация:

\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}

Это должно дать следующий результат:

Примечание 1:Некоторые примечания я добавил первыми
Примечание 4:Четвертая нота,
Заметка 2:Второе замечание:
Примечание 5:Пятая нота,
Заметка 3:Третье примечание.

Если я удалю строку со второй заметкой, то должно получиться:

Примечание 1:Некоторые примечания я добавил первыми,
Примечание 4:Четвертая нота,
Примечание 5:Пятая нота,
Заметка 3:Третье примечание.

решение1

Вот доказательство концепции, но использование вспомогательного файла таким образом очень опасно, потому что ошибка может испортить предыдущую копию, и порядок заметок будет потерян. Поэтому процедура, которая создает резервную копию файла, .notesдолжна быть запущена в конце задания 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}

Файл .notesсчитывается дважды: первый раз для подсчета записей и второй раз для присвоения значения строкам.

Каждая заметка хранится как ее контрольная сумма MD5, которая должна быть уникально связана с текстом. Конечно, если текст заметки изменится, порядок снова будет потерян.

Таким образом, каждой контрольной сумме присваивается номер заметки. Если во время выполнения мы найдем новую заметку, она будет добавлена ​​в макрос \jjdbnotes, содержимое которого будет записано в .notesфайл в конце задания. Обратите внимание, что TeX не может добавлять строки в существующий файл.

Показанный результат был получен путем раскомментирования строк по одной в указанном порядке.

введите описание изображения здесь

Лучшим подходом было бы хранить заметки в отдельном файле, notes.texнапример, в форме

\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}

и сделать \input{notes}в преамбуле. Затем в документе вы можете использовать

\mynote{1},
\mynote{4},
\mynote{2},
\mynote{5},
\mynote{3}.

Таким образом, вы просто добавляете заметки последовательно.

решение2

Я думаю, что то, что вам нужно, это как раз тот случай, когда перекрестные ссылки в LaTeX вам не помогают: достаточно жестко закодировать их. Если вы хотите отформатировать (жирный шрифт и т. д.), вы можете использовать окружение descriptionили создать собственную команду, например:

\newcommand{\mynote}[1]{\par\noindent\bfseries Note#1}

и использовать

\mynote{1} some text
\mynote{3} some other text

EDIT: Как предлагают другие пользователи, добавьте '\write command in\mynote`, чтобы получить что-то вроде:

\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}

Затем вы можете отсортировать их в текстовом редакторе или в LaTeX, используя ответэтот вопрос

Связанный контент