Community研究与数据分析github.com

jeffnewberry/cite-viewer

在用户说“引用查看器”或“构建查看器”时运行:一个本地点击浏览页面,草稿中的每条引用都能打开来源中的被引段落,并可选链接到记录文件。

cite-viewer 是什么?

Cite Viewer 是一个本地运行的网页工具,旨在帮助法律专业人士快速检查草稿中每个引用的准确性。它通过将草稿中的每条引用(如案例、法规、记录引用)与对应的原文进行比对,并高亮显示被引用的段落,让用户一目了然地判断引用是否支持其主张。该工具支持从 Westlaw 自动下载来源 PDF,或从用户提供的 PDF 文件夹中读取,对于记录引用,则通过相对链接直接指向用户电脑上的文件。本项目主要面向法律文书撰写的最终核实阶段,适用于 Claude Code、Cursor 等 AI 编码工具,其核心功能包括自动构建引用表、提取被引段落、检查引用状态(支持、需检查、缺引脚、来源未加载),并生成一个交互式 HTML 页面,左侧显示草稿,右侧显示原文段落和注释面板。它严格遵循两条不变规则:绝不发布或托管查看器,且绝不修改草稿本身。这是一个高度专业化的工具,专为减轻法律文书校对工作量而设计。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jeffnewberry/litigation-skills/tree/HEAD/skills/cite-viewer

Installed? Explore more 研究与数据分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

引用查看器

引用查看器是一个本地网页,展示用户的草稿(或其中一部分)。每条引用都是一个链接,根据其状态以不同颜色加下划线。点击引用会显示来源中的被引页面,并高亮显示被引用或依赖的文字,附上该段落是否支持句子的备注、一个打开完整来源到该页面的链接,以及一个用户可输入修复意见的备注框。

该查看器不替代阅读案例,也不替代引证检查器(KeyCite 或 Shepard's)。它使阅读更快速,并记录每个段落是否支持引用它的句子。

两条永不更改的规则

  • 切勿发布或托管查看器。 它包含用户的草稿,并通过记录链接指向记录材料。它应作为用户通过双击打开的本地文件保留在用户的计算机上。切勿提议将其转换为可共享的链接。如果用户要求发布,请先警告其客户保密义务。
  • 切勿更改草稿。 查看器报告问题,但不修复问题。仅在用户另行要求时才修改草稿。

适用时机

它最适用于文本已定稿、引用已通过引证检查和引证验证器检查后、但在最终校对之前的草稿。如果用户提前要求,请用一句话说明,然后如果用户仍然需要则构建它。

开始前

请用简短的一段,只询问用户尚未提供的信息:

  1. 哪个草稿。要求用户附加文件,或指定文件名。
  2. 范围:整篇文档,或指定章节。即使草稿很短也要询问;切勿自行决定范围。
  3. 来源:“我是否为你从 Westlaw 拉取案例,还是你自己将 PDF 放入一个文件夹?”(Westlaw 用户:参见步骤 3。Lexis 或其他用户:参见步骤 3a。)
  4. 记录引用:“你是否也希望链接记录引用?如果是,你电脑上的哪个文件夹存放记录,以及你如何引用它?请从你的草稿中给出一个示例引用(例如,12 R.R. 41, ROA.1234, Dkt. 52 at 3, 或 JA 123)。”任何文件夹都可以(Dropbox、OneDrive 或普通文件夹),因为查看器链接到文件所在的位置,且不复制任何内容。如果用户否,记录引用显示为“来源未加载”。

请求查看器即表示同意保存查看器文件夹,并在步骤 3 的费用警告后,获取来源。

步骤

1. 构建引用表

将草稿转换为文本。按顺序遍历范围并列出每条引用:完整引用、短引用、同上、参见、法规、次级来源和记录引用。对于每条引用,记录:

  • 一个 ID(c1、c2 等),以及原样书写的引用;
  • 它指向的权威来源(将 同上 和短引用解析为完整权威来源);
  • 脚注或页码;
  • 其支持的句子中的命题和任何引用语言;
  • 该引用是依赖于来源中的特定材料(一个判决、一个测试、一个引文)还是仅引用整个案例(参见步骤 6)。

注意范围内任何没有引用的法律陈述。页面也会标记这些。

如果草稿使用短引用或 参见 且没有完整引用,不要默默猜测。要么提供引用并标注“通识,未经核实”,要么省略并标记。

2. 构建来源列表

每个权威来源一条:判例引证(“466 U.S. 668”),未发表意见的 WL 引证,法规的法规编号和章节,文章的“卷号缩写起始页”。用分号分隔条目,最多 100 条。省略记录引用和 Westlaw 不包含的任何内容;在报告中列出它们。

3. 从 Westlaw 获取来源(查找并打印)

  • 在拉取任何内容之前,告知用户一次:查找并打印请求可能会根据其 Westlaw 计划收费,并在他们确认后继续。
  • 在浏览器中打开 Westlaw,并要求用户以他们通常的方式登录:公司登录、法学院门户或 Thomson Reuters ID。告诉他们,如果你打开的页面不是他们通常使用的页面,他们可以在同一浏览器窗口中转到他们通常的登录页面。切勿输入密码;一旦他们登录,执行其余操作。
  • 转到“查找并打印”并粘贴列表。
  • 设置:案例 → 仅判决意见(无批注);法规 → 仅法规文本;取消选中“使用判例报告图像代替”,因为星级页码必须是文本;传递 → 下载;格式 → PDF;作为 → 多个文件(ZIP);关闭双栏布局。
  • 提交。如果 Westlaw 拒绝某些引证,将其移除,继续,并报告它们。
  • 当下载准备好时,点击 Westlaw 的下载按钮。浏览器随后会显示其自己的保存窗口,你无法点击。告知用户它即将到来,并要求他们在该窗口中点击“保存”(或“下载”)。ZIP 文件将保存在他们的下载文件夹中。

3a. 用户提供的来源

要求用户将一个权威来源一个 PDF 放入一个文件夹,并告知你该文件夹。仅限文本 PDF;如果 PDF 是没有文本的扫描件,要求提供文本版本。

4. 获取 PDF

要求访问下载文件所在或步骤 3a 中文件夹的权限。解压到下载文件夹之外的工作文件夹。将每个 PDF 与其权威来源匹配,并标记任何未返回的文件。

5. 提取被引段落

Westlaw PDF 在文本中标记星级页码:主要判例报告的 *688,并行判例报告的 **2055 和 ***,以及 WL 引证的 *1、*2。去除并行标记,根据单星标记拆分文本,并获取每个带页码页面的文本,以及前一页的最后几百个字符,以便从前一页开始的句子能完整阅读。找到每个标记出现的 PDF 页面,用于“打开完整来源 ↗”链接(#page=N)。去除页眉和页脚。使用此文件末尾的脚本。当页码不是星级页码(法律评论页码、法规小节或其他服务的 PDF)时,通过搜索被引用的或依赖的语言来找到段落。

5a. 记录引用(仅当用户选择时)

  • 根据用户的示例引用,确定引用的哪部分命名文件(卷号、文档或案卷编号、附录),以及哪个数字命名页面(打印的笔录页码、如 ROA.1234 的盖章记录页码、法院页眉页码或附录页码)。记录可能是一个或多个文件。
  • 列出用户文件夹中的记录文件,并将每个引用与其文件匹配(例如,“第 39 卷”或“RR39”对应 39 R.R.;“ECF 52”对应 Dkt. 52;一个连续盖章的记录对应 ROA 引用)。如果匹配不清晰,向用户展示你的映射并在继续之前询问。
  • 仅读取被引页面。通过引用使用的页码在页面本身上出现的数字来找到每个被引页面,切勿使用 PDF 页码;两者很少匹配。当一个页面有两个数字(例如,法院页眉页码和文档自身的页码),且用户的示例未确定引用指的是哪个时,询问。如果无法找到该数字,将引用标记为“检查”并说明。
  • 对于每条记录引用,记录两个数字:引用使用的页码以及它在 PDF 中对应的页数。
  • 将每条记录引用链接到其所在文件,使用从查看器 HTML 文件到用户计算机上记录文件的相对链接,并指向 PDF 页面。例如,当查看器文件夹和记录都位于下载文件夹中时:../volume.pdf#page=N。根据用户计算机上的实际路径(如文件夹列表所示)构建链接,切勿根据你自己工作区的路径。不要使用完整的 file:/// 地址;浏览器通常会拒绝它们。不要将任何内容复制到查看器文件夹中。
  • 记录必须是用户计算机上可搜索文本的 PDF。仅存储在在线(未下载的云文件或通过网站访问的文档库)的文件无法链接;告知用户哪些文件。

6. 检查每条引用

将每个段落与其支持的句子进行对比。分配一种状态:

  • 好 — 已支持。 段落内容与句子内容一致。任何引文完全匹配,或括号解释了所有更改。仅当引用在文本句子中作为一个整体提及案例,作为句子本身的一部分,不依赖任何特定段落时,才使用“好”,不提供摘录(蓝皮书规则 3.2(a))。支持命题的引文句子或从句总是依赖于特定材料,需要页码,即使同时引用多个案例。整案例引用的备注为“作为整体提及案例;无需引脚(蓝皮书规则 3.2(a))。”
  • 检查 — 需要检查。 引文不匹配、段落仅支持句子的一部分、页码错误或句子对来源的描述不准确。准确说明哪里不对,并给出修正方法(正确的页码或括号修正)。
  • 引脚 — 缺引脚。 引用特定材料但无页码。显示附近文本所依赖的页面。当不清楚句子是否依赖特定材料时,使用“检查”并说明,由用户决定。
  • 无 — 来源未加载。 任何不在 PDF 或记录文件夹中的内容。说明用户需要添加什么。

备注仅说明来源内容。在超出此范围的任何内容前加上“推断:”。仅标记实质性问题:错误引文、错误页码、夸大或误述的判决、记录页面不支持的事实。忽略纯粹的拼写错误。在每个摘录中高亮显示确切被依赖的词语。

7. 构建页面

在用户的下载文件夹(或他们要求的任何地方)保存一个文件夹,以草稿名称加“-引用查看器”和日期命名。其中包含:

  • HTML 文件;
  • 一个 sources/ 文件夹,包含案例 PDF。(记录文件保持原位。)

页面规则:

  • 左侧为草稿,右侧为段落面板;在窄屏上则垂直堆叠。
  • 顶部有图例,显示每种状态的计数,以及“红色虚线文本 = 无引用的法律陈述”。
  • 完全按原样显示草稿文本。
  • 段落以浅蓝色高亮。左对齐文本,衬线字体。
  • 支持明暗模式。
  • 点击引用会显示状态标记、原样引文、备注、每个摘录及其页眉和“打开完整来源 ↗”链接,然后是备注框。
  • 每个摘录标题以两种编号命名页面,以便用户无需打开文件即可确认页面:对于案例,“466 U.S. at 694 · PDF 第 7 页”;对于记录,“12 R.R. 45 · PDF 第 10 页。”
  • 无引用的法律陈述也可点击。点击一下会显示一个“无引用”标记、原样陈述、一行备注(例如,“陈述了一条法律规则;添加引用或删除它”),以及备注框。

备注框。 在每个标记(引用和无引用陈述)的面板下方,有一个标有“你的备注(例如,你想要的修正)”的文本框。备注自动保存在此文件的浏览器中。每次保存和加载都包裹在 try/catch 中,以便在浏览器阻止存储时页面仍能工作。有备注的标记会在草稿中显示一个小圆点。顶部有一个“复制所有备注”按钮,将每个备注复制为按草稿顺序编号的列表,每行以原样引文开头(或“无引用:”和陈述的前几个单词),以便用户可以将列表粘贴到 Claude 或放在 Word 旁边。告知用户一次:备注仅存在于该计算机上的该浏览器中;复制的列表是安全副本。

8. 检查页面

打开页面并点击每种状态至少一个引用,以及一个无引用陈述。确认摘录显示高亮的语言和两个页码,备注位于面板顶部,每个标记都有备注框,“复制所有备注”有效。

记录链接需要单独检查,因为你无法点击用户计算机上的链接。对于每个记录链接,从用户计算机上的查看器 HTML 文件确定它指向哪里,并通过列出该文件夹确认文件存在。然后要求用户点击一个记录链接并告知你是否在正确的页面打开了它。在他们确认之前,不要报告记录链接为有效;报告为“已链接,尚未确认”。

9. 报告

简短,最强要点优先:

  • 文件夹位置,以及如何打开查看器:“在 Google Chrome 中打开查看器(右键单击 HTML 文件,选择‘打开方式’,然后选择‘Google Chrome’)。作者已在 Mac 上使用 Chrome 测试过,运行正常。Safari 会阻止记录链接。作者已使用德州风格的记录引用(12 R.R. 41)测试记录链接,但尚未测试其他格式。作者尚未在 Windows PC 上测试。Chrome 应该也能在那里运行,Microsoft Edge 可能也可以,但作者均未尝试过。”
  • 按状态计数。
  • 每个“检查”项目一到两行,带修正方法。
  • “缺引脚”的引用、无引用陈述、未加载或被拒绝的来源,以及任何无法链接的记录文件。
  • 记录链接是否已确认(参见步骤 8)。
  • 两种处理方式:与 Claude 一起逐一讨论每个标记,Claude 会保留列表并在用户批准后做出更改;或者在 Word 中工作,同时打开查看器在旁边,在备注框中输入修正。说明“复制所有备注”是查看器中只有用户才能按下的按钮,并且他们可以将复制的列表粘贴回此聊天中。

脚本

star_extract.py:给定一个 PDF 和星级页码列表,返回每个页面的文本、前一页的尾部以及每个标记出现的 PDF 页面。

import re, subprocess, sys, json

def pdf_pages(pdf):
    info = subprocess.run(['pdfinfo', pdf], capture_output=True, text=True).stdout
    n = int(re.search(r'Pages:\s+(\d+)', info).group(1))
    return [subprocess.run(['pdftotext', '-f', str(i), '-l', str(i), pdf, '-'],
                           capture_output=True, text=True).stdout for i in range(1, n + 1)]

def clean(t):
    t = re.sub(r'WESTLAW\s*©.*?For Educational Use Only[^\n]*\n', '', t, flags=re.S)
    t = re.sub(r'\*\*\*?\d+\s?', '', t)          # 去除并行判例报告标记
    t = re.sub(r'-\n(?=[a-z])', '', t)
    return re.sub(r'\s+', ' ', t)

def segments(pages):
    parts 

…

[此处截断以进行翻译]

相关技能