Como \expandafter funciona aqui? O seguinte code
precisa ser concluído. Presumo que alguns de vocês possam fazer isso com facilidade, espero.
A intenção é: propagar a letra n
(ou qualquer outra, for Notes
of pagenote
into the index
) com o pagenotenumber
for \index[]{}
inside \pagenote{}
.
O code
é derivado de
\index dentro da nota de rodapé: Como propagar o número da nota de rodapé corretamente com o pacote index?
\documentclass{report}
\usepackage{index}
\usepackage[texindy,splitindex]{imakeidx}
\usepackage[hidelinks]{hyperref}
\usepackage[page]{pagenote}
\newcommand\pn[2]{\hyperpage{#2}n#1}
\makeatletter
\let\if@nopnote\iffalse % just for the example
\newcommand{\is}[2]{%
\if@nopnote
\index[#1]{#2}%
\else
\expandafter\pagenoteindex\expandafter{\tempnumber}{#2}%
\fi
}
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
{\normalfont #1.} }
\makeatother
\newcommand{\pagenoteindex}[3]{\index[#1]{#3|pn{#2}}}
\makeindex[program=texindy,name=Names,title=Names]
\makeindex[program=texindy,name=Something,title=Something]
\makepagenote
\begin{document}
First index.\index[Something]{First index}
Sentence.\pagenote{First pagenote without index.}
\clearpage
Emph index.\index[Something]{Emph index@\emph{Emph index}}
pagenote and index.\pagenote{Second pagenote with index.\is[Something]{Index inside second pagenote}}
\clearpage
Third pagenote.\pagenote{\emph{Emph index word}.\is[Something]{Emph index@\emph{Emph index}}}
Namenindex\index[Names]{Namenindex}
\printnotes
\printindex[Something]
\printindex[Names]
\end{document}
Esta funcionalidade parece ser uma função padrão para indexação na composição tipográfica de livros modernos, mas ainda não é reconhecida pelo LaTeX. Seria ótimo se alguém pudesse apoiar isso e apresentar uma solução.
Responder1
Não tenho certeza do que você deseja. (Lembro-me vagamente das perguntas anteriores, mas não há muito para refrescar minha memória nesta.)
O seguinte gera números de notas e páginas nos índices sem alterar o conteúdo do document
ambiente. Se esse é o comportamento alvo, não tenho certeza.
O problema inicial com o seu código é que você definiu \pagenoteindex
como exigir 3 argumentos, mas está passando apenas 2. Suponho que você queira um argumento opcional aqui, porque está passando um para \is
, então precisamos de 4 casos em vez de 2 :
- estamos dentro de uma nota de página e temos um argumento opcional;
- estamos dentro de uma nota de página sem nota;
- estamos lá fora com um;
- estamos lá fora sem um.
expl3
torna a expansão (relativamente) simples. É, pelo menos, muito menos complicado do que fazer malabarismos com cadeias de \expandafter
s que ameaçam regredir ao infinito. Definimos 2 funções para os casos (1) e (2):
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnnn
{
\index [#1] { #3 | pn {#2}{#4} }
}
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnn
{
\index { #2 | pn {#1}{#3} }
}
Se estiver usando este código, observe que este énãoa maneira correta de fazer isso. Conforme explicado abaixo, estamos ignorando os mecanismos padrão aqui.
Então dizemos ao LaTeX que gostaríamos de variantes que deveriam receber um argumento pré-expandido em segundo ou primeiro lugar:
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnnn { nene }
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnn { ene }
Isso significa que o LaTeX irá expandir esses argumentos antes de passá-los para nossas funções base, então não precisamos fazer isso. Então agora podemos definir uma versão para \is
lidar com nossos 4 casos:
\NewDocumentCommand {\is} { om }{%
\if@nopnote
\IfValueTF { #1 } {
\index[#1]{#2}
}{
\index{#2}
}
\else
\hypertarget{pn:\tempnumber}{}%
\IfValueTF { #1 } {
\thomkrates_pagenoteindex:nene { #1 } { \tempnumber } { #2 } { \temppgnumber }
}{
\thomkrates_pagenoteindex:ene { \tempnumber } { #2 } { \temppgnumber }
}
\fi
}
Como não entendo o formato xindy
desejado (em oposição a makeindex
) e não consegui encontrar a documentação relevante (que presumo que exista em algum lugar), desisti de tentar descobrir como fazer com que o número da página aparecesse quando \hyperindexformat
for usado em o .idx
em vez de \hyperpage
.
Então, neste ponto, usamos uma abordagem de força bruta e ignorância, simplesmente adicionando o número da página diretamente e ignorando os mecanismos usuais:
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
\edef\temppgnumber{\thepage}%
{\normalfont #1.} }
Também modificamos nossa definição \pn
para utilizar o alvo que adicionamos \is
:
\newcommand\pn[2]{\hyperpage{#2}\hyperlink{pn:#1}{n#1}}
Código completo:
\documentclass{report}
% ateb: https://tex.stackexchange.com/a/705581/ addaswyd o gwestiwn Thomkrates: https://tex.stackexchange.com/q/705565/
\usepackage{index}
\usepackage[texindy,splitindex]{imakeidx}
\usepackage[hidelinks]{hyperref}
\usepackage[page]{pagenote}
\newcommand\pn[2]{\hyperpage{#2}\hyperlink{pn:#1}{n#1}}
\makeatletter
\let\if@nopnote\iffalse % just for the example
\renewcommand{\notenuminnotes}[1]{%
\edef\tempnumber{#1}%
\edef\temppgnumber{\thepage}%
{\normalfont #1.} }
\ExplSyntaxOn
\NewDocumentCommand {\is} { om }{%
\if@nopnote
\IfValueTF { #1 } {
\index[#1]{#2}
}{
\index{#2}
}
\else
\hypertarget{pn:\tempnumber}{}%
\IfValueTF { #1 } {
\thomkrates_pagenoteindex:nene { #1 } { \tempnumber } { #2 } { \temppgnumber }
}{
\thomkrates_pagenoteindex:ene { \tempnumber } { #2 } { \temppgnumber }
}
\fi
}
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnnn
{
\index [#1] { #3 | pn {#2}{#4} }
}
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnnn { nene }
\cs_new_protected:Nn \thomkrates_pagenoteindex:nnn
{
\index { #2 | pn {#1}{#3} }
}
\cs_generate_variant:Nn \thomkrates_pagenoteindex:nnn { ene }
\ExplSyntaxOff
\makeatother
\makeindex[program=texindy,name=Names,title=Names]
\makeindex[program=texindy,name=Something,title=Something]
\makepagenote
\begin{document}
First index.\index[Something]{First index}
Sentence.\pagenote{First pagenote without index.}
\clearpage
Emph index.\index[Something]{Emph index@\emph{Emph index}}
pagenote and index.\pagenote{Second pagenote with index.\is[Something]{Index inside second pagenote}}
\clearpage
Third pagenote.\pagenote{\emph{Emph index word}.\is[Something]{Emph index@\emph{Emph index}}}
Namenindex\index[Names]{Namenindex}
\printnotes
\printindex[Something]
\printindex[Names]
\end{document}