以下代码挂起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}}