问题
如何自动创建词汇表名称、定义和每页当前单词出现在一组 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 [1,2]),我能够在 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]