替换索引的文件夹分隔符

替换索引的文件夹分隔符

在索引中,!字符用于项目分隔。我有包含文件夹和文件的索引字符串。

这些索引条目应如下所示

\index{files!fonts/!fonts.tex}

但是我使用此命令将它们传递给索引:

\newcommand*{\labelfile}[1]{\index{files!#1}}

结果是

\index{files!fonts/fonts.tex}

因此缺少/对 #1 中every 的替换。/!

如何在 LaTeX 中替换字符串中的字符?

编辑:

使用 Heiko Oberdiek 的代码示例(有效!)我创建了以下方法将所有项目包装在命令中\texttt。不幸的是,我的方法失败了...

\newcommand*{\labelfile}[1]{%
  \StrSubstitute{#1}{/}{,}[\TempIndexFileEntry]%
  \def\doc@IndexFileEntry\empty
  \def\do##1{%
    \edef\@tempa{\zap@space##1 \@empty}%
    \ifdefempty{\doc@IndexFileEntry}{
      \renewcommand{\doc@IndexFileEntry}{\texttt{\@tempa}}
    }{%
      \renewcommand{\doc@IndexFileEntry}{\doc@IndexFileEntry/\texttt{\@tempa}}
    }%
  }%
  %% Process csv list with command \do (etoolbox)
  \docsvlist{\TempIndexFileEntry}%
  %% rename
  \let\TempIndexFileEntry\doc@IndexFileEntry
  \@bsphack
  \StrSubstitute{\TempIndexFileEntry}{/}{/!}[\IndexFileEntry]%
  \index{files!\IndexFileEntry}%
  \@esphack
}

! Use of \TempIndexFileEntry doesn't match its definition.
\@xs@StrSubstitute@@ ...}\@xs@def \@xs@arg@ii {#2}
\@xs@def \@xs@arg@iii {#3}...

答案1

xstring提供了\StrSubstitute可以用另一个子字符串替换一个子字符串的功能:

\documentclass{article}
\usepackage{makeidx}
\makeindex

\usepackage{xstring}
\newcommand*{\labelfile}[1]{%
  \StrSubstitute{#1}{/}{/!}[\IndexFileEntry]%
  \index{files!\IndexFileEntry}%
}


\begin{document}
Hello World

\index{files!fonts/!abc.tex}

\labelfile{fonts/xyz.tex}

\printindex
\end{document}

该文件test.idx包含:

\indexentry{files!fonts/!abc.tex}{1}
\indexentry{files!fonts/!xyz.tex}{1}

在此处输入图片描述

在 的更详细版本中\labelfile,定义可以被 和 包围\@bsphack,以保留关于前后空格\@esphack的行为。\index

\makeatletter
\newcommand*{\labelfile}[1]{%
  \@bsphack
  ...
  \@esphack
}
\makeatother

还可以引用 makeindex 的一些特殊字符:

\StrSubstitute{...}{@}{"@}

或者可以将文件名输入为\texttt,...

注意:Makeindex 仅支持三级。因此文件规范应仅包含一个斜杠。级别 0 用于files,级别 1 用于目录,级别 2 用于文件名。

编辑:另一个要求是确实将文件名放在 中\texttt。我开始使用与编辑的问题类似的方法制作逗号分隔列表,但我使用包kvsetkeys来解析逗号分隔列表,因为我更熟悉这个包(作为作者我应该是)。我们需要以下索引条目结构,例如<directory>/<file>

\index{files!<directory>/@\texttt{<directory>/}!<file>@\texttt{<file>}}

每个目录或文件都被复制两份,首先将其用作排序键,然后使用 进行格式化\texttt

\documentclass{article}
\usepackage{makeidx}
\makeindex

\usepackage{xstring}
\usepackage{kvsetkeys}

\makeatletter
\newcommand*{\labelfile}[1]{%
  \StrSubstitute{#1}{/}{/,}[\IndexFileA]%
  \let\IndexFileB\@empty
  \expandafter
  \comma@parse@normalized\expandafter{\IndexFileA}\@AddFileEntry
  \index{files!\IndexFileB}%
}
\newcommand*{\@AddFileEntry}[1]{%
  \ifx\IndexFileB\@empty
    \def\IndexFileB{#1@\texttt{#1}}%
  \else
    \expandafter\def\expandafter\IndexFileB\expandafter{%
      \IndexFileB!%
      #1@\texttt{#1}%
    }%
  \fi
}
\makeatother

\begin{document}
Hello World

\labelfile{README}
\labelfile{fonts/abc.tex}
\labelfile{fonts/xyz.tex}

\printindex
\end{document}

文件.idx

\indexentry{files!README@\texttt  {README}}{1}
\indexentry{files!fonts/@\texttt  {fonts/}!abc.tex@\texttt  {abc.tex}}{1}
\indexentry{files!fonts/@\texttt  {fonts/}!xyz.tex@\texttt  {xyz.tex}}{1}

多个空格是 LaTeX 保护机制的产物,不会在此处造成干扰。

该索引如下所示:

\texttt 中的文件名索引

答案2

myind.ist如果你有一个文件,比如说有一行,那么级别字符不是固定的

level ;

那么;将是级别分隔符,而不是!。可以使用任何合适的字符。

然后你将处理

makeindex -s myind.ist myfile

使用该myind.ist风格。

例如,参见设计用于doc记录 latex 包的样式的索引样式,它通常安装在类似的地方

 texmf-dist/makeindex/latex/gind.ist

相关内容