是否有任何专用工具(脚本或 LaTeX 包)可以将\index
命令(或其他命令)添加到许多 LaTeX 文件中?这个想法是声明请求的索引列表,例如
Henri Bergson|Bergson, Henri
bergson|Bergson, Henri
第一个字将是应用命令的模式\index
,第二个字将是命令的内容\index
。
这个想法也是为了避免在某些情况下应用\index
:例如,如果模式在\cite
命令中(\cite{bergson}
)。
答案1
最后我提出了一个小脚本来实现这个功能。它是shell
使用编写的perl
。
它必须放在所有 tex 文件所在的文件夹中。list_index.txt
文件必须放在脚本的同一级别。在此文件中,您可以按以下格式为每个作者添加一行:
Henri Bergson|Bergson, Henri|B
bergson|Bergson, Henri|B
charlie chaplin|Chaplin, Charlie
chaplin|Chaplin, Charlie
lilian gish|Gish, Lilian
gish|Gish, Lilian
语法必须是:
- 第一列:要添加索引条目的模式
- 第二列:索引条目的格式
- 第三列(可选):您想要在索引中的位置(如果您想强制特定位置)。
\newcommand
必须在主 latex 的头部添加一个:(\newcommand{\md}[2]{#1\index[perso]{#2}}
必须适配,这里我使用了indextools
包)。
怎么运行的:
每次在 tex 文件中找到模式(不区分大小写)时,它都会被命令 替换\md{<<pattern>>}{<< corresponding second column>>}
。例如,文本中的 ìnbergson
将被替换为 \md{bergson}{B@Bergson, Henri}
,charlie chaplin
将被替换为\md{bergson}{Chaplin, Charlie}
。
脚本避免在不适当的位置添加命令,\md
例如\cite
,,,,,和。此列表必须在脚本的行中进行调整。\footcite
footfullcite
\md
\ref
\pageref
\includegraphics
perl
Bash 的脚本:
#!/bin/bash
listeIdx=list_index.txt
cmdIndex='\\md'
while IFS= read -r var || [ -n "$var" ]
do
entryIx=`echo $var|cut -d'|' -f1`
keyIx=`echo $var|cut -d'|' -f2`
specIx=`echo $var|cut -d'|' -f3`
#
if [[ -z "${keyIx// }" ]];then
echo $keyIx
continue
else
echo -e "\n\nEntry: $entryIx || Key: $keyIx"
for file in `ls *.tex`
do
if [ "$file" != "manuscrit.tex" -a "$file" != "Couverture.tex" -a "$file" != "resume.tex" -a "$file" != "titre.tex" ];then
echo $file
if [[ -z "${specIx// }" ]];then
perl -i.bak -lpe 's/(\\pageref([^}]*)|\\ref([^}]*)|\\label([^}]*)|\\includegraphics([^}]*)|\\footfullcite([^}]*)|\\footcite([^}]*)|\\cite([^}]*)|\\md{(.*?)}([^}]*))(*SKIP)(*FAIL)|\b'"${entryIx}"'\b/'"${cmdIndex}"'{$&}{'"$keyIx"'}/ig' $file
else
perl -i.bak -lpe 's/(\\pageref([^}]*)|\\ref([^}]*)|\\label([^}]*)|\\includegraphics([^}]*)|\\footfullcite([^}]*)|\\footcite([^}]*)|\\cite([^}]*)|\\md{(.*?)}([^}]*))(*SKIP)(*FAIL)|\b'"${entryIx}"'\b/'"${cmdIndex}"'{$&}{'"$specIx"'\@'"$keyIx"'}/ig' $file
fi
fi
done
fi
done < $listeIdx
答案2
我编写了一个一行(功能强大)的脚本,以半自动化方式完成相同的操作,我发现这非常方便,可以避免添加误导性引用。你只需要:
- 将以下脚本放入名为
Makefile
- 确保已安装 GNU Make,以及 ViM
- 在柱状文本文件(例如
list_names_1.csv
)中输入您搜索的项目,如下所示:
Bergson;Bergson, Henri
Herder;Herder, Johann Gottfried
make index-tagger INDEX=names LABELS=list_names_1.csv TARGET=Chapters/Chapter01.tex
从命令行运行- vim 打开并循环显示每个搜索词的每次出现,让您用 替换(输入
y
)或忽略(输入n
)搜索词的出现Search Term\index[index_name]{Search Label}
。
# Makefile
#################################################################
# index-tagger recipe #
# #
# Inputs: #
# - name of LABELS csv file with "search;label" data #
# - name of TARGET file that should be edited #
# - name of INDEX (e.g. 'noms') #
# #
# Output: #
# - ranges through the CSV file #
# - for each search;label pair, searches through the target #
# - at each match, asks for replace confirmation in VIM #
# - logs what has been done in a file #
# #
# Usage example: #
# $ make index-tagger INDEX=names LABELS=list_names_1.csv TARGET=Chapters/Chapter01.tex
# #
##################################################################
index-tagger:
cat $(LABELS) | sed -n "s-\(.*\);\(.*\)-\"vi \-c \'%s/\\\\(\\\\\\\\\\\\(sub\\\\)*section.*\\\\|caption\\\\(=\\\\)\\\\?{.*\\\\|\\\\\\\\cite%\\\\_..*\\\\|\\\\\\\\index\\\\[names\\\\]{[^}]*\\\\)\\\\@<\!\\\\<\\\\(\1\\\\)\\\\>/\1\\\\\\\\index[$(INDEX)]{\2}/gc\' \-c \'wq\' \"$(TARGET)\"; sleep .2; echo \"\\$$\(date\)\"\';$(INDEX);$(LABELS);$(TARGET);\0\' >> index_tagger.log\"-p" | xargs -o -I % sh -c '%'
附言:我刚刚注意到索引的名称在替换正则表达式中是硬编码的,我一定是忘了修复它。欢迎对此提出任何改进。
PPS。是的,这是很多逃脱!