使用 pgfkeys 进行索引挂起

使用 pgfkeys 进行索引挂起

以下代码挂起pdflatex,没有任何错误:

\documentclass{article}

\usepackage{tikz}
\usepackage{makeidx}

\newcommand{\propertydef}[2]{\pgfkeys{/assume/#1/.code=#2} \pgfkeys{/assume/#1/.value forbidden}}
\newcommand{\property}[1]{\pgfkeys{/assume/#1}}

\propertydef{Name}{some concept}

\newcommand{\defi}[1]{\index{#1}\emph{#1}}

\makeindex

\begin{document}
Works: \index{\property{Name}}\emph{\property{Name}}.
Does not work: \defi{\property{Name}}.
\end{document}

可以通过注释掉“不起作用”行或删除来使其起作用\makeindex。问题是什么?我怎样才能使“不起作用”行起作用?

这个想法是使用\defi宏来定义一个新术语,它会自动将该术语添加到索引中,并突出显示该术语。 不同之处在于,术语的名称来自与用 定义的标签的关联pgfkeys

答案1

编辑

问题不是\index而是\pgfkeys。如果您尝试使用\edef\mycmd{\pgfkeys{/assume/Name}pdflatex也会挂起。因此,必须保护命令才能在 中使用它\index,但随后它将被排序为\property而不是一些项目。要获得正确的排序,您必须先扩展它,但这会带来问题,因此这种方法没有出路。

由于您仅使用pgfkeys来创建内部 TeX 命令\pgfkeysdef,而不使用键,因此最好直接执行此操作以获得所需的结果,而忽略pgfkeys。使用用户提供的信息创建命令的方式是通过\csname。要获得正确的排序,必须先在 中扩展参数\index,现在可以完成。

在下面的代码中,我添加了一个\index{some item}来显示索引中的排序是正确的。表单\index{\property{Name}}可以工作,但给出了错误的排序,正如我之前评论的那样。我还提供了分页符来显示索引现在没问题,尽管在文件中可以更好地看到它.idx。这是两者的图像:

在此处输入图片描述

在此处输入图片描述

完整代码如下:

\documentclass{article}

\usepackage{makeidx}\makeindex

\newcommand{\propertydef}[2]{\expandafter\def\csname assume#1\endcsname{#2}}
\newcommand{\property}[1]{\csname assume#1\endcsname}
\newcommand{\defi}[1]{\index{#1}\emph{#1}}

\propertydef{Name}{some item}

\begin{document}

A different approach: use of \verb|\csname|.
\index{some item}

\pagebreak

Works with wrong sorting: 
\index{\property{Name}}\emph{\property{Name}}.

\pagebreak

Works with correct sorting: 
\expandafter\index\expandafter{\property{Name}}\emph{\property{Name}}.

\pagebreak

This works with correct sorting also:
\defi{\property{Name}}.

Same as: 
\defi{some item}.


\printindex

\end{document}

旧区

你必须\protect在以下位置执行脆弱的命令\index

This works: \defi{\protect\property{Name}}.

但是,如果与以下项一起使用,则会为您提供两个条目:\index{\property{Name}}

相关内容