如何创建一个一旦设置就固定的计数器?
这个想法是在文本中插入某种注释,这些注释应该被编号,但会随着在源代码中实际实施的日期而增加。
它们不应该依赖于源代码中的顺序,并且即使其中一些被删除,它们也应该保留其值。
这里不是 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
编辑:根据其他用户的建议,添加'\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 中使用以下答案进行排序:这个问题