
一度設定したら固定されるカウンターを作成するにはどうすればよいでしょうか?
アイデアは、番号を付ける必要があるテキストに何らかのコメントを挿入することですが、その番号はソース コードへの実際の実装の日付に応じて増加します。
これらはソース コード内の順序に依存せず、一部が削除されても値を保持する必要があります。
これは 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:4番目の注意点は、
注2:2つ目の注意点は、
注5:5番目の注意点、
注3:3番目のメモ。
2 番目のメモの行を削除すると、次のようになります。
注1:最初にいくつかメモを追加しました。
注4:4番目の注意点は、
注5:5番目の注意点、
注3: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
は 2 回読み取られます。1 回目はエントリをカウントするため、2 回目は行に意味を割り当てるためです。
各メモは MD5 チェックサムとして保存され、テキストに一意に関連付けられます。もちろん、メモのテキストが変更されると、順序は再び失われます。
したがって、各チェックサムにはノート番号が割り当てられます。実行中に新しいノートが見つかった場合、そのノートはマクロに追加され\jjdbnotes
、その内容はジョブの最後にファイルに書き出されます.notes
。TeX は既存のファイルに行を追加できないことに注意してください。
表示されている出力は、指定された順序に従って行を 1 つずつコメント解除することによって取得されました。
より良い方法は、メモを別のファイルに保存することです。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で次の答えを使用して並べ替えることができます。この質問