在索引中,!
字符用于项目分隔。我有包含文件夹和文件的索引字符串。
这些索引条目应如下所示
\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 保护机制的产物,不会在此处造成干扰。
该索引如下所示:
答案2
myind.ist
如果你有一个文件,比如说有一行,那么级别字符不是固定的
level ;
那么;
将是级别分隔符,而不是!
。可以使用任何合适的字符。
然后你将处理
makeindex -s myind.ist myfile
使用该myind.ist
风格。
例如,参见设计用于doc
记录 latex 包的样式的索引样式,它通常安装在类似的地方
texmf-dist/makeindex/latex/gind.ist