![La inserción de comandos en el argumento de \sindex[]{} no se expande: aparece el símbolo @](https://rvso.com/image/298305/La%20inserci%C3%B3n%20de%20comandos%20en%20el%20argumento%20de%20%5Csindex%5B%5D%7B%7D%20no%20se%20expande%3A%20aparece%20el%20s%C3%ADmbolo%20%40.png)
Estoy usando el \sindex[]{}
comando del splitxdx
paquete para crear entradas de índice. Para controlar la clasificación estoy usando el @
símbolo, por ejemplo \sindex[...]{1@One}
.
Para hacer las cosas un poco más configurables, defino un comando personalizado: \newcommand{\sortedOne}{1@One}
.
El problema es que cuando inserto este comando en \sindex
el argumento, aparece el texto literal 1@One
. Por ejemplo, el código \sindex[myindex]{\sortedOne!This fails.}
genera la primera de las siguientes entradas:
¿Existe una manera fácil de evitar esto? Preferiría un método en el que no tenga que escribir algo manualmente \expandafter
cada vez que uso \sindex
.
Como nota al margen interesante,hacefunciona correctamente si incluyo el \sindex
comando en un \comma@parse
comando del kvsetkeys
paquete: \comma@parse{\sortedOne!This works with comma parse}{\sindex[myindex]}
.
Aquí está mi MWE que produjo el resultado anterior:
\documentclass[12pt]{book}
\usepackage[split]{splitidx}\makeindex
\newindex{myindex}
\usepackage{lipsum}
\usepackage{kvsetkeys}
%\usepackage{hyperref}
%\newcommand{\mainindexentry}[1]{\textbf{\hyperpage{#1}}}
\newcommand{\sortedOne}{1@One}
\begin{document}
\lipsum[1]
\sindex[myindex]{1@One!This works fine}
\sindex[myindex]{\sortedOne!This fails.}
\sindex[myindex]{Even subentries fail!\sortedOne}
\makeatletter
\comma@parse{\sortedOne!This works with comma parse}{\sindex[myindex]}
\makeatother
\printindex[myindex]
\end{document}
Respuesta1
Por lo general, los comandos de índice no amplían su argumento ni leen su contenido palabra por palabra. Eso también impide que se amplíen las macros. Al leer el argumento antes de que el comando index lo vea, los cambios textuales no tienen efecto, porque los tokens ya están formados, consulte la definición de \Sindex
:
\documentclass[12pt]{book}
\usepackage[split]{splitidx}\makeindex
\newindex{myindex}
\usepackage{lipsum}
%\usepackage{kvsetkeys}
%\usepackage{hyperref}
%\newcommand{\mainindexentry}[1]{\textbf{\hyperpage{#1}}}
\newcommand{\sortedOne}{1@One}
\newcommand*{\myindex}{\sindex[myindex]}
\newcommand*{\smyindex}[1]{\sindex[myindex]{#1}}
\newcommand*{\Sindex}[2][]{\sindex[{#1}]{#2}}
\begin{document}
\lipsum[1]
\sindex[myindex]{1@One!This works fine}
\expandafter\myindex\expandafter{\sortedOne!This also works.}
\smyindex{Even subentries work!\sortedOne}
\Sindex[myindex]{\sortedOne!\sortedOne}
\printindex[myindex]
\end{document}
Por supuesto, los comandos que no deberían expandirse deberían estar protegidos por \string
:
\Sindex[myindex]{...\string\fragilecmd...}
o varios tokens pueden protegerse mediante \detokenize
:
\Sindex[myindex]{...\detokenize{...}...}
Además, los métodos (con/sin expansión) no deben combinarse para evitar entradas de índice duplicadas debido a entradas de índice expandidas/no expandidas. Dependiendo del método, la cantidad de espacios después de un comando puede variar:
\sindex[myindex]{\textbf{...}}
\Sindex[myindex]{\string\textbf{...}}
\Sindex[myindex]{\protect\textbf{...}}
\Sindex[myindex]{\textbf{...}}
Resultado en .idx
el archivo:
\indexentry{\textbf{...}}{1}
\indexentry{\textbf{...}}{1}
\indexentry{\textbf {...}}{1}
\indexentry{\textbf {...}}{1}
Las dos últimas formas se pueden fusionar mediante la opción makeindex -c
, que fusiona espacios consecutivos, pero una entrada sin espacio sigue siendo diferente de una entrada con espacio.