用于从列表自动向 tex 文件添加索引的工具

用于从列表自动向 tex 文件添加索引的工具

是否有任何专用工具(脚本或 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,,,,,和。此列表必须在脚本的行中进行调整。\footcitefootfullcite\md\ref\pageref\includegraphicsperl

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。是的,这是很多逃脱!

相关内容