一个快速(不是很多)且肮脏(很多)的解决方案

一个快速(不是很多)且肮脏(很多)的解决方案

问题

如何自动创建词汇表名称、定义和每页当前单词出现在一组 tex 文件(超过一个),没有明确提及例如\gls{myword}...?

情况

  • 我有一本(两本)包含条目和定义的字典,我可以以任何方便的格式导出。

  • 我有一堆 LaTeX 文件(大约 50 个,包括 Beamer 演示文稿和文章),其中有一些单词存在,没有任何引用系统\gls{myword}...
    它们在逻辑上属于不同的组类型,为简单起见,我们假设 T 为文本,B 为 Beamer 演示文稿。
    它们都有一个通用的宏头,我可以修改它以同时在所有文件中包含包或宏。

  • 我没有资源手动编辑所有文件并添加引用\gls{myword},而且盲目地这样做风险太大sed

我需要

  • 我需要一个包含名称、定义和文档名称(或符号 T1:p.2,4-7,12;T3:p.4,8;B12:p1)+ 可以找到它的页面的词汇表。

我做了什么

  • 我编写了一个 bash 脚本来删除 tex 源文件的注释,使用grep查找每个单词存在于哪个文件中。还有一些健身房我可以计算\section\begin{frame}当前数字并开始建立索引。当幻灯片中断
    时,Bamer 中仍存在一个问题,即正确计算当前幻灯片的数量...allowframebreaks

  • 我查了一些介绍书词汇表

  • 当然,在发布这个问题之前,我已经在这个网站上搜索了不少于 20-25 个问答来寻找解决方案(但它们都依赖于机制\gls{myword})。

结论

我感觉我正在尝试重新发明轮子。
有没有一种 LaTeX 方法/工具可以做到这一点而不从文内引用?
(这还简单吗:-)?)

答案1

一个快速(不是很多)且肮脏(很多)的解决方案

我跳出 LaTeX 的思维框架,从 PDF 文件入手来解决这个问题。这远不是一个 LaTeX 解决方案,或者正确的一、以下是一个快速而真正肮脏的解决方案,在特定情况下有效,但它可以作为更完整解决方案的基础。

使用外部工具(pdfgrep [12]),我能够在 PDF 文件组中搜索关键字(方式与 grep 在文本文件组中执行的操作类似)。

然后,问题是解析输出并以首选方式格式化输出。下面是脚本(这是一个工作文件,甚至没有清理;应该以纯粹的awk计划方式重写它)。
它很丑陋,有驼峰,但它工作(足够)。它可以从解析字典文件(带有关键字和定义的文件)的脚本中调用(或包含在其中),以生成我们可以包含在文件中的输出tex

您可以使用关键字作为参数来运行该脚本,它会以类似 [File1:1-3,5,9-12; File3:2,7-122] 的字符串作为答案。

#!/bin/bash
# ----------------------------------------------- 
#   Search for a key in all pdf files
#    e.g L1.pdf L2.pdf...
#     and answers with collapsed page number
#      for each file [L1: 1, 3-7; L2:2-12, 22]
# ----------------------------------------------- 
#    Version 2.0 
#      Mon Apr 16 13:50:42 2018
# ----------------------------------------------- 

Key="$1"
Where='*pdf'

All=$(
pdfgrep -Hin "$Key" $Where | \
     awk -F ':' '{ if ($2 != P[$1,CountA[$1]])
                 {CountA[$1]++;P[$1,CountA[$1]]=$2} }
                 END{for (i in CountA ) {
                   printf ("%s ", i); 
                   for (j = 1 ; j<=CountA[i]; j++) {
                       printf( "%d ", j)
                       } ; 
                       printf "\n"  
                       }
                   }' | sort 
)
## Collapsing number sequences 1 2 3 4 7 9 10--> 1-4, 7. 9-10
A3=$(echo "$All" | awk '{ printf ("%s: ",$1) ; r=nxt=0; for(i=2;i<=NF;i++) if($i+1==$(i+1)){ if(!r) r=$i"-";nxt=$(i+1) } else { printf "%s%s",(r)?r nxt:$i,(i==NF)?ORS:FS; r=0 } } END{printf("\n") }')

## Collapsing output in 1 line [L1: 1, 3-7; L2:2-12, 22]
echo "$A3" | awk 'BEGIN{ printf "[";MySep=""}{printf ("%s%s", MySep,$0);MySep="; "} END{ printf "]\n"}' | sed 's/\[\: \]//g ; s/\.pdf//g'

exit 0

Ps> 剧本确实需要杰出的外科医生帮助它的驼峰
-驼峰哪个驼峰? [3]

相关内容