
Как создать счетчик, который фиксируется после установки?
Идея состоит в том, чтобы вставить в текст своего рода примечания, которые должны быть пронумерованы, но возрастать по мере появления даты фактического внедрения в исходный код.
Они не должны зависеть от порядка в исходном коде и должны сохранять свое значение даже при удалении некоторых из них.
Вот не 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, используя ответэтот вопрос