如何创建固定计数器?

如何创建固定计数器?

如何创建一个一旦设置就固定的计数器?

这个想法是在文本中插入某种注释,这些注释应该被编号,但会随着在源代码中实际实施的日期而增加。

它们不应该依赖于源代码中的顺序,并且即使其中一些被删除,它们也应该保留其值。

这里不是 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 中使用以下答案进行排序:这个问题

相关内容