如何在 LaTeX 中分配唯一的数字或序列?

如何在 LaTeX 中分配唯一的数字或序列?

我正在尝试制作抽认卡并将其导出到抽认卡程序 Anki。我使用以下链接:http://reh.math.uni-duesseldorf.de/~zibrowius/LatexNoteImporter/

我想为每张卡片的第一个字段分配一个唯一的标识符。这样,如果我在问题方面修正了拼写错误,Anki 中的所有内容都不会乱七八糟。

他们在示例中所做的是从 UUID 生成器复制/粘贴一个随机数。我不想复制和粘贴任何东西。同样重要的是,每次我重新编译或返回代码时,每张卡都具有与之前相同的 ID。

我正在使用 TexStudio,目前我有一个宏,用于设置闪存卡的其他每个部分。我想制作一些可以直接添加到宏中而不必输入的内容。这是我当前使用的宏:

\begin{note}
    \xplain{id would go here}%add identifier
    \tags{%|%<tags%>%|}
    \begin{field}
        %<Question%>
    \end{field}
    \begin{field}
        %<Answer%>
    \end{field}
\end{note}

我能想到有几种方法可以做到这一点:

  • 创建一个数字列表,有点像 \chapters。但缺点是,我实际上不需要章节,我只需要其中的数字。另一个问题是,如果我想插入一些无序的内容或删除一张卡片,那么接下来的一切都会变得一团糟,我确信这一切都会变得危险。
  • 生成随机数。我明白了关于如何创建 GUID 的另一个问题,但我不知道如何将其放入宏中(哪部分在我的序言/之前?哪部分在宏中?我真的不明白答案中的代码是怎么回事),或者每次我回来时它是否都完全相同
  • 日期/时间戳会指示我输入此特定抽认卡的时间,但在我编译时不会改变,并且还会导出到另一台计算机(即依赖于我的特定计算机/闪存驱动器)。另一件事是,如果我指定它在 PDF 输出中以某种方式出现,我认为 Anki 不会理解它

我确信可能还有其他方法可以做到这一点,并且如果有人已经做出了完全一样的东西我甚至不会感到惊讶!

背景:我对 LaTeX 或编程不是很有经验,很多东西对我来说有点令人困惑。例如,弄清楚如何制作宏花了一段时间。所以我非常感谢你们的所有意见!!

使用 Anki 和 LaTeX 的主要动机是我真的很喜欢使用抽认卡来学习数学定义,并且觉得它很有效。但在 Anki 中输入 LaTeX 本身需要很长时间,我更喜欢使用 IDE,因为它可以节省我很多时间。

答案1

如果标识符不必太复杂,我建议使用一个非常简单的函数,以注入的方式将卡片的开始日期映射到 ID(在此消息中,“日期”一词实际上是指日期 + 时间,即:足够精确以区分每张卡片)。这可确保卡片始终具有相同的 ID,并且任何两张在不同时间开始的卡片都具有不同的 ID。以下是此方案的简单实现:

\documentclass{article}

\makeatletter
\def\@cardStartedOn#1-#2-#3 #4:#5\@nil{%
  \gdef\@cardId{#1#2#3#4#5}%
}

\newcommand*{\cardStartedOn}[1]{\@cardStartedOn #1\@nil}
\newcommand*{\cardId}{\@cardId}
\makeatother

\cardStartedOn{2020-02-02 12:44}

\begin{document}

The identifier of this card is \cardId. Let me repeat: \cardId\ is the
identifier of this card. :-)

\end{document}

截屏

两种可能的变化:

  • 如果:活跃角色在您的语言中( 可能是这种情况\usepackage[french]{babel},取决于所使用的 TeX 引擎),您可以选择在小时和分钟之间使用不同的输入分隔符,或者修改代码以匹配活动的:

  • 如果你需要 ID 是加密的,可以通过“简单地”计算日期的哈希值来扩展它(当然,如果真的有必要,很容易添加秒数)。例如,可以使用众所周知的算法(如 SHA1)来完成,甚至可以重用 GUID 函数您链接到的问题:您可以传递数字日期(例如 202002021244)作为随机数生成器使用的种子,并使用第一个生成的值作为您的卡标识符。

当然,加密 ID 的可接受变体取决于您所使用的平台所接受的卡 ID 格式。

答案2

你说你用TeX工作室而 TeXStudio 是用于创建和维护 .tex 源文件的编辑软件。您希望有一个宏来维护环境\xplain{...}中条目的唯一 ID note

因此问题出现了:

您是否希望该宏作为编辑器宏,作为 TeXStudio 配置的一部分,并在操作 TeXStudio 软件时可用?

您是否希望该宏是来自 (La)TeX 编程语言的宏,它将在 LaTeX 编译器编译您的 .tex 文件时执行?

让我们抽象一下这个问题:

环境的单个实例note形成根据您的 .tex 源文件维护的数据库的记录。

您希望有一种机制可以自动获取这些记录的主键(唯一标识符),以便可以通过这些主键来识别数据库的记录。

基本上,处理数据库中的主键/唯一 ID 至少有两种可能性:

可能性 1:

数据库的每条记录都可以以某种方式组合其某些元素,这些元素的组合已经形成一个唯一的主键,可用于派生记录的唯一标识符。
有时这是可能的。通常这是不可能的。

可能性 1 的变体可能是整个记录本身形成一个主键,该主键可通过获取构成记录的字符集并通过完美哈希函数计算某个哈希值来计算。

可能性 1 是,一旦数据库记录的主键/唯一标识符所衍生的某些组成部分发生变化,该记录的主键/唯一标识符也会随之改变。

似乎在某个阶段,.tex 输入文件不是由任何 LaTeX 编译器处理,而是由软件“LaTeX Note Importer for Anki”处理。我怀疑软件“LaTeX Note Importer for Anki”提供的“基础设施”是否适合对note环境的内容进行后处理,以便能够提取数据片段,以便以某种方式从中派生主键/唯一 ID。

因此,可能性 1 似乎不是一个真正的选择。

可能性 2:

或者数据库的每条记录都需要有一个元素来存储记录的唯一 ID,该 ID 需要以某种方式生成。例如,通过计数记录或(在不是同时创建两个记录的情况下)使用从创建记录那一刻起的某种时间戳,等等。然后,这个生成的元素就是识别记录的主键。在这种情况下,这个元素是数据库的一个组件,因此需要以此方式存储。

向数据库条目/记录添加主键元素并永久存储它需要修改构成相关数据库的文件集。

MySQL、MariaDB 或 Microsoft Access 等数据库管理程序旨在自动生成和维护主键/唯一标识符并修改数据库文件=用于存储这些主键的数据库的源文件。

当您使用 .tex 源文件来维护您的数据库记录/数据库条目时note,您需要创建主键/唯一 ID 的机制,以及更改/编辑组成数据库的 .tex 源文件的机制,note以存储这些主键/唯一 ID。

当您自己输入属于note环境实例的唯一 ID 时,您和您最喜欢的 .tex 编辑器可以形成一种机制。;-)

也许可以通过为 TeXStudio 实现一些编辑器宏(而不是编程语言 TeX/LaTeX 中的宏)来实现自动化,以创建/维护唯一 ID 并自动将note具有这些唯一 ID 的环境插入到您的 .tex 源文件中。

我很少使用 TeXStudio。

如果确保note一次只生成一个环境,我建议遵循frougon 的建议使用将环境实例插入 .tex 源文件时的时间戳note。(为了便于阅读,时间戳可能在某些方面ISO8601 格式)。
我建议实现一个 TeXStudio 编辑器宏,它将note环境的一个实例插入到 .tex 源文件中,其中\xplain命令的模式如下:

\xplain{ID=(⟨year⟩-⟨month⟩-⟨day⟩T⟨hour⟩:⟨minute⟩:⟨second⟩⟨UTC-time-zone-designator⟩)}

如果唯一 ID 是由环境实例插入 .tex 源文件时的时间戳形成的note,则无需维护唯一 ID 列表。
但您需要确保每当 TeXStudio 插入另一个环境实例时,系统时钟都能正常工作note

如果由于某种原因,此类时间戳不适合作为唯一 ID:

过去我曾使用编辑。当时 WinEdt 拥有出色的编辑器宏,可通过解析 .tex 输入文件并显示可作为命令参数找到的引用标签列表来维护引用标签。当时该机制并不完善,因为未考虑通过/ /xr(-hyper) 包\label从其他文件获取的引用标签。\input\include\externaldocument

TeXStudio 中可能存在类似的功能,可以适应\xplain-commands 而不是\label-commands,并且可以增强以建议尚未在列表中的新字符串。

相关内容